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 media_codec_configuration_sbc_t sbc_configuration;
static const btstack_sbc_encoder_t * sbc_encoder_instance; 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 uint8_t media_sbc_codec_configuration[4];
static a2dp_media_sending_context_t media_tracker; 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){ 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; int bytes_in_storage = media_tracker.sbc_storage_count;
uint8_t num_sbc_frames = bytes_in_storage / num_bytes_in_frame; uint8_t num_sbc_frames = bytes_in_storage / num_bytes_in_frame;
// Prepend SBC Header // Prepend SBC Header
@ -370,7 +370,7 @@ static void a2dp_demo_send_media_packet(void){
media_tracker.sbc_storage, bytes_in_storage + 1); media_tracker.sbc_storage, bytes_in_storage + 1);
// update rtp_timestamp // 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.rtp_timestamp += num_sbc_frames * num_audio_samples_per_sbc_buffer;
media_tracker.sbc_storage_count = 0; 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){ static int a2dp_demo_fill_sbc_audio_buffer(a2dp_media_sending_context_t * context){
// perform sbc encoding // perform sbc encoding
int total_num_bytes_read = 0; 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 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]; int16_t pcm_frame[256*NUM_CHANNELS];
produce_audio(pcm_frame, num_audio_samples_per_sbc_buffer); 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(); // encode into sbc storage buffer, first byte contains sbc media header
uint8_t * sbc_frame = btstack_sbc_encoder_sbc_buffer(); 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; 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->sbc_storage_count += sbc_frame_size;
context->samples_ready -= num_audio_samples_per_sbc_buffer; 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); 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 // schedule sending
context->sbc_ready_to_send = 1; context->sbc_ready_to_send = 1;
a2dp_source_stream_endpoint_request_can_send_now(context->a2dp_cid, context->local_seid); a2dp_source_stream_endpoint_request_can_send_now(context->a2dp_cid, context->local_seid);
@ -663,7 +663,8 @@ static void a2dp_source_packet_handler(uint8_t packet_type, uint16_t channel, ui
current_sample_rate = sbc_configuration.sampling_frequency; current_sample_rate = sbc_configuration.sampling_frequency;
a2dp_demo_hexcmod_configure_sample_rate(current_sample_rate); a2dp_demo_hexcmod_configure_sample_rate(current_sample_rate);
btstack_sbc_encoder_init(&sbc_encoder_state, SBC_MODE_STANDARD, 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.block_length, sbc_configuration.subbands,
sbc_configuration.allocation_method, sbc_configuration.sampling_frequency, sbc_configuration.allocation_method, sbc_configuration.sampling_frequency,
sbc_configuration.max_bitpool_value, sbc_configuration.max_bitpool_value,