From 6f8db8bcbc7f89bef87513dab7649f43eec1e653 Mon Sep 17 00:00:00 2001 From: huyue57 Date: Fri, 17 Nov 2023 12:05:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=91=E5=A3=B0=E8=A7=84?= =?UTF-8?q?=E5=88=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyue57 Change-Id: I64b1c9aafdfff9c7657781c6a22062ceb1302ee4 --- .../sink/primary/audio_renderer_sink.cpp | 35 ++++++++++++------- .../source/primary/audio_capturer_source.cpp | 29 ++++++++++----- .../src/service/audio_policy_service.cpp | 6 ++-- .../service/routers/pair_device_router.cpp | 7 +++- 4 files changed, 52 insertions(+), 25 deletions(-) diff --git a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp index fbf931858d..89f0491067 100644 --- a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp +++ b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp @@ -137,6 +137,8 @@ private: int32_t InitRender(); FILE *dumpFile_ = nullptr; + DeviceType currentActiveDevice_; + AudioScene currentAudioScene_; }; AudioRendererSinkInner::AudioRendererSinkInner(const std::string &halName) @@ -687,14 +689,17 @@ int32_t AudioRendererSinkInner::SetOutputRoute(DeviceType outputDevice) int32_t AudioRendererSinkInner::SetOutputRoute(DeviceType outputDevice, AudioPortPin &outputPortPin) { + if (outputDevice == currentActiveDevice_) { + AUDIO_INFO_LOG("SetOutputRoute output device not change"); + return SUCCESS; + } + currentActiveDevice_ = outputDevice; + AudioRouteNode source = {}; AudioRouteNode sink = {}; int32_t ret = SetOutputPortPin(outputDevice, sink); - if (ret != SUCCESS) { - AUDIO_ERR_LOG("SetOutputRoute FAILED: %{public}d", ret); - return ret; - } + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "SetOutputRoute FAILED: %{public}d", ret); outputPortPin = sink.ext.device.type; AUDIO_INFO_LOG("Output PIN is: 0x%{public}X", outputPortPin); @@ -758,15 +763,19 @@ int32_t AudioRendererSinkInner::SetAudioScene(AudioScene audioScene, DeviceType } AUDIO_DEBUG_LOG("OUTPUT port is %{public}d", audioSceneOutPort); - struct AudioSceneDescriptor scene; - scene.scene.id = GetAudioCategory(audioScene); - scene.desc.pins = audioSceneOutPort; - scene.desc.desc = (char *)""; - - int32_t ret = audioRender_->SelectScene(audioRender_, &scene); - if (ret < 0) { - AUDIO_ERR_LOG("Select scene FAILED: %{public}d", ret); - return ERR_OPERATION_FAILED; + int32_t ret = SUCCESS; + if (audioScene != currentAudioScene_) { + struct AudioSceneDescriptor scene; + scene.scene.id = GetAudioCategory(audioScene); + scene.desc.pins = audioSceneOutPort; + scene.desc.desc = (char *)""; + + ret = audioRender_->SelectScene(audioRender_, &scene); + if (ret < 0) { + AUDIO_ERR_LOG("Select scene FAILED: %{public}d", ret); + return ERR_OPERATION_FAILED; + } + currentAudioScene_ = audioScene; } ret = SetOutputRoute(activeDevice, audioSceneOutPort); diff --git a/frameworks/native/hdiadapter/source/primary/audio_capturer_source.cpp b/frameworks/native/hdiadapter/source/primary/audio_capturer_source.cpp index 882f5c0c51..1fb6863d11 100644 --- a/frameworks/native/hdiadapter/source/primary/audio_capturer_source.cpp +++ b/frameworks/native/hdiadapter/source/primary/audio_capturer_source.cpp @@ -114,6 +114,8 @@ private: std::mutex audioCapturerSourceCallbackMutex_; FILE *dumpFile_ = nullptr; bool muteState_ = false; + DeviceType currentActiveDevice_; + AudioScene currentAudioScene_; }; class AudioCapturerSourceWakeup : public AudioCapturerSource { @@ -737,6 +739,11 @@ int32_t AudioCapturerSourceInner::SetInputRoute(DeviceType inputDevice) int32_t AudioCapturerSourceInner::SetInputRoute(DeviceType inputDevice, AudioPortPin &inputPortPin) { + if (inputDevice == currentActiveDevice_) { + AUDIO_INFO_LOG("SetInputRoute input device not change"); + return SUCCESS; + } + currentActiveDevice_ = inputDevice; AudioRouteNode source = {}; AudioRouteNode sink = {}; @@ -798,15 +805,19 @@ int32_t AudioCapturerSourceInner::SetAudioScene(AudioScene audioScene, DeviceTyp audioSceneInPort = PIN_IN_USB_HEADSET; } - struct AudioSceneDescriptor scene; - scene.scene.id = GetAudioCategory(audioScene); - scene.desc.pins = audioSceneInPort; - scene.desc.desc = (char *)""; - - int32_t ret = audioCapture_->SelectScene(audioCapture_, &scene); - if (ret < 0) { - AUDIO_ERR_LOG("Select scene FAILED: %{public}d", ret); - return ERR_OPERATION_FAILED; + int32_t ret = SUCCESS; + if (audioScene != currentAudioScene_) { + struct AudioSceneDescriptor scene; + scene.scene.id = GetAudioCategory(audioScene); + scene.desc.pins = audioSceneInPort; + scene.desc.desc = (char *)""; + + ret = audioCapture_->SelectScene(audioCapture_, &scene); + if (ret < 0) { + AUDIO_ERR_LOG("Select scene FAILED: %{public}d", ret); + return ERR_OPERATION_FAILED; + } + currentAudioScene_ = audioScene; } ret = SetInputRoute(activeDevice, audioSceneInPort); diff --git a/services/audio_policy/server/src/service/audio_policy_service.cpp b/services/audio_policy/server/src/service/audio_policy_service.cpp index 6efef49557..6492632131 100644 --- a/services/audio_policy/server/src/service/audio_policy_service.cpp +++ b/services/audio_policy/server/src/service/audio_policy_service.cpp @@ -1602,7 +1602,8 @@ void AudioPolicyService::FetchOutputDevice(vectorrendererState != RENDERER_RUNNING) { + if (rendererChangeInfo->rendererInfo.streamUsage != STREAM_USAGE_VOICE_MODEM_COMMUNICATION && + rendererChangeInfo->rendererState != RENDERER_RUNNING) { AUDIO_INFO_LOG("stream %{public}d not running, no need fetch device", rendererChangeInfo->sessionId); continue; } @@ -1650,7 +1651,8 @@ void AudioPolicyService::FetchInputDevice(vectorcapturerState != CAPTURER_RUNNING) { + if (capturerChangeInfo->capturerInfo.sourceType != SOURCE_TYPE_VOICE_MODEM_COMMUNICATION && + capturerChangeInfo->capturerState != CAPTURER_RUNNING) { AUDIO_INFO_LOG("stream %{public}d not running, no need fetch device", capturerChangeInfo->sessionId); continue; } diff --git a/services/audio_policy/server/src/service/routers/pair_device_router.cpp b/services/audio_policy/server/src/service/routers/pair_device_router.cpp index fd39228be2..c2fe988d2e 100644 --- a/services/audio_policy/server/src/service/routers/pair_device_router.cpp +++ b/services/audio_policy/server/src/service/routers/pair_device_router.cpp @@ -36,7 +36,12 @@ unique_ptr PairDeviceRouter::GetCallCaptureDevice(SourceT { unique_ptr desc = AudioPolicyService::GetAudioPolicyService().GetActiveOutputDeviceDescriptor(); - return make_unique(*(desc->pairDeviceDescriptor_)); + if (desc->pairDeviceDescriptor_ != nullptr) { + AUDIO_DEBUG_LOG("sourceType %{public}d clientUID %{public}d fetch device %{public}d", sourceType, clientUID, + desc->pairDeviceDescriptor_->deviceType_); + return make_unique(*(desc->pairDeviceDescriptor_)); + } + return make_unique(); } unique_ptr PairDeviceRouter::GetRingRenderDevice(StreamUsage streamUsage, int32_t clientUID) -- Gitee