diff --git a/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp b/frameworks/native/hdiadapter/sink/primary/audio_renderer_sink.cpp index fbf931858dde94a1123d75a4e2021fe3bed0f137..89f04910671dbcd31108e35295518d028e7cf499 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 882f5c0c514b23b8801428af589029d9aa5c36df..1fb6863d114d12a9a6fcaa7b296180aae2a68a3e 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 6efef495577e01f06953c6870f472c4ef83669e8..649263213112124b28b13512bc82918ee0f3e4ce 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 fd39228be2ff328805659127a8e96f996da76552..c2fe988d2ed5b548db1a147c1d046a9ec9872281 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)