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