diff --git a/test/le_audio/btstack_lc3plus_fraunhofer.c b/test/le_audio/btstack_lc3plus_fraunhofer.c index fa9c2e569..19f4406d5 100644 --- a/test/le_audio/btstack_lc3plus_fraunhofer.c +++ b/test/le_audio/btstack_lc3plus_fraunhofer.c @@ -44,6 +44,8 @@ #ifdef HAVE_LC3PLUS +#define MAX_SAMPLES_PER_FRAME 480 + static uint8_t lc3plus_farunhofer_scratch[LC3PLUS_DEC_MAX_SCRATCH_SIZE]; static uint16_t lc3_frame_duration_in_us(btstack_lc3_frame_duration_t frame_duration){ @@ -85,13 +87,20 @@ static uint8_t lc3plus_fraunhofer_decoder_configure(void * context, uint32_t sam return ERROR_CODE_SUCCESS; } -static uint8_t lc3plus_fraunhofer_decoder_decode_signed_16(void * context, const uint8_t *bytes, uint8_t BFI, int16_t* pcm_out, uint16_t stride, uint8_t * BEC_detect){ - btstack_lc3plus_fraunhofer_decoder_t * instance = (btstack_lc3plus_fraunhofer_decoder_t *) context; - LC3PLUS_Dec * decoder = (LC3PLUS_Dec*) instance->decoder; +static uint8_t lc3plus_fraunhofer_decoder_decode_signed_16(void * context, const uint8_t *bytes, uint8_t BFI, int16_t* pcm_out, uint16_t stride, uint8_t * BEC_detect) { + btstack_lc3plus_fraunhofer_decoder_t *instance = (btstack_lc3plus_fraunhofer_decoder_t *) context; + LC3PLUS_Dec *decoder = (LC3PLUS_Dec *) instance->decoder; - // output_samples: array of channel buffers. - int16_t * output_samples[1]; - output_samples[0] = pcm_out; + // temporary output buffer to interleave samples for caller + int16_t temp_out[MAX_SAMPLES_PER_FRAME]; + + // output_samples: array of channel buffers. use temp_out if stride is used + int16_t *output_samples[1]; + if (stride > 1) { + output_samples[0] = temp_out; + } else { + output_samples[0] = pcm_out; + } // trigger plc if BFI by passing 0 valid input bytes uint16_t byte_count = instance->octets_per_frame; @@ -101,6 +110,14 @@ static uint8_t lc3plus_fraunhofer_decoder_decode_signed_16(void * context, const LC3PLUS_Error error = lc3plus_dec16(decoder, (void*) bytes, byte_count, output_samples, lc3plus_farunhofer_scratch, BFI); + // store samples + if (stride > 1){ + uint16_t i; + for (i = 0; i < instance->samples_per_frame; i++){ + pcm_out [i * stride] = temp_out[i]; + } + } + // map error switch (error){ case LC3PLUS_OK: