1 /* btp_bap_broadcast.h - Bluetooth BAP Tester */
2 
3 /*
4  * Copyright (c) 2023 Codecoup
5  *
6  * SPDX-License-Identifier: Apache-2.0
7  */
8 
9 #include <stdbool.h>
10 #include <stdint.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/cap.h>
17 #include <zephyr/bluetooth/bluetooth.h>
18 #include <zephyr/bluetooth/iso.h>
19 
20 #include "btp_bap_audio_stream.h"
21 
22 struct btp_bap_broadcast_stream {
23 	struct btp_bap_audio_stream audio_stream;
24 	struct bt_audio_codec_cfg codec_cfg;
25 	uint8_t bis_id;
26 	uint8_t subgroup_id;
27 	bool bis_synced;
28 	uint8_t source_id;
29 	bool in_use;
30 	bool already_sent;
31 };
32 
33 /* According to BT spec, a Broadcast Source can configure and establish one or more BIGs,
34  * each containing one or more BISes that are used to transport broadcast Audio Streams.
35  * For each BIG, the Broadcast Source shall generate a Broadcast_ID.
36  * For the time being, let's treat broadcast source as one BIG.
37  */
38 struct btp_bap_broadcast_remote_source {
39 	bt_addr_le_t address;
40 	uint32_t broadcast_id;
41 	struct btp_bap_broadcast_stream streams[CONFIG_BT_BAP_BROADCAST_SNK_STREAM_COUNT];
42 	struct bt_bap_stream *sink_streams[CONFIG_BT_BAP_BROADCAST_SNK_STREAM_COUNT];
43 	struct bt_bap_broadcast_sink *sink;
44 	struct bt_bap_qos_cfg qos;
45 	/* BIS Index bitfield read from Base */
46 	uint32_t bis_index_bitfield;
47 	/* BIS Index bitfield read from sync request */
48 	uint32_t requested_bis_sync;
49 	bool assistant_request;
50 	bool biginfo_received;
51 	bool broadcast_code_received;
52 	uint8_t sink_broadcast_code[BT_ISO_BROADCAST_CODE_SIZE];
53 	const struct bt_bap_scan_delegator_recv_state *sink_recv_state;
54 };
55 
56 struct btp_bap_broadcast_local_source {
57 	bool allocated;
58 	uint8_t source_id;
59 	struct bt_le_ext_adv *ext_adv;
60 	uint32_t broadcast_id;
61 	struct bt_bap_qos_cfg qos;
62 	struct btp_bap_broadcast_stream streams[CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT];
63 	struct bt_audio_codec_cfg subgroup_codec_cfg[CONFIG_BT_BAP_BROADCAST_SRC_SUBGROUP_COUNT];
64 	uint8_t stream_count;
65 	struct bt_data per_adv_local;
66 	/* Only for BTP BAP commands */
67 	struct bt_bap_broadcast_source *bap_broadcast;
68 	/* Only for BTP CAP commands */
69 	struct bt_cap_broadcast_source *cap_broadcast;
70 };
71 
72 int btp_bap_broadcast_init(void);
73 struct btp_bap_broadcast_local_source *btp_bap_broadcast_local_source_from_src_id_get(
74 	uint32_t source_id);
75 uint8_t btp_bap_broadcast_local_source_idx_get(struct btp_bap_broadcast_local_source *source);
76 struct btp_bap_broadcast_stream *btp_bap_broadcast_stream_alloc(
77 	struct btp_bap_broadcast_local_source *source);
78 
79 uint8_t btp_bap_broadcast_source_setup(const void *cmd, uint16_t cmd_len,
80 				       void *rsp, uint16_t *rsp_len);
81 uint8_t btp_bap_broadcast_source_setup_v2(const void *cmd, uint16_t cmd_len,
82 					  void *rsp, uint16_t *rsp_len);
83 uint8_t btp_bap_broadcast_source_release(const void *cmd, uint16_t cmd_len,
84 					 void *rsp, uint16_t *rsp_len);
85 uint8_t btp_bap_broadcast_adv_start(const void *cmd, uint16_t cmd_len,
86 				    void *rsp, uint16_t *rsp_len);
87 uint8_t btp_bap_broadcast_adv_stop(const void *cmd, uint16_t cmd_len,
88 				   void *rsp, uint16_t *rsp_len);
89 uint8_t btp_bap_broadcast_source_start(const void *cmd, uint16_t cmd_len,
90 				       void *rsp, uint16_t *rsp_len);
91 uint8_t btp_bap_broadcast_source_stop(const void *cmd, uint16_t cmd_len,
92 				      void *rsp, uint16_t *rsp_len);
93 uint8_t btp_bap_broadcast_sink_setup(const void *cmd, uint16_t cmd_len,
94 				     void *rsp, uint16_t *rsp_len);
95 uint8_t btp_bap_broadcast_sink_release(const void *cmd, uint16_t cmd_len,
96 				       void *rsp, uint16_t *rsp_len);
97 uint8_t btp_bap_broadcast_scan_start(const void *cmd, uint16_t cmd_len,
98 				     void *rsp, uint16_t *rsp_len);
99 uint8_t btp_bap_broadcast_scan_stop(const void *cmd, uint16_t cmd_len,
100 				    void *rsp, uint16_t *rsp_len);
101 uint8_t btp_bap_broadcast_sink_sync(const void *cmd, uint16_t cmd_len,
102 				    void *rsp, uint16_t *rsp_len);
103 uint8_t btp_bap_broadcast_sink_stop(const void *cmd, uint16_t cmd_len,
104 				    void *rsp, uint16_t *rsp_len);
105 uint8_t btp_bap_broadcast_sink_bis_sync(const void *cmd, uint16_t cmd_len,
106 					void *rsp, uint16_t *rsp_len);
107 uint8_t btp_bap_broadcast_discover_scan_delegators(const void *cmd, uint16_t cmd_len,
108 						   void *rsp, uint16_t *rsp_len);
109 uint8_t btp_bap_broadcast_assistant_scan_start(const void *cmd, uint16_t cmd_len,
110 					       void *rsp, uint16_t *rsp_len);
111 uint8_t btp_bap_broadcast_assistant_scan_stop(const void *cmd, uint16_t cmd_len,
112 					      void *rsp, uint16_t *rsp_len);
113 uint8_t btp_bap_broadcast_assistant_add_src(const void *cmd, uint16_t cmd_len,
114 					    void *rsp, uint16_t *rsp_len);
115 uint8_t btp_bap_broadcast_assistant_remove_src(const void *cmd, uint16_t cmd_len,
116 					       void *rsp, uint16_t *rsp_len);
117 uint8_t btp_bap_broadcast_assistant_modify_src(const void *cmd, uint16_t cmd_len,
118 					       void *rsp, uint16_t *rsp_len);
119 uint8_t btp_bap_broadcast_assistant_set_broadcast_code(const void *cmd, uint16_t cmd_len,
120 						       void *rsp, uint16_t *rsp_len);
121 uint8_t btp_bap_broadcast_assistant_send_past(const void *cmd, uint16_t cmd_len,
122 					      void *rsp, uint16_t *rsp_len);
123