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 fc65a964e624d5a712aacbb29a88b1644a1f7305..47ebdf48f1edc4c3ee669999291f7d5ada634f40 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()); @@ -254,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()); @@ -292,9 +296,7 @@ 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()); @@ -375,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()); @@ -593,7 +594,6 @@ static int32_t AudioUpdateAudioRouteVdi(struct IAudioAdapter *adapter, } EXIT: - AudioCommonFreeVdiRouteVdi(&vdiRoute); pthread_rwlock_unlock(&g_rwAdapterLock); return ret; } 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 79ffd235939062cff02f912ca525631585dccc0d..02a8a459b44041371e30db2e3eff1e6096d1eed8 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,10 +58,32 @@ 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(); - 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) @@ -86,10 +108,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 +756,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) { @@ -964,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; } } @@ -997,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; } @@ -1025,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); @@ -1061,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; } @@ -1077,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); }