diff --git a/audio/hal/hdi_passthrough/src/audio_adapter.c b/audio/hal/hdi_passthrough/src/audio_adapter.c index cad1d03dafdf41f41939c70c3cfed3f6a7ad9e71..058337d325b82199dd3fa5922c48c2257ec0b8d7 100644 --- a/audio/hal/hdi_passthrough/src/audio_adapter.c +++ b/audio/hal/hdi_passthrough/src/audio_adapter.c @@ -260,6 +260,7 @@ int32_t InitHwRenderParam(struct AudioHwRender *hwRender, const struct AudioDevi hwRender->renderParam.frameRenderMode.attrs = *attrs; hwRender->renderParam.renderMode.ctlParam.audioGain.gainMax = GAIN_MAX; // init gainMax hwRender->renderParam.renderMode.ctlParam.audioGain.gainMin = 0; + hwRender->renderParam.renderMode.ctlParam.stop = true; hwRender->renderParam.frameRenderMode.frames = 0; hwRender->renderParam.frameRenderMode.time.tvNSec = 0; hwRender->renderParam.frameRenderMode.time.tvSec = 0; @@ -274,6 +275,10 @@ int32_t InitHwRenderParam(struct AudioHwRender *hwRender, const struct AudioDevi hwRender->renderParam.frameRenderMode.attrs.isBigEndian = attrs->isBigEndian; hwRender->renderParam.frameRenderMode.attrs.isSignedData = attrs->isSignedData; hwRender->renderParam.frameRenderMode.renderhandle = (AudioHandle)hwRender; + if ((hwRender->renderParam.frameRenderMode.buffer = (char *)calloc(1, FRAME_DATA)) == NULL) { + LOG_FUN_ERR("alloc frame render buffer failed"); + return AUDIO_HAL_ERR_MALLOC_FAIL; + } hwRender->renderParam.renderMode.ctlParam.turnStandbyStatus = AUDIO_TURN_STANDBY_LATER; return HDF_SUCCESS; } diff --git a/audio/hal/hdi_passthrough/src/audio_render.c b/audio/hal/hdi_passthrough/src/audio_render.c index 9b65019a976de28b36bfb7f2f23e1aafb7b9fc93..e7260930a2a9935df1e116f28cfc2a63f457940b 100644 --- a/audio/hal/hdi_passthrough/src/audio_render.c +++ b/audio/hal/hdi_passthrough/src/audio_render.c @@ -70,7 +70,7 @@ int32_t AudioRenderStart(AudioHandle handle) LOG_FUN_ERR("pInterfaceLibModeRender Is NULL"); return AUDIO_HAL_ERR_INTERNAL; } - if (hwRender->renderParam.frameRenderMode.buffer != NULL) { + if (!hwRender->renderParam.renderMode.ctlParam.stop) { LOG_FUN_ERR("AudioRender already start!"); return AUDIO_HAL_ERR_AO_BUSY; // render is busy now } @@ -83,12 +83,7 @@ int32_t AudioRenderStart(AudioHandle handle) LOG_FUN_ERR("AudioRenderStart SetParams FAIL"); return AUDIO_HAL_ERR_INTERNAL; } - char *buffer = (char *)calloc(1, FRAME_DATA); - if (buffer == NULL) { - LOG_FUN_ERR("Calloc Render buffer Fail!"); - return AUDIO_HAL_ERR_MALLOC_FAIL; - } - hwRender->renderParam.frameRenderMode.buffer = buffer; + hwRender->renderParam.renderMode.ctlParam.stop = false; AudioLogRecord(INFO, "[%s]-[%s]-[%d] :> [%s]", __FILE__, __func__, __LINE__, "Audio Render Start"); return AUDIO_HAL_SUCCESS; } @@ -106,12 +101,11 @@ int32_t AudioRenderStop(AudioHandle handle) LOG_FUN_ERR("hwRender is invalid"); return AUDIO_HAL_ERR_INVALID_PARAM; } - if (hwRender->renderParam.frameRenderMode.buffer != NULL) { - AudioMemFree((void **)&hwRender->renderParam.frameRenderMode.buffer); - } else { + if (hwRender->renderParam.renderMode.ctlParam.stop) { LOG_FUN_ERR("Repeat invalid stop operation!"); return AUDIO_HAL_ERR_NOT_SUPPORT; } + hwRender->renderParam.renderMode.ctlParam.stop = true; if (hwRender->devDataHandle == NULL) { LOG_FUN_ERR("RenderStart Bind Fail!"); return AUDIO_HAL_ERR_INTERNAL; @@ -144,7 +138,7 @@ int32_t AudioRenderPause(AudioHandle handle) LOG_FUN_ERR("hwRender is null"); return AUDIO_HAL_ERR_INVALID_PARAM; } - if (hwRender->renderParam.frameRenderMode.buffer == NULL) { + if (hwRender->renderParam.renderMode.ctlParam.stop) { LOG_FUN_ERR("AudioRender already stop!"); return AUDIO_HAL_ERR_INTERNAL; } @@ -817,6 +811,10 @@ int32_t AudioRenderRenderFrame(struct AudioRender *render, const void *frame, LOG_FUN_ERR("Render Frame Paras is NULL!"); return AUDIO_HAL_ERR_INVALID_PARAM; } + if (hwRender->renderParam.renderMode.ctlParam.stop) { + LOG_FUN_ERR("Render not started!"); + return AUDIO_HAL_ERR_INTERNAL; + } if (FRAME_DATA < requestBytes) { LOG_FUN_ERR("Out of FRAME_DATA size!"); return AUDIO_HAL_ERR_INTERNAL;