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