summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Guiraud <christophe.guiraud@intel.com>2013-09-17 11:37:07 +0200
committerChristophe Guiraud <christophe.guiraud@intel.com>2013-09-17 15:43:05 +0200
commitc94e4a0f5c7efe8f0be2ef238d37d426a6e3dc21 (patch)
tree52fadc3c360c080451db43a19b78be8cd30c1918
parentdfda858b5ae63914b45fc35fcbbc47b63d215b04 (diff)
downloaddleyna-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.c29
-rw-r--r--libdleyna/renderer/device.h1
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;