• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef LOG_TAG
17 #define LOG_TAG "HpaeSourceProcessCluster"
18 #endif
19 
20 #include "hpae_source_process_cluster.h"
21 #include "hpae_node_common.h"
22 #include "audio_utils.h"
23 #include "audio_engine_log.h"
24 
25 namespace OHOS {
26 namespace AudioStandard {
27 namespace HPAE {
HpaeSourceProcessCluster(HpaeNodeInfo & nodeInfo)28 HpaeSourceProcessCluster::HpaeSourceProcessCluster(HpaeNodeInfo& nodeInfo)
29     : HpaeNode(nodeInfo), captureEffectNode_(std::make_shared<HpaeCaptureEffectNode>(nodeInfo))
30 {
31 #ifdef ENABLE_HIDUMP_DFX
32     SetNodeName("HpaeSourceProcessCluster");
33 #endif
34     AUDIO_INFO_LOG("Create scene ProcessCluster, sceneType = %{public}u", nodeInfo.sceneType);
35 }
36 
~HpaeSourceProcessCluster()37 HpaeSourceProcessCluster::~HpaeSourceProcessCluster()
38 {
39     Reset();
40 #ifdef ENABLE_HIDUMP_DFX
41     AUDIO_INFO_LOG("NodeId: %{public}u NodeName: %{public}s destructed.",
42         GetNodeId(), GetNodeName().c_str());
43 #endif
44 }
45 
DoProcess()46 void HpaeSourceProcessCluster::DoProcess()
47 {
48 }
49 
Reset()50 bool HpaeSourceProcessCluster::Reset()
51 {
52     captureEffectNode_->Reset();
53     for (auto fmtConverterNode : fmtConverterNodeMap_) {
54         fmtConverterNode.second->Reset();
55     }
56     return true;
57 }
58 
ResetAll()59 bool HpaeSourceProcessCluster::ResetAll()
60 {
61     return captureEffectNode_->ResetAll();
62 }
63 
GetSharedInstance()64 std::shared_ptr<HpaeNode> HpaeSourceProcessCluster::GetSharedInstance()
65 {
66     return captureEffectNode_;
67 }
68 
GetOutputPort()69 OutputPort<HpaePcmBuffer *> *HpaeSourceProcessCluster::GetOutputPort()
70 {
71     return captureEffectNode_->GetOutputPort();
72 }
73 
GetSharedInstance(HpaeNodeInfo & nodeInfo)74 std::shared_ptr<HpaeNode> HpaeSourceProcessCluster::GetSharedInstance(HpaeNodeInfo &nodeInfo)
75 {
76     std::string sourceOutputNodeKey = TransNodeInfoToStringKey(nodeInfo);
77     HpaeNodeInfo effectNodeInfo;
78     captureEffectNode_->GetCapturerEffectConfig(effectNodeInfo);
79     std::string effectNodeKey = TransNodeInfoToStringKey(effectNodeInfo);
80     AUDIO_INFO_LOG("sourceOutput:[%{public}s] effectNode:[%{public}s]",
81         sourceOutputNodeKey.c_str(), effectNodeKey.c_str());
82     if (CheckHpaeNodeInfoIsSame(nodeInfo, effectNodeInfo)) {
83         AUDIO_INFO_LOG("Specification of sourceOutputNode is same with capture effect");
84         return captureEffectNode_;
85     }
86     if (!SafeGetMap(fmtConverterNodeMap_, sourceOutputNodeKey)) {
87         fmtConverterNodeMap_[sourceOutputNodeKey] =
88             std::make_shared<HpaeAudioFormatConverterNode>(effectNodeInfo, nodeInfo);
89         fmtConverterNodeMap_[sourceOutputNodeKey]->SetSourceNode(true);
90     }
91     fmtConverterNodeMap_[sourceOutputNodeKey]->Connect(captureEffectNode_);
92     return fmtConverterNodeMap_[sourceOutputNodeKey];
93 }
94 
GetOutputPort(HpaeNodeInfo & nodeInfo,bool isDisConnect)95 OutputPort<HpaePcmBuffer *> *HpaeSourceProcessCluster::GetOutputPort(HpaeNodeInfo &nodeInfo, bool isDisConnect)
96 {
97     std::string sourceOutputNodeKey = TransNodeInfoToStringKey(nodeInfo);
98     HpaeNodeInfo effectNodeInfo;
99     captureEffectNode_->GetCapturerEffectConfig(effectNodeInfo);
100     std::string effectNodeKey = TransNodeInfoToStringKey(effectNodeInfo);
101     AUDIO_INFO_LOG("sourceOutput:[%{public}s] effectNode:[%{public}s]",
102         sourceOutputNodeKey.c_str(), effectNodeKey.c_str());
103     if (CheckHpaeNodeInfoIsSame(nodeInfo, effectNodeInfo)) {
104         AUDIO_INFO_LOG("Specification of sourceOutputNode is same with capture effect");
105         return captureEffectNode_->GetOutputPort();
106     }
107     CHECK_AND_RETURN_RET_LOG(SafeGetMap(fmtConverterNodeMap_, sourceOutputNodeKey),
108         captureEffectNode_->GetOutputPort(),
109         "HpaeSourceProcessCluster not find the sourceOutputNodeKey = %{public}s", sourceOutputNodeKey.c_str());
110     if (isDisConnect && fmtConverterNodeMap_[sourceOutputNodeKey]->GetOutputPortNum() <= 1) {
111         // disconnect fmtConverterNode->upEffectNode
112         AUDIO_INFO_LOG("disconnect fmtConverterNode between effectnode[[%{public}s] and sourceoutputnode[%{public}s]",
113             effectNodeKey.c_str(), sourceOutputNodeKey.c_str());
114         fmtConverterNodeMap_[sourceOutputNodeKey]->DisConnect(captureEffectNode_);
115     }
116     return fmtConverterNodeMap_[sourceOutputNodeKey]->GetOutputPort();
117 }
118 
Connect(const std::shared_ptr<OutputNode<HpaePcmBuffer * >> & preNode)119 void HpaeSourceProcessCluster::Connect(const std::shared_ptr<OutputNode<HpaePcmBuffer *>> &preNode)
120 {
121     HpaeNodeInfo effectNodeInfo;
122     captureEffectNode_->GetCapturerEffectConfig(effectNodeInfo);
123     captureEffectNode_->ConnectWithInfo(preNode, effectNodeInfo);
124 }
125 
DisConnect(const std::shared_ptr<OutputNode<HpaePcmBuffer * >> & preNode)126 void HpaeSourceProcessCluster::DisConnect(const std::shared_ptr<OutputNode<HpaePcmBuffer *>> &preNode)
127 {
128     HpaeNodeInfo effectNodeInfo;
129     captureEffectNode_->GetCapturerEffectConfig(effectNodeInfo);
130     captureEffectNode_->DisConnectWithInfo(preNode, effectNodeInfo);
131 }
132 
ConnectWithInfo(const std::shared_ptr<OutputNode<HpaePcmBuffer * >> & preNode,HpaeNodeInfo & nodeInfo)133 void HpaeSourceProcessCluster::ConnectWithInfo(const std::shared_ptr<OutputNode<HpaePcmBuffer*>>& preNode,
134     HpaeNodeInfo &nodeInfo)
135 {
136     captureEffectNode_->ConnectWithInfo(preNode, nodeInfo);
137 }
138 
DisConnectWithInfo(const std::shared_ptr<OutputNode<HpaePcmBuffer * >> & preNode,HpaeNodeInfo & nodeInfo)139 void HpaeSourceProcessCluster::DisConnectWithInfo(const std::shared_ptr<OutputNode<HpaePcmBuffer*>>& preNode,
140     HpaeNodeInfo &nodeInfo)
141 {
142     captureEffectNode_->DisConnectWithInfo(preNode, nodeInfo);
143 }
144 
GetCapturerEffectConfig(HpaeNodeInfo & nodeInfo,HpaeSourceBufferType type)145 bool HpaeSourceProcessCluster::GetCapturerEffectConfig(HpaeNodeInfo &nodeInfo, HpaeSourceBufferType type)
146 {
147     return captureEffectNode_->GetCapturerEffectConfig(nodeInfo, type);
148 }
149 
GetOutputPortNum()150 size_t HpaeSourceProcessCluster::GetOutputPortNum()
151 {
152     return captureEffectNode_->GetOutputPortNum();
153 }
154 
CaptureEffectCreate(uint64_t sceneKeyCode,CaptureEffectAttr attr)155 int32_t HpaeSourceProcessCluster::CaptureEffectCreate(uint64_t sceneKeyCode, CaptureEffectAttr attr)
156 {
157     CHECK_AND_RETURN_RET_LOG(captureEffectNode_, ERROR_ILLEGAL_STATE, "captureEffectNode_ is nullptr");
158     return captureEffectNode_->CaptureEffectCreate(sceneKeyCode, attr);
159 }
160 
CaptureEffectRelease(uint64_t sceneKeyCode)161 int32_t HpaeSourceProcessCluster::CaptureEffectRelease(uint64_t sceneKeyCode)
162 {
163     CHECK_AND_RETURN_RET_LOG(captureEffectNode_, ERROR_ILLEGAL_STATE, "captureEffectNode_ is nullptr");
164     return captureEffectNode_->CaptureEffectRelease(sceneKeyCode);
165 }
166 
167 // for ut test
GetCapturerEffectNodeUseCount()168 uint32_t HpaeSourceProcessCluster::GetCapturerEffectNodeUseCount()
169 {
170     return captureEffectNode_.use_count();
171 }
172 
GetConverterNodeCount()173 uint32_t HpaeSourceProcessCluster::GetConverterNodeCount()
174 {
175     return fmtConverterNodeMap_.size();
176 }
177 
GetPreOutNum()178 size_t HpaeSourceProcessCluster::GetPreOutNum()
179 {
180     CHECK_AND_RETURN_RET_LOG(captureEffectNode_, 0, "captureEffectNode_ is nullptr");
181     return captureEffectNode_->GetPreOutNum();
182 }
183 }  // namespace HPAE
184 }  // namespace AudioStandard
185 }  // namespace OHOS