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 AUDIO_PIPE_MANAGER_H 16 #define AUDIO_PIPE_MANAGER_H 17 18 #include <string> 19 #include <mutex> 20 #include <shared_mutex> 21 #include <set> 22 23 #include "audio_stream_descriptor.h" 24 #include "audio_module_info.h" 25 #include "audio_pipe_info.h" 26 27 namespace OHOS { 28 namespace AudioStandard { 29 class AudioPipeManager { 30 public: 31 AudioPipeManager(); 32 ~AudioPipeManager(); 33 GetPipeManager()34 static std::shared_ptr<AudioPipeManager> GetPipeManager() 35 { 36 static std::shared_ptr<AudioPipeManager> instance = std::make_shared<AudioPipeManager>(); 37 return instance; 38 } 39 40 void AddAudioPipeInfo(std::shared_ptr<AudioPipeInfo> info); 41 void RemoveAudioPipeInfo(std::shared_ptr<AudioPipeInfo> info); 42 void RemoveAudioPipeInfo(AudioIOHandle id); 43 void UpdateAudioPipeInfo(std::shared_ptr<AudioPipeInfo> newPipe); 44 void Assign(std::shared_ptr<AudioPipeInfo> dst, std::shared_ptr<AudioPipeInfo> src); 45 bool IsSamePipe(std::shared_ptr<AudioPipeInfo> info, std::shared_ptr<AudioPipeInfo> cmpInfo); 46 47 const std::vector<std::shared_ptr<AudioPipeInfo>> GetPipeList(); 48 std::vector<std::shared_ptr<AudioPipeInfo>> GetUnusedPipe(); 49 std::vector<std::shared_ptr<AudioPipeInfo>> GetUnusedRecordPipe(); 50 std::shared_ptr<AudioPipeInfo> GetPipeinfoByNameAndFlag(const std::string adapterName, const uint32_t routeFlag); 51 std::string GetAdapterNameBySessionId(uint32_t sessionId); 52 std::shared_ptr<AudioDeviceDescriptor> GetProcessDeviceInfoBySessionId(uint32_t sessionId, 53 AudioStreamInfo &streamInfo); 54 55 void StartClient(uint32_t sessionId); 56 void PauseClient(uint32_t sessionId); 57 void StopClient(uint32_t sessionId); 58 void RemoveClient(uint32_t sessionId); 59 60 std::vector<std::shared_ptr<AudioStreamDescriptor>> GetAllOutputStreamDescs(); 61 std::vector<std::shared_ptr<AudioStreamDescriptor>> GetAllInputStreamDescs(); 62 std::vector<std::shared_ptr<AudioStreamDescriptor>> GetStreamDescsByIoHandle(AudioIOHandle id); 63 std::shared_ptr<AudioStreamDescriptor> GetStreamDescById(uint32_t sessionId); 64 std::shared_ptr<AudioStreamDescriptor> GetStreamDescByIdInner(uint32_t sessionId); 65 int32_t GetStreamCount(const std::string adapterName, const uint32_t routeFlag); 66 uint32_t GetPaIndexByIoHandle(AudioIOHandle id); 67 void UpdateRendererPipeInfos(std::vector<std::shared_ptr<AudioPipeInfo>> &pipeInfos); 68 void UpdateCapturerPipeInfos(std::vector<std::shared_ptr<AudioPipeInfo>> &pipeInfos); 69 uint32_t PcmOffloadSessionCount(); 70 71 void Dump(std::string &dumpString); 72 bool IsModemCommunicationIdExist(); 73 bool IsModemCommunicationIdExist(uint32_t sessionId); 74 void AddModemCommunicationId(uint32_t sessionId, std::shared_ptr<AudioStreamDescriptor> &streamDesc); 75 void RemoveModemCommunicationId(uint32_t sessionId); 76 std::shared_ptr<AudioStreamDescriptor> GetModemCommunicationStreamDescById(uint32_t sessionId); 77 std::unordered_map<uint32_t, std::shared_ptr<AudioStreamDescriptor>> GetModemCommunicationMap(); 78 void UpdateModemStreamStatus(AudioStreamStatus streamStatus); 79 void UpdateModemStreamDevice(std::vector<std::shared_ptr<AudioDeviceDescriptor>> &deviceDescs); 80 bool IsModemStreamDeviceChanged(std::shared_ptr<AudioDeviceDescriptor> &deviceDescs); 81 std::shared_ptr<AudioPipeInfo> GetNormalSourceInfo(bool isEcFeatureEnable); 82 std::vector<uint32_t> GetStreamIdsByUid(uint32_t uid, uint32_t routeFlagMask = UINT32_MAX); 83 void UpdateOutputStreamDescsByIoHandle(AudioIOHandle id, 84 std::vector<std::shared_ptr<AudioStreamDescriptor>> &descs); 85 std::vector<std::shared_ptr<AudioStreamDescriptor>> GetAllCapturerStreamDescs(); 86 87 private: 88 bool IsSpecialPipe(uint32_t routeFlag); 89 bool IsNormalRecordPipe(std::shared_ptr<AudioPipeInfo> pipeInfo); 90 std::shared_ptr<AudioPipeInfo> GetPipeByModuleAndFlag(const std::string moduleName, const uint32_t routeFlag); 91 92 std::unordered_map<uint32_t, std::shared_ptr<AudioStreamDescriptor>> modemCommunicationIdMap_{}; 93 std::vector<std::shared_ptr<AudioPipeInfo>> curPipeList_{}; 94 std::shared_mutex pipeListLock_; 95 }; 96 } // namespace AudioStandard 97 } // namespace OHOS 98 #endif // AUDIO_PIPE_MANAGER_H 99