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 --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) -- 2.49.0