From aa9ad5654268445bf37b73b895a16ecb529558e1 Mon Sep 17 00:00:00 2001 From: lizihao Date: Tue, 9 Sep 2025 20:38:29 +0800 Subject: [PATCH 1/5] hpae_renderer_manager reconstruction Signed-off-by: lizihao --- .../manager/include/hpae_msg_channel.h | 1 + .../manager/include/hpae_renderer_manager.h | 12 +- .../manager/src/hpae_renderer_manager.cpp | 247 ++++++++---------- .../node/include/hpae_sink_input_node.h | 1 + 4 files changed, 111 insertions(+), 150 deletions(-) diff --git a/services/audio_engine/manager/include/hpae_msg_channel.h b/services/audio_engine/manager/include/hpae_msg_channel.h index 7fa44d36d2..01130f9108 100644 --- a/services/audio_engine/manager/include/hpae_msg_channel.h +++ b/services/audio_engine/manager/include/hpae_msg_channel.h @@ -79,6 +79,7 @@ public: }; enum HpaeProcessorType { + HPAE_SCENE_UNCONNECTED = -1, HPAE_SCENE_DEFAULT = 0, HPAE_SCENE_MUSIC = 1, HPAE_SCENE_GAME = 2, diff --git a/services/audio_engine/manager/include/hpae_renderer_manager.h b/services/audio_engine/manager/include/hpae_renderer_manager.h index 9a636355ea..7d41234a8b 100644 --- a/services/audio_engine/manager/include/hpae_renderer_manager.h +++ b/services/audio_engine/manager/include/hpae_renderer_manager.h @@ -105,22 +105,23 @@ private: bool IsMchDevice(); int32_t CreateInputSession(const HpaeStreamInfo &streamInfo); int32_t DeleteInputSession(uint32_t sessionId); - int32_t DeleteInputSessionForMove(uint32_t sessionId); bool isSplitProcessorType(HpaeProcessorType sceneType); int32_t ConnectInputSession(uint32_t sessionId); int32_t DisConnectInputSession(uint32_t sessionId); - int32_t DeleteConnectInputProcessor(const std::shared_ptr &sinkInputNode); void SetSessionState(uint32_t sessionId, HpaeSessionState renderState); void AddSingleNodeToSink(const std::shared_ptr &node, bool isConnect = true); - void CreateEffectAndConnect(HpaeNodeInfo &nodeInfo, bool isConnect = true); + void CreateProcessClusterAndConnect(HpaeNodeInfo &nodeInfo, bool isConnect = true); void MoveAllStreamToNewSink(const std::string &sinkName, const std::vector& moveIds, MoveSessionType moveType); void UpdateProcessClusterConnection(uint32_t sessionId, int32_t effectMode); void ConnectProcessCluster(uint32_t sessionId, HpaeProcessorType sceneType); + void ConnectInputCluster(uint32_t sessionId, HpaeProcessorType sceneType); + void ConnectOutputCluster(uint32_t sessionId, HpaeProcessorType sceneType); void DisConnectInputCluster(uint32_t sessionId, HpaeProcessorType sceneType); - void DisConnectProcessCluster(const HpaeNodeInfo &nodeInfo, HpaeProcessorType sceneType, uint32_t sessionId); + void DisConnectOutputCluster(HpaeProcessorType sceneType); void CreateProcessCluster(HpaeNodeInfo &nodeInfo); void CreateProcessClusterInner(HpaeNodeInfo &nodeInfo, int32_t processClusterDecision); + void DereferenceInputCluster(uint32_t sessionId); bool SetSessionFade(uint32_t sessionId, IOperation operation); void CreateDefaultProcessCluster(HpaeNodeInfo &nodeInfo); void CreateOutputClusterNodeInfo(HpaeNodeInfo &nodeInfo); @@ -139,10 +140,11 @@ private: void DisableCollaboration(); int32_t HandleSyncId(uint32_t sessionId, int32_t syncId); int32_t DeleteProcessCluster(uint32_t sessionId); - int32_t DeleteProcessClusterInner(HpaeProcessorType sceneType); + int32_t DeleteProcessClusterInner(uint32_t sessionId, HpaeProcessorType sceneType); void RefreshProcessClusterByDeviceInner(const std::shared_ptr &node); void TriggerStreamState(uint32_t sessionId, const std::shared_ptr &node); void UpdateStreamType(const std::shared_ptr sourceNode, std::shared_ptr dstNode); + bool IsClusterConnected(HpaeProcessCluster sceneType); private: std::unordered_map sessionNodeMap_; diff --git a/services/audio_engine/manager/src/hpae_renderer_manager.cpp b/services/audio_engine/manager/src/hpae_renderer_manager.cpp index 5322812359..52324a7194 100644 --- a/services/audio_engine/manager/src/hpae_renderer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_renderer_manager.cpp @@ -83,15 +83,6 @@ int32_t HpaeRendererManager::CreateInputSession(const HpaeStreamInfo &streamInfo nodeInfo.sessionId, nodeInfo.sceneType); CreateProcessCluster(nodeInfo); - if (!sessionNodeMap_[nodeInfo.sessionId].bypass) { - CHECK_AND_RETURN_RET_LOG(SafeGetMap(sceneClusterMap_, nodeInfo.sceneType), ERROR, - "could not find processorType %{public}d", nodeInfo.sceneType); - sceneTypeToProcessClusterCountMap_[nodeInfo.sceneType]++; - int32_t ret = sceneClusterMap_[nodeInfo.sceneType]->AudioRendererCreate(nodeInfo); - if (ret != SUCCESS) { - AUDIO_WARNING_LOG("update audio effect when creating failed, ret = %{public}d", ret); - } - } return SUCCESS; } @@ -123,10 +114,10 @@ void HpaeRendererManager::AddSingleNodeToSink(const std::shared_ptrAudioRendererCreate(nodeInfo); - if (ret != SUCCESS) { - AUDIO_WARNING_LOG("session:%{public}u update audio effect when creating failed ret %{public}d", - sessionId, ret); - } - } CHECK_AND_RETURN_LOG(isConnect == true, "not need connect session:%{public}d", sessionId); if (sessionNodeMap_[sessionId].state == HPAE_SESSION_RUNNING) { @@ -225,6 +206,15 @@ void HpaeRendererManager::CreateProcessCluster(HpaeNodeInfo &nodeInfo) std::string sceneType = TransProcessorTypeToSceneType(nodeInfo.sceneType); int32_t processClusterDecision = AudioEffectChainManager::GetInstance()->CheckProcessClusterInstances(sceneType); CreateProcessClusterInner(nodeInfo, processClusterDecision); + if (!sessionNodeMap_[nodeInfo.sessionId].bypass) { + CHECK_AND_RETURN_RET_LOG(SafeGetMap(sceneClusterMap_, nodeInfo.sceneType), + "could not find processorType %{public}d", nodeInfo.sceneType); + sceneTypeToProcessClusterCountMap_[nodeInfo.sceneType]++; + int32_t ret = sceneClusterMap_[nodeInfo.sceneType]->AudioRendererCreate(nodeInfo); + if (ret != SUCCESS) { + AUDIO_WARNING_LOG("update audio effect when creating failed, ret = %{public}d", ret); + } + } } int32_t HpaeRendererManager::AddAllNodesToSink( @@ -266,27 +256,12 @@ void HpaeRendererManager::RefreshProcessClusterByDeviceInner(const std::shared_p HpaeNodeInfo nodeInfo = node->GetNodeInfo(); std::string sceneType = TransProcessorTypeToSceneType(nodeInfo.sceneType); int32_t processClusterDecision = AudioEffectChainManager::GetInstance()->CheckProcessClusterInstances(sceneType); - bool isConnected = (node->isConnected_) ? true : false; - if (processClusterDecision != USE_NONE_PROCESSCLUSTER && sessionNodeMap_[nodeInfo.sessionId].bypass) { - AUDIO_INFO_LOG("current processCluster is incorrect, refresh to %{public}d", processClusterDecision); - TriggerStreamState(nodeInfo.sessionId, node); - DeleteProcessCluster(nodeInfo.sessionId); - CreateProcessClusterInner(nodeInfo, processClusterDecision); - CHECK_AND_RETURN_LOG(SafeGetMap(sceneClusterMap_, nodeInfo.sceneType), - "could not find processorType %{public}d", nodeInfo.sceneType); - sceneTypeToProcessClusterCountMap_[nodeInfo.sceneType]++; - sceneClusterMap_[nodeInfo.sceneType]->AudioRendererCreate(nodeInfo); - if (isConnected) { - ConnectInputSession(nodeInfo.sessionId); - } - } else if (processClusterDecision == USE_NONE_PROCESSCLUSTER && !sessionNodeMap_[nodeInfo.sessionId].bypass) { + if ((processClusterDecision != USE_NONE_PROCESSCLUSTER && sessionNodeMap_[nodeInfo.sessionId].bypass) || + (processClusterDecision == USE_NONE_PROCESSCLUSTER && !sessionNodeMap_[nodeInfo.sessionId].bypass)) { AUDIO_INFO_LOG("current processCluster is incorrect, refresh to %{public}d", processClusterDecision); TriggerStreamState(nodeInfo.sessionId, node); DeleteProcessCluster(nodeInfo.sessionId); - sessionNodeMap_[nodeInfo.sessionId].bypass = true; - if (isConnected) { - ConnectInputSession(nodeInfo.sessionId); - } + CreateProcessClusterAndConnect(nodeInfo); } } @@ -356,73 +331,33 @@ int32_t HpaeRendererManager::DestroyStream(uint32_t sessionId) return SUCCESS; } -int32_t HpaeRendererManager::DeleteConnectInputProcessor( - const std::shared_ptr &sinkInputNode) -{ - uint32_t sessionId = sinkInputNode->GetSessionId(); - HpaeNodeInfo nodeInfo = sinkInputNode->GetNodeInfo(); - HpaeProcessorType sceneType = GetProcessorType(sessionId); - if (SafeGetMap(sceneClusterMap_, sceneType)) { - DisConnectProcessCluster(nodeInfo, sceneType, sessionId); - } - return SUCCESS; -} - int32_t HpaeRendererManager::DeleteInputSession(uint32_t sessionId) { Trace trace("[" + std::to_string(sessionId) + "]HpaeRendererManager::DeleteInputSession"); - if (!SafeGetMap(sinkInputNodeMap_, sessionId)) { - AUDIO_INFO_LOG("could not find session:%{public}d", sessionId); - return SUCCESS; - } - DeleteConnectInputProcessor(sinkInputNodeMap_[sessionId]); - sinkInputNodeMap_.erase(sessionId); - sessionNodeMap_.erase(sessionId); - return SUCCESS; -} - - -int32_t HpaeRendererManager::DeleteInputSessionForMove(uint32_t sessionId) -{ - Trace trace("[" + std::to_string(sessionId) + "]HpaeRendererManager::DeleteInputSessionForMove"); DeleteProcessCluster(sessionId); sinkInputNodeMap_.erase(sessionId); sessionNodeMap_.erase(sessionId); return SUCCESS; } -void HpaeRendererManager::DisConnectProcessCluster( - const HpaeNodeInfo &nodeInfo, HpaeProcessorType sceneType, uint32_t sessionId) +int32_t HpaeRendererManager::DeleteProcessClusterInner(uint32_t sessionId, HpaeProcessorType sceneType) { - Trace trace("[" + std::to_string(sessionId) + - "]HpaeRendererManager::DisConnectProcessCluster sceneType:" + std::to_string(sceneType)); - if (!sessionNodeMap_[sessionId].bypass) { - CHECK_AND_RETURN_LOG(SafeGetMap(sceneClusterMap_, nodeInfo.sceneType), - "could not find processorType %{public}d", nodeInfo.sceneType); - sceneClusterMap_[nodeInfo.sceneType]->AudioRendererRelease(sinkInputNodeMap_[sessionId]->GetNodeInfo()); - } - sceneClusterMap_[sceneType]->DisConnect(sinkInputNodeMap_[sessionId]); - sinkInputNodeMap_[sessionId]->isConnected_ = false; - if (!sessionNodeMap_[sessionId].bypass) { - sceneTypeToProcessClusterCountMap_[nodeInfo.sceneType]--; - if (sceneClusterMap_[nodeInfo.sceneType] == sceneClusterMap_[HPAE_SCENE_DEFAULT]) { - sceneTypeToProcessClusterCountMap_[HPAE_SCENE_DEFAULT]--; + CHECK_AND_RETURN_RET_LOG(!sessionNodeMap_[sessionId].bypass, ERROR, "no need to delete processCluster"); + if(sceneTypeToProcessClusterCountMap_.count(sceneType) && sceneTypeToProcessClusterCountMap_[sceneType] == 0) { + if (sceneClusterMap_[sceneType] == sceneClusterMap_[HPAE_SCENE_DEFAULT] || IsClusterConnected(sceneType)) { + sceneClusterMap_.erase(sceneType); + sceneTypeToProcessClusterCountMap_.erase(sceneType); + AUDIO_INFO_LOG("sessionId %{public}u, processCluster %{public}d has been erased", sessionId, sceneType); } - AUDIO_INFO_LOG("sceneType %{public}d is deleted, current count: %{public}d, default count: %{public}d", - nodeInfo.sceneType, sceneTypeToProcessClusterCountMap_[nodeInfo.sceneType], - sceneTypeToProcessClusterCountMap_[HPAE_SCENE_DEFAULT]); } -} -int32_t HpaeRendererManager::DeleteProcessClusterInner(HpaeProcessorType sceneType) -{ - if (sceneTypeToProcessClusterCountMap_[sceneType] == 0) { - sceneClusterMap_.erase(sceneType); - sceneTypeToProcessClusterCountMap_.erase(sceneType); - } - if (sceneTypeToProcessClusterCountMap_[HPAE_SCENE_DEFAULT] == 0) { - sceneClusterMap_.erase(HPAE_SCENE_DEFAULT); - sceneTypeToProcessClusterCountMap_.erase(HPAE_SCENE_DEFAULT); + if(sceneTypeToProcessClusterCountMap_.count(HPAE_SCENE_DEFAULT) && + sceneTypeToProcessClusterCountMap_[HPAE_SCENE_DEFAULT] == 0) { + if (IsClusterConnected(HPAE_SCENE_DEFAULT)) { + sceneClusterMap_.erase(HPAE_SCENE_DEFAULT); + sceneTypeToProcessClusterCountMap_.erase(HPAE_SCENE_DEFAULT); + AUDIO_INFO_LOG("processCluster default has been erased", sceneType); + } } return SUCCESS; } @@ -434,23 +369,10 @@ int32_t HpaeRendererManager::DeleteProcessCluster(uint32_t sessionId) return SUCCESS; } HpaeNodeInfo nodeInfo = sinkInputNodeMap_[sessionId]->GetNodeInfo(); - HpaeProcessorType sceneType = GetProcessorType(sessionId); - if (SafeGetMap(sceneClusterMap_, sceneType)) { - DisConnectProcessCluster(nodeInfo, sceneType, sessionId); - if (sceneClusterMap_[sceneType]->GetPreOutNum() == 0) { - sceneClusterMap_[sceneType]->DisConnectMixerNode(); - if (outputCluster_ != nullptr) { - outputCluster_->DisConnect(sceneClusterMap_[sceneType]); - } - // for collaboration - if (sceneType == HPAE_SCENE_COLLABORATIVE && hpaeCoBufferNode_ != nullptr) { - hpaeCoBufferNode_->DisConnect(sceneClusterMap_[sceneType]); - TriggerCallback(DISCONNECT_CO_BUFFER_NODE, hpaeCoBufferNode_); - } - sceneClusterMap_[sceneType]->SetConnectedFlag(false); - } - } - DeleteProcessClusterInner(sceneType); + HpaeProcessorType sceneType = sinkInputNodeMap_[sessionId]->connectedProcessorType_; + DereferenceInputCluster(sessionId); + DisConnectOutputCluster(sceneType); + DeleteProcessClusterInner(sessionId, nodeInfo.sceneType); return SUCCESS; } @@ -524,23 +446,33 @@ void HpaeRendererManager::ConnectProcessCluster(uint32_t sessionId, HpaeProcesso } // update node info for processcluster UpdateStreamType(sinkInputNodeMap_[sessionId], sceneClusterMap_[sceneType]->GetSharedInstance()); + ConnectInputCluster(sessionId, sceneType); + ConnectOutputCluster(sessionId, sceneType); + std::shared_ptr sinkInputNode = SafeGetMap(sinkInputNodeMap_, sessionId); + CHECK_AND_RETURN_LOG(sinkInputNode != nullptr, "sinkInputNode is nullptr"); + sceneClusterMap_[sceneType]->SetLoudnessGain(sessionId, sinkInputNode->GetLoudnessGain()); +} + +void HpaeRendererManager::ConnectInputCluster(uint32_t sessionId, HpaeProcessorType sceneType) +{ + sceneClusterMap_[sceneType]->Connect(sinkInputNodeMap_[sessionId]); + sinkInputNodeMap_[sessionId]->isConnected_ = true; +} + +void HpaeRendererManager::ConnectOutputCluster(uint32_t sessionId, HpaeProcessorType sceneType) +{ if (!outputCluster_->IsProcessClusterConnected(sceneType) && !sceneClusterMap_[sceneType]->GetConnectedFlag()) { outputCluster_->Connect(sceneClusterMap_[sceneType]); sceneClusterMap_[sceneType]->SetConnectedFlag(true); } else { outputCluster_->UpdateStreamInfo(sceneClusterMap_[sceneType]); } - sceneClusterMap_[sceneType]->Connect(sinkInputNodeMap_[sessionId]); - sinkInputNodeMap_[sessionId]->isConnected_ = true; if (sceneType == HPAE_SCENE_COLLABORATIVE && hpaeCoBufferNode_ != nullptr) { uint32_t latency = outputCluster_->GetLatency(); hpaeCoBufferNode_->SetLatency(latency); hpaeCoBufferNode_->Connect(sceneClusterMap_[sceneType]); TriggerCallback(CONNECT_CO_BUFFER_NODE, hpaeCoBufferNode_); } - std::shared_ptr sinkInputNode = SafeGetMap(sinkInputNodeMap_, sessionId); - CHECK_AND_RETURN_LOG(sinkInputNode != nullptr, "sinkInputNode is nullptr"); - sceneClusterMap_[sceneType]->SetLoudnessGain(sessionId, sinkInputNode->GetLoudnessGain()); } void HpaeRendererManager::MoveAllStreamToNewSink(const std::string &sinkName, @@ -559,7 +491,7 @@ void HpaeRendererManager::MoveAllStreamToNewSink(const std::string &sinkName, } } for (const auto &it : sessionIds) { - DeleteInputSessionForMove(it); + DeleteInputSession(it); } HILOG_COMM_INFO("StartMove] session:%{public}s to sink name:%{public}s, move type:%{public}d", idStr.c_str(), name.c_str(), moveType); @@ -609,7 +541,7 @@ void HpaeRendererManager::MoveStreamSync(uint32_t sessionId, const std::string & sessionId, sinkInfo_.deviceName.c_str(), sinkName.c_str()); std::shared_ptr inputNode = sinkInputNodeMap_[sessionId]; TriggerStreamState(sessionId, inputNode); - DeleteInputSessionForMove(sessionId); + DeleteInputSession(sessionId); std::string name = sinkName; TriggerCallback(MOVE_SINK_INPUT, inputNode, name); } @@ -669,7 +601,7 @@ int32_t HpaeRendererManager::DisConnectInputSession(uint32_t sessionId) AUDIO_INFO_LOG("DisConnectInputSession sessionId %{public}u", sessionId); return SUCCESS; } - HpaeProcessorType sceneType = GetProcessorType(sessionId); + HpaeProcessorType sceneType = sinkInputNodeMap_[sessionId]->connectedProcessorType_; if (SafeGetMap(sceneClusterMap_, sceneType)) { DisConnectInputCluster(sessionId, sceneType); } @@ -681,14 +613,12 @@ void HpaeRendererManager::OnDisConnectProcessCluster(HpaeProcessorType sceneType auto request = [this, sceneType]() { AUDIO_INFO_LOG("mixerNode trigger callback, sceneType %{public}d", sceneType); if (SafeGetMap(sceneClusterMap_, sceneType) && sceneClusterMap_[sceneType]->GetPreOutNum() == 0) { - sceneClusterMap_[sceneType]->DisConnectMixerNode(); + DisConnectOutputCluster(sceneType); // for collaboration if (sceneType == HPAE_SCENE_COLLABORATIVE && hpaeCoBufferNode_ != nullptr) { hpaeCoBufferNode_->DisConnect(sceneClusterMap_[sceneType]); TriggerCallback(DISCONNECT_CO_BUFFER_NODE, hpaeCoBufferNode_); } - outputCluster_->DisConnect(sceneClusterMap_[sceneType]); - sceneClusterMap_[sceneType]->SetConnectedFlag(false); if (toBeStoppedSceneTypeToSessionMap_.count(sceneType) && SafeGetMap(sinkInputNodeMap_, toBeStoppedSceneTypeToSessionMap_[sceneType])) { sceneClusterMap_[sceneType]-> @@ -696,7 +626,6 @@ void HpaeRendererManager::OnDisConnectProcessCluster(HpaeProcessorType sceneType } toBeStoppedSceneTypeToSessionMap_.erase(sceneType); } - DeleteProcessClusterInner(sceneType); }; SendRequest(request, __func__); } @@ -704,12 +633,11 @@ void HpaeRendererManager::OnDisConnectProcessCluster(HpaeProcessorType sceneType void HpaeRendererManager::DisConnectInputCluster(uint32_t sessionId, HpaeProcessorType sceneType) { sceneClusterMap_[sceneType]->DisConnect(sinkInputNodeMap_[sessionId]); - sinkInputNodeMap_[sessionId]->isConnected_ = false; + sinkInputNodeMap_[sessionId]->connectedProcessorType_ = HPAE_SCENE_UNCONNECTED; + + CHECK_AND_RETURN_LOG(!sessionNodeMap_[sessionId].bypass, "none processCluster has no effectNode"); if (sceneClusterMap_[sceneType]->GetPreOutNum() > 0) { - int32_t ret = sceneClusterMap_[sceneType]->AudioRendererStop(sinkInputNodeMap_[sessionId]->GetNodeInfo()); - if (ret != SUCCESS) { - AUDIO_WARNING_LOG("update audio effect when stopping failed, ret = %{public}d", ret); - } + sceneClusterMap_[sceneType]->AudioRendererStop(sinkInputNodeMap_[sessionId]->GetNodeInfo()); } else { HpaeProcessorType tmpSceneType = (sceneClusterMap_[sceneType] == SafeGetMap(sceneClusterMap_, HPAE_SCENE_DEFAULT)) ? HPAE_SCENE_DEFAULT : sceneType; @@ -720,6 +648,35 @@ void HpaeRendererManager::DisConnectInputCluster(uint32_t sessionId, HpaeProcess } } +void HpaeRendererManager::DisConnectOutputCluster(uint32_t sessionId, HpaeProcessorType sceneType) +{ + if (SafeGetMap(sceneClusterMap_, sceneType) && sceneClusterMap_[sceneType]->GetPreOutNum() == 0) { + sceneClusterMap_[sceneType]->DisConnectMixerNode(); + outputCluster_->DisConnect(sceneClusterMap_[sceneType]); + sceneClusterMap_[sceneType]->SetConnectedFlag(false); + } +} + +void HpaeRendererManager::DereferenceInputCluster(uint32_t sessionId) +{ + HpaeProcessCluster sceneType = sinkInputNodeMap_[sessionId]->connectedProcessorType_; + if (SafeGetMap(sceneClusterMap_, sceneType)) { + sceneClusterMap_[sceneType]->DisConnect(sinkInputNodeMap_[sessionId]); + sinkInputNodeMap_[sessionId]->connectedProcessorType_ = HPAE_SCENE_UNCONNECTED; + } + + CHECK_AND_RETURN_LOG(!sessionNodeMap_[sessionId].bypass, "none processCluster has no effectNode"); + HpaeNodeInfo nodeInfo = sinkInputNodeMap_[sessionId]->GetNodeInfo(); + sceneClusterMap_[nodeInfo.sceneType]->AudioRendererRelease(nodeInfo); + sceneTypeToProcessClusterCountMap_[nodeInfo.sceneType]--; + AUDIO_INFO_LOG("sessionId %{public}u is disconnected from sceneType %{public}d, current count is %{public}d", + sessionId, nodeInfo.sceneType, sceneTypeToProcessClusterCountMap_[nodeInfo.sceneType]); + if (sceneClusterMap_[nodeInfo.sceneType] == sceneClusterMap_[HPAE_SCENE_DEFAULT]) { + sceneTypeToProcessClusterCountMap_[HPAE_SCENE_DEFAULT]--; + AUDIO_INFO_LOG("sceneType default count is %{public}d", sceneTypeToProcessClusterCountMap_[HPAE_SCENE_DEFAULT]); + } +} + void HpaeRendererManager::SetSessionState(uint32_t sessionId, HpaeSessionState renderState) { sessionNodeMap_[sessionId].state = renderState; @@ -749,7 +706,8 @@ int32_t HpaeRendererManager::Flush(uint32_t sessionId) "Flush not find sessionId %{public}u", sessionId); // flush history buffer sinkInputNodeMap_[sessionId]->Flush(); - HpaeProcessorType sceneType = GetProcessorType(sessionId); + HpaeProcessorType sceneType = (sinkInputNodeMap_[sessionId]->connectedProcessorType_ != HPAE_SCENE_UNCONNECTED) + ? sinkInputNodeMap_[sessionId]->connectedProcessorType_ : GetProcessorType(sessionId); CHECK_AND_RETURN_LOG(SafeGetMap(sceneClusterMap_, sceneType), "Flush not find sceneType: %{public}d in sceneClusterMap", static_cast(sceneType)); sceneClusterMap_[sceneType]->InitEffectBuffer(sessionId); @@ -874,7 +832,7 @@ int32_t HpaeRendererManager::ReloadRenderManager(const HpaeSinkInfo &sinkInfo, b AUDIO_INFO_LOG("init device:%{public}s manager end", sinkInfo.deviceName.c_str()); for (const auto &it : sinkInputNodeMap_) { HpaeNodeInfo nodeInfo = it.second->GetNodeInfo(); - CreateEffectAndConnect(nodeInfo); + CreateProcessClusterAndConnect(nodeInfo); } AUDIO_INFO_LOG("connect device:%{public}s all processor end", sinkInfo.deviceName.c_str()); }; @@ -1045,8 +1003,9 @@ int32_t HpaeRendererManager::SetLoudnessGain(uint32_t sessionId, float loudnessG "session with Id %{public}d not in sinkInputNodeMap_", sessionId); sinkInputNode->SetLoudnessGain(loudnessGain); - HpaeProcessorType processorType = GetProcessorType(sessionId); - std::shared_ptr processCluster = SafeGetMap(sceneClusterMap_, processorType); + HpaeProcessorType sceneType = (sinkInputNodeMap_[sessionId]->connectedProcessorType_ != HPAE_SCENE_UNCONNECTED) + ? sinkInputNodeMap_[sessionId]->connectedProcessorType_ : GetProcessorType(sessionId); + std::shared_ptr processCluster = SafeGetMap(sceneClusterMap_, sceneType); CHECK_AND_RETURN_LOG(processCluster != nullptr, "session with Id %{public}d not in sceneClusterMap_", sessionId); processCluster->SetLoudnessGain(sessionId, loudnessGain); @@ -1284,14 +1243,8 @@ void HpaeRendererManager::UpdateProcessClusterConnection(uint32_t sessionId, int AUDIO_INFO_LOG("no need to update the sceneType %{public}d", sceneType); return; } - - if (effectMode == EFFECT_NONE) { - DisConnectInputCluster(sessionId, sceneType); - ConnectProcessCluster(sessionId, HPAE_SCENE_EFFECT_NONE); - } else { - DisConnectInputCluster(sessionId, HPAE_SCENE_EFFECT_NONE); - ConnectProcessCluster(sessionId, sceneType); - } + DisConnectInputSession(sessionId); + ConnectInputSession(sessionId); } std::string HpaeRendererManager::GetThreadName() @@ -1303,7 +1256,8 @@ bool HpaeRendererManager::SetSessionFade(uint32_t sessionId, IOperation operatio { CHECK_AND_RETURN_RET_LOG(SafeGetMap(sinkInputNodeMap_, sessionId), false, "can not get input node of session %{public}u", sessionId); - HpaeProcessorType sceneType = GetProcessorType(sessionId); + HpaeProcessorType sceneType = (sinkInputNodeMap_[sessionId]->connectedProcessorType_ != HPAE_SCENE_UNCONNECTED) + ? sinkInputNodeMap_[sessionId]->connectedProcessorType_ : GetProcessorType(sessionId); AUDIO_INFO_LOG("sessionId is %{public}d, sceneType is %{public}d", sessionId, sceneType); std::shared_ptr sessionGainNode = nullptr; if (SafeGetMap(sceneClusterMap_, sceneType)) { @@ -1440,11 +1394,7 @@ void HpaeRendererManager::ReConnectNodeForCollaboration(uint32_t sessionId) // todo fade out CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId), "sinkInputNodeMap_ not find sessionId %{public}u", sessionId); - HpaeNodeInfo nodeInfo = sinkInputNodeMap_[sessionId]->GetNodeInfo(); - HpaeProcessorType sceneType = GetProcessorType(sessionId); - if (SafeGetMap(sceneClusterMap_, sceneType)) { - DisConnectProcessCluster(nodeInfo, sceneType, sessionId); - } + DisConnectInputSession(sessionId); AUDIO_INFO_LOG("AddSingleNodeToSink sessionId %{public}u", sessionId); AddSingleNodeToSink(sinkInputNodeMap_[sessionId]); } @@ -1501,6 +1451,13 @@ void HpaeRendererManager::TriggerStreamState(uint32_t sessionId, const std::shar TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, state, operation); } } + +bool HpaeRendererManager::IsClusterConnected(HpaeProcessorType sceneType) +{ + CHECK_AND_RETURN_RET_LOG(SafeGetMap(sceneClusterMap_, sceneType), false, + "sceneType %{public}d not in sceneClusterMap", sceneType); + return (sceneClusterMap_[sceneType]->GetPreOutNum() == 0 && !sceneClusterMap_[sceneType]->GetConnectedFlag()); +} } // namespace HPAE } // namespace AudioStandard } // namespace OHOS \ No newline at end of file diff --git a/services/audio_engine/node/include/hpae_sink_input_node.h b/services/audio_engine/node/include/hpae_sink_input_node.h index 27eea3136d..82720703b7 100644 --- a/services/audio_engine/node/include/hpae_sink_input_node.h +++ b/services/audio_engine/node/include/hpae_sink_input_node.h @@ -58,6 +58,7 @@ public: float GetSpeed(); uint64_t GetLatency(); bool isConnected_ = false; + HpaeProcessorType connectedProcessorType_ = HPAE_SCENE_UNCONNECTED; private: int32_t GetDataFromSharedBuffer(); int32_t OnStreamInfoChange(bool needata = true); -- Gitee From 5ac2bcc607aa00f8567063a4412e8a2c583cec59 Mon Sep 17 00:00:00 2001 From: lizihao Date: Wed, 10 Sep 2025 14:05:52 +0800 Subject: [PATCH 2/5] fix UT Signed-off-by: lizihao --- .../audio_engine/manager/include/hpae_renderer_manager.h | 2 +- .../audio_engine/manager/src/hpae_renderer_manager.cpp | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/services/audio_engine/manager/include/hpae_renderer_manager.h b/services/audio_engine/manager/include/hpae_renderer_manager.h index 7d41234a8b..d5c58fdb1c 100644 --- a/services/audio_engine/manager/include/hpae_renderer_manager.h +++ b/services/audio_engine/manager/include/hpae_renderer_manager.h @@ -144,7 +144,7 @@ private: void RefreshProcessClusterByDeviceInner(const std::shared_ptr &node); void TriggerStreamState(uint32_t sessionId, const std::shared_ptr &node); void UpdateStreamType(const std::shared_ptr sourceNode, std::shared_ptr dstNode); - bool IsClusterConnected(HpaeProcessCluster sceneType); + bool IsClusterConnected(HpaeProcessorType sceneType); private: std::unordered_map sessionNodeMap_; diff --git a/services/audio_engine/manager/src/hpae_renderer_manager.cpp b/services/audio_engine/manager/src/hpae_renderer_manager.cpp index 52324a7194..b7da75eba6 100644 --- a/services/audio_engine/manager/src/hpae_renderer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_renderer_manager.cpp @@ -652,14 +652,16 @@ void HpaeRendererManager::DisConnectOutputCluster(uint32_t sessionId, HpaeProces { if (SafeGetMap(sceneClusterMap_, sceneType) && sceneClusterMap_[sceneType]->GetPreOutNum() == 0) { sceneClusterMap_[sceneType]->DisConnectMixerNode(); - outputCluster_->DisConnect(sceneClusterMap_[sceneType]); + if (outputCluster_ != nullptr) { + outputCluster_->DisConnect(sceneClusterMap_[sceneType]); + } sceneClusterMap_[sceneType]->SetConnectedFlag(false); } } void HpaeRendererManager::DereferenceInputCluster(uint32_t sessionId) { - HpaeProcessCluster sceneType = sinkInputNodeMap_[sessionId]->connectedProcessorType_; + HpaeProcessorType sceneType = sinkInputNodeMap_[sessionId]->connectedProcessorType_; if (SafeGetMap(sceneClusterMap_, sceneType)) { sceneClusterMap_[sceneType]->DisConnect(sinkInputNodeMap_[sessionId]); sinkInputNodeMap_[sessionId]->connectedProcessorType_ = HPAE_SCENE_UNCONNECTED; @@ -667,6 +669,8 @@ void HpaeRendererManager::DereferenceInputCluster(uint32_t sessionId) CHECK_AND_RETURN_LOG(!sessionNodeMap_[sessionId].bypass, "none processCluster has no effectNode"); HpaeNodeInfo nodeInfo = sinkInputNodeMap_[sessionId]->GetNodeInfo(); + CHECK_AND_RETURN_RET_LOG(SafeGetMap(sceneClusterMap_, nodeInfo.sceneType), + "could not find processorType %{public}d", nodeInfo.sceneType); sceneClusterMap_[nodeInfo.sceneType]->AudioRendererRelease(nodeInfo); sceneTypeToProcessClusterCountMap_[nodeInfo.sceneType]--; AUDIO_INFO_LOG("sessionId %{public}u is disconnected from sceneType %{public}d, current count is %{public}d", -- Gitee From bedbd1333770ac15b808fc66358aa6fd9a690b5f Mon Sep 17 00:00:00 2001 From: lizihao Date: Wed, 10 Sep 2025 14:39:42 +0800 Subject: [PATCH 3/5] bugfix Signed-off-by: lizihao --- 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 b7da75eba6..ec99ae981e 100644 --- a/services/audio_engine/manager/src/hpae_renderer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_renderer_manager.cpp @@ -648,7 +648,7 @@ void HpaeRendererManager::DisConnectInputCluster(uint32_t sessionId, HpaeProcess } } -void HpaeRendererManager::DisConnectOutputCluster(uint32_t sessionId, HpaeProcessorType sceneType) +void HpaeRendererManager::DisConnectOutputCluster(HpaeProcessorType sceneType) { if (SafeGetMap(sceneClusterMap_, sceneType) && sceneClusterMap_[sceneType]->GetPreOutNum() == 0) { sceneClusterMap_[sceneType]->DisConnectMixerNode(); -- Gitee From b7666867bd7326cdcd1a706c5ec0c9717c9e197a Mon Sep 17 00:00:00 2001 From: lizihao Date: Wed, 10 Sep 2025 15:26:29 +0800 Subject: [PATCH 4/5] codecheck Signed-off-by: lizihao --- .../manager/src/hpae_renderer_manager.cpp | 14 +++++++------- .../hpaerenderermanager_fuzzer.cpp | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/services/audio_engine/manager/src/hpae_renderer_manager.cpp b/services/audio_engine/manager/src/hpae_renderer_manager.cpp index ec99ae981e..67e2c03fc5 100644 --- a/services/audio_engine/manager/src/hpae_renderer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_renderer_manager.cpp @@ -207,7 +207,7 @@ void HpaeRendererManager::CreateProcessCluster(HpaeNodeInfo &nodeInfo) int32_t processClusterDecision = AudioEffectChainManager::GetInstance()->CheckProcessClusterInstances(sceneType); CreateProcessClusterInner(nodeInfo, processClusterDecision); if (!sessionNodeMap_[nodeInfo.sessionId].bypass) { - CHECK_AND_RETURN_RET_LOG(SafeGetMap(sceneClusterMap_, nodeInfo.sceneType), + CHECK_AND_RETURN_LOG(SafeGetMap(sceneClusterMap_, nodeInfo.sceneType), "could not find processorType %{public}d", nodeInfo.sceneType); sceneTypeToProcessClusterCountMap_[nodeInfo.sceneType]++; int32_t ret = sceneClusterMap_[nodeInfo.sceneType]->AudioRendererCreate(nodeInfo); @@ -343,7 +343,7 @@ int32_t HpaeRendererManager::DeleteInputSession(uint32_t sessionId) int32_t HpaeRendererManager::DeleteProcessClusterInner(uint32_t sessionId, HpaeProcessorType sceneType) { CHECK_AND_RETURN_RET_LOG(!sessionNodeMap_[sessionId].bypass, ERROR, "no need to delete processCluster"); - if(sceneTypeToProcessClusterCountMap_.count(sceneType) && sceneTypeToProcessClusterCountMap_[sceneType] == 0) { + if (sceneTypeToProcessClusterCountMap_.count(sceneType) && sceneTypeToProcessClusterCountMap_[sceneType] == 0) { if (sceneClusterMap_[sceneType] == sceneClusterMap_[HPAE_SCENE_DEFAULT] || IsClusterConnected(sceneType)) { sceneClusterMap_.erase(sceneType); sceneTypeToProcessClusterCountMap_.erase(sceneType); @@ -351,12 +351,12 @@ int32_t HpaeRendererManager::DeleteProcessClusterInner(uint32_t sessionId, HpaeP } } - if(sceneTypeToProcessClusterCountMap_.count(HPAE_SCENE_DEFAULT) && + if (sceneTypeToProcessClusterCountMap_.count(HPAE_SCENE_DEFAULT) && sceneTypeToProcessClusterCountMap_[HPAE_SCENE_DEFAULT] == 0) { if (IsClusterConnected(HPAE_SCENE_DEFAULT)) { sceneClusterMap_.erase(HPAE_SCENE_DEFAULT); sceneTypeToProcessClusterCountMap_.erase(HPAE_SCENE_DEFAULT); - AUDIO_INFO_LOG("processCluster default has been erased", sceneType); + AUDIO_INFO_LOG("processCluster default has been erased"); } } return SUCCESS; @@ -649,7 +649,7 @@ void HpaeRendererManager::DisConnectInputCluster(uint32_t sessionId, HpaeProcess } void HpaeRendererManager::DisConnectOutputCluster(HpaeProcessorType sceneType) -{ +{ if (SafeGetMap(sceneClusterMap_, sceneType) && sceneClusterMap_[sceneType]->GetPreOutNum() == 0) { sceneClusterMap_[sceneType]->DisConnectMixerNode(); if (outputCluster_ != nullptr) { @@ -669,7 +669,7 @@ void HpaeRendererManager::DereferenceInputCluster(uint32_t sessionId) CHECK_AND_RETURN_LOG(!sessionNodeMap_[sessionId].bypass, "none processCluster has no effectNode"); HpaeNodeInfo nodeInfo = sinkInputNodeMap_[sessionId]->GetNodeInfo(); - CHECK_AND_RETURN_RET_LOG(SafeGetMap(sceneClusterMap_, nodeInfo.sceneType), + CHECK_AND_RETURN_LOG(SafeGetMap(sceneClusterMap_, nodeInfo.sceneType), "could not find processorType %{public}d", nodeInfo.sceneType); sceneClusterMap_[nodeInfo.sceneType]->AudioRendererRelease(nodeInfo); sceneTypeToProcessClusterCountMap_[nodeInfo.sceneType]--; @@ -1398,7 +1398,7 @@ void HpaeRendererManager::ReConnectNodeForCollaboration(uint32_t sessionId) // todo fade out CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId), "sinkInputNodeMap_ not find sessionId %{public}u", sessionId); - DisConnectInputSession(sessionId); + DeleteInputSession(sessionId); AUDIO_INFO_LOG("AddSingleNodeToSink sessionId %{public}u", sessionId); AddSingleNodeToSink(sinkInputNodeMap_[sessionId]); } diff --git a/test/fuzztest/hpaerenderermanager_fuzzer/hpaerenderermanager_fuzzer.cpp b/test/fuzztest/hpaerenderermanager_fuzzer/hpaerenderermanager_fuzzer.cpp index 25c68a2df2..ab0ab1c25b 100644 --- a/test/fuzztest/hpaerenderermanager_fuzzer/hpaerenderermanager_fuzzer.cpp +++ b/test/fuzztest/hpaerenderermanager_fuzzer/hpaerenderermanager_fuzzer.cpp @@ -550,13 +550,13 @@ void RefreshProcessClusterByDeviceFuzzTest() rendererManager->RefreshProcessClusterByDevice(); } -void DeleteInputSessionForMoveFuzzTest() +void DeleteInputSessionFuzzTest() { HpaeSinkInfo sinkInfo; InitHpaeSinkInfo(sinkInfo); auto rendererManager = HpaeRendererManager(sinkInfo); uint32_t sessionId = GetData(); - rendererManager.DeleteInputSessionForMove(sessionId); + rendererManager.DeleteInputSession(sessionId); } void DeleteProcessClusterFuzzTest() @@ -675,7 +675,7 @@ TestFuncs g_testFuncs[] = { CreateDefaultProcessClusterFuzzTest, CreateProcessClusterInnerSwitchCaseFuzzTest, RefreshProcessClusterByDeviceFuzzTest, - DeleteInputSessionForMoveFuzzTest, + DeleteInputSessionFuzzTest, DeleteProcessClusterFuzzTest, ConnectInputSessionFuzzTest, DisConnectInputSessionFuzzTest, -- Gitee From 517021b007eb35a7bc824a351baf155d2ba2be34 Mon Sep 17 00:00:00 2001 From: lizihao Date: Thu, 11 Sep 2025 16:44:27 +0800 Subject: [PATCH 5/5] codecheck Signed-off-by: lizihao --- .../manager/src/hpae_renderer_manager.cpp | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/services/audio_engine/manager/src/hpae_renderer_manager.cpp b/services/audio_engine/manager/src/hpae_renderer_manager.cpp index 67e2c03fc5..0be423e6e0 100644 --- a/services/audio_engine/manager/src/hpae_renderer_manager.cpp +++ b/services/audio_engine/manager/src/hpae_renderer_manager.cpp @@ -342,7 +342,10 @@ int32_t HpaeRendererManager::DeleteInputSession(uint32_t sessionId) int32_t HpaeRendererManager::DeleteProcessClusterInner(uint32_t sessionId, HpaeProcessorType sceneType) { - CHECK_AND_RETURN_RET_LOG(!sessionNodeMap_[sessionId].bypass, ERROR, "no need to delete processCluster"); + if (sessionNodeMap_[sessionId].bypass) { + AUDIO_INFO_LOG("none processCluster no need to delete processCluster"); + return ERROR; + } if (sceneTypeToProcessClusterCountMap_.count(sceneType) && sceneTypeToProcessClusterCountMap_[sceneType] == 0) { if (sceneClusterMap_[sceneType] == sceneClusterMap_[HPAE_SCENE_DEFAULT] || IsClusterConnected(sceneType)) { sceneClusterMap_.erase(sceneType); @@ -635,7 +638,11 @@ void HpaeRendererManager::DisConnectInputCluster(uint32_t sessionId, HpaeProcess sceneClusterMap_[sceneType]->DisConnect(sinkInputNodeMap_[sessionId]); sinkInputNodeMap_[sessionId]->connectedProcessorType_ = HPAE_SCENE_UNCONNECTED; - CHECK_AND_RETURN_LOG(!sessionNodeMap_[sessionId].bypass, "none processCluster has no effectNode"); + if (sessionNodeMap_[sessionId].bypass) { + AUDIO_INFO_LOG("none processCluster has no effectNode"); + return; + } + if (sceneClusterMap_[sceneType]->GetPreOutNum() > 0) { sceneClusterMap_[sceneType]->AudioRendererStop(sinkInputNodeMap_[sessionId]->GetNodeInfo()); } else { @@ -667,7 +674,10 @@ void HpaeRendererManager::DereferenceInputCluster(uint32_t sessionId) sinkInputNodeMap_[sessionId]->connectedProcessorType_ = HPAE_SCENE_UNCONNECTED; } - CHECK_AND_RETURN_LOG(!sessionNodeMap_[sessionId].bypass, "none processCluster has no effectNode"); + if (sessionNodeMap_[sessionId].bypass) { + AUDIO_INFO_LOG("none processCluster has no effectNode"); + return; + } HpaeNodeInfo nodeInfo = sinkInputNodeMap_[sessionId]->GetNodeInfo(); CHECK_AND_RETURN_LOG(SafeGetMap(sceneClusterMap_, nodeInfo.sceneType), "could not find processorType %{public}d", nodeInfo.sceneType); -- Gitee