1 /* btp_bap.c - Bluetooth BAP Tester */
2 
3 /*
4  * Copyright (c) 2023 Codecoup
5  * Copyright (c) 2024 Nordic Semiconductor ASA
6  *
7  * SPDX-License-Identifier: Apache-2.0
8  */
9 
10 #include <stdint.h>
11 #include <stddef.h>
12 #include <errno.h>
13 
14 #include <zephyr/types.h>
15 #include <zephyr/kernel.h>
16 #include <zephyr/sys/ring_buffer.h>
17 #include <zephyr/bluetooth/audio/pacs.h>
18 #include <zephyr/bluetooth/audio/bap_lc3_preset.h>
19 #include <hci_core.h>
20 
21 #include <zephyr/logging/log.h>
22 #include <zephyr/sys/byteorder.h>
23 #define LOG_MODULE_NAME bttester_bap
24 LOG_MODULE_REGISTER(LOG_MODULE_NAME, CONFIG_BTTESTER_LOG_LEVEL);
25 #include "btp/btp.h"
26 #include "btp_bap_audio_stream.h"
27 #include "btp_bap_unicast.h"
28 #include "btp_bap_broadcast.h"
29 
30 #define SUPPORTED_SINK_CONTEXT	BT_AUDIO_CONTEXT_TYPE_ANY
31 #define SUPPORTED_SOURCE_CONTEXT BT_AUDIO_CONTEXT_TYPE_ANY
32 
33 #define AVAILABLE_SINK_CONTEXT SUPPORTED_SINK_CONTEXT
34 #define AVAILABLE_SOURCE_CONTEXT SUPPORTED_SOURCE_CONTEXT
35 
36 static const struct bt_audio_codec_cap default_codec_cap = BT_AUDIO_CODEC_CAP_LC3(
37 	BT_AUDIO_CODEC_CAP_FREQ_ANY, BT_AUDIO_CODEC_CAP_DURATION_7_5 |
38 	BT_AUDIO_CODEC_CAP_DURATION_10, BT_AUDIO_CODEC_CAP_CHAN_COUNT_SUPPORT(1, 2), 26u, 155u, 1u,
39 	BT_AUDIO_CONTEXT_TYPE_ANY);
40 
41 static const struct bt_audio_codec_cap vendor_codec_cap = BT_AUDIO_CODEC_CAP(
42 	0xff, 0xffff, 0xffff, BT_AUDIO_CODEC_CAP_LC3_DATA(BT_AUDIO_CODEC_CAP_FREQ_ANY,
43 	BT_AUDIO_CODEC_CAP_DURATION_7_5 | BT_AUDIO_CODEC_CAP_DURATION_10,
44 	BT_AUDIO_CODEC_CAP_CHAN_COUNT_SUPPORT(1, 2), 26u, 155, 1u),
45 	BT_AUDIO_CODEC_CAP_LC3_META(BT_AUDIO_CONTEXT_TYPE_ANY));
46 
47 static struct bt_pacs_cap cap_sink = {
48 	.codec_cap = &default_codec_cap,
49 };
50 
51 static struct bt_pacs_cap cap_source = {
52 	.codec_cap = &default_codec_cap,
53 };
54 
55 static struct bt_pacs_cap vendor_cap_sink = {
56 	.codec_cap = &vendor_codec_cap,
57 };
58 
59 static struct bt_pacs_cap vendor_cap_source = {
60 	.codec_cap = &vendor_codec_cap,
61 };
62 
btp_ascs_supported_commands(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)63 static uint8_t btp_ascs_supported_commands(const void *cmd, uint16_t cmd_len,
64 				       void *rsp, uint16_t *rsp_len)
65 {
66 	struct btp_ascs_read_supported_commands_rp *rp = rsp;
67 
68 	/* octet 0 */
69 	tester_set_bit(rp->data, BTP_ASCS_READ_SUPPORTED_COMMANDS);
70 
71 	*rsp_len = sizeof(*rp) + 1;
72 
73 	return BTP_STATUS_SUCCESS;
74 }
75 
76 static const struct btp_handler ascs_handlers[] = {
77 	{
78 		.opcode = BTP_ASCS_READ_SUPPORTED_COMMANDS,
79 		.index = BTP_INDEX_NONE,
80 		.expect_len = 0,
81 		.func = btp_ascs_supported_commands,
82 	},
83 	{
84 		.opcode = BTP_ASCS_CONFIGURE_CODEC,
85 		.expect_len = BTP_HANDLER_LENGTH_VARIABLE,
86 		.func = btp_ascs_configure_codec,
87 	},
88 	{
89 		.opcode = BTP_ASCS_CONFIGURE_QOS,
90 		.expect_len = sizeof(struct btp_ascs_configure_qos_cmd),
91 		.func = btp_ascs_configure_qos,
92 	},
93 	{
94 		.opcode = BTP_ASCS_ENABLE,
95 		.expect_len = sizeof(struct btp_ascs_enable_cmd),
96 		.func = btp_ascs_enable,
97 	},
98 	{
99 		.opcode = BTP_ASCS_RECEIVER_START_READY,
100 		.expect_len = sizeof(struct btp_ascs_receiver_start_ready_cmd),
101 		.func = btp_ascs_receiver_start_ready,
102 	},
103 	{
104 		.opcode = BTP_ASCS_RECEIVER_STOP_READY,
105 		.expect_len = sizeof(struct btp_ascs_receiver_stop_ready_cmd),
106 		.func = btp_ascs_receiver_stop_ready,
107 	},
108 	{
109 		.opcode = BTP_ASCS_DISABLE,
110 		.expect_len = sizeof(struct btp_ascs_disable_cmd),
111 		.func = btp_ascs_disable,
112 	},
113 	{
114 		.opcode = BTP_ASCS_RELEASE,
115 		.expect_len = sizeof(struct btp_ascs_release_cmd),
116 		.func = btp_ascs_release,
117 	},
118 	{
119 		.opcode = BTP_ASCS_UPDATE_METADATA,
120 		.expect_len = sizeof(struct btp_ascs_update_metadata_cmd),
121 		.func = btp_ascs_update_metadata,
122 	},
123 	{
124 		.opcode = BTP_ASCS_ADD_ASE_TO_CIS,
125 		.expect_len = sizeof(struct btp_ascs_add_ase_to_cis),
126 		.func = btp_ascs_add_ase_to_cis,
127 	},
128 	{
129 		.opcode = BTP_ASCS_PRECONFIGURE_QOS,
130 		.expect_len = sizeof(struct btp_ascs_preconfigure_qos_cmd),
131 		.func = btp_ascs_preconfigure_qos,
132 	},
133 };
134 
set_location(void)135 static int set_location(void)
136 {
137 	int err;
138 
139 	err = bt_pacs_set_location(BT_AUDIO_DIR_SINK,
140 				   BT_AUDIO_LOCATION_FRONT_CENTER |
141 				   BT_AUDIO_LOCATION_FRONT_RIGHT);
142 	if (err != 0) {
143 		return err;
144 	}
145 
146 	err = bt_pacs_set_location(BT_AUDIO_DIR_SOURCE,
147 				   (BT_AUDIO_LOCATION_FRONT_LEFT |
148 				    BT_AUDIO_LOCATION_FRONT_RIGHT));
149 	if (err != 0) {
150 		return err;
151 	}
152 
153 	return 0;
154 }
155 
set_available_contexts(void)156 static int set_available_contexts(void)
157 {
158 	int err;
159 
160 	err = bt_pacs_set_available_contexts(BT_AUDIO_DIR_SOURCE,
161 					     AVAILABLE_SOURCE_CONTEXT);
162 	if (err != 0) {
163 		return err;
164 	}
165 
166 	err = bt_pacs_set_available_contexts(BT_AUDIO_DIR_SINK,
167 					     AVAILABLE_SINK_CONTEXT);
168 	if (err != 0) {
169 		return err;
170 	}
171 
172 	return 0;
173 }
174 
set_supported_contexts(void)175 static int set_supported_contexts(void)
176 {
177 	int err;
178 
179 	err = bt_pacs_set_supported_contexts(BT_AUDIO_DIR_SOURCE,
180 					     SUPPORTED_SOURCE_CONTEXT);
181 	if (err != 0) {
182 		return err;
183 	}
184 
185 	err = bt_pacs_set_supported_contexts(BT_AUDIO_DIR_SINK,
186 					     SUPPORTED_SINK_CONTEXT);
187 	if (err != 0) {
188 		return err;
189 	}
190 
191 	return 0;
192 }
193 
pacs_supported_commands(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)194 static uint8_t pacs_supported_commands(const void *cmd, uint16_t cmd_len,
195 				       void *rsp, uint16_t *rsp_len)
196 {
197 	struct btp_pacs_read_supported_commands_rp *rp = rsp;
198 
199 	/* octet 0 */
200 	tester_set_bit(rp->data, BTP_PACS_READ_SUPPORTED_COMMANDS);
201 	tester_set_bit(rp->data, BTP_PACS_UPDATE_CHARACTERISTIC);
202 	tester_set_bit(rp->data, BTP_PACS_SET_LOCATION);
203 	tester_set_bit(rp->data, BTP_PACS_SET_AVAILABLE_CONTEXTS);
204 	tester_set_bit(rp->data, BTP_PACS_SET_SUPPORTED_CONTEXTS);
205 
206 	*rsp_len = sizeof(*rp) + 1;
207 
208 	return BTP_STATUS_SUCCESS;
209 }
210 
pacs_update_characteristic(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)211 static uint8_t pacs_update_characteristic(const void *cmd, uint16_t cmd_len,
212 					  void *rsp, uint16_t *rsp_len)
213 {
214 	const struct btp_pacs_update_characteristic_cmd *cp = cmd;
215 	int err;
216 
217 	switch (cp->characteristic) {
218 	case BTP_PACS_CHARACTERISTIC_SINK_PAC:
219 		err = bt_pacs_cap_unregister(BT_AUDIO_DIR_SINK,
220 					     &cap_sink);
221 		break;
222 	case BTP_PACS_CHARACTERISTIC_SOURCE_PAC:
223 		err = bt_pacs_cap_unregister(BT_AUDIO_DIR_SOURCE,
224 					     &cap_source);
225 		break;
226 	case BTP_PACS_CHARACTERISTIC_SINK_AUDIO_LOCATIONS:
227 		err = bt_pacs_set_location(BT_AUDIO_DIR_SINK,
228 					   BT_AUDIO_LOCATION_FRONT_CENTER |
229 					   BT_AUDIO_LOCATION_BACK_CENTER);
230 		break;
231 	case BTP_PACS_CHARACTERISTIC_SOURCE_AUDIO_LOCATIONS:
232 		err = bt_pacs_set_location(BT_AUDIO_DIR_SOURCE,
233 					   (BT_AUDIO_LOCATION_FRONT_LEFT |
234 					    BT_AUDIO_LOCATION_FRONT_RIGHT |
235 					    BT_AUDIO_LOCATION_FRONT_CENTER));
236 		break;
237 	case BTP_PACS_CHARACTERISTIC_AVAILABLE_AUDIO_CONTEXTS:
238 		err = bt_pacs_set_available_contexts(BT_AUDIO_DIR_SOURCE,
239 				BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED);
240 		break;
241 	case BTP_PACS_CHARACTERISTIC_SUPPORTED_AUDIO_CONTEXTS:
242 		err = bt_pacs_set_supported_contexts(BT_AUDIO_DIR_SOURCE,
243 				SUPPORTED_SOURCE_CONTEXT |
244 				BT_AUDIO_CONTEXT_TYPE_INSTRUCTIONAL);
245 		break;
246 	default:
247 		return BTP_STATUS_FAILED;
248 	}
249 
250 	return BTP_STATUS_VAL(err);
251 }
252 
pacs_set_location(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)253 static uint8_t pacs_set_location(const void *cmd, uint16_t cmd_len,
254 				 void *rsp, uint16_t *rsp_len)
255 {
256 	const struct btp_pacs_set_location_cmd *cp = cmd;
257 	int err;
258 
259 	err = bt_pacs_set_location((enum bt_audio_dir)cp->dir,
260 				   (enum bt_audio_location)cp->location);
261 
262 	return (err) ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS;
263 }
264 
pacs_set_available_contexts(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)265 static uint8_t pacs_set_available_contexts(const void *cmd, uint16_t cmd_len,
266 					   void *rsp, uint16_t *rsp_len)
267 {
268 	const struct btp_pacs_set_available_contexts_cmd *cp = cmd;
269 	int err;
270 
271 	err = bt_pacs_set_available_contexts(BT_AUDIO_DIR_SINK,
272 					     (enum bt_audio_context)cp->sink_contexts);
273 	if (err) {
274 		return BTP_STATUS_FAILED;
275 	}
276 	err = bt_pacs_set_available_contexts(BT_AUDIO_DIR_SOURCE,
277 					     (enum bt_audio_context)cp->source_contexts);
278 
279 	return (err) ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS;
280 }
281 
pacs_set_supported_contexts(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)282 static uint8_t pacs_set_supported_contexts(const void *cmd, uint16_t cmd_len,
283 					   void *rsp, uint16_t *rsp_len)
284 {
285 	const struct btp_pacs_set_supported_contexts_cmd *cp = cmd;
286 	int err;
287 
288 	err = bt_pacs_set_supported_contexts(BT_AUDIO_DIR_SINK,
289 					     (enum bt_audio_context)cp->sink_contexts);
290 	if (err) {
291 		return BTP_STATUS_FAILED;
292 	}
293 	err = bt_pacs_set_supported_contexts(BT_AUDIO_DIR_SOURCE,
294 					     (enum bt_audio_context)cp->source_contexts);
295 
296 	return (err) ? BTP_STATUS_FAILED : BTP_STATUS_SUCCESS;
297 }
298 
299 static const struct btp_handler pacs_handlers[] = {
300 	{
301 		.opcode = BTP_PACS_READ_SUPPORTED_COMMANDS,
302 		.index = BTP_INDEX_NONE,
303 		.expect_len = 0,
304 		.func = pacs_supported_commands,
305 	},
306 	{
307 		.opcode = BTP_PACS_UPDATE_CHARACTERISTIC,
308 		.expect_len = sizeof(struct btp_pacs_update_characteristic_cmd),
309 		.func = pacs_update_characteristic,
310 	},
311 	{
312 		.opcode = BTP_PACS_SET_LOCATION,
313 		.expect_len = sizeof(struct btp_pacs_set_location_cmd),
314 		.func = pacs_set_location
315 	},
316 	{
317 		.opcode = BTP_PACS_SET_AVAILABLE_CONTEXTS,
318 		.expect_len = sizeof(struct btp_pacs_set_available_contexts_cmd),
319 		.func = pacs_set_available_contexts
320 	},
321 	{
322 		.opcode = BTP_PACS_SET_SUPPORTED_CONTEXTS,
323 		.expect_len = sizeof(struct btp_pacs_set_supported_contexts_cmd),
324 		.func = pacs_set_supported_contexts
325 	}
326 };
327 
btp_bap_supported_commands(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)328 static uint8_t btp_bap_supported_commands(const void *cmd, uint16_t cmd_len,
329 					  void *rsp, uint16_t *rsp_len)
330 {
331 	struct btp_bap_read_supported_commands_rp *rp = rsp;
332 
333 	/* octet 0 */
334 	tester_set_bit(rp->data, BTP_BAP_READ_SUPPORTED_COMMANDS);
335 	tester_set_bit(rp->data, BTP_BAP_DISCOVER);
336 	tester_set_bit(rp->data, BTP_BAP_SEND);
337 
338 	*rsp_len = sizeof(*rp) + 1;
339 
340 	return BTP_STATUS_SUCCESS;
341 }
342 
btp_bap_audio_stream_send(const void * cmd,uint16_t cmd_len,void * rsp,uint16_t * rsp_len)343 uint8_t btp_bap_audio_stream_send(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len)
344 {
345 	struct btp_bap_send_rp *rp = rsp;
346 	const struct btp_bap_send_cmd *cp = cmd;
347 
348 	/* Always send dummy success for now until the command has be deprecated
349 	 * https://github.com/auto-pts/auto-pts/issues/1317
350 	 */
351 	rp->data_len = cp->data_len;
352 	*rsp_len = sizeof(*rp);
353 
354 	return BTP_STATUS_SUCCESS;
355 }
356 
357 static const struct btp_handler bap_handlers[] = {
358 	{
359 		.opcode = BTP_BAP_READ_SUPPORTED_COMMANDS,
360 		.index = BTP_INDEX_NONE,
361 		.expect_len = 0,
362 		.func = btp_bap_supported_commands,
363 	},
364 	{
365 		.opcode = BTP_BAP_DISCOVER,
366 		.expect_len = sizeof(struct btp_bap_discover_cmd),
367 		.func = btp_bap_discover,
368 	},
369 	{
370 		.opcode = BTP_BAP_SEND,
371 		.expect_len = BTP_HANDLER_LENGTH_VARIABLE,
372 		.func = btp_bap_audio_stream_send,
373 	},
374 #if defined(CONFIG_BT_BAP_BROADCAST_SOURCE) || defined(CONFIG_BT_BAP_BROADCAST_SINK)
375 	{
376 		.opcode = BTP_BAP_BROADCAST_SOURCE_SETUP,
377 		.expect_len = BTP_HANDLER_LENGTH_VARIABLE,
378 		.func = btp_bap_broadcast_source_setup,
379 	},
380 	{
381 		.opcode = BTP_BAP_BROADCAST_SOURCE_SETUP_V2,
382 		.expect_len = BTP_HANDLER_LENGTH_VARIABLE,
383 		.func = btp_bap_broadcast_source_setup_v2,
384 	},
385 	{
386 		.opcode = BTP_BAP_BROADCAST_SOURCE_RELEASE,
387 		.expect_len = sizeof(struct btp_bap_broadcast_source_release_cmd),
388 		.func = btp_bap_broadcast_source_release,
389 	},
390 	{
391 		.opcode = BTP_BAP_BROADCAST_ADV_START,
392 		.expect_len = sizeof(struct btp_bap_broadcast_adv_start_cmd),
393 		.func = btp_bap_broadcast_adv_start,
394 	},
395 	{
396 		.opcode = BTP_BAP_BROADCAST_ADV_STOP,
397 		.expect_len = sizeof(struct btp_bap_broadcast_adv_stop_cmd),
398 		.func = btp_bap_broadcast_adv_stop,
399 	},
400 	{
401 		.opcode = BTP_BAP_BROADCAST_SOURCE_START,
402 		.expect_len = sizeof(struct btp_bap_broadcast_source_start_cmd),
403 		.func = btp_bap_broadcast_source_start,
404 	},
405 	{
406 		.opcode = BTP_BAP_BROADCAST_SOURCE_STOP,
407 		.expect_len = sizeof(struct btp_bap_broadcast_source_stop_cmd),
408 		.func = btp_bap_broadcast_source_stop,
409 	},
410 	{
411 		.opcode = BTP_BAP_BROADCAST_SINK_SETUP,
412 		.expect_len = BTP_HANDLER_LENGTH_VARIABLE,
413 		.func = btp_bap_broadcast_sink_setup,
414 	},
415 	{
416 		.opcode = BTP_BAP_BROADCAST_SINK_RELEASE,
417 		.expect_len = sizeof(struct btp_bap_broadcast_sink_release_cmd),
418 		.func = btp_bap_broadcast_sink_release,
419 	},
420 	{
421 		.opcode = BTP_BAP_BROADCAST_SCAN_START,
422 		.expect_len = sizeof(struct btp_bap_broadcast_scan_start_cmd),
423 		.func = btp_bap_broadcast_scan_start,
424 	},
425 	{
426 		.opcode = BTP_BAP_BROADCAST_SCAN_STOP,
427 		.expect_len = sizeof(struct btp_bap_broadcast_scan_stop_cmd),
428 		.func = btp_bap_broadcast_scan_stop,
429 	},
430 	{
431 		.opcode = BTP_BAP_BROADCAST_SINK_SYNC,
432 		.expect_len = sizeof(struct btp_bap_broadcast_sink_sync_cmd),
433 		.func = btp_bap_broadcast_sink_sync,
434 	},
435 	{
436 		.opcode = BTP_BAP_BROADCAST_SINK_STOP,
437 		.expect_len = sizeof(struct btp_bap_broadcast_sink_stop_cmd),
438 		.func = btp_bap_broadcast_sink_stop,
439 	},
440 	{
441 		.opcode = BTP_BAP_BROADCAST_SINK_BIS_SYNC,
442 		.expect_len = sizeof(struct btp_bap_broadcast_sink_bis_sync_cmd),
443 		.func = btp_bap_broadcast_sink_bis_sync,
444 	},
445 	{
446 		.opcode = BTP_BAP_DISCOVER_SCAN_DELEGATORS,
447 		.expect_len = sizeof(struct btp_bap_discover_scan_delegators_cmd),
448 		.func = btp_bap_broadcast_discover_scan_delegators,
449 	},
450 	{
451 		.opcode = BTP_BAP_BROADCAST_ASSISTANT_SCAN_START,
452 		.expect_len = sizeof(struct btp_bap_broadcast_assistant_scan_start_cmd),
453 		.func = btp_bap_broadcast_assistant_scan_start,
454 	},
455 	{
456 		.opcode = BTP_BAP_BROADCAST_ASSISTANT_SCAN_STOP,
457 		.expect_len = sizeof(struct btp_bap_broadcast_assistant_scan_stop_cmd),
458 		.func = btp_bap_broadcast_assistant_scan_stop,
459 	},
460 	{
461 		.opcode = BTP_BAP_ADD_BROADCAST_SRC,
462 		.expect_len = BTP_HANDLER_LENGTH_VARIABLE,
463 		.func = btp_bap_broadcast_assistant_add_src,
464 	},
465 	{
466 		.opcode = BTP_BAP_REMOVE_BROADCAST_SRC,
467 		.expect_len = sizeof(struct btp_bap_remove_broadcast_src_cmd),
468 		.func = btp_bap_broadcast_assistant_remove_src,
469 	},
470 	{
471 		.opcode = BTP_BAP_MODIFY_BROADCAST_SRC,
472 		.expect_len = BTP_HANDLER_LENGTH_VARIABLE,
473 		.func = btp_bap_broadcast_assistant_modify_src,
474 	},
475 	{
476 		.opcode = BTP_BAP_SET_BROADCAST_CODE,
477 		.expect_len = sizeof(struct btp_bap_set_broadcast_code_cmd),
478 		.func = btp_bap_broadcast_assistant_set_broadcast_code,
479 	},
480 	{
481 		.opcode = BTP_BAP_SEND_PAST,
482 		.expect_len = sizeof(struct btp_bap_send_past_cmd),
483 		.func = btp_bap_broadcast_assistant_send_past,
484 	},
485 #endif /* CONFIG_BT_BAP_BROADCAST_SOURCE || CONFIG_BT_BAP_BROADCAST_SINK */
486 };
487 
tester_init_pacs(void)488 uint8_t tester_init_pacs(void)
489 {
490 	const struct bt_pacs_register_param pacs_param = {
491 #if defined(CONFIG_BT_PAC_SNK)
492 		.snk_pac = true,
493 #endif /* CONFIG_BT_PAC_SNK */
494 #if defined(CONFIG_BT_PAC_SNK_LOC)
495 		.snk_loc = true,
496 #endif /* CONFIG_BT_PAC_SNK_LOC */
497 #if defined(CONFIG_BT_PAC_SRC)
498 		.src_pac = true,
499 #endif /* CONFIG_BT_PAC_SRC */
500 #if defined(CONFIG_BT_PAC_SRC_LOC)
501 		.src_loc = true,
502 #endif /* CONFIG_BT_PAC_SRC_LOC */
503 	};
504 	int err;
505 
506 	/* PACS shall be registered before ASCS in btp_bap_unicast_init */
507 	err = bt_pacs_register(&pacs_param);
508 	if (err != 0) {
509 		LOG_DBG("Failed to register client callbacks: %d", err);
510 		return BTP_STATUS_FAILED;
511 	}
512 
513 	btp_bap_unicast_init();
514 
515 	bt_pacs_cap_register(BT_AUDIO_DIR_SINK, &cap_sink);
516 	bt_pacs_cap_register(BT_AUDIO_DIR_SOURCE, &cap_source);
517 	bt_pacs_cap_register(BT_AUDIO_DIR_SINK, &vendor_cap_sink);
518 	bt_pacs_cap_register(BT_AUDIO_DIR_SOURCE, &vendor_cap_source);
519 
520 	err = set_location();
521 	if (err != 0) {
522 		return BTP_STATUS_FAILED;
523 	}
524 
525 	err = set_supported_contexts();
526 	if (err != 0) {
527 		return BTP_STATUS_FAILED;
528 	}
529 
530 	err = set_available_contexts();
531 	if (err != 0) {
532 		return BTP_STATUS_FAILED;
533 	}
534 
535 	tester_register_command_handlers(BTP_SERVICE_ID_PACS, pacs_handlers,
536 					 ARRAY_SIZE(pacs_handlers));
537 
538 	return BTP_STATUS_SUCCESS;
539 }
540 
tester_unregister_pacs(void)541 uint8_t tester_unregister_pacs(void)
542 {
543 	return BTP_STATUS_SUCCESS;
544 }
545 
tester_init_ascs(void)546 uint8_t tester_init_ascs(void)
547 {
548 	int err;
549 
550 	err = btp_bap_unicast_init();
551 	if (err != 0) {
552 		return BTP_STATUS_FAILED;
553 	}
554 
555 	tester_register_command_handlers(BTP_SERVICE_ID_ASCS, ascs_handlers,
556 					 ARRAY_SIZE(ascs_handlers));
557 
558 	return BTP_STATUS_SUCCESS;
559 }
560 
tester_unregister_ascs(void)561 uint8_t tester_unregister_ascs(void)
562 {
563 	return BTP_STATUS_SUCCESS;
564 }
565 
tester_init_bap(void)566 uint8_t tester_init_bap(void)
567 {
568 	int err;
569 
570 	err = btp_bap_unicast_init();
571 	if (err != 0) {
572 		return BTP_STATUS_FAILED;
573 	}
574 
575 	err = btp_bap_broadcast_init();
576 	if (err != 0) {
577 		return BTP_STATUS_FAILED;
578 	}
579 
580 	btp_bap_audio_stream_tx_init();
581 
582 	tester_register_command_handlers(BTP_SERVICE_ID_BAP, bap_handlers,
583 					 ARRAY_SIZE(bap_handlers));
584 
585 	return BTP_STATUS_SUCCESS;
586 }
587 
tester_unregister_bap(void)588 uint8_t tester_unregister_bap(void)
589 {
590 	return BTP_STATUS_SUCCESS;
591 }
592