diff --git a/services/audio_policy/server/domain/device/include/audio_iohandle_map.h b/services/audio_policy/server/domain/device/include/audio_iohandle_map.h index 31d0150c4f889e619b1d16de023f92fde516101c..65e78fa374462f8292931f9c7bd2051078ea8052 100644 --- a/services/audio_policy/server/domain/device/include/audio_iohandle_map.h +++ b/services/audio_policy/server/domain/device/include/audio_iohandle_map.h @@ -50,7 +50,8 @@ public: int32_t OpenPortAndInsertIOHandle(const std::string &moduleName, const AudioModuleInfo &moduleInfo); int32_t ClosePortAndEraseIOHandle(const std::string &moduleName); - int32_t ReloadPortAndUpdateIOHandle(std::shared_ptr &pipeInfo, const AudioModuleInfo &moduleInfo); + int32_t ReloadPortAndUpdateIOHandle(std::shared_ptr &pipeInfo, const AudioModuleInfo &moduleInfo, + bool softLinkFlag = false); void NotifyUnmutePort(); void MuteSinkPort(const std::string &portName, int32_t duration, bool isSync, bool isSleepEnabled = true); diff --git a/services/audio_policy/server/domain/pipe/include/audio_capturer_session.h b/services/audio_policy/server/domain/pipe/include/audio_capturer_session.h index d709b0d0ad21cc9a60799f47e9447b1261a9c3f0..7d93f46e438733fbff3ff9bd97259de11eaef13a 100644 --- a/services/audio_policy/server/domain/pipe/include/audio_capturer_session.h +++ b/services/audio_policy/server/domain/pipe/include/audio_capturer_session.h @@ -70,6 +70,8 @@ public: CapturerState GetCapturerState(); int32_t ReloadCaptureSession(uint32_t sessionId, SessionOperation operation); int32_t ReloadCaptureSessionSoftLink(); + int32_t SetHearingAidReloadFlag(const bool hearingAidReloadFlag); + int32_t ReloadCaptureSoftLink(std::shared_ptr &pipeInfo, const AudioModuleInfo &moduleInfo); private: AudioCapturerSession() : audioPolicyManager_(AudioPolicyManagerFactory::GetAudioPolicyManager()), audioRouterCenter_(AudioRouterCenter::GetAudioRouterCenter()), @@ -112,6 +114,7 @@ private: bool CompareIndependentxmlPriority(const std::shared_ptr &pipe, uint32_t sessionId, AudioStreamDescriptor &runningSessionInfo, bool &hasSession); bool IsRemainingSourceIndependent(); + bool hearingAidReloadFlag_ = false; private: IAudioPolicyInterface& audioPolicyManager_; AudioRouterCenter& audioRouterCenter_; 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 852fec93764ea7c5312bb9de93a01db0778b3039..2a06ba54d4683836d8f9fe1779cba0e0ce102e43 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 @@ -59,6 +59,7 @@ public: SourceType &targetSourceType); void ReloadSourceForSession(SessionInfo sessionInfo); + int32_t ReloadSourceSoftLink(std::shared_ptr &pipeInfo, const AudioModuleInfo &moduleInfo); void SetDpSinkModuleInfo(const AudioModuleInfo &moduleInfo); void SetPrimaryMicModuleInfo(const AudioModuleInfo &moduleInfo); diff --git a/services/audio_policy/server/domain/pipe/src/audio_capturer_session.cpp b/services/audio_policy/server/domain/pipe/src/audio_capturer_session.cpp index 8dfde796ca17fc6fc45ee65aa536bd7222981e62..eb0b9e0ba17478392cf9e5e47c39f6f41c5f2ed7 100644 --- a/services/audio_policy/server/domain/pipe/src/audio_capturer_session.cpp +++ b/services/audio_policy/server/domain/pipe/src/audio_capturer_session.cpp @@ -296,9 +296,27 @@ bool AudioCapturerSession::FindRunningNormalSession(uint32_t sessionId, AudioStr return HandleNormalInputPipes(pipeList, sessionId, runningSessionInfo, hasSession); } +int32_t AudioCapturerSession::SetHearingAidReloadFlag(const bool hearingAidReloadFlag) +{ + std::lock_guard lock(onCapturerSessionChangedMutex_); + hearingAidReloadFlag_ = hearingAidReloadFlag; + return SUCCESS; +} + +int32_t AudioCapturerSession::ReloadCaptureSoftLink(std::shared_ptr &pipeInfo, + const AudioModuleInfo &moduleInfo) +{ + std::lock_guard lock(onCapturerSessionChangedMutex_); + int32_t ret = audioEcManager_.ReloadSourceSoftLink(pipeInfo, moduleInfo); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "reload softLink failed"); + hearingAidReloadFlag_ = true; + return SUCCESS; +} + int32_t AudioCapturerSession::ReloadCaptureSessionSoftLink() { std::lock_guard lock(onCapturerSessionChangedMutex_); + hearingAidReloadFlag_ = false; bool hasSession = false; auto pipes = AudioPipeManager::GetPipeManager()->GetPipeList(); if (pipes.empty()) { @@ -347,6 +365,7 @@ int32_t AudioCapturerSession::ReloadCaptureSession(uint32_t sessionId, SessionOp { AUDIO_INFO_LOG("prepare reload session: %{public}u with operation: %{public}d", sessionId, operation); std::lock_guard lock(onCapturerSessionChangedMutex_); + CHECK_AND_RETURN_RET_LOG(!hearingAidReloadFlag_, SUCCESS, "no need to reload session"); uint32_t targetSessionId = sessionId; AudioStreamDescriptor runningSessionInfo = {}; bool needReload = false; 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 9c57e2b99b3e0258dee373344f45f1757db42523..5fd46c330a92cffd247fddbd4e3e251b42e6e1a6 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 @@ -616,6 +616,16 @@ void AudioEcManager::GetTargetSourceTypeAndMatchingFlag(SourceType source, } } +int32_t AudioEcManager::ReloadSourceSoftLink(std::shared_ptr &pipeInfo, + const AudioModuleInfo &moduleInfo) +{ + int32_t ret = audioIOHandleMap_.ReloadPortAndUpdateIOHandle(pipeInfo, moduleInfo, true); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "reload softLink failed"); + normalSourceOpened_ = SOURCE_TYPE_VOICE_CALL; + AUDIO_INFO_LOG("reload hearingAid"); + return SUCCESS; +} + void AudioEcManager::ReloadSourceForSession(SessionInfo sessionInfo) { AUDIO_INFO_LOG("reload session for source: %{public}d", sessionInfo.sourceType); diff --git a/services/audio_policy/server/domain/pipe/src/audio_iohandle_map.cpp b/services/audio_policy/server/domain/pipe/src/audio_iohandle_map.cpp index 212c1e788e968ac061779b8297e50013df1413eb..cd8ea968fb9f79ada127390b72b80fcb10996248 100644 --- a/services/audio_policy/server/domain/pipe/src/audio_iohandle_map.cpp +++ b/services/audio_policy/server/domain/pipe/src/audio_iohandle_map.cpp @@ -309,7 +309,7 @@ void AudioIOHandleMap::DoUnmutePort(int32_t muteDuration, const std::string &por } int32_t AudioIOHandleMap::ReloadPortAndUpdateIOHandle(std::shared_ptr &pipeInfo, - const AudioModuleInfo &moduleInfo) + const AudioModuleInfo &moduleInfo, bool softLinkFlag) { std::string oldModuleName = pipeInfo->moduleInfo_.name; AudioIOHandle ioHandle; @@ -337,6 +337,7 @@ int32_t AudioIOHandleMap::ReloadPortAndUpdateIOHandle(std::shared_ptradapterName_ = moduleInfo.adapterName; pipeInfo->moduleInfo_ = moduleInfo; pipeInfo->pipeAction_ = PIPE_ACTION_DEFAULT; + pipeInfo->softLinkFlag_ = softLinkFlag; pipeInfo->InitAudioStreamInfo(); AddIOHandleInfo(moduleInfo.name, ioHandle); diff --git a/services/audio_policy/server/service/service_main/include/audio_core_service.h b/services/audio_policy/server/service/service_main/include/audio_core_service.h index dd623410ae7fcf7945c1669b96ddf39a4615f859..5ca431516b5bb7b76be7b110f42ee322f8370f4a 100644 --- a/services/audio_policy/server/service/service_main/include/audio_core_service.h +++ b/services/audio_policy/server/service/service_main/include/audio_core_service.h @@ -491,7 +491,7 @@ private: // for collaboration void UpdateRouteForCollaboration(InternalDeviceType deviceType); void CheckAndUpdateHearingAidCall(const DeviceType deviceType); - void CheckModuleForHearingAid(uint32_t &paIndex); + int32_t CheckModuleForHearingAid(uint32_t &paIndex); void CheckCloseHearingAidCall(const bool isModemCallRunning, const DeviceType type); void CheckOpenHearingAidCall(const bool isModemCallRunning, const DeviceType type); 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 254ef02cfb07b6d44d9af2c46046ff739c83b0c8..4182c91b705da59f62f02e52a104092b3ca2a365 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 @@ -367,6 +367,7 @@ void AudioCoreService::CheckCloseHearingAidCall(const bool isModemCallRunning, c if (pipeInfo->streamDescriptors_.empty()) { RemoveUnusedRecordPipe(); + audioCapturerSession_.SetHearingAidReloadFlag(false); } else { audioCapturerSession_.ReloadCaptureSessionSoftLink(); } @@ -378,32 +379,31 @@ void AudioCoreService::CheckOpenHearingAidCall(const bool isModemCallRunning, co { if (!hearingAidCallFlag_) { if (isModemCallRunning && type == DEVICE_TYPE_HEARING_AID) { - hearingAidCallFlag_ = true; uint32_t paIndex = 0; - audioActiveDevice_.UpdateActiveDeviceRoute(DeviceType::DEVICE_TYPE_SPEAKER, - DeviceFlag::OUTPUT_DEVICES_FLAG); - AudioServerProxy::GetInstance().SetAudioParameterProxy("mute_call", "true"); - - CheckModuleForHearingAid(paIndex); + CHECK_AND_RETURN_LOG(CheckModuleForHearingAid(paIndex) == SUCCESS, "openAudioPort failed"); std::shared_ptr pipeInfoOutput = pipeManager_->GetPipeinfoByNameAndFlag("hearing_aid", AUDIO_OUTPUT_FLAG_NORMAL); CHECK_AND_RETURN_LOG(pipeInfoOutput != nullptr, "Can not find pipe hearing_aid"); + audioActiveDevice_.UpdateActiveDeviceRoute(DeviceType::DEVICE_TYPE_SPEAKER, + DeviceFlag::OUTPUT_DEVICES_FLAG); softLink_ = HPAE::IHpaeSoftLink::CreateSoftLink(pipeInfoOutput->paIndex_, paIndex, HPAE::SoftLinkMode::HEARING_AID); CHECK_AND_RETURN_LOG(softLink_ != nullptr, "CreateSoftLink failed"); int32_t ret = softLink_->Start(); CHECK_AND_RETURN_LOG(ret == SUCCESS, "Start failed"); + AudioServerProxy::GetInstance().SetAudioParameterProxy("mute_call", "true"); + hearingAidCallFlag_ = true; } } } -void AudioCoreService::CheckModuleForHearingAid(uint32_t &paIndex) +int32_t AudioCoreService::CheckModuleForHearingAid(uint32_t &paIndex) { std::list moduleInfoList; bool configRet = policyConfigMananger_.GetModuleListByType(ClassType::TYPE_PRIMARY, moduleInfoList); - CHECK_AND_RETURN_LOG(configRet, "HearingAid not exist in config"); + CHECK_AND_RETURN_RET_LOG(configRet, ERR_OPERATION_FAILED, "HearingAid not exist in config"); for (auto &moduleInfo : moduleInfoList) { if (moduleInfo.role != "source") { continue; } AUDIO_INFO_LOG("hearingAidCall connects"); @@ -411,42 +411,36 @@ void AudioCoreService::CheckModuleForHearingAid(uint32_t &paIndex) moduleInfo.deviceType = std::to_string(DEVICE_TYPE_MIC); moduleInfo.sourceType = std::to_string(SOURCE_TYPE_VOICE_CALL); - std::shared_ptr pipeInfo = std::make_shared(); - pipeInfo->name_ = "primary_input"; - pipeInfo->pipeRole_ = PIPE_ROLE_INPUT; - pipeInfo->routeFlag_ = AUDIO_INPUT_FLAG_NORMAL; - pipeInfo->adapterName_ = "primary"; - pipeInfo->moduleInfo_ = moduleInfo; - pipeInfo->pipeAction_ = PIPE_ACTION_NEW; - pipeInfo->softLinkFlag_ = true; - AudioIOHandle ioHandle; - if (!audioIOHandleMap_.CheckIOHandleExist(moduleInfo.name)) { - ioHandle = audioPolicyManager_.OpenAudioPort(moduleInfo, paIndex); - CHECK_AND_CONTINUE_LOG(ioHandle != HDI_INVALID_ID, + std::shared_ptr pipeInfoInput = + pipeManager_->GetPipeinfoByNameAndFlag("primary", AUDIO_INPUT_FLAG_NORMAL); + if (pipeInfoInput == nullptr) { + AudioIOHandle ioHandle = audioPolicyManager_.OpenAudioPort(moduleInfo, paIndex); + CHECK_AND_RETURN_RET_LOG(ioHandle != HDI_INVALID_ID, ERR_INVALID_HANDLE, "OpenAudioPort failed ioHandle[%{public}u]", ioHandle); - CHECK_AND_CONTINUE_LOG(paIndex != OPEN_PORT_FAILURE, + CHECK_AND_RETURN_RET_LOG(paIndex != OPEN_PORT_FAILURE, ERR_OPERATION_FAILED, "OpenAudioPort failed paId[%{public}u]", paIndex); audioIOHandleMap_.AddIOHandleInfo(moduleInfo.name, ioHandle); + std::shared_ptr pipeInfo = std::make_shared(); + pipeInfo->name_ = "primary_input"; + pipeInfo->pipeRole_ = PIPE_ROLE_INPUT; + pipeInfo->routeFlag_ = AUDIO_INPUT_FLAG_NORMAL; + pipeInfo->adapterName_ = "primary"; + pipeInfo->moduleInfo_ = moduleInfo; + pipeInfo->pipeAction_ = PIPE_ACTION_NEW; + pipeInfo->softLinkFlag_ = true; pipeInfo->id_ = ioHandle; pipeInfo->paIndex_ = paIndex; pipeManager_->AddAudioPipeInfo(pipeInfo); AUDIO_INFO_LOG("Add PipeInfo %{public}u in load hearingAidCall.", pipeInfo->id_); + audioCapturerSession_.SetHearingAidReloadFlag(true); } else { - CHECK_AND_CONTINUE_LOG(audioIOHandleMap_.GetModuleIdByKey(PRIMARY_MIC, ioHandle), - "can not find primary in IOmap"); - auto pipeInfoInput = pipeManager_->GetPipeinfoByNameAndFlag("primary", - AUDIO_INPUT_FLAG_NORMAL); - CHECK_AND_CONTINUE_LOG(pipeInfoInput != nullptr, "can not find primary pipeInfo"); + int32_t ret = audioCapturerSession_.ReloadCaptureSoftLink(pipeInfoInput, moduleInfo); + CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "ReloadCaptureSoftLink failed"); + CHECK_AND_RETURN_RET_LOG(pipeInfoInput != nullptr, ERROR, "can not find primary pipeInfo"); paIndex = pipeInfoInput->paIndex_; - pipeInfo->id_ = ioHandle; - pipeInfo->paIndex_ = paIndex; - pipeInfo->streamDescriptors_ = pipeInfoInput->streamDescriptors_; - pipeInfo->streamDescMap_ = pipeInfoInput->streamDescMap_; - pipeManager_->UpdateAudioPipeInfo(pipeInfo); - AUDIO_INFO_LOG("Update PipeInfo %{public}u in load hearingAidCall.", pipeInfo->id_); - audioCapturerSession_.ReloadCaptureSessionSoftLink(); } } + return SUCCESS; } void AudioCoreService::CheckAndUpdateHearingAidCall(const DeviceType type) diff --git a/services/audio_policy/test/unittest/audio_core_service_private_unit_test/src/audio_core_service_private_unit_test.cpp b/services/audio_policy/test/unittest/audio_core_service_private_unit_test/src/audio_core_service_private_unit_test.cpp index 4a9e2ef22ade91e236c7ca48bbfd603c0a1afeed..d990f6b52b3d8c35b21b0e32d821221f7366059c 100644 --- a/services/audio_policy/test/unittest/audio_core_service_private_unit_test/src/audio_core_service_private_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_core_service_private_unit_test/src/audio_core_service_private_unit_test.cpp @@ -3084,11 +3084,15 @@ HWTEST_F(AudioCoreServicePrivateTest, CheckAndUpdateHearingAidCall_001, TestSize { auto audioCoreService = std::make_shared(); audioCoreService->audioSceneManager_.audioScene_ = AUDIO_SCENE_PHONE_CALL; + audioCoreService->hearingAidCallFlag_ = false; audioCoreService->CheckAndUpdateHearingAidCall(DeviceType::DEVICE_TYPE_HEARING_AID); + audioCoreService->hearingAidCallFlag_ = true; audioCoreService->CheckAndUpdateHearingAidCall(DeviceType::DEVICE_TYPE_EARPIECE); - auto audioPipeManager = AudioPipeManager::GetPipeManager(); - auto pipeInfo = audioPipeManager->GetPipeinfoByNameAndFlag("primary", AUDIO_INPUT_FLAG_NORMAL); - ASSERT_NE(pipeInfo, nullptr); + ASSERT_EQ(audioCoreService->hearingAidCallFlag_, false); + + audioCoreService->CheckAndUpdateHearingAidCall(DeviceType::DEVICE_TYPE_HEARING_AID); + bool ret = audioCoreService->audioIOHandleMap_.CheckIOHandleExist("Built_in_mic"); + ASSERT_EQ(ret, false); } /**