14f0d422dSMilanka Ringwald /* 24f0d422dSMilanka Ringwald * Copyright (C) 2014 BlueKitchen GmbH 34f0d422dSMilanka Ringwald * 44f0d422dSMilanka Ringwald * Redistribution and use in source and binary forms, with or without 54f0d422dSMilanka Ringwald * modification, are permitted provided that the following conditions 64f0d422dSMilanka Ringwald * are met: 74f0d422dSMilanka Ringwald * 84f0d422dSMilanka Ringwald * 1. Redistributions of source code must retain the above copyright 94f0d422dSMilanka Ringwald * notice, this list of conditions and the following disclaimer. 104f0d422dSMilanka Ringwald * 2. Redistributions in binary form must reproduce the above copyright 114f0d422dSMilanka Ringwald * notice, this list of conditions and the following disclaimer in the 124f0d422dSMilanka Ringwald * documentation and/or other materials provided with the distribution. 134f0d422dSMilanka Ringwald * 3. Neither the name of the copyright holders nor the names of 144f0d422dSMilanka Ringwald * contributors may be used to endorse or promote products derived 154f0d422dSMilanka Ringwald * from this software without specific prior written permission. 164f0d422dSMilanka Ringwald * 4. Any redistribution, use, or modification is done solely for 174f0d422dSMilanka Ringwald * personal benefit and not for any commercial purpose or for 184f0d422dSMilanka Ringwald * monetary gain. 194f0d422dSMilanka Ringwald * 204f0d422dSMilanka Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 214f0d422dSMilanka Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 224f0d422dSMilanka Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 234f0d422dSMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 244f0d422dSMilanka Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 254f0d422dSMilanka Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 264f0d422dSMilanka Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 274f0d422dSMilanka Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 284f0d422dSMilanka Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 294f0d422dSMilanka Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 304f0d422dSMilanka Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 314f0d422dSMilanka Ringwald * SUCH DAMAGE. 324f0d422dSMilanka Ringwald * 334f0d422dSMilanka Ringwald * Please inquire about commercial licensing options at 344f0d422dSMilanka Ringwald * [email protected] 354f0d422dSMilanka Ringwald * 364f0d422dSMilanka Ringwald */ 374f0d422dSMilanka Ringwald 384f0d422dSMilanka Ringwald /* 394f0d422dSMilanka Ringwald * btstack_sbc.h 404f0d422dSMilanka Ringwald * 414f0d422dSMilanka Ringwald */ 424f0d422dSMilanka Ringwald 434f0d422dSMilanka Ringwald #ifndef __BTSTACK_SBC_H 444f0d422dSMilanka Ringwald #define __BTSTACK_SBC_H 454f0d422dSMilanka Ringwald 464f0d422dSMilanka Ringwald #include <stdint.h> 470c87db9eSMilanka Ringwald #include "btstack_sbc_plc.h" 484f0d422dSMilanka Ringwald 49*4a1feeddSMatthias Ringwald #if defined __cplusplus 50*4a1feeddSMatthias Ringwald extern "C" { 51*4a1feeddSMatthias Ringwald #endif 52*4a1feeddSMatthias Ringwald 534f0d422dSMilanka Ringwald typedef enum{ 544f0d422dSMilanka Ringwald SBC_MODE_STANDARD, 554f0d422dSMilanka Ringwald SBC_MODE_mSBC 56e7a41128SMilanka Ringwald } btstack_sbc_mode_t; 574f0d422dSMilanka Ringwald 580c87db9eSMilanka Ringwald typedef struct { 590c87db9eSMilanka Ringwald void * context; 600c87db9eSMilanka Ringwald void (*handle_pcm_data)(int16_t * data, int num_samples, int num_channels, int sample_rate, void * context); 610c87db9eSMilanka Ringwald // private 620c87db9eSMilanka Ringwald void * decoder_state; 630c87db9eSMilanka Ringwald btstack_sbc_plc_state_t plc_state; 640c87db9eSMilanka Ringwald btstack_sbc_mode_t mode; 650c87db9eSMilanka Ringwald 660c87db9eSMilanka Ringwald // summary of processed good, bad and zero frames 670c87db9eSMilanka Ringwald int good_frames_nr; 680c87db9eSMilanka Ringwald int bad_frames_nr; 690c87db9eSMilanka Ringwald int zero_frames_nr; 700c87db9eSMilanka Ringwald } btstack_sbc_decoder_state_t; 710c87db9eSMilanka Ringwald 720c87db9eSMilanka Ringwald typedef struct { 730c87db9eSMilanka Ringwald // private 740c87db9eSMilanka Ringwald void * encoder_state; 750c87db9eSMilanka Ringwald btstack_sbc_mode_t mode; 760c87db9eSMilanka Ringwald } btstack_sbc_encoder_state_t; 770c87db9eSMilanka Ringwald 780c87db9eSMilanka Ringwald /* API_START */ 790c87db9eSMilanka Ringwald 800c87db9eSMilanka Ringwald /* BTstack SBC decoder */ 810c87db9eSMilanka Ringwald /** 820c87db9eSMilanka Ringwald * @brief Init SBC decoder 830c87db9eSMilanka Ringwald * @param state 840c87db9eSMilanka Ringwald * @param mode 850c87db9eSMilanka Ringwald * @param callback for decoded PCM data 860c87db9eSMilanka Ringwald * @param context provided in callback 870c87db9eSMilanka Ringwald */ 880c87db9eSMilanka Ringwald 890c87db9eSMilanka Ringwald void btstack_sbc_decoder_init(btstack_sbc_decoder_state_t * state, btstack_sbc_mode_t mode, void (*callback)(int16_t * data, int num_samples, int num_channels, int sample_rate, void * context), void * context); 900c87db9eSMilanka Ringwald 910c87db9eSMilanka Ringwald /** 920c87db9eSMilanka Ringwald * @brief Process received SCO data 930c87db9eSMilanka Ringwald * @param state 940c87db9eSMilanka Ringwald * @param packet_status_flag from SCO packet: 0 = OK, 1 = possibly invalid data, 2 = no data received, 3 = data partially lost 950c87db9eSMilanka Ringwald * @param buffer 960c87db9eSMilanka Ringwald * @param size 970c87db9eSMilanka Ringwald */ 980c87db9eSMilanka Ringwald void btstack_sbc_decoder_process_data(btstack_sbc_decoder_state_t * state, int packet_status_flag, uint8_t * buffer, int size); 990c87db9eSMilanka Ringwald 1000c87db9eSMilanka Ringwald /** 1010c87db9eSMilanka Ringwald * @brief Get number of samples per SBC frame 1020c87db9eSMilanka Ringwald */ 1030c87db9eSMilanka Ringwald int btstack_sbc_decoder_num_samples_per_frame(btstack_sbc_decoder_state_t * state); 1040c87db9eSMilanka Ringwald 1050c87db9eSMilanka Ringwald /* 1060c87db9eSMilanka Ringwald * @brief Get number of channels 1070c87db9eSMilanka Ringwald */ 1080c87db9eSMilanka Ringwald int btstack_sbc_decoder_num_channels(btstack_sbc_decoder_state_t * state); 1090c87db9eSMilanka Ringwald 1100c87db9eSMilanka Ringwald /* 1110c87db9eSMilanka Ringwald * @brief Get sample rate in hz 1120c87db9eSMilanka Ringwald */ 1130c87db9eSMilanka Ringwald int btstack_sbc_decoder_sample_rate(btstack_sbc_decoder_state_t * state); 1140c87db9eSMilanka Ringwald 1150c87db9eSMilanka Ringwald 1160c87db9eSMilanka Ringwald /* BTstack SBC Encoder */ 1170c87db9eSMilanka Ringwald /** 1180c87db9eSMilanka Ringwald * @brief Init SBC encoder 1190c87db9eSMilanka Ringwald * @param state 1200c87db9eSMilanka Ringwald * @param mode 1210c87db9eSMilanka Ringwald * @param blocks 1220c87db9eSMilanka Ringwald * @param subbands 1230c87db9eSMilanka Ringwald * @param allocation_method 1240c87db9eSMilanka Ringwald * @param sample_rate 1250c87db9eSMilanka Ringwald * @param bitpool 1260c87db9eSMilanka Ringwald */ 1270c87db9eSMilanka Ringwald void btstack_sbc_encoder_init(btstack_sbc_encoder_state_t * state, btstack_sbc_mode_t mode, 1280c87db9eSMilanka Ringwald int blocks, int subbands, int allocation_method, int sample_rate, int bitpool); 1290c87db9eSMilanka Ringwald 1300c87db9eSMilanka Ringwald /** 1310c87db9eSMilanka Ringwald * @brief Process received PCM data 1320c87db9eSMilanka Ringwald * @param buffer 1330c87db9eSMilanka Ringwald */ 1340c87db9eSMilanka Ringwald void btstack_sbc_encoder_process_data(int16_t * input_buffer); 1350c87db9eSMilanka Ringwald 1360c87db9eSMilanka Ringwald /** 1370c87db9eSMilanka Ringwald * @brief Return SBC frame 1380c87db9eSMilanka Ringwald */ 1390c87db9eSMilanka Ringwald uint8_t * btstack_sbc_encoder_sbc_buffer(void); 1400c87db9eSMilanka Ringwald 1410c87db9eSMilanka Ringwald /** 1420c87db9eSMilanka Ringwald * @brief Return SBC frame length 1430c87db9eSMilanka Ringwald */ 1440c87db9eSMilanka Ringwald uint16_t btstack_sbc_encoder_sbc_buffer_length(void); 1450c87db9eSMilanka Ringwald 1460c87db9eSMilanka Ringwald /** 1470c87db9eSMilanka Ringwald * @brief Return number of audio samples in one PCM frame 1480c87db9eSMilanka Ringwald */ 1490c87db9eSMilanka Ringwald int btstack_sbc_encoder_num_audio_samples(void); 1500c87db9eSMilanka Ringwald 1510c87db9eSMilanka Ringwald /* API_END */ 1520c87db9eSMilanka Ringwald 1530c87db9eSMilanka Ringwald // testing only 1540c87db9eSMilanka Ringwald void btstack_sbc_decoder_test_disable_plc(void); 1550c87db9eSMilanka Ringwald void btstack_sbc_decoder_test_simulate_corrupt_frames(int period); 1560c87db9eSMilanka Ringwald 1574f0d422dSMilanka Ringwald #if defined __cplusplus 1584f0d422dSMilanka Ringwald } 1594f0d422dSMilanka Ringwald #endif 1604f0d422dSMilanka Ringwald 1614f0d422dSMilanka Ringwald #endif // __BTSTACK_SBC_H