1  /*
2   * Copyright (c) 2023 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 ST_AUDIO_DEVICE_MANAGER_H
16  #define ST_AUDIO_DEVICE_MANAGER_H
17  
18  #include <list>
19  #include <string>
20  #include <memory>
21  #include <vector>
22  #include <unordered_map>
23  #include "audio_info.h"
24  #include "audio_device_info.h"
25  #include "audio_system_manager.h"
26  
27  namespace OHOS {
28  namespace AudioStandard {
29  using namespace std;
30  
31  constexpr int32_t NEED_TO_FETCH = 1;
32  
33  typedef function<bool(const std::unique_ptr<AudioDeviceDescriptor> &desc)> IsPresentFunc;
34  std::string GetEncryptAddr(const std::string &addr);
35  class AudioDeviceManager {
36  public:
GetAudioDeviceManager()37      static AudioDeviceManager& GetAudioDeviceManager()
38      {
39          static AudioDeviceManager audioDeviceManager;
40          return audioDeviceManager;
41      }
42  
43      void AddNewDevice(const sptr<AudioDeviceDescriptor> &devDesc);
44      void RemoveNewDevice(const sptr<AudioDeviceDescriptor> &devDesc);
45      void OnXmlParsingCompleted(const unordered_map<AudioDevicePrivacyType, list<DevicePrivacyInfo>> &xmlData);
46      int32_t GetDeviceUsageFromType(const DeviceType devType) const;
47      void ParseDeviceXml();
48      void UpdateDevicesListInfo(const sptr<AudioDeviceDescriptor> &deviceDescriptor,
49          const DeviceInfoUpdateCommand updateCommand);
50  
51      vector<unique_ptr<AudioDeviceDescriptor>> GetRemoteRenderDevices();
52      vector<unique_ptr<AudioDeviceDescriptor>> GetRemoteCaptureDevices();
53      vector<unique_ptr<AudioDeviceDescriptor>> GetCommRenderPrivacyDevices();
54      vector<unique_ptr<AudioDeviceDescriptor>> GetCommRenderPublicDevices();
55      vector<unique_ptr<AudioDeviceDescriptor>> GetCommRenderBTCarDevices();
56      vector<unique_ptr<AudioDeviceDescriptor>> GetCommCapturePrivacyDevices();
57      vector<unique_ptr<AudioDeviceDescriptor>> GetCommCapturePublicDevices();
58      vector<unique_ptr<AudioDeviceDescriptor>> GetMediaRenderPrivacyDevices();
59      vector<unique_ptr<AudioDeviceDescriptor>> GetMediaRenderPublicDevices();
60      vector<unique_ptr<AudioDeviceDescriptor>> GetMediaCapturePrivacyDevices();
61      vector<unique_ptr<AudioDeviceDescriptor>> GetMediaCapturePublicDevices();
62      vector<unique_ptr<AudioDeviceDescriptor>> GetCapturePrivacyDevices();
63      vector<unique_ptr<AudioDeviceDescriptor>> GetCapturePublicDevices();
64      vector<unique_ptr<AudioDeviceDescriptor>> GetRecongnitionCapturePrivacyDevices();
65      unique_ptr<AudioDeviceDescriptor> GetCommRenderDefaultDevice(StreamUsage streamUsage);
66      unique_ptr<AudioDeviceDescriptor> GetRenderDefaultDevice();
67      unique_ptr<AudioDeviceDescriptor> GetCaptureDefaultDevice();
68      unordered_map<AudioDevicePrivacyType, list<DevicePrivacyInfo>> GetDevicePrivacyMaps();
69      vector<unique_ptr<AudioDeviceDescriptor>> GetAvailableDevicesByUsage(AudioDeviceUsage usage);
70      void GetAvailableDevicesWithUsage(const AudioDeviceUsage usage,
71          const list<DevicePrivacyInfo> &deviceInfos, const sptr<AudioDeviceDescriptor> &dev,
72          std::vector<unique_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors);
73      vector<unique_ptr<AudioDeviceDescriptor>> GetAvailableBluetoothDevice(DeviceType devType,
74          const std::string &macAddress);
75      bool GetScoState();
76      vector<shared_ptr<AudioDeviceDescriptor>> GetDevicesByFilter(DeviceType devType, DeviceRole devRole,
77          const string &macAddress, const string &networkId, ConnectState connectState);
78      void UpdateEarpieceStatus(const bool hasEarPiece);
79      DeviceUsage GetDeviceUsage(const AudioDeviceDescriptor &desc);
80      std::string GetConnDevicesStr();
81      std::string GetConnDevicesStr(const vector<shared_ptr<AudioDeviceDescriptor>> &descs);
82      bool IsArmUsbDevice(const AudioDeviceDescriptor &desc);
83      void OnReceiveBluetoothEvent(const std::string macAddress, const std::string deviceName);
84      bool IsDeviceConnected(sptr<AudioDeviceDescriptor> &audioDeviceDescriptors);
85      bool IsVirtualConnectedDevice(const sptr<AudioDeviceDescriptor> &selectedDesc);
86      int32_t UpdateDeviceDescDeviceId(sptr<AudioDeviceDescriptor> &deviceDescriptor);
87      int32_t SetDefaultOutputDevice(const DeviceType deviceType, const uint32_t sessionID,
88          const StreamUsage streamUsage, bool isRunning);
89      int32_t UpdateDefaultOutputDeviceWhenStarting(const uint32_t sessionID);
90      int32_t UpdateDefaultOutputDeviceWhenStopping(const uint32_t sessionID);
91      int32_t RemoveSelectedDefaultOutputDevice(const uint32_t sessionID);
92      unique_ptr<AudioDeviceDescriptor> GetSelectedMediaRenderDevice();
93      unique_ptr<AudioDeviceDescriptor> GetSelectedCallRenderDevice();
94      void SaveRemoteInfo(const std::string &networkId, DeviceType deviceType);
95  
96  private:
97      AudioDeviceManager();
~AudioDeviceManager()98      ~AudioDeviceManager() {};
99      bool DeviceAttrMatch(const shared_ptr<AudioDeviceDescriptor> &devDesc, AudioDevicePrivacyType &privacyType,
100          DeviceRole &devRole, DeviceUsage &devUsage);
101  
102      void FillArrayWhenDeviceAttrMatch(const shared_ptr<AudioDeviceDescriptor> &devDesc,
103          AudioDevicePrivacyType privacyType, DeviceRole devRole, DeviceUsage devUsage, string logName,
104          vector<shared_ptr<AudioDeviceDescriptor>> &descArray);
105  
106      void RemoveMatchDeviceInArray(const AudioDeviceDescriptor &devDesc, string logName,
107          vector<shared_ptr<AudioDeviceDescriptor>> &descArray);
108  
109      void MakePairedDeviceDescriptor(const shared_ptr<AudioDeviceDescriptor> &devDesc);
110      void MakePairedDeviceDescriptor(const shared_ptr<AudioDeviceDescriptor> &devDesc, DeviceRole devRole);
111      void MakePairedDefaultDeviceDescriptor(const shared_ptr<AudioDeviceDescriptor> &devDesc, DeviceRole devRole);
112      void MakePairedDefaultDeviceImpl(const shared_ptr<AudioDeviceDescriptor> &devDesc,
113          const shared_ptr<AudioDeviceDescriptor> &connectedDesc);
114      void UpdateConnectedDevices(const shared_ptr<AudioDeviceDescriptor> &devDesc, bool isConnected);
115      void AddConnectedDevices(const shared_ptr<AudioDeviceDescriptor> &devDesc);
116      void RemoveConnectedDevices(const shared_ptr<AudioDeviceDescriptor> &devDesc);
117      void AddRemoteRenderDev(const shared_ptr<AudioDeviceDescriptor> &devDesc);
118      void AddRemoteCaptureDev(const shared_ptr<AudioDeviceDescriptor> &devDesc);
119      void AddDefaultDevices(const sptr<AudioDeviceDescriptor> &devDesc);
120  
121      void UpdateDeviceInfo(shared_ptr<AudioDeviceDescriptor> &deviceDesc);
122      void AddCommunicationDevices(const shared_ptr<AudioDeviceDescriptor> &devDesc);
123      void AddMediaDevices(const shared_ptr<AudioDeviceDescriptor> &devDesc);
124      void AddCaptureDevices(const shared_ptr<AudioDeviceDescriptor> &devDesc);
125      void HandleScoWithDefaultCategory(const shared_ptr<AudioDeviceDescriptor> &devDesc);
126      bool IsExistedDevice(const sptr<AudioDeviceDescriptor> &device,
127          const vector<unique_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors);
128      void AddAvailableDevicesByUsage(const AudioDeviceUsage usage,
129          const DevicePrivacyInfo &deviceInfo, const sptr<AudioDeviceDescriptor> &dev,
130          std::vector<unique_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors);
131      void GetDefaultAvailableDevicesByUsage(AudioDeviceUsage usage,
132          vector<unique_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors);
133      bool UpdateExistDeviceDescriptor(const sptr<AudioDeviceDescriptor> &deviceDescriptor);
134      void GetRemoteAvailableDevicesByUsage(AudioDeviceUsage usage,
135          std::vector<std::unique_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors);
136      void ReorderAudioDevices(std::vector<std::unique_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors,
137          const std::string &remoteInfoNetworkId, DeviceType remoteInfoDeviceType);
138  
139      void AddBtToOtherList(const shared_ptr<AudioDeviceDescriptor> &devDesc);
140      void RemoveBtFromOtherList(const AudioDeviceDescriptor &devDesc);
141      void RemoveRemoteDevices(const AudioDeviceDescriptor &devDesc);
142      void RemoveCommunicationDevices(const AudioDeviceDescriptor &devDesc);
143      void RemoveMediaDevices(const AudioDeviceDescriptor &devDesc);
144      void RemoveCaptureDevices(const AudioDeviceDescriptor &devDesc);
145      bool UpdateConnectState(const shared_ptr<AudioDeviceDescriptor> &devDesc);
146      bool UpdateDeviceCategory(const sptr<AudioDeviceDescriptor> &deviceDescriptor);
147      bool UpdateEnableState(const shared_ptr<AudioDeviceDescriptor> &deviceDescriptor);
148      bool UpdateExceptionFlag(const shared_ptr<AudioDeviceDescriptor> &deviceDescriptor);
149  
150      void RemoveVirtualConnectedDevice(const shared_ptr<AudioDeviceDescriptor> &devDesc);
151  
152      list<DevicePrivacyInfo> privacyDeviceList_;
153      list<DevicePrivacyInfo> publicDeviceList_;
154  
155      vector<shared_ptr<AudioDeviceDescriptor>> remoteRenderDevices_;
156      vector<shared_ptr<AudioDeviceDescriptor>> remoteCaptureDevices_;
157      vector<shared_ptr<AudioDeviceDescriptor>> commRenderPrivacyDevices_;
158      vector<shared_ptr<AudioDeviceDescriptor>> commRenderPublicDevices_;
159      vector<shared_ptr<AudioDeviceDescriptor>> commCapturePrivacyDevices_;
160      vector<shared_ptr<AudioDeviceDescriptor>> commCapturePublicDevices_;
161      vector<shared_ptr<AudioDeviceDescriptor>> mediaRenderPrivacyDevices_;
162      vector<shared_ptr<AudioDeviceDescriptor>> mediaRenderPublicDevices_;
163      vector<shared_ptr<AudioDeviceDescriptor>> mediaCapturePrivacyDevices_;
164      vector<shared_ptr<AudioDeviceDescriptor>> mediaCapturePublicDevices_;
165      vector<shared_ptr<AudioDeviceDescriptor>> capturePrivacyDevices_;
166      vector<shared_ptr<AudioDeviceDescriptor>> capturePublicDevices_;
167      vector<shared_ptr<AudioDeviceDescriptor>> connectedDevices_;
168      vector<shared_ptr<AudioDeviceDescriptor>> reconCapturePrivacyDevices_;
169      unordered_map<AudioDevicePrivacyType, list<DevicePrivacyInfo>> devicePrivacyMaps_ = {};
170      sptr<AudioDeviceDescriptor> earpiece_ = nullptr;
171      sptr<AudioDeviceDescriptor> speaker_ = nullptr;
172      sptr<AudioDeviceDescriptor> defalutMic_ = nullptr;
173      bool hasEarpiece_ = false;
174      unordered_map<uint32_t, std::pair<DeviceType, StreamUsage>> selectedDefaultOutputDeviceInfo_;
175      vector<std::pair<uint32_t, DeviceType>> mediaDefaultOutputDevices_;
176      vector<std::pair<uint32_t, DeviceType>> callDefaultOutputDevices_;
177      DeviceType selectedMediaDefaultOutputDevice_ = DEVICE_TYPE_DEFAULT;
178      DeviceType selectedCallDefaultOutputDevice_ = DEVICE_TYPE_DEFAULT;
179      std::mutex selectDefaultOutputDeviceMutex_;
180      std::mutex currentActiveDevicesMutex_;
181      std::string remoteInfoNetworkId_ = "";
182      DeviceType remoteInfoDeviceType_ = DEVICE_TYPE_DEFAULT;
183  };
184  } // namespace AudioStandard
185  } // namespace OHOS
186  #endif //ST_AUDIO_DEVICE_MANAGER_H
187