xref: /btstack/src/le-audio/gatt-service/broadcast_audio_scan_service_server.h (revision ae3042838ecab39355f8220511b931dbf8f87c8e)
15deb0bb6SMatthias Ringwald /*
25deb0bb6SMatthias Ringwald  * Copyright (C) 2022 BlueKitchen GmbH
35deb0bb6SMatthias Ringwald  *
45deb0bb6SMatthias Ringwald  * Redistribution and use in source and binary forms, with or without
55deb0bb6SMatthias Ringwald  * modification, are permitted provided that the following conditions
65deb0bb6SMatthias Ringwald  * are met:
75deb0bb6SMatthias Ringwald  *
85deb0bb6SMatthias Ringwald  * 1. Redistributions of source code must retain the above copyright
95deb0bb6SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer.
105deb0bb6SMatthias Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
115deb0bb6SMatthias Ringwald  *    notice, this list of conditions and the following disclaimer in the
125deb0bb6SMatthias Ringwald  *    documentation and/or other materials provided with the distribution.
135deb0bb6SMatthias Ringwald  * 3. Neither the name of the copyright holders nor the names of
145deb0bb6SMatthias Ringwald  *    contributors may be used to endorse or promote products derived
155deb0bb6SMatthias Ringwald  *    from this software without specific prior written permission.
165deb0bb6SMatthias Ringwald  * 4. Any redistribution, use, or modification is done solely for
175deb0bb6SMatthias Ringwald  *    personal benefit and not for any commercial purpose or for
185deb0bb6SMatthias Ringwald  *    monetary gain.
195deb0bb6SMatthias Ringwald  *
205deb0bb6SMatthias Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
215deb0bb6SMatthias Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
225deb0bb6SMatthias Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
235deb0bb6SMatthias Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
245deb0bb6SMatthias Ringwald  * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
255deb0bb6SMatthias Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
265deb0bb6SMatthias Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
275deb0bb6SMatthias Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
285deb0bb6SMatthias Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
295deb0bb6SMatthias Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
305deb0bb6SMatthias Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
315deb0bb6SMatthias Ringwald  * SUCH DAMAGE.
325deb0bb6SMatthias Ringwald  *
335deb0bb6SMatthias Ringwald  * Please inquire about commercial licensing options at
345deb0bb6SMatthias Ringwald  * [email protected]
355deb0bb6SMatthias Ringwald  *
365deb0bb6SMatthias Ringwald  */
375deb0bb6SMatthias Ringwald 
385deb0bb6SMatthias Ringwald /**
395deb0bb6SMatthias Ringwald  * @title Broadcast Audio Scan Service Server (BASS)
405deb0bb6SMatthias Ringwald  *
415deb0bb6SMatthias Ringwald  * @text The Broadcast Audio Scan Service is used by servers to expose their status with respect
425deb0bb6SMatthias Ringwald  * to synchronization to broadcast Audio Streams and associated data, including Broadcast_Codes
435deb0bb6SMatthias Ringwald  * used to decrypt encrypted broadcast Audio Streams. Clients can use the attributes exposed by
445deb0bb6SMatthias Ringwald  * servers to observe and/or request changes in server behavior.
455deb0bb6SMatthias Ringwald  *
465deb0bb6SMatthias Ringwald  * To use with your application, add `#import <broadcast_audio_scan_service.gatt>` to your .gatt file.
475deb0bb6SMatthias Ringwald  */
485deb0bb6SMatthias Ringwald 
495deb0bb6SMatthias Ringwald #ifndef BROADCAST_AUDIO_SCAN_SERVICE_SERVER_H
505deb0bb6SMatthias Ringwald #define BROADCAST_AUDIO_SCAN_SERVICE_SERVER_H
515deb0bb6SMatthias Ringwald 
525deb0bb6SMatthias Ringwald #include <stdint.h>
535deb0bb6SMatthias Ringwald 
545deb0bb6SMatthias Ringwald #include "btstack_defines.h"
555deb0bb6SMatthias Ringwald #include "le-audio/le_audio.h"
565deb0bb6SMatthias Ringwald 
575deb0bb6SMatthias Ringwald #include "broadcast_audio_scan_service_util.h"
585deb0bb6SMatthias Ringwald 
595deb0bb6SMatthias Ringwald #if defined __cplusplus
605deb0bb6SMatthias Ringwald extern "C" {
615deb0bb6SMatthias Ringwald #endif
625deb0bb6SMatthias Ringwald 
635deb0bb6SMatthias Ringwald /* API_START */
645deb0bb6SMatthias Ringwald // memory for list of these structs is allocated by the application
655deb0bb6SMatthias Ringwald typedef struct {
665deb0bb6SMatthias Ringwald     // assigned by client via control point
675deb0bb6SMatthias Ringwald     bass_source_data_t data;
685deb0bb6SMatthias Ringwald 
695deb0bb6SMatthias Ringwald     uint8_t  update_counter;
705deb0bb6SMatthias Ringwald     uint8_t  source_id;
715deb0bb6SMatthias Ringwald     bool     in_use;
725deb0bb6SMatthias Ringwald 
735deb0bb6SMatthias Ringwald     le_audio_big_encryption_t big_encryption;
745deb0bb6SMatthias Ringwald     uint8_t  bad_code[16];
755deb0bb6SMatthias Ringwald 
765deb0bb6SMatthias Ringwald     uint16_t bass_receive_state_handle;
775deb0bb6SMatthias Ringwald     uint16_t bass_receive_state_client_configuration_handle;
785deb0bb6SMatthias Ringwald     uint16_t bass_receive_state_client_configuration;
795deb0bb6SMatthias Ringwald } bass_server_source_t;
805deb0bb6SMatthias Ringwald 
815deb0bb6SMatthias Ringwald typedef struct {
825deb0bb6SMatthias Ringwald     hci_con_handle_t con_handle;
835deb0bb6SMatthias Ringwald     uint16_t sources_to_notify;
845deb0bb6SMatthias Ringwald 
855deb0bb6SMatthias Ringwald     // used for caching long write
865deb0bb6SMatthias Ringwald     uint8_t  long_write_buffer[512];
875deb0bb6SMatthias Ringwald     uint16_t long_write_value_size;
885deb0bb6SMatthias Ringwald     uint16_t long_write_attribute_handle;
897f95ef04SMilanka Ringwald } bass_server_connection_t;
905deb0bb6SMatthias Ringwald 
915deb0bb6SMatthias Ringwald /**
925deb0bb6SMatthias Ringwald  * @brief Init Broadcast Audio Scan Service Server with ATT DB
935deb0bb6SMatthias Ringwald  * @param sources_num
945deb0bb6SMatthias Ringwald  * @param sources
955deb0bb6SMatthias Ringwald  * @param clients_num
965deb0bb6SMatthias Ringwald  * @param clients
975deb0bb6SMatthias Ringwald  */
987f95ef04SMilanka Ringwald void broadcast_audio_scan_service_server_init(uint8_t const sources_num, bass_server_source_t * sources, uint8_t const clients_num, bass_server_connection_t * clients);
995deb0bb6SMatthias Ringwald 
1005deb0bb6SMatthias Ringwald /**
101b973a76fSMilanka Ringwald  * @brief Register packet handler to receive events:
102*ae304283SMilanka Ringwald  * - LEAUDIO_SUBEVENT_BASS_SERVER_SCAN_STOPPED
103*ae304283SMilanka Ringwald  * - LEAUDIO_SUBEVENT_BASS_SERVER_SCAN_STARTED
104*ae304283SMilanka Ringwald  * - LEAUDIO_SUBEVENT_BASS_SERVER_BROADCAST_CODE
105*ae304283SMilanka Ringwald  * - LEAUDIO_SUBEVENT_BASS_SERVER_SOURCE_ADDED
106*ae304283SMilanka Ringwald  * - LEAUDIO_SUBEVENT_BASS_SERVER_SOURCE_MODIFIED
107*ae304283SMilanka Ringwald  * - LEAUDIO_SUBEVENT_BASS_SERVER_SOURCE_DELETED
108b973a76fSMilanka Ringwald  * @param packet_handler
1095deb0bb6SMatthias Ringwald  */
110b973a76fSMilanka Ringwald void broadcast_audio_scan_service_server_register_packet_handler(btstack_packet_handler_t packet_handler);
1115deb0bb6SMatthias Ringwald 
1125deb0bb6SMatthias Ringwald /**
1135deb0bb6SMatthias Ringwald  * @brief Set PA state of source.
1145deb0bb6SMatthias Ringwald  * @param source_index
1155deb0bb6SMatthias Ringwald  * @param sync_state
1165deb0bb6SMatthias Ringwald  */
1175deb0bb6SMatthias Ringwald void broadcast_audio_scan_service_server_set_pa_sync_state(uint8_t source_index, le_audio_pa_sync_state_t sync_state);
1185deb0bb6SMatthias Ringwald 
1195deb0bb6SMatthias Ringwald /**
120b973a76fSMilanka Ringwald  * @brief Add source.
1215deb0bb6SMatthias Ringwald  * @param source_data
1225deb0bb6SMatthias Ringwald  * @param source_index
1235deb0bb6SMatthias Ringwald  */
1248d085b97SMatthias Ringwald void broadcast_audio_scan_service_server_add_source(const bass_source_data_t *source_data, uint8_t * source_index);
1255deb0bb6SMatthias Ringwald 
1265deb0bb6SMatthias Ringwald /**
1275deb0bb6SMatthias Ringwald  * @brief Deinit Broadcast Audio Scan Service Server
1285deb0bb6SMatthias Ringwald  */
1295deb0bb6SMatthias Ringwald void broadcast_audio_scan_service_server_deinit(void);
1305deb0bb6SMatthias Ringwald 
1315deb0bb6SMatthias Ringwald /* API_END */
1325deb0bb6SMatthias Ringwald 
1335deb0bb6SMatthias Ringwald #if defined __cplusplus
1345deb0bb6SMatthias Ringwald }
1355deb0bb6SMatthias Ringwald #endif
1365deb0bb6SMatthias Ringwald 
1375deb0bb6SMatthias Ringwald #endif
1385deb0bb6SMatthias Ringwald 
139