• 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 "HpaeInnerCapturerManager"
18 #endif
19 #include "audio_stream_info.h"
20 #include "audio_errors.h"
21 #include "audio_utils.h"
22 #include "hpae_node_common.h"
23 #include "hpae_inner_capturer_manager.h"
24 #include "audio_engine_log.h"
25 
26 namespace OHOS {
27 namespace AudioStandard {
28 namespace HPAE {
29 // todo sinkInfo
HpaeInnerCapturerManager(HpaeSinkInfo & sinkInfo)30 HpaeInnerCapturerManager::HpaeInnerCapturerManager(HpaeSinkInfo &sinkInfo)
31     : sinkInfo_(sinkInfo), hpaeNoLockQueue_(CURRENT_REQUEST_COUNT)
32 {}
33 
~HpaeInnerCapturerManager()34 HpaeInnerCapturerManager::~HpaeInnerCapturerManager()
35 {
36     AUDIO_INFO_LOG("destructor inner capturer sink.");
37     if (isInit_.load()) {
38         DeInit();
39     }
40 }
41 
AddNodeToSink(const std::shared_ptr<HpaeSinkInputNode> & node)42 int32_t HpaeInnerCapturerManager::AddNodeToSink(const std::shared_ptr<HpaeSinkInputNode> &node)
43 {
44     auto request = [this, node]() {
45         AddSingleNodeToSinkInner(node);
46     };
47     SendRequestInner(request);
48     return SUCCESS;
49 }
50 
AddSingleNodeToSinkInner(const std::shared_ptr<HpaeSinkInputNode> & node,bool isConnect)51 void HpaeInnerCapturerManager::AddSingleNodeToSinkInner(const std::shared_ptr<HpaeSinkInputNode> &node, bool isConnect)
52 {
53     HpaeNodeInfo nodeInfo = node->GetNodeInfo();
54     uint32_t sessionId = nodeInfo.sessionId;
55     Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::AddSingleNodeToSinkInner");
56     AUDIO_INFO_LOG("[FinishMove] session :%{public}u to sink:%{public}s", sessionId, sinkInfo_.deviceClass.c_str());
57     sinkInputNodeMap_[sessionId] = node;
58     nodeInfo.deviceClass = sinkInfo_.deviceClass;
59     nodeInfo.deviceNetId = sinkInfo_.deviceNetId;
60     nodeInfo.sceneType = HPAE_SCENE_EFFECT_NONE;
61     nodeInfo.statusCallback = weak_from_this();
62     sinkInputNodeMap_[sessionId]->SetNodeInfo(nodeInfo);
63     SetSessionStateForRenderer(sessionId, node->GetState());
64     rendererSessionNodeMap_[sessionId].sceneType = nodeInfo.sceneType;
65     sceneTypeToProcessClusterCount_++;
66 
67     if (!SafeGetMap(rendererSceneClusterMap_, nodeInfo.sceneType)) {
68         rendererSceneClusterMap_[nodeInfo.sceneType] = std::make_shared<HpaeProcessCluster>(nodeInfo, sinkInfo_);
69     }
70 
71     if (!isConnect) {
72         AUDIO_INFO_LOG("[FinishMove] not need connect session:%{public}d", sessionId);
73         return;
74     }
75 
76     if (node->GetState() == HPAE_SESSION_RUNNING) {
77         AUDIO_INFO_LOG("[FinishMove] session:%{public}u connect to sink:%{public}s",
78             sessionId, sinkInfo_.deviceClass.c_str());
79         ConnectRendererInputSessionInner(sessionId);
80     }
81 }
82 
AddAllNodesToSink(const std::vector<std::shared_ptr<HpaeSinkInputNode>> & sinkInputs,bool isConnect)83 int32_t HpaeInnerCapturerManager::AddAllNodesToSink(
84     const std::vector<std::shared_ptr<HpaeSinkInputNode>> &sinkInputs, bool isConnect)
85 {
86     auto request = [this, sinkInputs, isConnect]() {
87         for (const auto &it : sinkInputs) {
88             AddSingleNodeToSinkInner(it, isConnect);
89         }
90     };
91     SendRequestInner(request);
92     return SUCCESS;
93 }
94 
MoveAllStreamToNewSinkInner(const std::string & sinkName,const std::vector<uint32_t> & moveIds,MoveSessionType moveType)95 void HpaeInnerCapturerManager::MoveAllStreamToNewSinkInner(const std::string &sinkName,
96     const std::vector<uint32_t>& moveIds, MoveSessionType moveType)
97 {
98     Trace trace("HpaeInnerCapturerManager::MoveAllStreamToNewSinkInner[" + sinkName + "]");
99     std::string name = sinkName;
100     std::vector<std::shared_ptr<HpaeSinkInputNode>> sinkInputs;
101     std::vector<uint32_t> sessionIds;
102     std::string idStr;
103     for (const auto &it : sinkInputNodeMap_) {
104         if (!rendererSessionNodeMap_[it.first].isMoveAble) {
105             AUDIO_INFO_LOG("move session:%{public}u failed, session is not moveable.", it.first);
106             continue;
107         }
108         if (moveType == MOVE_ALL || std::find(moveIds.begin(), moveIds.end(), it.first) != moveIds.end()) {
109             sinkInputs.emplace_back(it.second);
110             sessionIds.emplace_back(it.first);
111             idStr.append("[");
112             idStr.append(std::to_string(it.first));
113             idStr.append("],");
114         }
115     }
116     for (const auto &it : sessionIds) {
117         DeleteRendererInputSessionInner(it);
118     }
119     AUDIO_INFO_LOG("[StartMove] session:%{public}s to sink name:%{public}s, move type:%{public}d",
120         idStr.c_str(), name.c_str(), moveType);
121     TriggerCallback(MOVE_ALL_SINK_INPUT, sinkInputs, name, moveType);
122 }
123 
MoveAllStream(const std::string & sinkName,const std::vector<uint32_t> & sessionIds,MoveSessionType moveType)124 int32_t HpaeInnerCapturerManager::MoveAllStream(const std::string &sinkName, const std::vector<uint32_t>& sessionIds,
125     MoveSessionType moveType)
126 {
127     if (!IsInit()) {
128         AUDIO_INFO_LOG("sink is not init ,use sync mode move to:%{public}s.", sinkName.c_str());
129         MoveAllStreamToNewSinkInner(sinkName, sessionIds, moveType);
130     } else {
131         AUDIO_INFO_LOG("sink is init ,use async mode move to:%{public}s.", sinkName.c_str());
132         auto request = [this, sinkName, sessionIds, moveType]() {
133             MoveAllStreamToNewSinkInner(sinkName, sessionIds, moveType);
134         };
135         SendRequestInner(request);
136     }
137     return SUCCESS;
138 }
139 
MoveStream(uint32_t sessionId,const std::string & sinkName)140 int32_t HpaeInnerCapturerManager::MoveStream(uint32_t sessionId, const std::string &sinkName)
141 {
142     AUDIO_INFO_LOG("move session:%{public}d,sink name:%{public}s", sessionId, sinkName.c_str());
143     auto request = [this, sessionId, sinkName]() {
144         if (!SafeGetMap(sinkInputNodeMap_, sessionId)) {
145             AUDIO_ERR_LOG("[StartMove] session:%{public}u failed,can not find session,move %{public}s --> %{public}s",
146                 sessionId, sinkInfo_.deviceName.c_str(), sinkName.c_str());
147             TriggerCallback(MOVE_SESSION_FAILED, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, MOVE_SINGLE, sinkName);
148             return;
149         }
150         if (sinkName.empty()) {
151             AUDIO_ERR_LOG("[StartMove] session:%{public}u failed,sinkName is empty", sessionId);
152             TriggerCallback(MOVE_SESSION_FAILED, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, MOVE_SINGLE, sinkName);
153             return;
154         }
155 
156         AUDIO_INFO_LOG("[StartMove] session: %{public}u,sink [%{public}s] --> [%{public}s]",
157             sessionId, sinkInfo_.deviceName.c_str(), sinkName.c_str());
158         std::shared_ptr<HpaeSinkInputNode> inputNode = sinkInputNodeMap_[sessionId];
159         DeleteRendererInputSessionInner(sessionId);
160         std::string name = sinkName;
161         TriggerCallback(MOVE_SINK_INPUT, inputNode, name);
162     };
163     SendRequestInner(request);
164     return SUCCESS;
165 }
166 
CreateStream(const HpaeStreamInfo & streamInfo)167 int32_t HpaeInnerCapturerManager::CreateStream(const HpaeStreamInfo &streamInfo)
168 {
169     if (!IsInit()) {
170         AUDIO_INFO_LOG("CreateStream not init");
171         return ERR_INVALID_OPERATION;
172     }
173     auto request = [this, streamInfo]() {
174         if (streamInfo.streamClassType == HPAE_STREAM_CLASS_TYPE_PLAY) {
175             Trace trace("HpaeInnerCapturerManager::CreateRendererStream id[" +
176                 std::to_string(streamInfo.sessionId) + "]");
177             AUDIO_INFO_LOG("CreateCapRendererStream sessionID: %{public}d", streamInfo.sessionId);
178             CreateRendererInputSessionInner(streamInfo);
179             SetSessionStateForRenderer(streamInfo.sessionId, HPAE_SESSION_PREPARED);
180             sinkInputNodeMap_[streamInfo.sessionId]->SetState(HPAE_SESSION_PREPARED);
181             rendererSessionNodeMap_[streamInfo.sessionId].isMoveAble = streamInfo.isMoveAble;
182         } else if (streamInfo.streamClassType == HPAE_STREAM_CLASS_TYPE_RECORD) {
183             Trace trace("HpaeInnerCapturerManager::CreateCapturerStream id[" +
184                 std::to_string(streamInfo.sessionId) + "]");
185             AUDIO_INFO_LOG("CreateCapCapturerStream sessionID: %{public}d", streamInfo.sessionId);
186             CreateCapturerInputSessionInner(streamInfo);
187             SetSessionStateForCapturer(streamInfo.sessionId, HPAE_SESSION_PREPARED);
188             capturerSessionNodeMap_[streamInfo.sessionId].isMoveAble = streamInfo.isMoveAble;
189         }
190     };
191     SendRequestInner(request);
192     return SUCCESS;
193 }
194 
DestroyStream(uint32_t sessionId)195 int32_t HpaeInnerCapturerManager::DestroyStream(uint32_t sessionId)
196 {
197     if (!IsInit()) {
198         return ERR_INVALID_OPERATION;
199     }
200     auto request = [this, sessionId]() {
201         CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId) ||
202             SafeGetMap(sourceOutputNodeMap_, sessionId),
203             "no find sessionId in sinkInputNodeMap and sourceOutputNodeMap");
204         AUDIO_INFO_LOG("DestroyStream sessionId %{public}u", sessionId);
205         if (SafeGetMap(sinkInputNodeMap_, sessionId)) {
206             Trace trace("HpaeInnerCapturerManager::DestroyRendererStream id[" + std::to_string(sessionId) + "]");
207             AUDIO_INFO_LOG("DestroyCapRendererStream sessionID: %{public}d", sessionId);
208             DeleteRendererInputSessionInner(sessionId);
209         } else if (SafeGetMap(sourceOutputNodeMap_, sessionId)) {
210             Trace trace("HpaeInnerCapturerManager::DestroyCapturerStream id[" + std::to_string(sessionId) + "]");
211             AUDIO_INFO_LOG("DestroyCapCapturerStream sessionID: %{public}d", sessionId);
212             DeleteCapturerInputSessionInner(sessionId);
213         }
214     };
215     SendRequestInner(request);
216     return SUCCESS;
217 }
218 
ReloadRenderManager(const HpaeSinkInfo & sinkInfo,bool isReload)219 int32_t HpaeInnerCapturerManager::ReloadRenderManager(const HpaeSinkInfo &sinkInfo, bool isReload)
220 {
221     if (IsInit()) {
222         AUDIO_INFO_LOG("deinit inner capture first.");
223         DeInit();
224     }
225     hpaeSignalProcessThread_ = std::make_unique<HpaeSignalProcessThread>();
226     auto request = [this, sinkInfo, isReload]() {
227         for (const auto &it: sinkInputNodeMap_) {
228             DeleteRendererInputNodeSession(it.second);
229         }
230 
231         sinkInfo_ = sinkInfo;
232         InitSinkInner(isReload);
233 
234         for (const auto &it: sinkInputNodeMap_) {
235             HpaeProcessorType processorType =  it.second->GetSceneType();
236             HpaeNodeInfo nodeInfo = it.second->GetNodeInfo();
237             if (!SafeGetMap(rendererSceneClusterMap_, processorType)) {
238                 rendererSceneClusterMap_[processorType] = std::make_shared<HpaeProcessCluster>(nodeInfo, sinkInfo_);
239             }
240             if (it.second->GetState() == HPAE_SESSION_RUNNING) {
241                 ConnectRendererInputSessionInner(it.first);
242             }
243         }
244     };
245     SendRequestInner(request, true);
246     hpaeSignalProcessThread_->ActivateThread(shared_from_this());
247     return SUCCESS;
248 }
249 
Init(bool isReload)250 int32_t HpaeInnerCapturerManager::Init(bool isReload)
251 {
252     hpaeSignalProcessThread_ = std::make_unique<HpaeSignalProcessThread>();
253     auto request = [this, isReload] {
254         Trace trace("HpaeInnerCapturerManager::Init");
255         InitSinkInner(isReload);
256     };
257     SendRequestInner(request, true);
258     hpaeSignalProcessThread_->ActivateThread(shared_from_this());
259     return SUCCESS;
260 }
261 
InitSinkInner(bool isReload)262 void HpaeInnerCapturerManager::InitSinkInner(bool isReload)
263 {
264     Trace trace("HpaeInnerCapturerManager::InitSinkInner");
265     HpaeNodeInfo nodeInfo;
266     nodeInfo.channels = sinkInfo_.channels;
267     nodeInfo.format = sinkInfo_.format;
268     nodeInfo.frameLen = sinkInfo_.frameLen;
269     nodeInfo.nodeId = 0;
270     nodeInfo.samplingRate = sinkInfo_.samplingRate;
271     nodeInfo.sceneType = HPAE_SCENE_EFFECT_OUT;
272     nodeInfo.deviceClass = sinkInfo_.deviceClass;
273     nodeInfo.statusCallback = weak_from_this();
274     hpaeInnerCapSinkNode_ = std::make_unique<HpaeInnerCapSinkNode>(nodeInfo);
275     AUDIO_INFO_LOG("Init innerCapSinkNode");
276     hpaeInnerCapSinkNode_->InnerCapturerSinkInit();
277     isInit_.store(true);
278     TriggerCallback(isReload ? RELOAD_AUDIO_SINK_RESULT :INIT_DEVICE_RESULT, sinkInfo_.deviceName, SUCCESS);
279 }
280 
DeactivateThread()281 bool HpaeInnerCapturerManager::DeactivateThread()
282 {
283     if (hpaeSignalProcessThread_ != nullptr) {
284         hpaeSignalProcessThread_->DeactivateThread();
285         hpaeSignalProcessThread_ = nullptr;
286     }
287     hpaeNoLockQueue_.HandleRequests();
288     return true;
289 }
290 
DeInit(bool isMoveDefault)291 int32_t HpaeInnerCapturerManager::DeInit(bool isMoveDefault)
292 {
293     Trace trace("HpaeInnerCapturerManager::DeInit[" + std::to_string(isMoveDefault) + "]");
294     if (hpaeSignalProcessThread_ != nullptr) {
295         hpaeSignalProcessThread_->DeactivateThread();
296         hpaeSignalProcessThread_ = nullptr;
297     }
298     hpaeNoLockQueue_.HandleRequests();
299     int32_t ret = SUCCESS;
300     if (hpaeInnerCapSinkNode_  != nullptr) {
301         ret = hpaeInnerCapSinkNode_->InnerCapturerSinkDeInit();
302         hpaeInnerCapSinkNode_->ResetAll();
303         hpaeInnerCapSinkNode_ = nullptr;
304     }
305     isInit_.store(false);
306     if (isMoveDefault) {
307         std::string sinkName = "";
308         std::vector<uint32_t> ids;
309         AUDIO_INFO_LOG("move all sink to default sink");
310         MoveAllStreamToNewSinkInner(sinkName, ids, MOVE_ALL);
311     }
312     return ret;
313 }
314 
Start(uint32_t sessionId)315 int32_t HpaeInnerCapturerManager::Start(uint32_t sessionId)
316 {
317     auto request = [this, sessionId]() {
318         CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId) ||
319             SafeGetMap(sourceOutputNodeMap_, sessionId),\
320             "no find sessionId in sinkInputNodeMap and sourceOutputNodeMap");
321         if (SafeGetMap(sinkInputNodeMap_, sessionId)) {
322             Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::StartRendererStream");
323             AUDIO_INFO_LOG("StartCapRendererStream sessionId %{public}u", sessionId);
324             sinkInputNodeMap_[sessionId]->SetState(HPAE_SESSION_RUNNING);
325             ConnectRendererInputSessionInner(sessionId);
326             SetSessionStateForRenderer(sessionId, HPAE_SESSION_RUNNING);
327         } else if (SafeGetMap(sourceOutputNodeMap_, sessionId)) {
328             Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::StartCapturerStream");
329             AUDIO_INFO_LOG("StartCapCapturerStream sessionId %{public}u", sessionId);
330             if (hpaeInnerCapSinkNode_->GetSinkState() != STREAM_MANAGER_RUNNING) {
331                 hpaeInnerCapSinkNode_->InnerCapturerSinkStart();
332             }
333             sourceOutputNodeMap_[sessionId]->SetState(HPAE_SESSION_RUNNING);
334             ConnectCapturerOutputSessionInner(sessionId);
335             SetSessionStateForCapturer(sessionId, HPAE_SESSION_RUNNING);
336         }
337     };
338     SendRequestInner(request);
339     return SUCCESS;
340 }
341 
Pause(uint32_t sessionId)342 int32_t HpaeInnerCapturerManager::Pause(uint32_t sessionId)
343 {
344     auto request = [this, sessionId]() {
345         CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId) ||
346             SafeGetMap(sourceOutputNodeMap_, sessionId),
347             "no find sessionId in sinkInputNodeMap and sourceOutputNodeMap");
348         if (SafeGetMap(sinkInputNodeMap_, sessionId)) {
349             Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::PauseRendererStream");
350             AUDIO_INFO_LOG("PauseCapRendererStream sessionId %{public}u", sessionId);
351             DisConnectRendererInputSessionInner(sessionId);
352             SetSessionStateForRenderer(sessionId, HPAE_SESSION_PAUSED);
353             sinkInputNodeMap_[sessionId]->SetState(HPAE_SESSION_PAUSED);
354             TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId,
355                 HPAE_SESSION_PAUSED, OPERATION_PAUSED);
356         } else if (SafeGetMap(sourceOutputNodeMap_, sessionId)) {
357             Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::PauseCapturerStream");
358             AUDIO_INFO_LOG("PauseCapCapturerStream sessionId %{public}u", sessionId);
359             DisConnectCapturerInputSessionInner(sessionId);
360             SetSessionStateForCapturer(sessionId, HPAE_SESSION_PAUSED);
361             TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_RECORD, sessionId,
362                 HPAE_SESSION_PAUSED, OPERATION_PAUSED);
363         }
364     };
365     SendRequestInner(request);
366     return SUCCESS;
367 }
368 
Flush(uint32_t sessionId)369 int32_t HpaeInnerCapturerManager::Flush(uint32_t sessionId)
370 {
371     auto request = [this, sessionId]() {
372         CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId) ||
373             SafeGetMap(sourceOutputNodeMap_, sessionId),\
374             "no find sessionId in sinkInputNodeMap and sourceOutputNodeMap");
375         if (SafeGetMap(sinkInputNodeMap_, sessionId)) {
376             Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::FlushRendererStream");
377             AUDIO_INFO_LOG("FlushCapRendererStream sessionId %{public}u", sessionId);
378             CHECK_AND_RETURN_LOG(rendererSessionNodeMap_.find(sessionId) != rendererSessionNodeMap_.end(),
379                 "Flush not find sessionId %{public}u", sessionId);
380         } else if (SafeGetMap(sourceOutputNodeMap_, sessionId)) {
381             Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::FlushCapturerStream");
382             AUDIO_INFO_LOG("FlushCapCapturerStream sessionId %{public}u", sessionId);
383             CHECK_AND_RETURN_LOG(capturerSessionNodeMap_.find(sessionId) != capturerSessionNodeMap_.end(),
384                 "Flush not find sessionId %{public}u", sessionId);
385         }
386     };
387     SendRequestInner(request);
388     return SUCCESS;
389 }
390 
Drain(uint32_t sessionId)391 int32_t HpaeInnerCapturerManager::Drain(uint32_t sessionId)
392 {
393     auto request = [this, sessionId]() {
394         CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId) ||
395             SafeGetMap(sourceOutputNodeMap_, sessionId),
396             "no find sessionId in sinkInputNodeMap and sourceOutputNodeMap");
397         if (SafeGetMap(sinkInputNodeMap_, sessionId)) {
398             Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::DrainRendererStream");
399             AUDIO_INFO_LOG("DrainCapRendererStream sessionId %{public}u", sessionId);
400             CHECK_AND_RETURN_LOG(rendererSessionNodeMap_.find(sessionId) != rendererSessionNodeMap_.end(),
401                 "Drain not find sessionId %{public}u", sessionId);
402             sinkInputNodeMap_[sessionId]->Drain();
403             if (rendererSessionNodeMap_[sessionId].state != HPAE_SESSION_RUNNING) {
404                 AUDIO_INFO_LOG("TriggerCallback Drain sessionId %{public}u", sessionId);
405                 TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId,
406                     rendererSessionNodeMap_[sessionId].state, OPERATION_DRAINED);
407             }
408         } else if (SafeGetMap(sourceOutputNodeMap_, sessionId)) {
409             Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::DrainCapturerStream");
410             AUDIO_INFO_LOG("DrainCapCapturerStream sessionId %{public}u", sessionId);
411             CHECK_AND_RETURN_LOG(capturerSessionNodeMap_.find(sessionId) != capturerSessionNodeMap_.end(),
412                 "Drain not find sessionId %{public}u", sessionId);
413             TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_RECORD, sessionId,
414                 capturerSessionNodeMap_[sessionId].state, OPERATION_DRAINED);
415         }
416     };
417     SendRequestInner(request);
418     return SUCCESS;
419 }
420 
Stop(uint32_t sessionId)421 int32_t HpaeInnerCapturerManager::Stop(uint32_t sessionId)
422 {
423     auto request = [this, sessionId]() {
424         CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId) ||
425             SafeGetMap(sourceOutputNodeMap_, sessionId),\
426             "no find sessionId in sinkInputNodeMap and sourceOutputNodeMap");
427         if (SafeGetMap(sinkInputNodeMap_, sessionId)) {
428             Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::StopRendererStream");
429             AUDIO_INFO_LOG("StopCapRendererStream sessionId %{public}u", sessionId);
430             DisConnectRendererInputSessionInner(sessionId);
431             SetSessionStateForRenderer(sessionId, HPAE_SESSION_STOPPED);
432             sinkInputNodeMap_[sessionId]->SetState(HPAE_SESSION_STOPPED);
433             TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId,
434                 HPAE_SESSION_STOPPED, OPERATION_STOPPED);
435         } else if (SafeGetMap(sourceOutputNodeMap_, sessionId)) {
436             Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::StopCapturerStream");
437             AUDIO_INFO_LOG("StopCapCapturerStream sessionId %{public}u", sessionId);
438             DisConnectCapturerInputSessionInner(sessionId);
439             SetSessionStateForCapturer(sessionId, HPAE_SESSION_STOPPED);
440             TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_RECORD, sessionId,
441                 HPAE_SESSION_STOPPED, OPERATION_STOPPED);
442         }
443     };
444     SendRequestInner(request);
445     return SUCCESS;
446 }
447 
Release(uint32_t sessionId)448 int32_t HpaeInnerCapturerManager::Release(uint32_t sessionId)
449 {
450     return DestroyStream(sessionId);
451 }
452 
SuspendStreamManager(bool isSuspend)453 int32_t HpaeInnerCapturerManager::SuspendStreamManager(bool isSuspend)
454 {
455     Trace trace("HpaeInnerCapturerManager::SuspendStreamManager: " + std::to_string(isSuspend));
456     auto request = [this, isSuspend]() {
457         if (isSuspend) {
458             // todo fadout
459             hpaeInnerCapSinkNode_->InnerCapturerSinkStop();
460         } else {
461             // todo fadout
462             hpaeInnerCapSinkNode_->InnerCapturerSinkStart();
463         }
464     };
465     SendRequestInner(request);
466     return SUCCESS;
467 }
468 
SetMute(bool isMute)469 int32_t HpaeInnerCapturerManager::SetMute(bool isMute)
470 {
471     Trace trace("HpaeInnerCapturerManager::SetMute: " + std::to_string(isMute));
472     auto request = [this, isMute]() {
473         if (hpaeInnerCapSinkNode_ != nullptr) {
474             hpaeInnerCapSinkNode_->SetMute(isMute);
475         } else {
476             AUDIO_INFO_LOG("hapeInnerCapSinkNode_ is nullptr");
477         }
478     };
479     SendRequestInner(request);
480     return SUCCESS;
481 }
482 
Process()483 void HpaeInnerCapturerManager::Process()
484 {
485     Trace trace("HpaeInnerCapturerManager::Process");
486     if (hpaeInnerCapSinkNode_ != nullptr && !sourceOutputNodeMap_.empty() && IsRunning()) {
487         for (const auto& sourceOutputNodePair : sourceOutputNodeMap_) {
488             if (capturerSessionNodeMap_[sourceOutputNodePair.first].state == HPAE_SESSION_RUNNING) {
489                 sourceOutputNodePair.second->DoProcess();
490             }
491         }
492     }
493 }
494 
HandleMsg()495 void HpaeInnerCapturerManager::HandleMsg()
496 {
497     hpaeNoLockQueue_.HandleRequests();
498 }
499 
IsInit()500 bool HpaeInnerCapturerManager::IsInit()
501 {
502     return isInit_.load();
503 }
504 
IsRunning(void)505 bool HpaeInnerCapturerManager::IsRunning(void)
506 {
507     if (hpaeInnerCapSinkNode_ != nullptr && hpaeSignalProcessThread_ != nullptr) {
508         return hpaeSignalProcessThread_->IsRunning() && hpaeInnerCapSinkNode_->GetSinkState() ==
509             STREAM_MANAGER_RUNNING;
510     } else {
511         return false;
512     }
513 }
514 
IsMsgProcessing()515 bool HpaeInnerCapturerManager::IsMsgProcessing()
516 {
517     return !hpaeNoLockQueue_.IsFinishProcess();
518 }
519 
SetClientVolume(uint32_t sessionId,float volume)520 int32_t HpaeInnerCapturerManager::SetClientVolume(uint32_t sessionId, float volume)
521 {
522     return SUCCESS;
523 }
524 
SetRate(uint32_t sessionId,int32_t rate)525 int32_t HpaeInnerCapturerManager::SetRate(uint32_t sessionId, int32_t rate)
526 {
527     return SUCCESS;
528 }
529 
SetAudioEffectMode(uint32_t sessionId,int32_t effectMode)530 int32_t HpaeInnerCapturerManager::SetAudioEffectMode(uint32_t sessionId, int32_t effectMode)
531 {
532     return SUCCESS;
533 }
534 
GetAudioEffectMode(uint32_t sessionId,int32_t & effectMode)535 int32_t HpaeInnerCapturerManager::GetAudioEffectMode(uint32_t sessionId, int32_t &effectMode)
536 {
537     return SUCCESS;
538 }
539 
SetPrivacyType(uint32_t sessionId,int32_t privacyType)540 int32_t HpaeInnerCapturerManager::SetPrivacyType(uint32_t sessionId, int32_t privacyType)
541 {
542     return SUCCESS;
543 }
544 
GetPrivacyType(uint32_t sessionId,int32_t & privacyType)545 int32_t HpaeInnerCapturerManager::GetPrivacyType(uint32_t sessionId, int32_t &privacyType)
546 {
547     return SUCCESS;
548 }
549 
RegisterWriteCallback(uint32_t sessionId,const std::weak_ptr<IStreamCallback> & callback)550 int32_t HpaeInnerCapturerManager::RegisterWriteCallback(uint32_t sessionId,
551     const std::weak_ptr<IStreamCallback> &callback)
552 {
553     auto request = [this, sessionId, callback]() {
554         AUDIO_INFO_LOG("RegisterWriteCallback sessionId %{public}u", sessionId);
555         CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId) ||
556             SafeGetMap(sourceOutputNodeMap_, sessionId),\
557             "no find sessionId in sinkInputNodeMap and sourceOutputNodeMap");
558         if (SafeGetMap(sinkInputNodeMap_, sessionId)) {
559             sinkInputNodeMap_[sessionId]->RegisterWriteCallback(callback);
560         }
561     };
562     SendRequestInner(request);
563     return SUCCESS;
564 }
565 
GetWritableSize(uint32_t sessionId)566 size_t HpaeInnerCapturerManager::GetWritableSize(uint32_t sessionId)
567 {
568     return SUCCESS;
569 }
570 
UpdateSpatializationState(uint32_t sessionId,bool spatializationEnabled,bool headTrackingEnabled)571 int32_t HpaeInnerCapturerManager::UpdateSpatializationState(
572     uint32_t sessionId, bool spatializationEnabled, bool headTrackingEnabled)
573 {
574     return SUCCESS;
575 }
576 
UpdateMaxLength(uint32_t sessionId,uint32_t maxLength)577 int32_t HpaeInnerCapturerManager::UpdateMaxLength(uint32_t sessionId, uint32_t maxLength)
578 {
579     return SUCCESS;
580 }
581 
GetAllSinkInputsInfo()582 std::vector<SinkInput> HpaeInnerCapturerManager::GetAllSinkInputsInfo()
583 {
584     std::vector<SinkInput> sinkInputs;
585     return sinkInputs;
586 }
587 
GetSinkInputInfo(uint32_t sessionId,HpaeSinkInputInfo & sinkInputInfo)588 int32_t HpaeInnerCapturerManager::GetSinkInputInfo(uint32_t sessionId, HpaeSinkInputInfo &sinkInputInfo)
589 {
590     if (!SafeGetMap(sinkInputNodeMap_, sessionId)) {
591         return ERR_INVALID_OPERATION;
592     }
593     sinkInputInfo.nodeInfo = sinkInputNodeMap_[sessionId]->GetNodeInfo();
594     sinkInputInfo.rendererSessionInfo = rendererSessionNodeMap_[sessionId];
595     return SUCCESS;
596 }
597 
RefreshProcessClusterByDevice()598 int32_t HpaeInnerCapturerManager::RefreshProcessClusterByDevice()
599 {
600     return SUCCESS;
601 }
602 
GetSinkInfo()603 HpaeSinkInfo HpaeInnerCapturerManager::GetSinkInfo()
604 {
605     return sinkInfo_;
606 }
607 
OnFadeDone(uint32_t sessionId,IOperation operation)608 void HpaeInnerCapturerManager::OnFadeDone(uint32_t sessionId, IOperation operation)
609 {
610     auto request = [this, sessionId, operation]() {
611         Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::OnFadeDone: " +
612             std::to_string(operation));
613         DisConnectRendererInputSessionInner(sessionId);
614         HpaeSessionState state = operation == OPERATION_STOPPED ? HPAE_SESSION_STOPPED : HPAE_SESSION_PAUSED;
615         SetSessionStateForRenderer(sessionId, state);
616         if (SafeGetMap(sinkInputNodeMap_, sessionId)) {
617             sinkInputNodeMap_[sessionId]->SetState(state);
618         }
619         TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId, state, operation);
620     };
621     SendRequestInner(request);
622 }
623 
OnNodeStatusUpdate(uint32_t sessionId,IOperation operation)624 void HpaeInnerCapturerManager::OnNodeStatusUpdate(uint32_t sessionId, IOperation operation)
625 {
626     CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId), "no find sessionId in sinkInputNodeMap");
627     TriggerCallback(UPDATE_STATUS, HPAE_STREAM_CLASS_TYPE_PLAY, sessionId,
628         rendererSessionNodeMap_[sessionId].state, operation);
629 }
630 
RegisterReadCallback(uint32_t sessionId,const std::weak_ptr<ICapturerStreamCallback> & callback)631 int32_t HpaeInnerCapturerManager::RegisterReadCallback(uint32_t sessionId,
632     const std::weak_ptr<ICapturerStreamCallback> &callback)
633 {
634     auto request = [this, sessionId, callback]() {
635         CHECK_AND_RETURN_LOG(SafeGetMap(sourceOutputNodeMap_, sessionId), "no find sessionId in sourceOutputNodeMap");
636         AUDIO_INFO_LOG("RegisterReadCallback sessionId %{public}u", sessionId);
637         sourceOutputNodeMap_[sessionId]->RegisterReadCallback(callback);
638     };
639     SendRequestInner(request);
640     return SUCCESS;
641 }
642 
GetSourceOutputInfo(uint32_t sessionId,HpaeSourceOutputInfo & sourceOutputInfo)643 int32_t HpaeInnerCapturerManager::GetSourceOutputInfo(uint32_t sessionId, HpaeSourceOutputInfo &sourceOutputInfo)
644 {
645     if (!SafeGetMap(sourceOutputNodeMap_, sessionId)) {
646         return ERR_INVALID_OPERATION;
647     }
648     sourceOutputInfo.nodeInfo = sourceOutputNodeMap_[sessionId]->GetNodeInfo();
649     sourceOutputInfo.capturerSessionInfo = capturerSessionNodeMap_[sessionId];
650     return SUCCESS;
651 }
652 
GetAllSourceOutputsInfo()653 std::vector<SourceOutput> HpaeInnerCapturerManager::GetAllSourceOutputsInfo()
654 {
655     // to do
656     std::vector<SourceOutput> sourceOutputs;
657     return sourceOutputs;
658 }
659 
CreateRendererInputSessionInner(const HpaeStreamInfo & streamInfo)660 int32_t HpaeInnerCapturerManager::CreateRendererInputSessionInner(const HpaeStreamInfo &streamInfo)
661 {
662     Trace trace("[" + std::to_string(streamInfo.sessionId) +
663         "]HpaeInnerCapturerManager::CreateRendererInputSessionInner");
664     HpaeNodeInfo nodeInfo;
665     nodeInfo.channels = streamInfo.channels;
666     nodeInfo.format = streamInfo.format;
667     nodeInfo.frameLen = streamInfo.frameLen;
668     nodeInfo.nodeId = GetSinkInputNodeIdInner();
669     nodeInfo.streamType = streamInfo.streamType;
670     nodeInfo.sessionId = streamInfo.sessionId;
671     nodeInfo.samplingRate = (AudioSamplingRate)streamInfo.samplingRate;
672     nodeInfo.sceneType = HPAE_SCENE_EFFECT_NONE;
673     nodeInfo.statusCallback = weak_from_this();
674     nodeInfo.deviceClass = sinkInfo_.deviceClass;
675     nodeInfo.deviceNetId = sinkInfo_.deviceNetId;
676     AUDIO_INFO_LOG("nodeInfo.channels %{public}d, nodeInfo.format %{public}hhu, nodeInfo.frameLen %{public}d",
677         nodeInfo.channels, nodeInfo.format, nodeInfo.frameLen);
678     sinkInputNodeMap_[streamInfo.sessionId] = std::make_shared<HpaeSinkInputNode>(nodeInfo);
679 
680     if (!SafeGetMap(rendererSceneClusterMap_, nodeInfo.sceneType)) {
681         rendererSceneClusterMap_[nodeInfo.sceneType] = std::make_shared<HpaeProcessCluster>(nodeInfo, sinkInfo_);
682         if (rendererSceneClusterMap_[nodeInfo.sceneType]->SetupAudioLimiter() != SUCCESS) {
683             AUDIO_ERR_LOG("SetupAudioLimiter failed, sessionId %{public}u", nodeInfo.sessionId);
684         }
685     }
686     sceneTypeToProcessClusterCount_++;
687     // todo change nodeInfo
688     return SUCCESS;
689 }
690 
CreateCapturerInputSessionInner(const HpaeStreamInfo & streamInfo)691 int32_t HpaeInnerCapturerManager::CreateCapturerInputSessionInner(const HpaeStreamInfo &streamInfo)
692 {
693     Trace trace("[" + std::to_string(streamInfo.sessionId) +
694         "]HpaeInnerCapturerManager::CreateCapturerInputSessionInner");
695     HpaeNodeInfo nodeInfo;
696     nodeInfo.channels = streamInfo.channels;
697     nodeInfo.format = streamInfo.format;
698     nodeInfo.frameLen = streamInfo.frameLen;
699     nodeInfo.streamType = streamInfo.streamType;
700     nodeInfo.sessionId = streamInfo.sessionId;
701     nodeInfo.samplingRate = (AudioSamplingRate)streamInfo.samplingRate;
702     nodeInfo.sceneType = HPAE_SCENE_EFFECT_NONE;
703     nodeInfo.sourceType = streamInfo.sourceType;
704     nodeInfo.statusCallback = weak_from_this();
705     nodeInfo.deviceClass = sinkInfo_.deviceClass;
706     nodeInfo.deviceNetId = sinkInfo_.deviceNetId;
707     AUDIO_INFO_LOG("nodeInfo.channels %{public}d, nodeInfo.format %{public}hhu, nodeInfo.frameLen %{public}d",
708         nodeInfo.channels, nodeInfo.format, nodeInfo.frameLen);
709     sourceOutputNodeMap_[streamInfo.sessionId] = std::make_shared<HpaeSourceOutputNode>(nodeInfo);
710     HpaeNodeInfo outputNodeInfo = hpaeInnerCapSinkNode_->GetNodeInfo();
711     // todo change nodeInfo
712     capturerAudioFormatConverterNodeMap_[streamInfo.sessionId] =
713         std::make_shared<HpaeAudioFormatConverterNode>(outputNodeInfo, nodeInfo);
714     capturerAudioFormatConverterNodeMap_[streamInfo.sessionId]->SetSourceNode(true);
715     capturerSessionNodeMap_[streamInfo.sessionId].sceneType = nodeInfo.sceneType;
716     return SUCCESS;
717 }
718 
DeleteRendererInputNodeSession(const std::shared_ptr<HpaeSinkInputNode> & sinkInputNode)719 void HpaeInnerCapturerManager::DeleteRendererInputNodeSession(const std::shared_ptr<HpaeSinkInputNode> &sinkInputNode)
720 {
721     HpaeProcessorType sceneType = sinkInputNode->GetSceneType();
722     if (SafeGetMap(rendererSceneClusterMap_, sceneType)) {
723         rendererSceneClusterMap_[sceneType]->DisConnect(sinkInputNode);
724         sceneTypeToProcessClusterCount_--;
725         uint32_t sessionId = sinkInputNode->GetSessionId();
726         if (sceneTypeToProcessClusterCount_ == 0) {
727             AUDIO_INFO_LOG("need to erase rendererSceneCluster, last stream: %{public}u", sessionId);
728         } else {
729             AUDIO_INFO_LOG("%{public}u is not last stream, no need erase rendererSceneCluster", sessionId);
730         }
731     }
732 }
733 
DeleteRendererInputSessionInner(uint32_t sessionId)734 int32_t HpaeInnerCapturerManager::DeleteRendererInputSessionInner(uint32_t sessionId)
735 {
736     Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::DeleteRendererInputSessionInner");
737     CHECK_AND_RETURN_RET_LOG(SafeGetMap(sinkInputNodeMap_, sessionId), SUCCESS,
738         "sessionId %{public}u can not find in sinkInputNodeMap_.", sessionId);
739     DeleteRendererInputNodeSession(sinkInputNodeMap_[sessionId]);
740     sinkInputNodeMap_.erase(sessionId);
741     return SUCCESS;
742 }
743 
DeleteCapturerInputSessionInner(uint32_t sessionId)744 int32_t HpaeInnerCapturerManager::DeleteCapturerInputSessionInner(uint32_t sessionId)
745 {
746     Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::DeleteCapturerInputSessionInner");
747     CHECK_AND_RETURN_RET_LOG(SafeGetMap(sourceOutputNodeMap_, sessionId), SUCCESS,
748         "sessionId %{public}u can not find in sourceOutputNodeMap_.", sessionId);
749     CHECK_AND_RETURN_RET_LOG(SafeGetMap(capturerAudioFormatConverterNodeMap_, sessionId), SUCCESS,
750         "sessionId %{public}u can not find in capturerAudioFormatConverterNodeMap_.", sessionId);
751     // no need process cluster
752     sourceOutputNodeMap_[sessionId]->DisConnect(capturerAudioFormatConverterNodeMap_[sessionId]);
753     capturerAudioFormatConverterNodeMap_[sessionId]->DisConnect(hpaeInnerCapSinkNode_);
754     if (hpaeInnerCapSinkNode_->GetOutputPortNum() == 0) {
755         hpaeInnerCapSinkNode_->InnerCapturerSinkStop();
756     }
757     return SUCCESS;
758 }
759 
ConnectRendererInputSessionInner(uint32_t sessionId)760 int32_t HpaeInnerCapturerManager::ConnectRendererInputSessionInner(uint32_t sessionId)
761 {
762     CHECK_AND_RETURN_RET_LOG(SafeGetMap(sinkInputNodeMap_, sessionId), ERR_INVALID_PARAM,
763         "sessionId %{public}u can not find in sinkInputNodeMap_.", sessionId);
764     CHECK_AND_RETURN_RET_LOG(sinkInputNodeMap_[sessionId]->GetState() == HPAE_SESSION_RUNNING, SUCCESS,
765         "sink input node is running");
766     HpaeProcessorType sceneType = sinkInputNodeMap_[sessionId]->GetSceneType();
767     CHECK_AND_RETURN_RET_LOG(SafeGetMap(rendererSceneClusterMap_, sceneType), SUCCESS,
768         "miss corresponding process cluster for scene type %{public}d", sceneType);
769     // todo check if connect process cluster
770     hpaeInnerCapSinkNode_->Connect(rendererSceneClusterMap_[sceneType]);
771     rendererSceneClusterMap_[sceneType]->Connect(sinkInputNodeMap_[sessionId]);
772     rendererSceneClusterMap_[sceneType]->SetLoudnessGain(sessionId, sinkInputNodeMap_[sessionId]->GetLoudnessGain());
773     return SUCCESS;
774 }
775 
ConnectCapturerOutputSessionInner(uint32_t sessionId)776 int32_t HpaeInnerCapturerManager::ConnectCapturerOutputSessionInner(uint32_t sessionId)
777 {
778     CHECK_AND_RETURN_RET_LOG(SafeGetMap(sourceOutputNodeMap_, sessionId), ERR_INVALID_PARAM,
779         "sessionId %{public}u can not find in sourceOutputCLusterMap.", sessionId);
780     CHECK_AND_RETURN_RET_LOG(SafeGetMap(capturerAudioFormatConverterNodeMap_, sessionId),
781         ERR_INVALID_PARAM,
782         "sessionId %{public}u can not find in capturerAudioFormatConverterNodeMap_.", sessionId);
783     // todo connect gain node
784     capturerAudioFormatConverterNodeMap_[sessionId]->Connect(hpaeInnerCapSinkNode_);
785     sourceOutputNodeMap_[sessionId]->Connect(capturerAudioFormatConverterNodeMap_[sessionId]);
786     return SUCCESS;
787 }
788 
OnDisConnectProcessCluster(HpaeProcessorType sceneType)789 void HpaeInnerCapturerManager::OnDisConnectProcessCluster(HpaeProcessorType sceneType)
790 {
791     auto request = [this, sceneType]() {
792         AUDIO_INFO_LOG("mixerNode trigger callback");
793         if (SafeGetMap(rendererSceneClusterMap_, sceneType) &&
794             rendererSceneClusterMap_[sceneType]->GetPreOutNum() == 0) {
795             rendererSceneClusterMap_[sceneType]->DisConnectMixerNode();
796             hpaeInnerCapSinkNode_->DisConnect(rendererSceneClusterMap_[sceneType]);
797         }
798 
799         if (sceneTypeToProcessClusterCount_ == 0) {
800             rendererSceneClusterMap_.erase(sceneType);
801             AUDIO_INFO_LOG("erase rendererSceneCluster sceneType[%{public}d]", sceneType);
802         } else {
803             AUDIO_INFO_LOG("no need erase rendererSceneCluster sceneType[%{public}d]", sceneType);
804         }
805     };
806     SendRequestInner(request);
807 }
808 
DisConnectRendererInputSessionInner(uint32_t sessionId)809 int32_t HpaeInnerCapturerManager::DisConnectRendererInputSessionInner(uint32_t sessionId)
810 {
811     CHECK_AND_RETURN_RET_LOG(SafeGetMap(sinkInputNodeMap_, sessionId), SUCCESS,
812         "sessionId %{public}u can not find in sinkInputNodeMap_.", sessionId);
813     HpaeProcessorType sceneType = sinkInputNodeMap_[sessionId]->GetSceneType();
814     if (SafeGetMap(rendererSceneClusterMap_, sceneType)) {
815         rendererSceneClusterMap_[sceneType]->DisConnect(sinkInputNodeMap_[sessionId]);
816     }
817     return SUCCESS;
818 }
819 
DisConnectCapturerInputSessionInner(uint32_t sessionId)820 int32_t HpaeInnerCapturerManager::DisConnectCapturerInputSessionInner(uint32_t sessionId)
821 {
822     CHECK_AND_RETURN_RET_LOG(SafeGetMap(sourceOutputNodeMap_, sessionId), SUCCESS,
823         "sessionId %{public}u can not find in sourceOutputNodeMap_.", sessionId);
824     CHECK_AND_RETURN_RET_LOG(SafeGetMap(capturerAudioFormatConverterNodeMap_, sessionId), SUCCESS,
825         "sessionId %{public}u can not find in capturerAudioFormatConverterNodeMap_.", sessionId);
826     sourceOutputNodeMap_[sessionId]->DisConnect(capturerAudioFormatConverterNodeMap_[sessionId]);
827     capturerAudioFormatConverterNodeMap_[sessionId]->DisConnect(hpaeInnerCapSinkNode_);
828     if (hpaeInnerCapSinkNode_->GetOutputPortNum() == 0) {
829         hpaeInnerCapSinkNode_->InnerCapturerSinkStop();
830     }
831     return SUCCESS;
832 }
833 
SetSessionStateForRenderer(uint32_t sessionId,HpaeSessionState renderState)834 void HpaeInnerCapturerManager::SetSessionStateForRenderer(uint32_t sessionId, HpaeSessionState renderState)
835 {
836     rendererSessionNodeMap_[sessionId].state = renderState;
837 }
838 
SetSessionStateForCapturer(uint32_t sessionId,HpaeSessionState capturerState)839 void HpaeInnerCapturerManager::SetSessionStateForCapturer(uint32_t sessionId, HpaeSessionState capturerState)
840 {
841     capturerSessionNodeMap_[sessionId].state = capturerState;
842 }
843 
SendRequestInner(Request && request,bool isInit)844 void HpaeInnerCapturerManager::SendRequestInner(Request &&request, bool isInit)
845 {
846     if (!isInit && !IsInit()) {
847         AUDIO_INFO_LOG("HpaeInnerCapturerManager not init");
848         return;
849     }
850     hpaeNoLockQueue_.PushRequest(std::move(request));
851     CHECK_AND_RETURN_LOG(hpaeSignalProcessThread_, "hpaeSignalProcessThread_  inner capturer sink is nullptr");
852     hpaeSignalProcessThread_->Notify();
853 }
854 
GetSinkInputNodeIdInner()855 uint32_t HpaeInnerCapturerManager::GetSinkInputNodeIdInner()
856 {
857     return sinkInputNodeCounter_++;
858 }
859 
GetThreadName()860 std::string HpaeInnerCapturerManager::GetThreadName()
861 {
862     if (sinkInfo_.deviceName == "RemoteCastInnerCapturer") {
863         AUDIO_INFO_LOG("threadName is RemoteCast");
864         return "RemoteCast";
865     }
866     std::string threadName = "InnerCap";
867     for (auto ch : sinkInfo_.deviceName) {
868         if (ch >= '0' && ch <= '9') {
869             threadName += ch;
870         }
871     }
872     AUDIO_INFO_LOG("threadName change to %{public}s", threadName.c_str());
873     return threadName;
874 }
875 
GetDeviceHDFDumpInfo()876 std::string HpaeInnerCapturerManager::GetDeviceHDFDumpInfo()
877 {
878     std::string config;
879     TransDeviceInfoToString(sinkInfo_, config);
880     return config;
881 }
882 
SetLoudnessGain(uint32_t sessionId,float loudnessGain)883 int32_t HpaeInnerCapturerManager::SetLoudnessGain(uint32_t sessionId, float loudnessGain)
884 {
885     auto request = [this, sessionId, loudnessGain]() {
886         AUDIO_INFO_LOG("set loudnessGain %{public}f to sessionId %{public}d", loudnessGain, sessionId);
887         std::shared_ptr<HpaeSinkInputNode> sinkInputNode = SafeGetMap(sinkInputNodeMap_, sessionId);
888         CHECK_AND_RETURN_LOG(sinkInputNode != nullptr,
889             "session with Id %{public}d not in sinkInputNodeMap_", sessionId);
890         sinkInputNode->SetLoudnessGain(loudnessGain);
891 
892         HpaeProcessorType processorType = sinkInputNodeMap_[sessionId]->GetSceneType();
893         std::shared_ptr<HpaeProcessCluster> processCluster = SafeGetMap(rendererSceneClusterMap_, processorType);
894         CHECK_AND_RETURN_LOG(processCluster != nullptr,
895             "processCluster with sceneType %{public}d not exists", processorType);
896         processCluster->SetLoudnessGain(sessionId, loudnessGain);
897     };
898     SendRequestInner(request);
899     return SUCCESS;
900 }
901 
DumpSinkInfo()902 int32_t HpaeInnerCapturerManager::DumpSinkInfo()
903 {
904     CHECK_AND_RETURN_RET_LOG(IsInit(), ERR_ILLEGAL_STATE, "HpaeInnerCapturerManager not init");
905     auto request = [this]() {
906         AUDIO_INFO_LOG("DumpSinkInfo deviceName %{public}s", sinkInfo_.deviceName.c_str());
907         UploadDumpSinkInfo(sinkInfo_.deviceName);
908     };
909     SendRequestInner(request);
910     return SUCCESS;
911 }
912 
SetOffloadPolicy(uint32_t sessionId,int32_t state)913 int32_t HpaeInnerCapturerManager::SetOffloadPolicy(uint32_t sessionId, int32_t state)
914 {
915     auto request = [this, sessionId, state]() {
916         Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::SetOffloadPolicy");
917         AUDIO_INFO_LOG("SetOffloadPolicy sessionId %{public}u, deviceName %{public}s, state %{public}d", sessionId,
918             sinkInfo_.deviceName.c_str(), state);
919         CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId), "not find sessionId %{public}u", sessionId);
920         sinkInputNodeMap_[sessionId]->SetOffloadEnabled(state != OFFLOAD_DEFAULT);
921     };
922     SendRequestInner(request);
923     return SUCCESS;
924 }
925 
SetSpeed(uint32_t sessionId,float speed)926 void HpaeInnerCapturerManager::SetSpeed(uint32_t sessionId, float speed)
927 {
928     auto request = [this, sessionId, speed]() {
929         Trace trace("[" + std::to_string(sessionId) + "]HpaeInnerCapturerManager::SetSpeed");
930         AUDIO_INFO_LOG("SetSpeed sessionId %{public}u, deviceName %{public}s, speed %{public}f", sessionId,
931             sinkInfo_.deviceName.c_str(), speed);
932         CHECK_AND_RETURN_LOG(SafeGetMap(sinkInputNodeMap_, sessionId), "not find sessionId %{public}u", sessionId);
933         sinkInputNodeMap_[sessionId]->SetSpeed(speed);
934     };
935     SendRequestInner(request);
936 }
937 }  // namespace HPAE
938 }  // namespace AudioStandard
939 }  // namespace OHOS