From 2170a327b09c177e9d0457a9c087d11ae3929064 Mon Sep 17 00:00:00 2001 From: guoyao Date: Thu, 11 Sep 2025 11:22:08 +0800 Subject: [PATCH 1/3] =?UTF-8?q?audio=20engin=20dfx=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E8=A1=A5=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: guoyao --- services/audio_engine/BUILD.gn | 31 ++++++++ .../manager/include/hpae_capturer_manager.h | 2 +- .../include/hpae_inner_capturer_manager.h | 2 +- .../include/hpae_offload_renderer_manager.h | 2 +- .../manager/include/hpae_renderer_manager.h | 2 +- .../manager/src/hpae_capturer_manager.cpp | 51 +++++++----- .../src/hpae_inner_capturer_manager.cpp | 66 ++++++++++------ .../audio_engine/manager/src/hpae_manager.cpp | 67 +++++++++++----- .../src/hpae_offload_renderer_manager.cpp | 63 +++++++++------ .../manager/src/hpae_renderer_manager.cpp | 79 +++++++++++-------- .../include/hpae_message_queue_monitor.h | 37 +++++++++ .../include/hpae_stream_move_monitor.h | 30 +++++++ .../src/hpae_message_queue_monitor.cpp | 34 ++++++++ .../monitor/src/hpae_stream_move_monitor.cpp | 36 +++++++++ .../manager/hpae_capturer_manager_test.cpp | 46 ++++++++--- .../manager/hpae_inner_capturer_unit_test.cpp | 7 +- .../manager/hpae_render_manager_test.cpp | 67 ++++++++++++++++ .../audio_engine/utils/hpae_no_lock_queue.cpp | 3 + 18 files changed, 489 insertions(+), 136 deletions(-) create mode 100644 services/audio_engine/monitor/include/hpae_message_queue_monitor.h create mode 100644 services/audio_engine/monitor/include/hpae_stream_move_monitor.h create mode 100644 services/audio_engine/monitor/src/hpae_message_queue_monitor.cpp create mode 100644 services/audio_engine/monitor/src/hpae_stream_move_monitor.cpp diff --git a/services/audio_engine/BUILD.gn b/services/audio_engine/BUILD.gn index 392444764f..78597aa86a 100644 --- a/services/audio_engine/BUILD.gn +++ b/services/audio_engine/BUILD.gn @@ -40,6 +40,7 @@ ohos_shared_library("audio_engine_utils") { "dfx", "buffer", "manager/include", + "monitor/include", "../audio_service/common/include", "../audio_service/server/include", "../../interfaces/inner_api/native/audiocommon/include", @@ -53,6 +54,7 @@ ohos_shared_library("audio_engine_utils") { ] deps = [ + ":audio_engine_monitor", "../audio_service:audio_common", "../../frameworks/native/audioutils:audio_utils", ] @@ -108,6 +110,7 @@ config("audio_engine_node_config") { include_dirs = [ "node/include", "manager/include", + "monitor/include", "buffer", "simd", "utils", @@ -239,6 +242,7 @@ ohos_shared_library("audio_engine_manager") { deps = [ ":audio_engine_node", ":audio_engine_utils", + ":audio_engine_monitor", "../../frameworks/native/audioeffect:audio_effect", "../../frameworks/native/audioqosmanager:audio_qosmanager", "../../frameworks/native/audioschedule:audio_schedule", @@ -262,3 +266,30 @@ ohos_shared_library("audio_engine_manager") { subsystem_name = "multimedia" part_name = "audio_framework" } + +ohos_shared_library("audio_engine_monitor") { + stack_protector_ret = true + sanitize = { + cfi = true + cfi_cross_dso = true + cfi_vcall_icall_only = true + debug = false + } + install_enable = true + + configs = [ ":audio_engine_node_config" ] + + sources = [ + "monitor/src/hpae_message_queue_monitor.cpp", + "monitor/src/hpae_stream_move_monitor.cpp" + ] + + external_deps = [ + "ipc:ipc_single", + "media_foundation:media_monitor_client", + "media_foundation:media_monitor_common", + "samgr:samgr_proxy", + ] + subsystem_name = "multimedia" + part_name = "audio_framework" +} diff --git a/services/audio_engine/manager/include/hpae_capturer_manager.h b/services/audio_engine/manager/include/hpae_capturer_manager.h index cd12526c3d..757c524088 100644 --- a/services/audio_engine/manager/include/hpae_capturer_manager.h +++ b/services/audio_engine/manager/include/hpae_capturer_manager.h @@ -76,7 +76,7 @@ public: int32_t DumpSourceInfo() override; std::string GetDeviceHDFDumpInfo() override; private: - void SendRequest(Request &&request, bool isInit = false); + void SendRequest(Request &&request, const std::string &funcName, bool isInit = false); int32_t CreateOutputSession(const HpaeStreamInfo &streamInfo); int32_t DeleteOutputSession(uint32_t sessionId); void ConnectProcessClusterWithEc(HpaeProcessorType &sceneType); diff --git a/services/audio_engine/manager/include/hpae_inner_capturer_manager.h b/services/audio_engine/manager/include/hpae_inner_capturer_manager.h index 43d4d45972..8b255314a4 100644 --- a/services/audio_engine/manager/include/hpae_inner_capturer_manager.h +++ b/services/audio_engine/manager/include/hpae_inner_capturer_manager.h @@ -110,7 +110,7 @@ private: int32_t DisConnectCapturerInputSessionInner(uint32_t sessionId); void SetSessionStateForRenderer(uint32_t sessionId, HpaeSessionState renderState); void SetSessionStateForCapturer(uint32_t sessionId, HpaeSessionState capturerState); - void SendRequestInner(Request &&request, bool isInit = false); + void SendRequestInner(Request &&request, const std::string &funcName, bool isInit = false); uint32_t GetSinkInputNodeIdInner(); void AddSingleNodeToSinkInner(const std::shared_ptr &node, bool isConnect = true); void MoveAllStreamToNewSinkInner(const std::string &sinkName, const std::vector &moveIds, diff --git a/services/audio_engine/manager/include/hpae_offload_renderer_manager.h b/services/audio_engine/manager/include/hpae_offload_renderer_manager.h index 6ef1868dd6..9730763225 100644 --- a/services/audio_engine/manager/include/hpae_offload_renderer_manager.h +++ b/services/audio_engine/manager/include/hpae_offload_renderer_manager.h @@ -95,7 +95,7 @@ public: int32_t SetLoudnessGain(uint32_t sessionId, float loudnessGain) override; int32_t GetNodeInputFormatInfo(uint32_t sessionId, AudioBasicFormat &basicFormat) override; private: - void SendRequest(Request &&request, bool isInit = false); + void SendRequest(Request &&request, const std::string &funcName, bool isInit = false); int32_t StartRenderSink(); int32_t CreateInputSession(const HpaeStreamInfo &streamInfo); int32_t ConnectInputSession(); diff --git a/services/audio_engine/manager/include/hpae_renderer_manager.h b/services/audio_engine/manager/include/hpae_renderer_manager.h index b073335877..84af5508b2 100644 --- a/services/audio_engine/manager/include/hpae_renderer_manager.h +++ b/services/audio_engine/manager/include/hpae_renderer_manager.h @@ -100,7 +100,7 @@ public: int32_t DisConnectCoBufferNode(const std::shared_ptr &coBufferNode) override; private: - void SendRequest(Request &&request, bool isInit = false); + void SendRequest(Request &&request, const std::string &funcName, bool isInit = false); int32_t StartRenderSink(); bool IsMchDevice(); int32_t CreateInputSession(const HpaeStreamInfo &streamInfo); diff --git a/services/audio_engine/manager/src/hpae_capturer_manager.cpp b/services/audio_engine/manager/src/hpae_capturer_manager.cpp index 659c6ab8f4..fa5c327ab0 100644 --- a/services/audio_engine/manager/src/hpae_capturer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_capturer_manager.cpp @@ -25,6 +25,8 @@ #include "audio_effect_map.h" #include "hpae_policy_manager.h" #include "audio_engine_log.h" +#include "hpae_message_queue_monitor.h" +#include "hpae_stream_move_monitor.h" namespace OHOS { namespace AudioStandard { @@ -198,7 +200,7 @@ int32_t HpaeCapturerManager::CreateStream(const HpaeStreamInfo &streamInfo) CreateOutputSession(streamInfo); SetSessionState(streamInfo.sessionId, HPAE_SESSION_PREPARED); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -212,7 +214,7 @@ int32_t HpaeCapturerManager::DestroyStream(uint32_t sessionId) // map check in DeleteOutputSession DeleteOutputSession(sessionId); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -314,7 +316,7 @@ int32_t HpaeCapturerManager::Start(uint32_t sessionId) SetSessionState(sessionId, HPAE_SESSION_RUNNING); CHECK_AND_RETURN_LOG(CapturerSourceStart() == SUCCESS, "CapturerSourceStart error."); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -352,7 +354,7 @@ int32_t HpaeCapturerManager::Pause(uint32_t sessionId) TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_RECORD, sessionId, HPAE_SESSION_PAUSED, OPERATION_PAUSED); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -368,7 +370,7 @@ int32_t HpaeCapturerManager::Flush(uint32_t sessionId) "Flush not find sessionId %{public}u", sessionId); // no cache data need to flush }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -386,7 +388,7 @@ int32_t HpaeCapturerManager::Drain(uint32_t sessionId) TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_RECORD, sessionId, sessionNodeMap_[sessionId].state, OPERATION_DRAINED); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -433,7 +435,7 @@ int32_t HpaeCapturerManager::Stop(uint32_t sessionId) TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_RECORD, sessionId, HPAE_SESSION_STOPPED, OPERATION_STOPPED); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -450,7 +452,7 @@ int32_t HpaeCapturerManager::SetStreamMute(uint32_t sessionId, bool isMute) "Mute not find sessionId %{public}u", sessionId); sourceOutputNodeMap_[sessionId]->SetMute(isMute); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -462,7 +464,7 @@ int32_t HpaeCapturerManager::SetMute(bool isMute) isMute_ = isMute; // todo: fadein and fadeout and mute feature } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -643,7 +645,7 @@ int32_t HpaeCapturerManager::ReloadCaptureManager(const HpaeSourceInfo &sourceIn TriggerCallback(INIT_DEVICE_RESULT, sourceInfo_.deviceName, ret); TriggerCallback(INIT_SOURCE_RESULT, sourceInfo_.sourceType); }; - SendRequest(request, true); + SendRequest(request, __func__, true); hpaeSignalProcessThread_->ActivateThread(shared_from_this()); return SUCCESS; } @@ -704,7 +706,7 @@ int32_t HpaeCapturerManager::Init(bool isReload) HpaePolicyManager::GetInstance().SetInputDevice(captureId_, static_cast(sourceInfo_.deviceType)); }; - SendRequest(request, true); + SendRequest(request, __func__, true); hpaeSignalProcessThread_->ActivateThread(shared_from_this()); return SUCCESS; } @@ -760,7 +762,7 @@ int32_t HpaeCapturerManager::RegisterReadCallback(uint32_t sessionId, sourceOutputNodeMap_[sessionId]->RegisterReadCallback(callback); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -805,14 +807,21 @@ bool HpaeCapturerManager::IsRunning(void) } } -void HpaeCapturerManager::SendRequest(Request &&request, bool isInit) +void HpaeCapturerManager::SendRequest(Request &&request, const std::string &funcName, bool isInit) { if (!isInit && !IsInit()) { - AUDIO_INFO_LOG("HpaeCapturerManager not init"); + AUDIO_INFO_LOG("HpaeCapturerManager not init, %{public}s excute failed", funcName.c_str()); + HpaeMessageQueueMonitor::ReportMessageQueueException(HPAE_CAPTURE_MANAGER_TYPE, funcName, + "HpaeCapturerManager not init"); return; } hpaeNoLockQueue_.PushRequest(std::move(request)); CHECK_AND_RETURN_LOG(hpaeSignalProcessThread_, "hpaeSignalProcessThread_ capturer is nullptr"); + if (hpaeSignalProcessThread_ == nullptr) { + AUDIO_INFO_LOG("hpaeSignalProcessThread_ capturer is nullptr, %{public}s excute failed", funcName.c_str()); + HpaeMessageQueueMonitor::ReportMessageQueueException(HPAE_CAPTURE_MANAGER_TYPE, funcName, "thread is nullptr"); + return; + } hpaeSignalProcessThread_->Notify(); } @@ -829,14 +838,14 @@ int32_t HpaeCapturerManager::AddAllNodesToSource(const std::vector %{public}s", sessionId, sourceInfo_.sourceName.c_str(), sourceName.c_str()); TriggerCallback(MOVE_SESSION_FAILED, HPAE_STREAM_CLASS_TYPE_RECORD, sessionId, MOVE_SINGLE, sourceName); + HpaeStreamMoveMonitor::ReportStreamMoveException(0, sessionId, HPAE_STREAM_CLASS_TYPE_RECORD, + sourceInfo_.sourceName, sourceName, "not find session"); return; } std::shared_ptr sourceNode = sourceOutputNodeMap_[sessionId]; @@ -926,6 +937,8 @@ int32_t HpaeCapturerManager::MoveStream(uint32_t sessionId, const std::string& s AUDIO_ERR_LOG("[StartMove] session:%{public}u failed,not find session node,move %{public}s --> %{public}s", sessionId, sourceInfo_.sourceName.c_str(), sourceName.c_str()); TriggerCallback(MOVE_SESSION_FAILED, HPAE_STREAM_CLASS_TYPE_RECORD, sessionId, MOVE_SINGLE, sourceName); + HpaeStreamMoveMonitor::ReportStreamMoveException(sourceNode->GetAppUid(), sessionId, + HPAE_STREAM_CLASS_TYPE_RECORD, sourceInfo_.sourceName, sourceName, "not find session node"); return; } CHECK_AND_RETURN_LOG(!sourceName.empty(), "[StartMove] session:%{public}u failed,sourceName is empty", @@ -941,7 +954,7 @@ int32_t HpaeCapturerManager::MoveStream(uint32_t sessionId, const std::string& s std::string name = sourceName; TriggerCallback(MOVE_SOURCE_OUTPUT, moveInfo, name); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -969,7 +982,7 @@ int32_t HpaeCapturerManager::DumpSourceInfo() SendRequest([this]() { AUDIO_INFO_LOG("DumpSourceInfo deviceName %{public}s", sourceInfo_.deviceName.c_str()); UploadDumpSourceInfo(sourceInfo_.deviceName); - }); + }, __func__); return SUCCESS; } diff --git a/services/audio_engine/manager/src/hpae_inner_capturer_manager.cpp b/services/audio_engine/manager/src/hpae_inner_capturer_manager.cpp index 41d3219c67..05259a4c5d 100644 --- a/services/audio_engine/manager/src/hpae_inner_capturer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_inner_capturer_manager.cpp @@ -22,6 +22,8 @@ #include "hpae_node_common.h" #include "hpae_inner_capturer_manager.h" #include "audio_engine_log.h" +#include "hpae_message_queue_monitor.h" +#include "hpae_stream_move_monitor.h" namespace OHOS { namespace AudioStandard { @@ -44,7 +46,7 @@ int32_t HpaeInnerCapturerManager::AddNodeToSink(const std::shared_ptr %{public}s", sessionId, sinkInfo_.deviceName.c_str(), sinkName.c_str()); TriggerCallback(MOVE_SESSION_FAILED, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, MOVE_SINGLE, sinkName); + HpaeStreamMoveMonitor::ReportStreamMoveException(0, sessionId, HPAE_STREAM_CLASS_TYPE_PLAY, + "innercapture", sinkName, "not find session node"); return; } if (sinkName.empty()) { AUDIO_ERR_LOG("[StartMove] session:%{public}u failed,sinkName is empty", sessionId); TriggerCallback(MOVE_SESSION_FAILED, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, MOVE_SINGLE, sinkName); + HpaeStreamMoveMonitor::ReportStreamMoveException(sinkInputNodeMap_[sessionId]->GetAppUid(), sessionId, + HPAE_STREAM_CLASS_TYPE_PLAY, "innercapture", sinkName, "sinkName is empty"); return; } @@ -161,7 +167,7 @@ int32_t HpaeInnerCapturerManager::MoveStream(uint32_t sessionId, const std::stri std::string name = sinkName; TriggerCallback(MOVE_SINK_INPUT, inputNode, name); }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -189,7 +195,7 @@ int32_t HpaeInnerCapturerManager::CreateStream(const HpaeStreamInfo &streamInfo) capturerSessionNodeMap_[streamInfo.sessionId].isMoveAble = streamInfo.isMoveAble; } }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -213,7 +219,7 @@ int32_t HpaeInnerCapturerManager::DestroyStream(uint32_t sessionId) DeleteCapturerInputSessionInner(sessionId); } }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -243,7 +249,7 @@ int32_t HpaeInnerCapturerManager::ReloadRenderManager(const HpaeSinkInfo &sinkIn } } }; - SendRequestInner(request, true); + SendRequestInner(request, __func__, true); hpaeSignalProcessThread_->ActivateThread(shared_from_this()); return SUCCESS; } @@ -255,7 +261,7 @@ int32_t HpaeInnerCapturerManager::Init(bool isReload) Trace trace("HpaeInnerCapturerManager::Init"); InitSinkInner(isReload); }; - SendRequestInner(request, true); + SendRequestInner(request, __func__, true); hpaeSignalProcessThread_->ActivateThread(shared_from_this()); return SUCCESS; } @@ -336,7 +342,7 @@ int32_t HpaeInnerCapturerManager::Start(uint32_t sessionId) SetSessionStateForCapturer(sessionId, HPAE_SESSION_RUNNING); } }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -363,7 +369,7 @@ int32_t HpaeInnerCapturerManager::Pause(uint32_t sessionId) HPAE_SESSION_PAUSED, OPERATION_PAUSED); } }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -385,7 +391,7 @@ int32_t HpaeInnerCapturerManager::Flush(uint32_t sessionId) "Flush not find sessionId %{public}u", sessionId); } }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -415,7 +421,7 @@ int32_t HpaeInnerCapturerManager::Drain(uint32_t sessionId) capturerSessionNodeMap_[sessionId].state, OPERATION_DRAINED); } }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -442,7 +448,7 @@ int32_t HpaeInnerCapturerManager::Stop(uint32_t sessionId) HPAE_SESSION_STOPPED, OPERATION_STOPPED); } }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -463,7 +469,7 @@ int32_t HpaeInnerCapturerManager::SuspendStreamManager(bool isSuspend) hpaeInnerCapSinkNode_->InnerCapturerSinkStart(); } }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -477,7 +483,7 @@ int32_t HpaeInnerCapturerManager::SetMute(bool isMute) AUDIO_INFO_LOG("hapeInnerCapSinkNode_ is nullptr"); } }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -560,7 +566,7 @@ int32_t HpaeInnerCapturerManager::RegisterWriteCallback(uint32_t sessionId, sinkInputNodeMap_[sessionId]->RegisterWriteCallback(callback); } }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -619,7 +625,7 @@ void HpaeInnerCapturerManager::OnFadeDone(uint32_t sessionId, IOperation operati } TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, state, operation); }; - SendRequestInner(request); + SendRequestInner(request, __func__); } void HpaeInnerCapturerManager::OnNodeStatusUpdate(uint32_t sessionId, IOperation operation) @@ -637,7 +643,7 @@ int32_t HpaeInnerCapturerManager::RegisterReadCallback(uint32_t sessionId, AUDIO_INFO_LOG("RegisterReadCallback sessionId %{public}u", sessionId); sourceOutputNodeMap_[sessionId]->RegisterReadCallback(callback); }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -804,7 +810,7 @@ void HpaeInnerCapturerManager::OnDisConnectProcessCluster(HpaeProcessorType scen AUDIO_INFO_LOG("no need erase rendererSceneCluster sceneType[%{public}d]", sceneType); } }; - SendRequestInner(request); + SendRequestInner(request, __func__); } int32_t HpaeInnerCapturerManager::DisConnectRendererInputSessionInner(uint32_t sessionId) @@ -842,14 +848,22 @@ void HpaeInnerCapturerManager::SetSessionStateForCapturer(uint32_t sessionId, Hp capturerSessionNodeMap_[sessionId].state = capturerState; } -void HpaeInnerCapturerManager::SendRequestInner(Request &&request, bool isInit) +void HpaeInnerCapturerManager::SendRequestInner(Request &&request, const std::string &funcName, bool isInit) { if (!isInit && !IsInit()) { - AUDIO_INFO_LOG("HpaeInnerCapturerManager not init"); + AUDIO_INFO_LOG("HpaeInnerCapturerManager not init, %{public}s excute failed", funcName.c_str()); + HpaeMessageQueueMonitor::ReportMessageQueueException(HPAE_INNER_CAPTURE_MANAGER_TYPE, + funcName, "HpaeInnerCapturerManager not init"); return; } hpaeNoLockQueue_.PushRequest(std::move(request)); - CHECK_AND_RETURN_LOG(hpaeSignalProcessThread_, "hpaeSignalProcessThread_ inner capturer sink is nullptr"); + if (hpaeSignalProcessThread_ == nullptr) { + AUDIO_INFO_LOG("hpaeSignalProcessThread_ inner capturer sink is nullptr, %{public}s excute failed", + funcName.c_str()); + HpaeMessageQueueMonitor::ReportMessageQueueException(HPAE_INNER_CAPTURE_MANAGER_TYPE, funcName, + "thread is nullptr"); + return; + } hpaeSignalProcessThread_->Notify(); } @@ -896,7 +910,7 @@ int32_t HpaeInnerCapturerManager::SetLoudnessGain(uint32_t sessionId, float loud "processCluster with sceneType %{public}d not exists", processorType); processCluster->SetLoudnessGain(sessionId, loudnessGain); }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -907,7 +921,7 @@ int32_t HpaeInnerCapturerManager::DumpSinkInfo() AUDIO_INFO_LOG("DumpSinkInfo deviceName %{public}s", sinkInfo_.deviceName.c_str()); UploadDumpSinkInfo(sinkInfo_.deviceName); }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -920,7 +934,7 @@ int32_t HpaeInnerCapturerManager::SetOffloadPolicy(uint32_t sessionId, int32_t s CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId), "not find sessionId %{public}u", sessionId); sinkInputNodeMap_[sessionId]->SetOffloadEnabled(state != OFFLOAD_DEFAULT); }; - SendRequestInner(request); + SendRequestInner(request, __func__); return SUCCESS; } @@ -933,7 +947,7 @@ void HpaeInnerCapturerManager::SetSpeed(uint32_t sessionId, float speed) CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId), "not find sessionId %{public}u", sessionId); sinkInputNodeMap_[sessionId]->SetSpeed(speed); }; - SendRequestInner(request); + SendRequestInner(request, __func__); } } // namespace HPAE } // namespace AudioStandard diff --git a/services/audio_engine/manager/src/hpae_manager.cpp b/services/audio_engine/manager/src/hpae_manager.cpp index e1f9f43ae6..0c4af2be14 100644 --- a/services/audio_engine/manager/src/hpae_manager.cpp +++ b/services/audio_engine/manager/src/hpae_manager.cpp @@ -28,6 +28,8 @@ #include "system_ability_definition.h" #include "hpae_co_buffer_node.h" #include "audio_engine_log.h" +#include "hpae_message_queue_monitor.h" +#include "hpae_stream_move_monitor.h" namespace OHOS { namespace AudioStandard { @@ -129,7 +131,7 @@ int32_t HpaeManager::SuspendAudioDevice(std::string &audioPortName, bool isSuspe AUDIO_WARNING_LOG("capture not support suspend"); return; } else { - AUDIO_WARNING_LOG("can not find sink: %{public}s", audioPortName.c_str()); + AUDIO_WARNING_LOG("can not find suspend sink: %{public}s", audioPortName.c_str()); return; } }; @@ -764,27 +766,37 @@ int32_t HpaeManager::MoveSourceOutputByIndexOrName( bool HpaeManager::CheckMoveSourceOutput(uint32_t sourceOutputId, const std::string &sourceName) { + if (capturerIdStreamInfoMap_.find(sourceOutputId) == capturerIdStreamInfoMap_.end()) { + HILOG_COMM_INFO("move session:%{public}u failed,can not find session", sourceOutputId); + HpaeStreamMoveMonitor::ReportStreamMoveException(0, sourceOutputId, HPAE_STREAM_CLASS_TYPE_RECORD, + "", sourceName, "can not find session"); + return false; + } + std::shared_ptr oldCaptureManager = GetCapturerManagerById(sourceOutputId); + if (oldCaptureManager == nullptr) { + HILOG_COMM_INFO("move session:%{public}u failed,can not find source.", sourceOutputId); + HpaeStreamMoveMonitor::ReportStreamMoveException(stream.uid, sourceOutputId, + HPAE_STREAM_CLASS_TYPE_RECORD, "", sourceName, "can not find source"); + return false; + } if (sourceName.empty()) { HILOG_COMM_INFO("move session:%{public}u failed,source name is empty.", sourceOutputId); + HpaeStreamMoveMonitor::ReportStreamMoveException(stream.uid, sourceOutputId, + HPAE_STREAM_CLASS_TYPE_RECORD, capturerIdSourceNameMap_[sourceOutputId], "", "source name is empty"); return false; } std::shared_ptr captureManager = GetCapturerManagerByName(sourceName); if (captureManager == nullptr || !captureManager->IsInit()) { HILOG_COMM_INFO("move session:%{public}u failed, can not find source:%{public}s or source is not open.", sourceOutputId, sourceName.c_str()); - return false; - } - std::shared_ptr oldCaptureManager = GetCapturerManagerById(sourceOutputId); - if (oldCaptureManager == nullptr) { - HILOG_COMM_INFO("move session:%{public}u failed,can not find source.", sourceOutputId); - return false; - } - if (capturerIdStreamInfoMap_.find(sourceOutputId) == capturerIdStreamInfoMap_.end()) { - HILOG_COMM_INFO("move session:%{public}u failed,can not find session", sourceOutputId); + HpaeStreamMoveMonitor::ReportStreamMoveException(stream.uid, sourceOutputId, + HPAE_STREAM_CLASS_TYPE_RECORD, capturerIdSourceNameMap_[sourceOutputId], sourceName, "source is not open"); return false; } if (!capturerIdStreamInfoMap_[sourceOutputId].streamInfo.isMoveAble) { HILOG_COMM_INFO("move session:%{public}u failed,session is not moveable.", sourceOutputId); + HpaeStreamMoveMonitor::ReportStreamMoveException(stream.uid, sourceOutputId, HPAE_STREAM_CLASS_TYPE_RECORD, + capturerIdSourceNameMap_[sourceOutputId], sourceName, "session is not moveable"); return false; } return true; @@ -792,27 +804,37 @@ bool HpaeManager::CheckMoveSourceOutput(uint32_t sourceOutputId, const std::stri bool HpaeManager::CheckMoveSinkInput(uint32_t sinkInputId, const std::string &sinkName) { + if (rendererIdStreamInfoMap_.find(sinkInputId) == rendererIdStreamInfoMap_.end()) { + HILOG_COMM_INFO("move session:%{public}u failed,can not find session", sinkInputId); + HpaeStreamMoveMonitor::ReportStreamMoveException(0, sinkInputId, HPAE_STREAM_CLASS_TYPE_PLAY, + "", sinkName, "can not find session"); + return false; + } + std::shared_ptr oldRendererManager = GetRendererManagerById(sinkInputId); + if (oldRendererManager == nullptr) { + HILOG_COMM_INFO("move session:%{public}u failed,can not find sink", sinkInputId); + HpaeStreamMoveMonitor::ReportStreamMoveException(stream.uid, sinkInputId, HPAE_STREAM_CLASS_TYPE_PLAY, + "", sinkName, "src sink is not find"); + return false; + } if (sinkName.empty()) { HILOG_COMM_INFO("move session:%{public}u failed,sink name is empty.", sinkInputId); + HpaeStreamMoveMonitor::ReportStreamMoveException(stream.uid, sinkInputId, HPAE_STREAM_CLASS_TYPE_PLAY, + rendererIdSinkNameMap_[sinkInputId], sinkName, "sink name is empty"); return false; } std::shared_ptr rendererManager = GetRendererManagerByName(sinkName); if (rendererManager == nullptr || !rendererManager->IsInit()) { HILOG_COMM_INFO("move session:%{public}u failed, can not find sink:%{public}s or sink is not open.", sinkInputId, sinkName.c_str()); - return false; - } - std::shared_ptr oldRendererManager = GetRendererManagerById(sinkInputId); - if (oldRendererManager == nullptr) { - HILOG_COMM_INFO("move session:%{public}u failed,can not find sink", sinkInputId); - return false; - } - if (rendererIdStreamInfoMap_.find(sinkInputId) == rendererIdStreamInfoMap_.end()) { - HILOG_COMM_INFO("move session:%{public}u failed,can not find session", sinkInputId); + HpaeStreamMoveMonitor::ReportStreamMoveException(stream.uid, sinkInputId, HPAE_STREAM_CLASS_TYPE_PLAY, + rendererIdSinkNameMap_[sinkInputId], sinkName, "dest sink is not open"); return false; } if (!rendererIdStreamInfoMap_[sinkInputId].streamInfo.isMoveAble) { HILOG_COMM_INFO("move session:%{public}u failed,session is not moveable.", sinkInputId); + HpaeStreamMoveMonitor::ReportStreamMoveException(stream.uid, sinkInputId, HPAE_STREAM_CLASS_TYPE_PLAY, + rendererIdSinkNameMap_[sinkInputId], sinkName, "session is not moveable"); return false; } return true; @@ -1189,7 +1211,12 @@ void HpaeManager::SendRequest(Request &&request, std::string funcName) { Trace trace("sendrequest::" + funcName); hpaeNoLockQueue_.PushRequest(std::move(request)); - CHECK_AND_RETURN_LOG(hpaeManagerThread_, "hpaeManagerThread_ is nullptr"); + if (hpaeManagerThread_ == nullptr) { + AUDIO_ERR_LOG("hpaeManagerThread_ is nullptr, %{public}s excute failed", funcName.c_str()); + HpaeMessageQueueMonitor::ReportMessageQueueException(HPAE_MANAGER_TYPE, funcName, + "hpaeManagerThread_ is nullptr"); + return; + } hpaeManagerThread_->Notify(); } // play and record stream interface diff --git a/services/audio_engine/manager/src/hpae_offload_renderer_manager.cpp b/services/audio_engine/manager/src/hpae_offload_renderer_manager.cpp index 6044deb328..77fa4d8473 100644 --- a/services/audio_engine/manager/src/hpae_offload_renderer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_offload_renderer_manager.cpp @@ -21,6 +21,8 @@ #include "audio_errors.h" #include "hpae_node_common.h" #include "audio_engine_log.h" +#include "hpae_message_queue_monitor.h" +#include "hpae_stream_move_monitor.h" namespace OHOS { namespace AudioStandard { @@ -66,7 +68,7 @@ int32_t HpaeOffloadRendererManager::CreateInputSession(const HpaeStreamInfo &str int32_t HpaeOffloadRendererManager::AddNodeToSink(const std::shared_ptr &node) { auto request = [this, node]() { AddSingleNodeToSink(node); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -106,7 +108,7 @@ int32_t HpaeOffloadRendererManager::AddAllNodesToSink( AddSingleNodeToSink(it, isConnect); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -120,7 +122,7 @@ int32_t HpaeOffloadRendererManager::CreateStream(const HpaeStreamInfo &streamInf sessionInfo_.state = HPAE_SESSION_PREPARED; sinkInputNode_->SetState(HPAE_SESSION_PREPARED); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -145,7 +147,7 @@ int32_t HpaeOffloadRendererManager::DestroyStream(uint32_t sessionId) AUDIO_INFO_LOG("DestroyStream sessionId %{public}u", sessionId); DeleteInputSession(); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -190,7 +192,7 @@ int32_t HpaeOffloadRendererManager::Start(uint32_t sessionId) } sessionInfo_.state = HPAE_SESSION_RUNNING; }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -222,7 +224,7 @@ int32_t HpaeOffloadRendererManager::Pause(uint32_t sessionId) sessionInfo_.state = HPAE_SESSION_PAUSED; TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, sessionInfo_.state, OPERATION_PAUSED); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -237,7 +239,7 @@ int32_t HpaeOffloadRendererManager::Flush(uint32_t sessionId) // flush sinkoutput cache sinkOutputNode_->FlushStream(); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -253,7 +255,7 @@ int32_t HpaeOffloadRendererManager::Drain(uint32_t sessionId) UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, sessionInfo_.state, OPERATION_DRAINED); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -272,7 +274,7 @@ int32_t HpaeOffloadRendererManager::Stop(uint32_t sessionId) } TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, sessionInfo_.state, OPERATION_STOPPED); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -312,7 +314,7 @@ int32_t HpaeOffloadRendererManager::MoveAllStream(const std::string &sinkName, c auto request = [this, sinkName, sessionIds, moveType]() { MoveAllStreamToNewSink(sinkName, sessionIds, moveType); }; - SendRequest(request); + SendRequest(request, __func__); } return SUCCESS; } @@ -324,12 +326,16 @@ int32_t HpaeOffloadRendererManager::MoveStream(uint32_t sessionId, const std::st AUDIO_ERR_LOG("[StartMove] session:%{public}d failed,sink [offload] --> [%{public}s]", sessionId, sinkName.c_str()); TriggerCallback(MOVE_SESSION_FAILED, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, MOVE_SINGLE, sinkName); + HpaeStreamMoveMonitor::ReportStreamMoveException(0, sessionId, HPAE_STREAM_CLASS_TYPE_PLAY, + "offload", sinkName, "not find session node"); return; } if (sinkName.empty()) { AUDIO_ERR_LOG("[StartMove] session:%{public}u failed,sinkName is empty", sessionId); TriggerCallback(MOVE_SESSION_FAILED, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, MOVE_SINGLE, sinkName); + HpaeStreamMoveMonitor::ReportStreamMoveException(sinkInputNode_->GetAppUid(), sessionId, + HPAE_STREAM_CLASS_TYPE_PLAY, "offload", sinkName, "sinkName is empty"); return; } @@ -339,7 +345,7 @@ int32_t HpaeOffloadRendererManager::MoveStream(uint32_t sessionId, const std::st std::string name = sinkName; TriggerCallback(MOVE_SINK_INPUT, inputNode, name); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -357,7 +363,7 @@ int32_t HpaeOffloadRendererManager::SuspendStreamManager(bool isSuspend) sinkOutputNode_->RenderSinkStart(); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -366,7 +372,7 @@ int32_t HpaeOffloadRendererManager::SetMute(bool isMute) auto request = [this, isMute]() { isMute_ = isMute; // todo: set to sinkoutputnode }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -393,7 +399,7 @@ int32_t HpaeOffloadRendererManager::ReloadRenderManager(const HpaeSinkInfo &sink ConnectInputSession(); } }; - SendRequest(request, true); + SendRequest(request, __func__, true); hpaeSignalProcessThread_->ActivateThread(shared_from_this()); return SUCCESS; } @@ -404,7 +410,7 @@ int32_t HpaeOffloadRendererManager::Init(bool isReload) auto request = [this, isReload] { InitSinkInner(isReload); }; - SendRequest(request, true); + SendRequest(request, __func__, true); hpaeSignalProcessThread_->ActivateThread(shared_from_this()); return SUCCESS; } @@ -536,7 +542,7 @@ int32_t HpaeOffloadRendererManager::RegisterWriteCallback( sessionId); sinkInputNode_->RegisterWriteCallback(callback); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -575,7 +581,7 @@ int32_t HpaeOffloadRendererManager::SetOffloadPolicy(uint32_t sessionId, int32_t sinkOutputNode_->SetPolicyState(state); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -605,7 +611,7 @@ int32_t HpaeOffloadRendererManager::SetOffloadRenderCallbackType(uint32_t sessio sinkOutputNode_->SetOffloadRenderCallbackType(type); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -618,7 +624,7 @@ void HpaeOffloadRendererManager::SetSpeed(uint32_t sessionId, float speed) CHECK_AND_RETURN_LOG(sinkOutputNode_, "sinkOutputNode is nullptr"); sinkOutputNode_->SetSpeed(speed); }; - SendRequest(request); + SendRequest(request, __func__); } std::vector HpaeOffloadRendererManager::GetAllSinkInputsInfo() @@ -648,11 +654,20 @@ HpaeSinkInfo HpaeOffloadRendererManager::GetSinkInfo() return sinkInfo_; } -void HpaeOffloadRendererManager::SendRequest(Request &&request, bool isInit) +void HpaeOffloadRendererManager::SendRequest(Request &&request, const std::string &funcName, bool isInit) { - CHECK_AND_RETURN_LOG(isInit || IsInit(), "HpaeOffloadRendererManager not init"); + if (!isInit && !IsInit()) { + AUDIO_ERR_LOG("HpaeOffloadRendererManager not init, %{public}s excute failed", funcName.c_str()); + HpaeMessageQueueMonitor::ReportMessageQueueException(HPAE_OFFLOAD_MANAGER_TYPE, funcName, + "HpaeOffloadRendererManager not init"); + return; + } hpaeNoLockQueue_.PushRequest(std::move(request)); - CHECK_AND_RETURN_LOG(hpaeSignalProcessThread_, "hpaeSignalProcessThread_ offloadrenderer is nullptr"); + if (hpaeSignalProcessThread_ == nullptr) { + AUDIO_ERR_LOG("hpaeSignalProcessThread_ is nullptr, %{public}s excute failed", funcName.c_str()); + HpaeMessageQueueMonitor::ReportMessageQueueException(HPAE_OFFLOAD_MANAGER_TYPE, funcName, "thread is nullptr"); + return; + } hpaeSignalProcessThread_->Notify(); } @@ -691,7 +706,7 @@ int32_t HpaeOffloadRendererManager::DumpSinkInfo() AUDIO_INFO_LOG("DumpSinkInfo deviceName %{public}s", sinkInfo_.deviceName.c_str()); UploadDumpSinkInfo(sinkInfo_.deviceName); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -713,7 +728,7 @@ int32_t HpaeOffloadRendererManager::SetLoudnessGain(uint32_t sessionId, float lo CHECK_AND_RETURN_LOG(loudnessGainNode_, "session id %{public}d is not connected", sessionId); loudnessGainNode_->SetLoudnessGain(loudnessGain); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } diff --git a/services/audio_engine/manager/src/hpae_renderer_manager.cpp b/services/audio_engine/manager/src/hpae_renderer_manager.cpp index da52b8fe04..978b5a97e0 100644 --- a/services/audio_engine/manager/src/hpae_renderer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_renderer_manager.cpp @@ -27,6 +27,8 @@ #include "audio_engine_log.h" #include "hpae_output_cluster.h" #include "hpae_remote_output_cluster.h" +#include "hpae_message_queue_monitor.h" +#include "hpae_stream_move_monitor.h" constexpr int32_t DEFAULT_EFFECT_RATE = 48000; constexpr int32_t DEFAULT_EFFECT_FRAME_LEN = 960; @@ -92,7 +94,7 @@ int32_t HpaeRendererManager::CreateInputSession(const HpaeStreamInfo &streamInfo int32_t HpaeRendererManager::AddNodeToSink(const std::shared_ptr &node) { auto request = [this, node]() { AddSingleNodeToSink(node); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -229,7 +231,7 @@ int32_t HpaeRendererManager::AddAllNodesToSink( AddSingleNodeToSink(it, isConnect); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -289,7 +291,7 @@ int32_t HpaeRendererManager::RefreshProcessClusterByDevice() RefreshProcessClusterByDeviceInner(it.second); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -309,7 +311,7 @@ int32_t HpaeRendererManager::CreateStream(const HpaeStreamInfo &streamInfo) sessionNodeMap_[streamInfo.sessionId].isMoveAble = streamInfo.isMoveAble; sinkInputNodeMap_[streamInfo.sessionId]->SetState(HPAE_SESSION_PREPARED); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -328,7 +330,7 @@ int32_t HpaeRendererManager::DestroyStream(uint32_t sessionId) sinkInputNodeMap_[sessionId]->SetState(HPAE_SESSION_RELEASED); DeleteInputSession(sessionId); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -529,7 +531,7 @@ int32_t HpaeRendererManager::MoveAllStream(const std::string &sinkName, const st auto request = [this, sinkName, sessionIds, moveType]() { MoveAllStreamToNewSink(sinkName, sessionIds, moveType); }; - SendRequest(request); + SendRequest(request, __func__); } return SUCCESS; } @@ -540,12 +542,16 @@ void HpaeRendererManager::MoveStreamSync(uint32_t sessionId, const std::string & AUDIO_ERR_LOG("[StartMove] session:%{public}u failed,can not find session,move %{public}s --> %{public}s", sessionId, sinkInfo_.deviceName.c_str(), sinkName.c_str()); TriggerCallback(MOVE_SESSION_FAILED, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, MOVE_SINGLE, sinkName); + HpaeStreamMoveMonitor::ReportStreamMoveException(0, sessionId, HPAE_STREAM_CLASS_TYPE_PLAY, + sinkInfo_.deviceName, sinkName, "not find session node"); return; } if (sinkName.empty()) { AUDIO_ERR_LOG("[StartMove] session:%{public}u failed,sinkName is empty", sessionId); TriggerCallback(MOVE_SESSION_FAILED, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, MOVE_SINGLE, sinkName); + HpaeStreamMoveMonitor::ReportStreamMoveException(sinkInputNodeMap_[sessionId]->GetAppUid(), sessionId, + HPAE_STREAM_CLASS_TYPE_PLAY, sinkInfo_.deviceName, sinkName, "sinkName is empty"); return; } @@ -572,7 +578,7 @@ int32_t HpaeRendererManager::MoveStream(uint32_t sessionId, const std::string &s MoveStreamSync(sessionId, sinkName); } else { auto request = [this, sessionId, sinkName]() { MoveStreamSync(sessionId, sinkName); }; - SendRequest(request); + SendRequest(request, __func__); } return SUCCESS; } @@ -590,7 +596,7 @@ int32_t HpaeRendererManager::Start(uint32_t sessionId) SetSessionState(sessionId, HPAE_SESSION_RUNNING); SetSessionFade(sessionId, OPERATION_STARTED); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -611,7 +617,7 @@ int32_t HpaeRendererManager::StartWithSyncId(uint32_t sessionId, int32_t syncId) HandleSyncId(sessionId, syncId); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -650,7 +656,7 @@ void HpaeRendererManager::OnDisConnectProcessCluster(HpaeProcessorType sceneType } DeleteProcessCluster(sceneType); }; - SendRequest(request); + SendRequest(request, __func__); } void HpaeRendererManager::DisConnectInputCluster(uint32_t sessionId, HpaeProcessorType sceneType) @@ -688,7 +694,7 @@ int32_t HpaeRendererManager::Pause(uint32_t sessionId) DisConnectInputSession(sessionId); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -706,7 +712,7 @@ int32_t HpaeRendererManager::Flush(uint32_t sessionId) "Flush not find sceneType: %{public}d in sceneClusterMap", static_cast(sceneType)); sceneClusterMap_[sceneType]->InitEffectBuffer(sessionId); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -727,7 +733,7 @@ int32_t HpaeRendererManager::Drain(uint32_t sessionId) OPERATION_DRAINED); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -742,7 +748,7 @@ int32_t HpaeRendererManager::Stop(uint32_t sessionId) DisConnectInputSession(sessionId); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -785,7 +791,7 @@ int32_t HpaeRendererManager::SuspendStreamManager(bool isSuspend) outputCluster_->Start(); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -797,7 +803,7 @@ int32_t HpaeRendererManager::SetMute(bool isMute) isMute_ = isMute; // todo: fadein and fadeout and mute feature } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -817,7 +823,7 @@ int32_t HpaeRendererManager::ReloadRenderManager(const HpaeSinkInfo &sinkInfo, b AUDIO_INFO_LOG("ReloadRenderManager deviceName %{public}s", sinkInfo.deviceName.c_str()); for (const auto &it : sinkInputNodeMap_) { - DeleteConnectInputProcessor(it.second); + DeleteProcessCluster(it.first); } AUDIO_INFO_LOG("delete device:%{public}s all input processor end", sinkInfo.deviceName.c_str()); sinkInfo_ = sinkInfo; @@ -829,7 +835,7 @@ int32_t HpaeRendererManager::ReloadRenderManager(const HpaeSinkInfo &sinkInfo, b } AUDIO_INFO_LOG("connect device:%{public}s all processor end", sinkInfo.deviceName.c_str()); }; - SendRequest(request, true); + SendRequest(request, __func__, true); hpaeSignalProcessThread_->ActivateThread(shared_from_this()); return SUCCESS; } @@ -908,7 +914,7 @@ int32_t HpaeRendererManager::Init(bool isReload) Trace trace("HpaeRendererManager::Init"); InitManager(isReload); }; - SendRequest(request, true); + SendRequest(request, __func__, true); hpaeSignalProcessThread_->ActivateThread(shared_from_this()); return SUCCESS; } @@ -979,7 +985,7 @@ int32_t HpaeRendererManager::SetLoudnessGain(uint32_t sessionId, float loudnessG "session with Id %{public}d not in sceneClusterMap_", sessionId); processCluster->SetLoudnessGain(sessionId, loudnessGain); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -1011,7 +1017,7 @@ int32_t HpaeRendererManager::SetAudioEffectMode(uint32_t sessionId, int32_t effe } } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -1087,7 +1093,7 @@ void HpaeRendererManager::SetSpeed(uint32_t sessionId, float speed) CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId), "not find sessionId %{public}u", sessionId); sinkInputNodeMap_[sessionId]->SetSpeed(speed); }; - SendRequest(request); + SendRequest(request, __func__); } std::vector HpaeRendererManager::GetAllSinkInputsInfo() @@ -1129,12 +1135,21 @@ bool HpaeRendererManager::IsRunning(void) } } -void HpaeRendererManager::SendRequest(Request &&request, bool isInit) +void HpaeRendererManager::SendRequest(Request &&request, const std::string &funcName, bool isInit) { - AUDIO_DEBUG_LOG("HpaeRendererManager::isInit is %{public}s", isInit ? "true" : "false"); - CHECK_AND_RETURN_LOG(isInit || IsInit(), "HpaeRendererManager not init"); + if (!isInit && !IsInit()) { + AUDIO_ERR_LOG("HpaeRendererManager not init, %{public}s excute failed", funcName.c_str()); + HpaeMessageQueueMonitor::ReportMessageQueueException(HPAE_RENDERER_MANAGER_TYPE, funcName, + "HpaeRendererManager not init"); + return; + } hpaeNoLockQueue_.PushRequest(std::move(request)); - CHECK_AND_RETURN_LOG(hpaeSignalProcessThread_, "hpaeSignalProcessThread_ renderer is nullptr"); + if (hpaeSignalProcessThread_ == nullptr) { + AUDIO_ERR_LOG("hpaeSignalProcessThread_ is nullptr, %{public}s excute failed", funcName.c_str()); + HpaeMessageQueueMonitor::ReportMessageQueueException(HPAE_RENDERER_MANAGER_TYPE, funcName, + "thread is nullptr"); + return; + } hpaeSignalProcessThread_->Notify(); } @@ -1156,7 +1171,7 @@ void HpaeRendererManager::OnFadeDone(uint32_t sessionId, IOperation operation) } TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, state, operation); }; - SendRequest(request); + SendRequest(request, __func__); } int32_t HpaeRendererManager::RegisterReadCallback(uint32_t sessionId, @@ -1242,7 +1257,7 @@ int32_t HpaeRendererManager::DumpSinkInfo() AUDIO_INFO_LOG("DumpSinkInfo deviceName %{public}s", sinkInfo_.deviceName.c_str()); UploadDumpSinkInfo(sinkInfo_.deviceName); }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -1258,7 +1273,7 @@ int32_t HpaeRendererManager::SetOffloadPolicy(uint32_t sessionId, int32_t state) AUDIO_ERR_LOG("not find sessionId %{public}u", sessionId); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -1281,7 +1296,7 @@ int32_t HpaeRendererManager::UpdateCollaborativeState(bool isCollaborationEnable DisableCollaboration(); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -1323,7 +1338,7 @@ int32_t HpaeRendererManager::ConnectCoBufferNode(const std::shared_ptrStart(); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } @@ -1337,7 +1352,7 @@ int32_t HpaeRendererManager::DisConnectCoBufferNode(const std::shared_ptrSetOutputClusterConnected(false); } }; - SendRequest(request); + SendRequest(request, __func__); return SUCCESS; } diff --git a/services/audio_engine/monitor/include/hpae_message_queue_monitor.h b/services/audio_engine/monitor/include/hpae_message_queue_monitor.h new file mode 100644 index 0000000000..09ebdb1457 --- /dev/null +++ b/services/audio_engine/monitor/include/hpae_message_queue_monitor.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef HPAE_MESSAGE_QUEUE_MONITOR_H +#define HPAE_MESSAGE_QUEUE_MONITOR_H +#include +#include +namespace OHOS { +namespace AudioStandard { +namespace HPAE { +enum MessageQueueType : int32_t { + HPAE_MANAGER_TYPE, + HPAE_RENDERER_MANAGER_TYPE, + HPAE_CAPTURE_MANAGER_TYPE, + HPAE_INNER_CAPTURE_MANAGER_TYPE, + HPAE_OFFLOAD_MANAGER_TYPE, + HPAE_NO_LOCK_QUEUE_TYPE, +}; +class HpaeMessageQueueMonitor { +public: + static void ReportMessageQueueException(MessageQueueType type, const std::string &func, const std::string &error); +}; +} +} +} +#endif \ No newline at end of file diff --git a/services/audio_engine/monitor/include/hpae_stream_move_monitor.h b/services/audio_engine/monitor/include/hpae_stream_move_monitor.h new file mode 100644 index 0000000000..d8070eeeb9 --- /dev/null +++ b/services/audio_engine/monitor/include/hpae_stream_move_monitor.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef HPAE_STREAM_MOVE_MONITOR_H +#define HPAE_STREAM_MOVE_MONITOR_H +#include +#include +namespace OHOS { +namespace AudioStandard { +namespace HPAE { +class HpaeStreamMoveMonitor { +public: + static void ReportStreamMoveException(int32_t clientId, uint32_t sessionId, uint32_t streamType, + const std::string &srcName, const std::string &desName, const std::string &error); +}; +} +} +} +#endif \ No newline at end of file diff --git a/services/audio_engine/monitor/src/hpae_message_queue_monitor.cpp b/services/audio_engine/monitor/src/hpae_message_queue_monitor.cpp new file mode 100644 index 0000000000..2e41e09fc1 --- /dev/null +++ b/services/audio_engine/monitor/src/hpae_message_queue_monitor.cpp @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "hpae_message_queue_monitor.h" +#include "media_monitor_manager.h" + +namespace OHOS { +namespace AudioStandard { +namespace HPAE { +void HpaeMessageQueueMonitor::ReportMessageQueueException(MessageQueueType type, const std::string &func, + const std::string &error) +{ + std::shared_ptr bean = std::make_shared( + Media::MediaMonitor::AUDIO, Media::MediaMonitor::EventId::HPAE_MESSAGE_QUEUE_EXCEPTION, + Media::MediaMonitor::EventType::FAULT_EVENT); + bean->Add("MSG_TYPE", type); + bean->Add("MSG_FUNC_NAME", func); + bean->Add("MSG_ERROR_DESCRIPTION", error); + Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean); +} +} +} +} \ No newline at end of file diff --git a/services/audio_engine/monitor/src/hpae_stream_move_monitor.cpp b/services/audio_engine/monitor/src/hpae_stream_move_monitor.cpp new file mode 100644 index 0000000000..4bb63d68fb --- /dev/null +++ b/services/audio_engine/monitor/src/hpae_stream_move_monitor.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "hpae_stream_move_monitor.h" +#include "media_monitor_manager.h" +namespace OHOS { +namespace AudioStandard { +namespace HPAE { +void HpaeStreamMoveMonitor::ReportStreamMoveException(int32_t clientId, uint32_t sessionId, uint32_t streamType, + const std::string &srcName, const std::string &desName, const std::string &error) +{ + std::shared_ptr bean = std::make_shared( + Media::MediaMonitor::AUDIO, Media::MediaMonitor::EventId::STREAM_MOVE_EXCEPTION, + Media::MediaMonitor::EventType::FAULT_EVENT); + bean->Add("CLIENT_UID", clientId); + bean->Add("SESSION_ID", static_cast(sessionId)); + bean->Add("CURRENT_NAME", srcName); + bean->Add("DES_NAME", desName); + bean->Add("STREAM_TYPE", static_cast(streamType)); + bean->Add("ERROR_DESCRIPTION", error); + Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean); +} +} +} +} 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 f37637f72e..9f016d74c6 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 @@ -86,7 +86,7 @@ static void InitReloadStreamInfo(HpaeStreamInfo &streamInfo) streamInfo.deviceName = "Built_in_mic"; } -static void WaitForMsgProcessing(std::shared_ptr &capturerManager) +static void WaitForMsgProcessing(std::shared_ptr &capturerManager) { int waitCount = 0; const int waitCountThd = 5; @@ -124,7 +124,7 @@ HWTEST_F(HpaeCapturerManagerTest, HpaeCapturerManagerConstructTest, TestSize.Lev HpaeSourceInfo sourceInfo; InitSourceInfo(sourceInfo); - std::shared_ptr capturerManager = std::make_shared(sourceInfo); + std::shared_ptr capturerManager = std::make_shared(sourceInfo); HpaeSourceInfo dstSourceInfo = capturerManager->GetSourceInfo(); EXPECT_EQ(dstSourceInfo.deviceNetId == sourceInfo.deviceNetId, true); EXPECT_EQ(dstSourceInfo.deviceClass == sourceInfo.deviceClass, true); @@ -147,7 +147,7 @@ HWTEST_F(HpaeCapturerManagerTest, HpaeCapturerManagerInitTest, TestSize.Level1) HpaeSourceInfo sourceInfo; InitSourceInfo(sourceInfo); - std::shared_ptr capturerManager = std::make_shared(sourceInfo); + std::shared_ptr capturerManager = std::make_shared(sourceInfo); EXPECT_EQ(capturerManager->Init() == SUCCESS, true); WaitForMsgProcessing(capturerManager); EXPECT_EQ(capturerManager->DeInit() == SUCCESS, true); @@ -165,7 +165,7 @@ HWTEST_F(HpaeCapturerManagerTest, HpaeCapturerManagerCreateDestoryStreamTest, Te HpaeSourceInfo sourceInfo; InitSourceInfo(sourceInfo); - std::shared_ptr capturerManager = std::make_shared(sourceInfo); + std::shared_ptr capturerManager = std::make_shared(sourceInfo); EXPECT_EQ(capturerManager->Init() == SUCCESS, true); WaitForMsgProcessing(capturerManager); EXPECT_EQ(capturerManager->IsInit(), true); @@ -187,7 +187,7 @@ HWTEST_F(HpaeCapturerManagerTest, HpaeCapturerManagerCreateDestoryStreamTest, Te WaitForMsgProcessing(capturerManager); } -static void StateControlTest(std::shared_ptr &capturerManager, HpaeStreamInfo &streamInfo, +static void StateControlTest(std::shared_ptr &capturerManager, HpaeStreamInfo &streamInfo, HpaeSourceOutputInfo &sourceOutputInfo) { EXPECT_EQ(capturerManager->Start(streamInfo.sessionId) == SUCCESS, true); @@ -232,7 +232,7 @@ HWTEST_F(HpaeCapturerManagerTest, HpaeCapturerManagerStartStopTest, TestSize.Lev HpaeSourceInfo sourceInfo; InitSourceInfo(sourceInfo); - std::shared_ptr capturerManager = std::make_shared(sourceInfo); + std::shared_ptr capturerManager = std::make_shared(sourceInfo); EXPECT_EQ(capturerManager->Init() == SUCCESS, true); WaitForMsgProcessing(capturerManager); EXPECT_EQ(capturerManager->IsInit(), true); @@ -297,7 +297,7 @@ HWTEST_F(HpaeCapturerManagerTest, HpaeCapturerManagerReloadTest, TestSize.Level1 HpaeSourceInfo newSourceInfo; InitReloadSourceInfo(sourceInfo, newSourceInfo); - std::shared_ptr capturerManager = std::make_shared(sourceInfo); + std::shared_ptr capturerManager = std::make_shared(sourceInfo); EXPECT_EQ(capturerManager->Init() == SUCCESS, true); WaitForMsgProcessing(capturerManager); EXPECT_EQ(capturerManager->IsInit(), true); @@ -457,7 +457,7 @@ HWTEST_F(HpaeCapturerManagerTest, Flush_002, TestSize.Level1) HpaeSourceInfo sourceInfo; InitSourceInfo(sourceInfo); - std::shared_ptr capturerManager = std::make_shared(sourceInfo); + std::shared_ptr capturerManager = std::make_shared(sourceInfo); EXPECT_NE(capturerManager, nullptr); EXPECT_EQ(capturerManager->Init(), SUCCESS); WaitForMsgProcessing(capturerManager); @@ -499,7 +499,7 @@ HWTEST_F(HpaeCapturerManagerTest, Drain_002, TestSize.Level1) HpaeSourceInfo sourceInfo; InitSourceInfo(sourceInfo); - std::shared_ptr capturerManager = std::make_shared(sourceInfo); + std::shared_ptr capturerManager = std::make_shared(sourceInfo); EXPECT_NE(capturerManager, nullptr); EXPECT_EQ(capturerManager->Init(), SUCCESS); WaitForMsgProcessing(capturerManager); @@ -920,6 +920,34 @@ HWTEST_F(HpaeCapturerManagerTest, CheckEcAndMicRefCondition_001, TestSize.Level0 HpaeNodeInfo micRefNodeInfo; EXPECT_EQ(capturerManager->CheckMicRefCondition(sceneType, micRefNodeInfo), false); } + +/** + * @tc.name : Test SendRequestInner_001 + * @tc.type : FUNC + * @tc.number: SendRequestInner_001 + * @tc.desc : Test SendRequestInner when config in vaild. + */ +HWTEST_F(HpaeCapturerManagerTest, SendRequestInner_001, TestSize.Level1) +{ + HpaeSourceInfo sourceInfo; + InitSourceInfo(sourceInfo); + sourceInfo.ecType = HPAE_EC_TYPE_SAME_ADAPTER; + sourceInfo.micRef = HPAE_REF_ON; + + std::shared_ptr capturerManager = std::make_shared(sourceInfo); + EXPECT_NE(capturerManager, nullptr); + auto request = []() { + }; + capturerManager->SendRequest(request, "unit_test_send_request"); + WaitForMsgProcessing(capturerManager); + EXPECT_EQ(capturerManager->Init(), SUCCESS); + WaitForMsgProcessing(capturerManager); + capturerManager->SendRequest(request, "unit_test_send_request"); + WaitForMsgProcessing(capturerManager); + capturerManager->hpaeSignalProcessThread_ = nullptr; + capturerManager->SendRequest(request, "unit_test_send_request"); + EXPECT_EQ(capturerManager->DeInit(), SUCCESS); +} } // namespace HPAE } // namespace AudioStandard } // namespace OHOS \ No newline at end of file diff --git a/services/audio_engine/test/unittest/manager/hpae_inner_capturer_unit_test.cpp b/services/audio_engine/test/unittest/manager/hpae_inner_capturer_unit_test.cpp index f1be5a075e..04c5ac896e 100644 --- a/services/audio_engine/test/unittest/manager/hpae_inner_capturer_unit_test.cpp +++ b/services/audio_engine/test/unittest/manager/hpae_inner_capturer_unit_test.cpp @@ -549,12 +549,15 @@ HWTEST_F(HpaeInnerCapturerManagerUnitTest, SendRequestInner_001, TestSize.Level1 { auto request = []() { }; - hpaeInnerCapturerManager_->SendRequestInner(request); + hpaeInnerCapturerManager_->SendRequestInner(request, "unit_test_send_request"); WaitForMsgProcessing(hpaeInnerCapturerManager_); EXPECT_EQ(hpaeInnerCapturerManager_->Init(), SUCCESS); WaitForMsgProcessing(hpaeInnerCapturerManager_); - hpaeInnerCapturerManager_->SendRequestInner(request); + hpaeInnerCapturerManager_->SendRequestInner(request, "unit_test_send_request"); WaitForMsgProcessing(hpaeInnerCapturerManager_); + hpaeInnerCapturerManager_->hpaeSignalProcessThread_ = nullptr; + hpaeInnerCapturerManager_->SendRequestInner(request, "unit_test_send_request"); + EXPECT_EQ(hpaeInnerCapturerManager_->DeInit(), SUCCESS); } /** diff --git a/services/audio_engine/test/unittest/manager/hpae_render_manager_test.cpp b/services/audio_engine/test/unittest/manager/hpae_render_manager_test.cpp index a358852835..bf1f19198e 100644 --- a/services/audio_engine/test/unittest/manager/hpae_render_manager_test.cpp +++ b/services/audio_engine/test/unittest/manager/hpae_render_manager_test.cpp @@ -1174,4 +1174,71 @@ HWTEST_F(HpaeRendererManagerTest, RefreshProcessClusterByDevice_004, TestSize.Le EXPECT_EQ(hpaeRendererManager->DeInit() == SUCCESS, true); EXPECT_EQ(hpaeRendererManager->IsInit(), false); } + +/** + * @tc.name : Test SendRequestInner_001 + * @tc.type : FUNC + * @tc.number: SendRequestInner_001 + * @tc.desc : Test SendRequestInner when config in vaild. + */ +HWTEST_F(HpaeRendererManagerTest, SendRequestInner_001, TestSize.Level1) +{ + HpaeSinkInfo sinkInfo; + sinkInfo.deviceNetId = DEFAULT_TEST_DEVICE_NETWORKID; + sinkInfo.deviceClass = DEFAULT_TEST_DEVICE_CLASS; + sinkInfo.adapterName = DEFAULT_TEST_DEVICE_CLASS; + sinkInfo.filePath = g_rootPath + "constructHpaeRendererManagerTest.pcm"; + sinkInfo.frameLen = FRAME_LENGTH_960; + sinkInfo.samplingRate = SAMPLE_RATE_48000; + sinkInfo.format = SAMPLE_F32LE; + sinkInfo.channels = STEREO; + sinkInfo.deviceType = DEVICE_TYPE_SPEAKER; + std::shared_ptr hpaeRendererManager = std::make_shared(sinkInfo); + auto request = []() { + }; + hpaeRendererManager->SendRequest(request, "unit_test_send_request"); + WaitForMsgProcessing(hpaeRendererManager); + EXPECT_EQ(hpaeRendererManager->Init(), SUCCESS); + WaitForMsgProcessing(hpaeRendererManager); + EXPECT_EQ(hpaeRendererManager->IsInit(), true); + hpaeRendererManager->SendRequest(request, "unit_test_send_request"); + WaitForMsgProcessing(hpaeRendererManager); + hpaeRendererManager->hpaeSignalProcessThread_ = nullptr; + hpaeRendererManager->SendRequest(request, "unit_test_send_request"); + EXPECT_EQ(hpaeRendererManager->DeInit(), SUCCESS); +} + +/** + * @tc.name : Test SendRequestInner_002 + * @tc.type : FUNC + * @tc.number: SendRequestInner_002 + * @tc.desc : Test SendRequest when config in vaild. + */ +HWTEST_F(HpaeRendererManagerTest, SendRequestInner_002, TestSize.Level1) +{ + HpaeSinkInfo sinkInfo; + sinkInfo.deviceNetId = DEFAULT_TEST_DEVICE_NETWORKID; + sinkInfo.deviceClass = DEFAULT_TEST_DEVICE_CLASS; + sinkInfo.adapterName = DEFAULT_TEST_DEVICE_CLASS; + sinkInfo.filePath = g_rootPath + "constructHpaeRendererManagerTest.pcm"; + sinkInfo.frameLen = FRAME_LENGTH_960; + sinkInfo.samplingRate = SAMPLE_RATE_48000; + sinkInfo.format = SAMPLE_F32LE; + sinkInfo.channels = STEREO; + sinkInfo.deviceType = DEVICE_TYPE_SPEAKER; + std::shared_ptr hpaeRendererManager = + std::make_shared(sinkInfo); + auto request = []() { + }; + hpaeRendererManager->SendRequest(request, "unit_test_send_request"); + WaitForMsgProcessing(hpaeRendererManager); + EXPECT_EQ(hpaeRendererManager->Init(), SUCCESS); + WaitForMsgProcessing(hpaeRendererManager); + EXPECT_EQ(hpaeRendererManager->IsInit(), true); + hpaeRendererManager->SendRequest(request, "unit_test_send_request"); + WaitForMsgProcessing(hpaeRendererManager); + hpaeRendererManager->hpaeSignalProcessThread_ = nullptr; + hpaeRendererManager->SendRequest(request, "unit_test_send_request"); + EXPECT_EQ(hpaeRendererManager->DeInit(), SUCCESS); +} } // namespace \ No newline at end of file diff --git a/services/audio_engine/utils/hpae_no_lock_queue.cpp b/services/audio_engine/utils/hpae_no_lock_queue.cpp index 9a51725312..23f8df3890 100644 --- a/services/audio_engine/utils/hpae_no_lock_queue.cpp +++ b/services/audio_engine/utils/hpae_no_lock_queue.cpp @@ -16,6 +16,7 @@ #include #include "hpae_no_lock_queue.h" #include "audio_engine_log.h" +#include "hpae_message_queue_monitor.h" namespace OHOS { namespace AudioStandard { @@ -54,6 +55,8 @@ void HpaeNoLockQueue::PushRequest(Request &&request) { const uint64_t freeRequestIndex = GetRequestNode(&freeRequestHeadIndex_); if (GetRequsetIndex(freeRequestIndex) == INVALID_REQUEST_ID) { + HpaeMessageQueueMonitor::ReportMessageQueueException(HPAE_NO_LOCK_QUEUE_TYPE, __func__, + "reached Queue Capacity"); AUDIO_WARNING_LOG("reached Queue Capacity: drop this request"); return; } -- Gitee From 74cb504b3559f3fb7af300e0f7be5d4c6a75512a Mon Sep 17 00:00:00 2001 From: guoyao Date: Thu, 11 Sep 2025 14:50:43 +0800 Subject: [PATCH 2/3] =?UTF-8?q?audio=20engin=20dfx=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E8=A1=A5=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: guoyao --- services/audio_engine/manager/src/hpae_renderer_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/audio_engine/manager/src/hpae_renderer_manager.cpp b/services/audio_engine/manager/src/hpae_renderer_manager.cpp index 978b5a97e0..3c2c06bb74 100644 --- a/services/audio_engine/manager/src/hpae_renderer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_renderer_manager.cpp @@ -823,7 +823,7 @@ int32_t HpaeRendererManager::ReloadRenderManager(const HpaeSinkInfo &sinkInfo, b AUDIO_INFO_LOG("ReloadRenderManager deviceName %{public}s", sinkInfo.deviceName.c_str()); for (const auto &it : sinkInputNodeMap_) { - DeleteProcessCluster(it.first); + DeleteConnectInputProcessor(it.second); } AUDIO_INFO_LOG("delete device:%{public}s all input processor end", sinkInfo.deviceName.c_str()); sinkInfo_ = sinkInfo; -- Gitee From b6ec31929c179e6155a8e08e112c4543f2ee8229 Mon Sep 17 00:00:00 2001 From: guoyao Date: Thu, 11 Sep 2025 16:17:23 +0800 Subject: [PATCH 3/3] =?UTF-8?q?audio=20engin=20dfx=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E8=A1=A5=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: guoyao --- services/audio_engine/manager/src/hpae_manager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/audio_engine/manager/src/hpae_manager.cpp b/services/audio_engine/manager/src/hpae_manager.cpp index 0c4af2be14..3f29f29af8 100644 --- a/services/audio_engine/manager/src/hpae_manager.cpp +++ b/services/audio_engine/manager/src/hpae_manager.cpp @@ -773,6 +773,7 @@ bool HpaeManager::CheckMoveSourceOutput(uint32_t sourceOutputId, const std::stri return false; } std::shared_ptr oldCaptureManager = GetCapturerManagerById(sourceOutputId); + HpaeStreamInfo stream = capturerIdStreamInfoMap_[sourceOutputId].streamInfo; if (oldCaptureManager == nullptr) { HILOG_COMM_INFO("move session:%{public}u failed,can not find source.", sourceOutputId); HpaeStreamMoveMonitor::ReportStreamMoveException(stream.uid, sourceOutputId, @@ -811,6 +812,7 @@ bool HpaeManager::CheckMoveSinkInput(uint32_t sinkInputId, const std::string &si return false; } std::shared_ptr oldRendererManager = GetRendererManagerById(sinkInputId); + HpaeStreamInfo stream = rendererIdStreamInfoMap_[sinkInputId].streamInfo; if (oldRendererManager == nullptr) { HILOG_COMM_INFO("move session:%{public}u failed,can not find sink", sinkInputId); HpaeStreamMoveMonitor::ReportStreamMoveException(stream.uid, sinkInputId, HPAE_STREAM_CLASS_TYPE_PLAY, -- Gitee