xref: /btstack/src/classic/btstack_sbc.h (revision 0c87db9ec5d19345d4f841997015e8264c11d6b7)
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>
47*0c87db9eSMilanka Ringwald #include "btstack_sbc_plc.h"
484f0d422dSMilanka Ringwald 
494f0d422dSMilanka Ringwald typedef enum{
504f0d422dSMilanka Ringwald     SBC_MODE_STANDARD,
514f0d422dSMilanka Ringwald     SBC_MODE_mSBC
52e7a41128SMilanka Ringwald } btstack_sbc_mode_t;
534f0d422dSMilanka Ringwald 
54*0c87db9eSMilanka Ringwald typedef struct {
55*0c87db9eSMilanka Ringwald     void * context;
56*0c87db9eSMilanka Ringwald     void (*handle_pcm_data)(int16_t * data, int num_samples, int num_channels, int sample_rate, void * context);
57*0c87db9eSMilanka Ringwald     // private
58*0c87db9eSMilanka Ringwald     void * decoder_state;
59*0c87db9eSMilanka Ringwald     btstack_sbc_plc_state_t plc_state;
60*0c87db9eSMilanka Ringwald     btstack_sbc_mode_t mode;
61*0c87db9eSMilanka Ringwald 
62*0c87db9eSMilanka Ringwald     // summary of processed good, bad and zero frames
63*0c87db9eSMilanka Ringwald     int good_frames_nr;
64*0c87db9eSMilanka Ringwald     int bad_frames_nr;
65*0c87db9eSMilanka Ringwald     int zero_frames_nr;
66*0c87db9eSMilanka Ringwald } btstack_sbc_decoder_state_t;
67*0c87db9eSMilanka Ringwald 
68*0c87db9eSMilanka Ringwald typedef struct {
69*0c87db9eSMilanka Ringwald     // private
70*0c87db9eSMilanka Ringwald     void * encoder_state;
71*0c87db9eSMilanka Ringwald     btstack_sbc_mode_t mode;
72*0c87db9eSMilanka Ringwald } btstack_sbc_encoder_state_t;
73*0c87db9eSMilanka Ringwald 
74*0c87db9eSMilanka Ringwald /* API_START */
75*0c87db9eSMilanka Ringwald 
76*0c87db9eSMilanka Ringwald /* BTstack SBC decoder */
77*0c87db9eSMilanka Ringwald /**
78*0c87db9eSMilanka Ringwald  * @brief Init SBC decoder
79*0c87db9eSMilanka Ringwald  * @param state
80*0c87db9eSMilanka Ringwald  * @param mode
81*0c87db9eSMilanka Ringwald  * @param callback for decoded PCM data
82*0c87db9eSMilanka Ringwald  * @param context provided in callback
83*0c87db9eSMilanka Ringwald  */
84*0c87db9eSMilanka Ringwald 
85*0c87db9eSMilanka 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);
86*0c87db9eSMilanka Ringwald 
87*0c87db9eSMilanka Ringwald /**
88*0c87db9eSMilanka Ringwald  * @brief Process received SCO data
89*0c87db9eSMilanka Ringwald  * @param state
90*0c87db9eSMilanka Ringwald  * @param packet_status_flag from SCO packet: 0 = OK, 1 = possibly invalid data, 2 = no data received, 3 = data partially lost
91*0c87db9eSMilanka Ringwald  * @param buffer
92*0c87db9eSMilanka Ringwald  * @param size
93*0c87db9eSMilanka Ringwald  */
94*0c87db9eSMilanka Ringwald void btstack_sbc_decoder_process_data(btstack_sbc_decoder_state_t * state, int packet_status_flag, uint8_t * buffer, int size);
95*0c87db9eSMilanka Ringwald 
96*0c87db9eSMilanka Ringwald /**
97*0c87db9eSMilanka Ringwald  * @brief Get number of samples per SBC frame
98*0c87db9eSMilanka Ringwald  */
99*0c87db9eSMilanka Ringwald int btstack_sbc_decoder_num_samples_per_frame(btstack_sbc_decoder_state_t * state);
100*0c87db9eSMilanka Ringwald 
101*0c87db9eSMilanka Ringwald /*
102*0c87db9eSMilanka Ringwald  * @brief Get number of channels
103*0c87db9eSMilanka Ringwald  */
104*0c87db9eSMilanka Ringwald int btstack_sbc_decoder_num_channels(btstack_sbc_decoder_state_t * state);
105*0c87db9eSMilanka Ringwald 
106*0c87db9eSMilanka Ringwald /*
107*0c87db9eSMilanka Ringwald  * @brief Get sample rate in hz
108*0c87db9eSMilanka Ringwald  */
109*0c87db9eSMilanka Ringwald int btstack_sbc_decoder_sample_rate(btstack_sbc_decoder_state_t * state);
110*0c87db9eSMilanka Ringwald 
111*0c87db9eSMilanka Ringwald 
112*0c87db9eSMilanka Ringwald /* BTstack SBC Encoder */
113*0c87db9eSMilanka Ringwald /**
114*0c87db9eSMilanka Ringwald  * @brief Init SBC encoder
115*0c87db9eSMilanka Ringwald  * @param state
116*0c87db9eSMilanka Ringwald  * @param mode
117*0c87db9eSMilanka Ringwald  * @param blocks
118*0c87db9eSMilanka Ringwald  * @param subbands
119*0c87db9eSMilanka Ringwald  * @param allocation_method
120*0c87db9eSMilanka Ringwald  * @param sample_rate
121*0c87db9eSMilanka Ringwald  * @param bitpool
122*0c87db9eSMilanka Ringwald  */
123*0c87db9eSMilanka Ringwald void btstack_sbc_encoder_init(btstack_sbc_encoder_state_t * state, btstack_sbc_mode_t mode,
124*0c87db9eSMilanka Ringwald                         int blocks, int subbands, int allocation_method, int sample_rate, int bitpool);
125*0c87db9eSMilanka Ringwald 
126*0c87db9eSMilanka Ringwald /**
127*0c87db9eSMilanka Ringwald  * @brief Process received PCM data
128*0c87db9eSMilanka Ringwald  * @param buffer
129*0c87db9eSMilanka Ringwald  */
130*0c87db9eSMilanka Ringwald void btstack_sbc_encoder_process_data(int16_t * input_buffer);
131*0c87db9eSMilanka Ringwald 
132*0c87db9eSMilanka Ringwald /**
133*0c87db9eSMilanka Ringwald  * @brief Return SBC frame
134*0c87db9eSMilanka Ringwald  */
135*0c87db9eSMilanka Ringwald uint8_t * btstack_sbc_encoder_sbc_buffer(void);
136*0c87db9eSMilanka Ringwald 
137*0c87db9eSMilanka Ringwald /**
138*0c87db9eSMilanka Ringwald  * @brief Return SBC frame length
139*0c87db9eSMilanka Ringwald  */
140*0c87db9eSMilanka Ringwald uint16_t  btstack_sbc_encoder_sbc_buffer_length(void);
141*0c87db9eSMilanka Ringwald 
142*0c87db9eSMilanka Ringwald /**
143*0c87db9eSMilanka Ringwald  * @brief Return number of audio samples in one PCM frame
144*0c87db9eSMilanka Ringwald  */
145*0c87db9eSMilanka Ringwald int  btstack_sbc_encoder_num_audio_samples(void);
146*0c87db9eSMilanka Ringwald 
147*0c87db9eSMilanka Ringwald /* API_END */
148*0c87db9eSMilanka Ringwald 
149*0c87db9eSMilanka Ringwald // testing only
150*0c87db9eSMilanka Ringwald void btstack_sbc_decoder_test_disable_plc(void);
151*0c87db9eSMilanka Ringwald void btstack_sbc_decoder_test_simulate_corrupt_frames(int period);
152*0c87db9eSMilanka Ringwald 
1534f0d422dSMilanka Ringwald #if defined __cplusplus
1544f0d422dSMilanka Ringwald }
1554f0d422dSMilanka Ringwald #endif
1564f0d422dSMilanka Ringwald 
1574f0d422dSMilanka Ringwald #endif // __BTSTACK_SBC_H