diff --git a/services/audio_engine/manager/include/hpae_msg_channel.h b/services/audio_engine/manager/include/hpae_msg_channel.h index 7fa44d36d27cf39d3be3348f6c3d3b37349e2a78..01130f9108a88695cd7ca5b45f8a47bed864560d 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 9a636355eab269dba108cbe4412b532d60157ce3..d5c58fdb1c09d3a525aeb33c2e75e434d1d83f9b 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(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 53228123594c12e9f6b2cd729fd7a207915f0e30..0be423e6e0961cac30b1eea2a850cdba92bdb30c 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_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,36 @@ 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()); + if (sessionNodeMap_[sessionId].bypass) { + AUDIO_INFO_LOG("none processCluster no need to delete processCluster"); + return ERROR; } - 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]--; + 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"); + } } return SUCCESS; } @@ -434,23 +372,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 +449,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 +494,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 +544,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 +604,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 +616,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 +629,6 @@ void HpaeRendererManager::OnDisConnectProcessCluster(HpaeProcessorType sceneType } toBeStoppedSceneTypeToSessionMap_.erase(sceneType); } - DeleteProcessClusterInner(sceneType); }; SendRequest(request, __func__); } @@ -704,12 +636,15 @@ 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; + + if (sessionNodeMap_[sessionId].bypass) { + AUDIO_INFO_LOG("none processCluster has no effectNode"); + return; + } + 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 +655,42 @@ 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) { + outputCluster_->DisConnect(sceneClusterMap_[sceneType]); + } + sceneClusterMap_[sceneType]->SetConnectedFlag(false); + } +} + +void HpaeRendererManager::DereferenceInputCluster(uint32_t sessionId) +{ + HpaeProcessorType sceneType = sinkInputNodeMap_[sessionId]->connectedProcessorType_; + if (SafeGetMap(sceneClusterMap_, sceneType)) { + sceneClusterMap_[sceneType]->DisConnect(sinkInputNodeMap_[sessionId]); + sinkInputNodeMap_[sessionId]->connectedProcessorType_ = HPAE_SCENE_UNCONNECTED; + } + + 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); + 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 +720,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 +846,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 +1017,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 +1257,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 +1270,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 +1408,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); - } + DeleteInputSession(sessionId); AUDIO_INFO_LOG("AddSingleNodeToSink sessionId %{public}u", sessionId); AddSingleNodeToSink(sinkInputNodeMap_[sessionId]); } @@ -1501,6 +1465,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 27eea3136db1a9fb87b90ba355a60de9b1f0b8df..82720703b75c1b19ec342147d9fd5a98675288a9 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); diff --git a/test/fuzztest/hpaerenderermanager_fuzzer/hpaerenderermanager_fuzzer.cpp b/test/fuzztest/hpaerenderermanager_fuzzer/hpaerenderermanager_fuzzer.cpp index 25c68a2df2d8a38c6f9ff1deb255a37230992ec1..ab0ab1c25b0226c93312f3b5f59d0d1e268451af 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,