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