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