Hi Claudia, On Fri, Oct 13, 2023 at 3:06 AM Claudia Draghicescu <claudia.rosu@xxxxxxx> wrote: > > Create new endpoint name for the simulated broadcast sink that is > created when registering a broadcast source endpoint. > This removes the ambiguity when having registered a local > broadcast sink and fixes the situation when multiple remote > endpoints are created when discovering a broadcast source. > > --- > src/shared/bap.c | 54 +++++++++++++++++++++++++++--------------------- > src/shared/bap.h | 1 + > 2 files changed, 32 insertions(+), 23 deletions(-) > > diff --git a/src/shared/bap.c b/src/shared/bap.c > index 925501c48..266116235 100644 > --- a/src/shared/bap.c > +++ b/src/shared/bap.c > @@ -644,7 +644,7 @@ static struct bt_bap_endpoint *bap_endpoint_new_broadcast(struct bt_bap_db *bdb, > if (type == BT_BAP_BCAST_SINK) > ep->dir = BT_BAP_BCAST_SOURCE; > else > - ep->dir = BT_BAP_BCAST_SINK; > + ep->dir = BT_BAP_SIMULATED_BCAST_SINK; > > return ep; > } > @@ -1500,12 +1500,12 @@ static void ep_config_cb(struct bt_bap_stream *stream, int err) > return; > > if (bt_bap_stream_get_type(stream) == BT_BAP_STREAM_TYPE_BCAST) { > - if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SINK) > + if (bt_bap_stream_io_dir(stream) == BT_BAP_SIMULATED_BCAST_SINK) > stream_set_state_broadcast(stream, > - BT_BAP_STREAM_STATE_QOS); > + BT_BAP_STREAM_STATE_QOS); > else if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SOURCE) > stream_set_state_broadcast(stream, > - BT_BAP_STREAM_STATE_CONFIG); > + BT_BAP_STREAM_STATE_CONFIG); > return; > } > > @@ -2710,15 +2710,15 @@ struct bt_bap_pac *bt_bap_add_vendor_pac(struct gatt_db *db, > break; > case BT_BAP_BCAST_SOURCE: > bap_add_broadcast_source(pac); > - if (queue_isempty(bdb->broadcast_sinks)) { > - /* When adding a local broadcast source, add also a > - * local broadcast sink > - */ > - pac_broadcast_sink = bap_pac_new(bdb, name, > - BT_BAP_BCAST_SINK, &codec, qos, > - data, metadata); > - bap_add_broadcast_sink(pac_broadcast_sink); > - } > + /* When adding a local broadcast source, add also a > + * local broadcast sink > + */ > + pac_broadcast_sink = bap_pac_new(bdb, name, > + BT_BAP_SIMULATED_BCAST_SINK, &codec, qos, > + data, metadata); I'm not really sure why this is needed to begin with, if that is to have a remote endpoint I'd say we need to change the logic so broadcast src role is allowed to create streams without a remote endpoint, anyway we should probably have better documentation around this logic. > + bap_add_broadcast_sink(pac_broadcast_sink); > + queue_foreach(sessions, notify_session_pac_added, pac_broadcast_sink); > + return pac; > break; > case BT_BAP_BCAST_SINK: > bap_add_broadcast_sink(pac); > @@ -4457,13 +4457,23 @@ static void bap_foreach_pac(struct queue *l, struct queue *r, > for (er = queue_get_entries(r); er; er = er->next) { > struct bt_bap_pac *rpac = er->data; > > + if ((lpac->type == BT_BAP_BCAST_SOURCE) > + && (rpac->type != BT_BAP_SIMULATED_BCAST_SINK)) > + continue; > + if ((rpac->type == BT_BAP_SIMULATED_BCAST_SINK) > + && (lpac->type == BT_BAP_BCAST_SOURCE)) { > + func(lpac, rpac, user_data); > + return; > + } > + > /* Skip checking codec for bcast source, > * it will be checked when BASE info are received > */ > if ((rpac->type != BT_BAP_BCAST_SOURCE) && > (!bap_codec_equal(&lpac->codec, &rpac->codec))) > continue; > - > + if (rpac->type == BT_BAP_SIMULATED_BCAST_SINK) > + continue; > if (!func(lpac, rpac, user_data)) > return; > } > @@ -4484,12 +4494,6 @@ void bt_bap_foreach_pac(struct bt_bap *bap, uint8_t type, > return bap_foreach_pac(bap->ldb->sinks, bap->rdb->sources, > func, user_data); > case BT_BAP_BCAST_SOURCE: > - if (queue_isempty(bap->rdb->broadcast_sources) > - && queue_isempty(bap->rdb->broadcast_sinks)) > - return bap_foreach_pac(bap->ldb->broadcast_sources, > - bap->ldb->broadcast_sinks, > - func, user_data); > - > return bap_foreach_pac(bap->ldb->broadcast_sinks, > bap->rdb->broadcast_sources, > func, user_data); > @@ -4497,6 +4501,10 @@ void bt_bap_foreach_pac(struct bt_bap *bap, uint8_t type, > return bap_foreach_pac(bap->ldb->broadcast_sinks, > bap->rdb->broadcast_sources, > func, user_data); > + case BT_BAP_SIMULATED_BCAST_SINK: > + return bap_foreach_pac(bap->ldb->broadcast_sources, > + bap->ldb->broadcast_sinks, > + func, user_data); > } > } > > @@ -4927,12 +4935,12 @@ unsigned int bt_bap_stream_enable(struct bt_bap_stream *stream, > queue_foreach(stream->links, bap_stream_enable_link, metadata); > break; > case BT_BAP_STREAM_TYPE_BCAST: > - if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SINK) > + if (bt_bap_stream_io_dir(stream) == BT_BAP_SIMULATED_BCAST_SINK) > stream_set_state_broadcast(stream, > - BT_BAP_STREAM_STATE_CONFIG); > + BT_BAP_STREAM_STATE_CONFIG); > else if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SOURCE) > stream_set_state_broadcast(stream, > - BT_BAP_STREAM_STATE_STREAMING); > + BT_BAP_STREAM_STATE_STREAMING); > > return 1; > } > diff --git a/src/shared/bap.h b/src/shared/bap.h > index ebe4dbf7d..af3b6be71 100644 > --- a/src/shared/bap.h > +++ b/src/shared/bap.h > @@ -19,6 +19,7 @@ > #define BT_BAP_SOURCE 0x02 > #define BT_BAP_BCAST_SOURCE 0x03 > #define BT_BAP_BCAST_SINK 0x04 > +#define BT_BAP_SIMULATED_BCAST_SINK 0x05 > > #define BT_BAP_STREAM_TYPE_UCAST 0x01 > #define BT_BAP_STREAM_TYPE_BCAST 0x02 > -- > 2.39.2 > -- Luiz Augusto von Dentz