• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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