Some devices do not send a response to the stop command, so audio status notification might not be received after stop. Instead, as with the Android implementation, we just immediately acknowledge the client's stop request after sending it to the device. --- profiles/audio/transport.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/profiles/audio/transport.c b/profiles/audio/transport.c index c5ae3a71b..153515191 100644 --- a/profiles/audio/transport.c +++ b/profiles/audio/transport.c @@ -2295,42 +2295,49 @@ static void asha_transport_state_cb(int status, void *user_data) media_request_reply(owner->pending, 0); media_owner_remove(owner); } media_transport_remove_owner(transport); } asha_transport_sync_state(transport, asha_dev); } +static gboolean asha_transport_suspend_cb(void *user_data) +{ + asha_transport_state_cb(-1, user_data); + + return FALSE; +} + static guint transport_asha_resume(struct media_transport *transport, struct media_owner *owner) { struct bt_asha_device *asha_dev = transport->data; guint ret; ret = bt_asha_device_start(asha_dev, asha_transport_state_cb, owner); asha_transport_sync_state(transport, asha_dev); return ret > 0 ? ret : 0; } static guint transport_asha_suspend(struct media_transport *transport, struct media_owner *owner) { struct bt_asha_device *asha_dev = transport->data; guint ret = 0; if (owner) { ret = bt_asha_device_stop(asha_dev); asha_transport_sync_state(transport, asha_dev); - asha_transport_state_cb(-1, owner); + g_idle_add(asha_transport_suspend_cb, owner); } else { ret = bt_asha_device_stop(asha_dev); /* We won't have a callback to set the final state */ transport_set_state(transport, TRANSPORT_STATE_IDLE); } return ret; } static void transport_asha_cancel(struct media_transport *transport, guint id) -- 2.49.0