diff --git a/frameworks/native/audioadapter/test/unittest/src/pro_audio_service_adapter_unit_test.cpp b/frameworks/native/audioadapter/test/unittest/src/pro_audio_service_adapter_unit_test.cpp index 11bdff326713090e0e4a81ca71339ba7b805a09a..e07975fd19aa363a14c6823bac8bf85fe69217d8 100644 --- a/frameworks/native/audioadapter/test/unittest/src/pro_audio_service_adapter_unit_test.cpp +++ b/frameworks/native/audioadapter/test/unittest/src/pro_audio_service_adapter_unit_test.cpp @@ -345,6 +345,19 @@ HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_ReloadAudioPort_002, TestSize EXPECT_EQ(portId, -1); } +/** + * @tc.name: Pro_Audio_ReloadAudioPort_003 + * @tc.desc: test reload audio port source + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_ReloadAudioPort_003, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSourceAudioModeInfo(); + moduleInfo.lib = "libmodule-inner-capturer-sink.z.so"; + int32_t portId = impl_->ReloadAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_EQ(portId, -1); +} + /** * @tc.name: Pro_Audio_ReloadAudioPort_004 * @tc.desc: test reload audio port sink @@ -374,5 +387,35 @@ HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_ReloadAudioPort_005, TestSize portId = impl_->ReloadAudioPort(moduleInfo.lib, moduleInfo); EXPECT_GE(portId, 0); } + +/** + * @tc.name: Pro_Audio_ReloadAudioPort_006 + * @tc.desc: test reload audio port sink + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_ReloadAudioPort_006, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSinkAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_EQ(portId, -1); + portId = impl_->ReloadAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_EQ(portId, -1); +} + +/** + * @tc.name: Pro_Audio_ReloadAudioPort_007 + * @tc.desc: test reload audio port sink + * @tc.type: FUNC + */ +HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_ReloadAudioPort_007, TestSize.Level1) +{ + AudioModuleInfo moduleInfo = InitSourceAudioModeInfo(); + int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_EQ(portId, -1); + int32_t ret = impl_->CloseAudioPort(portId); + EXPECT_EQ(ERROR, ret); + portId = impl_->ReloadAudioPort(moduleInfo.lib, moduleInfo); + EXPECT_EQ(portId, -1); +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_engine/manager/include/hpae_capturer_manager.h b/services/audio_engine/manager/include/hpae_capturer_manager.h index baae99dfaab074146c2182ae51d5e7c25bde43f2..e33d694ed4f4b0e980e9aaf24b83ae9a5135fafa 100644 --- a/services/audio_engine/manager/include/hpae_capturer_manager.h +++ b/services/audio_engine/manager/include/hpae_capturer_manager.h @@ -72,7 +72,7 @@ public: int32_t AddAllNodesToSource(const std::vector &moveInfos, bool isConnect) override; std::string GetThreadName() override; void SetCaptureId(uint32_t captureId); - int32_t ReloadCaptureManager(const HpaeSourceInfo &sourceInfo) override; + int32_t ReloadCaptureManager(const HpaeSourceInfo &sourceInfo, bool isReload = false) override; int32_t DumpSourceInfo() override; std::string GetDeviceHDFDumpInfo() override; private: diff --git a/services/audio_engine/manager/include/hpae_manager.h b/services/audio_engine/manager/include/hpae_manager.h index 922720457494581b90b60e817b1761641647d3b9..82497ab535f29d238d8ae02115b025c43caf0948 100644 --- a/services/audio_engine/manager/include/hpae_manager.h +++ b/services/audio_engine/manager/include/hpae_manager.h @@ -233,6 +233,7 @@ private: void CreateStreamForCapInner(const HpaeStreamInfo &streamInfo); int32_t CreateRendererManager(const AudioModuleInfo &audioModuleInfo, uint32_t sinkSourceIndex, bool isReload = false); + int32_t CreateCaptureManager(HpaeSourceInfo &sourceInfo, uint32_t sinkSourceIndex, bool isReload = false); void UpdateStatus(const std::weak_ptr &callback, IOperation operation, uint32_t sessionId); std::shared_ptr GetRendererManagerById(uint32_t sessionId); @@ -243,6 +244,7 @@ private: void MoveToPreferSink(const std::string& name, std::shared_ptr &serviceCallback); int32_t ReloadRenderManager(const AudioModuleInfo &audioModuleInfo, bool isReload = false); + int32_t ReloadCaptureManager(HpaeSourceInfo &sourceInfo, bool isReload = false); void DestroyCapture(uint32_t sessionId); void LoadEffectLive(); diff --git a/services/audio_engine/manager/include/hpae_virtual_capturer_manager.h b/services/audio_engine/manager/include/hpae_virtual_capturer_manager.h index ac9679f2bb8664495e947b8b5813b577bf0980e7..738c08b33ffacbe58af1c1183aa70a47819674bd 100644 --- a/services/audio_engine/manager/include/hpae_virtual_capturer_manager.h +++ b/services/audio_engine/manager/include/hpae_virtual_capturer_manager.h @@ -61,7 +61,7 @@ public: int32_t AddNodeToSource(const HpaeCaptureMoveInfo &moveInfo) override; int32_t AddAllNodesToSource(const std::vector &moveInfos, bool isConnect) override; std::string GetThreadName() override; - int32_t ReloadCaptureManager(const HpaeSourceInfo &sourceInfo) override; + int32_t ReloadCaptureManager(const HpaeSourceInfo &sourceInfo, bool isReload = false) override; int32_t DumpSourceInfo() override; std::string GetDeviceHDFDumpInfo() override; diff --git a/services/audio_engine/manager/include/i_hpae_capturer_manager.h b/services/audio_engine/manager/include/i_hpae_capturer_manager.h index 616e47b888f2fc678802ea326dbe0e86f305b58c..25346dc76f8f7619bf60af16cafd3d67e930fea4 100644 --- a/services/audio_engine/manager/include/i_hpae_capturer_manager.h +++ b/services/audio_engine/manager/include/i_hpae_capturer_manager.h @@ -55,7 +55,7 @@ public: virtual int32_t AddNodeToSource(const HpaeCaptureMoveInfo &moveInfo) = 0; virtual int32_t AddAllNodesToSource(const std::vector &moveInfos, bool isConnect) = 0; virtual std::string GetThreadName() = 0; - virtual int32_t ReloadCaptureManager(const HpaeSourceInfo &sourceInfo) = 0; + virtual int32_t ReloadCaptureManager(const HpaeSourceInfo &sourceInfo, bool isReload = false) = 0; virtual int32_t DumpSourceInfo() { return 0; }; virtual void UploadDumpSourceInfo(std::string &deviceName); virtual void OnNotifyDfxNodeInfo(bool isConnect, uint32_t preNodeId, HpaeDfxNodeInfo &nodeInfo); diff --git a/services/audio_engine/manager/src/hpae_capturer_manager.cpp b/services/audio_engine/manager/src/hpae_capturer_manager.cpp index fd583ef7e82213029f236ebe5f6c01f3c5935ff9..a29d6614945b0d0517d18c8e546e13b2eebd786c 100644 --- a/services/audio_engine/manager/src/hpae_capturer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_capturer_manager.cpp @@ -630,13 +630,13 @@ int32_t HpaeCapturerManager::InitCapturer() return SUCCESS; } -int32_t HpaeCapturerManager::ReloadCaptureManager(const HpaeSourceInfo &sourceInfo) +int32_t HpaeCapturerManager::ReloadCaptureManager(const HpaeSourceInfo &sourceInfo, bool isReload) { if (IsInit()) { DeInit(); } hpaeSignalProcessThread_ = std::make_unique(); - auto request = [this, sourceInfo] { + auto request = [this, sourceInfo, isReload] { // disconnect std::vector moveInfos; for (const auto &it : sourceOutputNodeMap_) { @@ -655,7 +655,7 @@ int32_t HpaeCapturerManager::ReloadCaptureManager(const HpaeSourceInfo &sourceIn int32_t ret = InitCapturerManager(); if (ret != SUCCESS) { AUDIO_INFO_LOG("re-Init HpaeCapturerManager failed"); - TriggerCallback(INIT_DEVICE_RESULT, sourceInfo_.deviceName, ret); + TriggerCallback(isReload ? RELOAD_AUDIO_SINK_RESULT : INIT_DEVICE_RESULT, sourceInfo_.deviceName, ret); return; } AUDIO_INFO_LOG("re-Init HpaeCapturerManager success"); @@ -664,7 +664,7 @@ int32_t HpaeCapturerManager::ReloadCaptureManager(const HpaeSourceInfo &sourceIn for (const auto &moveInfo : moveInfos) { AddSingleNodeToSource(moveInfo, true); } - TriggerCallback(INIT_DEVICE_RESULT, sourceInfo_.deviceName, ret); + TriggerCallback(isReload ? RELOAD_AUDIO_SINK_RESULT : INIT_DEVICE_RESULT, sourceInfo_.deviceName, ret); TriggerCallback(INIT_SOURCE_RESULT, sourceInfo_.sourceType); }; SendRequest(request, __func__, true); @@ -736,9 +736,9 @@ int32_t HpaeCapturerManager::CheckFramelen() int32_t HpaeCapturerManager::Init(bool isReload) { hpaeSignalProcessThread_ = std::make_unique(); - auto request = [this] { + auto request = [this, isReload] { int32_t ret = InitCapturerManager(); - TriggerCallback(INIT_DEVICE_RESULT, sourceInfo_.deviceName, ret); + TriggerCallback(isReload ? RELOAD_AUDIO_SINK_RESULT : INIT_DEVICE_RESULT, sourceInfo_.deviceName, ret); CHECK_AND_RETURN_LOG(ret == SUCCESS, "Init HpaeCapturerManager failed"); TriggerCallback(INIT_SOURCE_RESULT, sourceInfo_.sourceType); AUDIO_INFO_LOG("Init HpaeCapturerManager success"); diff --git a/services/audio_engine/manager/src/hpae_manager.cpp b/services/audio_engine/manager/src/hpae_manager.cpp index 571998596f19a8026fbae22b0d5e5479fa8cbaaa..074f0f83502d4c8116674264a153c5ce76c406f5 100644 --- a/services/audio_engine/manager/src/hpae_manager.cpp +++ b/services/audio_engine/manager/src/hpae_manager.cpp @@ -298,6 +298,38 @@ int32_t HpaeManager::CreateRendererManager(const AudioModuleInfo &audioModuleInf return SUCCESS; } +int32_t HpaeManager::CreateCaptureManager(HpaeSourceInfo &sourceInfo, uint32_t sinkSourceIndex, bool isReload) +{ + sinkSourceIndex_.fetch_add(1); + sourceInfo.sourceId = sinkSourceIndex; + auto capturerManager = std::make_shared(sourceInfo); + capturerManager->RegisterSendMsgCallback(weak_from_this()); + capturerManagerMap_[sourceInfo.sourceName] = capturerManager; + sourceNameSourceIdMap_[sourceInfo.sourceName] = sinkSourceIndex; + sourceIdSourceNameMap_[sinkSourceIndex] = sourceInfo.sourceName; + if (defaultSource_ == "" && coreSource_ == "") { + CreateCoreSourceManager(); + } + capturerManagerMap_[sourceInfo.sourceName]->Init(isReload); + AUDIO_INFO_LOG( + "open source name: %{public}s end sourceIndex is %{public}u", sourceInfo.sourceName.c_str(), sinkSourceIndex); + return SUCCESS; +} + +int32_t HpaeManager::ReloadCaptureManager(HpaeSourceInfo &sourceInfo, bool isReload) +{ + if (isReload) { + sourceIdSourceNameMap_.erase(sourceNameSourceIdMap_[sourceInfo.sourceName]); + uint32_t sinkSourceIndex = static_cast(sinkSourceIndex_.load()); + sourceInfo.sourceId = sinkSourceIndex; + sinkSourceIndex_.fetch_add(1); + sourceIdSourceNameMap_[sinkSourceIndex] = sourceInfo.sourceName; + sourceNameSourceIdMap_[sourceInfo.sourceName] = sinkSourceIndex; + } + capturerManagerMap_[sourceInfo.sourceName]->ReloadCaptureManager(sourceInfo, isReload); + return SUCCESS; +} + int32_t HpaeManager::OpenOutputAudioPort(const AudioModuleInfo &audioModuleInfo, uint32_t sinkSourceIndex) { if (SafeGetMap(rendererManagerMap_, audioModuleInfo.name)) { @@ -341,20 +373,7 @@ int32_t HpaeManager::OpenInputAudioPort(const AudioModuleInfo &audioModuleInfo, } return sourceNameSourceIdMap_[audioModuleInfo.name]; } - sinkSourceIndex_.fetch_add(1); - sourceInfo.sourceId = sinkSourceIndex; - auto capturerManager = std::make_shared(sourceInfo); - capturerManager->RegisterSendMsgCallback(weak_from_this()); - capturerManagerMap_[audioModuleInfo.name] = capturerManager; - sourceNameSourceIdMap_[audioModuleInfo.name] = sinkSourceIndex; - sourceIdSourceNameMap_[sinkSourceIndex] = audioModuleInfo.name; - if (defaultSource_ == "" && coreSource_ == "") { - CreateCoreSourceManager(); - } - capturerManagerMap_[audioModuleInfo.name]->Init(); - AUDIO_INFO_LOG( - "open source name: %{public}s end sourceIndex is %{public}u", audioModuleInfo.name.c_str(), sinkSourceIndex); - return SUCCESS; + return CreateCaptureManager(sourceInfo, sinkSourceIndex); } void HpaeManager::CreateCoreSourceManager() @@ -432,21 +451,37 @@ uint32_t HpaeManager::OpenAudioPort(const AudioModuleInfo &audioModuleInfo) uint32_t HpaeManager::ReloadAudioPort(const AudioModuleInfo &audioModuleInfo) { auto request = [this, audioModuleInfo]() { - if (audioModuleInfo.lib != "libmodule-hdi-sink.z.so") { + PrintAudioModuleInfo(audioModuleInfo); + if ((audioModuleInfo.lib != "libmodule-hdi-source.z.so") && + (audioModuleInfo.lib != "libmodule-inner-capturer-sink.z.so")) { + if (SafeGetMap(rendererManagerMap_, audioModuleInfo.name)) { + ReloadRenderManager(audioModuleInfo, true); + return; + } + + AUDIO_INFO_LOG("currect device:%{public}s not exist.", audioModuleInfo.name.c_str()); + uint32_t sinkSourceIndex = static_cast(sinkSourceIndex_.load()); + CreateRendererManager(audioModuleInfo, sinkSourceIndex, true); + } else if (audioModuleInfo.lib == "libmodule-hdi-source.z.so") { + HpaeSourceInfo sourceInfo; + int32_t ret = TransModuleInfoToHpaeSourceInfo(audioModuleInfo, sourceInfo); + if (ret != SUCCESS) { + OnCallbackOpenOrReloadFailed(true); + return; + } + if (SafeGetMap(capturerManagerMap_, audioModuleInfo.name)) { + ReloadCaptureManager(sourceInfo, true); + return; + } + + AUDIO_INFO_LOG("currect device:%{public}s not exist.", audioModuleInfo.name.c_str()); + uint32_t sinkSourceIndex = static_cast(sinkSourceIndex_.load()); + CreateCaptureManager(sourceInfo, sinkSourceIndex, true); + } else { AUDIO_ERR_LOG("currect device:%{public}s not support reload.", audioModuleInfo.name.c_str()); OnCallbackOpenOrReloadFailed(true); return; } - - PrintAudioModuleInfo(audioModuleInfo); - if (SafeGetMap(rendererManagerMap_, audioModuleInfo.name)) { - ReloadRenderManager(audioModuleInfo, true); - return; - } - - AUDIO_INFO_LOG("currect device:%{public}s not exist.", audioModuleInfo.name.c_str()); - uint32_t sinkSourceIndex = static_cast(sinkSourceIndex_.load()); - CreateRendererManager(audioModuleInfo, sinkSourceIndex, true); }; SendRequest(request, __func__); return SUCCESS; @@ -1226,6 +1261,8 @@ void HpaeManager::HandleReloadDeviceResult(std::string deviceName, int32_t resul if (serviceCallback && result == SUCCESS) { if (sinkNameSinkIdMap_.find(deviceName) != sinkNameSinkIdMap_.end()) { serviceCallback->OnReloadAudioPortCb(sinkNameSinkIdMap_[deviceName]); + } else if (sourceNameSourceIdMap_.find(deviceName) != sourceNameSourceIdMap_.end()) { + serviceCallback->OnReloadAudioPortCb(sourceNameSourceIdMap_[deviceName]); } else { AUDIO_ERR_LOG("device:%{public}s is not exist.", deviceName.c_str()); serviceCallback->OnReloadAudioPortCb(SINK_INVALID_ID); diff --git a/services/audio_engine/manager/src/hpae_virtual_capturer_manager.cpp b/services/audio_engine/manager/src/hpae_virtual_capturer_manager.cpp index 3e7b1578a5ba47e63113bb2580cc15e1c6b7ba47..d75b20079871dd975876d6831d86a4b48d57512d 100644 --- a/services/audio_engine/manager/src/hpae_virtual_capturer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_virtual_capturer_manager.cpp @@ -297,7 +297,7 @@ std::string HpaeVirtualCapturerManager::GetThreadName() return "Virtual_capture"; } -int32_t HpaeVirtualCapturerManager::ReloadCaptureManager(const HpaeSourceInfo &sourceInfo) +int32_t HpaeVirtualCapturerManager::ReloadCaptureManager(const HpaeSourceInfo &sourceInfo, bool isReload) { AUDIO_ERR_LOG("Unsupported operation"); return SUCCESS; diff --git a/services/audio_engine/test/unittest/manager/hpae_capturer_manager_test.cpp b/services/audio_engine/test/unittest/manager/hpae_capturer_manager_test.cpp index a86a60ac08f1d63229f13e610f02efcf1b021e6c..f048ec7ffd7a58533c07e98a23db55a7b3ea73d1 100644 --- a/services/audio_engine/test/unittest/manager/hpae_capturer_manager_test.cpp +++ b/services/audio_engine/test/unittest/manager/hpae_capturer_manager_test.cpp @@ -312,6 +312,8 @@ HWTEST_F(HpaeCapturerManagerTest, HpaeCapturerManagerReloadTest, TestSize.Level1 EXPECT_EQ(sourceOutputInfo.capturerSessionInfo.state, HPAE_SESSION_PREPARED); EXPECT_EQ(capturerManager->ReloadCaptureManager(newSourceInfo) == SUCCESS, true); WaitForMsgProcessing(capturerManager); + EXPECT_EQ(capturerManager->ReloadCaptureManager(newSourceInfo, true) == SUCCESS, true); + WaitForMsgProcessing(capturerManager); EXPECT_EQ(capturerManager->GetSourceOutputInfo(streamInfo.sessionId, sourceOutputInfo) == SUCCESS, true); EXPECT_EQ(capturerManager->DeInit() == SUCCESS, true); WaitForMsgProcessing(capturerManager); @@ -662,6 +664,7 @@ HWTEST_F(HpaeCapturerManagerTest, ReloadCaptureManager_002, TestSize.Level0) capturerManager->isInit_ = true; EXPECT_EQ(capturerManager->ReloadCaptureManager(sourceInfo), SUCCESS); + EXPECT_EQ(capturerManager->ReloadCaptureManager(sourceInfo, true), SUCCESS); } /* diff --git a/services/audio_engine/test/unittest/manager/hpae_manager_test.cpp b/services/audio_engine/test/unittest/manager/hpae_manager_test.cpp index acc1e5c3af0b1929e4019aae1e3efca04e7347e1..c757359e01b5cb6f40495635afbf97076c74873b 100644 --- a/services/audio_engine/test/unittest/manager/hpae_manager_test.cpp +++ b/services/audio_engine/test/unittest/manager/hpae_manager_test.cpp @@ -1518,10 +1518,43 @@ HWTEST_F(HpaeManagerUnitTest, HpaeRenderManagerReloadTest002, TestSize.Level1) std::shared_ptr callback = std::make_shared(); hpaeManager_->RegisterSerivceCallback(callback); AudioModuleInfo audioModuleInfo = GetSourceAudioModeInfo(); + audioModuleInfo.lib = "libmodule-inner-capturer-sink.z.so"; EXPECT_EQ(hpaeManager_->ReloadAudioPort(audioModuleInfo), SUCCESS); WaitForMsgProcessing(hpaeManager_); } +HWTEST_F(HpaeManagerUnitTest, HpaeRenderManagerReloadTest003, TestSize.Level1) +{ + EXPECT_NE(hpaeManager_, nullptr); + hpaeManager_->Init(); + EXPECT_EQ(hpaeManager_->IsInit(), true); + sleep(1); + EXPECT_EQ(hpaeManager_->IsRunning(), true); + + std::shared_ptr callback = std::make_shared(); + hpaeManager_->RegisterSerivceCallback(callback); + AudioModuleInfo audioModuleInfo = GetSourceAudioModeInfo(); + EXPECT_EQ(hpaeManager_->ReloadAudioPort(audioModuleInfo), SUCCESS); + WaitForMsgProcessing(hpaeManager_); + int32_t portId = callback->GetPortId(); + + EXPECT_EQ(hpaeManager_->ReloadAudioPort(audioModuleInfo), SUCCESS); + WaitForMsgProcessing(hpaeManager_); + portId = callback->GetPortId(); + + hpaeManager_->CloseAudioPort(portId); + WaitForMsgProcessing(hpaeManager_); + EXPECT_EQ(callback->GetCloseAudioPortResult(), SUCCESS); + + EXPECT_EQ(hpaeManager_->ReloadAudioPort(audioModuleInfo), SUCCESS); + WaitForMsgProcessing(hpaeManager_); + portId = callback->GetPortId(); + + hpaeManager_->DeInit(); + EXPECT_EQ(hpaeManager_->IsInit(), false); + EXPECT_EQ(hpaeManager_->IsRunning(), false); +} + /** * @tc.name : Test UpdateCollaborativeState * @tc.type : FUNC