• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 LOG_TAG
16 #define LOG_TAG "AudioDeviceManager"
17 #endif
18 
19 #include "audio_device_manager.h"
20 
21 #include "audio_utils.h"
22 #include "audio_errors.h"
23 #include "audio_device_parser.h"
24 
25 namespace OHOS {
26 namespace AudioStandard {
27 using namespace std;
28 constexpr int32_t MS_PER_S = 1000;
29 constexpr int32_t NS_PER_MS = 1000000;
30 const int32_t ADDRESS_STR_LEN = 17;
31 const int32_t START_POS = 6;
32 const int32_t END_POS = 13;
33 
34 // LCOV_EXCL_START
GetEncryptAddr(const std::string & addr)35 std::string GetEncryptAddr(const std::string &addr)
36 {
37     if (addr.empty() || addr.length() != ADDRESS_STR_LEN) {
38         return std::string("");
39     }
40     std::string tmp = "**:**:**:**:**:**";
41     std::string out = addr;
42     for (int i = START_POS; i <= END_POS; i++) {
43         out[i] = tmp[i];
44     }
45     return out;
46 }
47 
AudioDeviceManager()48 AudioDeviceManager::AudioDeviceManager()
49 {
50 }
51 
GetCurrentTimeMS()52 static int64_t GetCurrentTimeMS()
53 {
54     timespec tm {};
55     clock_gettime(CLOCK_MONOTONIC, &tm);
56     return tm.tv_sec * MS_PER_S + (tm.tv_nsec / NS_PER_MS);
57 }
58 
ParseDeviceXml()59 void AudioDeviceManager::ParseDeviceXml()
60 {
61     unique_ptr<AudioDeviceParser> audioDeviceParser = make_unique<AudioDeviceParser>(this);
62     if (audioDeviceParser->LoadConfiguration()) {
63         AUDIO_INFO_LOG("Audio device manager load configuration successfully.");
64         audioDeviceParser->Parse();
65     }
66 }
67 
OnXmlParsingCompleted(const unordered_map<AudioDevicePrivacyType,list<DevicePrivacyInfo>> & xmlData)68 void AudioDeviceManager::OnXmlParsingCompleted(
69     const unordered_map<AudioDevicePrivacyType, list<DevicePrivacyInfo>> &xmlData)
70 {
71     CHECK_AND_RETURN_LOG(!xmlData.empty(), "Failed to parse xml file.");
72 
73     devicePrivacyMaps_ = xmlData;
74 
75     auto privacyDevices = devicePrivacyMaps_.find(AudioDevicePrivacyType::TYPE_PRIVACY);
76     if (privacyDevices != devicePrivacyMaps_.end()) {
77         privacyDeviceList_ = privacyDevices->second;
78     }
79 
80     auto publicDevices = devicePrivacyMaps_.find(AudioDevicePrivacyType::TYPE_PUBLIC);
81     if (publicDevices != devicePrivacyMaps_.end()) {
82         publicDeviceList_ = publicDevices->second;
83     }
84 }
85 
DeviceAttrMatch(const shared_ptr<AudioDeviceDescriptor> & devDesc,AudioDevicePrivacyType & privacyType,DeviceRole & devRole,DeviceUsage & devUsage)86 bool AudioDeviceManager::DeviceAttrMatch(const shared_ptr<AudioDeviceDescriptor> &devDesc,
87     AudioDevicePrivacyType &privacyType, DeviceRole &devRole, DeviceUsage &devUsage)
88 {
89     list<DevicePrivacyInfo> deviceList;
90     if (privacyType == TYPE_PRIVACY) {
91         deviceList = privacyDeviceList_;
92     } else if (privacyType == TYPE_PUBLIC) {
93         deviceList = publicDeviceList_;
94     } else {
95         return false;
96     }
97 
98     if (devDesc->connectState_ == VIRTUAL_CONNECTED) {
99         return false;
100     }
101 
102     for (auto &devInfo : deviceList) {
103         if ((devInfo.deviceType == devDesc->deviceType_) &&
104             (devRole == devDesc->deviceRole_) &&
105             ((devInfo.deviceUsage & devUsage) != 0) &&
106             ((devInfo.deviceCategory == devDesc->deviceCategory_) ||
107             ((devInfo.deviceCategory & devDesc->deviceCategory_) != 0))) {
108             return true;
109         }
110     }
111 
112     return false;
113 }
114 
FillArrayWhenDeviceAttrMatch(const shared_ptr<AudioDeviceDescriptor> & devDesc,AudioDevicePrivacyType privacyType,DeviceRole devRole,DeviceUsage devUsage,string logName,vector<shared_ptr<AudioDeviceDescriptor>> & descArray)115 void AudioDeviceManager::FillArrayWhenDeviceAttrMatch(const shared_ptr<AudioDeviceDescriptor> &devDesc,
116     AudioDevicePrivacyType privacyType, DeviceRole devRole, DeviceUsage devUsage, string logName,
117     vector<shared_ptr<AudioDeviceDescriptor>> &descArray)
118 {
119     bool result = DeviceAttrMatch(devDesc, privacyType, devRole, devUsage);
120     if (result) {
121         descArray.push_back(devDesc);
122         AUDIO_WARNING_LOG("Add to %{public}s list, and then %{public}s",
123             logName.c_str(), GetConnDevicesStr(descArray).c_str());
124     }
125 }
126 
AddRemoteRenderDev(const shared_ptr<AudioDeviceDescriptor> & devDesc)127 void AudioDeviceManager::AddRemoteRenderDev(const shared_ptr<AudioDeviceDescriptor> &devDesc)
128 {
129     if ((devDesc->networkId_ != LOCAL_NETWORK_ID || devDesc->deviceType_ == DEVICE_TYPE_REMOTE_CAST) &&
130         devDesc->deviceRole_ == DeviceRole::OUTPUT_DEVICE) {
131         remoteRenderDevices_.push_back(devDesc);
132     }
133 }
134 
AddRemoteCaptureDev(const shared_ptr<AudioDeviceDescriptor> & devDesc)135 void AudioDeviceManager::AddRemoteCaptureDev(const shared_ptr<AudioDeviceDescriptor> &devDesc)
136 {
137     if (devDesc->networkId_ != LOCAL_NETWORK_ID && devDesc->deviceRole_ == DeviceRole::INPUT_DEVICE) {
138         remoteCaptureDevices_.push_back(devDesc);
139     }
140 }
141 
MakePairedDeviceDescriptor(const shared_ptr<AudioDeviceDescriptor> & devDesc,DeviceRole devRole)142 void AudioDeviceManager::MakePairedDeviceDescriptor(const shared_ptr<AudioDeviceDescriptor> &devDesc,
143     DeviceRole devRole)
144 {
145     auto isPresent = [&devDesc, &devRole] (const shared_ptr<AudioDeviceDescriptor> &desc) {
146         if (desc->networkId_ != devDesc->networkId_ || desc->deviceRole_ != devRole) {
147             return false;
148         }
149         if (devDesc->macAddress_ != "" && devDesc->macAddress_ == desc->macAddress_) {
150             return true;
151         } else {
152             return (desc->deviceType_ == devDesc->deviceType_);
153         }
154     };
155 
156     auto it = find_if(connectedDevices_.begin(), connectedDevices_.end(), isPresent);
157     if (it != connectedDevices_.end()) {
158         devDesc->pairDeviceDescriptor_ = *it;
159         (*it)->pairDeviceDescriptor_ = devDesc;
160     }
161 
162     MakePairedDefaultDeviceDescriptor(devDesc, devRole);
163 }
164 
MakePairedDeviceDescriptor(const shared_ptr<AudioDeviceDescriptor> & devDesc)165 void AudioDeviceManager::MakePairedDeviceDescriptor(const shared_ptr<AudioDeviceDescriptor> &devDesc)
166 {
167     if (devDesc->deviceRole_ == INPUT_DEVICE) {
168         MakePairedDeviceDescriptor(devDesc, OUTPUT_DEVICE);
169     } else if (devDesc->deviceRole_ == OUTPUT_DEVICE) {
170         MakePairedDeviceDescriptor(devDesc, INPUT_DEVICE);
171     }
172 }
173 
MakePairedDefaultDeviceDescriptor(const shared_ptr<AudioDeviceDescriptor> & devDesc,DeviceRole devRole)174 void AudioDeviceManager::MakePairedDefaultDeviceDescriptor(const shared_ptr<AudioDeviceDescriptor> &devDesc,
175     DeviceRole devRole)
176 {
177     // EARPIECE -> MIC ; SPEAKER -> MIC ; MIC -> SPEAKER
178     auto isPresent = [&devDesc, &devRole] (const shared_ptr<AudioDeviceDescriptor> &desc) {
179         if ((devDesc->deviceType_ == DEVICE_TYPE_EARPIECE || devDesc->deviceType_ == DEVICE_TYPE_SPEAKER) &&
180             devRole == INPUT_DEVICE && desc->deviceType_ == DEVICE_TYPE_MIC &&
181             desc->networkId_ == devDesc->networkId_) {
182             return true;
183         } else if (devDesc->deviceType_ == DEVICE_TYPE_MIC && devRole == OUTPUT_DEVICE &&
184             desc->deviceType_ == DEVICE_TYPE_SPEAKER && desc->networkId_ == devDesc->networkId_) {
185             return true;
186         }
187         return false;
188     };
189 
190     auto it = find_if(connectedDevices_.begin(), connectedDevices_.end(), isPresent);
191     if (it != connectedDevices_.end()) {
192         MakePairedDefaultDeviceImpl(devDesc, *it);
193     }
194 }
195 
MakePairedDefaultDeviceImpl(const shared_ptr<AudioDeviceDescriptor> & devDesc,const shared_ptr<AudioDeviceDescriptor> & connectedDesc)196 void AudioDeviceManager::MakePairedDefaultDeviceImpl(const shared_ptr<AudioDeviceDescriptor> &devDesc,
197     const shared_ptr<AudioDeviceDescriptor> &connectedDesc)
198 {
199     devDesc->pairDeviceDescriptor_ = connectedDesc;
200     if (devDesc->deviceType_ == DEVICE_TYPE_EARPIECE && earpiece_ != NULL &&
201         earpiece_->networkId_ == connectedDesc->networkId_) {
202         earpiece_->pairDeviceDescriptor_ = connectedDesc;
203     } else if (devDesc->deviceType_ == DEVICE_TYPE_SPEAKER && speaker_ != NULL && defalutMic_ != NULL) {
204         if (speaker_->networkId_ == connectedDesc->networkId_) {
205             speaker_->pairDeviceDescriptor_ = connectedDesc;
206         }
207         if (defalutMic_->networkId_ == devDesc->networkId_) {
208             defalutMic_->pairDeviceDescriptor_ = devDesc;
209         }
210         connectedDesc->pairDeviceDescriptor_ = devDesc;
211     } else if (devDesc->deviceType_ == DEVICE_TYPE_MIC && defalutMic_ != NULL && speaker_ != NULL) {
212         if (defalutMic_->networkId_ == connectedDesc->networkId_) {
213             defalutMic_->pairDeviceDescriptor_ = connectedDesc;
214         }
215         if (speaker_->networkId_ == devDesc->networkId_) {
216             speaker_->pairDeviceDescriptor_ = devDesc;
217         }
218         connectedDesc->pairDeviceDescriptor_ = devDesc;
219     }
220 }
221 
IsArmUsbDevice(const AudioDeviceDescriptor & desc)222 bool AudioDeviceManager::IsArmUsbDevice(const AudioDeviceDescriptor &desc)
223 {
224     auto isPresent = [&desc] (const auto &connDesc) {
225         return connDesc->deviceId_ == desc.deviceId_;
226     };
227     std::lock_guard<std::mutex> currentActiveDevicesLock(currentActiveDevicesMutex_);
228     auto itr = std::find_if(connectedDevices_.begin(), connectedDevices_.end(), isPresent);
229     if (itr == connectedDevices_.end()) {
230         return false;
231     }
232 
233     return (*itr)->deviceType_ == DEVICE_TYPE_USB_ARM_HEADSET;
234 }
235 
AddConnectedDevices(const shared_ptr<AudioDeviceDescriptor> & devDesc)236 void AudioDeviceManager::AddConnectedDevices(const shared_ptr<AudioDeviceDescriptor> &devDesc)
237 {
238     connectedDevices_.insert(connectedDevices_.begin(), devDesc);
239     AUDIO_INFO_LOG("Connected list %{public}s", GetConnDevicesStr(connectedDevices_).c_str());
240 }
241 
RemoveConnectedDevices(const shared_ptr<AudioDeviceDescriptor> & devDesc)242 void AudioDeviceManager::RemoveConnectedDevices(const shared_ptr<AudioDeviceDescriptor> &devDesc)
243 {
244     auto isPresent = [&devDesc](const shared_ptr<AudioDeviceDescriptor> &descriptor) {
245         if (descriptor->deviceType_ == devDesc->deviceType_ &&
246             descriptor->networkId_ == devDesc->networkId_) {
247             if (descriptor->deviceType_ != DEVICE_TYPE_BLUETOOTH_A2DP &&
248                 descriptor->deviceType_ != DEVICE_TYPE_BLUETOOTH_SCO) {
249                 return true;
250             } else {
251                 // if the disconnecting device is A2DP, need to compare mac address in addition.
252                 return descriptor->macAddress_ == devDesc->macAddress_;
253             }
254         }
255         return false;
256     };
257 
258     for (auto it = connectedDevices_.begin(); it != connectedDevices_.end();) {
259         it = find_if(it, connectedDevices_.end(), isPresent);
260         if (it != connectedDevices_.end()) {
261             if ((*it)->pairDeviceDescriptor_ != nullptr) {
262                 (*it)->pairDeviceDescriptor_->pairDeviceDescriptor_ = nullptr;
263             }
264             it = connectedDevices_.erase(it);
265         }
266     }
267     AUDIO_INFO_LOG("Connected list %{public}s", GetConnDevicesStr(connectedDevices_).c_str());
268 }
269 
AddDefaultDevices(const sptr<AudioDeviceDescriptor> & devDesc)270 void AudioDeviceManager::AddDefaultDevices(const sptr<AudioDeviceDescriptor> &devDesc)
271 {
272     DeviceType devType = devDesc->deviceType_;
273     if (devType == DEVICE_TYPE_EARPIECE) {
274         earpiece_ = devDesc;
275     } else if (devType == DEVICE_TYPE_SPEAKER) {
276         speaker_ = devDesc;
277     } else if (devType == DEVICE_TYPE_MIC) {
278         defalutMic_ = devDesc;
279     }
280 }
281 
UpdateDeviceInfo(shared_ptr<AudioDeviceDescriptor> & deviceDesc)282 void AudioDeviceManager::UpdateDeviceInfo(shared_ptr<AudioDeviceDescriptor> &deviceDesc)
283 {
284     if (deviceDesc->connectTimeStamp_ == 0) {
285         deviceDesc->connectTimeStamp_ = GetCurrentTimeMS();
286     }
287     MakePairedDeviceDescriptor(deviceDesc);
288 }
289 
AddCommunicationDevices(const shared_ptr<AudioDeviceDescriptor> & devDesc)290 void AudioDeviceManager::AddCommunicationDevices(const shared_ptr<AudioDeviceDescriptor> &devDesc)
291 {
292     FillArrayWhenDeviceAttrMatch(devDesc, TYPE_PRIVACY, OUTPUT_DEVICE, VOICE, "communication render privacy device",
293         commRenderPrivacyDevices_);
294     FillArrayWhenDeviceAttrMatch(devDesc, TYPE_PUBLIC, OUTPUT_DEVICE, VOICE, "communication render public device",
295         commRenderPublicDevices_);
296     FillArrayWhenDeviceAttrMatch(devDesc, TYPE_PRIVACY, INPUT_DEVICE, VOICE, "communication capture privacy device",
297         commCapturePrivacyDevices_);
298     FillArrayWhenDeviceAttrMatch(devDesc, TYPE_PUBLIC, INPUT_DEVICE, VOICE, "communication capture public device",
299         commCapturePublicDevices_);
300 }
301 
AddMediaDevices(const shared_ptr<AudioDeviceDescriptor> & devDesc)302 void AudioDeviceManager::AddMediaDevices(const shared_ptr<AudioDeviceDescriptor> &devDesc)
303 {
304     FillArrayWhenDeviceAttrMatch(devDesc, TYPE_PRIVACY, OUTPUT_DEVICE, MEDIA, "media render privacy device",
305         mediaRenderPrivacyDevices_);
306     FillArrayWhenDeviceAttrMatch(devDesc, TYPE_PUBLIC, OUTPUT_DEVICE, MEDIA, "media render public device",
307         mediaRenderPublicDevices_);
308     FillArrayWhenDeviceAttrMatch(devDesc, TYPE_PRIVACY, INPUT_DEVICE, MEDIA, "media capture privacy device",
309         mediaCapturePrivacyDevices_);
310     FillArrayWhenDeviceAttrMatch(devDesc, TYPE_PUBLIC, INPUT_DEVICE, MEDIA, "media capture public device",
311         mediaCapturePublicDevices_);
312 }
313 
AddCaptureDevices(const shared_ptr<AudioDeviceDescriptor> & devDesc)314 void AudioDeviceManager::AddCaptureDevices(const shared_ptr<AudioDeviceDescriptor> &devDesc)
315 {
316     FillArrayWhenDeviceAttrMatch(devDesc, TYPE_PRIVACY, INPUT_DEVICE, ALL_USAGE, "capture privacy device",
317         capturePrivacyDevices_);
318     FillArrayWhenDeviceAttrMatch(devDesc, TYPE_PUBLIC, INPUT_DEVICE, ALL_USAGE, "capture public device",
319         capturePublicDevices_);
320     FillArrayWhenDeviceAttrMatch(devDesc, TYPE_PRIVACY, INPUT_DEVICE, RECONGNITION, "capture recon privacy device",
321         reconCapturePrivacyDevices_);
322 }
323 
HandleScoWithDefaultCategory(const shared_ptr<AudioDeviceDescriptor> & devDesc)324 void AudioDeviceManager::HandleScoWithDefaultCategory(const shared_ptr<AudioDeviceDescriptor> &devDesc)
325 {
326     if (devDesc->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO && devDesc->deviceCategory_ == CATEGORY_DEFAULT &&
327         devDesc->isEnable_) {
328         if (devDesc->deviceRole_ == INPUT_DEVICE) {
329             commCapturePrivacyDevices_.push_back(devDesc);
330         } else if (devDesc->deviceRole_ == OUTPUT_DEVICE) {
331             commRenderPrivacyDevices_.push_back(devDesc);
332         }
333     }
334 }
335 
UpdateExistDeviceDescriptor(const sptr<AudioDeviceDescriptor> & deviceDescriptor)336 bool AudioDeviceManager::UpdateExistDeviceDescriptor(const sptr<AudioDeviceDescriptor> &deviceDescriptor)
337 {
338     auto isPresent = [&deviceDescriptor](const shared_ptr<AudioDeviceDescriptor> &descriptor) {
339         if (descriptor->deviceType_ == deviceDescriptor->deviceType_ &&
340             descriptor->networkId_ == deviceDescriptor->networkId_ &&
341             descriptor->deviceRole_ == deviceDescriptor->deviceRole_) {
342             if (descriptor->deviceType_ != DEVICE_TYPE_BLUETOOTH_A2DP &&
343                 descriptor->deviceType_ != DEVICE_TYPE_BLUETOOTH_SCO) {
344                 return true;
345             } else {
346                 // if the disconnecting device is A2DP, need to compare mac address in addition.
347                 return descriptor->macAddress_ == deviceDescriptor->macAddress_;
348             }
349         }
350         return false;
351     };
352 
353     auto iter = std::find_if(connectedDevices_.begin(), connectedDevices_.end(), isPresent);
354     if (iter != connectedDevices_.end()) {
355         **iter = deviceDescriptor;
356         UpdateDeviceInfo(*iter);
357         return true;
358     }
359     return false;
360 }
361 
RemoveVirtualConnectedDevice(const shared_ptr<AudioDeviceDescriptor> & devDesc)362 void AudioDeviceManager::RemoveVirtualConnectedDevice(const shared_ptr<AudioDeviceDescriptor> &devDesc)
363 {
364     auto isPresent = [&devDesc](const shared_ptr<AudioDeviceDescriptor> &descriptor) {
365         return descriptor->deviceType_ == devDesc->deviceType_
366             && descriptor->deviceRole_ == devDesc->deviceRole_
367             && descriptor->networkId_ == devDesc->networkId_
368             && descriptor->macAddress_ == devDesc->macAddress_
369             && descriptor->connectState_ == VIRTUAL_CONNECTED;
370     };
371     connectedDevices_.erase(std::remove_if(connectedDevices_.begin(), connectedDevices_.end(), isPresent),
372         connectedDevices_.end());
373 }
374 
AddNewDevice(const sptr<AudioDeviceDescriptor> & deviceDescriptor)375 void AudioDeviceManager::AddNewDevice(const sptr<AudioDeviceDescriptor> &deviceDescriptor)
376 {
377     shared_ptr<AudioDeviceDescriptor> devDesc = make_shared<AudioDeviceDescriptor>(deviceDescriptor);
378     CHECK_AND_RETURN_LOG(devDesc != nullptr, "Memory allocation failed");
379 
380     int32_t audioId = deviceDescriptor->deviceId_;
381     AUDIO_INFO_LOG("add type:id %{public}d:%{public}d", deviceDescriptor->getType(), audioId);
382 
383     RemoveVirtualConnectedDevice(devDesc);
384     std::lock_guard<std::mutex> currentActiveDevicesLock(currentActiveDevicesMutex_);
385     if (UpdateExistDeviceDescriptor(deviceDescriptor)) {
386         AUDIO_WARNING_LOG("The device has been added and will not be added again.");
387         return;
388     }
389     AddConnectedDevices(devDesc);
390 
391     if (devDesc->networkId_ != LOCAL_NETWORK_ID || devDesc->deviceType_ == DEVICE_TYPE_REMOTE_CAST) {
392         AddRemoteRenderDev(devDesc);
393         AddRemoteCaptureDev(devDesc);
394     } else {
395         HandleScoWithDefaultCategory(devDesc);
396         AddDefaultDevices(deviceDescriptor);
397         AddCommunicationDevices(devDesc);
398         AddMediaDevices(devDesc);
399         AddCaptureDevices(devDesc);
400     }
401     UpdateDeviceInfo(devDesc);
402 }
403 
GetConnDevicesStr()404 std::string AudioDeviceManager::GetConnDevicesStr()
405 {
406     std::lock_guard<std::mutex> currentActiveDevicesLock(currentActiveDevicesMutex_);
407     return GetConnDevicesStr(connectedDevices_);
408 }
409 
GetConnDevicesStr(const vector<shared_ptr<AudioDeviceDescriptor>> & descs)410 std::string AudioDeviceManager::GetConnDevicesStr(const vector<shared_ptr<AudioDeviceDescriptor>> &descs)
411 {
412     std::string devices;
413     devices.append("device type:id:(category:constate) ");
414     for (auto iter : descs) {
415         CHECK_AND_CONTINUE_LOG(iter != nullptr, "iter is nullptr");
416         devices.append(std::to_string(static_cast<uint32_t>(iter->getType())));
417         devices.append(":" + std::to_string(static_cast<uint32_t>(iter->deviceId_)));
418         if (iter->getType() == DEVICE_TYPE_BLUETOOTH_A2DP ||
419             iter->getType() == DEVICE_TYPE_BLUETOOTH_SCO) {
420             devices.append(":" + std::to_string(static_cast<uint32_t>(iter->deviceCategory_)));
421             devices.append(":" + std::to_string(static_cast<uint32_t>(iter->connectState_)));
422         }
423         devices.append(" ");
424     }
425     return devices;
426 }
427 
RemoveMatchDeviceInArray(const AudioDeviceDescriptor & devDesc,string logName,vector<shared_ptr<AudioDeviceDescriptor>> & descArray)428 void AudioDeviceManager::RemoveMatchDeviceInArray(const AudioDeviceDescriptor &devDesc, string logName,
429     vector<shared_ptr<AudioDeviceDescriptor>> &descArray)
430 {
431     auto isPresent = [&devDesc] (const shared_ptr<AudioDeviceDescriptor> &desc) {
432         CHECK_AND_RETURN_RET_LOG(desc != nullptr, false, "Invalid device descriptor");
433         return devDesc.deviceType_ == desc->deviceType_ && devDesc.macAddress_ == desc->macAddress_ &&
434             devDesc.networkId_ == desc->networkId_;
435     };
436 
437     auto removeBeginIt = std::remove_if(descArray.begin(), descArray.end(), isPresent);
438     size_t deleteNum = static_cast<uint32_t>(descArray.end() - removeBeginIt);
439     descArray.erase(removeBeginIt, descArray.end());
440 
441     AUDIO_WARNING_LOG("Remove %{public}zu desc from %{public}s list, and then %{public}s", deleteNum,
442         logName.c_str(), GetConnDevicesStr(descArray).c_str());
443 }
444 
RemoveNewDevice(const sptr<AudioDeviceDescriptor> & devDesc)445 void AudioDeviceManager::RemoveNewDevice(const sptr<AudioDeviceDescriptor> &devDesc)
446 {
447     int32_t audioId = devDesc->deviceId_;
448     AUDIO_INFO_LOG("remove type:id %{public}d:%{public}d ", devDesc->getType(), audioId);
449 
450     std::lock_guard<std::mutex> currentActiveDevicesLock(currentActiveDevicesMutex_);
451     RemoveConnectedDevices(make_shared<AudioDeviceDescriptor>(devDesc));
452     RemoveRemoteDevices(devDesc);
453     RemoveCommunicationDevices(devDesc);
454     RemoveMediaDevices(devDesc);
455     RemoveCaptureDevices(devDesc);
456 }
457 
GetRemoteRenderDevices()458 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetRemoteRenderDevices()
459 {
460     vector<unique_ptr<AudioDeviceDescriptor>> descs;
461     for (const auto &desc : remoteRenderDevices_) {
462         if (desc == nullptr) {
463             continue;
464         }
465         descs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
466     }
467     return descs;
468 }
469 
GetRemoteCaptureDevices()470 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetRemoteCaptureDevices()
471 {
472     vector<unique_ptr<AudioDeviceDescriptor>> descs;
473     for (const auto &desc : remoteCaptureDevices_) {
474         if (desc == nullptr) {
475             continue;
476         }
477         descs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
478     }
479     return descs;
480 }
481 
GetCommRenderPrivacyDevices()482 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetCommRenderPrivacyDevices()
483 {
484     vector<unique_ptr<AudioDeviceDescriptor>> descs;
485     for (const auto &desc : commRenderPrivacyDevices_) {
486         if (desc == nullptr) {
487             continue;
488         }
489         descs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
490     }
491     return descs;
492 }
493 
GetCommRenderPublicDevices()494 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetCommRenderPublicDevices()
495 {
496     vector<unique_ptr<AudioDeviceDescriptor>> descs;
497     for (const auto &desc : commRenderPublicDevices_) {
498         if (desc == nullptr) {
499             continue;
500         }
501         descs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
502     }
503     return descs;
504 }
505 
GetCommRenderBTCarDevices()506 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetCommRenderBTCarDevices()
507 {
508     vector<unique_ptr<AudioDeviceDescriptor>> carDescs;
509     for (const auto &desc : commRenderPublicDevices_) {
510         if (desc == nullptr || desc->deviceCategory_ != BT_CAR) {
511             continue;
512         }
513         carDescs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
514     }
515     return carDescs;
516 }
517 
GetCommCapturePrivacyDevices()518 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetCommCapturePrivacyDevices()
519 {
520     vector<unique_ptr<AudioDeviceDescriptor>> descs;
521     for (const auto &desc : commCapturePrivacyDevices_) {
522         if (desc == nullptr) {
523             continue;
524         }
525         descs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
526     }
527     return descs;
528 }
529 
GetCommCapturePublicDevices()530 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetCommCapturePublicDevices()
531 {
532     vector<unique_ptr<AudioDeviceDescriptor>> descs;
533     for (const auto &desc : commCapturePublicDevices_) {
534         if (desc == nullptr) {
535             continue;
536         }
537         descs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
538     }
539     return descs;
540 }
541 
GetMediaRenderPrivacyDevices()542 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetMediaRenderPrivacyDevices()
543 {
544     vector<unique_ptr<AudioDeviceDescriptor>> descs;
545     for (const auto &desc : mediaRenderPrivacyDevices_) {
546         if (desc == nullptr) {
547             continue;
548         }
549         descs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
550     }
551     return descs;
552 }
553 
GetMediaRenderPublicDevices()554 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetMediaRenderPublicDevices()
555 {
556     vector<unique_ptr<AudioDeviceDescriptor>> descs;
557     for (const auto &desc : mediaRenderPublicDevices_) {
558         if (desc == nullptr) {
559             continue;
560         }
561         descs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
562     }
563     return descs;
564 }
565 
GetMediaCapturePrivacyDevices()566 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetMediaCapturePrivacyDevices()
567 {
568     vector<unique_ptr<AudioDeviceDescriptor>> descs;
569     for (const auto &desc : mediaCapturePrivacyDevices_) {
570         if (desc == nullptr) {
571             continue;
572         }
573         descs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
574     }
575     return descs;
576 }
577 
GetMediaCapturePublicDevices()578 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetMediaCapturePublicDevices()
579 {
580     vector<unique_ptr<AudioDeviceDescriptor>> descs;
581     for (const auto &desc : mediaCapturePublicDevices_) {
582         if (desc == nullptr) {
583             continue;
584         }
585         descs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
586     }
587     return descs;
588 }
589 
GetCapturePrivacyDevices()590 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetCapturePrivacyDevices()
591 {
592     vector<unique_ptr<AudioDeviceDescriptor>> descs;
593     for (const auto &desc : capturePrivacyDevices_) {
594         if (desc == nullptr) {
595             continue;
596         }
597         descs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
598     }
599     return descs;
600 }
601 
GetCapturePublicDevices()602 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetCapturePublicDevices()
603 {
604     vector<unique_ptr<AudioDeviceDescriptor>> descs;
605     for (const auto &desc : capturePublicDevices_) {
606         if (desc == nullptr) {
607             continue;
608         }
609         descs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
610     }
611     return descs;
612 }
613 
GetRecongnitionCapturePrivacyDevices()614 vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetRecongnitionCapturePrivacyDevices()
615 {
616     vector<unique_ptr<AudioDeviceDescriptor>> descs;
617     for (const auto &desc : reconCapturePrivacyDevices_) {
618         if (desc == nullptr) {
619             continue;
620         }
621         descs.push_back(make_unique<AudioDeviceDescriptor>(*desc));
622     }
623     return descs;
624 }
625 // LCOV_EXCL_STOP
GetCommRenderDefaultDevice(StreamUsage streamUsage)626 unique_ptr<AudioDeviceDescriptor> AudioDeviceManager::GetCommRenderDefaultDevice(StreamUsage streamUsage)
627 {
628     if (streamUsage < STREAM_USAGE_UNKNOWN || streamUsage > STREAM_USAGE_VOICE_MODEM_COMMUNICATION) {
629         AUDIO_DEBUG_LOG("Invalid stream usage");
630     }
631 
632     unique_ptr<AudioDeviceDescriptor> devDesc;
633     if (hasEarpiece_ && streamUsage != STREAM_USAGE_VIDEO_COMMUNICATION) {
634         devDesc = make_unique<AudioDeviceDescriptor>(earpiece_);
635     } else {
636         devDesc = make_unique<AudioDeviceDescriptor>(speaker_);
637     }
638     return devDesc;
639 }
640 
GetRenderDefaultDevice()641 unique_ptr<AudioDeviceDescriptor> AudioDeviceManager::GetRenderDefaultDevice()
642 {
643     unique_ptr<AudioDeviceDescriptor> devDesc = make_unique<AudioDeviceDescriptor>(speaker_);
644     return devDesc;
645 }
646 
GetCaptureDefaultDevice()647 unique_ptr<AudioDeviceDescriptor> AudioDeviceManager::GetCaptureDefaultDevice()
648 {
649     unique_ptr<AudioDeviceDescriptor> devDesc = make_unique<AudioDeviceDescriptor>(defalutMic_);
650     return devDesc;
651 }
652 
653 // LCOV_EXCL_START
AddAvailableDevicesByUsage(const AudioDeviceUsage usage,const DevicePrivacyInfo & deviceInfo,const sptr<AudioDeviceDescriptor> & dev,std::vector<unique_ptr<AudioDeviceDescriptor>> & audioDeviceDescriptors)654 void AudioDeviceManager::AddAvailableDevicesByUsage(const AudioDeviceUsage usage,
655     const DevicePrivacyInfo &deviceInfo, const sptr<AudioDeviceDescriptor> &dev,
656     std::vector<unique_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors)
657 {
658     switch (usage) {
659         case MEDIA_OUTPUT_DEVICES:
660             if ((static_cast<uint32_t>(dev->deviceRole_) & OUTPUT_DEVICE) &&
661                 (static_cast<uint32_t>(deviceInfo.deviceUsage) & MEDIA)) {
662                 audioDeviceDescriptors.push_back(make_unique<AudioDeviceDescriptor>(dev));
663             }
664             break;
665         case MEDIA_INPUT_DEVICES:
666             if ((static_cast<uint32_t>(dev->deviceRole_) & INPUT_DEVICE) &&
667                 (static_cast<uint32_t>(deviceInfo.deviceUsage) & MEDIA)) {
668                 audioDeviceDescriptors.push_back(make_unique<AudioDeviceDescriptor>(dev));
669             }
670             break;
671         case ALL_MEDIA_DEVICES:
672             if (static_cast<uint32_t>(deviceInfo.deviceUsage) & MEDIA) {
673                 audioDeviceDescriptors.push_back(make_unique<AudioDeviceDescriptor>(dev));
674             }
675             break;
676         case CALL_OUTPUT_DEVICES:
677             if ((static_cast<uint32_t>(dev->deviceRole_) & OUTPUT_DEVICE) &&
678                 (static_cast<uint32_t>(deviceInfo.deviceUsage) & VOICE)) {
679                 audioDeviceDescriptors.push_back(make_unique<AudioDeviceDescriptor>(dev));
680             }
681             break;
682         case CALL_INPUT_DEVICES:
683             if ((static_cast<uint32_t>(dev->deviceRole_) & INPUT_DEVICE) &&
684                 (static_cast<uint32_t>(deviceInfo.deviceUsage) & VOICE)) {
685                 audioDeviceDescriptors.push_back(make_unique<AudioDeviceDescriptor>(dev));
686             }
687             break;
688         case ALL_CALL_DEVICES:
689             if (static_cast<uint32_t>(deviceInfo.deviceUsage) & VOICE) {
690                 audioDeviceDescriptors.push_back(make_unique<AudioDeviceDescriptor>(dev));
691             }
692             break;
693         default:
694             break;
695     }
696 }
697 
IsExistedDevice(const sptr<AudioDeviceDescriptor> & device,const vector<unique_ptr<AudioDeviceDescriptor>> & audioDeviceDescriptors)698 bool AudioDeviceManager::IsExistedDevice(const sptr<AudioDeviceDescriptor> &device,
699     const vector<unique_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors)
700 {
701     bool isExistedDev = false;
702     for (const auto &dev : audioDeviceDescriptors) {
703         if (device->deviceType_ == dev->deviceType_ &&
704             device->networkId_ == dev->networkId_ &&
705             device->deviceRole_ == dev->deviceRole_ &&
706             device->macAddress_ == dev->macAddress_) {
707             isExistedDev = true;
708         }
709     }
710     return isExistedDev;
711 }
712 
GetAvailableDevicesWithUsage(const AudioDeviceUsage usage,const list<DevicePrivacyInfo> & deviceInfos,const sptr<AudioDeviceDescriptor> & dev,vector<unique_ptr<AudioDeviceDescriptor>> & audioDeviceDescriptors)713 void AudioDeviceManager::GetAvailableDevicesWithUsage(const AudioDeviceUsage usage,
714     const list<DevicePrivacyInfo> &deviceInfos, const sptr<AudioDeviceDescriptor> &dev,
715     vector<unique_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors)
716 {
717     for (auto &deviceInfo : deviceInfos) {
718         if (dev->deviceType_ != deviceInfo.deviceType ||
719             IsExistedDevice(dev, audioDeviceDescriptors)) {
720             continue;
721         }
722         AddAvailableDevicesByUsage(usage, deviceInfo, dev, audioDeviceDescriptors);
723     }
724 }
725 
GetDefaultAvailableDevicesByUsage(AudioDeviceUsage usage,vector<unique_ptr<AudioDeviceDescriptor>> & audioDeviceDescriptors)726 void AudioDeviceManager::GetDefaultAvailableDevicesByUsage(AudioDeviceUsage usage,
727     vector<unique_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors)
728 {
729     if (((usage & MEDIA_OUTPUT_DEVICES) != 0) || ((usage & CALL_OUTPUT_DEVICES) != 0)) {
730         if (speaker_ != nullptr) {
731             audioDeviceDescriptors.push_back(make_unique<AudioDeviceDescriptor>(speaker_));
732         }
733         for (const auto &desc : connectedDevices_) {
734             if (desc->deviceType_ == DEVICE_TYPE_SPEAKER && desc->networkId_ != LOCAL_NETWORK_ID) {
735                 audioDeviceDescriptors.push_back(make_unique<AudioDeviceDescriptor>(*desc));
736             }
737         }
738     }
739 
740     if (((usage & MEDIA_INPUT_DEVICES) != 0) || ((usage & CALL_INPUT_DEVICES) != 0)) {
741         if (defalutMic_ != nullptr) {
742             audioDeviceDescriptors.push_back(make_unique<AudioDeviceDescriptor>(defalutMic_));
743         }
744         for (const auto &desc : connectedDevices_) {
745             if (desc->deviceType_ == DEVICE_TYPE_MIC && desc->networkId_ != LOCAL_NETWORK_ID) {
746                 audioDeviceDescriptors.push_back(make_unique<AudioDeviceDescriptor>(*desc));
747             }
748         }
749     }
750 
751     if ((usage & CALL_OUTPUT_DEVICES) != 0) {
752         if (earpiece_ != nullptr) {
753             audioDeviceDescriptors.push_back(make_unique<AudioDeviceDescriptor>(earpiece_));
754         }
755         for (const auto &desc : connectedDevices_) {
756             if (desc->deviceType_ == DEVICE_TYPE_EARPIECE && desc->networkId_ != LOCAL_NETWORK_ID) {
757                 audioDeviceDescriptors.push_back(make_unique<AudioDeviceDescriptor>(*desc));
758             }
759         }
760     }
761 }
762 
GetAvailableDevicesByUsage(AudioDeviceUsage usage)763 std::vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetAvailableDevicesByUsage(AudioDeviceUsage usage)
764 {
765     std::lock_guard<std::mutex> currentActiveDevicesLock(currentActiveDevicesMutex_);
766     std::vector<unique_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors;
767 
768     GetDefaultAvailableDevicesByUsage(usage, audioDeviceDescriptors);
769 
770     for (const auto &dev : connectedDevices_) {
771         for (const auto &devicePrivacy : devicePrivacyMaps_) {
772             list<DevicePrivacyInfo> deviceInfos = devicePrivacy.second;
773             sptr<AudioDeviceDescriptor> desc = new (std::nothrow) AudioDeviceDescriptor(*dev);
774             GetAvailableDevicesWithUsage(usage, deviceInfos, desc, audioDeviceDescriptors);
775         }
776     }
777     return audioDeviceDescriptors;
778 }
779 
GetDevicePrivacyMaps()780 unordered_map<AudioDevicePrivacyType, list<DevicePrivacyInfo>> AudioDeviceManager::GetDevicePrivacyMaps()
781 {
782     return devicePrivacyMaps_;
783 }
784 
GetAvailableBluetoothDevice(DeviceType devType,const std::string & macAddress)785 std::vector<unique_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetAvailableBluetoothDevice(DeviceType devType,
786     const std::string &macAddress)
787 {
788     std::vector<unique_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors;
789 
790     std::lock_guard<std::mutex> currentActiveDevicesLock(currentActiveDevicesMutex_);
791     for (const auto &desc : connectedDevices_) {
792         if (desc->deviceType_ == devType && desc->macAddress_ == macAddress) {
793             audioDeviceDescriptors.push_back(make_unique<AudioDeviceDescriptor>(*desc));
794         }
795     }
796     return audioDeviceDescriptors;
797 }
798 
UpdateScoState(const std::string & macAddress,bool isConnnected)799 void AudioDeviceManager::UpdateScoState(const std::string &macAddress, bool isConnnected)
800 {
801     std::lock_guard<std::mutex> currentActiveDevicesLock(currentActiveDevicesMutex_);
802     for (const auto &desc : connectedDevices_) {
803         if (desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO && desc->macAddress_ == macAddress) {
804             desc->isScoRealConnected_ = isConnnected;
805         }
806     }
807 }
808 
GetScoState()809 bool AudioDeviceManager::GetScoState()
810 {
811     std::lock_guard<std::mutex> currentActiveDevicesLock(currentActiveDevicesMutex_);
812     for (const auto &desc : connectedDevices_) {
813         if (desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO && desc->connectState_ == CONNECTED) {
814             return true;
815         }
816     }
817     return false;
818 }
819 
UpdateDevicesListInfo(const sptr<AudioDeviceDescriptor> & d,const DeviceInfoUpdateCommand updateCommand)820 void AudioDeviceManager::UpdateDevicesListInfo(const sptr<AudioDeviceDescriptor> &d,
821     const DeviceInfoUpdateCommand updateCommand)
822 {
823     shared_ptr<AudioDeviceDescriptor> devDesc = make_shared<AudioDeviceDescriptor>(d);
824     bool ret = false;
825     std::lock_guard<std::mutex> currentActiveDevicesLock(currentActiveDevicesMutex_);
826     switch (updateCommand) {
827         case CATEGORY_UPDATE:
828             ret = UpdateDeviceCategory(d);
829             break;
830         case CONNECTSTATE_UPDATE:
831             ret = UpdateConnectState(devDesc);
832             break;
833         case ENABLE_UPDATE:
834             ret = UpdateEnableState(devDesc);
835             break;
836         case EXCEPTION_FLAG_UPDATE:
837             ret = UpdateExceptionFlag(devDesc);
838             break;
839         default:
840             break;
841     }
842     if (!ret) {
843         int32_t audioId = d->deviceId_;
844         AUDIO_ERR_LOG("cant find type:id %{public}d:%{public}d mac:%{public}s networkid:%{public}s in connected list",
845             d->deviceType_, audioId, GetEncryptStr(d->macAddress_).c_str(), GetEncryptStr(d->networkId_).c_str());
846     }
847 }
848 
UpdateDeviceCategory(const sptr<AudioDeviceDescriptor> & deviceDescriptor)849 bool AudioDeviceManager::UpdateDeviceCategory(const sptr<AudioDeviceDescriptor> &deviceDescriptor)
850 {
851     bool updateFlag = false;
852     shared_ptr<AudioDeviceDescriptor> devDesc = make_shared<AudioDeviceDescriptor>(deviceDescriptor);
853 
854     for (auto &desc : connectedDevices_) {
855         if ((devDesc->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP ||
856             devDesc->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO) &&
857             desc->deviceType_ == devDesc->deviceType_ &&
858             desc->networkId_ == devDesc->networkId_ &&
859             desc->macAddress_ == devDesc->macAddress_ &&
860             desc->deviceCategory_ != devDesc->deviceCategory_) {
861             desc->deviceCategory_ = devDesc->deviceCategory_;
862             if (devDesc->deviceCategory_ == BT_UNWEAR_HEADPHONE) {
863                 RemoveBtFromOtherList(deviceDescriptor);
864             } else {
865                 // Update connectTimeStamp_ when wearing headphones that support wear detection
866                 desc->connectTimeStamp_ = GetCurrentTimeMS();
867                 AddBtToOtherList(desc);
868             }
869         }
870         updateFlag = true;
871     }
872     return updateFlag;
873 }
874 
UpdateConnectState(const shared_ptr<AudioDeviceDescriptor> & devDesc)875 bool AudioDeviceManager::UpdateConnectState(const shared_ptr<AudioDeviceDescriptor> &devDesc)
876 {
877     bool updateFlag = false;
878     bool isScoDevice = devDesc->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO;
879 
880     for (const auto &desc : connectedDevices_) {
881         if (desc->networkId_ != devDesc->networkId_ ||
882             desc->macAddress_ != devDesc->macAddress_) {
883             continue;
884         }
885         if (desc->deviceType_ == devDesc->deviceType_) {
886             desc->connectState_ = devDesc->connectState_;
887             updateFlag = true;
888             continue;
889         }
890         // a2dp connectState needs to be updated simultaneously when connectState of sco is updated
891         if (isScoDevice) {
892             if (desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP &&
893                 devDesc->connectState_ == CONNECTED) {
894                 // sco connected, suspend a2dp
895                 desc->connectState_ = SUSPEND_CONNECTED;
896                 updateFlag = true;
897                 AUDIO_WARNING_LOG("sco connectState is connected, update a2dp to suspend");
898             } else if (desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP &&
899                 desc->connectState_ == SUSPEND_CONNECTED &&
900                 (devDesc->connectState_ == DEACTIVE_CONNECTED || devDesc->connectState_ == SUSPEND_CONNECTED)) {
901                 // sco deactive or suspend, a2dp CONNECTED
902                 desc->connectState_ = CONNECTED;
903                 updateFlag = true;
904                 AUDIO_WARNING_LOG("sco connectState %{public}d, update a2dp to connected", devDesc->connectState_);
905             }
906         }
907     }
908     return updateFlag;
909 }
910 
UpdateEnableState(const shared_ptr<AudioDeviceDescriptor> & devDesc)911 bool AudioDeviceManager::UpdateEnableState(const shared_ptr<AudioDeviceDescriptor> &devDesc)
912 {
913     bool updateFlag = false;
914     for (const auto &desc : connectedDevices_) {
915         if (devDesc->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP ||
916             devDesc->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO) {
917             if (desc->deviceType_ == devDesc->deviceType_ &&
918                 desc->macAddress_ == devDesc->macAddress_) {
919                 desc->isEnable_ = devDesc->isEnable_;
920                 updateFlag = true;
921             }
922         } else if (desc->deviceType_ == devDesc->deviceType_ &&
923             desc->networkId_ == devDesc->networkId_ &&
924             desc->isEnable_ != devDesc->isEnable_) {
925                 desc->isEnable_ = devDesc->isEnable_;
926                 updateFlag = true;
927         }
928     }
929     return updateFlag;
930 }
931 
UpdateExceptionFlag(const shared_ptr<AudioDeviceDescriptor> & deviceDescriptor)932 bool AudioDeviceManager::UpdateExceptionFlag(const shared_ptr<AudioDeviceDescriptor> &deviceDescriptor)
933 {
934     bool updateFlag = false;
935     for (const auto &desc : connectedDevices_) {
936         if (deviceDescriptor->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP ||
937             deviceDescriptor->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO) {
938             if (desc->deviceType_ == deviceDescriptor->deviceType_ &&
939                 desc->macAddress_ == deviceDescriptor->macAddress_) {
940                 desc->exceptionFlag_ = deviceDescriptor->exceptionFlag_;
941                 updateFlag = true;
942             }
943         } else if (desc->deviceType_ == deviceDescriptor->deviceType_ &&
944             desc->networkId_ == deviceDescriptor->networkId_ &&
945             desc->exceptionFlag_ != deviceDescriptor->exceptionFlag_) {
946                 desc->exceptionFlag_ = deviceDescriptor->exceptionFlag_;
947                 updateFlag = true;
948         }
949     }
950     return updateFlag;
951 }
952 
UpdateEarpieceStatus(const bool hasEarPiece)953 void AudioDeviceManager::UpdateEarpieceStatus(const bool hasEarPiece)
954 {
955     hasEarpiece_ = hasEarPiece;
956 }
957 
AddBtToOtherList(const shared_ptr<AudioDeviceDescriptor> & devDesc)958 void AudioDeviceManager::AddBtToOtherList(const shared_ptr<AudioDeviceDescriptor> &devDesc)
959 {
960     if (devDesc->networkId_ != LOCAL_NETWORK_ID) {
961         AddRemoteRenderDev(devDesc);
962         AddRemoteCaptureDev(devDesc);
963     } else {
964         HandleScoWithDefaultCategory(devDesc);
965         AddCommunicationDevices(devDesc);
966         AddMediaDevices(devDesc);
967         AddCaptureDevices(devDesc);
968     }
969 }
970 
RemoveBtFromOtherList(const AudioDeviceDescriptor & devDesc)971 void AudioDeviceManager::RemoveBtFromOtherList(const AudioDeviceDescriptor &devDesc)
972 {
973     if (devDesc.networkId_ != LOCAL_NETWORK_ID) {
974         RemoveRemoteDevices(devDesc);
975     } else {
976         RemoveCommunicationDevices(devDesc);
977         RemoveMediaDevices(devDesc);
978         RemoveCaptureDevices(devDesc);
979     }
980 }
981 
RemoveRemoteDevices(const AudioDeviceDescriptor & devDesc)982 void AudioDeviceManager::RemoveRemoteDevices(const AudioDeviceDescriptor &devDesc)
983 {
984     RemoveMatchDeviceInArray(devDesc, "remote render device", remoteRenderDevices_);
985     RemoveMatchDeviceInArray(devDesc, "remote capture device", remoteCaptureDevices_);
986 }
987 
RemoveCommunicationDevices(const AudioDeviceDescriptor & devDesc)988 void AudioDeviceManager::RemoveCommunicationDevices(const AudioDeviceDescriptor &devDesc)
989 {
990     RemoveMatchDeviceInArray(devDesc, "communication render privacy device", commRenderPrivacyDevices_);
991     RemoveMatchDeviceInArray(devDesc, "communication render public device", commRenderPublicDevices_);
992     RemoveMatchDeviceInArray(devDesc, "communication capture privacy device", commCapturePrivacyDevices_);
993     RemoveMatchDeviceInArray(devDesc, "communication capture public device", commCapturePublicDevices_);
994 }
995 
RemoveMediaDevices(const AudioDeviceDescriptor & devDesc)996 void AudioDeviceManager::RemoveMediaDevices(const AudioDeviceDescriptor &devDesc)
997 {
998     RemoveMatchDeviceInArray(devDesc, "media render privacy device", mediaRenderPrivacyDevices_);
999     RemoveMatchDeviceInArray(devDesc, "media render public device", mediaRenderPublicDevices_);
1000     RemoveMatchDeviceInArray(devDesc, "media capture privacy device", mediaCapturePrivacyDevices_);
1001     RemoveMatchDeviceInArray(devDesc, "media capture public device", mediaCapturePublicDevices_);
1002 }
1003 
RemoveCaptureDevices(const AudioDeviceDescriptor & devDesc)1004 void AudioDeviceManager::RemoveCaptureDevices(const AudioDeviceDescriptor &devDesc)
1005 {
1006     RemoveMatchDeviceInArray(devDesc, "capture privacy device", capturePrivacyDevices_);
1007     RemoveMatchDeviceInArray(devDesc, "capture public device", capturePublicDevices_);
1008     RemoveMatchDeviceInArray(devDesc, "capture recon privacy device", reconCapturePrivacyDevices_);
1009 }
1010 
GetDevicesByFilter(DeviceType devType,DeviceRole devRole,const string & macAddress,const string & networkId,ConnectState connectState)1011 vector<shared_ptr<AudioDeviceDescriptor>> AudioDeviceManager::GetDevicesByFilter(DeviceType devType, DeviceRole devRole,
1012     const string &macAddress, const string &networkId, ConnectState connectState)
1013 {
1014     std::lock_guard<std::mutex> currentActiveDevicesLock(currentActiveDevicesMutex_);
1015     vector<shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors;
1016 
1017     for (const auto &desc : connectedDevices_) {
1018         if ((devType == DEVICE_TYPE_NONE || devType == desc->deviceType_) &&
1019             (devRole == DEVICE_ROLE_NONE || devRole == desc->deviceRole_) &&
1020             (macAddress == "" || macAddress == desc->macAddress_) &&
1021             (networkId == "" || networkId == desc->networkId_) && (connectState == desc->connectState_)) {
1022             audioDeviceDescriptors.push_back(desc);
1023         }
1024     }
1025     AUDIO_DEBUG_LOG("Filter device size %{public}zu", audioDeviceDescriptors.size());
1026     return audioDeviceDescriptors;
1027 }
1028 
GetDeviceUsage(const AudioDeviceDescriptor & desc)1029 DeviceUsage AudioDeviceManager::GetDeviceUsage(const AudioDeviceDescriptor &desc)
1030 {
1031     AUDIO_DEBUG_LOG("device type [%{public}d] category [%{public}d]", desc.deviceType_, desc.deviceCategory_);
1032     DeviceUsage usage = MEDIA;
1033     for (auto &devInfo : privacyDeviceList_) {
1034         if ((devInfo.deviceType == desc.deviceType_) &&
1035             ((devInfo.deviceCategory & desc.deviceCategory_) || devInfo.deviceCategory == 0)) {
1036             return devInfo.deviceUsage;
1037         }
1038     }
1039 
1040     for (auto &devInfo : publicDeviceList_) {
1041         if ((devInfo.deviceType == desc.deviceType_) &&
1042             ((devInfo.deviceCategory & desc.deviceCategory_) || devInfo.deviceCategory == 0)) {
1043             return devInfo.deviceUsage;
1044         }
1045     }
1046 
1047     if (DEVICE_TYPE_BLUETOOTH_A2DP == desc.deviceType_) {
1048         usage = MEDIA;
1049     }
1050 
1051     if (DEVICE_TYPE_BLUETOOTH_SCO == desc.deviceType_) {
1052         usage = VOICE;
1053     }
1054 
1055     return usage;
1056 }
1057 
OnReceiveBluetoothEvent(const std::string macAddress,const std::string deviceName)1058 void AudioDeviceManager::OnReceiveBluetoothEvent(const std::string macAddress, const std::string deviceName)
1059 {
1060     std::lock_guard<std::mutex> currentActiveDevicesLock(currentActiveDevicesMutex_);
1061     for (auto device : connectedDevices_) {
1062         if (device->macAddress_ == macAddress) {
1063             device->deviceName_ = deviceName;
1064         }
1065     }
1066 }
1067 
IsDeviceConnected(sptr<AudioDeviceDescriptor> & audioDeviceDescriptors)1068 bool AudioDeviceManager::IsDeviceConnected(sptr<AudioDeviceDescriptor> &audioDeviceDescriptors)
1069 {
1070     std::lock_guard<std::mutex> currentActiveDevicesLock(currentActiveDevicesMutex_);
1071     size_t connectedDevicesNum = connectedDevices_.size();
1072     for (size_t i = 0; i < connectedDevicesNum; i++) {
1073         if (connectedDevices_[i] != nullptr) {
1074             if (connectedDevices_[i]->deviceRole_ == audioDeviceDescriptors->deviceRole_
1075                 && connectedDevices_[i]->deviceType_ == audioDeviceDescriptors->deviceType_
1076                 && connectedDevices_[i]->networkId_ == audioDeviceDescriptors->networkId_
1077                 && connectedDevices_[i]->macAddress_ == audioDeviceDescriptors->macAddress_
1078                 && connectedDevices_[i]->volumeGroupId_ == audioDeviceDescriptors->volumeGroupId_) {
1079                 return true;
1080             }
1081         }
1082     }
1083     AUDIO_WARNING_LOG("Role:%{public}d networkId:%{public}s Type:%{public}d macAddress:%{public}s device not found",
1084         audioDeviceDescriptors->deviceRole_, GetEncryptStr(audioDeviceDescriptors->networkId_).c_str(),
1085         audioDeviceDescriptors->deviceType_, GetEncryptAddr(audioDeviceDescriptors->macAddress_).c_str());
1086     return false;
1087 }
1088 
IsVirtualConnectedDevice(const sptr<AudioDeviceDescriptor> & selectedDesc)1089 bool AudioDeviceManager::IsVirtualConnectedDevice(const sptr<AudioDeviceDescriptor> &selectedDesc)
1090 {
1091     CHECK_AND_RETURN_RET_LOG(selectedDesc != nullptr, false, "Invalid device descriptor");
1092     auto isVirtual = [&selectedDesc](const shared_ptr<AudioDeviceDescriptor>& desc) {
1093         return desc->connectState_ == VIRTUAL_CONNECTED
1094             && desc->deviceRole_ == selectedDesc->deviceRole_
1095             && desc->deviceType_ == selectedDesc->deviceType_
1096             && desc->networkId_ == selectedDesc->networkId_
1097             && desc->macAddress_ == selectedDesc->macAddress_;
1098     };
1099     bool isVirtualDevice = false;
1100     auto itr = std::find_if(connectedDevices_.begin(), connectedDevices_.end(), isVirtual);
1101     if (itr != connectedDevices_.end()) {
1102         isVirtualDevice = true;
1103         AUDIO_INFO_LOG("Device[%{public}s] is virtual connection",
1104             GetEncryptAddr(selectedDesc->macAddress_).c_str());
1105     }
1106     return isVirtualDevice;
1107 }
1108 
UpdateDeviceDescDeviceId(sptr<AudioDeviceDescriptor> & deviceDescriptor)1109 int32_t AudioDeviceManager::UpdateDeviceDescDeviceId(sptr<AudioDeviceDescriptor> &deviceDescriptor)
1110 {
1111     CHECK_AND_RETURN_RET_LOG(deviceDescriptor != nullptr, ERROR, "Invalid device descriptor");
1112     auto isPresent = [&deviceDescriptor](const shared_ptr<AudioDeviceDescriptor> &desc) {
1113         return desc->deviceRole_ == deviceDescriptor->deviceRole_
1114             && desc->deviceType_ == deviceDescriptor->deviceType_
1115             && desc->networkId_ == deviceDescriptor->networkId_
1116             && desc->macAddress_ == deviceDescriptor->macAddress_;
1117     };
1118     auto itr = std::find_if(connectedDevices_.begin(), connectedDevices_.end(), isPresent);
1119     CHECK_AND_RETURN_RET_LOG(itr != connectedDevices_.end(), ERROR, "Device not found");
1120     deviceDescriptor->deviceId_ = (*itr)->deviceId_;
1121     return SUCCESS;
1122 }
1123 
SetDefaultOutputDevice(const DeviceType deviceType,const uint32_t sessionID,const StreamUsage streamUsage,bool isRunning)1124 int32_t AudioDeviceManager::SetDefaultOutputDevice(const DeviceType deviceType, const uint32_t sessionID,
1125     const StreamUsage streamUsage, bool isRunning)
1126 {
1127     std::lock_guard<std::mutex> lock(selectDefaultOutputDeviceMutex_);
1128     selectedDefaultOutputDeviceInfo_[sessionID] = std::make_pair(deviceType, streamUsage);
1129     if (!isRunning) {
1130         AUDIO_WARNING_LOG("no need to set default output device since current stream has not started");
1131         return SUCCESS;
1132     }
1133     AUDIO_INFO_LOG("stream %{public}u with usage %{public}d selects output device %{public}d",
1134         sessionID, streamUsage, deviceType);
1135     if (streamUsage == STREAM_USAGE_VOICE_MESSAGE) {
1136         // select media default output device
1137         auto it = std::find_if(mediaDefaultOutputDevices_.begin(), mediaDefaultOutputDevices_.end(),
1138             [&sessionID](const std::pair<uint32_t, DeviceType> &mediaDefaultOutputDevice) {
1139                 return mediaDefaultOutputDevice.first == sessionID;
1140             });
1141         if (it != mediaDefaultOutputDevices_.end()) {
1142             mediaDefaultOutputDevices_.erase(it);
1143         }
1144         mediaDefaultOutputDevices_.push_back(std::make_pair(sessionID, deviceType));
1145         if (selectedMediaDefaultOutputDevice_ != deviceType) {
1146             AUDIO_WARNING_LOG("media default output device changes from %{public}d to %{public}d",
1147                 selectedMediaDefaultOutputDevice_, deviceType);
1148             selectedMediaDefaultOutputDevice_ = deviceType;
1149             return NEED_TO_FETCH;
1150         }
1151     } else if (streamUsage == STREAM_USAGE_VOICE_COMMUNICATION || streamUsage == STREAM_USAGE_VIDEO_COMMUNICATION ||
1152         streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION) {
1153         // select call default output device
1154         auto it = std::find_if(callDefaultOutputDevices_.begin(), callDefaultOutputDevices_.end(),
1155             [&sessionID](const std::pair<uint32_t, DeviceType> &callDefaultOutputDevice) {
1156                 return callDefaultOutputDevice.first == sessionID;
1157             });
1158         if (it != callDefaultOutputDevices_.end()) {
1159             callDefaultOutputDevices_.erase(it);
1160         }
1161         callDefaultOutputDevices_.push_back(std::make_pair(sessionID, deviceType));
1162         if (selectedCallDefaultOutputDevice_ != deviceType) {
1163             AUDIO_WARNING_LOG("call default output device changes from %{public}d to %{public}d",
1164                 selectedCallDefaultOutputDevice_, deviceType);
1165             selectedCallDefaultOutputDevice_ = deviceType;
1166             return NEED_TO_FETCH;
1167         }
1168     } else {
1169         AUDIO_ERR_LOG("Invalid stream usage %{public}d", streamUsage);
1170         return ERROR;
1171     }
1172     return SUCCESS;
1173 }
1174 
UpdateDefaultOutputDeviceWhenStarting(const uint32_t sessionID)1175 int32_t AudioDeviceManager::UpdateDefaultOutputDeviceWhenStarting(const uint32_t sessionID)
1176 {
1177     std::lock_guard<std::mutex> lock(selectDefaultOutputDeviceMutex_);
1178     if (!selectedDefaultOutputDeviceInfo_.count(sessionID)) {
1179         AUDIO_WARNING_LOG("no need to update default output device since current stream has not set");
1180         return SUCCESS;
1181     }
1182     DeviceType deviceType = selectedDefaultOutputDeviceInfo_[sessionID].first;
1183     StreamUsage streamUsage = selectedDefaultOutputDeviceInfo_[sessionID].second;
1184     if (streamUsage == STREAM_USAGE_VOICE_MESSAGE) {
1185         // select media default output device
1186         auto it = std::find_if(mediaDefaultOutputDevices_.begin(), mediaDefaultOutputDevices_.end(),
1187             [&sessionID](const std::pair<uint32_t, DeviceType> &mediaDefaultOutputDevice) {
1188                 return mediaDefaultOutputDevice.first == sessionID;
1189             });
1190         if (it != mediaDefaultOutputDevices_.end()) {
1191             mediaDefaultOutputDevices_.erase(it);
1192         }
1193         mediaDefaultOutputDevices_.push_back(std::make_pair(sessionID, deviceType));
1194         AUDIO_WARNING_LOG("changes from %{public}d to %{public}d because media stream %{public}u starts",
1195             selectedMediaDefaultOutputDevice_, deviceType, sessionID);
1196         selectedMediaDefaultOutputDevice_ = deviceType;
1197     } else if (streamUsage == STREAM_USAGE_VOICE_COMMUNICATION || streamUsage == STREAM_USAGE_VIDEO_COMMUNICATION ||
1198         streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION) {
1199         // select call default output device
1200         auto it = std::find_if(callDefaultOutputDevices_.begin(), callDefaultOutputDevices_.end(),
1201             [&sessionID](const std::pair<uint32_t, DeviceType> &callDefaultOutputDevice) {
1202                 return callDefaultOutputDevice.first == sessionID;
1203             });
1204         if (it != callDefaultOutputDevices_.end()) {
1205             callDefaultOutputDevices_.erase(it);
1206         }
1207         callDefaultOutputDevices_.push_back(std::make_pair(sessionID, deviceType));
1208         AUDIO_WARNING_LOG("changes from %{public}d to %{public}d because call stream %{public}u starts",
1209             selectedCallDefaultOutputDevice_, deviceType, sessionID);
1210         selectedCallDefaultOutputDevice_ = deviceType;
1211     }
1212     return SUCCESS;
1213 }
1214 
UpdateDefaultOutputDeviceWhenStopping(const uint32_t sessionID)1215 int32_t AudioDeviceManager::UpdateDefaultOutputDeviceWhenStopping(const uint32_t sessionID)
1216 {
1217     std::lock_guard<std::mutex> lock(selectDefaultOutputDeviceMutex_);
1218     if (!selectedDefaultOutputDeviceInfo_.count(sessionID)) {
1219         AUDIO_WARNING_LOG("no need to update default output device since current stream has not set");
1220         return SUCCESS;
1221     }
1222     StreamUsage streamUsage = selectedDefaultOutputDeviceInfo_[sessionID].second;
1223     if (streamUsage == STREAM_USAGE_VOICE_MESSAGE) {
1224         // select media default output device
1225         auto it = std::find_if(mediaDefaultOutputDevices_.begin(), mediaDefaultOutputDevices_.end(),
1226             [&sessionID](const std::pair<uint32_t, DeviceType> &mediaDefaultOutputDevice) {
1227                 return mediaDefaultOutputDevice.first == sessionID;
1228             });
1229         if (it == mediaDefaultOutputDevices_.end()) {
1230             return SUCCESS;
1231         }
1232         mediaDefaultOutputDevices_.erase(it);
1233         DeviceType currDeviceType;
1234         if (mediaDefaultOutputDevices_.empty()) {
1235             currDeviceType = DEVICE_TYPE_DEFAULT;
1236         } else {
1237             currDeviceType = mediaDefaultOutputDevices_.back().second;
1238         }
1239         AUDIO_WARNING_LOG("changes from %{public}d to %{public}d because media stream %{public}u stops",
1240             selectedMediaDefaultOutputDevice_, currDeviceType, sessionID);
1241         selectedMediaDefaultOutputDevice_ = currDeviceType;
1242     } else if (streamUsage == STREAM_USAGE_VOICE_COMMUNICATION || streamUsage == STREAM_USAGE_VIDEO_COMMUNICATION ||
1243         streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION) {
1244         // select call default output device
1245         auto it = std::find_if(callDefaultOutputDevices_.begin(), callDefaultOutputDevices_.end(),
1246             [&sessionID](const std::pair<uint32_t, DeviceType> &callDefaultOutputDevice) {
1247                 return callDefaultOutputDevice.first == sessionID;
1248             });
1249         if (it == callDefaultOutputDevices_.end()) {
1250             return SUCCESS;
1251         }
1252         callDefaultOutputDevices_.erase(it);
1253         DeviceType currDeviceType;
1254         if (callDefaultOutputDevices_.empty()) {
1255             currDeviceType = DEVICE_TYPE_DEFAULT;
1256         } else {
1257             currDeviceType = callDefaultOutputDevices_.back().second;
1258         }
1259         AUDIO_WARNING_LOG("changes from %{public}d to %{public}d because call stream %{public}u stops",
1260             selectedCallDefaultOutputDevice_, currDeviceType, sessionID);
1261         selectedCallDefaultOutputDevice_ = currDeviceType;
1262     }
1263     return SUCCESS;
1264 }
1265 
RemoveSelectedDefaultOutputDevice(const uint32_t sessionID)1266 int32_t AudioDeviceManager::RemoveSelectedDefaultOutputDevice(const uint32_t sessionID)
1267 {
1268     std::lock_guard<std::mutex> lock(selectDefaultOutputDeviceMutex_);
1269     selectedDefaultOutputDeviceInfo_.erase(sessionID);
1270     return SUCCESS;
1271 }
1272 
GetSelectedMediaRenderDevice()1273 unique_ptr<AudioDeviceDescriptor> AudioDeviceManager::GetSelectedMediaRenderDevice()
1274 {
1275     std::lock_guard<std::mutex> lock(selectDefaultOutputDeviceMutex_);
1276     unique_ptr<AudioDeviceDescriptor> devDesc = nullptr;
1277     if (selectedMediaDefaultOutputDevice_ == DEVICE_TYPE_EARPIECE) {
1278         devDesc = make_unique<AudioDeviceDescriptor>(earpiece_);
1279     } else if (selectedMediaDefaultOutputDevice_ == DEVICE_TYPE_SPEAKER) {
1280         devDesc = make_unique<AudioDeviceDescriptor>(speaker_);
1281     }
1282     return devDesc;
1283 }
1284 
GetSelectedCallRenderDevice()1285 unique_ptr<AudioDeviceDescriptor> AudioDeviceManager::GetSelectedCallRenderDevice()
1286 {
1287     std::lock_guard<std::mutex> lock(selectDefaultOutputDeviceMutex_);
1288     unique_ptr<AudioDeviceDescriptor> devDesc = nullptr;
1289     if (selectedCallDefaultOutputDevice_ == DEVICE_TYPE_EARPIECE) {
1290         devDesc = make_unique<AudioDeviceDescriptor>(earpiece_);
1291     } else if (selectedCallDefaultOutputDevice_ == DEVICE_TYPE_SPEAKER) {
1292         devDesc = make_unique<AudioDeviceDescriptor>(speaker_);
1293     }
1294     return devDesc;
1295 }
1296 // LCOV_EXCL_STOP
1297 }
1298 }
1299