diff mbox series

[BlueZ,v2,2/2] transport: Fix the use of callback in transport_asha_suspend

Message ID 20250512143408.283938-3-sanchayan@asymptotic.io
State New
Headers show
Series ASHA stop handling updates | expand

Commit Message

Sanchayan Maity May 12, 2025, 2:34 p.m. UTC
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 mbox series

Patch

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)