1 /*
2 * Copyright (C) 2021-2024 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_proxy.h"
17
18 #ifdef SUPPORT_VIBRATOR
19 #include "vibrator_agent.h"
20 #endif
21
22 #include "telephony_log_wrapper.h"
23 #include "call_control_manager.h"
24 #include "bluetooth_call_manager.h"
25 #include "audio_control_manager.h"
26 #include "audio_group_manager.h"
27 #include "distributed_call_manager.h"
28 #include "distributed_communication_manager.h"
29 #include "voip_call.h"
30
31 namespace OHOS {
32 namespace Telephony {
33 #ifdef SUPPORT_VIBRATOR
34 const std::unordered_map<VibrationType, VibratorUsage> VIBRATOR_USAGE_MAP = {
35 {VibrationType::VIBRATION_RINGTONE, USAGE_RING},
36 };
37
38 const std::unordered_map<VibrationType, int32_t> LOOP_COUNT_MAP = {
39 // Default loop count. Ringtone need be repeated.
40 {VibrationType::VIBRATION_RINGTONE, 10},
41 };
42
43 const std::unordered_map<VibrationType, std::string> EFFECT_ID_MAP = {
44 // Default effectId
45 {VibrationType::VIBRATION_RINGTONE, "haptic.ringtone.Dream_It_Possible"},
46 };
47 #endif
48
49 const int32_t NO_DEVICE_VALID = 0;
50 const int32_t RENDERER_FLAG = 0;
51 constexpr uint64_t LOOP_DURATION_2S = 2000 * 1000;
52 const std::string LOCAL_DEVICE = "LocalDevice";
53
AudioProxy()54 AudioProxy::AudioProxy()
55 : deviceCallback_(std::make_shared<AudioDeviceChangeCallback>()),
56 preferredDeviceCallback_(std::make_shared<AudioPreferDeviceChangeCallback>()),
57 audioMicStateChangeCallback_(std::make_shared<AudioMicStateChangeCallback>())
58 {}
59
~AudioProxy()60 AudioProxy::~AudioProxy() {}
61
SetVoiceRingtoneMute(bool isMute)62 bool AudioProxy::SetVoiceRingtoneMute(bool isMute)
63 {
64 return (AudioStandard::AudioSystemManager::GetInstance()->SetVoiceRingtoneMute(isMute) == TELEPHONY_SUCCESS);
65 }
66
SetAudioDeviceChangeCallback()67 int32_t AudioProxy::SetAudioDeviceChangeCallback()
68 {
69 if (deviceCallback_ == nullptr) {
70 TELEPHONY_LOGE("device callback nullptr");
71 return TELEPHONY_ERR_LOCAL_PTR_NULL;
72 }
73 return AudioStandard::AudioSystemManager::GetInstance()->SetDeviceChangeCallback(
74 AudioStandard::DeviceFlag::ALL_DEVICES_FLAG, deviceCallback_);
75 }
76
UnsetDeviceChangeCallback()77 int32_t AudioProxy::UnsetDeviceChangeCallback()
78 {
79 if (deviceCallback_ == nullptr) {
80 TELEPHONY_LOGI("device callback nullptr");
81 return TELEPHONY_SUCCESS;
82 }
83 return AudioStandard::AudioSystemManager::GetInstance()->UnsetDeviceChangeCallback();
84 }
85
SetBluetoothDevActive()86 bool AudioProxy::SetBluetoothDevActive()
87 {
88 if (AudioStandard::AudioSystemManager::GetInstance()->IsDeviceActive(
89 AudioStandard::DeviceType::DEVICE_TYPE_BLUETOOTH_SCO)) {
90 TELEPHONY_LOGI("bluetooth device is already active");
91 return true;
92 }
93 return SetDeviceActive(AudioStandard::DeviceType::DEVICE_TYPE_BLUETOOTH_SCO, true);
94 }
95
SetSpeakerDevActive(bool isActive)96 bool AudioProxy::SetSpeakerDevActive(bool isActive)
97 {
98 return SetDeviceActive(AudioStandard::DeviceType::DEVICE_TYPE_SPEAKER, isActive);
99 }
100
SetWiredHeadsetDevActive()101 bool AudioProxy::SetWiredHeadsetDevActive()
102 {
103 if (!isWiredHeadsetConnected_) {
104 TELEPHONY_LOGE("SetWiredHeadsetDevActive wiredheadset is not connected");
105 return false;
106 }
107 if (AudioStandard::AudioSystemManager::GetInstance()->
108 IsDeviceActive(AudioStandard::DeviceType::DEVICE_TYPE_USB_HEADSET)) {
109 TELEPHONY_LOGI("wired headset device is already active");
110 return true;
111 }
112 return SetDeviceActive(AudioStandard::DeviceType::DEVICE_TYPE_USB_HEADSET, true);
113 }
114
SetEarpieceDevActive()115 bool AudioProxy::SetEarpieceDevActive()
116 {
117 if (isWiredHeadsetConnected_) {
118 TELEPHONY_LOGE("SetEarpieceDevActive wiredheadset is connected, no need set earpiece dev active");
119 return false;
120 }
121 if (AudioStandard::AudioSystemManager::GetInstance()->IsDeviceActive(
122 AudioStandard::DeviceType::DEVICE_TYPE_EARPIECE)) {
123 TELEPHONY_LOGI("earpiece device is already active");
124 return true;
125 }
126 return SetDeviceActive(AudioStandard::DeviceType::DEVICE_TYPE_EARPIECE, true);
127 }
128
StartVibrator()129 int32_t AudioProxy::StartVibrator()
130 {
131 VibrationType type = VibrationType::VIBRATION_RINGTONE;
132 TELEPHONY_LOGI("StartVibrator: for vibration type %{public}d", type);
133 int32_t result = TELEPHONY_SUCCESS;
134 #ifdef SUPPORT_VIBRATOR
135 bool setUsageRet = Sensors::SetUsage(VIBRATOR_USAGE_MAP.at(type));
136 result = Sensors::StartVibrator(EFFECT_ID_MAP.at(type).c_str());
137 TELEPHONY_LOGI("setUsageRet %{public}d, result %{public}d", setUsageRet, result);
138 if (result == TELEPHONY_SUCCESS) {
139 loopFlag_ = true;
140 ffrt::submit([type, this]() {
141 while (loopFlag_) {
142 usleep(LOOP_DURATION_2S);
143 TELEPHONY_LOGI("result %{public}d", Sensors::StartVibrator(EFFECT_ID_MAP.at(type).c_str()));
144 }
145 TELEPHONY_LOGI("cancel result: %{public}d", Sensors::Cancel());
146 });
147 }
148 #endif
149 return result;
150 }
151
StopVibrator()152 int32_t AudioProxy::StopVibrator()
153 {
154 TELEPHONY_LOGI("stop virator.");
155 loopFlag_ = false;
156 return TELEPHONY_SUCCESS;
157 }
158
GetVolume(AudioStandard::AudioVolumeType audioVolumeType)159 int32_t AudioProxy::GetVolume(AudioStandard::AudioVolumeType audioVolumeType)
160 {
161 return AudioStandard::AudioSystemManager::GetInstance()->GetVolume(audioVolumeType);
162 }
163
SetVolume(AudioStandard::AudioVolumeType audioVolumeType,int32_t volume)164 int32_t AudioProxy::SetVolume(AudioStandard::AudioVolumeType audioVolumeType, int32_t volume)
165 {
166 return AudioStandard::AudioSystemManager::GetInstance()->SetVolume(audioVolumeType, volume);
167 }
168
SetVolumeWithDevice(AudioStandard::AudioVolumeType audioVolumeType,int32_t volume,AudioStandard::DeviceType deviceType)169 int32_t AudioProxy::SetVolumeWithDevice(AudioStandard::AudioVolumeType audioVolumeType, int32_t volume,
170 AudioStandard::DeviceType deviceType)
171 {
172 return AudioStandard::AudioSystemManager::GetInstance()->SetVolumeWithDevice(audioVolumeType, volume, deviceType);
173 }
174
SetMaxVolume(AudioStandard::AudioVolumeType audioVolumeType)175 int32_t AudioProxy::SetMaxVolume(AudioStandard::AudioVolumeType audioVolumeType)
176 {
177 int32_t maxVolume = GetMaxVolume(audioVolumeType);
178 return AudioStandard::AudioSystemManager::GetInstance()->SetVolume(audioVolumeType, maxVolume);
179 }
180
SetVolumeAudible()181 void AudioProxy::SetVolumeAudible()
182 {
183 int32_t volume = GetMaxVolume(AudioStandard::AudioVolumeType::STREAM_VOICE_CALL);
184 SetVolume(AudioStandard::AudioVolumeType::STREAM_VOICE_CALL,
185 (int32_t)(volume / VOLUME_AUDIBLE_DIVISOR));
186 }
187
IsStreamActive(AudioStandard::AudioVolumeType audioVolumeType)188 bool AudioProxy::IsStreamActive(AudioStandard::AudioVolumeType audioVolumeType)
189 {
190 return AudioStandard::AudioSystemManager::GetInstance()->IsStreamActive(audioVolumeType);
191 }
192
IsStreamMute(AudioStandard::AudioVolumeType audioVolumeType)193 bool AudioProxy::IsStreamMute(AudioStandard::AudioVolumeType audioVolumeType)
194 {
195 return AudioStandard::AudioSystemManager::GetInstance()->IsStreamMute(audioVolumeType);
196 }
197
GetMaxVolume(AudioStandard::AudioVolumeType audioVolumeType)198 int32_t AudioProxy::GetMaxVolume(AudioStandard::AudioVolumeType audioVolumeType)
199 {
200 return AudioStandard::AudioSystemManager::GetInstance()->GetMaxVolume(audioVolumeType);
201 }
202
GetMinVolume(AudioStandard::AudioVolumeType audioVolumeType)203 int32_t AudioProxy::GetMinVolume(AudioStandard::AudioVolumeType audioVolumeType)
204 {
205 return AudioStandard::AudioSystemManager::GetInstance()->GetMinVolume(audioVolumeType);
206 }
207
IsMicrophoneMute()208 bool AudioProxy::IsMicrophoneMute()
209 {
210 std::shared_ptr<AudioStandard::AudioGroupManager> audioGroupManager =
211 AudioStandard::AudioSystemManager::GetInstance()->GetGroupManager(AudioStandard::DEFAULT_VOLUME_GROUP_ID);
212 if (audioGroupManager == nullptr) {
213 TELEPHONY_LOGE("IsMicrophoneMute fail, audioGroupManager is nullptr");
214 return false;
215 }
216 return audioGroupManager->IsMicrophoneMute();
217 }
218
SetMicrophoneMute(bool mute)219 bool AudioProxy::SetMicrophoneMute(bool mute)
220 {
221 std::shared_ptr<AudioStandard::AudioGroupManager> audioGroupManager =
222 AudioStandard::AudioSystemManager::GetInstance()->GetGroupManager(AudioStandard::DEFAULT_VOLUME_GROUP_ID);
223 if (audioGroupManager == nullptr) {
224 TELEPHONY_LOGE("SetMicrophoneMute fail, audioGroupManager is nullptr");
225 return false;
226 }
227 int32_t muteResult = audioGroupManager->SetMicrophoneMute(mute);
228 TELEPHONY_LOGI("set microphone mute result : %{public}d, %{public}d ", muteResult, mute);
229 return (muteResult == TELEPHONY_SUCCESS);
230 }
231
GetRingerMode() const232 AudioStandard::AudioRingerMode AudioProxy::GetRingerMode() const
233 {
234 std::shared_ptr<AudioStandard::AudioGroupManager> audioGroupManager =
235 AudioStandard::AudioSystemManager::GetInstance()->GetGroupManager(AudioStandard::DEFAULT_VOLUME_GROUP_ID);
236 if (audioGroupManager == nullptr) {
237 TELEPHONY_LOGE("GetRingerMode fail, audioGroupManager is nullptr");
238 return AudioStandard::AudioRingerMode::RINGER_MODE_NORMAL;
239 }
240 return audioGroupManager->GetRingerMode();
241 }
242
OnDeviceChange(const AudioStandard::DeviceChangeAction & deviceChangeAction)243 void AudioDeviceChangeCallback::OnDeviceChange(const AudioStandard::DeviceChangeAction &deviceChangeAction)
244 {
245 TELEPHONY_LOGI("AudioDeviceChangeCallback::OnDeviceChange enter");
246 for (auto &audioDeviceDescriptor : deviceChangeAction.deviceDescriptors) {
247 if (audioDeviceDescriptor->deviceType_ == AudioStandard::DEVICE_TYPE_WIRED_HEADSET ||
248 audioDeviceDescriptor->deviceType_ == AudioStandard::DEVICE_TYPE_WIRED_HEADPHONES ||
249 audioDeviceDescriptor->deviceType_ == AudioStandard::DEVICE_TYPE_USB_HEADSET) {
250 if (deviceChangeAction.type == AudioStandard::CONNECT) {
251 TELEPHONY_LOGI("WiredHeadset connected");
252 DelayedSingleton<AudioProxy>::GetInstance()->SetWiredHeadsetState(true);
253 DelayedSingleton<AudioDeviceManager>::GetInstance()->AddAudioDeviceList(
254 "", AudioDeviceType::DEVICE_WIRED_HEADSET, "");
255 } else {
256 TELEPHONY_LOGI("WiredHeadset disConnected");
257 DelayedSingleton<AudioProxy>::GetInstance()->SetWiredHeadsetState(false);
258 DelayedSingleton<AudioDeviceManager>::GetInstance()->RemoveAudioDeviceList(
259 "", AudioDeviceType::DEVICE_WIRED_HEADSET);
260 DelayedSingleton<AudioDeviceManager>::GetInstance()->ProcessEvent(
261 AudioEvent::WIRED_HEADSET_DISCONNECTED);
262 }
263 }
264 }
265 }
266
GetDefaultTonePath() const267 std::string AudioProxy::GetDefaultTonePath() const
268 {
269 return defaultTonePath_;
270 }
271
GetDefaultDtmfPath() const272 std::string AudioProxy::GetDefaultDtmfPath() const
273 {
274 return defaultDtmfPath_;
275 }
276
SetWiredHeadsetState(bool isConnected)277 void AudioProxy::SetWiredHeadsetState(bool isConnected)
278 {
279 isWiredHeadsetConnected_ = isConnected;
280 }
281
SetWirelessAudioDevice(AudioDevice & device,AudioStandard::DeviceType deviceType,const std::vector<std::shared_ptr<AudioStandard::AudioDeviceDescriptor>> & desc)282 static int32_t SetWirelessAudioDevice(AudioDevice &device, AudioStandard::DeviceType deviceType,
283 const std::vector<std::shared_ptr<AudioStandard::AudioDeviceDescriptor>> &desc)
284 {
285 if (deviceType == AudioStandard::DEVICE_TYPE_BLUETOOTH_SCO) {
286 device.deviceType = AudioDeviceType::DEVICE_BLUETOOTH_SCO;
287 } else if (deviceType == AudioStandard::DEVICE_TYPE_NEARLINK) {
288 device.deviceType = AudioDeviceType::DEVICE_NEARLINK;
289 } else {
290 device.deviceType = AudioDeviceType::DEVICE_BLUETOOTH_HEARING_AID;
291 }
292 if (memset_s(&device.address, kMaxAddressLen + 1, 0, kMaxAddressLen + 1) != EOK ||
293 memset_s(&device.deviceName, kMaxDeviceNameLen + 1, 0, kMaxDeviceNameLen + 1) != EOK) {
294 TELEPHONY_LOGE("memset_s address fail");
295 return TELEPHONY_ERR_MEMSET_FAIL;
296 }
297 if (memcpy_s(device.address, kMaxAddressLen, desc[0]->macAddress_.c_str(),
298 desc[0]->macAddress_.length()) != EOK ||
299 memcpy_s(device.deviceName, kMaxDeviceNameLen, desc[0]->deviceName_.c_str(),
300 desc[0]->deviceName_.length()) != EOK) {
301 TELEPHONY_LOGE("memcpy_s address fail");
302 return TELEPHONY_ERR_MEMCPY_FAIL;
303 }
304 return TELEPHONY_SUCCESS;
305 }
306
GetPreferredOutputAudioDevice(AudioDevice & device,bool isNeedCurrentDevice)307 int32_t AudioProxy::GetPreferredOutputAudioDevice(AudioDevice &device, bool isNeedCurrentDevice)
308 {
309 AudioStandard::AudioRendererInfo rendererInfo;
310 rendererInfo.contentType = AudioStandard::ContentType::CONTENT_TYPE_UNKNOWN;
311 rendererInfo.streamUsage = isNeedCurrentDevice ?
312 AudioStandard::StreamUsage::STREAM_USAGE_INVALID :
313 AudioStandard::StreamUsage::STREAM_USAGE_VOICE_MODEM_COMMUNICATION;
314 rendererInfo.rendererFlags = RENDERER_FLAG;
315 std::vector<std::shared_ptr<AudioStandard::AudioDeviceDescriptor>> desc;
316 int32_t ret =
317 AudioStandard::AudioRoutingManager::GetInstance()->GetPreferredOutputDeviceForRendererInfo(rendererInfo, desc);
318 if (ret != TELEPHONY_SUCCESS) {
319 TELEPHONY_LOGE("GetPreferredOutputDeviceForRendererInfo fail");
320 return CALL_ERR_AUDIO_OPERATE_FAILED;
321 }
322 if (desc.size() == NO_DEVICE_VALID) {
323 TELEPHONY_LOGE("desc size is zero");
324 return CALL_ERR_AUDIO_OPERATE_FAILED;
325 }
326 switch (desc[0]->deviceType_) {
327 case AudioStandard::DEVICE_TYPE_NEARLINK:
328 case AudioStandard::DEVICE_TYPE_BLUETOOTH_SCO:
329 case AudioStandard::DEVICE_TYPE_HEARING_AID: {
330 int32_t result = SetWirelessAudioDevice(device, desc[0]->deviceType_, desc);
331 if (result != TELEPHONY_SUCCESS) {
332 return result;
333 }
334 break;
335 }
336 case AudioStandard::DEVICE_TYPE_EARPIECE:
337 device.deviceType = AudioDeviceType::DEVICE_EARPIECE;
338 break;
339 case AudioStandard::DEVICE_TYPE_SPEAKER:
340 device.deviceType = AudioDeviceType::DEVICE_SPEAKER;
341 break;
342 case AudioStandard::DEVICE_TYPE_WIRED_HEADSET:
343 case AudioStandard::DEVICE_TYPE_WIRED_HEADPHONES:
344 case AudioStandard::DEVICE_TYPE_USB_HEADSET:
345 device.deviceType = AudioDeviceType::DEVICE_WIRED_HEADSET;
346 break;
347 default:
348 break;
349 }
350 return TELEPHONY_SUCCESS;
351 }
352
SetAudioPreferDeviceChangeCallback()353 int32_t AudioProxy::SetAudioPreferDeviceChangeCallback()
354 {
355 if (preferredDeviceCallback_ == nullptr) {
356 TELEPHONY_LOGE("preferredDeviceCallback_ is nullptr");
357 return TELEPHONY_ERR_LOCAL_PTR_NULL;
358 }
359 AudioStandard::AudioRendererInfo rendererInfo;
360 rendererInfo.contentType = AudioStandard::ContentType::CONTENT_TYPE_SPEECH;
361 rendererInfo.streamUsage = AudioStandard::StreamUsage::STREAM_USAGE_VOICE_MODEM_COMMUNICATION;
362 rendererInfo.rendererFlags = RENDERER_FLAG;
363 int32_t ret = AudioStandard::AudioRoutingManager::GetInstance()->SetPreferredOutputDeviceChangeCallback(
364 rendererInfo, preferredDeviceCallback_);
365 if (ret != TELEPHONY_SUCCESS) {
366 TELEPHONY_LOGE("SetPreferredOutputDeviceChangeCallback fail");
367 return CALL_ERR_AUDIO_OPERATE_FAILED;
368 }
369 return TELEPHONY_SUCCESS;
370 }
371
UnsetAudioPreferDeviceChangeCallback()372 int32_t AudioProxy::UnsetAudioPreferDeviceChangeCallback()
373 {
374 if (preferredDeviceCallback_ == nullptr) {
375 TELEPHONY_LOGE("preferredDeviceCallback_ is nullptr");
376 return TELEPHONY_ERR_LOCAL_PTR_NULL;
377 }
378 int32_t ret = AudioStandard::AudioRoutingManager::GetInstance()->UnsetPreferredOutputDeviceChangeCallback();
379 if (ret != TELEPHONY_SUCCESS) {
380 TELEPHONY_LOGE("UnsetPreferredOutputDeviceChangeCallback fail");
381 return CALL_ERR_AUDIO_OPERATE_FAILED;
382 }
383 return TELEPHONY_SUCCESS;
384 }
385
ProcessVoipCallOutputDeviceUpdated()386 bool AudioPreferDeviceChangeCallback::ProcessVoipCallOutputDeviceUpdated()
387 {
388 if (!DelayedSingleton<CallControlManager>::GetInstance()->HasVoipCall()) {
389 return false;
390 }
391 AudioDevice device = {
392 .deviceType = AudioDeviceType::DEVICE_EARPIECE,
393 .address = { 0 },
394 };
395 if (DelayedSingleton<AudioProxy>::GetInstance()->GetPreferredOutputAudioDevice(device, true) !=
396 TELEPHONY_SUCCESS) {
397 return false;
398 }
399 DelayedSingleton<AudioDeviceManager>::GetInstance()->SetCurrentAudioDevice(device);
400 return true;
401 }
402
OnPreferredOutputDeviceUpdated(const std::vector<std::shared_ptr<AudioStandard::AudioDeviceDescriptor>> & desc)403 void AudioPreferDeviceChangeCallback::OnPreferredOutputDeviceUpdated(
404 const std::vector<std::shared_ptr<AudioStandard::AudioDeviceDescriptor>> &desc)
405 {
406 bool hasCall = DelayedSingleton<CallControlManager>::GetInstance()->HasCall() ||
407 DelayedSingleton<CallControlManager>::GetInstance()->HasVoipCall();
408 if (!hasCall) {
409 TELEPHONY_LOGE("no call exists, on preferred audio device update failed");
410 return;
411 }
412 AudioDevice device;
413 if (desc.size() == NO_DEVICE_VALID) {
414 TELEPHONY_LOGE("desc size is zero");
415 return;
416 }
417 if (DelayedSingleton<DistributedCommunicationManager>::GetInstance()->IsAudioOnSink() &&
418 !DelayedSingleton<DistributedCommunicationManager>::GetInstance()->IsSinkRole()) {
419 TELEPHONY_LOGI("has already switch to distributed communication device");
420 return;
421 }
422 TELEPHONY_LOGI("OnPreferredOutputDeviceUpdated type: %{public}d", desc[0]->deviceType_);
423
424 if (IsDistributedDeviceSelected(desc)) {
425 return;
426 }
427 if (ProcessVoipCallOutputDeviceUpdated()) {
428 return;
429 }
430
431 switch (desc[0]->deviceType_) {
432 case AudioStandard::DEVICE_TYPE_NEARLINK:
433 case AudioStandard::DEVICE_TYPE_BLUETOOTH_SCO:
434 case AudioStandard::DEVICE_TYPE_HEARING_AID:
435 if (SetWirelessAudioDevice(device, desc[0]->deviceType_, desc) != TELEPHONY_SUCCESS) {
436 return;
437 }
438 DelayedSingleton<AudioDeviceManager>::GetInstance()->SetCurrentAudioDevice(device);
439 break;
440 case AudioStandard::DEVICE_TYPE_EARPIECE:
441 device.deviceType = AudioDeviceType::DEVICE_EARPIECE;
442 DelayedSingleton<AudioDeviceManager>::GetInstance()->SetCurrentAudioDevice(device.deviceType);
443 break;
444 case AudioStandard::DEVICE_TYPE_SPEAKER:
445 device.deviceType = AudioDeviceType::DEVICE_SPEAKER;
446 DelayedSingleton<AudioDeviceManager>::GetInstance()->SetCurrentAudioDevice(device.deviceType);
447 break;
448 case AudioStandard::DEVICE_TYPE_WIRED_HEADSET:
449 case AudioStandard::DEVICE_TYPE_WIRED_HEADPHONES:
450 case AudioStandard::DEVICE_TYPE_USB_HEADSET:
451 device.deviceType = AudioDeviceType::DEVICE_WIRED_HEADSET;
452 DelayedSingleton<AudioDeviceManager>::GetInstance()->AddAudioDeviceList(
453 "", AudioDeviceType::DEVICE_WIRED_HEADSET, "");
454 DelayedSingleton<AudioDeviceManager>::GetInstance()->SetCurrentAudioDevice(device.deviceType);
455 break;
456 default:
457 break;
458 }
459 TELEPHONY_LOGI("OnPreferredOutputDeviceUpdated, type: %{public}d", static_cast<int32_t>(desc[0]->deviceType_));
460 if (desc[0]->deviceType_ != AudioStandard::DEVICE_TYPE_SPEAKER) {
461 AudioDeviceType deviceType = static_cast<AudioDeviceType>(desc[0]->deviceType_);
462 DelayedSingleton<AudioControlManager>::GetInstance()->UpdateDeviceTypeForCrs(deviceType);
463 }
464 }
465
IsDistributedDeviceSelected(const std::vector<std::shared_ptr<AudioStandard::AudioDeviceDescriptor>> & desc)466 bool AudioPreferDeviceChangeCallback::IsDistributedDeviceSelected(
467 const std::vector<std::shared_ptr<AudioStandard::AudioDeviceDescriptor>> &desc)
468 {
469 size_t size = desc.size();
470 TELEPHONY_LOGI("desc size is: %{public}zu", size);
471 for (auto iter = desc.begin(); iter != desc.end(); iter++) {
472 std::string networkId = (*iter)->networkId_;
473 if (LOCAL_DEVICE != networkId && (*iter)->deviceType_ == AudioStandard::DEVICE_TYPE_SPEAKER) {
474 TELEPHONY_LOGI("distributed device networkId.");
475 return true;
476 }
477 if (DelayedSingleton<DistributedCallManager>::GetInstance()->IsDistributedCarDeviceOnline() &&
478 LOCAL_DEVICE == networkId && (*iter)->deviceType_ == AudioStandard::DEVICE_TYPE_EARPIECE) {
479 TELEPHONY_LOGI("filter local earpiece.");
480 return true;
481 }
482 }
483 return false;
484 }
485
SetAudioMicStateChangeCallback()486 int32_t AudioProxy::SetAudioMicStateChangeCallback()
487 {
488 if (audioMicStateChangeCallback_ == nullptr) {
489 TELEPHONY_LOGE("audioMicStateChangeCallback_ is nullptr");
490 return TELEPHONY_ERR_LOCAL_PTR_NULL;
491 }
492 std::shared_ptr<AudioStandard::AudioGroupManager> audioGroupManager =
493 AudioStandard::AudioSystemManager::GetInstance()->GetGroupManager(AudioStandard::DEFAULT_VOLUME_GROUP_ID);
494 if (audioGroupManager == nullptr) {
495 TELEPHONY_LOGE("SetAudioMicStateChangeCallback fail, audioGroupManager is nullptr");
496 return false;
497 }
498 int32_t ret = audioGroupManager->SetMicStateChangeCallback(audioMicStateChangeCallback_);
499 if (ret != TELEPHONY_SUCCESS) {
500 TELEPHONY_LOGE("SetPreferredOutputDeviceChangeCallback fail");
501 return CALL_ERR_AUDIO_OPERATE_FAILED;
502 }
503 return TELEPHONY_SUCCESS;
504 }
505
UnsetAudioMicStateChangeCallback()506 int32_t AudioProxy::UnsetAudioMicStateChangeCallback()
507 {
508 if (audioMicStateChangeCallback_ == nullptr) {
509 TELEPHONY_LOGE("audioMicStateChangeCallback_ is nullptr");
510 return TELEPHONY_ERR_LOCAL_PTR_NULL;
511 }
512 std::shared_ptr<AudioStandard::AudioGroupManager> audioGroupManager =
513 AudioStandard::AudioSystemManager::GetInstance()->GetGroupManager(AudioStandard::DEFAULT_VOLUME_GROUP_ID);
514 if (audioGroupManager == nullptr) {
515 TELEPHONY_LOGE("UnsetAudioMicStateChangeCallback fail, audioGroupManager is nullptr");
516 return false;
517 }
518 int32_t ret = audioGroupManager->UnsetMicStateChangeCallback(audioMicStateChangeCallback_);
519 if (ret != TELEPHONY_SUCCESS) {
520 TELEPHONY_LOGE("UnsetAudioMicStateChangeCallback fail");
521 return CALL_ERR_AUDIO_OPERATE_FAILED;
522 }
523 return TELEPHONY_SUCCESS;
524 }
525
OnMicStateUpdated(const AudioStandard::MicStateChangeEvent & micStateChangeEvent)526 void AudioMicStateChangeCallback::OnMicStateUpdated(
527 const AudioStandard::MicStateChangeEvent &micStateChangeEvent)
528 {
529 std::shared_ptr<AudioStandard::AudioGroupManager> audioGroupManager =
530 AudioStandard::AudioSystemManager::GetInstance()->GetGroupManager(AudioStandard::DEFAULT_VOLUME_GROUP_ID);
531 if (audioGroupManager == nullptr) {
532 TELEPHONY_LOGE("OnMicStateUpdated fail, audioGroupManager is nullptr");
533 return;
534 }
535 DelayedSingleton<CallControlManager>::GetInstance()->SetMuted(audioGroupManager->IsMicrophoneMute());
536 }
537
GetSystemRingVolumeInDb(int32_t volumeLevel)538 float AudioProxy::GetSystemRingVolumeInDb(int32_t volumeLevel)
539 {
540 std::shared_ptr<AudioStandard::AudioGroupManager> audioGroupManager =
541 AudioStandard::AudioSystemManager::GetInstance()->GetGroupManager(AudioStandard::DEFAULT_VOLUME_GROUP_ID);
542 if (audioGroupManager == nullptr) {
543 TELEPHONY_LOGE("GetSystemRingVolumeInDb fail, audioGroupManager is nullptr");
544 return 0;
545 }
546 return audioGroupManager->GetSystemVolumeInDb(AudioStandard::AudioVolumeType::STREAM_RING,
547 volumeLevel, AudioStandard::DEVICE_TYPE_SPEAKER);
548 }
549
SetDeviceActive(AudioStandard::DeviceType deviceType,bool flag)550 bool AudioProxy::SetDeviceActive(AudioStandard::DeviceType deviceType, bool flag)
551 {
552 sptr<CallBase> call = CallObjectManager::GetAudioLiveCall();
553 if (call == nullptr) {
554 TELEPHONY_LOGE("SetDeviceActive failed, call is nullptr");
555 return false;
556 }
557 if (call->GetCallType() == CallType::TYPE_VOIP) {
558 sptr<VoIPCall> voipCall = reinterpret_cast<VoIPCall *>(call.GetRefPtr());
559 if (AudioStandard::AudioSystemManager::GetInstance()->SetDeviceActive(
560 deviceType, flag, voipCall->GetVoipUid()) != ERR_NONE) {
561 TELEPHONY_LOGE("SetDeviceActive voip devicetype :%{public}d failed", deviceType);
562 return false;
563 }
564 return true;
565 }
566 if (AudioStandard::AudioSystemManager::GetInstance()->SetDeviceActive(deviceType, flag) != ERR_NONE) {
567 TELEPHONY_LOGE("SetDeviceActive devicetype :%{public}d failed", deviceType);
568 return false;
569 }
570 return true;
571 }
572 } // namespace Telephony
573 } // namespace OHOS
574