diff --git a/components/bt/bluedroid/btc/profile/std/a2dp/btc_media_task.c b/components/bt/bluedroid/btc/profile/std/a2dp/btc_media_task.c index 7f0bfc7495..0dab250a6e 100644 --- a/components/bt/bluedroid/btc/profile/std/a2dp/btc_media_task.c +++ b/components/bt/bluedroid/btc/profile/std/a2dp/btc_media_task.c @@ -63,9 +63,13 @@ #if BTC_AV_INCLUDED // #if (BTA_AV_SINK_INCLUDED == TRUE) -OI_CODEC_SBC_DECODER_CONTEXT context; -OI_UINT32 contextData[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)]; -OI_INT16 pcmData[15 * SBC_MAX_SAMPLES_PER_FRAME * SBC_MAX_CHANNELS]; +#define BTC_SBC_DEC_CONTEXT_DATA_LEN (CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)) +#define BTC_SBC_DEC_PCM_DATA_LEN (15 * SBC_MAX_SAMPLES_PER_FRAME * SBC_MAX_CHANNELS) + +static OI_CODEC_SBC_DECODER_CONTEXT *btc_sbc_decoder_context_ptr; +static OI_UINT32 *btc_sbc_decoder_context_data; +static OI_INT16 *btc_sbc_pcm_data; +#define btc_sbc_decoder_context (*btc_sbc_decoder_context_ptr) // #endif /***************************************************************************** @@ -273,6 +277,14 @@ bool btc_a2dp_start_media_task(void) return false; } + btc_sbc_decoder_context_ptr = osi_calloc(sizeof(OI_CODEC_SBC_DECODER_CONTEXT)); + btc_sbc_decoder_context_data = osi_calloc(BTC_SBC_DEC_CONTEXT_DATA_LEN * sizeof(OI_UINT32)); + btc_sbc_pcm_data = osi_calloc(BTC_SBC_DEC_PCM_DATA_LEN * sizeof(OI_INT16)); + if (!btc_sbc_decoder_context_ptr || !btc_sbc_decoder_context_data || !btc_sbc_pcm_data) { + APPL_TRACE_ERROR("failed to allocate SBC decoder"); + goto error_exit; + } + APPL_TRACE_EVENT("## A2DP START MEDIA THREAD ##"); xBtcMediaQueueSet = xQueueCreateSet(BTC_A2DP_SINK_TASK_QUEUE_SET_LEN); @@ -329,6 +341,20 @@ error_exit:; fixed_queue_free(btc_media_cmd_msg_queue, NULL); btc_media_cmd_msg_queue = NULL; + + if (btc_sbc_decoder_context_ptr) { + osi_free(btc_sbc_decoder_context_ptr); + btc_sbc_decoder_context_ptr = NULL; + } + if (btc_sbc_decoder_context_data) { + osi_free(btc_sbc_decoder_context_data); + btc_sbc_decoder_context_data = NULL; + } + if (btc_sbc_pcm_data) { + osi_free(btc_sbc_pcm_data); + btc_sbc_pcm_data = NULL; + } + return false; } @@ -358,6 +384,15 @@ void btc_a2dp_stop_media_task(void) fixed_queue_free(btc_media_cmd_msg_queue, NULL); btc_media_cmd_msg_queue = NULL; + + osi_free(btc_sbc_decoder_context_ptr); + btc_sbc_decoder_context_ptr = NULL; + + osi_free(btc_sbc_decoder_context_data); + btc_sbc_decoder_context_data = NULL; + + osi_free(btc_sbc_pcm_data); + btc_sbc_pcm_data = NULL; } /***************************************************************************** @@ -637,11 +672,11 @@ static void btc_media_task_handle_inc_media(tBT_SBC_HDR *p_msg) UINT8 *sbc_start_frame = ((UINT8 *)(p_msg + 1) + p_msg->offset + 1); int count; UINT32 pcmBytes, availPcmBytes; - OI_INT16 *pcmDataPointer = pcmData; /*Will be overwritten on next packet receipt*/ + OI_INT16 *pcmDataPointer = btc_sbc_pcm_data; /*Will be overwritten on next packet receipt*/ OI_STATUS status; int num_sbc_frames = p_msg->num_frames_to_be_processed; UINT32 sbc_frame_len = p_msg->len - 1; - availPcmBytes = sizeof(pcmData); + availPcmBytes = BTC_SBC_DEC_PCM_DATA_LEN * sizeof(OI_INT16); if ((btc_media_cb.peer_sep == AVDT_TSEP_SNK) || (btc_media_cb.rx_flush)) { APPL_TRACE_DEBUG(" State Changed happened in this tick "); @@ -657,7 +692,7 @@ static void btc_media_task_handle_inc_media(tBT_SBC_HDR *p_msg) for (count = 0; count < num_sbc_frames && sbc_frame_len != 0; count ++) { pcmBytes = availPcmBytes; - status = OI_CODEC_SBC_DecodeFrame(&context, (const OI_BYTE **)&sbc_start_frame, + status = OI_CODEC_SBC_DecodeFrame(&btc_sbc_decoder_context, (const OI_BYTE **)&sbc_start_frame, (OI_UINT32 *)&sbc_frame_len, (OI_INT16 *)pcmDataPointer, (OI_UINT32 *)&pcmBytes); @@ -671,7 +706,7 @@ static void btc_media_task_handle_inc_media(tBT_SBC_HDR *p_msg) p_msg->len = sbc_frame_len + 1; } - btc_a2d_data_cb_to_app((uint8_t *)pcmData, (sizeof(pcmData) - availPcmBytes)); + btc_a2d_data_cb_to_app((uint8_t *)btc_sbc_pcm_data, (BTC_SBC_DEC_PCM_DATA_LEN * sizeof(OI_INT16) - availPcmBytes)); } /******************************************************************************* @@ -799,7 +834,8 @@ static void btc_media_task_aa_handle_decoder_reset(BT_HDR *p_msg) btc_media_cb.rx_flush = FALSE; APPL_TRACE_EVENT("Reset to sink role"); - status = OI_CODEC_SBC_DecoderReset(&context, contextData, sizeof(contextData), 2, 2, FALSE); + status = OI_CODEC_SBC_DecoderReset(&btc_sbc_decoder_context, btc_sbc_decoder_context_data, + BTC_SBC_DEC_CONTEXT_DATA_LEN * sizeof(OI_UINT32), 2, 2, FALSE); if (!OI_SUCCESS(status)) { APPL_TRACE_ERROR("OI_CODEC_SBC_DecoderReset failed with error code %d\n", status); }