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(&param);
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(&param);
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(&param);
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(&param);
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(&param);
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