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 #ifndef LOG_TAG
16 #define LOG_TAG "AudioPipeManager"
17 #endif
18
19 #include "audio_pipe_manager.h"
20
21 namespace OHOS {
22 namespace AudioStandard {
23
24 const uint32_t FIRST_SESSIONID = 100000;
25 constexpr uint32_t MAX_VALID_SESSIONID = UINT32_MAX - FIRST_SESSIONID;
AudioPipeManager()26 AudioPipeManager::AudioPipeManager()
27 {
28 }
29
~AudioPipeManager()30 AudioPipeManager::~AudioPipeManager()
31 {
32 AUDIO_INFO_LOG("Dtor");
33 curPipeList_.clear();
34 }
35
AddAudioPipeInfo(std::shared_ptr<AudioPipeInfo> info)36 void AudioPipeManager::AddAudioPipeInfo(std::shared_ptr<AudioPipeInfo> info)
37 {
38 std::unique_lock<std::shared_mutex> pLock(pipeListLock_);
39 auto streamInfo = info->audioStreamInfo_;
40 AUDIO_INFO_LOG("Add id:%{public}u, name %{public}s, format %{public}d, rate %{public}d, channel %{public}d",
41 info->id_, info->name_.c_str(), streamInfo.format, streamInfo.samplingRate, streamInfo.channels);
42
43 // Action is only used in pipe execution, while pipeManager can only store default action
44 info->pipeAction_ = PIPE_ACTION_DEFAULT;
45 curPipeList_.push_back(info);
46 }
47
RemoveAudioPipeInfo(std::shared_ptr<AudioPipeInfo> info)48 void AudioPipeManager::RemoveAudioPipeInfo(std::shared_ptr<AudioPipeInfo> info)
49 {
50 std::unique_lock<std::shared_mutex> pLock(pipeListLock_);
51 for (auto iter = curPipeList_.begin(); iter != curPipeList_.end(); iter++) {
52 if (IsSamePipe(info, *iter)) {
53 AUDIO_INFO_LOG("Remove id:%{public}u, name %{public}s", info->id_, info->name_.c_str());
54 curPipeList_.erase(iter);
55 break;
56 }
57 }
58 }
59
RemoveAudioPipeInfo(AudioIOHandle id)60 void AudioPipeManager::RemoveAudioPipeInfo(AudioIOHandle id)
61 {
62 std::unique_lock<std::shared_mutex> pLock(pipeListLock_);
63 for (auto iter = curPipeList_.begin(); iter != curPipeList_.end(); iter++) {
64 if ((*iter)->id_ == id) {
65 AUDIO_INFO_LOG("Remove id:%{public}u, name: %{public}s", id, (*iter)->name_.c_str());
66 curPipeList_.erase(iter);
67 break;
68 }
69 }
70 }
71
UpdateAudioPipeInfo(std::shared_ptr<AudioPipeInfo> newPipe)72 void AudioPipeManager::UpdateAudioPipeInfo(std::shared_ptr<AudioPipeInfo> newPipe)
73 {
74 std::unique_lock<std::shared_mutex> pLock(pipeListLock_);
75 for (auto iter = curPipeList_.begin(); iter != curPipeList_.end(); iter++) {
76 if (IsSamePipe(newPipe, *iter)) {
77 AUDIO_INFO_LOG("Update id:%{public}u, name %{public}s", (*iter)->id_, (*iter)->name_.c_str());
78 Assign(*iter, newPipe);
79 // Action is only used in pipe execution, while pipeManager can only store default action
80 (*iter)->pipeAction_ = PIPE_ACTION_DEFAULT;
81 break;
82 }
83 }
84 }
85
IsSamePipe(std::shared_ptr<AudioPipeInfo> info,std::shared_ptr<AudioPipeInfo> cmpInfo)86 bool AudioPipeManager::IsSamePipe(std::shared_ptr<AudioPipeInfo> info, std::shared_ptr<AudioPipeInfo> cmpInfo)
87 {
88 if ((info->adapterName_ == cmpInfo->adapterName_ && info->routeFlag_ == cmpInfo->routeFlag_) ||
89 info->id_ == cmpInfo->id_) {
90 return true;
91 }
92 return false;
93 }
94
Assign(std::shared_ptr<AudioPipeInfo> dst,std::shared_ptr<AudioPipeInfo> src)95 void AudioPipeManager::Assign(std::shared_ptr<AudioPipeInfo> dst, std::shared_ptr<AudioPipeInfo> src)
96 {
97 dst = src;
98 }
99
StartClient(uint32_t sessionId)100 void AudioPipeManager::StartClient(uint32_t sessionId)
101 {
102 std::unique_lock<std::shared_mutex> pLock(pipeListLock_);
103 std::shared_ptr<AudioStreamDescriptor> streamDesc = GetStreamDescByIdInner(sessionId);
104 CHECK_AND_RETURN_LOG(streamDesc != nullptr, "StreamDesc is nullptr");
105 streamDesc->streamStatus_ = STREAM_STATUS_STARTED;
106 }
107
PauseClient(uint32_t sessionId)108 void AudioPipeManager::PauseClient(uint32_t sessionId)
109 {
110 std::unique_lock<std::shared_mutex> pLock(pipeListLock_);
111 std::shared_ptr<AudioStreamDescriptor> streamDesc = GetStreamDescByIdInner(sessionId);
112 CHECK_AND_RETURN_LOG(streamDesc != nullptr, "StreamDesc is nullptr");
113 streamDesc->streamStatus_ = STREAM_STATUS_PAUSED;
114 }
115
StopClient(uint32_t sessionId)116 void AudioPipeManager::StopClient(uint32_t sessionId)
117 {
118 std::unique_lock<std::shared_mutex> pLock(pipeListLock_);
119 std::shared_ptr<AudioStreamDescriptor> streamDesc = GetStreamDescByIdInner(sessionId);
120 CHECK_AND_RETURN_LOG(streamDesc != nullptr, "StreamDesc is nullptr");
121 streamDesc->streamStatus_ = STREAM_STATUS_STOPPED;
122 }
123
RemoveClient(uint32_t sessionId)124 void AudioPipeManager::RemoveClient(uint32_t sessionId)
125 {
126 std::unique_lock<std::shared_mutex> pLock(pipeListLock_);
127 AUDIO_INFO_LOG("Cur pipe list size %{public}zu, sessionId %{public}u", curPipeList_.size(), sessionId);
128 for (auto pipeInfo : curPipeList_) {
129 pipeInfo->streamDescriptors_.erase(std::remove_if(pipeInfo->streamDescriptors_.begin(),
130 pipeInfo->streamDescriptors_.end(), [sessionId](std::shared_ptr<AudioStreamDescriptor> streamDesc) {
131 return streamDesc->sessionId_ == sessionId;
132 }), pipeInfo->streamDescriptors_.end());
133 }
134 }
135
GetPipeList()136 const std::vector<std::shared_ptr<AudioPipeInfo>> AudioPipeManager::GetPipeList()
137 {
138 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
139 return curPipeList_;
140 }
141
GetUnusedPipe()142 std::vector<std::shared_ptr<AudioPipeInfo>> AudioPipeManager::GetUnusedPipe()
143 {
144 std::unique_lock<std::shared_mutex> pLock(pipeListLock_);
145 std::vector<std::shared_ptr<AudioPipeInfo>> newList;
146 for (auto pipe : curPipeList_) {
147 if (pipe->streamDescriptors_.empty() && IsSpecialPipe(pipe->routeFlag_)) {
148 newList.push_back(pipe);
149 }
150 }
151 return newList;
152 }
153
GetUnusedRecordPipe()154 std::vector<std::shared_ptr<AudioPipeInfo>> AudioPipeManager::GetUnusedRecordPipe()
155 {
156 std::unique_lock<std::shared_mutex> pLock(pipeListLock_);
157 std::vector<std::shared_ptr<AudioPipeInfo>> unusedPipeList;
158 for (auto pipe : curPipeList_) {
159 CHECK_AND_CONTINUE_LOG(pipe != nullptr, "pipe is nullptr");
160 if (pipe->pipeRole_ == PIPE_ROLE_INPUT && pipe->streamDescriptors_.empty() && IsNormalRecordPipe(pipe)) {
161 if (pipe->softLinkFlag_) {
162 pipe->streamDescMap_.clear();
163 pipe->streamDescriptors_.clear();
164 continue;
165 }
166 unusedPipeList.push_back(pipe);
167 }
168 }
169 return unusedPipeList;
170 }
171
IsSpecialPipe(uint32_t routeFlag)172 bool AudioPipeManager::IsSpecialPipe(uint32_t routeFlag)
173 {
174 AUDIO_INFO_LOG("Flag %{public}d", routeFlag);
175 if ((routeFlag & AUDIO_OUTPUT_FLAG_FAST) ||
176 (routeFlag & AUDIO_INPUT_FLAG_FAST) ||
177 (routeFlag & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD)) {
178 return true;
179 }
180 return false;
181 }
182
IsNormalRecordPipe(std::shared_ptr<AudioPipeInfo> pipeInfo)183 bool AudioPipeManager::IsNormalRecordPipe(std::shared_ptr<AudioPipeInfo> pipeInfo)
184 {
185 CHECK_AND_RETURN_RET_LOG(pipeInfo != nullptr, false, "Pipe info is null");
186 if ((pipeInfo->adapterName_ == PRIMARY_CLASS && pipeInfo->routeFlag_ == AUDIO_INPUT_FLAG_NORMAL) ||
187 (pipeInfo->adapterName_ == USB_CLASS && pipeInfo->routeFlag_ == AUDIO_INPUT_FLAG_NORMAL)) {
188 return true;
189 }
190 return false;
191 }
192
GetPipeinfoByNameAndFlag(const std::string adapterName,const uint32_t routeFlag)193 std::shared_ptr<AudioPipeInfo> AudioPipeManager::GetPipeinfoByNameAndFlag(
194 const std::string adapterName, const uint32_t routeFlag)
195 {
196 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
197 for (auto it : curPipeList_) {
198 if (it->adapterName_ == adapterName && it->routeFlag_ == routeFlag) {
199 return it;
200 }
201 }
202 AUDIO_ERR_LOG("Can not find pipe %{public}s", adapterName.c_str());
203 return nullptr;
204 }
205
GetAdapterNameBySessionId(uint32_t sessionId)206 std::string AudioPipeManager::GetAdapterNameBySessionId(uint32_t sessionId)
207 {
208 AUDIO_INFO_LOG("Cur Pipe list size %{public}zu, sessionId %{public}u", curPipeList_.size(), sessionId);
209 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
210 for (auto &pipeInfo : curPipeList_) {
211 CHECK_AND_CONTINUE_LOG(pipeInfo != nullptr, "pipeInfo is nullptr");
212 for (auto &desc : pipeInfo->streamDescriptors_) {
213 CHECK_AND_CONTINUE_LOG(desc != nullptr && desc->newDeviceDescs_.size() > 0 &&
214 desc->newDeviceDescs_.front() != nullptr, "desc is nullptr");
215 if (desc->sessionId_ != sessionId) {
216 continue;
217 }
218 AUDIO_INFO_LOG("adapter name: %{public}s", pipeInfo->moduleInfo_.name.c_str());
219 return desc->newDeviceDescs_.front()->deviceType_ == DEVICE_TYPE_REMOTE_CAST ?
220 "RemoteCastInnerCapturer" : pipeInfo->moduleInfo_.name;
221 }
222 }
223 AUDIO_WARNING_LOG("cannot find sessionId: %{public}u", sessionId);
224 return "";
225 }
226
GetProcessDeviceInfoBySessionId(uint32_t sessionId,AudioStreamInfo & streamInfo)227 std::shared_ptr<AudioDeviceDescriptor> AudioPipeManager::GetProcessDeviceInfoBySessionId(
228 uint32_t sessionId, AudioStreamInfo &streamInfo)
229 {
230 AUDIO_INFO_LOG("Cur pipe list size %{public}zu, sessionId %{public}u", curPipeList_.size(), sessionId);
231 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
232 for (auto &pipeInfo : curPipeList_) {
233 CHECK_AND_CONTINUE_LOG(pipeInfo != nullptr, "pipeInfo is nullptr");
234 for (auto &desc : pipeInfo->streamDescriptors_) {
235 CHECK_AND_CONTINUE_LOG(desc != nullptr && desc->newDeviceDescs_.size() > 0 &&
236 desc->newDeviceDescs_.front() != nullptr, "desc is nullptr");
237 if (desc->sessionId_ == sessionId) {
238 AUDIO_INFO_LOG("Device type: %{public}d", desc->newDeviceDescs_.front()->deviceType_);
239 streamInfo = pipeInfo->audioStreamInfo_;
240 return desc->newDeviceDescs_.front();
241 }
242 }
243 }
244 AUDIO_ERR_LOG("Cannot find session: %{public}u", sessionId);
245 return nullptr;
246 }
247
GetAllOutputStreamDescs()248 std::vector<std::shared_ptr<AudioStreamDescriptor>> AudioPipeManager::GetAllOutputStreamDescs()
249 {
250 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
251 std::vector<std::shared_ptr<AudioStreamDescriptor>> streamDescs;
252 for (auto &it : curPipeList_) {
253 CHECK_AND_CONTINUE_LOG(it != nullptr, "pipeInfo is nullptr");
254 if (it->pipeRole_ == PIPE_ROLE_OUTPUT) {
255 streamDescs.insert(streamDescs.end(), it->streamDescriptors_.begin(), it->streamDescriptors_.end());
256 }
257 }
258 return streamDescs;
259 }
260
GetAllInputStreamDescs()261 std::vector<std::shared_ptr<AudioStreamDescriptor>> AudioPipeManager::GetAllInputStreamDescs()
262 {
263 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
264 std::vector<std::shared_ptr<AudioStreamDescriptor>> streamDescs;
265 for (auto &it : curPipeList_) {
266 CHECK_AND_CONTINUE_LOG(it != nullptr, "pipeInfo is nullptr");
267 if (it->pipeRole_ == PIPE_ROLE_INPUT) {
268 streamDescs.insert(streamDescs.end(), it->streamDescriptors_.begin(), it->streamDescriptors_.end());
269 }
270 }
271 return streamDescs;
272 }
273
GetStreamDescsByIoHandle(AudioIOHandle id)274 std::vector<std::shared_ptr<AudioStreamDescriptor>> AudioPipeManager::GetStreamDescsByIoHandle(AudioIOHandle id)
275 {
276 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
277 for (auto it : curPipeList_) {
278 if (it != nullptr && it->id_ == id) {
279 return it->streamDescriptors_;
280 }
281 }
282 std::vector<std::shared_ptr<AudioStreamDescriptor>> streamDescs = {};
283 return streamDescs;
284 }
285
GetStreamDescById(uint32_t sessionId)286 std::shared_ptr<AudioStreamDescriptor> AudioPipeManager::GetStreamDescById(uint32_t sessionId)
287 {
288 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
289 return GetStreamDescByIdInner(sessionId);
290 }
291
GetStreamDescByIdInner(uint32_t sessionId)292 std::shared_ptr<AudioStreamDescriptor> AudioPipeManager::GetStreamDescByIdInner(uint32_t sessionId)
293 {
294 AUDIO_INFO_LOG("Cur pipe list size %{public}zu, sessionId %{public}u", curPipeList_.size(), sessionId);
295 for (auto &pipeInfo : curPipeList_) {
296 CHECK_AND_CONTINUE_LOG(pipeInfo != nullptr, "pipeInfo is nullptr");
297 for (auto &desc : pipeInfo->streamDescriptors_) {
298 CHECK_AND_CONTINUE_LOG(desc != nullptr, "desc is nullptr");
299 if (desc->sessionId_ == sessionId) {
300 return desc;
301 }
302 }
303 }
304 return nullptr;
305 }
306
GetStreamCount(const std::string adapterName,const uint32_t routeFlag)307 int32_t AudioPipeManager::GetStreamCount(const std::string adapterName, const uint32_t routeFlag)
308 {
309 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
310 int32_t count = 0;
311 for (auto &it : curPipeList_) {
312 CHECK_AND_CONTINUE_LOG(it != nullptr, "pipeInfo is nullptr");
313 if (it->adapterName_ == adapterName && it->routeFlag_ == routeFlag) {
314 count = static_cast<int32_t>(it->streamDescriptors_.size());
315 }
316 }
317 return count;
318 }
319
GetPaIndexByIoHandle(AudioIOHandle id)320 uint32_t AudioPipeManager::GetPaIndexByIoHandle(AudioIOHandle id)
321 {
322 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
323 for (auto &it : curPipeList_) {
324 CHECK_AND_CONTINUE_LOG(it != nullptr, "pipeInfo is nullptr");
325 if (it->id_ == id) {
326 return it->paIndex_;
327 }
328 }
329 return HDI_INVALID_ID;
330 }
331
UpdateRendererPipeInfos(std::vector<std::shared_ptr<AudioPipeInfo>> & pipeInfos)332 void AudioPipeManager::UpdateRendererPipeInfos(std::vector<std::shared_ptr<AudioPipeInfo>> &pipeInfos)
333 {
334 std::unique_lock<std::shared_mutex> pLock(pipeListLock_);
335 std::vector<std::shared_ptr<AudioPipeInfo>> tempList;
336 for (auto &pipeInfo : curPipeList_) {
337 CHECK_AND_CONTINUE_LOG(pipeInfo != nullptr, "pipeInfo is nullptr");
338 if (pipeInfo->pipeRole_ == PIPE_ROLE_INPUT) {
339 tempList.push_back(pipeInfo);
340 }
341 }
342 // pipeAction_ should only be used when operating the pipe, while pipeManager only stores the default state
343 for (auto &pipe : pipeInfos) {
344 CHECK_AND_CONTINUE_LOG(pipe != nullptr, "pipe is nullptr");
345 pipe->pipeAction_ = PIPE_ACTION_DEFAULT;
346 tempList.push_back(pipe);
347 }
348 curPipeList_.clear();
349 curPipeList_ = tempList;
350 }
351
UpdateCapturerPipeInfos(std::vector<std::shared_ptr<AudioPipeInfo>> & pipeInfos)352 void AudioPipeManager::UpdateCapturerPipeInfos(std::vector<std::shared_ptr<AudioPipeInfo>> &pipeInfos)
353 {
354 std::unique_lock<std::shared_mutex> pLock(pipeListLock_);
355 std::vector<std::shared_ptr<AudioPipeInfo>> tempList;
356 for (auto &pipeInfo : curPipeList_) {
357 CHECK_AND_CONTINUE_LOG(pipeInfo != nullptr, "pipeInfo is nullptr");
358 if (pipeInfo->pipeRole_ == PIPE_ROLE_OUTPUT) {
359 tempList.push_back(pipeInfo);
360 }
361 }
362 // pipeAction_ should only be used when operating the pipe, while pipeManager only stores the default state
363 for (auto &pipe : pipeInfos) {
364 CHECK_AND_CONTINUE_LOG(pipe != nullptr, "pipe is nullptr");
365 pipe->pipeAction_ = PIPE_ACTION_DEFAULT;
366 tempList.push_back(pipe);
367 }
368 curPipeList_.clear();
369 curPipeList_ = tempList;
370 }
371
PcmOffloadSessionCount()372 uint32_t AudioPipeManager::PcmOffloadSessionCount()
373 {
374 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
375 for (auto &pipeInfo : curPipeList_) {
376 CHECK_AND_CONTINUE_LOG(pipeInfo != nullptr, "pipeInfo is nullptr");
377 if (pipeInfo->routeFlag_ & AUDIO_OUTPUT_FLAG_LOWPOWER) {
378 return pipeInfo->streamDescriptors_.size();
379 }
380 }
381 return 0;
382 }
383
Dump(std::string & dumpString)384 void AudioPipeManager::Dump(std::string &dumpString)
385 {
386 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
387
388 dumpString += "Audio PipeManager Infos\n";
389 dumpString += " - TotalPipeNums: " + std::to_string(curPipeList_.size()) + "\n\n";
390
391 for (auto &pipe : curPipeList_) {
392 if (pipe != nullptr) {
393 pipe->Dump(dumpString);
394 }
395 }
396 }
397
IsModemCommunicationIdExist()398 bool AudioPipeManager::IsModemCommunicationIdExist()
399 {
400 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
401 return !modemCommunicationIdMap_.empty();
402 }
403
IsModemCommunicationIdExist(uint32_t sessionId)404 bool AudioPipeManager::IsModemCommunicationIdExist(uint32_t sessionId)
405 {
406 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
407 return modemCommunicationIdMap_.find(sessionId) != modemCommunicationIdMap_.end();
408 }
409
AddModemCommunicationId(uint32_t sessionId,std::shared_ptr<AudioStreamDescriptor> & streamDesc)410 void AudioPipeManager::AddModemCommunicationId(uint32_t sessionId, std::shared_ptr<AudioStreamDescriptor> &streamDesc)
411 {
412 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
413 if (sessionId < FIRST_SESSIONID || sessionId > MAX_VALID_SESSIONID) {
414 AUDIO_ERR_LOG("Invalid id %{public}u", sessionId);
415 }
416 modemCommunicationIdMap_[sessionId] = streamDesc;
417 }
418
RemoveModemCommunicationId(uint32_t sessionId)419 void AudioPipeManager::RemoveModemCommunicationId(uint32_t sessionId)
420 {
421 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
422 if (modemCommunicationIdMap_.find(sessionId) != modemCommunicationIdMap_.end()) {
423 modemCommunicationIdMap_.erase(sessionId);
424 AUDIO_INFO_LOG("RemoveModemCommunicationId %{public}u success", sessionId);
425 } else {
426 AUDIO_WARNING_LOG("RemoveModemCommunicationId fail, cannot find id %{public}u", sessionId);
427 }
428 }
429
GetModemCommunicationStreamDescById(uint32_t sessionId)430 std::shared_ptr<AudioStreamDescriptor> AudioPipeManager::GetModemCommunicationStreamDescById(uint32_t sessionId)
431 {
432 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
433 if (modemCommunicationIdMap_.find(sessionId) != modemCommunicationIdMap_.end()) {
434 AUDIO_INFO_LOG("Get %{public}u success", sessionId);
435 return modemCommunicationIdMap_[sessionId];
436 } else {
437 AUDIO_WARNING_LOG("Cannot find id %{public}u", sessionId);
438 return nullptr;
439 }
440 }
441
GetModemCommunicationMap()442 std::unordered_map<uint32_t, std::shared_ptr<AudioStreamDescriptor>> AudioPipeManager::GetModemCommunicationMap()
443 {
444 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
445 AUDIO_INFO_LOG("map size %{public}zu", modemCommunicationIdMap_.size());
446 return modemCommunicationIdMap_;
447 }
448
UpdateModemStreamStatus(AudioStreamStatus streamStatus)449 void AudioPipeManager::UpdateModemStreamStatus(AudioStreamStatus streamStatus)
450 {
451 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
452 for (auto &entry : modemCommunicationIdMap_) {
453 CHECK_AND_CONTINUE_LOG(entry.second != nullptr, "StreamDesc is nullptr");
454 entry.second->streamStatus_ = streamStatus;
455 }
456 }
457
UpdateModemStreamDevice(std::vector<std::shared_ptr<AudioDeviceDescriptor>> & deviceDescs)458 void AudioPipeManager::UpdateModemStreamDevice(std::vector<std::shared_ptr<AudioDeviceDescriptor>> &deviceDescs)
459 {
460 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
461 for (auto &entry : modemCommunicationIdMap_) {
462 CHECK_AND_CONTINUE_LOG(entry.second != nullptr, "StreamDesc is nullptr");
463 entry.second->oldDeviceDescs_ = entry.second->newDeviceDescs_;
464 entry.second->newDeviceDescs_ = deviceDescs;
465 }
466 }
467
IsModemStreamDeviceChanged(std::shared_ptr<AudioDeviceDescriptor> & deviceDescs)468 bool AudioPipeManager::IsModemStreamDeviceChanged(std::shared_ptr<AudioDeviceDescriptor> &deviceDescs)
469 {
470 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
471 CHECK_AND_RETURN_RET_LOG(modemCommunicationIdMap_.size() > 0 &&
472 modemCommunicationIdMap_.begin()->second != nullptr &&
473 modemCommunicationIdMap_.begin()->second->oldDeviceDescs_.size() > 0 &&
474 modemCommunicationIdMap_.begin()->second->oldDeviceDescs_.front() != nullptr,
475 false, "Invalid modemCommunicationMap, size: %{public}zu", modemCommunicationIdMap_.size());
476 return !modemCommunicationIdMap_.begin()->second->oldDeviceDescs_.front()->IsSameDeviceDescPtr(deviceDescs);
477 }
478
GetNormalSourceInfo(bool isEcFeatureEnable)479 std::shared_ptr<AudioPipeInfo> AudioPipeManager::GetNormalSourceInfo(bool isEcFeatureEnable)
480 {
481 std::shared_ptr<AudioPipeInfo> pipeInfo = GetPipeByModuleAndFlag(PRIMARY_MIC, AUDIO_INPUT_FLAG_NORMAL);
482 CHECK_AND_RETURN_RET(pipeInfo == nullptr, pipeInfo);
483 pipeInfo = GetPipeByModuleAndFlag(BLUETOOTH_MIC, AUDIO_INPUT_FLAG_NORMAL);
484 CHECK_AND_RETURN_RET(pipeInfo == nullptr, pipeInfo);
485 if (isEcFeatureEnable) {
486 pipeInfo = GetPipeByModuleAndFlag(BLUETOOTH_MIC, AUDIO_INPUT_FLAG_NORMAL);
487 }
488 return pipeInfo;
489 }
490
GetPipeByModuleAndFlag(const std::string moduleName,const uint32_t routeFlag)491 std::shared_ptr<AudioPipeInfo> AudioPipeManager::GetPipeByModuleAndFlag(const std::string moduleName,
492 const uint32_t routeFlag)
493 {
494 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
495 for (auto it : curPipeList_) {
496 if (it->moduleInfo_.name == moduleName && it->routeFlag_ == routeFlag) {
497 return it;
498 }
499 }
500 AUDIO_ERR_LOG("Can not find pipe %{public}s", moduleName.c_str());
501 return nullptr;
502 }
503
GetStreamIdsByUid(uint32_t uid,uint32_t routeFlagMask)504 std::vector<uint32_t> AudioPipeManager::GetStreamIdsByUid(uint32_t uid, uint32_t routeFlagMask)
505 {
506 std::vector<uint32_t> sessionIds = {};
507 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
508 for (auto &pipe : curPipeList_) {
509 CHECK_AND_CONTINUE_LOG(pipe != nullptr, "pipe is nullptr");
510 CHECK_AND_CONTINUE_LOG(pipe->routeFlag_ & routeFlagMask, "not match flag: %{public}u", pipe->routeFlag_);
511 for (auto &streamDesc : pipe->streamDescriptors_) {
512 CHECK_AND_CONTINUE_LOG(streamDesc != nullptr, "streamDesc is nullptr");
513 if (streamDesc->callerUid_ == static_cast<int32_t>(uid)) {
514 sessionIds.push_back(streamDesc->sessionId_);
515 }
516 }
517 }
518 AUDIO_INFO_LOG("Session number of uid %{public}u: %{public}zu", uid, sessionIds.size());
519 return sessionIds;
520 }
521
UpdateOutputStreamDescsByIoHandle(AudioIOHandle id,std::vector<std::shared_ptr<AudioStreamDescriptor>> & descs)522 void AudioPipeManager::UpdateOutputStreamDescsByIoHandle(AudioIOHandle id,
523 std::vector<std::shared_ptr<AudioStreamDescriptor>> &descs)
524 {
525 std::lock_guard<std::shared_mutex> lock(pipeListLock_);
526 for (auto &it : curPipeList_) {
527 if (it != nullptr && it->id_ == id) {
528 it->streamDescriptors_ = descs;
529 AUDIO_INFO_LOG("Update stream desc for %{public}u", id);
530 return;
531 }
532 }
533 AUDIO_WARNING_LOG("Cannot find ioHandle: %{public}u", id);
534 }
535
GetAllCapturerStreamDescs()536 std::vector<std::shared_ptr<AudioStreamDescriptor>> AudioPipeManager::GetAllCapturerStreamDescs()
537 {
538 std::shared_lock<std::shared_mutex> pLock(pipeListLock_);
539 std::vector<std::shared_ptr<AudioStreamDescriptor>> streamDescs;
540 for (auto &pipeInfo : curPipeList_) {
541 CHECK_AND_CONTINUE_LOG(pipeInfo != nullptr, "pipeInfo is nullptr");
542 if (pipeInfo->pipeRole_ != PIPE_ROLE_INPUT) {
543 continue;
544 }
545 for (auto &desc : pipeInfo->streamDescriptors_) {
546 CHECK_AND_CONTINUE_LOG(desc != nullptr, "desc is nullptr");
547 if (desc->audioMode_ == AUDIO_MODE_RECORD) {
548 streamDescs.push_back(desc);
549 }
550 }
551 }
552 return streamDescs;
553 }
554 } // namespace AudioStandard
555 } // namespace OHOS
556