example/a2dp_source_demo: use new sbc encoder api

This commit is contained in:
Matthias Ringwald 2023-11-16 21:00:25 +01:00
parent afa547f28a
commit b255b76b64

View File

@ -182,7 +182,7 @@ static uint8_t device_id_sdp_service_buffer[100];
static media_codec_configuration_sbc_t sbc_configuration;
static const btstack_sbc_encoder_t * sbc_encoder_instance;
static btstack_sbc_encoder_bluedroid_t sbc_decoder_context;
static btstack_sbc_encoder_bluedroid_t sbc_encoder_state;
static uint8_t media_sbc_codec_configuration[4];
static a2dp_media_sending_context_t media_tracker;
@ -360,7 +360,7 @@ static void a2dp_demo_hexcmod_configure_sample_rate(int sample_rate){
}
static void a2dp_demo_send_media_packet(void){
int num_bytes_in_frame = btstack_sbc_encoder_sbc_buffer_length();
int num_bytes_in_frame = sbc_encoder_instance->sbc_buffer_length(&sbc_encoder_state);
int bytes_in_storage = media_tracker.sbc_storage_count;
uint8_t num_sbc_frames = bytes_in_storage / num_bytes_in_frame;
// Prepend SBC Header
@ -370,7 +370,7 @@ static void a2dp_demo_send_media_packet(void){
media_tracker.sbc_storage, bytes_in_storage + 1);
// update rtp_timestamp
unsigned int num_audio_samples_per_sbc_buffer = btstack_sbc_encoder_num_audio_frames();
unsigned int num_audio_samples_per_sbc_buffer = sbc_encoder_instance->num_audio_frames(&sbc_encoder_state);
media_tracker.rtp_timestamp += num_sbc_frames * num_audio_samples_per_sbc_buffer;
media_tracker.sbc_storage_count = 0;
@ -433,21 +433,21 @@ static void produce_audio(int16_t * pcm_buffer, int num_samples){
static int a2dp_demo_fill_sbc_audio_buffer(a2dp_media_sending_context_t * context){
// perform sbc encoding
int total_num_bytes_read = 0;
unsigned int num_audio_samples_per_sbc_buffer = btstack_sbc_encoder_num_audio_frames();
unsigned int num_audio_samples_per_sbc_buffer = sbc_encoder_instance->num_audio_frames(&sbc_encoder_state);
uint16_t sbc_buffer_length = sbc_encoder_instance->sbc_buffer_length(&sbc_encoder_state);
while (context->samples_ready >= num_audio_samples_per_sbc_buffer
&& (context->max_media_payload_size - context->sbc_storage_count) >= btstack_sbc_encoder_sbc_buffer_length()){
&& (context->max_media_payload_size - context->sbc_storage_count) >= sbc_buffer_length){
int16_t pcm_frame[256*NUM_CHANNELS];
produce_audio(pcm_frame, num_audio_samples_per_sbc_buffer);
btstack_sbc_encoder_process_data(pcm_frame);
uint16_t sbc_frame_size = btstack_sbc_encoder_sbc_buffer_length();
uint8_t * sbc_frame = btstack_sbc_encoder_sbc_buffer();
// encode into sbc storage buffer, first byte contains sbc media header
sbc_encoder_instance->encode_signed_16(&sbc_encoder_state, pcm_frame, &context->sbc_storage[1 + context->sbc_storage_count]);
total_num_bytes_read += num_audio_samples_per_sbc_buffer;
// first byte in sbc storage contains sbc media header
memcpy(&context->sbc_storage[1 + context->sbc_storage_count], sbc_frame, sbc_frame_size);
uint16_t sbc_frame_size = sbc_encoder_instance->sbc_buffer_length(&sbc_encoder_state);
context->sbc_storage_count += sbc_frame_size;
context->samples_ready -= num_audio_samples_per_sbc_buffer;
}
@ -479,7 +479,7 @@ static void a2dp_demo_audio_timeout_handler(btstack_timer_source_t * timer){
a2dp_demo_fill_sbc_audio_buffer(context);
if ((context->sbc_storage_count + btstack_sbc_encoder_sbc_buffer_length()) > context->max_media_payload_size){
if ((context->sbc_storage_count + sbc_encoder_instance->sbc_buffer_length(&sbc_encoder_state)) > context->max_media_payload_size){
// schedule sending
context->sbc_ready_to_send = 1;
a2dp_source_stream_endpoint_request_can_send_now(context->a2dp_cid, context->local_seid);
@ -663,11 +663,12 @@ static void a2dp_source_packet_handler(uint8_t packet_type, uint16_t channel, ui
current_sample_rate = sbc_configuration.sampling_frequency;
a2dp_demo_hexcmod_configure_sample_rate(current_sample_rate);
btstack_sbc_encoder_init(&sbc_encoder_state, SBC_MODE_STANDARD,
sbc_configuration.block_length, sbc_configuration.subbands,
sbc_configuration.allocation_method, sbc_configuration.sampling_frequency,
sbc_configuration.max_bitpool_value,
sbc_configuration.channel_mode);
sbc_encoder_instance = btstack_sbc_encoder_bluedroid_init_instance(&sbc_encoder_state);
sbc_encoder_instance->configure(&sbc_encoder_state, SBC_MODE_STANDARD,
sbc_configuration.block_length, sbc_configuration.subbands,
sbc_configuration.allocation_method, sbc_configuration.sampling_frequency,
sbc_configuration.max_bitpool_value,
sbc_configuration.channel_mode);
break;
case A2DP_SUBEVENT_SIGNALING_DELAY_REPORTING_CAPABILITY: