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