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