diff mbox series

[BlueZ] bap: don't track streams without setup except for ucast server

Message ID b3c84d2181db1acdc096df03e8d1046b89a7628d.1745252942.git.pav@iki.fi
State New
Headers show
Series [BlueZ] bap: don't track streams without setup except for ucast server | expand

Commit Message

Pauli Virtanen April 21, 2025, 4:30 p.m. UTC
data->streams is is used for determining which streams can connect to
listening socket. This stream list is specific to ucast server.

Rename the variable to data->server_streams, and only put ucast server
streams there.

Fixes data->streams accumulating dead stream pointers.
---
 profiles/audio/bap.c | 24 ++++++++++--------------
 1 file changed, 10 insertions(+), 14 deletions(-)
diff mbox series

Patch

diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c
index 88d170585..ee7c8bc49 100644
--- a/profiles/audio/bap.c
+++ b/profiles/audio/bap.c
@@ -106,7 +106,7 @@  struct bap_data {
 	struct queue *snks;
 	struct queue *bcast;
 	struct queue *bcast_snks;
-	struct queue *streams;
+	struct queue *server_streams;
 	GIOChannel *listen_io;
 	unsigned int io_id;
 	int selecting;
@@ -158,7 +158,7 @@  static void bap_data_free(struct bap_data *data)
 	queue_destroy(data->snks, ep_unregister);
 	queue_destroy(data->srcs, ep_unregister);
 	queue_destroy(data->bcast, ep_unregister);
-	queue_destroy(data->streams, NULL);
+	queue_destroy(data->server_streams, NULL);
 	queue_destroy(data->bcast_snks, setup_free);
 	bt_bap_ready_unregister(data->bap, data->ready_id);
 	bt_bap_state_unregister(data->bap, data->state_id);
@@ -1695,7 +1695,7 @@  static void iso_confirm_cb(GIOChannel *io, void *user_data)
 	DBG("ISO: incoming connect from %s (CIG 0x%02x CIS 0x%02x)",
 					address, qos.ucast.cig, qos.ucast.cis);
 
-	stream = queue_remove_if(data->streams, match_stream_qos, &qos);
+	stream = queue_remove_if(data->server_streams, match_stream_qos, &qos);
 	if (!stream) {
 		error("No matching stream found");
 		goto drop;
@@ -2040,6 +2040,12 @@  static void setup_listen_io(struct bap_data *data, struct bt_bap_stream *stream,
 
 	DBG("stream %p", stream);
 
+	if (!data->server_streams)
+		data->server_streams = queue_new();
+
+	if (!queue_find(data->server_streams, NULL, stream))
+		queue_push_tail(data->server_streams, stream);
+
 	/* If IO already set skip creating it again */
 	if (bt_bap_stream_get_io(stream) || data->listen_io)
 		return;
@@ -2143,12 +2149,6 @@  static void setup_create_io(struct bap_data *data, struct bap_setup *setup,
 	DBG("setup %p stream %p defer %s", setup, stream,
 				defer ? "true" : "false");
 
-	if (!data->streams)
-		data->streams = queue_new();
-
-	if (!queue_find(data->streams, NULL, stream))
-		queue_push_tail(data->streams, stream);
-
 	switch (bt_bap_stream_get_type(stream)) {
 	case BT_BAP_STREAM_TYPE_UCAST:
 		setup_create_ucast_io(data, setup, stream, defer);
@@ -2184,7 +2184,7 @@  static void bap_state(struct bt_bap_stream *stream, uint8_t old_state,
 		if (setup)
 			setup_free(setup);
 		else
-			queue_remove(data->streams, stream);
+			queue_remove(data->server_streams, stream);
 		break;
 	case BT_BAP_STREAM_STATE_CONFIG:
 		if (setup && !setup->id) {
@@ -2365,8 +2365,6 @@  static void bap_state_bcast_src(struct bt_bap_stream *stream, uint8_t old_state,
 		/* Release stream if idle */
 		if (setup)
 			setup_free(setup);
-		else
-			queue_remove(data->streams, stream);
 		break;
 	case BT_BAP_STREAM_STATE_CONFIG:
 		// TO DO Reconfiguration
@@ -2469,8 +2467,6 @@  static void bap_state_bcast_sink(struct bt_bap_stream *stream,
 		/* Release stream if idle */
 		if (setup)
 			setup_free(setup);
-		else
-			queue_remove(data->streams, stream);
 		break;
 	case BT_BAP_STREAM_STATE_CONFIG:
 		if (!setup)