From 2be3877a22a1eb2204c77e94c8403ad6f7bc96dd Mon Sep 17 00:00:00 2001 From: wanghongenaf Date: Sat, 19 Jul 2025 15:57:37 +0800 Subject: [PATCH 1/7] audio lock Signed-off-by: wanghongenaf --- .../primary_impl/vdi_src/audio_adapter_vdi.c | 29 +++-- .../primary_impl/vdi_src/audio_capture_vdi.c | 73 +++++------ .../primary_impl/vdi_src/audio_render_vdi.c | 120 ++++++++---------- .../audio_adapter_multchannel_test.cpp | 4 +- 4 files changed, 105 insertions(+), 121 deletions(-) diff --git a/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c b/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c index ca37f34f72..61ef32982d 100644 --- a/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c +++ b/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c @@ -161,11 +161,9 @@ static int32_t CreateRenderPre(struct IAudioAdapterVdi *vdiAdapter, AudioCommonAttrsToVdiAttrsVdi(attrs, &vdiAttrs); int32_t id = SetTimer("Hdi:CreateRender"); - pthread_rwlock_wrlock(GetRenderLock()); struct timeval startTime = AudioDfxSysEventGetTimeStamp(); int32_t ret = vdiAdapter->CreateRender(vdiAdapter, &vdiDesc, &vdiAttrs, vdiRender); AudioDfxSysEventError("CreateRender", startTime, TIME_THRESHOLD, ret); - pthread_rwlock_unlock(GetRenderLock()); CancelTimer(id); OsalMemFree((void *)vdiDesc.desc); if (ret != HDF_SUCCESS) { @@ -200,8 +198,11 @@ static int32_t AudioCreateRenderVdi(struct IAudioAdapter *adapter, const struct } char *adapterName = AudioGetAdapterNameVdi(adapter); + pthread_rwlock_wrlock(GetRenderLock()); + AUDIO_FUNC_LOGI("testtest %{public}s, FindRenderCreated", __func__); *render = FindRenderCreated(desc->pins, attrs, renderId, adapterName); if (*render != NULL) { + pthread_rwlock_unlock(GetRenderLock()); AUDIO_FUNC_LOGE("already created"); ret = HDF_SUCCESS; goto EXIT; @@ -209,16 +210,19 @@ static int32_t AudioCreateRenderVdi(struct IAudioAdapter *adapter, const struct struct IAudioRenderVdi *vdiRender = NULL; ret = CreateRenderPre(vdiAdapter, desc, attrs, renderId, &vdiRender); if (ret != HDF_SUCCESS) { + pthread_rwlock_unlock(GetRenderLock()); AUDIO_FUNC_LOGE("CreateRenderPre failed, ret = [%{public}d]", ret); goto EXIT; } *render = AudioCreateRenderByIdVdi(attrs, renderId, vdiRender, desc, adapterName); if (*render == NULL) { (void)vdiAdapter->DestroyRender(vdiAdapter, vdiRender); + pthread_rwlock_unlock(GetRenderLock()); AUDIO_FUNC_LOGE("Create audio render failed"); ret = HDF_FAILURE; goto EXIT; } + pthread_rwlock_unlock(GetRenderLock()); AUDIO_FUNC_LOGI("AudioCreateRenderVdi Success, renderId = [%{public}u]", *renderId); EXIT: pthread_rwlock_unlock(&g_rwAdapterLock); @@ -251,27 +255,30 @@ static int32_t AudioDestroyRenderVdi(struct IAudioAdapter *adapter, uint32_t ren ret = HDF_ERR_INVALID_PARAM; goto EXIT; } - + pthread_rwlock_wrlock(GetRenderLock()); + AUDIO_FUNC_LOGI("testtest %{public}s, AudioGetVdiRenderByIdVdi", __func__); struct IAudioRenderVdi *vdiRender = AudioGetVdiRenderByIdVdi(renderId); if (vdiRender == NULL) { + pthread_rwlock_unlock(GetRenderLock()); AUDIO_FUNC_LOGE("vdiRender pointer is null"); ret = HDF_ERR_INVALID_PARAM; goto EXIT; } if (vdiAdapter->DestroyRender == NULL) { + pthread_rwlock_unlock(GetRenderLock()); AUDIO_FUNC_LOGE("invalid param"); ret = HDF_ERR_INVALID_PARAM; goto EXIT; } - pthread_rwlock_wrlock(GetRenderLock()); ret = vdiAdapter->DestroyRender(vdiAdapter, vdiRender); - pthread_rwlock_unlock(GetRenderLock()); if (ret != HDF_SUCCESS) { + pthread_rwlock_unlock(GetRenderLock()); AUDIO_FUNC_LOGE("audio vdiAdapter call DestroyRender fail, ret=%{public}d", ret); ret = HDF_FAILURE; goto EXIT; } AudioDestroyRenderByIdVdi(renderId); + pthread_rwlock_unlock(GetRenderLock()); EXIT: pthread_rwlock_unlock(&g_rwAdapterLock); return ret; @@ -295,15 +302,15 @@ static int32_t CreateCapturePre(struct IAudioAdapterVdi *vdiAdapter, struct IAud AUDIO_FUNC_LOGE("invalid param"); return HDF_ERR_INVALID_PARAM; } - int32_t id = SetTimer("Hdi:CreateCapture"); pthread_rwlock_wrlock(GetCaptureLock()); + int32_t id = SetTimer("Hdi:CreateCapture"); struct timeval startTime = AudioDfxSysEventGetTimeStamp(); int32_t ret = vdiAdapter->CreateCapture(vdiAdapter, &vdiDesc, &vdiAttrs, &vdiCapture); AudioDfxSysEventError("CreateCapture", startTime, TIME_THRESHOLD, ret); - pthread_rwlock_unlock(GetCaptureLock()); CancelTimer(id); OsalMemFree((void *)vdiDesc.desc); if (ret != HDF_SUCCESS) { + pthread_rwlock_unlock(GetCaptureLock()); AUDIO_FUNC_LOGE("audio vdiAdapter call CreateCapture fail, ret=%{public}d", ret); return HDF_FAILURE; } @@ -314,9 +321,11 @@ static int32_t CreateCapturePre(struct IAudioAdapterVdi *vdiAdapter, struct IAud *capture = AudioCreateCaptureByIdVdi(attrs, captureId, vdiCapture, desc); if (*capture == NULL) { (void)vdiAdapter->DestroyCapture(vdiAdapter, vdiCapture); + pthread_rwlock_unlock(GetCaptureLock()); AUDIO_FUNC_LOGE("create audio capture failed"); return HDF_ERR_INVALID_PARAM; } + pthread_rwlock_unlock(GetCaptureLock()); return HDF_SUCCESS; } @@ -371,21 +380,23 @@ static int32_t AudioDestroyCaptureVdi(struct IAudioAdapter *adapter, uint32_t ca goto EXIT; } + pthread_rwlock_wrlock(GetCaptureLock()); struct IAudioCaptureVdi *vdiCapture = AudioGetVdiCaptureByIdVdi(captureId); if (vdiCapture == NULL || vdiAdapter->DestroyCapture == NULL) { + pthread_rwlock_unlock(GetCaptureLock()); AUDIO_FUNC_LOGE("invalid parameter"); ret = HDF_ERR_INVALID_PARAM; goto EXIT; } - pthread_rwlock_wrlock(GetCaptureLock()); ret = vdiAdapter->DestroyCapture(vdiAdapter, vdiCapture); - pthread_rwlock_unlock(GetCaptureLock()); if (ret != HDF_SUCCESS) { + pthread_rwlock_unlock(GetCaptureLock()); AUDIO_FUNC_LOGE("audio vdiAdapter call DestroyCapture fail, ret=%{public}d", ret); ret = HDF_FAILURE; goto EXIT; } AudioDestroyCaptureByIdVdi(captureId); + pthread_rwlock_unlock(GetCaptureLock()); EXIT: pthread_rwlock_unlock(&g_rwAdapterLock); return ret; diff --git a/audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.c b/audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.c index a3600ad9e8..88adb70e5a 100644 --- a/audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.c +++ b/audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.c @@ -39,7 +39,7 @@ struct AudioCaptureInfo { }; struct AudioCapturePrivVdi { - struct AudioCaptureInfo *captureInfos[AUDIO_VDI_STREAM_NUM_MAX]; + struct AudioCaptureInfo captureInfos[AUDIO_VDI_STREAM_NUM_MAX]; uint32_t captureCnt; }; @@ -57,13 +57,7 @@ pthread_rwlock_t* GetCaptureLock(void) struct IAudioCaptureVdi *AudioGetVdiCaptureByIdVdi(uint32_t captureId) { - struct AudioCapturePrivVdi *priv = AudioCaptureGetPrivVdi(); - if (priv->captureInfos[captureId] == NULL) { - AUDIO_FUNC_LOGE("not match capture"); - return NULL; - } - - return priv->captureInfos[captureId]->vdiCapture; + return g_audioCapturePrivVdi.captureInfos[captureId].vdiCapture; } int32_t AudioCaptureFrameVdi(struct IAudioCapture *capture, int8_t *frame, uint32_t *frameLen, uint64_t *replyBytes) @@ -74,6 +68,7 @@ int32_t AudioCaptureFrameVdi(struct IAudioCapture *capture, int8_t *frame, uint3 CHECK_NULL_PTR_RETURN_VALUE(frameLen, HDF_ERR_INVALID_PARAM); CHECK_NULL_PTR_RETURN_VALUE(replyBytes, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiCaptureLock); + AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->CaptureFrame == NULL) { @@ -620,6 +615,7 @@ int32_t AudioCaptureStartVdi(struct IAudioCapture *capture) AUDIO_FUNC_LOGI("hdi start enter"); CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiCaptureLock); + AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->Start == NULL) { @@ -646,6 +642,7 @@ int32_t AudioCaptureStopVdi(struct IAudioCapture *capture) AUDIO_FUNC_LOGI("hdi stop enter"); CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiCaptureLock); + AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->Stop == NULL) { @@ -671,6 +668,7 @@ int32_t AudioCapturePauseVdi(struct IAudioCapture *capture) { CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiCaptureLock); + AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->Pause == NULL) { @@ -693,6 +691,7 @@ int32_t AudioCaptureResumeVdi(struct IAudioCapture *capture) { CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiCaptureLock); + AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->Resume == NULL) { @@ -834,7 +833,7 @@ static uint32_t GetAvailableCaptureId(struct AudioCapturePrivVdi *capturePriv) capturePriv->captureCnt++; } else { for (uint32_t index = 0; index < AUDIO_VDI_STREAM_NUM_MAX; index++) { - if (capturePriv->captureInfos[index] == NULL) { + if (capturePriv->captureInfos[index].vdiCapture == NULL) { captureId = index; break; } @@ -862,29 +861,22 @@ struct IAudioCapture *AudioCreateCaptureByIdVdi(const struct AudioSampleAttribut return NULL; } - priv->captureInfos[*captureId] = (struct AudioCaptureInfo *)OsalMemCalloc(sizeof(struct AudioCaptureInfo)); - if (priv->captureInfos[*captureId] == NULL) { - AUDIO_FUNC_LOGE("audio Vdicapture malloc captureInfos fail"); - return NULL; - } - - priv->captureInfos[*captureId]->vdiCapture = vdiCapture; - priv->captureInfos[*captureId]->streamType = attrs->type; - priv->captureInfos[*captureId]->sampleRate = attrs->sampleRate; - priv->captureInfos[*captureId]->channelCount = attrs->channelCount; - priv->captureInfos[*captureId]->sourceType = attrs->sourceType; - priv->captureInfos[*captureId]->desc.portId = desc->portId; - priv->captureInfos[*captureId]->desc.pins = desc->pins; - priv->captureInfos[*captureId]->desc.desc = strdup(desc->desc); + priv->captureInfos[*captureId].vdiCapture = vdiCapture; + priv->captureInfos[*captureId].streamType = attrs->type; + priv->captureInfos[*captureId].sampleRate = attrs->sampleRate; + priv->captureInfos[*captureId].channelCount = attrs->channelCount; + priv->captureInfos[*captureId].sourceType = attrs->sourceType; + priv->captureInfos[*captureId].desc.portId = desc->portId; + priv->captureInfos[*captureId].desc.pins = desc->pins; + priv->captureInfos[*captureId].desc.desc = strdup(desc->desc); if (priv->captureInfos[*captureId]->desc.desc == NULL) { AUDIO_FUNC_LOGE("strdup fail, desc->desc = %{public}s", desc->desc); - OsalMemFree(priv->captureInfos[*captureId]); - priv->captureInfos[*captureId] = NULL; + AudioDestoryCaptureByIdVdi(*captureId); return NULL; } - priv->captureInfos[*captureId]->captureId = *captureId; - priv->captureInfos[*captureId]->usrCount = 1; - capture = &(priv->captureInfos[*captureId]->capture); + priv->captureInfos[*captureId].captureId = *captureId; + priv->captureInfos[*captureId].usrCount = 1; + capture = &(priv->captureInfos[*captureId].capture); AudioInitCaptureInstanceVdi(capture); AUDIO_FUNC_LOGD("audio create capture success"); @@ -904,8 +896,11 @@ uint32_t DecreaseCaptureUsrCount(uint32_t captureId) return usrCnt; } - priv->captureInfos[captureId]->usrCount--; - usrCnt = priv->captureInfos[captureId]->usrCount; + priv->captureInfos[captureId].usrCount--; + if (priv->captureInfos[captureId].usrCount < 0) { + priv->captureInfos[captureId].usrCount = 0; + } + usrCnt = priv->captureInfos[captureId].usrCount; return usrCnt; } @@ -916,19 +911,13 @@ void AudioDestroyCaptureByIdVdi(uint32_t captureId) return; } struct AudioCapturePrivVdi *priv = AudioCaptureGetPrivVdi(); - if (priv->captureInfos[captureId] == NULL) { - AUDIO_FUNC_LOGE("audio vdiCapture destroy capture index fail, captureId=%{public}d", captureId); - return; - } - OsalMemFree((void *)priv->captureInfos[captureId]->desc.desc); - priv->captureInfos[captureId]->vdiCapture = NULL; - priv->captureInfos[captureId]->desc.desc = NULL; - priv->captureInfos[captureId]->desc.portId = UINT_MAX; - priv->captureInfos[captureId]->desc.pins = PIN_NONE; - StubCollectorRemoveObject(IAUDIOCAPTURE_INTERFACE_DESC, &(priv->captureInfos[captureId]->capture)); + OsalMemFree((void *)priv->captureInfos[captureId].desc.desc); + priv->captureInfos[captureId].vdiCapture = NULL; + priv->captureInfos[captureId].desc.desc = NULL; + priv->captureInfos[captureId].desc.portId = UINT_MAX; + priv->captureInfos[captureId].desc.pins = PIN_NONE; + StubCollectorRemoveObject(IAUDIOCAPTURE_INTERFACE_DESC, &(priv->captureInfos[captureId].capture)); - OsalMemFree(priv->captureInfos[captureId]); - priv->captureInfos[captureId] = NULL; AUDIO_FUNC_LOGI("audio destroy capture success, captureId = [%{public}u]", captureId); } diff --git a/audio/hdi_service/primary_impl/vdi_src/audio_render_vdi.c b/audio/hdi_service/primary_impl/vdi_src/audio_render_vdi.c index 2bfc54210d..65a0ab4493 100644 --- a/audio/hdi_service/primary_impl/vdi_src/audio_render_vdi.c +++ b/audio/hdi_service/primary_impl/vdi_src/audio_render_vdi.c @@ -42,7 +42,7 @@ struct AudioRenderInfo { }; struct AudioRenderPrivVdi { - struct AudioRenderInfo *renderInfos[AUDIO_VDI_STREAM_NUM_MAX]; + struct AudioRenderInfo renderInfos[AUDIO_VDI_STREAM_NUM_MAX]; uint32_t renderCnt; }; @@ -61,12 +61,7 @@ pthread_rwlock_t* GetRenderLock(void) struct IAudioRenderVdi *AudioGetVdiRenderByIdVdi(uint32_t renderId) { struct AudioRenderPrivVdi *priv = AudioRenderGetPrivVdi(); - if (priv->renderInfos[renderId] == NULL) { - AUDIO_FUNC_LOGE("not match render"); - return NULL; - } - - return priv->renderInfos[renderId]->vdiRender; + return priv->renderInfos[renderId].vdiRender; } int32_t AudioGetLatencyVdi(struct IAudioRender *render, uint32_t *ms) @@ -95,6 +90,7 @@ int32_t AudioRenderFrameVdi(struct IAudioRender *render, const int8_t *frame, ui CHECK_NULL_PTR_RETURN_VALUE(frame, HDF_ERR_INVALID_PARAM); CHECK_NULL_PTR_RETURN_VALUE(replyBytes, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiRenderLock); + AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render; struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender; if (vdiRender == NULL || vdiRender->RenderFrame == NULL) { @@ -737,6 +733,7 @@ int32_t AudioRenderStartVdi(struct IAudioRender *render) AUDIO_FUNC_LOGI("hdi start enter"); CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiRenderLock); + AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render; struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender; if (vdiRender == NULL || vdiRender->Start == NULL) { @@ -763,6 +760,7 @@ int32_t AudioRenderStopVdi(struct IAudioRender *render) AUDIO_FUNC_LOGI("hdi stop enter"); CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiRenderLock); + AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render; struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender; if (vdiRender == NULL || vdiRender->Stop == NULL) { @@ -788,6 +786,7 @@ int32_t AudioRenderPauseVdi(struct IAudioRender *render) { CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiRenderLock); + AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render; struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender; if (vdiRender == NULL || vdiRender->Pause == NULL) { @@ -810,6 +809,7 @@ int32_t AudioRenderResumeVdi(struct IAudioRender *render) { CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiRenderLock); + AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render; struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender; if (vdiRender == NULL || vdiRender->Resume == NULL) { @@ -969,22 +969,20 @@ struct IAudioRender *FindRenderCreated(enum AudioPortPin pin, const struct Audio } for (index = 0; index < AUDIO_VDI_STREAM_NUM_MAX; index++) { - if ((renderPriv->renderInfos[index] != NULL) && - (attrs->type == AUDIO_IN_MEDIA || attrs->type == AUDIO_MULTI_CHANNEL) && - (renderPriv->renderInfos[index]->streamType == attrs->type) && - (strcmp(renderPriv->renderInfos[index]->adapterName, adapterName) == 0)) { - *rendrId = renderPriv->renderInfos[index]->renderId; - renderPriv->renderInfos[index]->usrCount++; - return &renderPriv->renderInfos[index]->render; + if ((attrs->type == AUDIO_IN_MEDIA || attrs->type == AUDIO_MULTI_CHANNEL) && + (renderPriv->renderInfos[index].streamType == attrs->type) && + (strcmp(renderPriv->renderInfos[index].adapterName, adapterName) == 0)) { + *rendrId = renderPriv->renderInfos[index].renderId; + renderPriv->renderInfos[index].usrCount++; + return &renderPriv->renderInfos[index].render; } - if ((renderPriv->renderInfos[index] != NULL) && - (renderPriv->renderInfos[index]->desc.pins == pin) && - (renderPriv->renderInfos[index]->streamType == attrs->type) && - (renderPriv->renderInfos[index]->sampleRate == attrs->sampleRate) && - (renderPriv->renderInfos[index]->channelCount == attrs->channelCount)) { - *rendrId = renderPriv->renderInfos[index]->renderId; - renderPriv->renderInfos[index]->usrCount++; - return &renderPriv->renderInfos[index]->render; + if ((renderPriv->renderInfos[index].desc.pins == pin) && + (renderPriv->renderInfos[index].streamType == attrs->type) && + (renderPriv->renderInfos[index].sampleRate == attrs->sampleRate) && + (renderPriv->renderInfos[index].channelCount == attrs->channelCount)) { + *rendrId = renderPriv->renderInfos[index].renderId; + renderPriv->renderInfos[index].usrCount++; + return &renderPriv->renderInfos[index].render; } } @@ -1004,7 +1002,7 @@ static uint32_t GetAvailableRenderId(struct AudioRenderPrivVdi *renderPriv) renderPriv->renderCnt++; } else { for (uint32_t index = 0; index < AUDIO_VDI_STREAM_NUM_MAX; index++) { - if (renderPriv->renderInfos[index] == NULL) { + if (renderPriv->renderInfos[index].vdiRender == NULL) { renderId = index; break; } @@ -1032,34 +1030,25 @@ struct IAudioRender *AudioCreateRenderByIdVdi(const struct AudioSampleAttributes return NULL; } - priv->renderInfos[*renderId] = (struct AudioRenderInfo *)OsalMemCalloc(sizeof(struct AudioRenderInfo)); - if (priv->renderInfos[*renderId] == NULL) { - AUDIO_FUNC_LOGE("audio VdiRender malloc renderInfos fail"); - return NULL; - } - - priv->renderInfos[*renderId]->vdiRender = vdiRender; - priv->renderInfos[*renderId]->streamType = attrs->type; - priv->renderInfos[*renderId]->sampleRate = attrs->sampleRate; - priv->renderInfos[*renderId]->channelCount = attrs->channelCount; - priv->renderInfos[*renderId]->desc.portId = desc->portId; - priv->renderInfos[*renderId]->desc.pins = desc->pins; - priv->renderInfos[*renderId]->desc.desc = strdup(desc->desc); - if (priv->renderInfos[*renderId]->desc.desc == NULL) { + priv->renderInfos[*renderId].vdiRender = vdiRender; + priv->renderInfos[*renderId].streamType = attrs->type; + priv->renderInfos[*renderId].sampleRate = attrs->sampleRate; + priv->renderInfos[*renderId].channelCount = attrs->channelCount; + priv->renderInfos[*renderId].desc.portId = desc->portId; + priv->renderInfos[*renderId].desc.pins = desc->pins; + priv->renderInfos[*renderId].desc.desc = strdup(desc->desc); + if (priv->renderInfos[*renderId].desc.desc == NULL) { AUDIO_FUNC_LOGE("strdup fail, desc->desc = %{public}s", desc->desc); - OsalMemFree(priv->renderInfos[*renderId]); - priv->renderInfos[*renderId] = NULL; + AudioDestoryRenderByIdVdi(*renderId); return NULL; } - priv->renderInfos[*renderId]->renderId = *renderId; - priv->renderInfos[*renderId]->usrCount = 1; - priv->renderInfos[*renderId]->callback = NULL; - priv->renderInfos[*renderId]->isRegCb = false; - priv->renderInfos[*renderId]->adapterName = strdup(adapterName); - if (priv->renderInfos[*renderId]->adapterName == NULL) { - OsalMemFree(priv->renderInfos[*renderId]->desc.desc); - OsalMemFree(priv->renderInfos[*renderId]); - priv->renderInfos[*renderId] = NULL; + priv->renderInfos[*renderId].renderId = *renderId; + priv->renderInfos[*renderId].usrCount = 1; + priv->renderInfos[*renderId].callback = NULL; + priv->renderInfos[*renderId].isRegCb = false; + priv->renderInfos[*renderId].adapterName = strdup(adapterName); + if (priv->renderInfos[*renderId].adapterName == NULL) { + AudioDestoryRenderByIdVdi(*renderId); return NULL; } render = &(priv->renderInfos[*renderId]->render); @@ -1077,12 +1066,11 @@ uint32_t DecreaseRenderUsrCount(uint32_t renderId) return usrCnt; } struct AudioRenderPrivVdi *priv = AudioRenderGetPrivVdi(); - if (priv->renderInfos[renderId] == NULL) { - AUDIO_FUNC_LOGE("audio check render index fail, descIndex=%{public}d", renderId); - return usrCnt; - } - priv->renderInfos[renderId]->usrCount--; + priv->renderInfos[renderId].usrCount--; + if (priv->renderInfos[renderId].usrCount < 0) { + priv->renderInfos[renderId].usrCount = 0; + } usrCnt = priv->renderInfos[renderId]->usrCount; return usrCnt; } @@ -1094,22 +1082,16 @@ void AudioDestroyRenderByIdVdi(uint32_t renderId) return; } struct AudioRenderPrivVdi *priv = AudioRenderGetPrivVdi(); - if (priv->renderInfos[renderId] == NULL) { - AUDIO_FUNC_LOGE("audio vdiRender destroy render index fail, descIndex=%{public}d", renderId); - return; - } - OsalMemFree((void *)priv->renderInfos[renderId]->adapterName); - priv->renderInfos[renderId]->adapterName = NULL; - OsalMemFree((void *)priv->renderInfos[renderId]->desc.desc); - priv->renderInfos[renderId]->vdiRender = NULL; - priv->renderInfos[renderId]->desc.desc = NULL; - priv->renderInfos[renderId]->desc.portId = UINT_MAX; - priv->renderInfos[renderId]->desc.pins = PIN_NONE; - priv->renderInfos[renderId]->callback = NULL; - priv->renderInfos[renderId]->isRegCb = false; - StubCollectorRemoveObject(IAUDIORENDER_INTERFACE_DESC, &(priv->renderInfos[renderId]->render)); - OsalMemFree(priv->renderInfos[renderId]); - priv->renderInfos[renderId] = NULL; + OsalMemFree((void *)priv->renderInfos[renderId].adapterName); + priv->renderInfos[renderId].adapterName = NULL; + OsalMemFree((void *)priv->renderInfos[renderId].desc.desc); + priv->renderInfos[renderId].vdiRender = NULL; + priv->renderInfos[renderId].desc.desc = NULL; + priv->renderInfos[renderId].desc.portId = UINT_MAX; + priv->renderInfos[renderId].desc.pins = PIN_NONE; + priv->renderInfos[renderId].callback = NULL; + priv->renderInfos[renderId].isRegCb = false; + StubCollectorRemoveObject(IAUDIORENDER_INTERFACE_DESC, &(priv->renderInfos[renderId].render)); AUDIO_FUNC_LOGI("audio destroy render success, renderId = [%{public}u]", renderId); } diff --git a/audio/test/unittest/common/adapter/audio_adapter_multchannel_test.cpp b/audio/test/unittest/common/adapter/audio_adapter_multchannel_test.cpp index a99da81d60..96043d3a48 100644 --- a/audio/test/unittest/common/adapter/audio_adapter_multchannel_test.cpp +++ b/audio/test/unittest/common/adapter/audio_adapter_multchannel_test.cpp @@ -15,6 +15,8 @@ #include #include +#include +#include #include #include "hdf_dlist.h" #include "osal_mem.h" @@ -157,7 +159,7 @@ HWTEST_F(HdfAudioUtAdapterMultiTest, HdfAudioAdapterMultchannelCreateRenderIsval InitMultchannelAttrs(attrs); attrs.streamId = MULTICHANNEL_OUTPUT_STREAM_ID; int32_t ret = adapter_->CreateRender(adapter_, &devicedesc, &attrs, &render, &renderId_); - EXPECT_TRUE(ret == HDF_SUCCESS || ret == HDF_FAILURE); + EXPECT_TRUE(ret == HDF_SUCCESS || ret == HDF_FAILURE || ret == HDF_NOT_SUPPORT); ret = adapter_->DestroyRender(adapter_, renderId_); EXPECT_TRUE(ret == HDF_SUCCESS || ret == HDF_FAILURE || ret == HDF_ERR_INVALID_PARAM); } -- Gitee From a443abeba45edb57ed8f9e7f031d1f83037cde4a Mon Sep 17 00:00:00 2001 From: wanghongenaf Date: Sat, 19 Jul 2025 09:57:40 +0000 Subject: [PATCH 2/7] update audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c. Signed-off-by: wanghongenaf --- audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c b/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c index 61ef32982d..c132e0f123 100644 --- a/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c +++ b/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c @@ -199,7 +199,6 @@ static int32_t AudioCreateRenderVdi(struct IAudioAdapter *adapter, const struct char *adapterName = AudioGetAdapterNameVdi(adapter); pthread_rwlock_wrlock(GetRenderLock()); - AUDIO_FUNC_LOGI("testtest %{public}s, FindRenderCreated", __func__); *render = FindRenderCreated(desc->pins, attrs, renderId, adapterName); if (*render != NULL) { pthread_rwlock_unlock(GetRenderLock()); @@ -256,7 +255,6 @@ static int32_t AudioDestroyRenderVdi(struct IAudioAdapter *adapter, uint32_t ren goto EXIT; } pthread_rwlock_wrlock(GetRenderLock()); - AUDIO_FUNC_LOGI("testtest %{public}s, AudioGetVdiRenderByIdVdi", __func__); struct IAudioRenderVdi *vdiRender = AudioGetVdiRenderByIdVdi(renderId); if (vdiRender == NULL) { pthread_rwlock_unlock(GetRenderLock()); -- Gitee From 51cbe6879a0b6e46344736587f01676aa812ac3e Mon Sep 17 00:00:00 2001 From: wanghongenaf Date: Sat, 19 Jul 2025 10:51:45 +0000 Subject: [PATCH 3/7] update audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c. Signed-off-by: wanghongenaf --- .../primary_impl/vdi_src/audio_adapter_vdi.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c b/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c index c132e0f123..e08c19f034 100644 --- a/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c +++ b/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c @@ -256,15 +256,9 @@ static int32_t AudioDestroyRenderVdi(struct IAudioAdapter *adapter, uint32_t ren } pthread_rwlock_wrlock(GetRenderLock()); struct IAudioRenderVdi *vdiRender = AudioGetVdiRenderByIdVdi(renderId); - if (vdiRender == NULL) { + if (vdiRender == NULL || vdiAdapter->DestroyRender == NULL) { pthread_rwlock_unlock(GetRenderLock()); - AUDIO_FUNC_LOGE("vdiRender pointer is null"); - ret = HDF_ERR_INVALID_PARAM; - goto EXIT; - } - if (vdiAdapter->DestroyRender == NULL) { - pthread_rwlock_unlock(GetRenderLock()); - AUDIO_FUNC_LOGE("invalid param"); + AUDIO_FUNC_LOGE("invalid of vdiRender is param"); ret = HDF_ERR_INVALID_PARAM; goto EXIT; } -- Gitee From 271e9e3c4bc8a8f938de36d975ced9738dcc7575 Mon Sep 17 00:00:00 2001 From: wanghongenaf Date: Mon, 21 Jul 2025 11:33:16 +0000 Subject: [PATCH 4/7] update audio/test/unittest/common/adapter/audio_adapter_multchannel_test.cpp. Signed-off-by: wanghongenaf --- .../adapter/audio_adapter_multchannel_test.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/audio/test/unittest/common/adapter/audio_adapter_multchannel_test.cpp b/audio/test/unittest/common/adapter/audio_adapter_multchannel_test.cpp index 96043d3a48..1d357c69da 100644 --- a/audio/test/unittest/common/adapter/audio_adapter_multchannel_test.cpp +++ b/audio/test/unittest/common/adapter/audio_adapter_multchannel_test.cpp @@ -33,7 +33,7 @@ using namespace testing::ext; #define AUDIO_MULTCHANNEL_CHANNELLAYOUT 1551 #define MULTICHANNEL_OUTPUT_STREAM_ID 61 namespace { -static const uint32_t g_audioAdapterNumMax = 5; +static const uint32_t G_AUDIO_ADAPTER_NUM_MAX = 5; class HdfAudioUtAdapterMultiTest : public testing::Test { public: @@ -112,26 +112,26 @@ void HdfAudioUtAdapterMultiTest::InitDevDesc(struct AudioDeviceDescriptor &devDe void HdfAudioUtAdapterMultiTest::SetUp() { - uint32_t size = g_audioAdapterNumMax; + uint32_t size = G_AUDIO_ADAPTER_NUM_MAX; manager_ = IAudioManagerGet(false); ASSERT_NE(manager_, nullptr); adapterDescs_ = (struct AudioAdapterDescriptor *)OsalMemCalloc( - sizeof(struct AudioAdapterDescriptor) * (g_audioAdapterNumMax)); + sizeof(struct AudioAdapterDescriptor) * (G_AUDIO_ADAPTER_NUM_MAX)); ASSERT_NE(adapterDescs_, nullptr); ASSERT_EQ(HDF_SUCCESS, manager_->GetAllAdapters(manager_, adapterDescs_, &size)); - if (size > g_audioAdapterNumMax) { - ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax); - ASSERT_LT(size, g_audioAdapterNumMax); + if (size > G_AUDIO_ADAPTER_NUM_MAX) { + ReleaseAdapterDescs(&adapterDescs_, G_AUDIO_ADAPTER_NUM_MAX); + ASSERT_LT(size, G_AUDIO_ADAPTER_NUM_MAX); } if (manager_->LoadAdapter(manager_, &adapterDescs_[0], &adapter_) != HDF_SUCCESS) { - ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax); + ReleaseAdapterDescs(&adapterDescs_, G_AUDIO_ADAPTER_NUM_MAX); ASSERT_TRUE(false); } if (adapter_ == nullptr) { - ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax); + ReleaseAdapterDescs(&adapterDescs_, G_AUDIO_ADAPTER_NUM_MAX); ASSERT_TRUE(false); } } @@ -142,7 +142,7 @@ void HdfAudioUtAdapterMultiTest::TearDown() ASSERT_NE(adapter_, nullptr); manager_->UnloadAdapter(manager_, adapterDescs_[0].adapterName); - ReleaseAdapterDescs(&adapterDescs_, g_audioAdapterNumMax); + ReleaseAdapterDescs(&adapterDescs_, G_AUDIO_ADAPTER_NUM_MAX); adapter_ = nullptr; IAudioManagerRelease(manager_, false); manager_ = nullptr; -- Gitee From 87c46f0ddd1d857da3b4acdbeb9a9b1544ece999 Mon Sep 17 00:00:00 2001 From: wanghongenaf Date: Mon, 21 Jul 2025 11:58:32 +0000 Subject: [PATCH 5/7] update audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.c. Signed-off-by: wanghongenaf --- audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.c b/audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.c index 88adb70e5a..20e1c8c1e7 100644 --- a/audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.c +++ b/audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.c @@ -68,7 +68,6 @@ int32_t AudioCaptureFrameVdi(struct IAudioCapture *capture, int8_t *frame, uint3 CHECK_NULL_PTR_RETURN_VALUE(frameLen, HDF_ERR_INVALID_PARAM); CHECK_NULL_PTR_RETURN_VALUE(replyBytes, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiCaptureLock); - AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->CaptureFrame == NULL) { @@ -615,7 +614,6 @@ int32_t AudioCaptureStartVdi(struct IAudioCapture *capture) AUDIO_FUNC_LOGI("hdi start enter"); CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiCaptureLock); - AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->Start == NULL) { @@ -642,7 +640,6 @@ int32_t AudioCaptureStopVdi(struct IAudioCapture *capture) AUDIO_FUNC_LOGI("hdi stop enter"); CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiCaptureLock); - AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->Stop == NULL) { @@ -668,7 +665,6 @@ int32_t AudioCapturePauseVdi(struct IAudioCapture *capture) { CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiCaptureLock); - AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->Pause == NULL) { @@ -691,7 +687,6 @@ int32_t AudioCaptureResumeVdi(struct IAudioCapture *capture) { CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiCaptureLock); - AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->Resume == NULL) { -- Gitee From c3f0f2168f791a9eb5c78705333a623a388103c9 Mon Sep 17 00:00:00 2001 From: wanghongenaf Date: Mon, 21 Jul 2025 12:40:19 +0000 Subject: [PATCH 6/7] update audio/hdi_service/primary_impl/vdi_src/audio_render_vdi.c. Signed-off-by: wanghongenaf --- audio/hdi_service/primary_impl/vdi_src/audio_render_vdi.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/audio/hdi_service/primary_impl/vdi_src/audio_render_vdi.c b/audio/hdi_service/primary_impl/vdi_src/audio_render_vdi.c index 65a0ab4493..79ffd23593 100644 --- a/audio/hdi_service/primary_impl/vdi_src/audio_render_vdi.c +++ b/audio/hdi_service/primary_impl/vdi_src/audio_render_vdi.c @@ -90,7 +90,6 @@ int32_t AudioRenderFrameVdi(struct IAudioRender *render, const int8_t *frame, ui CHECK_NULL_PTR_RETURN_VALUE(frame, HDF_ERR_INVALID_PARAM); CHECK_NULL_PTR_RETURN_VALUE(replyBytes, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiRenderLock); - AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render; struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender; if (vdiRender == NULL || vdiRender->RenderFrame == NULL) { @@ -733,7 +732,6 @@ int32_t AudioRenderStartVdi(struct IAudioRender *render) AUDIO_FUNC_LOGI("hdi start enter"); CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiRenderLock); - AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render; struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender; if (vdiRender == NULL || vdiRender->Start == NULL) { @@ -760,7 +758,6 @@ int32_t AudioRenderStopVdi(struct IAudioRender *render) AUDIO_FUNC_LOGI("hdi stop enter"); CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiRenderLock); - AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render; struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender; if (vdiRender == NULL || vdiRender->Stop == NULL) { @@ -786,7 +783,6 @@ int32_t AudioRenderPauseVdi(struct IAudioRender *render) { CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiRenderLock); - AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render; struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender; if (vdiRender == NULL || vdiRender->Pause == NULL) { @@ -809,7 +805,6 @@ int32_t AudioRenderResumeVdi(struct IAudioRender *render) { CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiRenderLock); - AUDIO_FUNC_LOGI("testtest %{public}s", __func__); struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render; struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender; if (vdiRender == NULL || vdiRender->Resume == NULL) { -- Gitee From 3ee5e7fd3989b9adb47c0a8e0ae521d061318d9e Mon Sep 17 00:00:00 2001 From: wanghongenaf Date: Tue, 22 Jul 2025 01:26:41 +0000 Subject: [PATCH 7/7] update audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c. Signed-off-by: wanghongenaf --- audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c b/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c index e08c19f034..67bfacc5b5 100644 --- a/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c +++ b/audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c @@ -258,7 +258,7 @@ static int32_t AudioDestroyRenderVdi(struct IAudioAdapter *adapter, uint32_t ren struct IAudioRenderVdi *vdiRender = AudioGetVdiRenderByIdVdi(renderId); if (vdiRender == NULL || vdiAdapter->DestroyRender == NULL) { pthread_rwlock_unlock(GetRenderLock()); - AUDIO_FUNC_LOGE("invalid of vdiRender is param"); + AUDIO_FUNC_LOGE("invalid param or vdiRender pointer is null"); ret = HDF_ERR_INVALID_PARAM; goto EXIT; } -- Gitee