transport: Unlink broadcast transport at release
authorIulia Tanasescu <iulia.tanasescu@nxp.com>
Fri, 25 Oct 2024 12:21:46 +0000 (15:21 +0300)
committerWootak Jung <wootak.jung@samsung.com>
Thu, 20 Feb 2025 07:43:24 +0000 (16:43 +0900)
This updates broadcast transport release to unlink stream from all its
links.

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
profiles/audio/transport.c

index ad07ec0ea4da82bf789f63f7b0f56465569d51c6..4bb6f59f26c4e6b07ee97d449e6b286a593372b0 100644 (file)
@@ -1878,10 +1878,45 @@ static guint transport_bap_resume(struct media_transport *transport,
        return id;
 }
 
+static void update_links(void *data, void *user_data)
+{
+       struct bt_bap_stream *link = data;
+       struct media_transport *transport;
+
+       transport = find_transport_by_bap_stream(link);
+       if (!transport) {
+               error("Unable to find transport");
+               return;
+       }
+
+       bap_update_links(transport);
+}
+
+static void transport_unlink(void *data, void *user_data)
+{
+       struct bt_bap_stream *link = data;
+       struct bt_bap_stream *stream = user_data;
+       struct media_transport *transport;
+
+       transport = find_transport_by_bap_stream(link);
+       if (!transport) {
+               error("Unable to find transport");
+               return;
+       }
+
+       bt_bap_stream_io_unlink(link, stream);
+
+       bap_update_links(transport);
+
+       /* Emit property changed for all remaining links */
+       queue_foreach(bt_bap_stream_io_get_links(link), update_links, NULL);
+}
+
 static guint transport_bap_suspend(struct media_transport *transport,
                                struct media_owner *owner)
 {
        struct bap_transport *bap = transport->data;
+       struct queue *links = bt_bap_stream_io_get_links(bap->stream);
        bt_bap_stream_func_t func = NULL;
        guint id;
 
@@ -1893,6 +1928,10 @@ static guint transport_bap_suspend(struct media_transport *transport,
        else
                transport_set_state(transport, TRANSPORT_STATE_IDLE);
 
+       if (bt_bap_stream_get_type(bap->stream) == BT_BAP_STREAM_TYPE_BCAST)
+               /* Unlink stream from all its links */
+               queue_foreach(links, transport_unlink, bap->stream);
+
        bap_update_links(transport);
 
        id = bt_bap_stream_disable(bap->stream, bap->linked, func, owner);