static void headset_suspend_complete(struct audio_device *dev, void *user_data) { struct media_owner *owner = user_data; struct media_transport *transport = owner->transport; /* Release always succeeds */ if (owner->pending) { owner->pending->id = 0; media_request_reply(owner->pending, transport->conn, 0); media_owner_remove(owner); } headset_unlock(dev, HEADSET_LOCK_READ | HEADSET_LOCK_WRITE); transport->in_use = FALSE; media_transport_remove(transport, owner); }
static gboolean gateway_suspend_complete(gpointer user_data) { struct media_owner *owner = user_data; struct media_transport *transport = owner->transport; /* Release always succeeds */ if (owner->pending) { owner->pending->id = 0; media_request_reply(owner->pending, transport->conn, 0); media_owner_remove(owner); } transport->in_use = FALSE; media_transport_remove(transport, owner); return FALSE; }
static gboolean gateway_suspend_complete(gpointer user_data) { struct media_owner *owner = user_data; struct media_transport *transport = owner->transport; struct audio_device *device = transport->device; /* Release always succeeds */ if (owner->pending) { owner->pending->id = 0; media_request_reply(owner->pending, transport->conn, 0); media_owner_remove(owner); } gateway_unlock(device, GATEWAY_LOCK_READ | GATEWAY_LOCK_WRITE); transport->in_use = FALSE; media_transport_remove(transport, owner); return FALSE; }
static void a2dp_suspend_complete(struct avdtp *session, struct avdtp_error *err, void *user_data) { struct media_owner *owner = user_data; struct media_transport *transport = owner->transport; struct a2dp_sep *sep = media_endpoint_get_sep(transport->endpoint); /* Release always succeeds */ if (owner->pending) { owner->pending->id = 0; media_request_reply(owner->pending, transport->conn, 0); media_owner_remove(owner); } a2dp_sep_unlock(sep, transport->session); transport->in_use = FALSE; media_transport_remove(transport, owner); }
static void a2dp_suspend_complete(struct avdtp *session, struct avdtp_error *err, void *user_data) { struct media_owner *owner = user_data; struct media_transport *transport = owner->transport; struct a2dp_transport *a2dp = transport->data; struct a2dp_sep *sep = media_endpoint_get_sep(transport->endpoint); /* Release always succeeds */ if (owner->pending) { owner->pending->id = 0; media_request_reply(owner->pending, 0); media_owner_remove(owner); } a2dp_sep_unlock(sep, a2dp->session); transport_set_state(transport, TRANSPORT_STATE_IDLE); media_transport_remove_owner(transport); }
static void media_transport_remove_owner(struct media_transport *transport) { struct media_owner *owner = transport->owner; DBG("Transport %s Owner %s", transport->path, owner->name); /* Reply if owner has a pending request */ if (owner->pending) media_request_reply(owner->pending, EIO); transport->owner = NULL; if (owner->watch) g_dbus_remove_watch(btd_get_dbus_connection(), owner->watch); media_owner_free(owner); if (state_in_use(transport->state)) transport->suspend(transport, NULL); }
static void media_transport_remove(struct media_transport *transport, struct media_owner *owner) { DBG("Transport %s Owner %s", transport->path, owner->name); media_transport_release(transport, owner->accesstype); /* Reply if owner has a pending request */ if (owner->pending) media_request_reply(owner->pending, transport->conn, EIO); transport->owners = g_slist_remove(transport->owners, owner); if (owner->watch) g_dbus_remove_watch(transport->conn, owner->watch); media_owner_free(owner); /* Suspend if there is no longer any owner */ if (transport->owners == NULL && transport->in_use) transport->suspend(transport, NULL); }