1 /*
2 * Copyright (C) 2021-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
16 #include "audio_device_manager.h"
17
18 #include "audio_control_manager.h"
19 #include "bluetooth_call_manager.h"
20 #include "bluetooth_device_state.h"
21 #include "call_ability_report_proxy.h"
22 #include "earpiece_device_state.h"
23 #include "inactive_device_state.h"
24 #include "speaker_device_state.h"
25 #include "telephony_log_wrapper.h"
26 #include "wired_headset_device_state.h"
27 #include "distributed_call_manager.h"
28 #include "audio_system_manager.h"
29 #include "audio_device_info.h"
30
31 namespace OHOS {
32 namespace Telephony {
33 using namespace AudioStandard;
34 bool AudioDeviceManager::isBtScoDevEnable_ = false;
35 bool AudioDeviceManager::isDCallDevEnable_ = false;
36 bool AudioDeviceManager::isSpeakerAvailable_ = true; // default available
37 bool AudioDeviceManager::isEarpieceAvailable_ = true;
38 bool AudioDeviceManager::isWiredHeadsetConnected_ = false;
39 bool AudioDeviceManager::isBtScoConnected_ = false;
40 bool AudioDeviceManager::isDCallDevConnected_ = false;
41
AudioDeviceManager()42 AudioDeviceManager::AudioDeviceManager()
43 : audioDeviceType_(AudioDeviceType::DEVICE_UNKNOWN), currentAudioDevice_(nullptr), isAudioActivated_(false)
44 {}
45
~AudioDeviceManager()46 AudioDeviceManager::~AudioDeviceManager()
47 {
48 memberFuncMap_.clear();
49 }
50
Init()51 void AudioDeviceManager::Init()
52 {
53 memberFuncMap_[AudioEvent::ENABLE_DEVICE_EARPIECE] = &AudioDeviceManager::EnableEarpiece;
54 memberFuncMap_[AudioEvent::ENABLE_DEVICE_SPEAKER] = &AudioDeviceManager::EnableSpeaker;
55 memberFuncMap_[AudioEvent::ENABLE_DEVICE_WIRED_HEADSET] = &AudioDeviceManager::EnableWiredHeadset;
56 memberFuncMap_[AudioEvent::ENABLE_DEVICE_BLUETOOTH] = &AudioDeviceManager::EnableBtSco;
57 currentAudioDevice_ = std::make_unique<InactiveDeviceState>();
58 if (currentAudioDevice_ == nullptr) {
59 TELEPHONY_LOGE("current audio device nullptr");
60 }
61 if (memset_s(&info_, sizeof(AudioDeviceInfo), 0, sizeof(AudioDeviceInfo)) != EOK) {
62 TELEPHONY_LOGE("memset_s address fail");
63 return;
64 }
65 AudioDevice speaker = {
66 .deviceType = AudioDeviceType::DEVICE_SPEAKER,
67 .address = { 0 },
68 };
69 info_.audioDeviceList.push_back(speaker);
70 AudioDevice earpiece = {
71 .deviceType = AudioDeviceType::DEVICE_EARPIECE,
72 .address = { 0 },
73 };
74 info_.audioDeviceList.push_back(earpiece);
75 }
76
AddAudioDeviceList(const std::string & address,AudioDeviceType deviceType)77 void AudioDeviceManager::AddAudioDeviceList(const std::string &address, AudioDeviceType deviceType)
78 {
79 std::lock_guard<std::mutex> lock(infoMutex_);
80 std::vector<AudioDevice>::iterator it = info_.audioDeviceList.begin();
81 while (it != info_.audioDeviceList.end()) {
82 if (it->address == address && it->deviceType == deviceType) {
83 TELEPHONY_LOGI("device is already existenced");
84 return;
85 }
86 if (deviceType == AudioDeviceType::DEVICE_WIRED_HEADSET && it->deviceType == AudioDeviceType::DEVICE_EARPIECE) {
87 it = info_.audioDeviceList.erase(it);
88 TELEPHONY_LOGI("remove Earpiece device success");
89 } else {
90 ++it;
91 }
92 }
93 AudioDevice audioDevice;
94 if (memset_s(&audioDevice, sizeof(AudioDevice), 0, sizeof(AudioDevice)) != EOK) {
95 TELEPHONY_LOGE("memset_s fail");
96 return;
97 }
98 audioDevice.deviceType = deviceType;
99 if (address.length() > kMaxAddressLen) {
100 TELEPHONY_LOGE("address is not too long");
101 return;
102 }
103 if (memcpy_s(audioDevice.address, kMaxAddressLen, address.c_str(), address.length()) != EOK) {
104 TELEPHONY_LOGE("memcpy_s address fail");
105 return;
106 }
107 info_.audioDeviceList.push_back(audioDevice);
108 if (deviceType == AudioDeviceType::DEVICE_WIRED_HEADSET) {
109 SetDeviceAvailable(AudioDeviceType::DEVICE_WIRED_HEADSET, true);
110 }
111 if (deviceType == AudioDeviceType::DEVICE_BLUETOOTH_SCO) {
112 SetDeviceAvailable(AudioDeviceType::DEVICE_BLUETOOTH_SCO, true);
113 }
114 if (IsDistributedAudioDeviceType(deviceType)) {
115 SetDeviceAvailable(deviceType, true);
116 }
117 ReportAudioDeviceInfo();
118 TELEPHONY_LOGI("AddAudioDeviceList success");
119 }
120
RemoveAudioDeviceList(const std::string & address,AudioDeviceType deviceType)121 void AudioDeviceManager::RemoveAudioDeviceList(const std::string &address, AudioDeviceType deviceType)
122 {
123 std::lock_guard<std::mutex> lock(infoMutex_);
124 bool needAddEarpiece = true;
125 std::vector<AudioDevice>::iterator it = info_.audioDeviceList.begin();
126 while (it != info_.audioDeviceList.end()) {
127 if (it->deviceType == AudioDeviceType::DEVICE_EARPIECE) {
128 needAddEarpiece = false;
129 }
130 if (it->address == address && it->deviceType == deviceType) {
131 it = info_.audioDeviceList.erase(it);
132 } else {
133 ++it;
134 }
135 }
136
137 bool wiredHeadsetExist = false;
138 bool blueToothScoExist = false;
139 for (auto &elem : info_.audioDeviceList) {
140 if (elem.deviceType == AudioDeviceType::DEVICE_WIRED_HEADSET) {
141 wiredHeadsetExist = true;
142 }
143 if (elem.deviceType == AudioDeviceType::DEVICE_BLUETOOTH_SCO) {
144 blueToothScoExist = true;
145 }
146 }
147 if (deviceType == AudioDeviceType::DEVICE_WIRED_HEADSET && !wiredHeadsetExist) {
148 SetDeviceAvailable(AudioDeviceType::DEVICE_WIRED_HEADSET, false);
149 }
150 if (deviceType == AudioDeviceType::DEVICE_BLUETOOTH_SCO && !blueToothScoExist) {
151 SetDeviceAvailable(AudioDeviceType::DEVICE_BLUETOOTH_SCO, false);
152 }
153 if (IsDistributedAudioDeviceType(deviceType)) {
154 SetDeviceAvailable(deviceType, false);
155 }
156 if (needAddEarpiece && deviceType == AudioDeviceType::DEVICE_WIRED_HEADSET && !wiredHeadsetExist) {
157 AudioDevice audioDevice = {
158 .deviceType = AudioDeviceType::DEVICE_EARPIECE,
159 .address = { 0 },
160 };
161 info_.audioDeviceList.push_back(audioDevice);
162 TELEPHONY_LOGI("add Earpiece device success");
163 }
164 DelayedSingleton<AudioControlManager>::GetInstance()->UpdateDeviceTypeForVideoCall();
165 ReportAudioDeviceInfo();
166 TELEPHONY_LOGI("RemoveAudioDeviceList success");
167 }
168
ResetBtAudioDevicesList()169 void AudioDeviceManager::ResetBtAudioDevicesList()
170 {
171 std::lock_guard<std::mutex> lock(mutex_);
172 std::vector<AudioDevice>::iterator it = info_.audioDeviceList.begin();
173 while (it != info_.audioDeviceList.end()) {
174 if (it->deviceType == AudioDeviceType::DEVICE_BLUETOOTH_SCO) {
175 it = info_.audioDeviceList.erase(it);
176 } else {
177 ++it;
178 }
179 }
180 SetDeviceAvailable(AudioDeviceType::DEVICE_BLUETOOTH_SCO, false);
181 ReportAudioDeviceInfo();
182 TELEPHONY_LOGI("ResetBtAudioDevicesList success");
183 }
184
ResetDistributedCallDevicesList()185 void AudioDeviceManager::ResetDistributedCallDevicesList()
186 {
187 std::lock_guard<std::mutex> lock(mutex_);
188 std::vector<AudioDevice>::iterator it = info_.audioDeviceList.begin();
189 while (it != info_.audioDeviceList.end()) {
190 if (IsDistributedAudioDeviceType(it->deviceType)) {
191 it = info_.audioDeviceList.erase(it);
192 } else {
193 ++it;
194 }
195 }
196 SetDeviceAvailable(AudioDeviceType::DEVICE_DISTRIBUTED_AUTOMOTIVE, false);
197 SetDeviceAvailable(AudioDeviceType::DEVICE_DISTRIBUTED_PHONE, false);
198 SetDeviceAvailable(AudioDeviceType::DEVICE_DISTRIBUTED_PAD, false);
199 DelayedSingleton<CallAbilityReportProxy>::GetInstance()->ReportAudioDeviceChange(info_);
200 TELEPHONY_LOGI("Reset Distributed Audio Devices List success");
201 }
202
InitAudioDevice()203 bool AudioDeviceManager::InitAudioDevice()
204 {
205 // when audio deactivate interrupt , reinit
206 // when external audio device connection state changed , reinit
207 auto device = DelayedSingleton<AudioControlManager>::GetInstance()->GetInitAudioDeviceType();
208 return SwitchDevice(device);
209 }
210
ProcessEvent(AudioEvent event)211 bool AudioDeviceManager::ProcessEvent(AudioEvent event)
212 {
213 bool result = false;
214 switch (event) {
215 case AudioEvent::AUDIO_ACTIVATED:
216 case AudioEvent::AUDIO_RINGING:
217 if (!isAudioActivated_) {
218 isAudioActivated_ = true;
219 std::unique_ptr<AudioStandard::AudioDeviceDescriptor> activeBluetoothDevice =
220 AudioStandard::AudioRoutingManager::GetInstance()->GetActiveBluetoothDevice();
221 if (activeBluetoothDevice != nullptr && !activeBluetoothDevice->macAddress_.empty()) {
222 AudioSystemManager* audioSystemManager = AudioSystemManager::GetInstance();
223 int32_t ret = audioSystemManager->SetCallDeviceActive(ActiveDeviceType::BLUETOOTH_SCO,
224 true, activeBluetoothDevice->macAddress_);
225 return ret == 0 ? true : false;
226 }
227 AudioDevice device = {
228 .deviceType = AudioDeviceType::DEVICE_EARPIECE,
229 .address = { 0 },
230 };
231 if (DelayedSingleton<AudioProxy>::GetInstance()->GetPreferredOutputAudioDevice(device) !=
232 TELEPHONY_SUCCESS) {
233 TELEPHONY_LOGE("current audio device nullptr");
234 return false;
235 }
236 SetCurrentAudioDevice(device.deviceType);
237 }
238 break;
239 case AudioEvent::AUDIO_DEACTIVATED:
240 if (isAudioActivated_) {
241 isAudioActivated_ = false;
242 result = InitAudioDevice();
243 }
244 break;
245 case AudioEvent::INIT_AUDIO_DEVICE:
246 result = InitAudioDevice();
247 break;
248 case AudioEvent::WIRED_HEADSET_DISCONNECTED: {
249 if (!isAudioActivated_) {
250 TELEPHONY_LOGE("call is not active, no need to connect sco");
251 return false;
252 }
253 break;
254 }
255 default:
256 break;
257 }
258 return result;
259 }
260
SwitchDevice(AudioEvent event)261 bool AudioDeviceManager::SwitchDevice(AudioEvent event)
262 {
263 auto itFunc = memberFuncMap_.find(event);
264 if (itFunc != memberFuncMap_.end() && itFunc->second != nullptr) {
265 auto memberFunc = itFunc->second;
266 return (this->*memberFunc)();
267 }
268 return false;
269 }
270
SwitchDevice(AudioDeviceType device)271 bool AudioDeviceManager::SwitchDevice(AudioDeviceType device)
272 {
273 bool result = false;
274 std::lock_guard<std::mutex> lock(mutex_);
275 switch (device) {
276 case AudioDeviceType::DEVICE_EARPIECE:
277 result = EnableEarpiece();
278 break;
279 case AudioDeviceType::DEVICE_SPEAKER:
280 result = EnableSpeaker();
281 break;
282 case AudioDeviceType::DEVICE_WIRED_HEADSET:
283 result = EnableWiredHeadset();
284 break;
285 case AudioDeviceType::DEVICE_BLUETOOTH_SCO:
286 result = EnableBtSco();
287 break;
288 case AudioDeviceType::DEVICE_DISABLE:
289 result = DisableAll();
290 break;
291 default:
292 break;
293 }
294 TELEPHONY_LOGI("switch device lock release");
295 return result;
296 }
297
EnableSpeaker()298 bool AudioDeviceManager::EnableSpeaker()
299 {
300 if (isSpeakerAvailable_ && DelayedSingleton<AudioProxy>::GetInstance()->SetSpeakerDevActive()) {
301 TELEPHONY_LOGI("speaker enabled , current audio device : speaker");
302 SetCurrentAudioDevice(AudioDeviceType::DEVICE_SPEAKER);
303 return true;
304 }
305 TELEPHONY_LOGI("enable speaker device failed");
306 return false;
307 }
308
EnableEarpiece()309 bool AudioDeviceManager::EnableEarpiece()
310 {
311 if (isEarpieceAvailable_ && DelayedSingleton<AudioProxy>::GetInstance()->SetEarpieceDevActive()) {
312 TELEPHONY_LOGI("earpiece enabled , current audio device : earpiece");
313 SetCurrentAudioDevice(AudioDeviceType::DEVICE_EARPIECE);
314 return true;
315 }
316 TELEPHONY_LOGI("enable earpiece device failed");
317 return false;
318 }
319
EnableWiredHeadset()320 bool AudioDeviceManager::EnableWiredHeadset()
321 {
322 if (isWiredHeadsetConnected_ && DelayedSingleton<AudioProxy>::GetInstance()->SetWiredHeadsetDevActive()) {
323 TELEPHONY_LOGI("wired headset enabled , current audio device : wired headset");
324 SetCurrentAudioDevice(AudioDeviceType::DEVICE_WIRED_HEADSET);
325 return true;
326 }
327 TELEPHONY_LOGI("enable wired headset device failed");
328 return false;
329 }
330
EnableBtSco()331 bool AudioDeviceManager::EnableBtSco()
332 {
333 if (isBtScoConnected_) {
334 TELEPHONY_LOGI("bluetooth sco enabled , current audio device : bluetooth sco");
335 SetCurrentAudioDevice(AudioDeviceType::DEVICE_BLUETOOTH_SCO);
336 return true;
337 }
338 TELEPHONY_LOGI("enable bluetooth sco device failed");
339 return false;
340 }
341
EnableDistributedCall()342 bool AudioDeviceManager::EnableDistributedCall()
343 {
344 if (isDCallDevConnected_) {
345 AudioDeviceType type = DelayedSingleton<DistributedCallManager>::GetInstance()->GetConnectedDCallType();
346 TELEPHONY_LOGI("distributed call enabled, current audio device: %d", static_cast<int32_t>(type));
347 SetCurrentAudioDevice(type);
348 return true;
349 }
350 TELEPHONY_LOGI("enable distributed call device failed");
351 return false;
352 }
353
DisableAll()354 bool AudioDeviceManager::DisableAll()
355 {
356 audioDeviceType_ = AudioDeviceType::DEVICE_UNKNOWN;
357 isBtScoDevEnable_ = false;
358 isDCallDevEnable_ = false;
359 isWiredHeadsetDevEnable_ = false;
360 isSpeakerDevEnable_ = false;
361 isEarpieceDevEnable_ = false;
362 currentAudioDevice_ = std::make_unique<InactiveDeviceState>();
363 if (currentAudioDevice_ == nullptr) {
364 TELEPHONY_LOGE("make_unique InactiveDeviceState failed");
365 return false;
366 }
367 TELEPHONY_LOGI("current audio device : all audio devices disabled");
368 return true;
369 }
370
SetCurrentAudioDevice(AudioDeviceType deviceType)371 void AudioDeviceManager::SetCurrentAudioDevice(AudioDeviceType deviceType)
372 {
373 if (!IsDistributedAudioDeviceType(deviceType) && IsDistributedAudioDeviceType(audioDeviceType_)) {
374 DelayedSingleton<DistributedCallManager>::GetInstance()->DisconnectDCallDevice();
375 }
376 audioDeviceType_ = deviceType;
377 ReportAudioDeviceChange();
378 }
379
CheckAndSwitchDistributedAudioDevice()380 bool AudioDeviceManager::CheckAndSwitchDistributedAudioDevice()
381 {
382 std::lock_guard<std::mutex> lock(mutex_);
383 DelayedSingleton<DistributedCallManager>::GetInstance()->SetCallState(true);
384 std::vector<AudioDevice>::iterator it = info_.audioDeviceList.begin();
385 while (it != info_.audioDeviceList.end()) {
386 if (it->deviceType == AudioDeviceType::DEVICE_DISTRIBUTED_AUTOMOTIVE) {
387 DelayedSingleton<DistributedCallManager>::GetInstance()->SwitchDCallDeviceAsync(*it);
388 return true;
389 } else {
390 ++it;
391 }
392 }
393 return false;
394 }
395
OnActivedCallDisconnected()396 void AudioDeviceManager::OnActivedCallDisconnected()
397 {
398 DelayedSingleton<DistributedCallManager>::GetInstance()->SetCallState(false);
399 }
400
ReportAudioDeviceChange()401 int32_t AudioDeviceManager::ReportAudioDeviceChange()
402 {
403 if (audioDeviceType_ == AudioDeviceType::DEVICE_UNKNOWN) {
404 audioDeviceType_ = DelayedSingleton<AudioControlManager>::GetInstance()->GetInitAudioDeviceType();
405 info_.currentAudioDevice.deviceType = audioDeviceType_;
406 } else {
407 info_.currentAudioDevice.deviceType = audioDeviceType_;
408 }
409 std::string address = "";
410 if (audioDeviceType_ == AudioDeviceType::DEVICE_BLUETOOTH_SCO) {
411 std::shared_ptr<BluetoothCallManager> bluetoothCallManager = std::make_shared<BluetoothCallManager>();
412 address = bluetoothCallManager->GetConnectedScoAddr();
413 } else if (IsDistributedAudioDeviceType(audioDeviceType_)) {
414 address = DelayedSingleton<DistributedCallManager>::GetInstance()->GetConnectedDCallAddr();
415 }
416 if (address.length() > kMaxAddressLen) {
417 TELEPHONY_LOGE("address is not too long");
418 return TELEPHONY_ERR_ARGUMENT_INVALID;
419 }
420 if (address.length() > 0) {
421 if (memset_s(info_.currentAudioDevice.address, kMaxAddressLen, 0, kMaxAddressLen) != EOK) {
422 TELEPHONY_LOGE("memset_s address fail");
423 return TELEPHONY_ERR_MEMSET_FAIL;
424 }
425 if (memcpy_s(info_.currentAudioDevice.address, kMaxAddressLen, address.c_str(), address.length()) != EOK) {
426 TELEPHONY_LOGE("memcpy_s address fail");
427 return TELEPHONY_ERR_MEMCPY_FAIL;
428 }
429 } else {
430 if (memset_s(info_.currentAudioDevice.address, kMaxAddressLen, 0, kMaxAddressLen) != EOK) {
431 TELEPHONY_LOGE("memset_s address fail");
432 return TELEPHONY_ERR_MEMSET_FAIL;
433 }
434 }
435 return ReportAudioDeviceInfo();
436 }
437
ReportAudioDeviceInfo()438 int32_t AudioDeviceManager::ReportAudioDeviceInfo()
439 {
440 info_.isMuted = DelayedSingleton<AudioProxy>::GetInstance()->IsMicrophoneMute();
441 TELEPHONY_LOGI("report audio device info, currentAudioDeviceType:%{public}d, currentAddress:%{public}s, "
442 "mute:%{public}d", info_.currentAudioDevice.deviceType, info_.currentAudioDevice.address, info_.isMuted);
443 return DelayedSingleton<CallAbilityReportProxy>::GetInstance()->ReportAudioDeviceChange(info_);
444 }
445
GetCurrentAudioDevice()446 AudioDeviceType AudioDeviceManager::GetCurrentAudioDevice()
447 {
448 return audioDeviceType_;
449 }
450
IsEarpieceDevEnable()451 bool AudioDeviceManager::IsEarpieceDevEnable()
452 {
453 return isEarpieceDevEnable_;
454 }
455
IsWiredHeadsetDevEnable()456 bool AudioDeviceManager::IsWiredHeadsetDevEnable()
457 {
458 return isWiredHeadsetDevEnable_;
459 }
460
IsSpeakerDevEnable()461 bool AudioDeviceManager::IsSpeakerDevEnable()
462 {
463 return isSpeakerDevEnable_;
464 }
465
IsBtScoDevEnable()466 bool AudioDeviceManager::IsBtScoDevEnable()
467 {
468 return isBtScoDevEnable_;
469 }
470
IsDCallDevEnable()471 bool AudioDeviceManager::IsDCallDevEnable()
472 {
473 return isDCallDevEnable_;
474 }
475
IsBtScoConnected()476 bool AudioDeviceManager::IsBtScoConnected()
477 {
478 return isBtScoConnected_;
479 }
480
IsDistributedCallConnected()481 bool AudioDeviceManager::IsDistributedCallConnected()
482 {
483 return isDCallDevConnected_;
484 }
485
IsWiredHeadsetConnected()486 bool AudioDeviceManager::IsWiredHeadsetConnected()
487 {
488 return isWiredHeadsetConnected_;
489 }
490
IsEarpieceAvailable()491 bool AudioDeviceManager::IsEarpieceAvailable()
492 {
493 return isEarpieceAvailable_;
494 }
495
IsSpeakerAvailable()496 bool AudioDeviceManager::IsSpeakerAvailable()
497 {
498 return isSpeakerAvailable_;
499 }
500
IsDistributedAudioDeviceType(AudioDeviceType deviceType)501 bool AudioDeviceManager::IsDistributedAudioDeviceType(AudioDeviceType deviceType)
502 {
503 if (((deviceType == AudioDeviceType::DEVICE_DISTRIBUTED_AUTOMOTIVE) ||
504 (deviceType == AudioDeviceType::DEVICE_DISTRIBUTED_PHONE) ||
505 (deviceType == AudioDeviceType::DEVICE_DISTRIBUTED_PAD))) {
506 return true;
507 }
508 return false;
509 }
510
SetDeviceAvailable(AudioDeviceType deviceType,bool available)511 void AudioDeviceManager::SetDeviceAvailable(AudioDeviceType deviceType, bool available)
512 {
513 switch (deviceType) {
514 case AudioDeviceType::DEVICE_SPEAKER:
515 isSpeakerAvailable_ = available;
516 break;
517 case AudioDeviceType::DEVICE_EARPIECE:
518 isEarpieceAvailable_ = available;
519 break;
520 case AudioDeviceType::DEVICE_BLUETOOTH_SCO:
521 isBtScoConnected_ = available;
522 break;
523 case AudioDeviceType::DEVICE_WIRED_HEADSET:
524 isWiredHeadsetConnected_ = available;
525 break;
526 case AudioDeviceType::DEVICE_DISTRIBUTED_AUTOMOTIVE:
527 case AudioDeviceType::DEVICE_DISTRIBUTED_PHONE:
528 case AudioDeviceType::DEVICE_DISTRIBUTED_PAD:
529 isDCallDevConnected_ = available;
530 break;
531 default:
532 break;
533 }
534 }
535 } // namespace Telephony
536 } // namespace OHOS