diff --git a/services/audio_policy/server/domain/pipe/include/audio_ec_manager.h b/services/audio_policy/server/domain/pipe/include/audio_ec_manager.h index 2a06ba54d4683836d8f9fe1779cba0e0ce102e43..38a1043f66a9fa0a2404a18387aabe96d92826ad 100644 --- a/services/audio_policy/server/domain/pipe/include/audio_ec_manager.h +++ b/services/audio_policy/server/domain/pipe/include/audio_ec_manager.h @@ -68,7 +68,8 @@ public: bool GetMicRefFeatureEnable(); void UpdateStreamEcAndMicRefInfo(AudioModuleInfo &moduleInfo, SourceType sourceType); void SetOpenedNormalSource(SourceType sourceType); - void PrepareNormalSource(AudioModuleInfo &moduleInfo, std::shared_ptr &streamDesc); + void PrepareNormalSource(std::shared_ptr &pipeInfo, + std::shared_ptr &streamDesc); void SetOpenedNormalSourceSessionId(uint64_t sessionId); uint64_t GetOpenedNormalSourceSessionId(); int32_t ReloadNormalSource(SessionInfo &sessionInfo, PipeStreamPropInfo &targetInfo, SourceType targetSource); @@ -83,6 +84,7 @@ private: ~AudioEcManager() {} void UpdateEnhanceEffectState(SourceType source); + void UpdatePrimaryMicModuleInfo(std::shared_ptr &pipeInfo, SourceType sourceType); void UpdateStreamCommonInfo(AudioModuleInfo &moduleInfo, PipeStreamPropInfo &targetInfo, SourceType sourceType); void UpdateAudioEcInfo(const AudioDeviceDescriptor &inputDevice, const AudioDeviceDescriptor &outputDevice); void UpdateModuleInfoForEc(AudioModuleInfo &moduleInfo); diff --git a/services/audio_policy/server/domain/pipe/src/audio_ec_manager.cpp b/services/audio_policy/server/domain/pipe/src/audio_ec_manager.cpp index 5fd46c330a92cffd247fddbd4e3e251b42e6e1a6..c3e5b50078584daf91ae8ae15a908bf1609d22e6 100644 --- a/services/audio_policy/server/domain/pipe/src/audio_ec_manager.cpp +++ b/services/audio_policy/server/domain/pipe/src/audio_ec_manager.cpp @@ -216,6 +216,29 @@ void AudioEcManager::UpdateEnhanceEffectState(SourceType source) isEcFeatureEnable_, isMicRefFeatureEnable_, isMicRefRecordOn_, isMicRefVoipUpOn_); } +void AudioEcManager::UpdatePrimaryMicModuleInfo(std::shared_ptr &pipeInfo, SourceType sourceType) +{ + if (pipeInfo->adapterName_ != "primary") { + return; + } + if (!isEcFeatureEnable_) { + return; + } + shared_ptr inputDesc = audioRouterCenter_.FetchInputDevice(sourceType, -1); + if (inputDesc == nullptr || inputDesc->deviceType_ == DEVICE_TYPE_USB_ARM_HEADSET + || inputDesc->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP_IN) { + return; + } + + // update primary info for ec config to get later + primaryMicModuleInfo_.channels = pipeInfo->moduleInfo_.channels; + primaryMicModuleInfo_.rate = pipeInfo->moduleInfo_.rate; + primaryMicModuleInfo_.format = pipeInfo->moduleInfo_.format; + AUDIO_INFO_LOG("channels: %{public}s, rate: %{public}s, format: %{public}s", + primaryMicModuleInfo_.channels.c_str(), primaryMicModuleInfo_.rate.c_str(), + primaryMicModuleInfo_.format.c_str()); +} + void AudioEcManager::UpdateStreamCommonInfo(AudioModuleInfo &moduleInfo, PipeStreamPropInfo &targetInfo, SourceType sourceType) { @@ -754,13 +777,14 @@ void AudioEcManager::SetOpenedNormalSource(SourceType sourceType) normalSourceOpened_ = sourceType; } -void AudioEcManager::PrepareNormalSource(AudioModuleInfo &moduleInfo, +void AudioEcManager::PrepareNormalSource(std::shared_ptr &pipeInfo, std::shared_ptr &streamDesc) { SourceType sourceType = streamDesc->capturerInfo_.sourceType; AUDIO_INFO_LOG("prepare normal source for source type: %{public}d", sourceType); UpdateEnhanceEffectState(sourceType); - UpdateStreamEcAndMicRefInfo(moduleInfo, sourceType); + UpdatePrimaryMicModuleInfo(pipeInfo, sourceType); + UpdateStreamEcAndMicRefInfo(pipeInfo->moduleInfo_, sourceType); SetOpenedNormalSource(sourceType); SetOpenedNormalSourceSessionId(streamDesc->sessionId_); } diff --git a/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp b/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp index 244843c365d3045d9a0e59e56619c62817ae4b0b..2fff7e087ab7bba8c733987819b46e9f66d4372c 100644 --- a/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp +++ b/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp @@ -2349,7 +2349,7 @@ void AudioCoreService::HandleCommonSourceOpened(std::shared_ptr & CHECK_AND_RETURN_LOG(streamDesc != nullptr, "streamDesc is null"); SourceType sourceType = streamDesc->capturerInfo_.sourceType; if (specialSourceTypeSet_.count(sourceType) == 0) { - audioEcManager_.PrepareNormalSource(pipeInfo->moduleInfo_, streamDesc); + audioEcManager_.PrepareNormalSource(pipeInfo, streamDesc); } } diff --git a/services/audio_policy/test/unittest/audio_ec_manager_unit_test/src/audio_ec_manager_unit_test.cpp b/services/audio_policy/test/unittest/audio_ec_manager_unit_test/src/audio_ec_manager_unit_test.cpp index 0d9a80ed9b1915cb7736fa04c6dfeb8521930388..08b2cfcd9a545626186884df385d1a07bf3b7181 100644 --- a/services/audio_policy/test/unittest/audio_ec_manager_unit_test/src/audio_ec_manager_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_ec_manager_unit_test/src/audio_ec_manager_unit_test.cpp @@ -762,10 +762,10 @@ HWTEST_F(AudioEcManagerUnitTest, AudioEcManager_033, TestSize.Level4) HWTEST_F(AudioEcManagerUnitTest, AudioEcManager_034, TestSize.Level4) { AudioEcManager& ecManager(AudioEcManager::GetInstance()); - AudioModuleInfo moduleInfo = {}; + std::shared_ptr pipeInfo = std::make_shared(); std::shared_ptr streamDesc = std::make_shared(); EXPECT_NO_THROW( - ecManager.PrepareNormalSource(moduleInfo, streamDesc); + ecManager.PrepareNormalSource(pipeInfo, streamDesc); ); } @@ -852,5 +852,22 @@ HWTEST_F(AudioEcManagerUnitTest, AudioEcManager_039, TestSize.Level4) ret = ecManager.FetchTargetInfoForSessionAdd(sessionInfo, targetInfo, targetSourceType); EXPECT_EQ(ret, ERROR); } + +/** +* @tc.name : Test AudioEcManager. +* @tc.number: AudioEcManager_040 +* @tc.desc : Test UpdatePrimaryMicModuleInfo interface. +*/ +HWTEST_F(AudioEcManagerUnitTest, AudioEcManager_040, TestSize.Level4) +{ + SourceType sourceType = SOURCE_TYPE_VOICE_COMMUNICATION; + auto ecManager = std::make_shared(); + ASSERT_TRUE(ecManager != nullptr); + + std::shared_ptr pipeInfo = std::make_shared(); + ecManager->isEcFeatureEnable_ = true; + ecManager->UpdatePrimaryMicModuleInfo(pipeInfo, sourceType); + EXPECT_EQ(ecManager->primaryMicModuleInfo_.rate, "48000"); +} } // namespace AudioStandard } // namespace OHOS \ No newline at end of file diff --git a/test/fuzztest/audioecmanager_fuzzer/audio_ec_manager_fuzzer.cpp b/test/fuzztest/audioecmanager_fuzzer/audio_ec_manager_fuzzer.cpp index e99bcda38d5820f3955bc7ebfcee12e061e834e9..93d152c275fe04789c43f64de1b1f196925a8811 100644 --- a/test/fuzztest/audioecmanager_fuzzer/audio_ec_manager_fuzzer.cpp +++ b/test/fuzztest/audioecmanager_fuzzer/audio_ec_manager_fuzzer.cpp @@ -118,6 +118,15 @@ void UpdateEnhanceEffectStateFuzzTest() ecManager.UpdateEnhanceEffectState(source); } +void UpdatePrimaryMicModuleInfoFuzzTest() +{ + AudioEcManager& ecManager(AudioEcManager::GetInstance()); + SourceType source = g_fuzzUtils.GetData(); + std::shared_ptr pipeInfo = std::make_shared(); + CHECK_AND_RETURN(pipeInfo != nullptr); + ecManager.UpdatePrimaryMicModuleInfo(pipeInfo, source); +} + void UpdateStreamCommonInfoFuzzTest() { AudioEcManager& ecManager(AudioEcManager::GetInstance()); @@ -308,11 +317,12 @@ void GetHalNameForDeviceFuzzTest() void PrepareNormalSourceFuzzTest() { - AudioModuleInfo moduleInfo; + std::shared_ptr pipeInfo = std::make_shared(); + CHECK_AND_RETURN(pipeInfo != nullptr); std::shared_ptr streamDesc = std::make_shared(); CHECK_AND_RETURN(streamDesc != nullptr); AudioEcManager& ecManager(AudioEcManager::GetInstance()); - ecManager.PrepareNormalSource(moduleInfo, streamDesc); + ecManager.PrepareNormalSource(pipeInfo, streamDesc); } void GetOpenedNormalSourceSessionIdFuzzTest()