• 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 "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