1 /*
2 * Copyright (c) 2023 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6 #include <errno.h>
7 #include <stdbool.h>
8 #include <stddef.h>
9 #include <stdint.h>
10 #include <string.h>
11
12 #include <zephyr/autoconf.h>
13 #include <zephyr/bluetooth/addr.h>
14 #include <zephyr/bluetooth/audio/audio.h>
15 #include <zephyr/bluetooth/audio/bap.h>
16 #include <zephyr/bluetooth/audio/bap_lc3_preset.h>
17 #include <zephyr/bluetooth/audio/cap.h>
18 #include <zephyr/bluetooth/audio/csip.h>
19 #include <zephyr/bluetooth/audio/micp.h>
20 #include <zephyr/bluetooth/audio/vcp.h>
21 #include <zephyr/bluetooth/bluetooth.h>
22 #include <zephyr/bluetooth/byteorder.h>
23 #include <zephyr/bluetooth/conn.h>
24 #include <zephyr/bluetooth/gap.h>
25 #include <zephyr/bluetooth/gatt.h>
26 #include <zephyr/bluetooth/hci_types.h>
27 #include <zephyr/bluetooth/iso.h>
28 #include <zephyr/bluetooth/uuid.h>
29 #include <zephyr/kernel.h>
30 #include <zephyr/net_buf.h>
31 #include <zephyr/sys/byteorder.h>
32 #include <zephyr/sys/printk.h>
33 #include <zephyr/sys/util.h>
34 #include <zephyr/sys/util_macro.h>
35
36 #include "bstests.h"
37 #include "common.h"
38 #include "bap_common.h"
39
40 #if defined(CONFIG_BT_CAP_COMMANDER)
41
42 #define SEM_TIMEOUT K_SECONDS(5)
43
44 extern enum bst_result_t bst_result;
45
46 static struct bt_conn *connected_conns[CONFIG_BT_MAX_CONN];
47 static volatile size_t connected_conn_cnt;
48
49 static struct bt_le_scan_recv_info broadcaster_info;
50 static bt_addr_le_t broadcaster_addr;
51 static struct bt_le_per_adv_sync *g_pa_sync;
52 static uint32_t broadcaster_broadcast_id;
53
54 static uint8_t received_base[UINT8_MAX];
55 static uint8_t received_base_size;
56 static uint8_t src_id[CONFIG_BT_MAX_CONN];
57
58 static struct k_sem sem_disconnected;
59 static struct k_sem sem_cas_discovered;
60 static struct k_sem sem_vcs_discovered;
61 static struct k_sem sem_mics_discovered;
62 static struct k_sem sem_bass_discovered;
63
64 CREATE_FLAG(flag_mtu_exchanged);
65 CREATE_FLAG(flag_cap_canceled);
66 CREATE_FLAG(flag_volume_changed);
67 CREATE_FLAG(flag_volume_mute_changed);
68 CREATE_FLAG(flag_volume_offset_changed);
69 CREATE_FLAG(flag_microphone_mute_changed);
70 CREATE_FLAG(flag_microphone_gain_changed);
71
72 CREATE_FLAG(flag_broadcast_reception_start);
73 CREATE_FLAG(flag_broadcast_reception_stop);
74 CREATE_FLAG(flag_broadcaster_found);
75 CREATE_FLAG(flag_base_received);
76 CREATE_FLAG(flag_recv_state_updated_with_bis_sync);
77 CREATE_FLAG(flag_pa_synced);
78 CREATE_FLAG(flag_pa_sync_lost);
79 CREATE_FLAG(flag_syncable);
80
cap_discovery_complete_cb(struct bt_conn * conn,int err,const struct bt_csip_set_coordinator_set_member * member,const struct bt_csip_set_coordinator_csis_inst * csis_inst)81 static void cap_discovery_complete_cb(struct bt_conn *conn, int err,
82 const struct bt_csip_set_coordinator_set_member *member,
83 const struct bt_csip_set_coordinator_csis_inst *csis_inst)
84 {
85 if (err != 0) {
86 FAIL("Discover failed on %p: %d\n", (void *)conn, err);
87
88 return;
89 }
90
91 if (IS_ENABLED(CONFIG_BT_CAP_ACCEPTOR_SET_MEMBER)) {
92 if (csis_inst == NULL) {
93 FAIL("Failed to discover CAS CSIS");
94
95 return;
96 }
97
98 printk("Found CAS on %p with CSIS %p\n", (void *)conn, csis_inst);
99 } else {
100 printk("Found CAS on %p\n", (void *)conn);
101 }
102
103 k_sem_give(&sem_cas_discovered);
104 }
105
106 #if defined(CONFIG_BT_VCP_VOL_CTLR)
cap_volume_changed_cb(struct bt_conn * conn,int err)107 static void cap_volume_changed_cb(struct bt_conn *conn, int err)
108 {
109 if (err == -ECANCELED) {
110 printk("CAP command cancelled for conn %p\n", conn);
111 SET_FLAG(flag_cap_canceled);
112 return;
113 }
114
115 if (err != 0) {
116 FAIL("Failed to change volume for conn %p: %d\n", conn, err);
117 return;
118 }
119
120 SET_FLAG(flag_volume_changed);
121 }
122
cap_volume_mute_changed_cb(struct bt_conn * conn,int err)123 static void cap_volume_mute_changed_cb(struct bt_conn *conn, int err)
124 {
125 if (err == -ECANCELED) {
126 printk("CAP command cancelled for conn %p\n", conn);
127 SET_FLAG(flag_cap_canceled);
128 return;
129 }
130
131 if (err != 0) {
132 FAIL("Failed to change volume mute for conn %p: %d\n", conn, err);
133 return;
134 }
135
136 SET_FLAG(flag_volume_mute_changed);
137 }
138
139 #if defined(CONFIG_BT_VCP_VOL_CTLR_VOCS)
cap_volume_offset_changed_cb(struct bt_conn * conn,int err)140 static void cap_volume_offset_changed_cb(struct bt_conn *conn, int err)
141 {
142 if (err == -ECANCELED) {
143 printk("CAP command cancelled for conn %p\n", conn);
144 SET_FLAG(flag_cap_canceled);
145 return;
146 }
147
148 if (err != 0) {
149 FAIL("Failed to change volume offset for conn %p: %d\n", conn, err);
150 return;
151 }
152
153 SET_FLAG(flag_volume_offset_changed);
154 }
155 #endif /* CONFIG_BT_VCP_VOL_CTLR_VOCS */
156 #endif /* CONFIG_BT_VCP_VOL_CTLR */
157
158 #if defined(CONFIG_BT_MICP_MIC_CTLR)
cap_microphone_mute_changed_cb(struct bt_conn * conn,int err)159 static void cap_microphone_mute_changed_cb(struct bt_conn *conn, int err)
160 {
161 if (err == -ECANCELED) {
162 printk("CAP command cancelled for conn %p\n", conn);
163 SET_FLAG(flag_cap_canceled);
164 return;
165 }
166
167 if (err != 0) {
168 FAIL("Failed to change microphone mute for conn %p: %d\n", conn, err);
169 return;
170 }
171
172 SET_FLAG(flag_microphone_mute_changed);
173 }
174
175 #if defined(CONFIG_BT_MICP_MIC_CTLR_AICS)
cap_microphone_gain_changed_cb(struct bt_conn * conn,int err)176 static void cap_microphone_gain_changed_cb(struct bt_conn *conn, int err)
177 {
178 if (err == -ECANCELED) {
179 printk("CAP command cancelled for conn %p\n", conn);
180 SET_FLAG(flag_cap_canceled);
181 return;
182 }
183
184 if (err != 0) {
185 FAIL("Failed to change microphone gain for conn %p: %d\n", conn, err);
186 return;
187 }
188
189 SET_FLAG(flag_microphone_gain_changed);
190 }
191 #endif /* CONFIG_BT_MICP_MIC_CTLR_AICS */
192 #endif /* CONFIG_BT_MICP_MIC_CTLR */
193
194 #if defined(CONFIG_BT_BAP_BROADCAST_ASSISTANT)
cap_broadcast_reception_start_cb(struct bt_conn * conn,int err)195 static void cap_broadcast_reception_start_cb(struct bt_conn *conn, int err)
196 {
197 if (err == -ECANCELED) {
198 printk("CAP command cancelled for conn %p\n", conn);
199 SET_FLAG(flag_cap_canceled);
200 return;
201 }
202
203 if (err != 0) {
204 FAIL("Failed to perform broadcast reception start for conn %p: %d\n", conn, err);
205 return;
206 }
207
208 SET_FLAG(flag_broadcast_reception_start);
209 }
210
cap_broadcast_reception_stop_cb(struct bt_conn * conn,int err)211 static void cap_broadcast_reception_stop_cb(struct bt_conn *conn, int err)
212 {
213 if (err == -ECANCELED) {
214 printk("CAP command cancelled for conn %p\n", conn);
215 SET_FLAG(flag_cap_canceled);
216 return;
217 }
218
219 if (err != 0) {
220 FAIL("Failed to perform broadcast reception stop for conn %p: %d\n", conn, err);
221 return;
222 }
223
224 SET_FLAG(flag_broadcast_reception_stop);
225 }
226 #endif /* CONFIG_BT_BAP_BROADCAST_ASSISTANT*/
227
228 static struct bt_cap_commander_cb cap_cb = {
229 .discovery_complete = cap_discovery_complete_cb,
230 #if defined(CONFIG_BT_VCP_VOL_CTLR)
231 .volume_changed = cap_volume_changed_cb,
232 .volume_mute_changed = cap_volume_mute_changed_cb,
233 #if defined(CONFIG_BT_VCP_VOL_CTLR_VOCS)
234 .volume_offset_changed = cap_volume_offset_changed_cb,
235 #endif /* CONFIG_BT_VCP_VOL_CTLR_VOCS */
236 #endif /* CONFIG_BT_VCP_VOL_CTLR */
237 #if defined(CONFIG_BT_MICP_MIC_CTLR)
238 .microphone_mute_changed = cap_microphone_mute_changed_cb,
239 #if defined(CONFIG_BT_MICP_MIC_CTLR_AICS)
240 .microphone_gain_changed = cap_microphone_gain_changed_cb,
241 #endif /* CONFIG_BT_MICP_MIC_CTLR_AICS */
242 #endif /* CONFIG_BT_MICP_MIC_CTLR */
243 #if defined(CONFIG_BT_BAP_BROADCAST_ASSISTANT)
244 .broadcast_reception_start = cap_broadcast_reception_start_cb,
245 .broadcast_reception_stop = cap_broadcast_reception_stop_cb,
246 #endif /* CONFIG_BT_BAP_BROADCAST_ASSISTANT*/
247 };
248
cap_vcp_discover_cb(struct bt_vcp_vol_ctlr * vol_ctlr,int err,uint8_t vocs_count,uint8_t aics_count)249 static void cap_vcp_discover_cb(struct bt_vcp_vol_ctlr *vol_ctlr, int err, uint8_t vocs_count,
250 uint8_t aics_count)
251 {
252 if (err != 0) {
253 FAIL("Failed to discover VCS: %d\n", err);
254
255 return;
256 }
257
258 printk("VCS for %p found with %u VOCS and %u AICS\n", vol_ctlr, vocs_count, aics_count);
259 k_sem_give(&sem_vcs_discovered);
260 }
261
cap_vcp_state_cb(struct bt_vcp_vol_ctlr * vol_ctlr,int err,uint8_t volume,uint8_t mute)262 static void cap_vcp_state_cb(struct bt_vcp_vol_ctlr *vol_ctlr, int err, uint8_t volume,
263 uint8_t mute)
264 {
265 if (err != 0) {
266 FAIL("VCP state cb err (%d)\n", err);
267 return;
268 }
269
270 printk("State for %p: volume %u, mute %u\n", vol_ctlr, volume, mute);
271 }
272
273 static struct bt_vcp_vol_ctlr_cb vcp_cb = {
274 .discover = cap_vcp_discover_cb,
275 .state = cap_vcp_state_cb,
276 };
277
cap_micp_discover_cb(struct bt_micp_mic_ctlr * mic_ctlr,int err,uint8_t aics_count)278 static void cap_micp_discover_cb(struct bt_micp_mic_ctlr *mic_ctlr, int err, uint8_t aics_count)
279 {
280 if (err != 0) {
281 FAIL("Failed to discover MICS: %d\n", err);
282
283 return;
284 }
285
286 printk("MICS for %p found with %u AICS\n", mic_ctlr, aics_count);
287 k_sem_give(&sem_mics_discovered);
288 }
289
290 static struct bt_micp_mic_ctlr_cb micp_cb = {
291 .discover = cap_micp_discover_cb,
292 };
293
att_mtu_updated(struct bt_conn * conn,uint16_t tx,uint16_t rx)294 static void att_mtu_updated(struct bt_conn *conn, uint16_t tx, uint16_t rx)
295 {
296 printk("MTU exchanged\n");
297 SET_FLAG(flag_mtu_exchanged);
298 }
299
300 static struct bt_gatt_cb gatt_callbacks = {
301 .att_mtu_updated = att_mtu_updated,
302 };
303
cap_disconnected_cb(struct bt_conn * conn,uint8_t reason)304 static void cap_disconnected_cb(struct bt_conn *conn, uint8_t reason)
305 {
306 k_sem_give(&sem_disconnected);
307 }
308
pa_sync_create(void)309 static int pa_sync_create(void)
310 {
311 struct bt_le_per_adv_sync_param create_params = {0};
312 int err;
313
314 bt_addr_le_copy(&create_params.addr, &broadcaster_addr);
315 create_params.options = 0;
316 create_params.sid = broadcaster_info.sid;
317 create_params.skip = PA_SYNC_SKIP;
318 create_params.timeout = interval_to_sync_timeout(broadcaster_info.interval);
319
320 err = bt_le_per_adv_sync_create(&create_params, &g_pa_sync);
321 return err;
322 }
323
scan_check_and_sync_broadcast(struct bt_data * data,void * user_data)324 static bool scan_check_and_sync_broadcast(struct bt_data *data, void *user_data)
325 {
326 const struct bt_le_scan_recv_info *info = user_data;
327 char le_addr[BT_ADDR_LE_STR_LEN];
328 struct bt_uuid_16 adv_uuid;
329 uint32_t broadcast_id;
330
331 if (TEST_FLAG(flag_broadcaster_found)) {
332 /* no-op*/
333 printk("NO OP\n");
334 return false;
335 }
336
337 if (data->type != BT_DATA_SVC_DATA16) {
338 return true;
339 }
340
341 if (data->data_len < BT_UUID_SIZE_16 + BT_AUDIO_BROADCAST_ID_SIZE) {
342 return true;
343 }
344
345 if (!bt_uuid_create(&adv_uuid.uuid, data->data, BT_UUID_SIZE_16)) {
346 return true;
347 }
348
349 if (bt_uuid_cmp(&adv_uuid.uuid, BT_UUID_BROADCAST_AUDIO)) {
350 return true;
351 }
352
353 broadcast_id = sys_get_le24(data->data + BT_UUID_SIZE_16);
354
355 bt_addr_le_to_str(info->addr, le_addr, sizeof(le_addr));
356
357 printk("Found broadcaster with ID 0x%06X and addr %s and sid 0x%02X\n", broadcast_id,
358 le_addr, info->sid);
359 printk("Adv type %02X interval %u\n", info->adv_type, info->interval);
360
361 SET_FLAG(flag_broadcaster_found);
362
363 /* Store info for PA sync parameters */
364 memcpy(&broadcaster_info, info, sizeof(broadcaster_info));
365 bt_addr_le_copy(&broadcaster_addr, info->addr);
366 broadcaster_broadcast_id = broadcast_id;
367
368 /* Stop parsing */
369 return false;
370 }
371
broadcast_scan_recv(const struct bt_le_scan_recv_info * info,struct net_buf_simple * ad)372 static void broadcast_scan_recv(const struct bt_le_scan_recv_info *info, struct net_buf_simple *ad)
373 {
374 if (info->interval != 0U) {
375 bt_data_parse(ad, scan_check_and_sync_broadcast, (void *)info);
376 }
377 }
378
379 static struct bt_le_scan_cb bap_scan_cb = {
380 .recv = broadcast_scan_recv,
381 };
382
bap_pa_sync_synced_cb(struct bt_le_per_adv_sync * sync,struct bt_le_per_adv_sync_synced_info * info)383 static void bap_pa_sync_synced_cb(struct bt_le_per_adv_sync *sync,
384 struct bt_le_per_adv_sync_synced_info *info)
385 {
386 if (sync == g_pa_sync) {
387 printk("PA sync %p synced for broadcast sink with broadcast ID 0x%06X\n", sync,
388 broadcaster_broadcast_id);
389 SET_FLAG(flag_pa_synced);
390 }
391 }
392
bap_pa_sync_terminated_cb(struct bt_le_per_adv_sync * sync,const struct bt_le_per_adv_sync_term_info * info)393 static void bap_pa_sync_terminated_cb(struct bt_le_per_adv_sync *sync,
394 const struct bt_le_per_adv_sync_term_info *info)
395 {
396 if (sync == g_pa_sync) {
397 printk("CAP commander test PA sync %p lost with reason %u\n", sync, info->reason);
398 g_pa_sync = NULL;
399
400 SET_FLAG(flag_pa_sync_lost);
401 }
402 }
403
base_store(struct bt_data * data,void * user_data)404 static bool base_store(struct bt_data *data, void *user_data)
405 {
406 const struct bt_bap_base *base = bt_bap_base_get_base_from_ad(data);
407 uint8_t base_size;
408 int base_subgroup_count;
409
410 /* Base is NULL if the data does not contain a valid BASE */
411 if (base == NULL) {
412 return true;
413 }
414
415 /* Can not fit all the received subgroups with the size CONFIG_BT_BAP_BASS_MAX_SUBGROUPS */
416 base_subgroup_count = bt_bap_base_get_subgroup_count(base);
417 if (base_subgroup_count < 0 || base_subgroup_count > CONFIG_BT_BAP_BASS_MAX_SUBGROUPS) {
418 printk("Got invalid subgroup count: %d\n", base_subgroup_count);
419 return true;
420 }
421
422 base_size = data->data_len - BT_UUID_SIZE_16; /* the BASE comes after the UUID */
423
424 /* Compare BASE and copy if different */
425 if (base_size != received_base_size || memcmp(base, received_base, base_size) != 0) {
426 (void)memcpy(received_base, base, base_size);
427 received_base_size = base_size;
428 }
429
430 /* Stop parsing */
431 return false;
432 }
433
pa_recv(struct bt_le_per_adv_sync * sync,const struct bt_le_per_adv_sync_recv_info * info,struct net_buf_simple * buf)434 static void pa_recv(struct bt_le_per_adv_sync *sync,
435 const struct bt_le_per_adv_sync_recv_info *info, struct net_buf_simple *buf)
436 {
437 if (TEST_FLAG(flag_base_received)) {
438 return;
439 }
440
441 bt_data_parse(buf, base_store, NULL);
442 SET_FLAG(flag_base_received);
443 }
444
445 static struct bt_le_per_adv_sync_cb bap_pa_sync_cb = {
446 .synced = bap_pa_sync_synced_cb,
447 .term = bap_pa_sync_terminated_cb,
448 .recv = pa_recv,
449 };
450
bap_broadcast_assistant_discover_cb(struct bt_conn * conn,int err,uint8_t recv_state_count)451 static void bap_broadcast_assistant_discover_cb(struct bt_conn *conn, int err,
452 uint8_t recv_state_count)
453 {
454 if (err == 0) {
455 printk("BASS discover done with %u recv states\n", recv_state_count);
456 } else {
457 printk("BASS discover failed (%d)\n", err);
458 }
459
460 k_sem_give(&sem_bass_discovered);
461 }
462
bap_broadcast_assistant_add_src_cb(struct bt_conn * conn,int err)463 static void bap_broadcast_assistant_add_src_cb(struct bt_conn *conn, int err)
464 {
465 if (err == 0) {
466 printk("BASS add source successful\n");
467 } else {
468 printk("BASS add source failed (%d)\n", err);
469 }
470 }
471
metadata_entry(struct bt_data * data,void * user_data)472 static bool metadata_entry(struct bt_data *data, void *user_data)
473 {
474 char metadata[CONFIG_BT_AUDIO_CODEC_CFG_MAX_METADATA_SIZE];
475
476 (void)bin2hex(data->data, data->data_len, metadata, sizeof(metadata));
477
478 printk("\t\tMetadata length %u, type %u, data: %s\n", data->data_len, data->type, metadata);
479
480 return true;
481 }
482
483 static void
bap_broadcast_assistant_recv_state_cb(struct bt_conn * conn,int err,const struct bt_bap_scan_delegator_recv_state * state)484 bap_broadcast_assistant_recv_state_cb(struct bt_conn *conn, int err,
485 const struct bt_bap_scan_delegator_recv_state *state)
486 {
487 char le_addr[BT_ADDR_LE_STR_LEN];
488 char bad_code[BT_ISO_BROADCAST_CODE_SIZE * 2 + 1];
489 size_t acceptor_count = get_dev_cnt() - 2;
490
491 if (err != 0) {
492 FAIL("BASS recv state read failed (%d)\n", err);
493 return;
494 }
495
496 if (state == NULL) {
497 /* Empty receive state */
498 return;
499 }
500
501 bt_addr_le_to_str(&state->addr, le_addr, sizeof(le_addr));
502 (void)bin2hex(state->bad_code, BT_ISO_BROADCAST_CODE_SIZE, bad_code, sizeof(bad_code));
503 printk("BASS recv state: src_id %u, addr %s, sid %u, sync_state %u, "
504 "encrypt_state %u%s%s\n",
505 state->src_id, le_addr, state->adv_sid, state->pa_sync_state, state->encrypt_state,
506 state->encrypt_state == BT_BAP_BIG_ENC_STATE_BAD_CODE ? ", bad code" : "", bad_code);
507
508 if (state->encrypt_state == BT_BAP_BIG_ENC_STATE_BAD_CODE) {
509 FAIL("Encryption state is BT_BAP_BIG_ENC_STATE_BAD_CODE");
510 return;
511 }
512
513 for (size_t index = 0; index < acceptor_count; index++) {
514 if (conn == connected_conns[index]) {
515 src_id[index] = state->src_id;
516 }
517 }
518
519 for (uint8_t i = 0; i < state->num_subgroups; i++) {
520 const struct bt_bap_bass_subgroup *subgroup = &state->subgroups[i];
521 struct net_buf_simple buf;
522
523 printk("\t[%d]: BIS sync %u, metadata_len %u\n", i, subgroup->bis_sync,
524 subgroup->metadata_len);
525
526 net_buf_simple_init_with_data(&buf, (void *)subgroup->metadata,
527 subgroup->metadata_len);
528 bt_data_parse(&buf, metadata_entry, NULL);
529
530 if (subgroup->bis_sync != 0) {
531 SET_FLAG(flag_recv_state_updated_with_bis_sync);
532 }
533 }
534
535 #if defined(CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER)
536 if (state->pa_sync_state == BT_BAP_PA_STATE_INFO_REQ) {
537 err = bt_le_per_adv_sync_transfer(g_pa_sync, conn, BT_UUID_BASS_VAL);
538 if (err != 0) {
539 FAIL("Could not transfer periodic adv sync: %d\n", err);
540 return;
541 }
542 }
543 #endif /* CONFIG_BT_PER_ADV_SYNC_TRANSFER_SENDER */
544
545 if (state->pa_sync_state == BT_BAP_PA_STATE_SYNCED) {
546 }
547 }
548
549 static struct bt_bap_broadcast_assistant_cb ba_cbs = {
550 .discover = bap_broadcast_assistant_discover_cb,
551 .recv_state = bap_broadcast_assistant_recv_state_cb,
552 .add_src = bap_broadcast_assistant_add_src_cb,
553 };
554
check_audio_support_and_connect_cb(struct bt_data * data,void * user_data)555 static bool check_audio_support_and_connect_cb(struct bt_data *data, void *user_data)
556 {
557 char addr_str[BT_ADDR_LE_STR_LEN];
558 bt_addr_le_t *addr = user_data;
559 const struct bt_uuid *uuid;
560 uint16_t uuid_val;
561 int err;
562
563 printk("data->type %u\n", data->type);
564
565 if (data->type != BT_DATA_SVC_DATA16) {
566 return true; /* Continue parsing to next AD data type */
567 }
568
569 if (data->data_len < sizeof(uuid_val)) {
570 return true; /* Continue parsing to next AD data type */
571 }
572
573 /* We are looking for the CAS service data */
574 uuid_val = sys_get_le16(data->data);
575 uuid = BT_UUID_DECLARE_16(uuid_val);
576 if (bt_uuid_cmp(uuid, BT_UUID_CAS) != 0) {
577 return true; /* Continue parsing to next AD data type */
578 }
579
580 bt_addr_le_to_str(addr, addr_str, sizeof(addr_str));
581 printk("Device found: %s\n", addr_str);
582
583 printk("Stopping scan\n");
584 if (bt_le_scan_stop()) {
585 FAIL("Could not stop scan");
586 return false;
587 }
588
589 err = bt_conn_le_create(addr, BT_CONN_LE_CREATE_CONN, BT_BAP_CONN_PARAM_RELAXED,
590 &connected_conns[connected_conn_cnt]);
591 if (err != 0) {
592 FAIL("Could not connect to peer: %d", err);
593 }
594
595 return false; /* Stop parsing */
596 }
597
scan_recv_cb(const struct bt_le_scan_recv_info * info,struct net_buf_simple * buf)598 static void scan_recv_cb(const struct bt_le_scan_recv_info *info, struct net_buf_simple *buf)
599 {
600 struct bt_conn *conn;
601
602 conn = bt_conn_lookup_addr_le(BT_ID_DEFAULT, info->addr);
603 if (conn != NULL) {
604 /* Already connected to this device */
605 bt_conn_unref(conn);
606 return;
607 }
608
609 /* Check for connectable, extended advertising */
610 if (((info->adv_props & BT_GAP_ADV_PROP_EXT_ADV) != 0) &&
611 ((info->adv_props & BT_GAP_ADV_PROP_CONNECTABLE)) != 0) {
612 /* Check for TMAS support in advertising data */
613 bt_data_parse(buf, check_audio_support_and_connect_cb, (void *)info->addr);
614 }
615 }
616
init(size_t acceptor_cnt)617 static void init(size_t acceptor_cnt)
618 {
619 static struct bt_le_scan_cb scan_callbacks = {
620 .recv = scan_recv_cb,
621 };
622 static struct bt_conn_cb conn_cb = {
623 .disconnected = cap_disconnected_cb,
624 };
625 int err;
626
627 err = bt_enable(NULL);
628 if (err != 0) {
629 FAIL("Bluetooth enable failed (err %d)\n", err);
630 return;
631 }
632
633 bt_gatt_cb_register(&gatt_callbacks);
634 err = bt_le_scan_cb_register(&scan_callbacks);
635 if (err != 0) {
636 FAIL("Failed to register scan callbacks (err %d)\n", err);
637 return;
638 }
639
640 bt_conn_cb_register(&conn_cb);
641
642 err = bt_cap_commander_register_cb(&cap_cb);
643 if (err != 0) {
644 FAIL("Failed to register CAP callbacks (err %d)\n", err);
645 return;
646 }
647
648 err = bt_vcp_vol_ctlr_cb_register(&vcp_cb);
649 if (err != 0) {
650 FAIL("Failed to register VCP callbacks (err %d)\n", err);
651 return;
652 }
653
654 err = bt_micp_mic_ctlr_cb_register(&micp_cb);
655 if (err != 0) {
656 FAIL("Failed to register MICP callbacks (err %d)\n", err);
657 return;
658 }
659
660 err = bt_bap_broadcast_assistant_register_cb(&ba_cbs);
661 if (err != 0) {
662 FAIL("Failed to register broadcast assistant callbacks (err %d)\n");
663 return;
664 }
665
666 bt_le_per_adv_sync_cb_register(&bap_pa_sync_cb);
667 bt_le_scan_cb_register(&bap_scan_cb);
668
669 k_sem_init(&sem_disconnected, 0, acceptor_cnt);
670 k_sem_init(&sem_cas_discovered, 0, acceptor_cnt);
671 k_sem_init(&sem_bass_discovered, 0, acceptor_cnt);
672 k_sem_init(&sem_vcs_discovered, 0, acceptor_cnt);
673 k_sem_init(&sem_mics_discovered, 0, acceptor_cnt);
674
675 UNSET_FLAG(flag_mtu_exchanged);
676 UNSET_FLAG(flag_cap_canceled);
677 UNSET_FLAG(flag_volume_changed);
678 UNSET_FLAG(flag_volume_mute_changed);
679 UNSET_FLAG(flag_volume_offset_changed);
680 UNSET_FLAG(flag_microphone_mute_changed);
681 UNSET_FLAG(flag_microphone_gain_changed);
682
683 UNSET_FLAG(flag_broadcast_reception_start);
684 UNSET_FLAG(flag_broadcast_reception_stop);
685 UNSET_FLAG(flag_broadcaster_found);
686 UNSET_FLAG(flag_base_received);
687 UNSET_FLAG(flag_recv_state_updated_with_bis_sync);
688 UNSET_FLAG(flag_pa_synced);
689 UNSET_FLAG(flag_pa_sync_lost);
690 UNSET_FLAG(flag_syncable);
691 }
692
scan_and_connect(void)693 static void scan_and_connect(void)
694 {
695 int err;
696
697 UNSET_FLAG(flag_connected);
698
699 err = bt_le_scan_start(BT_LE_SCAN_PASSIVE, NULL);
700 if (err != 0) {
701 FAIL("Scanning failed to start (err %d)\n", err);
702 return;
703 }
704
705 printk("Scanning successfully started\n");
706 WAIT_FOR_FLAG(flag_connected);
707 connected_conn_cnt++;
708 }
709
disconnect_acl(size_t acceptor_cnt)710 static void disconnect_acl(size_t acceptor_cnt)
711 {
712 k_sem_reset(&sem_disconnected);
713
714 for (size_t i = 0U; i < acceptor_cnt; i++) {
715 struct bt_conn *conn = connected_conns[i];
716 int err;
717
718 printk("Disconnecting %p\n", (void *)conn);
719
720 err = bt_conn_disconnect(conn, BT_HCI_ERR_REMOTE_USER_TERM_CONN);
721 if (err != 0) {
722 FAIL("Failed to disconnect %p (err %d)\n", (void *)conn, err);
723 return;
724 }
725 }
726
727 for (size_t i = 0U; i < acceptor_cnt; i++) {
728 const int err = k_sem_take(&sem_disconnected, SEM_TIMEOUT);
729
730 if (err == 0) {
731 connected_conn_cnt--;
732 } else {
733 const struct bt_conn *conn = connected_conns[i];
734
735 FAIL("Failed to take sem_disconnected for %p: %d", (void *)conn, err);
736 return;
737 }
738 }
739 }
740
discover_cas(size_t acceptor_cnt)741 static void discover_cas(size_t acceptor_cnt)
742 {
743 k_sem_reset(&sem_cas_discovered);
744
745 /* Do parallel discovery */
746 for (size_t i = 0U; i < acceptor_cnt; i++) {
747 struct bt_conn *conn = connected_conns[i];
748 int err;
749
750 printk("Discovering CAS on %p\n", (void *)conn);
751
752 err = bt_cap_commander_discover(conn);
753 if (err != 0) {
754 FAIL("Failed to discover CAS on %p: %d\n", (void *)conn, err);
755 return;
756 }
757 }
758
759 for (size_t i = 0U; i < acceptor_cnt; i++) {
760 const int err = k_sem_take(&sem_cas_discovered, SEM_TIMEOUT);
761
762 if (err != 0) {
763 const struct bt_conn *conn = connected_conns[i];
764
765 FAIL("Failed to take sem_cas_discovered for %p: %d", (void *)conn, err);
766 }
767 }
768 }
769
discover_bass(size_t acceptor_cnt)770 static void discover_bass(size_t acceptor_cnt)
771 {
772 k_sem_reset(&sem_bass_discovered);
773
774 if (acceptor_cnt > 1) {
775 FAIL("Current implementation does not support multiple connections for the "
776 "broadcast assistant");
777 return;
778 }
779
780 for (size_t i = 0U; i < acceptor_cnt; i++) {
781 int err;
782
783 err = bt_bap_broadcast_assistant_discover(connected_conns[i]);
784 if (err != 0) {
785 FAIL("Failed to discover BASS on the sink (err %d)\n", err);
786 return;
787 }
788 }
789
790 for (size_t i = 0U; i < acceptor_cnt; i++) {
791 const int err = k_sem_take(&sem_bass_discovered, SEM_TIMEOUT);
792
793 if (err != 0) {
794 FAIL("Failed to take sem_bass_discovered for %p: %d",
795 (void *)connected_conns[i], err);
796 }
797 }
798 }
799
pa_sync_to_broadcaster(void)800 static void pa_sync_to_broadcaster(void)
801 {
802 int err;
803
804 err = bt_le_scan_start(BT_LE_SCAN_ACTIVE, NULL);
805 if (err != 0) {
806 FAIL("Unable to start scan for broadcast sources: %d", err);
807 return;
808 }
809
810 printk("Searching for a broadcaster\n");
811 WAIT_FOR_FLAG(flag_broadcaster_found);
812
813 err = bt_le_scan_stop();
814 if (err != 0) {
815 FAIL("bt_le_scan_stop failed with %d\n", err);
816 return;
817 }
818
819 printk("Scan stopped, attempting to PA sync to the broadcaster with id 0x%06X\n",
820 broadcaster_broadcast_id);
821 err = pa_sync_create();
822 if (err != 0) {
823 FAIL("Could not create Broadcast PA sync: %d\n", err);
824 return;
825 }
826
827 WAIT_FOR_FLAG(flag_pa_synced); /* todo from bap_pa_sync_synced_cb, bap_pa_sync_cb */
828
829 printk("Broadcast source PA synced, waiting for BASE\n");
830 WAIT_FOR_FLAG(flag_base_received);
831 }
832
discover_vcs(size_t acceptor_cnt)833 static void discover_vcs(size_t acceptor_cnt)
834 {
835 k_sem_reset(&sem_vcs_discovered);
836
837 /* Do parallel discovery */
838 for (size_t i = 0U; i < acceptor_cnt; i++) {
839 struct bt_conn *conn = connected_conns[i];
840 struct bt_vcp_vol_ctlr *vol_ctlr;
841 int err;
842
843 printk("Discovering VCS on %p\n", (void *)conn);
844
845 err = bt_vcp_vol_ctlr_discover(conn, &vol_ctlr);
846 if (err != 0) {
847 FAIL("Failed to discover VCS on %p: %d\n", err);
848 return;
849 }
850 }
851
852 for (size_t i = 0U; i < acceptor_cnt; i++) {
853 const int err = k_sem_take(&sem_vcs_discovered, SEM_TIMEOUT);
854
855 if (err != 0) {
856 const struct bt_conn *conn = connected_conns[i];
857
858 FAIL("Failed to take sem_vcs_discovered for %p: %d", (void *)conn, err);
859 }
860 }
861 }
862
discover_mics(size_t acceptor_cnt)863 static void discover_mics(size_t acceptor_cnt)
864 {
865 k_sem_reset(&sem_mics_discovered);
866
867 for (size_t i = 0U; i < acceptor_cnt; i++) {
868 struct bt_micp_mic_ctlr *mic_ctlr;
869 int err;
870
871 err = bt_micp_mic_ctlr_discover(connected_conns[i], &mic_ctlr);
872 if (err != 0) {
873 FAIL("Failed to discover MICS: %d\n", err);
874 return;
875 }
876 }
877
878 for (size_t i = 0U; i < acceptor_cnt; i++) {
879 const int err = k_sem_take(&sem_mics_discovered, SEM_TIMEOUT);
880
881 if (err != 0) {
882 const struct bt_conn *conn = connected_conns[i];
883
884 FAIL("Failed to take sem_mics_discovered for %p: %d", (void *)conn, err);
885 }
886 }
887 }
888
init_change_volume(void)889 static void init_change_volume(void)
890 {
891 union bt_cap_set_member members[CONFIG_BT_MAX_CONN];
892 const struct bt_cap_commander_change_volume_param param = {
893 .type = BT_CAP_SET_TYPE_AD_HOC,
894 .members = members,
895 .count = connected_conn_cnt,
896 .volume = 177,
897 };
898 int err;
899
900 printk("Changing volume to %u\n", param.volume);
901
902 for (size_t i = 0U; i < param.count; i++) {
903 param.members[i].member = connected_conns[i];
904 }
905
906 err = bt_cap_commander_change_volume(¶m);
907 if (err != 0) {
908 FAIL("Failed to change volume: %d\n", err);
909 return;
910 }
911 }
912
test_change_volume(void)913 static void test_change_volume(void)
914 {
915 UNSET_FLAG(flag_volume_changed);
916 init_change_volume();
917 WAIT_FOR_FLAG(flag_volume_changed);
918 }
919
test_change_volume_mute(bool mute)920 static void test_change_volume_mute(bool mute)
921 {
922 union bt_cap_set_member members[CONFIG_BT_MAX_CONN];
923 const struct bt_cap_commander_change_volume_mute_state_param param = {
924 .type = BT_CAP_SET_TYPE_AD_HOC,
925 .members = members,
926 .count = connected_conn_cnt,
927 .mute = mute,
928 };
929 int err;
930
931 printk("Changing volume mute state to %d\n", param.mute);
932 UNSET_FLAG(flag_volume_mute_changed);
933
934 for (size_t i = 0U; i < param.count; i++) {
935 param.members[i].member = connected_conns[i];
936 }
937
938 err = bt_cap_commander_change_volume_mute_state(¶m);
939 if (err != 0) {
940 FAIL("Failed to change volume mute: %d\n", err);
941 return;
942 }
943
944 WAIT_FOR_FLAG(flag_volume_mute_changed);
945 printk("Volume mute state changed to %d\n", param.mute);
946 }
947
test_change_volume_offset(void)948 static void test_change_volume_offset(void)
949 {
950 struct bt_cap_commander_change_volume_offset_member_param member_params[CONFIG_BT_MAX_CONN];
951 const struct bt_cap_commander_change_volume_offset_param param = {
952 .type = BT_CAP_SET_TYPE_AD_HOC,
953 .param = member_params,
954 .count = connected_conn_cnt,
955 };
956 int err;
957
958 printk("Changing volume offset\n");
959 UNSET_FLAG(flag_volume_offset_changed);
960
961 for (size_t i = 0U; i < param.count; i++) {
962 member_params[i].member.member = connected_conns[i];
963 member_params[i].offset = 100 + i;
964 }
965
966 err = bt_cap_commander_change_volume_offset(¶m);
967 if (err != 0) {
968 FAIL("Failed to change volume offset: %d\n", err);
969 return;
970 }
971
972 WAIT_FOR_FLAG(flag_volume_offset_changed);
973 printk("Volume offset changed\n");
974 }
975
test_change_microphone_mute(bool mute)976 static void test_change_microphone_mute(bool mute)
977 {
978 union bt_cap_set_member members[CONFIG_BT_MAX_CONN];
979 const struct bt_cap_commander_change_microphone_mute_state_param param = {
980 .type = BT_CAP_SET_TYPE_AD_HOC,
981 .members = members,
982 .count = connected_conn_cnt,
983 .mute = mute,
984 };
985 int err;
986
987 printk("Changing microphone mute state to %d\n", param.mute);
988 UNSET_FLAG(flag_microphone_mute_changed);
989
990 for (size_t i = 0U; i < param.count; i++) {
991 param.members[i].member = connected_conns[i];
992 }
993
994 err = bt_cap_commander_change_microphone_mute_state(¶m);
995 if (err != 0) {
996 FAIL("Failed to change microphone mute: %d\n", err);
997 return;
998 }
999
1000 WAIT_FOR_FLAG(flag_microphone_mute_changed);
1001 printk("Microphone mute state changed to %d\n", param.mute);
1002 }
1003
test_change_microphone_gain(void)1004 static void test_change_microphone_gain(void)
1005 {
1006 struct bt_cap_commander_change_microphone_gain_setting_member_param
1007 member_params[CONFIG_BT_MAX_CONN];
1008 const struct bt_cap_commander_change_microphone_gain_setting_param param = {
1009 .type = BT_CAP_SET_TYPE_AD_HOC,
1010 .param = member_params,
1011 .count = connected_conn_cnt,
1012 };
1013 int err;
1014
1015 printk("Changing microphone gain\n");
1016 UNSET_FLAG(flag_microphone_gain_changed);
1017
1018 for (size_t i = 0U; i < param.count; i++) {
1019 member_params[i].member.member = connected_conns[i];
1020 member_params[i].gain = 10 + i;
1021 }
1022
1023 err = bt_cap_commander_change_microphone_gain_setting(¶m);
1024 if (err != 0) {
1025 FAIL("Failed to change microphone gain: %d\n", err);
1026 return;
1027 }
1028
1029 WAIT_FOR_FLAG(flag_microphone_gain_changed);
1030 printk("Microphone gain changed\n");
1031 }
1032
test_broadcast_reception_start(size_t acceptor_count)1033 static void test_broadcast_reception_start(size_t acceptor_count)
1034 {
1035 struct bt_cap_commander_broadcast_reception_start_param reception_start_param = {0};
1036 struct bt_cap_commander_broadcast_reception_start_member_param param[CONFIG_BT_MAX_CONN] = {
1037 0};
1038 int err;
1039
1040 reception_start_param.type = BT_CAP_SET_TYPE_AD_HOC;
1041 reception_start_param.count = acceptor_count;
1042 reception_start_param.param = param;
1043
1044 for (size_t i = 0; i < acceptor_count; i++) {
1045 uint32_t bis_sync[CONFIG_BT_BAP_BASS_MAX_SUBGROUPS];
1046 size_t num_subgroups;
1047
1048 reception_start_param.param[i].member.member = connected_conns[i];
1049 bt_addr_le_copy(&reception_start_param.param[i].addr, &broadcaster_addr);
1050 reception_start_param.param[i].adv_sid = broadcaster_info.sid;
1051 reception_start_param.param[i].pa_interval = broadcaster_info.interval;
1052 reception_start_param.param[i].broadcast_id = broadcaster_broadcast_id;
1053 num_subgroups =
1054 bt_bap_base_get_subgroup_count((const struct bt_bap_base *)received_base);
1055 err = bt_bap_base_get_bis_indexes((const struct bt_bap_base *)received_base,
1056 bis_sync);
1057 if (err != 0) {
1058 FAIL("Could not populate subgroup information: %d\n", err);
1059 return;
1060 }
1061
1062 reception_start_param.param[i].num_subgroups = num_subgroups;
1063 for (size_t j = 0; j < num_subgroups; j++) {
1064 reception_start_param.param[i].subgroups[j].bis_sync = bis_sync[j];
1065 }
1066 }
1067
1068 err = bt_cap_commander_broadcast_reception_start(&reception_start_param);
1069 if (err != 0) {
1070 FAIL("Could not initiate broadcast reception start: %d\n", err);
1071 return;
1072 }
1073
1074 WAIT_FOR_FLAG(flag_broadcast_reception_start);
1075 }
1076
test_broadcast_reception_stop(size_t acceptor_count)1077 static void test_broadcast_reception_stop(size_t acceptor_count)
1078 {
1079 struct bt_cap_commander_broadcast_reception_stop_param reception_stop_param = {0};
1080 struct bt_cap_commander_broadcast_reception_stop_member_param param[CONFIG_BT_MAX_CONN] = {
1081 0};
1082
1083 int err;
1084
1085 reception_stop_param.type = BT_CAP_SET_TYPE_AD_HOC;
1086 reception_stop_param.param = param;
1087 reception_stop_param.count = acceptor_count;
1088 for (size_t i = 0; i < acceptor_count; i++) {
1089 uint8_t num_subgroups;
1090
1091 reception_stop_param.param[i].member.member = connected_conns[i];
1092
1093 reception_stop_param.param[i].src_id = src_id[i];
1094 num_subgroups =
1095 bt_bap_base_get_subgroup_count((const struct bt_bap_base *)received_base);
1096 reception_stop_param.param[i].num_subgroups = num_subgroups;
1097 }
1098 err = bt_cap_commander_broadcast_reception_stop(&reception_stop_param);
1099 if (err != 0) {
1100 FAIL("Could not initiate broadcast reception stop: %d\n", err);
1101 return;
1102 }
1103 WAIT_FOR_FLAG(flag_broadcast_reception_stop);
1104 }
1105
test_distribute_broadcast_code(size_t acceptor_count)1106 static void test_distribute_broadcast_code(size_t acceptor_count)
1107 {
1108 struct bt_cap_commander_distribute_broadcast_code_param distribute_broadcast_code_param = {
1109 0};
1110 struct bt_cap_commander_distribute_broadcast_code_member_param param[CONFIG_BT_MAX_CONN] = {
1111 0};
1112
1113 distribute_broadcast_code_param.type = BT_CAP_SET_TYPE_AD_HOC;
1114 distribute_broadcast_code_param.param = param;
1115 distribute_broadcast_code_param.count = acceptor_count;
1116 memcpy(distribute_broadcast_code_param.broadcast_code, BROADCAST_CODE,
1117 sizeof(BROADCAST_CODE));
1118 for (size_t i = 0; i < acceptor_count; i++) {
1119
1120 distribute_broadcast_code_param.param[i].member.member = connected_conns[i];
1121 distribute_broadcast_code_param.param[i].src_id = src_id[i];
1122 }
1123
1124 bt_cap_commander_distribute_broadcast_code(&distribute_broadcast_code_param);
1125 }
1126
test_cancel(bool cap_in_progress)1127 static void test_cancel(bool cap_in_progress)
1128 {
1129 const int expected_err = cap_in_progress ? 0 : -EALREADY;
1130 int err;
1131
1132 err = bt_cap_commander_cancel();
1133 if (err != expected_err) {
1134 FAIL("Could not cancel CAP command: %d\n", err);
1135 return;
1136 }
1137 }
1138
test_main_cap_commander_capture_and_render(void)1139 static void test_main_cap_commander_capture_and_render(void)
1140 {
1141 const size_t acceptor_cnt = get_dev_cnt() - 1; /* Assume all other devices are acceptors
1142 */
1143 init(acceptor_cnt);
1144
1145 /* Connect to and do discovery on all CAP acceptors */
1146 for (size_t i = 0U; i < acceptor_cnt; i++) {
1147 scan_and_connect();
1148
1149 WAIT_FOR_FLAG(flag_mtu_exchanged);
1150 }
1151
1152 /* TODO: We should use CSIP to find set members */
1153 discover_cas(acceptor_cnt);
1154 discover_cas(acceptor_cnt); /* verify that we can discover twice */
1155
1156 if (IS_ENABLED(CONFIG_BT_CSIP_SET_COORDINATOR)) {
1157 if (IS_ENABLED(CONFIG_BT_VCP_VOL_CTLR)) {
1158 discover_vcs(acceptor_cnt);
1159
1160 test_change_volume();
1161
1162 test_change_volume_mute(true);
1163 test_change_volume_mute(false);
1164
1165 if (IS_ENABLED(CONFIG_BT_VCP_VOL_CTLR_VOCS)) {
1166 test_change_volume_offset();
1167 }
1168 }
1169
1170 if (IS_ENABLED(CONFIG_BT_MICP_MIC_CTLR)) {
1171 discover_mics(acceptor_cnt);
1172
1173 test_change_microphone_mute(true);
1174 test_change_microphone_mute(false);
1175
1176 if (IS_ENABLED(CONFIG_BT_MICP_MIC_CTLR_AICS)) {
1177 test_change_microphone_gain();
1178 }
1179 }
1180 }
1181
1182 /* Disconnect all CAP acceptors */
1183 disconnect_acl(acceptor_cnt);
1184
1185 PASS("CAP commander capture and rendering passed\n");
1186 }
1187
test_main_cap_commander_broadcast_reception(void)1188 static void test_main_cap_commander_broadcast_reception(void)
1189 {
1190 size_t acceptor_count;
1191
1192 /* The test consists of N devices
1193 * 1 device is the broadcast source
1194 * 1 device is the CAP commander
1195 * This leaves N - 2 devices for the acceptor
1196 */
1197 acceptor_count = get_dev_cnt() - 2;
1198 printk("Acceptor count: %d\n", acceptor_count);
1199
1200 init(acceptor_count);
1201
1202 for (size_t i = 0U; i < acceptor_count; i++) {
1203 scan_and_connect();
1204
1205 WAIT_FOR_FLAG(flag_mtu_exchanged);
1206 }
1207
1208 /* TODO: We should use CSIP to find set members */
1209 discover_cas(acceptor_count);
1210 discover_bass(acceptor_count);
1211
1212 pa_sync_to_broadcaster();
1213
1214 test_broadcast_reception_start(acceptor_count);
1215
1216 test_distribute_broadcast_code(acceptor_count);
1217
1218 backchannel_sync_wait_any(); /* wait for the acceptor to receive data */
1219
1220 test_broadcast_reception_stop(acceptor_count);
1221
1222 backchannel_sync_wait_any(); /* wait for the acceptor to stop reception */
1223
1224 /* Disconnect all CAP acceptors */
1225 disconnect_acl(acceptor_count);
1226
1227 PASS("Broadcast reception passed\n");
1228 }
1229
test_main_cap_commander_cancel(void)1230 static void test_main_cap_commander_cancel(void)
1231 {
1232 size_t acceptor_count;
1233
1234 /* The test consists of N devices
1235 * 1 device is the broadcast source
1236 * 1 device is the CAP commander
1237 * This leaves N - 2 devices for the acceptor
1238 */
1239 acceptor_count = get_dev_cnt() - 1;
1240 printk("Acceptor count: %d\n", acceptor_count);
1241
1242 init(acceptor_count);
1243
1244 for (size_t i = 0U; i < acceptor_count; i++) {
1245 scan_and_connect();
1246
1247 WAIT_FOR_FLAG(flag_mtu_exchanged);
1248 }
1249
1250 /* TODO: We should use CSIP to find set members */
1251 discover_cas(acceptor_count);
1252
1253 if (IS_ENABLED(CONFIG_BT_CSIP_SET_COORDINATOR)) {
1254 if (IS_ENABLED(CONFIG_BT_VCP_VOL_CTLR)) {
1255 discover_vcs(acceptor_count);
1256
1257 init_change_volume();
1258
1259 test_cancel(true);
1260 WAIT_FOR_FLAG(flag_cap_canceled);
1261 }
1262 }
1263
1264 test_cancel(false);
1265
1266 /* Disconnect all CAP acceptors */
1267 disconnect_acl(acceptor_count);
1268
1269 /* restore the default callback */
1270 cap_cb.volume_changed = cap_volume_changed_cb;
1271
1272 PASS("Broadcast reception passed\n");
1273 }
1274
1275 static const struct bst_test_instance test_cap_commander[] = {
1276 {
1277 .test_id = "cap_commander_capture_and_render",
1278 .test_pre_init_f = test_init,
1279 .test_tick_f = test_tick,
1280 .test_main_f = test_main_cap_commander_capture_and_render,
1281 },
1282 {
1283 .test_id = "cap_commander_broadcast_reception",
1284 .test_post_init_f = test_init,
1285 .test_tick_f = test_tick,
1286 .test_main_f = test_main_cap_commander_broadcast_reception,
1287 },
1288 {
1289 .test_id = "cap_commander_cancel",
1290 .test_post_init_f = test_init,
1291 .test_tick_f = test_tick,
1292 .test_main_f = test_main_cap_commander_cancel,
1293 },
1294 BSTEST_END_MARKER,
1295 };
1296
test_cap_commander_install(struct bst_test_list * tests)1297 struct bst_test_list *test_cap_commander_install(struct bst_test_list *tests)
1298 {
1299 return bst_add_tests(tests, test_cap_commander);
1300 }
1301
1302 #else /* !CONFIG_BT_CAP_COMMANDER */
1303
test_cap_commander_install(struct bst_test_list * tests)1304 struct bst_test_list *test_cap_commander_install(struct bst_test_list *tests)
1305 {
1306 return tests;
1307 }
1308
1309 #endif /* CONFIG_BT_CAP_COMMANDER */
1310