diff options
author | Christophe Guiraud <christophe.guiraud@intel.com> | 2013-09-17 11:37:07 +0200 |
---|---|---|
committer | Christophe Guiraud <christophe.guiraud@intel.com> | 2013-09-17 15:43:05 +0200 |
commit | c94e4a0f5c7efe8f0be2ef238d37d426a6e3dc21 (patch) | |
tree | 52fadc3c360c080451db43a19b78be8cd30c1918 | |
parent | dfda858b5ae63914b45fc35fcbbc47b63d215b04 (diff) | |
download | dleyna-renderer-c94e4a0f5c7efe8f0be2ef238d37d426a6e3dc21.tar.gz |
[Device] Check X_DLNA_GetBytePositionInfo action availability
Introspection is used to check if the UPnP X_DLNA_GetBytePositionInfo
action is supported. If it is not supported we skip its call when we
retrieve all the properties.
X_DLNA_GetBytePositionInfo doesn't seem to be widely supported by
renderer devices.
Partial fix for issue:
https://github.com/01org/dleyna-renderer/issues/115
Signed-off-by: Christophe Guiraud <christophe.guiraud@intel.com>
-rw-r--r-- | libdleyna/renderer/device.c | 29 | ||||
-rw-r--r-- | libdleyna/renderer/device.h | 1 |
2 files changed, 25 insertions, 5 deletions
diff --git a/libdleyna/renderer/device.c b/libdleyna/renderer/device.c index 4f22eef..c51f865 100644 --- a/libdleyna/renderer/device.c +++ b/libdleyna/renderer/device.c @@ -2106,9 +2106,11 @@ static gboolean prv_get_av_service_states_values(GUPnPServiceProxy *av_proxy, GVariant **mpris_tp_speeds, GPtrArray **upnp_tp_speeds, double *min_rate, - double *max_rate) + double *max_rate, + gboolean *can_get_byte_pos) { const GUPnPServiceStateVariableInfo *svi; + const GUPnPServiceActionInfo *sai; GUPnPServiceIntrospection *introspection; GError *error = NULL; GVariant *speeds = NULL; @@ -2162,6 +2164,12 @@ static gboolean prv_get_av_service_states_values(GUPnPServiceProxy *av_proxy, *mpris_tp_speeds = g_variant_ref_sink(speeds); } + sai = gupnp_service_introspection_get_action( + introspection, + "X_DLNA_GetBytePositionInfo"); + + *can_get_byte_pos = (sai != NULL); + g_object_unref(introspection); exit: @@ -2360,7 +2368,8 @@ static gboolean prv_props_update(dlr_device_t *device, dlr_task_t *task) &device->mpris_transport_play_speeds, &device->transport_play_speeds, &device->min_rate, - &device->max_rate)) { + &device->max_rate, + &device->can_get_byte_position)) { DLEYNA_LOG_DEBUG("Lost Device AV"); device_alive = FALSE; @@ -2709,13 +2718,23 @@ void dlr_device_get_all_props(dlr_device_t *device, dlr_task_t *task, evented */ device_cb_data = g_new0(dlr_device_data_t, 1); - device_cb_data->ut.get_all_position.expected_props = 2; cb_data->private = device_cb_data; cb_data->free_private = prv_free_get_all_position_data; - prv_get_position_info(cb_data, "X_DLNA_GetBytePositionInfo", - prv_get_all_byte_position_info_cb); + if (device->can_get_byte_position) { + device_cb_data->ut.get_all_position.expected_props = 2; + prv_get_position_info( + cb_data, + "X_DLNA_GetBytePositionInfo", + prv_get_all_byte_position_info_cb); + } else { + device_cb_data->ut.get_all_position.expected_props = 1; + prv_get_position_info( + cb_data, + "GetPositionInfo", + prv_get_all_position_info_cb); + } } else { prv_get_props(cb_data); (void) g_idle_add(dlr_async_task_complete, cb_data); diff --git a/libdleyna/renderer/device.h b/libdleyna/renderer/device.h index 70692f3..899b6b2 100644 --- a/libdleyna/renderer/device.h +++ b/libdleyna/renderer/device.h @@ -85,6 +85,7 @@ struct dlr_device_t_ { gchar *rate; double min_rate; double max_rate; + gboolean can_get_byte_position; guint construct_step; dlr_device_icon_t icon; GHashTable *rc_event_handlers; |