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 "HpaeSourceInputCluster"
18 #endif
19
20 #include "hpae_source_input_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 {
HpaeSourceInputCluster(HpaeNodeInfo & nodeInfo)28 HpaeSourceInputCluster::HpaeSourceInputCluster(HpaeNodeInfo &nodeInfo)
29 : HpaeNode(nodeInfo), sourceInputNode_(std::make_shared<HpaeSourceInputNode>(nodeInfo))
30 {
31 #ifdef ENABLE_HIDUMP_DFX
32 SetNodeName("HpaeSourceInputCluster");
33 #endif
34 }
35
HpaeSourceInputCluster(std::vector<HpaeNodeInfo> & nodeInfos)36 HpaeSourceInputCluster::HpaeSourceInputCluster(std::vector<HpaeNodeInfo> &nodeInfos)
37 {
38 CHECK_AND_RETURN_LOG(!nodeInfos.empty(), "nodeInfos vector is empty!");
39 auto nodeInfo = *nodeInfos.begin();
40 SetNodeInfo(nodeInfo);
41 #ifdef ENABLE_HIDUMP_DFX
42 SetNodeName("HpaeSourceInputCluster");
43 #endif
44 sourceInputNode_ = std::make_shared<HpaeSourceInputNode>(nodeInfos);
45 }
46
~HpaeSourceInputCluster()47 HpaeSourceInputCluster::~HpaeSourceInputCluster()
48 {
49 Reset();
50 #ifdef ENABLE_HIDUMP_DFX
51 AUDIO_INFO_LOG("NodeId: %{public}u NodeName: %{public}s destructed.",
52 GetNodeId(), GetNodeName().c_str());
53 #endif
54 }
55
DoProcess()56 void HpaeSourceInputCluster::DoProcess()
57 {
58 }
59
Reset()60 bool HpaeSourceInputCluster::Reset()
61 {
62 for (auto fmtConverterNode : fmtConverterNodeMap_) {
63 fmtConverterNode.second->Reset();
64 }
65 sourceInputNode_->Reset();
66 #ifdef ENABLE_HIDUMP_DFX
67 if (auto callback = sourceInputNode_->GetNodeStatusCallback().lock()) {
68 callback->OnNotifyDfxNodeInfo(false, sourceInputNode_->GetNodeId(), sourceInputNode_->GetNodeInfo());
69 }
70 #endif
71 return true;
72 }
73
ResetAll()74 bool HpaeSourceInputCluster::ResetAll()
75 {
76 for (auto fmtConverterNode : fmtConverterNodeMap_) {
77 fmtConverterNode.second->ResetAll();
78 }
79 sourceInputNode_->ResetAll();
80 return true;
81 }
82
GetSharedInstance()83 std::shared_ptr<HpaeNode> HpaeSourceInputCluster::GetSharedInstance()
84 {
85 return sourceInputNode_;
86 }
87
GetSharedInstance(HpaeNodeInfo & nodeInfo)88 std::shared_ptr<HpaeNode> HpaeSourceInputCluster::GetSharedInstance(HpaeNodeInfo &nodeInfo)
89 {
90 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, nullptr, "sourceInputNode_ is nullptr");
91 std::string preNodeKey = TransNodeInfoToStringKey(nodeInfo);
92 std::string inputNodeKey = TransNodeInfoToStringKey(GetNodeInfoWithInfo(nodeInfo.sourceBufferType));
93 AUDIO_INFO_LOG("sourceInput:[%{public}s] preNode:[%{public}s]",
94 inputNodeKey.c_str(), preNodeKey.c_str());
95 if (CheckHpaeNodeInfoIsSame(nodeInfo, GetNodeInfoWithInfo(nodeInfo.sourceBufferType))) {
96 AUDIO_INFO_LOG("Specification of sourceInputNode is same with preNode");
97 return sourceInputNode_;
98 }
99 if (!SafeGetMap(fmtConverterNodeMap_, preNodeKey)) {
100 fmtConverterNodeMap_[preNodeKey] =
101 std::make_shared<HpaeAudioFormatConverterNode>(GetNodeInfoWithInfo(nodeInfo.sourceBufferType), nodeInfo);
102 fmtConverterNodeMap_[preNodeKey]->SetSourceNode(true);
103 }
104 fmtConverterNodeMap_[preNodeKey]->ConnectWithInfo(
105 sourceInputNode_, fmtConverterNodeMap_[preNodeKey]->GetNodeInfo());
106 return fmtConverterNodeMap_[preNodeKey];
107 }
108
GetOutputPort()109 OutputPort<HpaePcmBuffer *> *HpaeSourceInputCluster::GetOutputPort()
110 {
111 return sourceInputNode_->GetOutputPort();
112 }
113
GetOutputPort(HpaeNodeInfo & nodeInfo,bool isDisConnect)114 OutputPort<HpaePcmBuffer *> *HpaeSourceInputCluster::GetOutputPort(HpaeNodeInfo &nodeInfo, bool isDisConnect)
115 {
116 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, nullptr, "sourceInputNode_ is nullptr");
117 std::string preNodeKey = TransNodeInfoToStringKey(nodeInfo);
118 std::string inputNodeKey = TransNodeInfoToStringKey(GetNodeInfoWithInfo(nodeInfo.sourceBufferType));
119 AUDIO_INFO_LOG("sourceinput:[%{public}s] preNodeKey:[%{public}s]",
120 inputNodeKey.c_str(), preNodeKey.c_str());
121 if (CheckHpaeNodeInfoIsSame(nodeInfo, GetNodeInfoWithInfo(nodeInfo.sourceBufferType))) {
122 AUDIO_INFO_LOG("sourceInputNode is same as preNode");
123 return sourceInputNode_->GetOutputPort(nodeInfo);
124 }
125 CHECK_AND_RETURN_RET_LOG(SafeGetMap(fmtConverterNodeMap_, preNodeKey),
126 sourceInputNode_->GetOutputPort(nodeInfo),
127 "HpaeSourceProcessCluster not find the preNodeKey = %{public}s", preNodeKey.c_str());
128 if (isDisConnect && fmtConverterNodeMap_[preNodeKey]->GetOutputPortNum() <= 1) {
129 AUDIO_INFO_LOG("disconnect fmtConverterNode between preNode[%{public}s] and sourceInputNode[%{public}s]",
130 preNodeKey.c_str(), inputNodeKey.c_str());
131 fmtConverterNodeMap_[preNodeKey]->DisConnectWithInfo(
132 sourceInputNode_, fmtConverterNodeMap_[preNodeKey]->GetNodeInfo());
133 }
134 return fmtConverterNodeMap_[preNodeKey]->GetOutputPort();
135 }
136
GetCapturerSourceInstance(const std::string & deviceClass,const std::string & deviceNetId,const SourceType & sourceType,const std::string & sourceName)137 int32_t HpaeSourceInputCluster::GetCapturerSourceInstance(const std::string &deviceClass,
138 const std::string &deviceNetId, const SourceType &sourceType, const std::string &sourceName)
139 {
140 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, ERR_ILLEGAL_STATE, "sourceInputNode_ is nullptr");
141 return sourceInputNode_->GetCapturerSourceInstance(deviceClass, deviceNetId, sourceType, sourceName);
142 }
143
CapturerSourceInit(IAudioSourceAttr & attr)144 int32_t HpaeSourceInputCluster::CapturerSourceInit(IAudioSourceAttr &attr)
145 {
146 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, ERR_ILLEGAL_STATE, "sourceInputNode_ is nullptr");
147 return sourceInputNode_->CapturerSourceInit(attr);
148 }
149
CapturerSourceDeInit()150 int32_t HpaeSourceInputCluster::CapturerSourceDeInit()
151 {
152 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, ERR_ILLEGAL_STATE, "sourceInputNode_ is nullptr");
153 return sourceInputNode_->CapturerSourceDeInit();
154 }
155
CapturerSourceFlush(void)156 int32_t HpaeSourceInputCluster::CapturerSourceFlush(void)
157 {
158 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, ERR_ILLEGAL_STATE, "sourceInputNode_ is nullptr");
159 return sourceInputNode_->CapturerSourceFlush();
160 }
161
CapturerSourcePause(void)162 int32_t HpaeSourceInputCluster::CapturerSourcePause(void)
163 {
164 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, ERR_ILLEGAL_STATE, "sourceInputNode_ is nullptr");
165 return sourceInputNode_->CapturerSourcePause();
166 }
167
CapturerSourceReset(void)168 int32_t HpaeSourceInputCluster::CapturerSourceReset(void)
169 {
170 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, ERR_ILLEGAL_STATE, "sourceInputNode_ is nullptr");
171 return sourceInputNode_->CapturerSourceReset();
172 }
173
CapturerSourceResume(void)174 int32_t HpaeSourceInputCluster::CapturerSourceResume(void)
175 {
176 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, ERR_ILLEGAL_STATE, "sourceInputNode_ is nullptr");
177 return sourceInputNode_->CapturerSourceResume();
178 }
179
CapturerSourceStart(void)180 int32_t HpaeSourceInputCluster::CapturerSourceStart(void)
181 {
182 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, ERR_ILLEGAL_STATE, "sourceInputNode_ is nullptr");
183 return sourceInputNode_->CapturerSourceStart();
184 }
185
CapturerSourceStop(void)186 int32_t HpaeSourceInputCluster::CapturerSourceStop(void)
187 {
188 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, ERR_ILLEGAL_STATE, "sourceInputNode_ is nullptr");
189 return sourceInputNode_->CapturerSourceStop();
190 }
191
GetSourceState(void)192 StreamManagerState HpaeSourceInputCluster::GetSourceState(void)
193 {
194 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, STREAM_MANAGER_INVALID, "sourceInputNode_ is nullptr");
195 return sourceInputNode_->GetSourceState();
196 }
197
GetOutputPortNum()198 size_t HpaeSourceInputCluster::GetOutputPortNum()
199 {
200 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, 0, "sourceInputNode_ is nullptr");
201 return sourceInputNode_->GetOutputPortNum();
202 }
203
GetOutputPortNum(HpaeNodeInfo & nodeInfo)204 size_t HpaeSourceInputCluster::GetOutputPortNum(HpaeNodeInfo &nodeInfo)
205 {
206 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, 0, "sourceInputNode_ is nullptr");
207 return sourceInputNode_->GetOutputPortNum(nodeInfo);
208 }
209
GetSourceInputNodeType()210 HpaeSourceInputNodeType HpaeSourceInputCluster::GetSourceInputNodeType()
211 {
212 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, HPAE_SOURCE_DEFAULT, "sourceInputNode_ is nullptr");
213 return sourceInputNode_->GetSourceInputNodeType();
214 }
215
SetSourceInputNodeType(HpaeSourceInputNodeType type)216 void HpaeSourceInputCluster::SetSourceInputNodeType(HpaeSourceInputNodeType type)
217 {
218 CHECK_AND_RETURN_LOG(sourceInputNode_, "sourceInputNode_ is nullptr");
219 sourceInputNode_->SetSourceInputNodeType(type);
220 }
221
GetNodeInfoWithInfo(HpaeSourceBufferType & type)222 HpaeNodeInfo &HpaeSourceInputCluster::GetNodeInfoWithInfo(HpaeSourceBufferType &type)
223 {
224 return sourceInputNode_->GetNodeInfoWithInfo(type);
225 }
226
UpdateAppsUidAndSessionId(std::vector<int32_t> & appsUid,std::vector<int32_t> & sessionsId)227 void HpaeSourceInputCluster::UpdateAppsUidAndSessionId(std::vector<int32_t> &appsUid, std::vector<int32_t> &sessionsId)
228 {
229 sourceInputNode_->UpdateAppsUidAndSessionId(appsUid, sessionsId);
230 }
231
232 // for test
GetConverterNodeCount()233 uint32_t HpaeSourceInputCluster::GetConverterNodeCount()
234 {
235 return fmtConverterNodeMap_.size();
236 }
237
GetSourceInputNodeUseCount()238 uint32_t HpaeSourceInputCluster::GetSourceInputNodeUseCount()
239 {
240 return sourceInputNode_.use_count();
241 }
242
WriteCapturerData(char * data,int32_t dataSize)243 int32_t HpaeSourceInputCluster::WriteCapturerData(char *data, int32_t dataSize)
244 {
245 CHECK_AND_RETURN_RET_LOG(sourceInputNode_, ERR_ILLEGAL_STATE, "sourceInputNode_ is nullptr");
246 return sourceInputNode_->WriteCapturerData(data, dataSize);
247 }
248
GetCaptureId()249 uint32_t HpaeSourceInputCluster::GetCaptureId()
250 {
251 return sourceInputNode_->GetCaptureId();
252 }
253 } // namespace HPAE
254 } // namespace AudioStandard
255 } // namespace OHOS