xref: /btstack/src/le-audio/broadcast_audio_uri_builder.h (revision 65dc48921a04a7ded3587f532b5904de428d2e21)
1*65dc4892SMatthias Ringwald /*
2*65dc4892SMatthias Ringwald  * Copyright (C) 2024 BlueKitchen GmbH
3*65dc4892SMatthias Ringwald  *
4*65dc4892SMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
5*65dc4892SMatthias Ringwald  * modification, are permitted provided that the following conditions
6*65dc4892SMatthias Ringwald  * are met:
7*65dc4892SMatthias Ringwald  *
8*65dc4892SMatthias Ringwald  * 1. Redistributions of source code must retain the above copyright
9*65dc4892SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
10*65dc4892SMatthias Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
11*65dc4892SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
12*65dc4892SMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
13*65dc4892SMatthias Ringwald  * 3. Neither the name of the copyright holders nor the names of
14*65dc4892SMatthias Ringwald  *    contributors may be used to endorse or promote products derived
15*65dc4892SMatthias Ringwald  *    from this software without specific prior written permission.
16*65dc4892SMatthias Ringwald  * 4. Any redistribution, use, or modification is done solely for
17*65dc4892SMatthias Ringwald  *    personal benefit and not for any commercial purpose or for
18*65dc4892SMatthias Ringwald  *    monetary gain.
19*65dc4892SMatthias Ringwald  *
20*65dc4892SMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21*65dc4892SMatthias Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*65dc4892SMatthias Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23*65dc4892SMatthias Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
24*65dc4892SMatthias Ringwald  * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25*65dc4892SMatthias Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26*65dc4892SMatthias Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27*65dc4892SMatthias Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28*65dc4892SMatthias Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29*65dc4892SMatthias Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30*65dc4892SMatthias Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31*65dc4892SMatthias Ringwald  * SUCH DAMAGE.
32*65dc4892SMatthias Ringwald  *
33*65dc4892SMatthias Ringwald  * Please inquire about commercial licensing options at
34*65dc4892SMatthias Ringwald  * [email protected]
35*65dc4892SMatthias Ringwald  *
36*65dc4892SMatthias Ringwald  */
37*65dc4892SMatthias Ringwald 
38*65dc4892SMatthias Ringwald /**
39*65dc4892SMatthias Ringwald  *  @brief TODO
40*65dc4892SMatthias Ringwald  */
41*65dc4892SMatthias Ringwald 
42*65dc4892SMatthias Ringwald #ifndef BROADCAST_AUDIO_URI_BUILDER_H
43*65dc4892SMatthias Ringwald #define BROADCAST_AUDIO_URI_BUILDER_H
44*65dc4892SMatthias Ringwald 
45*65dc4892SMatthias Ringwald #include <stdint.h>
46*65dc4892SMatthias Ringwald #include "btstack_bool.h"
47*65dc4892SMatthias Ringwald #include "bluetooth.h"
48*65dc4892SMatthias Ringwald 
49*65dc4892SMatthias Ringwald #if defined __cplusplus
50*65dc4892SMatthias Ringwald extern "C" {
51*65dc4892SMatthias Ringwald #endif
52*65dc4892SMatthias Ringwald 
53*65dc4892SMatthias Ringwald typedef struct {
54*65dc4892SMatthias Ringwald     uint8_t * buffer;
55*65dc4892SMatthias Ringwald     uint16_t  size;
56*65dc4892SMatthias Ringwald     uint16_t len;
57*65dc4892SMatthias Ringwald } broadcast_audio_uri_builder_t;
58*65dc4892SMatthias Ringwald 
59*65dc4892SMatthias Ringwald /**
60*65dc4892SMatthias Ringwald  * Initialize Broadcast Audio URI builder
61*65dc4892SMatthias Ringwald  * @param builder
62*65dc4892SMatthias Ringwald  * @param buffer to setup BASE
63*65dc4892SMatthias Ringwald  * @param size of buffer
64*65dc4892SMatthias Ringwald  */
65*65dc4892SMatthias Ringwald void broadcast_audio_uri_builder_init(broadcast_audio_uri_builder_t * builder, uint8_t * buffer, uint16_t size);
66*65dc4892SMatthias Ringwald 
67*65dc4892SMatthias Ringwald /**
68*65dc4892SMatthias Ringwald  * @brief Query remaining space in buffer
69*65dc4892SMatthias Ringwald  * @param builder
70*65dc4892SMatthias Ringwald  * @return size
71*65dc4892SMatthias Ringwald  */
72*65dc4892SMatthias Ringwald uint16_t broadcast_audio_uri_builder_get_remaining_space(const broadcast_audio_uri_builder_t * builder);
73*65dc4892SMatthias Ringwald 
74*65dc4892SMatthias Ringwald /**
75*65dc4892SMatthias Ringwald  * Get Size of Broadcast Audio URI
76*65dc4892SMatthias Ringwald  * @param builder
77*65dc4892SMatthias Ringwald  * @return size
78*65dc4892SMatthias Ringwald  */
79*65dc4892SMatthias Ringwald uint16_t broadcast_audio_uri_builder_get_size(const broadcast_audio_uri_builder_t * builder);
80*65dc4892SMatthias Ringwald 
81*65dc4892SMatthias Ringwald /**
82*65dc4892SMatthias Ringwald  * Append bytes
83*65dc4892SMatthias Ringwald  * @param builder
84*65dc4892SMatthias Ringwald  * @param data
85*65dc4892SMatthias Ringwald  * @param len
86*65dc4892SMatthias Ringwald  * @return true if there was sufficient space in the underlying buffer
87*65dc4892SMatthias Ringwald  */
88*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_bytes(broadcast_audio_uri_builder_t * builder, const uint8_t * data, uint16_t len);
89*65dc4892SMatthias Ringwald 
90*65dc4892SMatthias Ringwald /**
91*65dc4892SMatthias Ringwald  * Append String
92*65dc4892SMatthias Ringwald  * @param builder
93*65dc4892SMatthias Ringwald  * @param text as utf-8
94*65dc4892SMatthias Ringwald  * @return true if there was sufficient space in the underlying buffer
95*65dc4892SMatthias Ringwald  */
96*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_string(broadcast_audio_uri_builder_t * builder, const char * text);
97*65dc4892SMatthias Ringwald 
98*65dc4892SMatthias Ringwald /**
99*65dc4892SMatthias Ringwald  * Append Broadcast Name (BN) base64 encoded
100*65dc4892SMatthias Ringwald  * @param builder
101*65dc4892SMatthias Ringwald  * @param broadcast_name
102*65dc4892SMatthias Ringwald  * @return
103*65dc4892SMatthias Ringwald  */
104*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_broadcast_name(broadcast_audio_uri_builder_t * builder, const char * broadcast_name);
105*65dc4892SMatthias Ringwald 
106*65dc4892SMatthias Ringwald /**
107*65dc4892SMatthias Ringwald  * Append Advertiser Address Type
108*65dc4892SMatthias Ringwald  * @param builder
109*65dc4892SMatthias Ringwald  * @param advertiser_address_type
110*65dc4892SMatthias Ringwald  * @return
111*65dc4892SMatthias Ringwald  */
112*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_advertiser_address_type(broadcast_audio_uri_builder_t * builder, bd_addr_type_t advertiser_address_type);
113*65dc4892SMatthias Ringwald 
114*65dc4892SMatthias Ringwald /**
115*65dc4892SMatthias Ringwald  * Append Advertiser Address
116*65dc4892SMatthias Ringwald  * @param builder
117*65dc4892SMatthias Ringwald  * @param advertiser_address_type
118*65dc4892SMatthias Ringwald  * @return
119*65dc4892SMatthias Ringwald  */
120*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_advertiser_address(broadcast_audio_uri_builder_t * builder, bd_addr_t advertiser_address);
121*65dc4892SMatthias Ringwald 
122*65dc4892SMatthias Ringwald /**
123*65dc4892SMatthias Ringwald  * Append Broadcast ID
124*65dc4892SMatthias Ringwald  * @param builder
125*65dc4892SMatthias Ringwald  * @param Broadcast ID (24 bit)
126*65dc4892SMatthias Ringwald  * @return
127*65dc4892SMatthias Ringwald  */
128*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_broadcast_id(broadcast_audio_uri_builder_t * builder, uint32_t broadcast_id);
129*65dc4892SMatthias Ringwald 
130*65dc4892SMatthias Ringwald /**
131*65dc4892SMatthias Ringwald  * Append Broadcast ID
132*65dc4892SMatthias Ringwald  * @param builder
133*65dc4892SMatthias Ringwald  * @param Broadcast Code (128 bit)
134*65dc4892SMatthias Ringwald  * @return
135*65dc4892SMatthias Ringwald  */
136*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_broadcast_code(broadcast_audio_uri_builder_t * builder, const uint8_t * broadcast_code);
137*65dc4892SMatthias Ringwald 
138*65dc4892SMatthias Ringwald /**
139*65dc4892SMatthias Ringwald  * Append Standard Quality
140*65dc4892SMatthias Ringwald  * @param builder
141*65dc4892SMatthias Ringwald  * @param advertiser_address_type
142*65dc4892SMatthias Ringwald  * @return
143*65dc4892SMatthias Ringwald  */
144*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_standard_quality(broadcast_audio_uri_builder_t * builder, bool standard_quality);
145*65dc4892SMatthias Ringwald 
146*65dc4892SMatthias Ringwald /**
147*65dc4892SMatthias Ringwald  * Append High Quality
148*65dc4892SMatthias Ringwald  * @param builder
149*65dc4892SMatthias Ringwald  * @param advertiser_address_type
150*65dc4892SMatthias Ringwald  * @return
151*65dc4892SMatthias Ringwald  */
152*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_high_quality(broadcast_audio_uri_builder_t * builder, bool high_quality);
153*65dc4892SMatthias Ringwald 
154*65dc4892SMatthias Ringwald /**
155*65dc4892SMatthias Ringwald  * Append Vendor Specific data
156*65dc4892SMatthias Ringwald  * @param builder
157*65dc4892SMatthias Ringwald  * @param vendor_id
158*65dc4892SMatthias Ringwald  * @param data
159*65dc4892SMatthias Ringwald  * @param data_len
160*65dc4892SMatthias Ringwald  * @return
161*65dc4892SMatthias Ringwald  */
162*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_vendor_specific(broadcast_audio_uri_builder_t * builder, uint16_t vendor_id, const uint8_t * data, uint16_t data_len);
163*65dc4892SMatthias Ringwald 
164*65dc4892SMatthias Ringwald /**
165*65dc4892SMatthias Ringwald  * Append Advertising SID
166*65dc4892SMatthias Ringwald  * @param builder
167*65dc4892SMatthias Ringwald  * @param advertising_sid
168*65dc4892SMatthias Ringwald  * @return
169*65dc4892SMatthias Ringwald  */
170*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_advertising_sid(broadcast_audio_uri_builder_t * builder, uint8_t advertising_sid);
171*65dc4892SMatthias Ringwald 
172*65dc4892SMatthias Ringwald /**
173*65dc4892SMatthias Ringwald  * Append PA Interval
174*65dc4892SMatthias Ringwald  * @param builder
175*65dc4892SMatthias Ringwald  * @param pa_interval
176*65dc4892SMatthias Ringwald  * @return
177*65dc4892SMatthias Ringwald  */
178*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_pa_interval(broadcast_audio_uri_builder_t * builder, uint16_t pa_interval);
179*65dc4892SMatthias Ringwald 
180*65dc4892SMatthias Ringwald /**
181*65dc4892SMatthias Ringwald  * Append Num Subgroups
182*65dc4892SMatthias Ringwald  * @param builder
183*65dc4892SMatthias Ringwald  * @param num_subgroups
184*65dc4892SMatthias Ringwald  * @return
185*65dc4892SMatthias Ringwald  */
186*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_num_subgroups(broadcast_audio_uri_builder_t * builder, uint8_t num_subgroups);
187*65dc4892SMatthias Ringwald 
188*65dc4892SMatthias Ringwald /**
189*65dc4892SMatthias Ringwald  * Append BIS_Sync
190*65dc4892SMatthias Ringwald  * @param builder
191*65dc4892SMatthias Ringwald  * @param Broadcast ID (24 bit)
192*65dc4892SMatthias Ringwald  * @return
193*65dc4892SMatthias Ringwald  */
194*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_bis_sync(broadcast_audio_uri_builder_t * builder, uint32_t bis_sync);
195*65dc4892SMatthias Ringwald 
196*65dc4892SMatthias Ringwald /**
197*65dc4892SMatthias Ringwald  * Append SG Number of BISes
198*65dc4892SMatthias Ringwald  * @param builder
199*65dc4892SMatthias Ringwald  * @param sg_number_of_bises
200*65dc4892SMatthias Ringwald  * @return
201*65dc4892SMatthias Ringwald  */
202*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_sg_number_of_bises(broadcast_audio_uri_builder_t * builder, uint32_t sg_number_of_bises);
203*65dc4892SMatthias Ringwald 
204*65dc4892SMatthias Ringwald /**
205*65dc4892SMatthias Ringwald  * Append SG_Metadata
206*65dc4892SMatthias Ringwald  * @param builder
207*65dc4892SMatthias Ringwald  * @param metadata
208*65dc4892SMatthias Ringwald  * @param metadata_len
209*65dc4892SMatthias Ringwald  * @return
210*65dc4892SMatthias Ringwald  */
211*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_sg_metadata(broadcast_audio_uri_builder_t * builder, const uint8_t * metadata, uint16_t metadata_len);
212*65dc4892SMatthias Ringwald 
213*65dc4892SMatthias Ringwald /**
214*65dc4892SMatthias Ringwald  * Append Public Broadcast Announcement Metadata
215*65dc4892SMatthias Ringwald  * @param builder
216*65dc4892SMatthias Ringwald  * @param metadata
217*65dc4892SMatthias Ringwald  * @param metadata_len
218*65dc4892SMatthias Ringwald  * @return
219*65dc4892SMatthias Ringwald  */
220*65dc4892SMatthias Ringwald bool broadcast_audio_uri_builder_append_public_broadcast_announcement_metadata(broadcast_audio_uri_builder_t * builder, const uint8_t * metadata, uint16_t metadata_len);
221*65dc4892SMatthias Ringwald 
222*65dc4892SMatthias Ringwald #if defined __cplusplus
223*65dc4892SMatthias Ringwald }
224*65dc4892SMatthias Ringwald #endif
225*65dc4892SMatthias Ringwald #endif // BROADCAST_AUDIO_URI_BUILDER_H
226