From 0c87db9ec5d19345d4f841997015e8264c11d6b7 Mon Sep 17 00:00:00 2001 From: Milanka Ringwald Date: Wed, 27 Jul 2016 11:03:55 +0200 Subject: [PATCH] sbc decoder: merge decoder + encoder --- example/Makefile.inc | 4 +- example/hfp_hf_demo.c | 1 - example/sco_demo_util.c | 3 +- src/classic/btstack_sbc.h | 100 +++++++++++ ...oder_bludroid.c => btstack_sbc_bludroid.c} | 151 ++++++++++++++-- src/classic/btstack_sbc_decoder.h | 114 ------------ src/classic/btstack_sbc_encoder_bludroid.c | 168 ------------------ src/classic/hfp_msbc.c | 2 +- src/classic/hfp_msbc.h | 2 - .../{btstack_sbc_encoder.h => sbc_decoder.h} | 44 +++-- test/sbc/Makefile | 8 +- test/sbc/sbc_decoder_test.c | 2 +- test/sbc/sbc_encoder_test.c | 7 +- 13 files changed, 279 insertions(+), 327 deletions(-) rename src/classic/{btstack_sbc_decoder_bludroid.c => btstack_sbc_bludroid.c} (73%) delete mode 100644 src/classic/btstack_sbc_decoder.h delete mode 100644 src/classic/btstack_sbc_encoder_bludroid.c rename src/classic/{btstack_sbc_encoder.h => sbc_decoder.h} (63%) diff --git a/example/Makefile.inc b/example/Makefile.inc index cfd660326..1595c5477 100644 --- a/example/Makefile.inc +++ b/example/Makefile.inc @@ -74,10 +74,10 @@ include ${SBC_ENCODER_ROOT}/Makefile.inc SBC_DECODER += \ ${BTSTACK_ROOT}/src/classic/btstack_sbc_plc.c \ - ${BTSTACK_ROOT}/src/classic/btstack_sbc_decoder_bludroid.c \ + ${BTSTACK_ROOT}/src/classic/btstack_sbc_bludroid.c \ SBC_ENCODER += \ - ${BTSTACK_ROOT}/src/classic/btstack_sbc_encoder_bludroid.c \ + ${BTSTACK_ROOT}/src/classic/btstack_sbc_bludroid.c \ ${BTSTACK_ROOT}/src/classic/hfp_msbc.c \ EXAMPLES = \ diff --git a/example/hfp_hf_demo.c b/example/hfp_hf_demo.c index 73715bda9..df4b5d1fb 100644 --- a/example/hfp_hf_demo.c +++ b/example/hfp_hf_demo.c @@ -59,7 +59,6 @@ #include #include "btstack.h" -#include "btstack_sbc_decoder.h" #include "sco_demo_util.h" #ifdef HAVE_POSIX_STDIN diff --git a/example/sco_demo_util.c b/example/sco_demo_util.c index fc09ecb16..520406a6d 100644 --- a/example/sco_demo_util.c +++ b/example/sco_demo_util.c @@ -44,8 +44,7 @@ #include "sco_demo_util.h" #include "btstack_debug.h" -#include "btstack_sbc_decoder.h" -#include "btstack_sbc_encoder.h" +#include "btstack_sbc.h" #include "hfp_msbc.h" #include "hfp.h" diff --git a/src/classic/btstack_sbc.h b/src/classic/btstack_sbc.h index 35ab5a5a9..c4d96aeae 100644 --- a/src/classic/btstack_sbc.h +++ b/src/classic/btstack_sbc.h @@ -44,12 +44,112 @@ #define __BTSTACK_SBC_H #include +#include "btstack_sbc_plc.h" typedef enum{ SBC_MODE_STANDARD, SBC_MODE_mSBC } btstack_sbc_mode_t; +typedef struct { + void * context; + void (*handle_pcm_data)(int16_t * data, int num_samples, int num_channels, int sample_rate, void * context); + // private + void * decoder_state; + btstack_sbc_plc_state_t plc_state; + btstack_sbc_mode_t mode; + + // summary of processed good, bad and zero frames + int good_frames_nr; + int bad_frames_nr; + int zero_frames_nr; +} btstack_sbc_decoder_state_t; + +typedef struct { + // private + void * encoder_state; + btstack_sbc_mode_t mode; +} btstack_sbc_encoder_state_t; + +/* API_START */ + +/* BTstack SBC decoder */ +/** + * @brief Init SBC decoder + * @param state + * @param mode + * @param callback for decoded PCM data + * @param context provided in callback + */ + +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); + +/** + * @brief Process received SCO data + * @param state + * @param packet_status_flag from SCO packet: 0 = OK, 1 = possibly invalid data, 2 = no data received, 3 = data partially lost + * @param buffer + * @param size + */ +void btstack_sbc_decoder_process_data(btstack_sbc_decoder_state_t * state, int packet_status_flag, uint8_t * buffer, int size); + +/** + * @brief Get number of samples per SBC frame + */ +int btstack_sbc_decoder_num_samples_per_frame(btstack_sbc_decoder_state_t * state); + +/* + * @brief Get number of channels + */ +int btstack_sbc_decoder_num_channels(btstack_sbc_decoder_state_t * state); + +/* + * @brief Get sample rate in hz + */ +int btstack_sbc_decoder_sample_rate(btstack_sbc_decoder_state_t * state); + + +/* BTstack SBC Encoder */ +/** + * @brief Init SBC encoder + * @param state + * @param mode + * @param blocks + * @param subbands + * @param allocation_method + * @param sample_rate + * @param bitpool + */ +void btstack_sbc_encoder_init(btstack_sbc_encoder_state_t * state, btstack_sbc_mode_t mode, + int blocks, int subbands, int allocation_method, int sample_rate, int bitpool); + +/** + * @brief Process received PCM data + * @param buffer + */ +void btstack_sbc_encoder_process_data(int16_t * input_buffer); + +/** + * @brief Return SBC frame + */ +uint8_t * btstack_sbc_encoder_sbc_buffer(void); + +/** + * @brief Return SBC frame length + */ +uint16_t btstack_sbc_encoder_sbc_buffer_length(void); + +/** + * @brief Return number of audio samples in one PCM frame + */ +int btstack_sbc_encoder_num_audio_samples(void); + +/* API_END */ + +// testing only +void btstack_sbc_decoder_test_disable_plc(void); +void btstack_sbc_decoder_test_simulate_corrupt_frames(int period); + #if defined __cplusplus } #endif diff --git a/src/classic/btstack_sbc_decoder_bludroid.c b/src/classic/btstack_sbc_bludroid.c similarity index 73% rename from src/classic/btstack_sbc_decoder_bludroid.c rename to src/classic/btstack_sbc_bludroid.c index 59b9e434b..7b99828e6 100644 --- a/src/classic/btstack_sbc_decoder_bludroid.c +++ b/src/classic/btstack_sbc_bludroid.c @@ -37,7 +37,7 @@ // ***************************************************************************** // -// SBC decoder based on Bludroid library +// SBC decoder and encoder based on Bludroid library // // ***************************************************************************** @@ -50,26 +50,24 @@ #include #include -#include "btstack_sbc_decoder.h" +#include "btstack_sbc.h" #include "btstack_sbc_plc.h" #include "oi_codec_sbc.h" #include "oi_assert.h" -#include "btstack.h" +#include "sbc_encoder.h" -#define SBC_MAX_CHANNELS 2 -#define DECODER_DATA_SIZE (SBC_MAX_CHANNELS*SBC_MAX_BLOCKS*SBC_MAX_BANDS * 2 + SBC_CODEC_MIN_FILTER_BUFFERS*SBC_MAX_BANDS*SBC_MAX_CHANNELS * 2) +#include "btstack.h" #define mSBC_SYNCWORD 0xad #define SBC_SYNCWORD 0x9c - +#define SBC_MAX_CHANNELS 2 // #define LOG_FRAME_STATUS -// Testing only - START -static int plc_enabled = 1; -static int corrupt_frame_period = -1; -// Testing - STOP +// ***************************************************************************** +// SBC decoder start +#define DECODER_DATA_SIZE (SBC_MAX_CHANNELS*SBC_MAX_BLOCKS*SBC_MAX_BANDS * 2 + SBC_CODEC_MIN_FILTER_BUFFERS*SBC_MAX_BANDS*SBC_MAX_CHANNELS * 2) typedef struct { OI_UINT32 bytes_in_frame_buffer; @@ -86,10 +84,41 @@ typedef struct { int first_good_frame_found; } bludroid_decoder_state_t; - static btstack_sbc_decoder_state_t * sbc_state_singelton = NULL; static bludroid_decoder_state_t bd_state; +// Testing only - START +static int plc_enabled = 1; +static int corrupt_frame_period = -1; +// Testing - STOP + +// SBC decoder end +// ***************************************************************************** + + +// ***************************************************************************** +// SBC encoder start + +typedef struct { + SBC_ENC_PARAMS context; + int num_data_bytes; + uint8_t sbc_packet[1000]; +} bludroid_encoder_state_t; + +static btstack_sbc_encoder_state_t * sbc_encoder_state_singelton = NULL; +static bludroid_encoder_state_t bd_encoder_state; + +// SBC encoder start +// ***************************************************************************** + + + +// ***************************************************************************** +// +// SBC decoder based on Bludroid library +// +// ***************************************************************************** + void btstack_sbc_decoder_test_disable_plc(void){ plc_enabled = 0; } @@ -364,3 +393,103 @@ void btstack_sbc_decoder_process_data(btstack_sbc_decoder_state_t * state, int p } // printf ("<<-- exit -->>\n"); } + + +// ***************************************************************************** +// +// SBC encoder based on Bludroid library +// +// ***************************************************************************** + +void btstack_sbc_encoder_init(btstack_sbc_encoder_state_t * state, btstack_sbc_mode_t mode, + int blocks, int subbands, int allmethod, int sample_rate, int bitpool){ + + if (sbc_encoder_state_singelton && sbc_encoder_state_singelton != state ){ + log_error("SBC encoder: different sbc decoder state is allready registered"); + } + + sbc_encoder_state_singelton = state; + sbc_encoder_state_singelton->mode = mode; + + switch (sbc_encoder_state_singelton->mode){ + case SBC_MODE_STANDARD: + bd_encoder_state.context.s16NumOfBlocks = blocks; + bd_encoder_state.context.s16NumOfSubBands = subbands; + bd_encoder_state.context.s16AllocationMethod = allmethod; + bd_encoder_state.context.s16BitPool = 31; + bd_encoder_state.context.mSBCEnabled = 0; + + switch(sample_rate){ + case 16000: bd_encoder_state.context.s16SamplingFreq = SBC_sf16000; break; + case 32000: bd_encoder_state.context.s16SamplingFreq = SBC_sf32000; break; + case 44100: bd_encoder_state.context.s16SamplingFreq = SBC_sf44100; break; + case 48000: bd_encoder_state.context.s16SamplingFreq = SBC_sf48000; break; + default: bd_encoder_state.context.s16SamplingFreq = 0; break; + } + break; + case SBC_MODE_mSBC: + bd_encoder_state.context.s16NumOfBlocks = 15; + bd_encoder_state.context.s16NumOfSubBands = 8; + bd_encoder_state.context.s16AllocationMethod = SBC_LOUDNESS; + bd_encoder_state.context.s16BitPool = 26; + bd_encoder_state.context.s16ChannelMode = SBC_MONO; + bd_encoder_state.context.s16NumOfChannels = 1; + bd_encoder_state.context.mSBCEnabled = 1; + bd_encoder_state.context.s16SamplingFreq = SBC_sf16000; + break; + } + bd_encoder_state.context.pu8Packet = bd_encoder_state.sbc_packet; + + sbc_encoder_state_singelton->encoder_state = &bd_encoder_state; + SBC_ENC_PARAMS * context = &((bludroid_encoder_state_t *)sbc_encoder_state_singelton->encoder_state)->context; + SBC_Encoder_Init(context); +} + + +void btstack_sbc_encoder_process_data(int16_t * input_buffer){ + if (!sbc_state_singelton){ + log_error("SBC encoder: sbc state is NULL, call btstack_sbc_encoder_init to initialize it"); + } + SBC_ENC_PARAMS * context = &((bludroid_encoder_state_t *)sbc_encoder_state_singelton->encoder_state)->context; + context->ps16PcmBuffer = input_buffer; + if (context->mSBCEnabled){ + context->pu8Packet[0] = 0xad; + } + SBC_Encoder(context); +} + +int btstack_sbc_encoder_num_audio_samples(void){ + SBC_ENC_PARAMS * context = &((bludroid_encoder_state_t *)sbc_encoder_state_singelton->encoder_state)->context; + return context->s16NumOfSubBands * context->s16NumOfBlocks * context->s16NumOfChannels; +} + +uint8_t * btstack_sbc_encoder_sbc_buffer(void){ + SBC_ENC_PARAMS * context = &((bludroid_encoder_state_t *)sbc_encoder_state_singelton->encoder_state)->context; + return context->pu8Packet; +} + +uint16_t btstack_sbc_encoder_sbc_buffer_length(void){ + SBC_ENC_PARAMS * context = &((bludroid_encoder_state_t *)sbc_encoder_state_singelton->encoder_state)->context; + return context->u16PacketLength; +} + +// static void btstack_sbc_encoder_dump_context(void){ +// SBC_ENC_PARAMS * context = &((bludroid_encoder_state_t *)sbc_encoder_state_singelton->encoder_state)->context; + +// printf("Blocks %d\n", context->s16NumOfBlocks); +// printf("SubBands %d\n", context->s16NumOfSubBands); +// printf("Allocation Method %d\n", context->s16AllocationMethod); +// printf("BitPool %d\n", context->s16BitPool); +// printf("Channel Mode %d\n", context->s16ChannelMode); + +// printf("Sample Rate "); +// switch (context->s16SamplingFreq){ +// case 0: printf("16000\n"); break; +// case 1: printf("32000\n"); break; +// case 2: printf("44100\n"); break; +// case 3: printf("48000\n"); break; +// default: printf("not defined\n"); break; +// } +// printf("mSBC Enabled %d\n", context->mSBCEnabled); +// printf("\n"); +// } diff --git a/src/classic/btstack_sbc_decoder.h b/src/classic/btstack_sbc_decoder.h deleted file mode 100644 index 97802129a..000000000 --- a/src/classic/btstack_sbc_decoder.h +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2014 BlueKitchen GmbH - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * 4. Any redistribution, use, or modification is done solely for - * personal benefit and not for any commercial purpose or for - * monetary gain. - * - * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS - * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * Please inquire about commercial licensing options at - * contact@bluekitchen-gmbh.com - * - */ - -/* - * btstack_sbc_decoder.h - * - */ - -#ifndef __BTSTACK_SBC_DECODER_H -#define __BTSTACK_SBC_DECODER_H - -#include -#include "btstack_sbc.h" -#include "btstack_sbc_plc.h" - -#if defined __cplusplus -extern "C" { -#endif - -typedef struct { - void * context; - void (*handle_pcm_data)(int16_t * data, int num_samples, int num_channels, int sample_rate, void * context); - // private - void * decoder_state; - btstack_sbc_plc_state_t plc_state; - btstack_sbc_mode_t mode; - - // summary of processed good, bad and zero frames - int good_frames_nr; - int bad_frames_nr; - int zero_frames_nr; -} btstack_sbc_decoder_state_t; - -/* API_START */ - -/** - * @brief Init SBC decoder - * @param state - * @param mode - * @param callback for decoded PCM data - * @param context provided in callback - */ - -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); - -/** - * @brief Process received SCO data - * @param state - * @param packet_status_flag from SCO packet: 0 = OK, 1 = possibly invalid data, 2 = no data received, 3 = data partially lost - * @param buffer - * @param size - */ -void btstack_sbc_decoder_process_data(btstack_sbc_decoder_state_t * state, int packet_status_flag, uint8_t * buffer, int size); - -/** - * @brief Get number of samples per SBC frame - */ -int btstack_sbc_decoder_num_samples_per_frame(btstack_sbc_decoder_state_t * state); - -/* - * @brief Get number of channels - */ -int btstack_sbc_decoder_num_channels(btstack_sbc_decoder_state_t * state); - -/* - * @brief Get sample rate in hz - */ -int btstack_sbc_decoder_sample_rate(btstack_sbc_decoder_state_t * state); - -/* API_END */ - -// testing only -void btstack_sbc_decoder_test_disable_plc(void); -void btstack_sbc_decoder_test_simulate_corrupt_frames(int period); - -#if defined __cplusplus -} -#endif - -#endif // __BTSTACK_SBC_DECODER_H \ No newline at end of file diff --git a/src/classic/btstack_sbc_encoder_bludroid.c b/src/classic/btstack_sbc_encoder_bludroid.c deleted file mode 100644 index 3d3efa233..000000000 --- a/src/classic/btstack_sbc_encoder_bludroid.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (C) 2014 BlueKitchen GmbH - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the copyright holders nor the names of - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * 4. Any redistribution, use, or modification is done solely for - * personal benefit and not for any commercial purpose or for - * monetary gain. - * - * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS - * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * Please inquire about commercial licensing options at - * contact@bluekitchen-gmbh.com - * - */ - -// ***************************************************************************** -// -// SBC encoder based on Bludroid library -// -// ***************************************************************************** - -#include "btstack_config.h" - -#include -#include -#include -#include -#include -#include - -#include "sbc_encoder.h" -#include "btstack_sbc_encoder.h" -#include "btstack.h" - -#define SBC_MAX_CHANNELS 2 - -#define mSBC_SYNCWORD 0xad -#define SBC_SYNCWORD 0x9c - -// #define LOG_FRAME_STATUS - -typedef struct { - SBC_ENC_PARAMS context; - int num_data_bytes; - uint8_t sbc_packet[1000]; -} bludroid_encoder_state_t; - - -static btstack_sbc_encoder_state_t * sbc_state_singelton = NULL; -static bludroid_encoder_state_t bd_state; - -void btstack_sbc_encoder_dump_context(void){ - SBC_ENC_PARAMS * context = &((bludroid_encoder_state_t *)sbc_state_singelton->encoder_state)->context; - - printf("Blocks %d\n", context->s16NumOfBlocks); - printf("SubBands %d\n", context->s16NumOfSubBands); - printf("Allocation Method %d\n", context->s16AllocationMethod); - printf("BitPool %d\n", context->s16BitPool); - printf("Channel Mode %d\n", context->s16ChannelMode); - - printf("Sample Rate "); - switch (context->s16SamplingFreq){ - case 0: printf("16000\n"); break; - case 1: printf("32000\n"); break; - case 2: printf("44100\n"); break; - case 3: printf("48000\n"); break; - default: printf("not defined\n"); break; - } - printf("mSBC Enabled %d\n", context->mSBCEnabled); - printf("\n"); -} - - -int btstack_sbc_encoder_num_audio_samples(void){ - SBC_ENC_PARAMS * context = &((bludroid_encoder_state_t *)sbc_state_singelton->encoder_state)->context; - return context->s16NumOfSubBands * context->s16NumOfBlocks * context->s16NumOfChannels; -} - -uint8_t * btstack_sbc_encoder_sbc_buffer(void){ - SBC_ENC_PARAMS * context = &((bludroid_encoder_state_t *)sbc_state_singelton->encoder_state)->context; - return context->pu8Packet; -} - - -uint16_t btstack_sbc_encoder_sbc_buffer_length(void){ - SBC_ENC_PARAMS * context = &((bludroid_encoder_state_t *)sbc_state_singelton->encoder_state)->context; - return context->u16PacketLength; -} - - -void btstack_sbc_encoder_init(btstack_sbc_encoder_state_t * state, btstack_sbc_mode_t mode, - int blocks, int subbands, int allmethod, int sample_rate, int bitpool){ - - if (sbc_state_singelton && sbc_state_singelton != state ){ - log_error("SBC encoder: different sbc decoder state is allready registered"); - } - - sbc_state_singelton = state; - sbc_state_singelton->mode = mode; - - switch (sbc_state_singelton->mode){ - case SBC_MODE_STANDARD: - bd_state.context.s16NumOfBlocks = blocks; - bd_state.context.s16NumOfSubBands = subbands; - bd_state.context.s16AllocationMethod = allmethod; - bd_state.context.s16BitPool = 31; - bd_state.context.mSBCEnabled = 0; - - switch(sample_rate){ - case 16000: bd_state.context.s16SamplingFreq = SBC_sf16000; break; - case 32000: bd_state.context.s16SamplingFreq = SBC_sf32000; break; - case 44100: bd_state.context.s16SamplingFreq = SBC_sf44100; break; - case 48000: bd_state.context.s16SamplingFreq = SBC_sf48000; break; - default: bd_state.context.s16SamplingFreq = 0; break; - } - break; - case SBC_MODE_mSBC: - bd_state.context.s16NumOfBlocks = 15; - bd_state.context.s16NumOfSubBands = 8; - bd_state.context.s16AllocationMethod = SBC_LOUDNESS; - bd_state.context.s16BitPool = 26; - bd_state.context.s16ChannelMode = SBC_MONO; - bd_state.context.s16NumOfChannels = 1; - bd_state.context.mSBCEnabled = 1; - bd_state.context.s16SamplingFreq = SBC_sf16000; - break; - } - bd_state.context.pu8Packet = bd_state.sbc_packet; - - sbc_state_singelton->encoder_state = &bd_state; - SBC_ENC_PARAMS * context = &((bludroid_encoder_state_t *)sbc_state_singelton->encoder_state)->context; - SBC_Encoder_Init(context); -} - - -void btstack_sbc_encoder_process_data(int16_t * input_buffer){ - if (!sbc_state_singelton){ - log_error("SBC encoder: sbc state is NULL, call btstack_sbc_encoder_init to initialize it"); - } - SBC_ENC_PARAMS * context = &((bludroid_encoder_state_t *)sbc_state_singelton->encoder_state)->context; - context->ps16PcmBuffer = input_buffer; - if (context->mSBCEnabled){ - context->pu8Packet[0] = 0xad; - } - SBC_Encoder(context); -} diff --git a/src/classic/hfp_msbc.c b/src/classic/hfp_msbc.c index 0fecedec4..1c1816449 100644 --- a/src/classic/hfp_msbc.c +++ b/src/classic/hfp_msbc.c @@ -46,7 +46,7 @@ #include #include "btstack_debug.h" -#include "btstack_sbc_encoder.h" +#include "btstack_sbc.h" #include "hfp_msbc.h" #define MSBC_FRAME_SIZE 57 diff --git a/src/classic/hfp_msbc.h b/src/classic/hfp_msbc.h index 23c5e833a..abf06fc65 100644 --- a/src/classic/hfp_msbc.h +++ b/src/classic/hfp_msbc.h @@ -48,8 +48,6 @@ #include -#include "btstack_sbc_encoder.h" - #if defined __cplusplus extern "C" { #endif diff --git a/src/classic/btstack_sbc_encoder.h b/src/classic/sbc_decoder.h similarity index 63% rename from src/classic/btstack_sbc_encoder.h rename to src/classic/sbc_decoder.h index 65b03e681..267cd5ffb 100644 --- a/src/classic/btstack_sbc_encoder.h +++ b/src/classic/sbc_decoder.h @@ -36,40 +36,52 @@ */ /* - * btstack_sbc_encoder.h + * sbc_decoder.h * */ -#ifndef __BTSTACK_SBC_ENCODER_H -#define __BTSTACK_SBC_ENCODER_H +#ifndef __SBC_DECODER_H +#define __SBC_DECODER_H #include -#include "btstack_sbc.h" +#include "btstack_sbc_plc.h" #if defined __cplusplus extern "C" { #endif +typedef enum{ + SBC_MODE_STANDARD, + SBC_MODE_mSBC +} sbc_mode_t; + typedef struct { + void * context; + void (*handle_pcm_data)(int16_t * data, int num_samples, int num_channels, int sample_rate, void * context); // private - void * encoder_state; - btstack_sbc_mode_t mode; -} btstack_sbc_encoder_state_t; + void * decoder_state; + sbc_plc_state_t plc_state; + sbc_mode_t mode; -void btstack_sbc_encoder_init(btstack_sbc_encoder_state_t * state, btstack_sbc_mode_t mode, - int blocks, int subbands, int allmethod, int sample_rate, int bitpool); + // summary of processed good, bad and zero frames + int good_frames_nr; + int bad_frames_nr; + int zero_frames_nr; +} sbc_decoder_state_t; -void btstack_sbc_encoder_process_data(int16_t * input_buffer); +void sbc_decoder_init(sbc_decoder_state_t * state, sbc_mode_t mode, void (*callback)(int16_t * data, int num_samples, int num_channels, int sample_rate, void * context), void * context); +void sbc_decoder_process_data(sbc_decoder_state_t * state, uint8_t * buffer, int size); +int sbc_decoder_num_samples_per_frame(sbc_decoder_state_t * state); +int sbc_decoder_num_channels(sbc_decoder_state_t * state); +int sbc_decoder_sample_rate(sbc_decoder_state_t * state); -uint8_t * btstack_sbc_encoder_sbc_buffer(void); -uint16_t btstack_sbc_encoder_sbc_buffer_length(void); - -int btstack_sbc_encoder_num_audio_samples(void); -void btstack_sbc_encoder_dump_context(void); +// testing only +void sbc_decoder_test_disable_plc(void); +void sbc_decoder_test_simulate_corrupt_frames(int period); #if defined __cplusplus } #endif -#endif // __BTSTACK_SBC_ENCODER_H \ No newline at end of file +#endif // __SBC_DECODER_H \ No newline at end of file diff --git a/test/sbc/Makefile b/test/sbc/Makefile index b932035b5..1f52f52c8 100644 --- a/test/sbc/Makefile +++ b/test/sbc/Makefile @@ -9,10 +9,10 @@ include ${SBC_ENCODER_ROOT}/Makefile.inc SBC_DECODER += \ ${BTSTACK_ROOT}/src/classic/btstack_sbc_plc.c \ - ${BTSTACK_ROOT}/src/classic/btstack_sbc_decoder_bludroid.c \ + ${BTSTACK_ROOT}/src/classic/btstack_sbc_bludroid.c \ SBC_ENCODER += \ - ${BTSTACK_ROOT}/src/classic/btstack_sbc_encoder_bludroid.c \ + ${BTSTACK_ROOT}/src/classic/btstack_sbc_bludroid.c \ ${BTSTACK_ROOT}/src/classic/hfp_msbc.c \ SBC_DECODER_OBJ = $(SBC_DECODER:.c=.o) @@ -38,10 +38,10 @@ SBC_TESTS = sbc_decoder_test sbc_encoder_test all: ${SBC_TESTS} -sbc_decoder_test: ${SBC_DECODER_OBJ} ${COMMON_OBJ} sbc_decoder_test.o +sbc_decoder_test: ${SBC_DECODER_OBJ} ${SBC_ENCODER_OBJ} ${COMMON_OBJ} sbc_decoder_test.o ${CC} $^ ${CFLAGS} ${LDFLAGS} -o $@ -sbc_encoder_test: ${SBC_ENCODER_OBJ} ${COMMON_OBJ} sbc_encoder_test.o +sbc_encoder_test: ${SBC_DECODER_OBJ} ${SBC_ENCODER_OBJ} ${COMMON_OBJ} sbc_encoder_test.o ${CC} $^ ${CFLAGS} ${LDFLAGS} -o $@ test: all diff --git a/test/sbc/sbc_decoder_test.c b/test/sbc/sbc_decoder_test.c index 31fd83f73..89257fc7b 100644 --- a/test/sbc/sbc_decoder_test.c +++ b/test/sbc/sbc_decoder_test.c @@ -53,7 +53,7 @@ #include "oi_assert.h" #include "btstack.h" -#include "btstack_sbc_decoder.h" +#include "btstack_sbc.h" static uint8_t read_buffer[24]; diff --git a/test/sbc/sbc_encoder_test.c b/test/sbc/sbc_encoder_test.c index d7614eb38..96a51277a 100644 --- a/test/sbc/sbc_encoder_test.c +++ b/test/sbc/sbc_encoder_test.c @@ -51,9 +51,9 @@ #include #include "btstack.h" -#include "btstack_sbc_encoder.h" -#include "hfp_msbc.h" +#include "hfp_msbc.h" +#include "btstack_sbc.h" static int num_frames = 0; @@ -129,9 +129,6 @@ int main (int argc, const char * argv[]){ fwrite(output_buffer, 1, sizeof(output_buffer), sbc_fd); } } - - - btstack_sbc_encoder_dump_context(); printf("Done, frame count %d \n", num_frames); close(wav_fd);