From a2892ad2315bc01fde331f4b74915e3ecd919320 Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 10 Sep 2025 16:01:02 +0800 Subject: [PATCH] fix notify crash and dump info Signed-off-by: Robin --- .../pro_audio_service_adapter_unit_test.cpp | 15 +++++++------ .../manager/include/hpae_manager.h | 1 + .../manager/src/hpae_capturer_manager.cpp | 1 - .../audio_engine/manager/src/hpae_manager.cpp | 14 ++++++++---- .../node/include/hpae_co_buffer_node.h | 4 ++-- .../node/include/hpae_gain_node.h | 2 +- .../src/hpae_audio_format_converter_node.cpp | 17 ++++++++------ .../audio_engine/node/src/hpae_gain_node.cpp | 22 ++++++++++++++----- .../node/src/hpae_process_cluster.cpp | 4 ++-- .../unittest/manager/hpae_manager_test.cpp | 16 +++++++++++++- .../audio_engine/utils/hpae_pcm_dumper.cpp | 6 +++-- 11 files changed, 69 insertions(+), 33 deletions(-) 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 6b22cecd3d..11bdff3267 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 @@ -42,6 +42,7 @@ void ProAudioServiceAdapterUnitTest::SetUp(void) void ProAudioServiceAdapterUnitTest::TearDown(void) { + HPAE::IHpaeManager::GetHpaeManager().DeInit(); } ProAudioServiceAdapterUnitTest::ProAudioServiceAdapterUnitTest() @@ -329,19 +330,19 @@ HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_ReloadAudioPort_001, TestSize { AudioModuleInfo moduleInfo = InitSinkAudioModeInfo(); int32_t portId = impl_->ReloadAudioPort(moduleInfo.lib, moduleInfo); - EXPECT_GE(0, portId); + EXPECT_GE(portId, 0); } /** * @tc.name: Pro_Audio_ReloadAudioPort_002 - * @tc.desc: test reload audio port sink + * @tc.desc: test reload audio port source * @tc.type: FUNC */ HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_ReloadAudioPort_002, TestSize.Level1) { AudioModuleInfo moduleInfo = InitSourceAudioModeInfo(); int32_t portId = impl_->ReloadAudioPort(moduleInfo.lib, moduleInfo); - EXPECT_GE(0, portId); + EXPECT_EQ(portId, -1); } /** @@ -353,9 +354,9 @@ HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_ReloadAudioPort_004, TestSize { AudioModuleInfo moduleInfo = InitSinkAudioModeInfo(); int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); - EXPECT_GE(0, portId); + EXPECT_GE(portId, 0); portId = impl_->ReloadAudioPort(moduleInfo.lib, moduleInfo); - EXPECT_GE(0, portId); + EXPECT_GE(portId, 0); } /** @@ -367,11 +368,11 @@ HWTEST_F(ProAudioServiceAdapterUnitTest, Pro_Audio_ReloadAudioPort_005, TestSize { AudioModuleInfo moduleInfo = InitSinkAudioModeInfo(); int32_t portId = impl_->OpenAudioPort(moduleInfo.lib, moduleInfo); - EXPECT_GE(0, portId); + EXPECT_GE(portId, 0); int32_t ret = impl_->CloseAudioPort(portId); EXPECT_EQ(ERROR, ret); portId = impl_->ReloadAudioPort(moduleInfo.lib, moduleInfo); - EXPECT_GE(0, portId); + EXPECT_GE(portId, 0); } } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_engine/manager/include/hpae_manager.h b/services/audio_engine/manager/include/hpae_manager.h index 87e4bb0014..202a984819 100644 --- a/services/audio_engine/manager/include/hpae_manager.h +++ b/services/audio_engine/manager/include/hpae_manager.h @@ -266,6 +266,7 @@ private: std::unordered_map deviceDumpSinkInfoMap_; std::unordered_map> handlers_; std::string effectLiveState_ = ""; + std::mutex mutex_; }; } // namespace HPAE diff --git a/services/audio_engine/manager/src/hpae_capturer_manager.cpp b/services/audio_engine/manager/src/hpae_capturer_manager.cpp index 659c6ab8f4..046cf857e0 100644 --- a/services/audio_engine/manager/src/hpae_capturer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_capturer_manager.cpp @@ -865,7 +865,6 @@ void HpaeCapturerManager::AddSingleNodeToSource(const HpaeCaptureMoveInfo &moveI if (moveInfo.sessionInfo.state == HPAE_SESSION_RUNNING) { ConnectOutputSession(sessionId); CHECK_AND_RETURN_LOG(CapturerSourceStart() == SUCCESS, "CapturerSourceStart error."); - hpaeSignalProcessThread_->Notify(); } } diff --git a/services/audio_engine/manager/src/hpae_manager.cpp b/services/audio_engine/manager/src/hpae_manager.cpp index e1f9f43ae6..69f79d8d0c 100644 --- a/services/audio_engine/manager/src/hpae_manager.cpp +++ b/services/audio_engine/manager/src/hpae_manager.cpp @@ -113,11 +113,15 @@ HpaeManager::~HpaeManager() int32_t HpaeManager::Init() { - sinkSourceIndex_ = 0; - hpaeManagerThread_ = std::make_unique(); - hpaeManagerThread_->ActivateThread(this); + std::lock_guard lock(mutex_); + CHECK_AND_RETURN_RET_LOG(!IsInit(), SUCCESS, "already inited"); + if (!hpaeManagerThread_) { + sinkSourceIndex_ = 0; + hpaeManagerThread_ = std::make_unique(); + hpaeManagerThread_->ActivateThread(this); + } isInit_.store(true); - return 0; + return SUCCESS; } int32_t HpaeManager::SuspendAudioDevice(std::string &audioPortName, bool isSuspend) @@ -193,6 +197,8 @@ int32_t HpaeManager::GetAllSinks() int32_t HpaeManager::DeInit() { + std::lock_guard lock(mutex_); + CHECK_AND_RETURN_RET_LOG(IsInit(), SUCCESS, "isn't inited"); if (hpaeManagerThread_ != nullptr) { hpaeManagerThread_->DeactivateThread(); hpaeManagerThread_ = nullptr; diff --git a/services/audio_engine/node/include/hpae_co_buffer_node.h b/services/audio_engine/node/include/hpae_co_buffer_node.h index 8b56323e4b..43c919a049 100644 --- a/services/audio_engine/node/include/hpae_co_buffer_node.h +++ b/services/audio_engine/node/include/hpae_co_buffer_node.h @@ -68,8 +68,8 @@ private: bool isOutputClusterConnected_ = false; std::set connectedProcessCluster_; #ifdef ENABLE_HOOK_PCM - std::unique_ptr inputPcmDumper_; - std::unique_ptr outputPcmDumper_; + std::unique_ptr inputPcmDumper_ = nullptr; + std::unique_ptr outputPcmDumper_ = nullptr; #endif }; } // namespace HPAE diff --git a/services/audio_engine/node/include/hpae_gain_node.h b/services/audio_engine/node/include/hpae_gain_node.h index b8f7b9bc76..c70e5d5533 100644 --- a/services/audio_engine/node/include/hpae_gain_node.h +++ b/services/audio_engine/node/include/hpae_gain_node.h @@ -53,7 +53,7 @@ private: bool IsSilentData(HpaePcmBuffer *pcmBuffer); void GetFadeLength(uint32_t &byteLength, HpaePcmBuffer *input); #ifdef ENABLE_HOOK_PCM - std::unique_ptr outputPcmDumper_; + std::unique_ptr outputPcmDumper_ = nullptr; #endif }; diff --git a/services/audio_engine/node/src/hpae_audio_format_converter_node.cpp b/services/audio_engine/node/src/hpae_audio_format_converter_node.cpp index e0b2b4aaf6..707ec8162d 100644 --- a/services/audio_engine/node/src/hpae_audio_format_converter_node.cpp +++ b/services/audio_engine/node/src/hpae_audio_format_converter_node.cpp @@ -56,13 +56,6 @@ HpaeAudioFormatConverterNode::HpaeAudioFormatConverterNode(HpaeNodeInfo preNodeI preNodeInfo.format, preNodeInfo.frameLen, preNodeInfo.samplingRate, inChannelInfo.numChannels, inChannelInfo.channelLayout, nodeInfo.format, nodeInfo.frameLen, nodeInfo.samplingRate, outChannelInfo.numChannels, outChannelInfo.channelLayout); -#ifdef ENABLE_HOOK_PCM - outputPcmDumper_ = std::make_unique( - "HpaeConverterNodeOutput_id_" + std::to_string(GetSessionId()) + - + "_nodeId_" + std::to_string(GetNodeId()) + - "_ch_" + std::to_string(GetChannelCount()) + "_rate_" + - std::to_string(GetSampleRate()) + "_" + GetTime() + ".pcm"); -#endif #ifdef ENABLE_HIDUMP_DFX SetNodeName("hpaeAudioFormatConverterNode"); @@ -100,6 +93,16 @@ HpaePcmBuffer *HpaeAudioFormatConverterNode::SignalProcess(const std::vector( + "HpaeConverterNodeOutput_id_" + std::to_string(GetSessionId()) + "_nodeId_" + std::to_string(GetNodeId()) + + "_ch_" + std::to_string(GetChannelCount()) + + "_rate_" + std::to_string(GetSampleRate()) + "_" + GetTime() + ".pcm"); + } +#endif + // pass valid tag to next node if (!inputs[0]->IsValid()) { return &silenceData_; diff --git a/services/audio_engine/node/src/hpae_gain_node.cpp b/services/audio_engine/node/src/hpae_gain_node.cpp index 005f384633..67d0ee68e6 100644 --- a/services/audio_engine/node/src/hpae_gain_node.cpp +++ b/services/audio_engine/node/src/hpae_gain_node.cpp @@ -54,11 +54,6 @@ HpaeGainNode::HpaeGainNode(HpaeNodeInfo &nodeInfo) : HpaeNode(nodeInfo), HpaePlu AUDIO_INFO_LOG("HpaeGainNode curSystemGain:%{public}f streamType :%{public}d", curSystemGain, GetStreamType()); AUDIO_INFO_LOG( "HpaeGainNode SessionId:%{public}u deviceClass :%{public}s", GetSessionId(), GetDeviceClass().c_str()); -#ifdef ENABLE_HOOK_PCM - outputPcmDumper_ = std::make_unique("HpaeGainNodeOut_id_" + std::to_string(GetSessionId()) + "_ch_" + - std::to_string(GetChannelCount()) + "_rate_" + - std::to_string(GetSampleRate()) + "_" + GetTime() + ".pcm"); -#endif #ifdef ENABLE_HIDUMP_DFX SetNodeName("hpaeGainNode"); #endif @@ -89,7 +84,22 @@ HpaePcmBuffer *HpaeGainNode::SignalProcess(const std::vector &i float *inputData = (float *)inputs[0]->GetPcmDataBuffer(); uint32_t frameLen = inputs[0]->GetFrameLen(); uint32_t channelCount = inputs[0]->GetChannelCount(); - + uint32_t sampleRate = inputs[0]->GetSampleRate(); + +#ifdef ENABLE_HOOK_PCM + if (!outputPcmDumper_ || channelCount != GetChannelCount() || sampleRate != GetSampleRate()) { + // update node info and dump info + HpaeNodeInfo nodeInfo = GetNodeInfo(); + nodeInfo.channels = (AudioChannel)channelCount; + nodeInfo.samplingRate = (AudioSamplingRate)sampleRate; + SetNodeInfo(nodeInfo); + + outputPcmDumper_ = std::make_unique( + "HpaeGainNodeOut_id_" + std::to_string(GetSessionId()) + "_nodeId_" + std::to_string(GetNodeId()) + + "_ch_" + std::to_string(GetChannelCount()) + + "_rate_" + std::to_string(GetSampleRate()) + "_" + GetTime() + ".pcm"); + } +#endif if (needGainState_) { DoGain(inputs[0], frameLen, channelCount); } diff --git a/services/audio_engine/node/src/hpae_process_cluster.cpp b/services/audio_engine/node/src/hpae_process_cluster.cpp index 98898994ab..c7ffa4c79a 100644 --- a/services/audio_engine/node/src/hpae_process_cluster.cpp +++ b/services/audio_engine/node/src/hpae_process_cluster.cpp @@ -182,11 +182,11 @@ void HpaeProcessCluster::Connect(const std::shared_ptrConnect(idGainMap_[sessionId]); idGainMap_[sessionId]->Connect(idLoudnessGainNodeMap_[sessionId]); idLoudnessGainNodeMap_[sessionId]->Connect(idConverterMap_[sessionId]); 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 8ff8b238ca..4caf751798 100644 --- a/services/audio_engine/test/unittest/manager/hpae_manager_test.cpp +++ b/services/audio_engine/test/unittest/manager/hpae_manager_test.cpp @@ -148,7 +148,7 @@ HpaeStreamInfo GetCaptureStreamInfo() return streamInfo; } -HWTEST_F(HpaeManagerUnitTest, constructHpaeManagerTest, TestSize.Level0) +HWTEST_F(HpaeManagerUnitTest, constructHpaeManagerTest001, TestSize.Level0) { EXPECT_NE(hpaeManager_, nullptr); hpaeManager_->Init(); @@ -157,7 +157,21 @@ HWTEST_F(HpaeManagerUnitTest, constructHpaeManagerTest, TestSize.Level0) EXPECT_EQ(hpaeManager_->IsRunning(), true); hpaeManager_->DeInit(); EXPECT_EQ(hpaeManager_->IsInit(), false); + EXPECT_EQ(hpaeManager_->IsRunning(), false); +} + + +HWTEST_F(HpaeManagerUnitTest, constructHpaeManagerTest002, TestSize.Level0) +{ + EXPECT_NE(hpaeManager_, nullptr); + hpaeManager_->Init(); + hpaeManager_->Init(); + EXPECT_EQ(hpaeManager_->IsInit(), true); sleep(1); + EXPECT_EQ(hpaeManager_->IsRunning(), true); + hpaeManager_->DeInit(); + hpaeManager_->DeInit(); + EXPECT_EQ(hpaeManager_->IsInit(), false); EXPECT_EQ(hpaeManager_->IsRunning(), false); } diff --git a/services/audio_engine/utils/hpae_pcm_dumper.cpp b/services/audio_engine/utils/hpae_pcm_dumper.cpp index 8747304cb0..446cbf74b0 100644 --- a/services/audio_engine/utils/hpae_pcm_dumper.cpp +++ b/services/audio_engine/utils/hpae_pcm_dumper.cpp @@ -38,8 +38,10 @@ HpaePcmDumper::~HpaePcmDumper() int32_t HpaePcmDumper::Dump(const int8_t *buffer, int32_t length) { - DumpFileUtil::WriteDumpFile(dumpFile_, (void *)(buffer), length); - AudioCacheMgr::GetInstance().CacheData(filename_, (void *)(buffer), length); + if (AudioDump::GetInstance().GetVersionType() == DumpFileUtil::BETA_VERSION) { + DumpFileUtil::WriteDumpFile(dumpFile_, (void *)(buffer), length); + AudioCacheMgr::GetInstance().CacheData(filename_, (void *)(buffer), length); + } return SUCCESS; } -- Gitee