diff --git a/audio/hdi_service/primary_impl/src/audio_render.c b/audio/hdi_service/primary_impl/src/audio_render.c index 1f1257a6b880ffe2453e8c8f6d3b7d8e5993960f..e0c58196130bac8112b59485c1ebf2ac3c3490f6 100644 --- a/audio/hdi_service/primary_impl/src/audio_render.c +++ b/audio/hdi_service/primary_impl/src/audio_render.c @@ -823,6 +823,11 @@ static int32_t AudioRenderRenderFramSplit(struct AudioHwRender *hwRender) int32_t ret = (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIO_DRV_PCM_IOCTL_WRITE); + if (ret == HDF_ERR_DEVICE_BUSY) { + int32_t retStart = + (*pInterfaceLibModeRender)(hwRender->devDataHandle, &hwRender->renderParam, AUDIO_DRV_PCM_IOCTRL_START); + AUDIO_FUNC_LOGI("DMA Stopped restart again ret:%{public}d!", retStart); + } if (ret < 0) { AUDIO_FUNC_LOGE("Render Frame FAIL!"); LogError((AudioHandle)hwRender, WRITE_FRAME_ERROR_CODE, ret); diff --git a/audio/supportlibs/adm_adapter/include/audio_interface_lib_common.h b/audio/supportlibs/adm_adapter/include/audio_interface_lib_common.h index 97fc44db0969cc3bc4730366e92e388609009752..e71569a4d1aeab97b6b7b9c26fdc198743a98bbc 100644 --- a/audio/supportlibs/adm_adapter/include/audio_interface_lib_common.h +++ b/audio/supportlibs/adm_adapter/include/audio_interface_lib_common.h @@ -29,6 +29,7 @@ enum AudioCriBuffStatus { CIR_BUFF_NORMAL = -1, CIR_BUFF_FULL = -2, CIR_BUFF_EMPTY = -3, + CIR_BUFF_STOP = -4, }; struct AudioCtlElemId { diff --git a/audio/supportlibs/adm_adapter/src/audio_interface_lib_render.c b/audio/supportlibs/adm_adapter/src/audio_interface_lib_render.c index a8ff2ad7ba129b1624afd1f42915af909203b2ef..24adba3c04271c550ff76b360415727179cb43cd 100644 --- a/audio/supportlibs/adm_adapter/src/audio_interface_lib_render.c +++ b/audio/supportlibs/adm_adapter/src/audio_interface_lib_render.c @@ -900,6 +900,11 @@ int32_t AudioOutputRenderWriteFrame(struct HdfIoService *service, return HDF_FAILURE; } + if (buffStatus == CIR_BUFF_STOP) { + AUDIO_FUNC_LOGW("DMA Stopped Failed to write buff!"); + return HDF_ERR_DEVICE_BUSY; + } + if (buffStatus != CIR_BUFF_NORMAL) { (void)AudioCallbackModeStatus(handleData, AUDIO_RENDER_FULL); tryNum--; @@ -952,7 +957,7 @@ int32_t AudioOutputRenderWrite(const struct DevHandle *handle, if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("AudioOutputRenderWriteFrame is Fail!"); AudioFreeHdfSBuf(&sBuf, &reply); - return HDF_FAILURE; + return ret; } AudioFreeHdfSBuf(&sBuf, &reply);