mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-03-14 01:27:41 +00:00
sbc: pass SCO packet status flag into sbc_decoder_process_data and invalidate frames that contain SCO data that might be corrupted
This commit is contained in:
parent
5b4ff0f76d
commit
81dc09f8ed
@ -59,7 +59,7 @@
|
||||
#include <unistd.h>
|
||||
|
||||
#include "btstack.h"
|
||||
#include "sbc_decoder.h"
|
||||
#include "btstack_sbc_decoder.h"
|
||||
|
||||
#include "sco_demo_util.h"
|
||||
#ifdef HAVE_POSIX_STDIN
|
||||
|
@ -213,7 +213,7 @@ static void sco_demo_init_CVSD(void){
|
||||
|
||||
static void sco_demo_receive_mSBC(uint8_t * packet, uint16_t size){
|
||||
if (num_samples_to_write){
|
||||
sbc_decoder_process_data(&decoder_state, packet+3, size-3);
|
||||
sbc_decoder_process_data(&decoder_state, packet[2], packet+3, size-3);
|
||||
dump_data = 0;
|
||||
}
|
||||
}
|
||||
|
@ -50,6 +50,8 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* API_START */
|
||||
|
||||
typedef enum{
|
||||
SBC_MODE_STANDARD,
|
||||
SBC_MODE_mSBC
|
||||
@ -69,13 +71,42 @@ typedef struct {
|
||||
int zero_frames_nr;
|
||||
} sbc_decoder_state_t;
|
||||
|
||||
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);
|
||||
/**
|
||||
* @brief Init SBC decoder
|
||||
* @param state
|
||||
* @param mode
|
||||
* @param callback for decoded PCM data
|
||||
* @param context provided in callback
|
||||
*/
|
||||
|
||||
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);
|
||||
|
||||
/**
|
||||
* @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 sbc_decoder_process_data(sbc_decoder_state_t * state, int packet_status_flag, uint8_t * buffer, int size);
|
||||
|
||||
/**
|
||||
* @brief Get number of samples per SBC frame
|
||||
*/
|
||||
int sbc_decoder_num_samples_per_frame(sbc_decoder_state_t * state);
|
||||
|
||||
/*
|
||||
* @brief Get number of channels
|
||||
*/
|
||||
int sbc_decoder_num_channels(sbc_decoder_state_t * state);
|
||||
|
||||
/*
|
||||
* @brief Get sample rate in hz
|
||||
*/
|
||||
int sbc_decoder_sample_rate(sbc_decoder_state_t * state);
|
||||
|
||||
/* API_END */
|
||||
|
||||
// testing only
|
||||
void sbc_decoder_test_disable_plc(void);
|
||||
void sbc_decoder_test_simulate_corrupt_frames(int period);
|
||||
|
@ -208,8 +208,8 @@ static void append_received_sbc_data(bludroid_decoder_state_t * state, uint8_t *
|
||||
state->bytes_in_frame_buffer += size;
|
||||
}
|
||||
|
||||
void sbc_decoder_process_data(sbc_decoder_state_t * state, int packet_status_flag, uint8_t * buffer, int size){
|
||||
|
||||
void sbc_decoder_process_data(sbc_decoder_state_t * state, uint8_t * buffer, int size){
|
||||
bludroid_decoder_state_t * bd_decoder_state = (bludroid_decoder_state_t*)state->decoder_state;
|
||||
int bytes_to_process = size;
|
||||
int msbc_frame_size = 57;
|
||||
@ -250,13 +250,15 @@ void sbc_decoder_process_data(sbc_decoder_state_t * state, uint8_t * buffer, int
|
||||
}
|
||||
|
||||
OI_STATUS status = 0;
|
||||
int bad_frame = 0;
|
||||
int zero_seq_found = 0;
|
||||
|
||||
|
||||
if (bd_decoder_state->first_good_frame_found){
|
||||
zero_seq_found = find_sequence_of_zeros(frame_data, bd_decoder_state->bytes_in_frame_buffer, 20);
|
||||
bad_frame = zero_seq_found || packet_status_flag;
|
||||
}
|
||||
|
||||
if (zero_seq_found){
|
||||
if (bad_frame){
|
||||
status = OI_CODEC_SBC_CHECKSUM_MISMATCH;
|
||||
bd_decoder_state->bytes_in_frame_buffer = 0;
|
||||
} else {
|
||||
|
@ -211,7 +211,7 @@ int main (int argc, const char * argv[]){
|
||||
int bytes_read = __read(fd, read_buffer, sizeof(read_buffer));
|
||||
if (0 >= bytes_read) break;
|
||||
// process chunk
|
||||
sbc_decoder_process_data(&state, read_buffer, bytes_read);
|
||||
sbc_decoder_process_data(&state, 0, read_buffer, bytes_read);
|
||||
}
|
||||
|
||||
rewind(wav_file);
|
||||
|
Loading…
x
Reference in New Issue
Block a user