From db2d3511df19a23c9c6b7ada5fb6173a51980c80 Mon Sep 17 00:00:00 2001 From: Emil Gydesen Date: Fri, 3 Jun 2022 10:44:07 +0200 Subject: [PATCH 1/5] Bluetooth: Audio: Fix state check in bass Fix bad state check in biginfo_recv in bass.c which would cause null-pointer access. Signed-off-by: Emil Gydesen --- subsys/bluetooth/audio/bass.c | 2 +- subsys/bluetooth/host/iso.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/subsys/bluetooth/audio/bass.c b/subsys/bluetooth/audio/bass.c index 9ccec691f224a..5f8f6758bbaad 100644 --- a/subsys/bluetooth/audio/bass.c +++ b/subsys/bluetooth/audio/bass.c @@ -440,7 +440,7 @@ static void biginfo_recv(struct bt_le_per_adv_sync *sync, { struct bass_recv_state_internal *state = bass_lookup_pa_sync(sync); - if (state != NULL || state->biginfo_received) { + if (state == NULL || state->biginfo_received) { return; } diff --git a/subsys/bluetooth/host/iso.c b/subsys/bluetooth/host/iso.c index 5c55a4a713b81..c954baaf0f926 100644 --- a/subsys/bluetooth/host/iso.c +++ b/subsys/bluetooth/host/iso.c @@ -85,6 +85,7 @@ static void bt_iso_send_cb(struct bt_conn *iso, void *user_data, int err) } #endif /* CONFIG_BT_ISO_UNICAST || CONFIG_BT_ISO_BROADCASTER */ + void hci_iso(struct net_buf *buf) { struct bt_hci_iso_hdr *hdr; From 3d58f28bc49eb883fcc9c251c27f45e634398229 Mon Sep 17 00:00:00 2001 From: Emil Gydesen Date: Fri, 3 Jun 2022 10:48:19 +0200 Subject: [PATCH 2/5] Bluetooth: Audio: Add enabling state to broadcast source There is a brief period between the bt_iso_big_create and when the ISO channels are established. In this state it should be possible to call bt_audio_broadcast_source_stop to stop the BIG from being created. Signed-off-by: Emil Gydesen --- subsys/bluetooth/audio/broadcast_source.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/subsys/bluetooth/audio/broadcast_source.c b/subsys/bluetooth/audio/broadcast_source.c index 3b88e381f20c5..a2e66c8fd1981 100644 --- a/subsys/bluetooth/audio/broadcast_source.c +++ b/subsys/bluetooth/audio/broadcast_source.c @@ -87,7 +87,13 @@ static void broadcast_source_set_ep_state(struct bt_audio_ep *ep, uint8_t state) break; case BT_AUDIO_EP_STATE_QOS_CONFIGURED: if (state != BT_AUDIO_EP_STATE_IDLE && - state != BT_AUDIO_EP_STATE_STREAMING) { + state != BT_AUDIO_EP_STATE_ENABLING) { + BT_DBG("Invalid broadcast sync endpoint state transition"); + return; + } + break; + case BT_AUDIO_EP_STATE_ENABLING: + if (state != BT_AUDIO_EP_STATE_STREAMING) { BT_DBG("Invalid broadcast sync endpoint state transition"); return; } @@ -672,6 +678,12 @@ int bt_audio_broadcast_source_start(struct bt_audio_broadcast_source *source) return err; } + for (size_t i = 0U; i < source->stream_count; i++) { + struct bt_audio_ep *ep = source->streams[i]->ep; + + broadcast_source_set_ep_state(ep, BT_AUDIO_EP_STATE_ENABLING); + } + return 0; } @@ -697,7 +709,8 @@ int bt_audio_broadcast_source_stop(struct bt_audio_broadcast_source *source) return -EINVAL; } - if (stream->ep->status.state != BT_AUDIO_EP_STATE_STREAMING) { + if (stream->ep->status.state != BT_AUDIO_EP_STATE_STREAMING && + stream->ep->status.state != BT_AUDIO_EP_STATE_ENABLING) { BT_DBG("Broadcast source stream %p invalid state: %u", stream, stream->ep->status.state); return -EBADMSG; From 756ccdcdba5e9635708c9722ca2b087525aa059b Mon Sep 17 00:00:00 2001 From: Emil Gydesen Date: Fri, 3 Jun 2022 10:49:56 +0200 Subject: [PATCH 3/5] Bluetooth: ISO: Add connecting->disconnecting state transition Add the state transition from connecting to disconnecting as a valid transition for ISO. This can occur if a ISO channel is disconnected before it is fully connected, of if a BIG or a BIG sync is terminated before established. Signed-off-by: Emil Gydesen --- subsys/bluetooth/host/iso.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/subsys/bluetooth/host/iso.c b/subsys/bluetooth/host/iso.c index c954baaf0f926..0f05cb02826a9 100644 --- a/subsys/bluetooth/host/iso.c +++ b/subsys/bluetooth/host/iso.c @@ -502,7 +502,8 @@ void bt_iso_chan_set_state_debug(struct bt_iso_chan *chan, } break; case BT_ISO_STATE_DISCONNECTING: - if (chan->state != BT_ISO_STATE_CONNECTED) { + if (chan->state != BT_ISO_STATE_CONNECTING && + chan->state != BT_ISO_STATE_CONNECTED) { BT_WARN("%s()%d: invalid transition", func, line); } break; From 66487700c0177199db38ec25446eb930e1eaf78b Mon Sep 17 00:00:00 2001 From: Emil Gydesen Date: Thu, 2 Jun 2022 15:25:47 +0200 Subject: [PATCH 4/5] Bluetooth: Audio: Update broadcast_source_test to use ISO Update the broadcast_source_test to actually create the BIG and send data over ISO. Signed-off-by: Emil Gydesen --- .../bsim_bt/bsim_test_audio/prj.conf | 27 +++- .../src/broadcast_source_test.c | 148 +++++++++++++++--- 2 files changed, 150 insertions(+), 25 deletions(-) diff --git a/tests/bluetooth/bsim_bt/bsim_test_audio/prj.conf b/tests/bluetooth/bsim_bt/bsim_test_audio/prj.conf index 11108b4b3770d..6cc9901944bc9 100644 --- a/tests/bluetooth/bsim_bt/bsim_test_audio/prj.conf +++ b/tests/bluetooth/bsim_bt/bsim_test_audio/prj.conf @@ -17,19 +17,17 @@ CONFIG_BT_SMP=y # Needed for extended advertising CONFIG_BT_EXT_ADV_LEGACY_SUPPORT=y -# Advertising Extensions support in Controller -CONFIG_BT_CTLR_ADV_EXT=y -CONFIG_BT_CTLR_ADV_DATA_LEN_MAX=255 -CONFIG_BT_CTLR_SCAN_DATA_LEN_MAX=255 - CONFIG_BT_AUDIO=y CONFIG_BT_AUDIO_UNICAST_SERVER=y CONFIG_BT_AUDIO_UNICAST_CLIENT=y CONFIG_BT_AUDIO_UNICAST_CLIENT_GROUP_STREAM_COUNT=2 CONFIG_BT_AUDIO_BROADCAST_SOURCE=y CONFIG_BT_AUDIO_BROADCAST_SINK=y -CONFIG_BT_AUDIO_BROADCAST_SRC_STREAM_COUNT=2 -CONFIG_BT_AUDIO_BROADCAST_SNK_STREAM_COUNT=2 +# Only 1 stream support by controller at this point +CONFIG_BT_AUDIO_BROADCAST_SRC_STREAM_COUNT=1 +# Only 1 stream support by controller at this point +CONFIG_BT_AUDIO_BROADCAST_SNK_STREAM_COUNT=1 +CONFIG_BT_ISO_TX_BUF_COUNT=4 # Volume Offset Control Service CONFIG_BT_VOCS_MAX_INSTANCE_COUNT=2 @@ -123,6 +121,8 @@ CONFIG_BT_DEBUG_CSIS_CLIENT=y CONFIG_BT_DEBUG_CSIS_CRYPTO=y CONFIG_BT_AUDIO_DEBUG_UNICAST_CLIENT=y CONFIG_BT_AUDIO_DEBUG_UNICAST_SERVER=y +CONFIG_BT_AUDIO_DEBUG_BROADCAST_SINK=y +CONFIG_BT_AUDIO_DEBUG_BROADCAST_SOURCE=y CONFIG_BT_DEBUG_ASCS=y CONFIG_BT_DEBUG_PACS=y CONFIG_BT_AUDIO_DEBUG_STREAM=y @@ -135,3 +135,16 @@ CONFIG_BT_DEBUG_HAS_CLIENT=y # LOGGING CONFIG_TEST_LOGGING_DEFAULTS=n CONFIG_LOG_MODE_IMMEDIATE=y + +# Controller configs +CONFIG_BT_CTLR_ADV_ISO=y +CONFIG_BT_CTLR_SYNC_ISO=y +CONFIG_BT_CTLR_SCAN_DATA_LEN_MAX=255 +# Supports the highest SDU size required by any BAP LC3 presets (155) +CONFIG_BT_CTLR_ISO_TX_BUFFER_SIZE=155 +CONFIG_BT_CTLR_ADV_DATA_LEN_MAX=191 +# Only 1 stream support by controller at this point +CONFIG_BT_CTLR_ADV_ISO_STREAM_COUNT=1 +# Only 1 stream support by controller at this point +CONFIG_BT_CTLR_SYNC_ISO_STREAM_MAX=1 +CONFIG_BT_CTLR_ISO_TX_BUFFERS=3 diff --git a/tests/bluetooth/bsim_bt/bsim_test_audio/src/broadcast_source_test.c b/tests/bluetooth/bsim_bt/bsim_test_audio/src/broadcast_source_test.c index 20c8f690a29b0..87aa74bfeb55d 100644 --- a/tests/bluetooth/bsim_bt/bsim_test_audio/src/broadcast_source_test.c +++ b/tests/bluetooth/bsim_bt/bsim_test_audio/src/broadcast_source_test.c @@ -10,19 +10,95 @@ #include #include "common.h" +/* When BROADCAST_ENQUEUE_COUNT > 1 we can enqueue enough buffers to ensure that + * the controller is never idle + */ +#define BROADCAST_ENQUEUE_COUNT 2U +#define TOTAL_BUF_NEEDED (BROADCAST_ENQUEUE_COUNT * CONFIG_BT_AUDIO_BROADCAST_SRC_STREAM_COUNT) + +BUILD_ASSERT(CONFIG_BT_ISO_TX_BUF_COUNT >= TOTAL_BUF_NEEDED, + "CONFIG_BT_ISO_TX_BUF_COUNT should be at least " + "BROADCAST_ENQUEUE_COUNT * CONFIG_BT_AUDIO_BROADCAST_SRC_STREAM_COUNT"); + +NET_BUF_POOL_FIXED_DEFINE(tx_pool, + TOTAL_BUF_NEEDED, + BT_ISO_SDU_BUF_SIZE(CONFIG_BT_ISO_TX_MTU), 8, NULL); + extern enum bst_result_t bst_result; +static struct bt_audio_stream broadcast_source_streams[CONFIG_BT_AUDIO_BROADCAST_SRC_STREAM_COUNT]; +static struct bt_audio_stream *streams[ARRAY_SIZE(broadcast_source_streams)]; +static struct bt_audio_lc3_preset preset_16_2_1 = + BT_AUDIO_LC3_BROADCAST_PRESET_16_2_1(BT_AUDIO_LOCATION_FRONT_LEFT, + BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED); +static struct bt_audio_lc3_preset preset_16_2_2 = + BT_AUDIO_LC3_BROADCAST_PRESET_16_2_2(BT_AUDIO_LOCATION_FRONT_LEFT, + BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED); +CREATE_FLAG(flag_stopping); + +static K_SEM_DEFINE(sem_started, 0U, ARRAY_SIZE(streams)); +static K_SEM_DEFINE(sem_stopped, 0U, ARRAY_SIZE(streams)); + +static void started_cb(struct bt_audio_stream *stream) +{ + printk("Stream %p started\n", stream); + k_sem_give(&sem_started); +} + +static void stopped_cb(struct bt_audio_stream *stream) +{ + printk("Stream %p stopped\n", stream); + k_sem_give(&sem_stopped); +} + +static void sent_cb(struct bt_audio_stream *stream) +{ + static uint8_t mock_data[CONFIG_BT_ISO_TX_MTU]; + static bool mock_data_initialized; + static uint16_t seq_num; + struct net_buf *buf; + int ret; + + if (TEST_FLAG(flag_stopping)) { + return; + } + + if (!mock_data_initialized) { + for (size_t i = 0U; i < ARRAY_SIZE(mock_data); i++) { + /* Initialize mock data */ + mock_data[i] = (uint8_t)i; + } + mock_data_initialized = true; + } + + buf = net_buf_alloc(&tx_pool, K_FOREVER); + if (buf == NULL) { + printk("Could not allocate buffer when sending on %p\n", + stream); + return; + } + + net_buf_reserve(buf, BT_ISO_CHAN_SEND_RESERVE); + /* Use preset_16_2_1 as that is the config we end up using */ + net_buf_add_mem(buf, mock_data, preset_16_2_1.qos.sdu); + ret = bt_audio_stream_send(stream, buf, seq_num++, + BT_ISO_TIMESTAMP_NONE); + if (ret < 0) { + /* This will end broadcasting on this stream. */ + printk("Unable to broadcast data on %p: %d\n", stream, ret); + net_buf_unref(buf); + return; + } +} + +static struct bt_audio_stream_ops stream_ops = { + .started = started_cb, + .stopped = stopped_cb, + .sent = sent_cb +}; static void test_main(void) { int err; - struct bt_audio_lc3_preset preset_16_2_1 = - BT_AUDIO_LC3_BROADCAST_PRESET_16_2_1(BT_AUDIO_LOCATION_FRONT_LEFT, - BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED); - struct bt_audio_lc3_preset preset_16_2_2 = - BT_AUDIO_LC3_BROADCAST_PRESET_16_2_2(BT_AUDIO_LOCATION_FRONT_LEFT, - BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED); - struct bt_audio_stream broadcast_source_streams[CONFIG_BT_AUDIO_BROADCAST_SRC_STREAM_COUNT]; - struct bt_audio_stream *streams[ARRAY_SIZE(broadcast_source_streams)]; struct bt_audio_broadcast_source *source; err = bt_enable(NULL); @@ -38,32 +114,68 @@ static void test_main(void) for (size_t i = 0; i < ARRAY_SIZE(streams); i++) { streams[i] = &broadcast_source_streams[i]; + bt_audio_stream_cb_register(streams[i], &stream_ops); } - printk("Creating broadcast source\n"); + printk("Creating broadcast source with %zu streams\n", ARRAY_SIZE(streams)); err = bt_audio_broadcast_source_create(streams, ARRAY_SIZE(streams), - &preset_16_2_1.codec, - &preset_16_2_1.qos, + &preset_16_2_2.codec, + &preset_16_2_2.qos, &source); if (err != 0) { - FAIL("Unable to create broadcast source: %d", err); + FAIL("Unable to create broadcast source: %d\n", err); return; } printk("Reconfiguring broadcast source\n"); - err = bt_audio_broadcast_source_reconfig(source, &preset_16_2_2.codec, - &preset_16_2_2.qos); + err = bt_audio_broadcast_source_reconfig(source, &preset_16_2_1.codec, + &preset_16_2_1.qos); + if (err != 0) { + FAIL("Unable to reconfigure broadcast source: %d\n", err); + return; + } + + printk("Starting broadcast source\n"); + err = bt_audio_broadcast_source_start(source); if (err != 0) { - FAIL("Unable to reconfigure broadcast source: %d", err); + FAIL("Unable to start broadcast source: %d\n", err); return; } + /* Wait for all to be started */ + printk("Waiting for streams to be started\n"); + for (size_t i = 0U; i < ARRAY_SIZE(streams); i++) { + k_sem_take(&sem_started, K_FOREVER); + } + + /* Initialize sending */ + for (size_t i = 0U; i < ARRAY_SIZE(streams); i++) { + for (unsigned int j = 0U; j < BROADCAST_ENQUEUE_COUNT; j++) { + sent_cb(streams[i]); + } + } + + /* Keeping running for a little while */ k_sleep(K_SECONDS(10)); + printk("Stopping broadcast source\n"); + SET_FLAG(flag_stopping); + err = bt_audio_broadcast_source_stop(source); + if (err != 0) { + FAIL("Unable to stop broadcast source: %d\n", err); + return; + } + + /* Wait for all to be stopped */ + printk("Waiting for streams to be stopped\n"); + for (size_t i = 0U; i < ARRAY_SIZE(streams); i++) { + k_sem_take(&sem_stopped, K_FOREVER); + } + printk("Deleting broadcast source\n"); err = bt_audio_broadcast_source_delete(source); if (err != 0) { - FAIL("Unable to delete broadcast source: %d", err); + FAIL("Unable to delete broadcast source: %d\n", err); return; } source = NULL; @@ -75,14 +187,14 @@ static void test_main(void) &preset_16_2_1.qos, &source); if (err != 0) { - FAIL("Unable to create broadcast source: %d", err); + FAIL("Unable to create broadcast source: %d\n", err); return; } printk("Deleting broadcast source\n"); err = bt_audio_broadcast_source_delete(source); if (err != 0) { - FAIL("Unable to delete broadcast source: %d", err); + FAIL("Unable to delete broadcast source: %d\n", err); return; } source = NULL; From 17b89926f8394297a863e79ecbe412148c49121f Mon Sep 17 00:00:00 2001 From: Emil Gydesen Date: Thu, 2 Jun 2022 17:33:33 +0200 Subject: [PATCH 5/5] Bluetooth: Audio: Update broadcast_sink_test to use ISO Update the broadcast_sink_test to use ISO to sync to the broadcast source BIG, testing both the syncing functionality as well as the sync stop and delete functions. Signed-off-by: Emil Gydesen --- .../bsim_test_audio/src/broadcast_sink_test.c | 132 +++++++++++++++++- 1 file changed, 127 insertions(+), 5 deletions(-) diff --git a/tests/bluetooth/bsim_bt/bsim_test_audio/src/broadcast_sink_test.c b/tests/bluetooth/bsim_bt/bsim_test_audio/src/broadcast_sink_test.c index dd9ac6c326d9c..d08cdbaa16a06 100644 --- a/tests/bluetooth/bsim_bt/bsim_test_audio/src/broadcast_sink_test.c +++ b/tests/bluetooth/bsim_bt/bsim_test_audio/src/broadcast_sink_test.c @@ -16,15 +16,27 @@ extern enum bst_result_t bst_result; CREATE_FLAG(broadcaster_found); CREATE_FLAG(base_received); CREATE_FLAG(pa_synced); +CREATE_FLAG(flag_syncable); CREATE_FLAG(pa_sync_lost); +CREATE_FLAG(flag_received); static struct bt_audio_broadcast_sink *g_sink; - -/* Mandatory support preset by both source and sink */ -static struct bt_audio_lc3_preset preset = +static struct bt_audio_stream broadcast_sink_streams[CONFIG_BT_AUDIO_BROADCAST_SNK_STREAM_COUNT]; +static struct bt_audio_stream *streams[ARRAY_SIZE(broadcast_sink_streams)]; +static struct bt_audio_lc3_preset preset_16_2_1 = BT_AUDIO_LC3_BROADCAST_PRESET_16_2_1(BT_AUDIO_LOCATION_FRONT_LEFT, BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED); +static K_SEM_DEFINE(sem_started, 0U, ARRAY_SIZE(streams)); +static K_SEM_DEFINE(sem_stopped, 0U, ARRAY_SIZE(streams)); + +/* Create a mask for the maximum BIS we can sync to using the number of streams + * we have. We add an additional 1 since the bis indexes start from 1 and not + * 0. + */ +static const uint32_t bis_index_mask = BIT_MASK(ARRAY_SIZE(streams) + 1U); +static uint32_t bis_index_bitfield; + static bool scan_recv_cb(const struct bt_le_scan_recv_info *info, uint32_t broadcast_id) { @@ -60,6 +72,8 @@ static void pa_synced_cb(struct bt_audio_broadcast_sink *sink, static void base_recv_cb(struct bt_audio_broadcast_sink *sink, const struct bt_audio_base *base) { + uint32_t base_bis_index_bitfield = 0U; + if (TEST_FLAG(base_received)) { return; } @@ -67,9 +81,27 @@ static void base_recv_cb(struct bt_audio_broadcast_sink *sink, printk("Received BASE with %u subgroups from broadcast sink %p\n", base->subgroup_count, sink); + + for (size_t i = 0U; i < base->subgroup_count; i++) { + for (size_t j = 0U; j < base->subgroups[i].bis_count; j++) { + const uint8_t index = base->subgroups[i].bis_data[j].index; + + base_bis_index_bitfield |= BIT(index); + } + } + + bis_index_bitfield = base_bis_index_bitfield & bis_index_mask; + SET_FLAG(base_received); } +static void syncable_cb(struct bt_audio_broadcast_sink *sink, bool encrypted) +{ + printk("Broadcast sink %p syncable with%s encryption\n", + sink, encrypted ? "" : "out"); + SET_FLAG(flag_syncable); +} + static void pa_sync_lost_cb(struct bt_audio_broadcast_sink *sink) { if (g_sink == NULL) { @@ -93,12 +125,38 @@ static struct bt_audio_broadcast_sink_cb broadcast_sink_cbs = { .scan_term = scan_term_cb, .base_recv = base_recv_cb, .pa_synced = pa_synced_cb, + .syncable = syncable_cb, .pa_sync_lost = pa_sync_lost_cb }; static struct bt_audio_capability capabilities = { .dir = BT_AUDIO_DIR_SINK, - .codec = &preset.codec, + .codec = &preset_16_2_1.codec, +}; + +static void started_cb(struct bt_audio_stream *stream) +{ + printk("Stream %p started\n", stream); + k_sem_give(&sem_started); +} + +static void stopped_cb(struct bt_audio_stream *stream) +{ + printk("Stream %p stopped\n", stream); + k_sem_give(&sem_stopped); +} + +static void recv_cb(struct bt_audio_stream *stream, + const struct bt_iso_recv_info *info, + struct net_buf *buf) +{ + SET_FLAG(flag_received); +} + +static struct bt_audio_stream_ops stream_ops = { + .started = started_cb, + .stopped = stopped_cb, + .recv = recv_cb }; static int init(void) @@ -125,6 +183,11 @@ static int init(void) UNSET_FLAG(base_received); UNSET_FLAG(pa_synced); + for (size_t i = 0U; i < ARRAY_SIZE(streams); i++) { + streams[i] = &broadcast_sink_streams[i]; + bt_audio_stream_cb_register(streams[i], &stream_ops); + } + return 0; } @@ -144,6 +207,7 @@ static void test_main(void) FAIL("Unable to start scan for broadcast sources: %d", err); return; } + WAIT_FOR_FLAG(broadcaster_found); printk("Broadcast source found, waiting for PA sync\n"); WAIT_FOR_FLAG(pa_synced); @@ -151,10 +215,37 @@ static void test_main(void) WAIT_FOR_FLAG(base_received); printk("BASE received\n"); + printk("Waiting for BIG syncable\n"); + WAIT_FOR_FLAG(flag_syncable); + + printk("Syncing the sink\n"); + err = bt_audio_broadcast_sink_sync(g_sink, bis_index_bitfield, streams, + NULL); + if (err != 0) { + FAIL("Unable to sync the sink: %d\n", err); + return; + } + + /* Wait for all to be started */ + printk("Waiting for streams to be started\n"); + for (size_t i = 0U; i < ARRAY_SIZE(streams); i++) { + k_sem_take(&sem_started, K_FOREVER); + } + + printk("Waiting for data\n"); + WAIT_FOR_FLAG(flag_received); + + /* The order of PA sync lost and BIG Sync lost is irrelevant + * and depend on timeout parameters. We just wait for PA first, but + * either way will work. + */ printk("Waiting for PA disconnected\n"); WAIT_FOR_FLAG(pa_sync_lost); - /* TODO: Handle Audio when ISO is supported in BSIM */ + printk("Waiting for streams to be stopped\n"); + for (size_t i = 0U; i < ARRAY_SIZE(streams); i++) { + k_sem_take(&sem_stopped, K_FOREVER); + } PASS("Broadcast sink passed\n"); } @@ -182,6 +273,37 @@ static void test_sink_disconnect(void) WAIT_FOR_FLAG(base_received); printk("BASE received\n"); + printk("Waiting for BIG syncable\n"); + WAIT_FOR_FLAG(flag_syncable); + + printk("Syncing the sink\n"); + /* TODO: Sync to max streams instead of just BIT(1) */ + err = bt_audio_broadcast_sink_sync(g_sink, BIT(1), streams, NULL); + if (err != 0) { + FAIL("Unable to sync the sink: %d\n", err); + return; + } + + /* Wait for all to be started */ + printk("Waiting for streams to be started\n"); + for (size_t i = 0U; i < ARRAY_SIZE(streams); i++) { + k_sem_take(&sem_started, K_FOREVER); + } + + printk("Waiting for data\n"); + WAIT_FOR_FLAG(flag_received); + + err = bt_audio_broadcast_sink_stop(g_sink); + if (err != 0) { + FAIL("Unable to stop sink: %d", err); + return; + } + + printk("Waiting for streams to be stopped\n"); + for (size_t i = 0U; i < ARRAY_SIZE(streams); i++) { + k_sem_take(&sem_stopped, K_FOREVER); + } + err = bt_audio_broadcast_sink_delete(g_sink); if (err != 0) { FAIL("Unable to delete sink: %d", err);