From 476bbbb3c5d1847808db5f02b5a77a9b9f1beaa5 Mon Sep 17 00:00:00 2001 From: wanghongen Date: Wed, 27 Aug 2025 15:17:35 +0800 Subject: [PATCH 1/3] =?UTF-8?q?audio=20crash=E9=97=AE=E9=A2=98(render)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wanghongen --- .../primary_impl/vdi_src/audio_adapter_vdi.c | 11 ++++---- .../primary_impl/vdi_src/audio_render_vdi.c | 28 +++++++++++++++++-- 2 files changed, 32 insertions(+), 7 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 fc65a964e6..2f115d135e 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 @@ -198,15 +198,14 @@ static int32_t AudioCreateRenderVdi(struct IAudioAdapter *adapter, const struct } char *adapterName = AudioGetAdapterNameVdi(adapter); - pthread_rwlock_wrlock(GetRenderLock()); *render = FindRenderCreated(desc->pins, attrs, renderId, adapterName); if (*render != NULL) { - pthread_rwlock_unlock(GetRenderLock()); AUDIO_FUNC_LOGE("already created"); ret = HDF_SUCCESS; goto EXIT; } struct IAudioRenderVdi *vdiRender = NULL; + pthread_rwlock_wrlock(GetRenderLock()); ret = CreateRenderPre(vdiAdapter, desc, attrs, renderId, &vdiRender); if (ret != HDF_SUCCESS) { pthread_rwlock_unlock(GetRenderLock()); @@ -269,12 +268,13 @@ static int32_t AudioDestroyRenderVdi(struct IAudioAdapter *adapter, uint32_t ren ret = HDF_FAILURE; goto EXIT; } - AudioDestroyRenderByIdVdi(renderId); pthread_rwlock_unlock(GetRenderLock()); + AudioDestroyRenderByIdVdi(renderId); EXIT: pthread_rwlock_unlock(&g_rwAdapterLock); return ret; } +pthread_rwlock_unlock(GetRenderLock()); static int32_t CreateCapturePre(struct IAudioAdapterVdi *vdiAdapter, struct IAudioCapture **capture, const struct AudioDeviceDescriptor *desc, const struct AudioSampleAttributes *attrs, uint32_t *captureId) @@ -298,16 +298,16 @@ static int32_t CreateCapturePre(struct IAudioAdapterVdi *vdiAdapter, struct IAud return HDF_ERR_INVALID_PARAM; } pthread_rwlock_wrlock(GetCaptureLock()); - int32_t id = SetTimer("Hdi:CreateCapture"); struct timeval startTime = AudioDfxSysEventGetTimeStamp(); int32_t ret = vdiAdapter->CreateCapture(vdiAdapter, &vdiDesc, &vdiAttrs, &vdiCapture); + int32_t id = SetTimer("Hdi:CreateCapture"); AudioDfxSysEventError("CreateCapture", startTime, TIME_THRESHOLD, ret); 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; + pthread_rwlock_unlock(GetCaptureLock()); } vdiCapture->AddAudioEffect = NULL; vdiCapture->RemoveAudioEffect = NULL; @@ -318,6 +318,7 @@ static int32_t CreateCapturePre(struct IAudioAdapterVdi *vdiAdapter, struct IAud (void)vdiAdapter->DestroyCapture(vdiAdapter, vdiCapture); pthread_rwlock_unlock(GetCaptureLock()); AUDIO_FUNC_LOGE("create audio capture failed"); + pthread_rwlock_unlock(GetCaptureLock()); return HDF_ERR_INVALID_PARAM; } pthread_rwlock_unlock(GetCaptureLock()); 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 79ffd23593..289e5b8eba 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 @@ -58,6 +58,22 @@ pthread_rwlock_t* GetRenderLock(void) return &g_rwVdiRenderLock; } +static int32_t CheckAudioRenderExist(struct IAudioRender *render) { + if (render == NULL) { + return HDF_FAILURE; + } + for (uint32_t index = 0; index < AUDIO_VDI_STREAM_NUM_MAX; index++) { + if (g_audioRenderPrivVdi.renderInfos[index] == NULL) { + continue; + } + struct IAudioRender *renderTemp = &(g_audioRenderPrivVdi.renderInfos[index] -> render); + if (render == renderTemp) { + return HDF_SUCCESS; + } + } + return HDF_FAILURE; +} + struct IAudioRenderVdi *AudioGetVdiRenderByIdVdi(uint32_t renderId) { struct AudioRenderPrivVdi *priv = AudioRenderGetPrivVdi(); @@ -86,10 +102,14 @@ int32_t AudioGetLatencyVdi(struct IAudioRender *render, uint32_t *ms) int32_t AudioRenderFrameVdi(struct IAudioRender *render, const int8_t *frame, uint32_t frameLen, uint64_t *replyBytes) { SetThreadPriority(); - CHECK_NULL_PTR_RETURN_VALUE(render, HDF_ERR_INVALID_PARAM); 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); + if (CheckAudioRenderExist(render) != HDF_SUCCESS) { + AUDIO_FUNC_LOGE("invalid render") + pthread_rwlock_unlock(&g_rwVdiRenderLock); + return HDF_ERR_INVALID_PARAM; + } struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render; struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender; if (vdiRender == NULL || vdiRender->RenderFrame == NULL) { @@ -730,8 +750,12 @@ int32_t AudioRenderGetFrameBufferSizeVdi(struct IAudioRender *render, uint64_t * 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); + if (CheckAudioRenderExist(render) != HDF_SUCCESS) { + AUDIO_FUNC_LOGE("invalid render") + pthread_rwlock_unlock(&g_rwVdiRenderLock); + return HDF_ERR_INVALID_PARAM; + } struct AudioRenderInfo *renderInfo = (struct AudioRenderInfo *)render; struct IAudioRenderVdi *vdiRender = renderInfo->vdiRender; if (vdiRender == NULL || vdiRender->Start == NULL) { -- Gitee From e64bef0cfd86cd9444c370f3b4a32fff34ee2b2e Mon Sep 17 00:00:00 2001 From: wanghongenaf Date: Wed, 27 Aug 2025 12:09:59 +0000 Subject: [PATCH 2/3] update audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c. Signed-off-by: wanghongenaf --- .../primary_impl/vdi_src/audio_adapter_vdi.c | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 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 2f115d135e..47ebdf48f1 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 @@ -253,14 +253,19 @@ static int32_t AudioDestroyRenderVdi(struct IAudioAdapter *adapter, uint32_t ren ret = HDF_ERR_INVALID_PARAM; goto EXIT; } - pthread_rwlock_wrlock(GetRenderLock()); + struct IAudioRenderVdi *vdiRender = AudioGetVdiRenderByIdVdi(renderId); - if (vdiRender == NULL || vdiAdapter->DestroyRender == NULL) { - pthread_rwlock_unlock(GetRenderLock()); - AUDIO_FUNC_LOGE("invalid param or vdiRender pointer is null"); + if (vdiRender == NULL) { + AUDIO_FUNC_LOGE("vdiRender pointer is null"); + ret = HDF_ERR_INVALID_PARAM; + goto EXIT; + } + if (vdiAdapter->DestroyRender == NULL) { + AUDIO_FUNC_LOGE("invalid param"); ret = HDF_ERR_INVALID_PARAM; goto EXIT; } + pthread_rwlock_wrlock(GetRenderLock()); ret = vdiAdapter->DestroyRender(vdiAdapter, vdiRender); if (ret != HDF_SUCCESS) { pthread_rwlock_unlock(GetRenderLock()); @@ -268,13 +273,12 @@ static int32_t AudioDestroyRenderVdi(struct IAudioAdapter *adapter, uint32_t ren ret = HDF_FAILURE; goto EXIT; } - pthread_rwlock_unlock(GetRenderLock()); AudioDestroyRenderByIdVdi(renderId); + pthread_rwlock_unlock(GetRenderLock()); EXIT: pthread_rwlock_unlock(&g_rwAdapterLock); return ret; } -pthread_rwlock_unlock(GetRenderLock()); static int32_t CreateCapturePre(struct IAudioAdapterVdi *vdiAdapter, struct IAudioCapture **capture, const struct AudioDeviceDescriptor *desc, const struct AudioSampleAttributes *attrs, uint32_t *captureId) @@ -292,22 +296,20 @@ static int32_t CreateCapturePre(struct IAudioAdapterVdi *vdiAdapter, struct IAud if (vdiAdapter == NULL || vdiAdapter->CreateCapture == NULL || vdiAdapter->DestroyCapture == NULL) { AUDIO_FUNC_LOGE("invalid param"); - if (vdiDesc.desc != NULL) { - OsalMemFree((viod *)vdiDesc.desc); - } + OsalMemFree((void *)vdiDesc.desc); return HDF_ERR_INVALID_PARAM; } pthread_rwlock_wrlock(GetCaptureLock()); + int32_t id = SetTimer("Hdi:CreateCapture"); struct timeval startTime = AudioDfxSysEventGetTimeStamp(); int32_t ret = vdiAdapter->CreateCapture(vdiAdapter, &vdiDesc, &vdiAttrs, &vdiCapture); - int32_t id = SetTimer("Hdi:CreateCapture"); AudioDfxSysEventError("CreateCapture", startTime, TIME_THRESHOLD, ret); 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; - pthread_rwlock_unlock(GetCaptureLock()); } vdiCapture->AddAudioEffect = NULL; vdiCapture->RemoveAudioEffect = NULL; @@ -318,7 +320,6 @@ static int32_t CreateCapturePre(struct IAudioAdapterVdi *vdiAdapter, struct IAud (void)vdiAdapter->DestroyCapture(vdiAdapter, vdiCapture); pthread_rwlock_unlock(GetCaptureLock()); AUDIO_FUNC_LOGE("create audio capture failed"); - pthread_rwlock_unlock(GetCaptureLock()); return HDF_ERR_INVALID_PARAM; } pthread_rwlock_unlock(GetCaptureLock()); @@ -376,14 +377,13 @@ 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); if (ret != HDF_SUCCESS) { pthread_rwlock_unlock(GetCaptureLock()); @@ -594,7 +594,6 @@ static int32_t AudioUpdateAudioRouteVdi(struct IAudioAdapter *adapter, } EXIT: - AudioCommonFreeVdiRouteVdi(&vdiRoute); pthread_rwlock_unlock(&g_rwAdapterLock); return ret; } -- Gitee From 3ea67e98168e6d80340036cf1b0afb05b8bb7335 Mon Sep 17 00:00:00 2001 From: wanghongenaf Date: Wed, 27 Aug 2025 12:14:37 +0000 Subject: [PATCH 3/3] update audio/hdi_service/primary_impl/vdi_src/audio_render_vdi.c. Signed-off-by: wanghongenaf --- .../primary_impl/vdi_src/audio_render_vdi.c | 124 +++++++++++------- 1 file changed, 74 insertions(+), 50 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 289e5b8eba..02a8a459b4 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; }; @@ -58,7 +58,8 @@ pthread_rwlock_t* GetRenderLock(void) return &g_rwVdiRenderLock; } -static int32_t CheckAudioRenderExist(struct IAudioRender *render) { +static int32_t CheckAudioRenderExist(struct IAudioRender *render) +{ if (render == NULL) { return HDF_FAILURE; } @@ -66,7 +67,7 @@ static int32_t CheckAudioRenderExist(struct IAudioRender *render) { if (g_audioRenderPrivVdi.renderInfos[index] == NULL) { continue; } - struct IAudioRender *renderTemp = &(g_audioRenderPrivVdi.renderInfos[index] -> render); + struct IAudioRender *renderTemp = &(g_audioRenderPrivVdi.renderInfos[index]->render); if (render == renderTemp) { return HDF_SUCCESS; } @@ -77,7 +78,12 @@ static int32_t CheckAudioRenderExist(struct IAudioRender *render) { struct IAudioRenderVdi *AudioGetVdiRenderByIdVdi(uint32_t renderId) { struct AudioRenderPrivVdi *priv = AudioRenderGetPrivVdi(); - return priv->renderInfos[renderId].vdiRender; + if (priv->renderInfos[renderId] == NULL) { + AUDIO_FUNC_LOGE("not match render"); + return NULL; + } + + return priv->renderInfos[renderId]->vdiRender; } int32_t AudioGetLatencyVdi(struct IAudioRender *render, uint32_t *ms) @@ -106,7 +112,7 @@ int32_t AudioRenderFrameVdi(struct IAudioRender *render, const int8_t *frame, ui CHECK_NULL_PTR_RETURN_VALUE(replyBytes, HDF_ERR_INVALID_PARAM); pthread_rwlock_rdlock(&g_rwVdiRenderLock); if (CheckAudioRenderExist(render) != HDF_SUCCESS) { - AUDIO_FUNC_LOGE("invalid render") + AUDIO_FUNC_LOGE("invalid render"); pthread_rwlock_unlock(&g_rwVdiRenderLock); return HDF_ERR_INVALID_PARAM; } @@ -752,7 +758,7 @@ int32_t AudioRenderStartVdi(struct IAudioRender *render) AUDIO_FUNC_LOGI("hdi start enter"); pthread_rwlock_rdlock(&g_rwVdiRenderLock); if (CheckAudioRenderExist(render) != HDF_SUCCESS) { - AUDIO_FUNC_LOGE("invalid render") + AUDIO_FUNC_LOGE("invalid render"); pthread_rwlock_unlock(&g_rwVdiRenderLock); return HDF_ERR_INVALID_PARAM; } @@ -988,20 +994,22 @@ struct IAudioRender *FindRenderCreated(enum AudioPortPin pin, const struct Audio } for (index = 0; index < AUDIO_VDI_STREAM_NUM_MAX; index++) { - 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) && + (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].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] != 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; } } @@ -1021,7 +1029,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].vdiRender == NULL) { + if (renderPriv->renderInfos[index] == NULL) { renderId = index; break; } @@ -1049,25 +1057,34 @@ struct IAudioRender *AudioCreateRenderByIdVdi(const struct AudioSampleAttributes 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] = (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) { AUDIO_FUNC_LOGE("strdup fail, desc->desc = %{public}s", desc->desc); - AudioDestoryRenderByIdVdi(*renderId); + OsalMemFree(priv->renderInfos[*renderId]); + priv->renderInfos[*renderId] = NULL; 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) { - AudioDestoryRenderByIdVdi(*renderId); + 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; return NULL; } render = &(priv->renderInfos[*renderId]->render); @@ -1085,11 +1102,12 @@ uint32_t DecreaseRenderUsrCount(uint32_t renderId) return usrCnt; } struct AudioRenderPrivVdi *priv = AudioRenderGetPrivVdi(); - - priv->renderInfos[renderId].usrCount--; - if (priv->renderInfos[renderId].usrCount < 0) { - priv->renderInfos[renderId].usrCount = 0; + if (priv->renderInfos[renderId] == NULL) { + AUDIO_FUNC_LOGE("audio check render index fail, descIndex=%{public}d", renderId); + return usrCnt; } + + priv->renderInfos[renderId]->usrCount--; usrCnt = priv->renderInfos[renderId]->usrCount; return usrCnt; } @@ -1101,16 +1119,22 @@ 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((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; AUDIO_FUNC_LOGI("audio destroy render success, renderId = [%{public}u]", renderId); } -- Gitee