From 259f733844ec19eab195a074d1af0b22bfe22e44 Mon Sep 17 00:00:00 2001 From: pxd2022 Date: Sun, 7 Sep 2025 10:59:58 +0000 Subject: [PATCH 1/5] update audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.c. Signed-off-by: pxd2022 --- .../primary_impl/vdi_src/audio_capture_vdi.c | 645 +++++++++++++++--- 1 file changed, 539 insertions(+), 106 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 20e1c8c1e7..a8344920cd 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Huawei Device Co., Ltd. + * Copyright (c) 2023-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -25,7 +25,11 @@ #include "stub_collector.h" #define HDF_LOG_TAG HDF_AUDIO_PRIMARY_IMPL -static pthread_rwlock_t g_rwVdiCaptureLock = PTHREAD_RWLOCK_INITIALIZER; +static pthread_rwlock_t g_rwVdiCaptureLock[AUDIO_VDI_STREAM_NUM_MAX] = {PTHREAD_RWLOCK_INITIALIZER, + PTHREAD_RWLOCK_INITIALIZER, PTHREAD_RWLOCK_INITIALIZER, PTHREAD_RWLOCK_INITIALIZER, PTHREAD_RWLOCK_INITIALIZER, + PTHREAD_RWLOCK_INITIALIZER, PTHREAD_RWLOCK_INITIALIZER, PTHREAD_RWLOCK_INITIALIZER, PTHREAD_RWLOCK_INITIALIZER, + PTHREAD_RWLOCK_INITIALIZER}; + struct AudioCaptureInfo { struct IAudioCapture capture; struct AudioDeviceDescriptor desc; @@ -43,19 +47,19 @@ struct AudioCapturePrivVdi { uint32_t captureCnt; }; -static struct AudioCapturePrivVdi g_audioCapturePrivVdi; +static struct AudioCapturePrivVdi ,,,,,,,,,,,,,,,,,,,,,,,, ; -static struct AudioCapturePrivVdi *AudioCaptureGetPrivVdi(void) +static struct AudioCapturePrivVdi *AudioCaptureGetPrivVdi() { return &g_audioCapturePrivVdi; } -pthread_rwlock_t* GetCaptureLock(void) +pthread_rwlock_t *GetCaptureLock(uint32_t index) { - return &g_rwVdiCaptureLock; + return &g_rwVdiCaptureLock[index]; } -struct IAudioCaptureVdi *AudioGetVdiCaptureByIdVdi(uint32_t captureId) +struct IAudioCaptureVdi *AudioGetVdiCaptureByIdVdi(uint....32_t captureId) { return g_audioCapturePrivVdi.captureInfos[captureId].vdiCapture; } @@ -67,15 +71,25 @@ int32_t AudioCaptureFrameVdi(struct IAudioCapture *capture, int8_t *frame, uint3 CHECK_NULL_PTR_RETURN_VALUE(frame, HDF_ERR_INVALID_PARAM); 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); + struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->CaptureFrame == NULL) { AUDIO_FUNC_LOGE("invalid param"); - pthread_rwlock_unlock(&g_rwVdiCaptureLock); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); return HDF_ERR_INVALID_PARAM; } - HdfAudioStartTrace("Hdi:AudioCaptureFrameVdi", 0); struct timeval startTime = AudioDfxSysEventGetTimeStamp(); int32_t ret = vdiCapture->CaptureFrame(vdiCapture, frame, frameLen, replyBytes); @@ -83,10 +97,10 @@ int32_t AudioCaptureFrameVdi(struct IAudioCapture *capture, int8_t *frame, uint3 HdfAudioFinishTrace(); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture frame fail, ret=%{public}d", ret); - pthread_rwlock_unlock(&g_rwVdiCaptureLock); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); return ret; } - pthread_rwlock_unlock(&g_rwVdiCaptureLock); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); return HDF_SUCCESS; } @@ -136,13 +150,28 @@ int32_t AudioGetCapturePositionVdi(struct IAudioCapture *capture, uint64_t *fram CHECK_NULL_PTR_RETURN_VALUE(time, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->GetCapturePosition, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->GetCapturePosition == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } HdfAudioStartTrace("Hdi:AudioGetCapturePositionVdi", 0); int32_t ret = vdiCapture->GetCapturePosition(vdiCapture, frames, (struct AudioTimeStampVdi *)time); HdfAudioFinishTrace(); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture get position fail, ret=%{public}d", ret); return ret; @@ -159,20 +188,36 @@ int32_t AudioCaptureCheckSceneCapabilityVdi(struct IAudioCapture *capture, const CHECK_NULL_PTR_RETURN_VALUE(supported, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->CheckSceneCapability, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->CheckSceneCapability == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } struct AudioSceneDescriptorVdi vdiScene; (void)memset_s((void *)&vdiScene, sizeof(vdiScene), 0, sizeof(vdiScene)); int32_t ret = AudioCommonSceneToVdiSceneVdi(scene, &vdiScene); if (ret != HDF_SUCCESS) { + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); AUDIO_FUNC_LOGE("audio capture scene To vdiScene fail"); return HDF_FAILURE; } ret = vdiCapture->CheckSceneCapability(vdiCapture, &vdiScene, supported); OsalMemFree((void *)vdiScene.desc.desc); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture CheckSceneCapability fail, ret=%{public}d", ret); return ret; @@ -187,14 +232,29 @@ int32_t AudioCaptureSelectSceneVdi(struct IAudioCapture *capture, const struct A CHECK_NULL_PTR_RETURN_VALUE(scene, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->SelectScene, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->SelectScene == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } struct AudioSceneDescriptorVdi vdiScene; (void)memset_s((void *)&vdiScene, sizeof(vdiScene), 0, sizeof(vdiScene)); int32_t ret = AudioCommonSceneToVdiSceneVdi(scene, &vdiScene); if (ret != HDF_SUCCESS) { + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); AUDIO_FUNC_LOGE("audio vdiAdapter scene To vdiScene fail"); return HDF_FAILURE; } @@ -202,6 +262,7 @@ int32_t AudioCaptureSelectSceneVdi(struct IAudioCapture *capture, const struct A int32_t id = SetTimer("Hdi:SelectScene"); ret = vdiCapture->SelectScene(vdiCapture, &vdiScene); CancelTimer(id); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); OsalMemFree((void *)vdiScene.desc.desc); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture select scene fail, ret=%{public}d", ret); @@ -216,11 +277,26 @@ int32_t AudioCaptureSetMuteVdi(struct IAudioCapture *capture, bool mute) CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->SetMute, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->SetMute == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->SetMute(vdiCapture, mute); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture SetMute fail, ret=%{public}d", ret); return ret; @@ -235,11 +311,26 @@ int32_t AudioCaptureGetMuteVdi(struct IAudioCapture *capture, bool *mute) CHECK_NULL_PTR_RETURN_VALUE(mute, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->GetMute, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->GetMute == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->GetMute(vdiCapture, mute); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture GetMute fail, ret=%{public}d", ret); return ret; @@ -253,11 +344,26 @@ int32_t AudioCaptureSetVolumeVdi(struct IAudioCapture *capture, float volume) CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->SetVolume, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->SetVolume == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->SetVolume(vdiCapture, volume); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture SetVolume fail, ret=%{public}d", ret); return ret; @@ -272,11 +378,26 @@ int32_t AudioCaptureGetVolumeVdi(struct IAudioCapture *capture, float *volume) CHECK_NULL_PTR_RETURN_VALUE(volume, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->GetVolume, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->GetVolume == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->GetVolume(vdiCapture, volume); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture GetVolume fail, ret=%{public}d", ret); return ret; @@ -292,11 +413,25 @@ int32_t AudioCaptureGetGainThresholdVdi(struct IAudioCapture *capture, float *mi CHECK_NULL_PTR_RETURN_VALUE(max, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->GetGainThreshold, HDF_ERR_INVALID_PARAM); - + if (vdiCapture == NULL || vdiCapture->GetGainThreshold == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->GetGainThreshold(vdiCapture, min, max); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture GetGainThreshold fail, ret=%{public}d", ret); return ret; @@ -311,11 +446,26 @@ int32_t AudioCaptureGetGainVdi(struct IAudioCapture *capture, float *gain) CHECK_NULL_PTR_RETURN_VALUE(gain, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->GetGain, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->GetGain == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->GetGain(vdiCapture, gain); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture GetGain fail, ret=%{public}d", ret); return ret; @@ -329,11 +479,26 @@ int32_t AudioCaptureSetGainVdi(struct IAudioCapture *capture, float gain) CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->SetGain, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->SetGain == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->SetGain(vdiCapture, gain); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture SetGain fail, ret=%{public}d", ret); return ret; @@ -348,11 +513,26 @@ int32_t AudioCaptureGetFrameSizeVdi(struct IAudioCapture *capture, uint64_t *siz CHECK_NULL_PTR_RETURN_VALUE(size, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->GetFrameSize, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->GetFrameSize == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->GetFrameSize(vdiCapture, size); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture GetFrameSize fail, ret=%{public}d", ret); return ret; @@ -367,11 +547,26 @@ int32_t AudioCaptureGetFrameCountVdi(struct IAudioCapture *capture, uint64_t *co CHECK_NULL_PTR_RETURN_VALUE(count, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->GetFrameCount, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->GetFrameCount == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->GetFrameCount(vdiCapture, count); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture GetFrameCount fail, ret=%{public}d", ret); return ret; @@ -386,19 +581,35 @@ int32_t AudioCaptureSetSampleAttributesVdi(struct IAudioCapture *capture, const CHECK_NULL_PTR_RETURN_VALUE(attrs, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->SetSampleAttributes, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->SetSampleAttributes == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } struct AudioSampleAttributesVdi vdiAttrs; (void)memset_s((void *)&vdiAttrs, sizeof(vdiAttrs), 0, sizeof(vdiAttrs)); int32_t ret = AudioCommonSampleAttrToVdiSampleAttrVdi(attrs, &vdiAttrs); if (ret != HDF_SUCCESS) { + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); AUDIO_FUNC_LOGE("audio capture SampleAttr to vdisampleAttr fail, ret=%{public}d", ret); return ret; } ret = vdiCapture->SetSampleAttributes(vdiCapture, &vdiAttrs); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture SetSampleAttributes fail, ret=%{public}d", ret); return ret; @@ -413,13 +624,28 @@ int32_t AudioCaptureGetSampleAttributesVdi(struct IAudioCapture *capture, struct CHECK_NULL_PTR_RETURN_VALUE(attrs, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->GetSampleAttributes, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->GetSampleAttributes == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } struct AudioSampleAttributesVdi vdiAttrs; (void)memset_s((void *)&vdiAttrs, sizeof(vdiAttrs), 0, sizeof(vdiAttrs)); int32_t ret = vdiCapture->GetSampleAttributes(vdiCapture, &vdiAttrs); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture GetSampleAttributes fail, ret=%{public}d", ret); return ret; @@ -440,11 +666,26 @@ int32_t AudioCaptureGetCurrentChannelIdVdi(struct IAudioCapture *capture, uint32 CHECK_NULL_PTR_RETURN_VALUE(channelId, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->GetCurrentChannelId, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->GetCurrentChannelId == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->GetCurrentChannelId(vdiCapture, channelId); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture GetCurrentChannelId fail, ret=%{public}d", ret); return ret; @@ -459,11 +700,26 @@ int32_t AudioCaptureSetExtraParamsVdi(struct IAudioCapture *capture, const char CHECK_NULL_PTR_RETURN_VALUE(keyValueList, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->SetExtraParams, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->SetExtraParams == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->SetExtraParams(vdiCapture, keyValueList); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture SetExtraParams fail, ret=%{public}d", ret); return ret; @@ -478,11 +734,26 @@ int32_t AudioCaptureGetExtraParamsVdi(struct IAudioCapture *capture, char *keyVa CHECK_NULL_PTR_RETURN_VALUE(keyValueList, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->GetExtraParams, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->GetExtraParams == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->GetExtraParams(vdiCapture, keyValueList, keyValueListLen); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture GetExtraParams fail, ret=%{public}d", ret); return ret; @@ -498,12 +769,27 @@ int32_t AudioCaptureReqMmapBufferVdi(struct IAudioCapture *capture, int32_t reqS CHECK_NULL_PTR_RETURN_VALUE(desc, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->ReqMmapBuffer, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->ReqMmapBuffer == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } struct AudioMmapBufferDescriptorVdi vdiDesc = {0}; int32_t ret = vdiCapture->ReqMmapBuffer(vdiCapture, reqSize, &vdiDesc); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture ReqMmapBuffer fail, ret=%{pubilc}d", ret); return ret; @@ -538,11 +824,26 @@ int32_t AudioCaptureGetMmapPositionVdi(struct IAudioCapture *capture, uint64_t * vdiTime.tvNSec = 0; struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->GetMmapPosition, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->GetMmapPosition == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->GetMmapPosition(vdiCapture, frames, &vdiTime); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture GetMmapPosition fail, ret=%{public}d", ret); return ret; @@ -559,11 +860,26 @@ int32_t AudioCaptureAddAudioEffectVdi(struct IAudioCapture *capture, uint64_t ef CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->AddAudioEffect, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->AddAudioEffect == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->AddAudioEffect(vdiCapture, effectid); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture AddAudioEffect fail, ret=%{public}d", ret); return ret; @@ -577,11 +893,26 @@ int32_t AudioCaptureRemoveAudioEffectVdi(struct IAudioCapture *capture, uint64_t CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->RemoveAudioEffect, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->RemoveAudioEffect == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->RemoveAudioEffect(vdiCapture, effectid); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture RemoveAudioEffect fail, ret=%{public}d", ret); return ret; @@ -596,11 +927,26 @@ int32_t AudioCaptureGetFrameBufferSizeVdi(struct IAudioCapture *capture, uint64_ CHECK_NULL_PTR_RETURN_VALUE(bufferSize, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->GetFrameBufferSize, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->GetFrameBufferSize == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->GetFrameBufferSize(vdiCapture, bufferSize); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture GetFrameBufferSize fail, ret=%{public}d", ret); return ret; @@ -613,12 +959,22 @@ 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); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->Start == NULL) { AUDIO_FUNC_LOGE("invalid param"); - pthread_rwlock_unlock(&g_rwVdiCaptureLock); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); return HDF_ERR_INVALID_PARAM; } HdfAudioStartTrace("Hdi:AudioCaptureStartVdi", 0); @@ -626,12 +982,11 @@ int32_t AudioCaptureStartVdi(struct IAudioCapture *capture) int32_t ret = vdiCapture->Start(vdiCapture); AudioDfxSysEventError("Capture Start", startTime, TIME_THRESHOLD, ret); HdfAudioFinishTrace(); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture Start fail, ret=%{public}d", ret); - pthread_rwlock_unlock(&g_rwVdiCaptureLock); return ret; } - pthread_rwlock_unlock(&g_rwVdiCaptureLock); return HDF_SUCCESS; } @@ -639,12 +994,22 @@ 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); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->Stop == NULL) { AUDIO_FUNC_LOGE("invalid param"); - pthread_rwlock_unlock(&g_rwVdiCaptureLock); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); return HDF_ERR_INVALID_PARAM; } HdfAudioStartTrace("Hdi:AudioCaptureStopVdi", 0); @@ -652,56 +1017,71 @@ int32_t AudioCaptureStopVdi(struct IAudioCapture *capture) int32_t ret = vdiCapture->Stop(vdiCapture); AudioDfxSysEventError("Capture Stop", startTime, TIME_THRESHOLD, ret); HdfAudioFinishTrace(); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture Stop fail, ret=%{public}d", ret); - pthread_rwlock_unlock(&g_rwVdiCaptureLock); return HDF_ERR_NOT_SUPPORT; } - pthread_rwlock_unlock(&g_rwVdiCaptureLock); return HDF_SUCCESS; } int32_t AudioCapturePauseVdi(struct IAudioCapture *capture) { CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); - pthread_rwlock_rdlock(&g_rwVdiCaptureLock); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->Pause == NULL) { AUDIO_FUNC_LOGE("invalid param"); - pthread_rwlock_unlock(&g_rwVdiCaptureLock); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); return HDF_ERR_INVALID_PARAM; } - int32_t ret = vdiCapture->Pause(vdiCapture); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture Pause fail, ret=%{public}d", ret); - pthread_rwlock_unlock(&g_rwVdiCaptureLock); return ret; } - pthread_rwlock_unlock(&g_rwVdiCaptureLock); return HDF_SUCCESS; } int32_t AudioCaptureResumeVdi(struct IAudioCapture *capture) { CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); - pthread_rwlock_rdlock(&g_rwVdiCaptureLock); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; if (vdiCapture == NULL || vdiCapture->Resume == NULL) { AUDIO_FUNC_LOGE("invalid param"); - pthread_rwlock_unlock(&g_rwVdiCaptureLock); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); return HDF_ERR_INVALID_PARAM; } - int32_t ret = vdiCapture->Resume(vdiCapture); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture Resume fail, ret=%{public}d", ret); - pthread_rwlock_unlock(&g_rwVdiCaptureLock); return ret; } - pthread_rwlock_unlock(&g_rwVdiCaptureLock); return HDF_SUCCESS; } @@ -710,12 +1090,27 @@ int32_t AudioCaptureFlushVdi(struct IAudioCapture *capture) CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->Flush, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->Flush == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->Flush(vdiCapture); if (ret != HDF_SUCCESS) { + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); AUDIO_FUNC_LOGE("audio capture Flush fail, ret=%{public}d", ret); return ret; } @@ -728,11 +1123,26 @@ int32_t AudioCaptureTurnStandbyModeVdi(struct IAudioCapture *capture) CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->TurnStandbyMode, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->TurnStandbyMode == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->TurnStandbyMode(vdiCapture); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture TurnStandbyMode fail, ret=%{public}d", ret); return ret; @@ -746,11 +1156,26 @@ int32_t AudioCaptureAudioDevDumpVdi(struct IAudioCapture *capture, int32_t range CHECK_NULL_PTR_RETURN_VALUE(capture, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->AudioDevDump, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->AudioDevDump == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->AudioDevDump(vdiCapture, range, fd); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture AudioDevDump fail, ret=%{public}d", ret); return ret; @@ -766,11 +1191,26 @@ int32_t AudioCaptureIsSupportsPauseAndResumeVdi(struct IAudioCapture *capture, b CHECK_NULL_PTR_RETURN_VALUE(supportResume, HDF_ERR_INVALID_PARAM); struct AudioCaptureInfo *captureInfo = (struct AudioCaptureInfo *)(capture); + uint32_t captureId = captureInfo->captureId; + if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + if (capture != &(g_audioCapturePrivVdi.captureInfos[captureId].capture)) { + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[captureId]); + AUDIO_FUNC_LOGE("invalid param"); + return HDF_ERR_INVALID_PARAM; + } struct IAudioCaptureVdi *vdiCapture = captureInfo->vdiCapture; - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture, HDF_ERR_INVALID_PARAM); - CHECK_NULL_PTR_RETURN_VALUE(vdiCapture->IsSupportsPauseAndResume, HDF_ERR_INVALID_PARAM); + if (vdiCapture == NULL || vdiCapture->IsSupportsPauseAndResume == NULL) { + AUDIO_FUNC_LOGE("invalid param"); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); + return HDF_ERR_INVALID_PARAM; + } int32_t ret = vdiCapture->IsSupportsPauseAndResume(vdiCapture, supportPause, supportResume); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[captureId]); if (ret != HDF_SUCCESS) { AUDIO_FUNC_LOGE("audio capture IsSupportsPauseAndResume fail, ret=%{public}d", ret); return ret; @@ -855,7 +1295,12 @@ struct IAudioCapture *AudioCreateCaptureByIdVdi(const struct AudioSampleAttribut AUDIO_FUNC_LOGE("audio vdicapture capture capture index fail, captureId=%{public}d", *captureId); return NULL; } - + pthread_rwlock_rdlock(&g_rwVdiCaptureLock[*captureId]); + if (priv->captureInfos[*captureId].vdiCapture != NULL) { + pthread_rwlock_unlock(&g_rwVdiCaptureLock[*captureId]); + AUDIO_FUNC_LOGE("vdiCapture already exist %{public}u", *captureId); + return NULL; + } priv->captureInfos[*captureId].vdiCapture = vdiCapture; priv->captureInfos[*captureId].streamType = attrs->type; priv->captureInfos[*captureId].sampleRate = attrs->sampleRate; @@ -866,39 +1311,20 @@ struct IAudioCapture *AudioCreateCaptureByIdVdi(const struct AudioSampleAttribut 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); - AudioDestoryCaptureByIdVdi(*captureId); + AudioDestroyCaptureByIdVdi(*captureId); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[*captureId]); return NULL; } priv->captureInfos[*captureId].captureId = *captureId; priv->captureInfos[*captureId].usrCount = 1; capture = &(priv->captureInfos[*captureId].capture); AudioInitCaptureInstanceVdi(capture); + pthread_rwlock_unlock(&g_rwVdiCaptureLock[*captureId]); AUDIO_FUNC_LOGD("audio create capture success"); return capture; }; -uint32_t DecreaseCaptureUsrCount(uint32_t captureId) -{ - uint32_t usrCnt = 0; - if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { - AUDIO_FUNC_LOGE("audio check capture index fail, descIndex=%{public}d", captureId); - return usrCnt; - } - struct AudioCapturePrivVdi *priv = AudioCaptureGetPrivVdi(); - if (priv->captureInfos[captureId] == NULL) { - AUDIO_FUNC_LOGE("audio check capture index fail, descIndex=%{public}d", captureId); - return usrCnt; - } - - priv->captureInfos[captureId].usrCount--; - if (priv->captureInfos[captureId].usrCount < 0) { - priv->captureInfos[captureId].usrCount = 0; - } - usrCnt = priv->captureInfos[captureId].usrCount; - return usrCnt; -} - void AudioDestroyCaptureByIdVdi(uint32_t captureId) { if (captureId >= AUDIO_VDI_STREAM_NUM_MAX) { @@ -912,6 +1338,13 @@ void AudioDestroyCaptureByIdVdi(uint32_t captureId) priv->captureInfos[captureId].desc.desc = NULL; priv->captureInfos[captureId].desc.portId = UINT_MAX; priv->captureInfos[captureId].desc.pins = PIN_NONE; + priv->captureInfos[captureId].streamType = 0; + priv->captureInfos[captureId].sampleRate = 0; + priv->captureInfos[captureId].channelCount = 0; + priv->captureInfos[captureId].sourceType = 0; + priv->captureInfos[captureId].captureId = AUDIO_VDI_STREAM_NUM_MAX; + priv->captureInfos[captureId].usrCount = 0; + StubCollectorRemoveObject(IAUDIOCAPTURE_INTERFACE_DESC, &(priv->captureInfos[captureId].capture)); AUDIO_FUNC_LOGI("audio destroy capture success, captureId = [%{public}u]", captureId); -- Gitee From 9906a89eed9f2429c56a6ed49e2c9bc0a8e1e9aa Mon Sep 17 00:00:00 2001 From: pxd2022 Date: Sun, 7 Sep 2025 11:00:24 +0000 Subject: [PATCH 2/5] update audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.h. Signed-off-by: pxd2022 --- audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.h b/audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.h index 555eec6637..9b381fef2f 100644 --- a/audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.h +++ b/audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.h @@ -20,7 +20,7 @@ #include "v5_0/iaudio_capture.h" #include -pthread_rwlock_t* GetCaptureLock(void); +pthread_rwlock_t* GetCaptureLock(uint32_t index); struct IAudioCapture *AudioCreateCaptureByIdVdi(const struct AudioSampleAttributes *attrs, uint32_t *captureId, struct IAudioCaptureVdi *vdiCapture, const struct AudioDeviceDescriptor *desc); void AudioDestroyCaptureByIdVdi(uint32_t captureId); -- Gitee From 9c4730a0a503266ef835026e3b21e5b54a30bbf7 Mon Sep 17 00:00:00 2001 From: pxd2022 Date: Sun, 7 Sep 2025 11:01:53 +0000 Subject: [PATCH 3/5] update audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c. Signed-off-by: pxd2022 --- .../primary_impl/vdi_src/audio_adapter_vdi.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 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..4c527d34b0 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Huawei Device Co., Ltd. + * Copyright (c) 2023-2025 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -297,7 +297,6 @@ 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); @@ -305,7 +304,6 @@ static int32_t CreateCapturePre(struct IAudioAdapterVdi *vdiAdapter, struct IAud 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; } @@ -316,11 +314,9 @@ 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; } @@ -357,16 +353,11 @@ static int32_t AudioDestroyCaptureVdi(struct IAudioAdapter *adapter, uint32_t ca ret = HDF_ERR_INVALID_PARAM; goto EXIT; } - if (captureId < 0 || captureId > AUDIO_VDI_STREAM_NUM_MAX - 1) { + if (captureId < 0 || captureId >= AUDIO_VDI_STREAM_NUM_MAX) { AUDIO_FUNC_LOGE("captureId is invalid[%{public}u] and return ret=%{public}d", captureId, ret); ret = HDF_ERR_INVALID_PARAM; goto EXIT; } - if (DecreaseCaptureUsrCount(captureId) > 0) { - AUDIO_FUNC_LOGE("capture destroy: more than one usr"); - ret = HDF_SUCCESS; - goto EXIT; - } struct IAudioAdapterVdi *vdiAdapter = AudioGetVdiAdapterVdi(adapter); if (vdiAdapter == NULL) { @@ -375,7 +366,7 @@ static int32_t AudioDestroyCaptureVdi(struct IAudioAdapter *adapter, uint32_t ca goto EXIT; } - pthread_rwlock_wrlock(GetCaptureLock()); + pthread_rwlock_wrlock(GetCaptureLock(captureId)); struct IAudioCaptureVdi *vdiCapture = AudioGetVdiCaptureByIdVdi(captureId); if (vdiCapture == NULL || vdiAdapter->DestroyCapture == NULL) { pthread_rwlock_unlock(GetCaptureLock()); @@ -385,13 +376,13 @@ static int32_t AudioDestroyCaptureVdi(struct IAudioAdapter *adapter, uint32_t ca } ret = vdiAdapter->DestroyCapture(vdiAdapter, vdiCapture); if (ret != HDF_SUCCESS) { - pthread_rwlock_unlock(GetCaptureLock()); + pthread_rwlock_unlock(GetCaptureLock(captureId)); AUDIO_FUNC_LOGE("audio vdiAdapter call DestroyCapture fail, ret=%{public}d", ret); ret = HDF_FAILURE; goto EXIT; } AudioDestroyCaptureByIdVdi(captureId); - pthread_rwlock_unlock(GetCaptureLock()); + pthread_rwlock_unlock(GetCaptureLock(captureId)); EXIT: pthread_rwlock_unlock(&g_rwAdapterLock); return ret; -- Gitee From 817c7681e56b023143ecbd36dbc02ec5c4623e24 Mon Sep 17 00:00:00 2001 From: pxd2022 Date: Sun, 7 Sep 2025 12:36:26 +0000 Subject: [PATCH 4/5] update audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.c. Signed-off-by: pxd2022 --- audio/hdi_service/primary_impl/vdi_src/audio_capture_vdi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a8344920cd..b97d0f6bf7 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 @@ -47,7 +47,7 @@ struct AudioCapturePrivVdi { uint32_t captureCnt; }; -static struct AudioCapturePrivVdi ,,,,,,,,,,,,,,,,,,,,,,,, ; +static struct AudioCapturePrivVdi g_audioCapturePrivVdi = {0}; static struct AudioCapturePrivVdi *AudioCaptureGetPrivVdi() { -- Gitee From c99ad315ddbfae692e8da06d639979c253f6da19 Mon Sep 17 00:00:00 2001 From: pxd2022 Date: Mon, 8 Sep 2025 07:10:38 +0000 Subject: [PATCH 5/5] update audio/hdi_service/primary_impl/vdi_src/audio_adapter_vdi.c. Signed-off-by: pxd2022 --- 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 4c527d34b0..e515473a1c 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 @@ -369,7 +369,7 @@ static int32_t AudioDestroyCaptureVdi(struct IAudioAdapter *adapter, uint32_t ca pthread_rwlock_wrlock(GetCaptureLock(captureId)); struct IAudioCaptureVdi *vdiCapture = AudioGetVdiCaptureByIdVdi(captureId); if (vdiCapture == NULL || vdiAdapter->DestroyCapture == NULL) { - pthread_rwlock_unlock(GetCaptureLock()); + pthread_rwlock_unlock(GetCaptureLock(captureId)); AUDIO_FUNC_LOGE("invalid parameter"); ret = HDF_ERR_INVALID_PARAM; goto EXIT; -- Gitee