• 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_control_manager.h"
17 
18 #include "call_ability_report_proxy.h"
19 #include "call_control_manager.h"
20 #include "call_dialog.h"
21 #include "call_state_processor.h"
22 #include "common_type.h"
23 #include "distributed_call_manager.h"
24 #include "telephony_log_wrapper.h"
25 #include "audio_system_manager.h"
26 #include "audio_routing_manager.h"
27 #include "audio_device_info.h"
28 #include "audio_info.h"
29 #include "audio_device_descriptor.h"
30 #include "voip_call_connection.h"
31 #include "settings_datashare_helper.h"
32 #include "distributed_communication_manager.h"
33 #include "os_account_manager.h"
34 #include "ringtone_player.h"
35 #include "int_wrapper.h"
36 
37 namespace OHOS {
38 namespace Telephony {
39 using namespace AudioStandard;
40 constexpr int32_t DTMF_PLAY_TIME = 30;
41 constexpr int32_t VOICE_TYPE = 0;
42 constexpr int32_t CRS_TYPE = 2;
43 constexpr int32_t CALL_ENDED_PLAY_TIME = 300;
44 constexpr uint64_t UNMUTE_SOUNDTONE_DELAY_TIME = 500000;
45 static constexpr const char *VIDEO_RING_PATH_FIX_TAIL = ".mp4";
46 constexpr int32_t VIDEO_RING_PATH_FIX_TAIL_LENGTH = 4;
47 static constexpr const char *SYSTEM_VIDEO_RING = "system_video_ring";
48 const int16_t MIN_MULITY_ACTIVE_CALL_COUNT = 1;
49 const int16_t MIN_DC_MULITY_ACTIVE_CALL_COUNT = 2;
50 
AudioControlManager()51 AudioControlManager::AudioControlManager()
52     : isLocalRingbackNeeded_(false), ring_(nullptr), tone_(nullptr), sound_(nullptr)
53 {}
54 
~AudioControlManager()55 AudioControlManager::~AudioControlManager()
56 {}
57 
Init()58 void AudioControlManager::Init()
59 {
60     DelayedSingleton<AudioDeviceManager>::GetInstance()->Init();
61     DelayedSingleton<AudioSceneProcessor>::GetInstance()->Init();
62 }
63 
UnInit()64 void AudioControlManager::UnInit()
65 {
66     DelayedSingleton<AudioProxy>::GetInstance()->UnsetDeviceChangeCallback();
67     DelayedSingleton<AudioProxy>::GetInstance()->UnsetAudioPreferDeviceChangeCallback();
68     DelayedSingleton<AudioProxy>::GetInstance()->UnsetAudioMicStateChangeCallback();
69 }
70 
UpdateForegroundLiveCall()71 void AudioControlManager::UpdateForegroundLiveCall()
72 {
73     int32_t callId = DelayedSingleton<CallStateProcessor>::GetInstance()->GetAudioForegroundLiveCall();
74     if (callId == INVALID_CALLID) {
75         frontCall_ = nullptr;
76         DelayedSingleton<AudioProxy>::GetInstance()->SetMicrophoneMute(false);
77         TELEPHONY_LOGE("callId is invalid");
78         return;
79     }
80 
81     sptr<CallBase> liveCall = CallObjectManager::GetOneCallObject(callId);
82     if (liveCall == nullptr) {
83         TELEPHONY_LOGE("liveCall is nullptr");
84         return;
85     }
86     if (liveCall->GetTelCallState() == TelCallState::CALL_STATUS_ACTIVE ||
87         liveCall->GetTelCallState() == TelCallState::CALL_STATUS_DIALING ||
88         liveCall->GetTelCallState() == TelCallState::CALL_STATUS_ALERTING) {
89         if (frontCall_ == nullptr) {
90             frontCall_ = liveCall;
91         } else {
92             int32_t frontCallId = frontCall_->GetCallID();
93             int32_t liveCallId = liveCall->GetCallID();
94             if (frontCallId != liveCallId || (frontCall_->GetCallIndex() == 0 && liveCall->GetCallIndex() != 0)) {
95                 frontCall_ = liveCall;
96             }
97         }
98         bool frontCallMute = frontCall_->IsMuted();
99         bool currentMute = DelayedSingleton<AudioProxy>::GetInstance()->IsMicrophoneMute();
100         if (frontCallMute != currentMute) {
101             SetMute(frontCallMute);
102         }
103     }
104 }
105 
HandleCallStateUpdatedForVoip(sptr<CallBase> & callObjectPtr,TelCallState priorState,TelCallState nextState)106 void AudioControlManager::HandleCallStateUpdatedForVoip(
107     sptr<CallBase> &callObjectPtr, TelCallState priorState, TelCallState nextState)
108 {
109     TELEPHONY_LOGI("control audio for voip start, callId:%{public}d, priorState:%{public}d, nextState:%{public}d",
110         callObjectPtr->GetCallID(), priorState, nextState);
111     if (priorState == TelCallState::CALL_STATUS_INCOMING && nextState == TelCallState::CALL_STATUS_INCOMING) {
112         if (DelayedSingleton<CallObjectManager>::GetInstance()->GetVoipCallNum() == 1) {
113             AudioDevice device = {
114                 .deviceType = AudioDeviceType::DEVICE_EARPIECE,
115                 .address = { 0 },
116             };
117             if (DelayedSingleton<AudioProxy>::GetInstance()->GetPreferredOutputAudioDevice(device, true) ==
118                 TELEPHONY_SUCCESS) {
119                 DelayedSingleton<AudioDeviceManager>::GetInstance()->SetCurrentAudioDevice(device.deviceType);
120                 TELEPHONY_LOGI("control audio for voip finish, callId:%{public}d", callObjectPtr->GetCallID());
121             } else {
122                 TELEPHONY_LOGE("current audio device nullptr when control audio for voip");
123             }
124         }
125     }
126 }
127 
CallStateUpdated(sptr<CallBase> & callObjectPtr,TelCallState priorState,TelCallState nextState)128 void AudioControlManager::CallStateUpdated(
129     sptr<CallBase> &callObjectPtr, TelCallState priorState, TelCallState nextState)
130 {
131     if (callObjectPtr == nullptr) {
132         TELEPHONY_LOGE("call object nullptr");
133         return;
134     }
135     if (callObjectPtr->GetCallType() == CallType::TYPE_VOIP) {
136         HandleCallStateUpdatedForVoip(callObjectPtr, priorState, nextState);
137         return;
138     }
139     std::lock_guard<std::mutex> lock(mutex_);
140     if (totalCalls_.count(callObjectPtr) == 0) {
141         int32_t callId = callObjectPtr->GetCallID();
142         TelCallState callState = callObjectPtr->GetTelCallState();
143         TELEPHONY_LOGI("add new call, callid:%{public}d , callstate:%{public}d", callId, callState);
144         totalCalls_.insert(callObjectPtr);
145     }
146     HandleCallStateUpdated(callObjectPtr, priorState, nextState);
147     if (nextState == TelCallState::CALL_STATUS_DISCONNECTED && totalCalls_.count(callObjectPtr) > 0) {
148         totalCalls_.erase(callObjectPtr);
149     }
150     UpdateForegroundLiveCall();
151 }
152 
VideoStateUpdated(sptr<CallBase> & callObjectPtr,VideoStateType priorVideoState,VideoStateType nextVideoState)153 void AudioControlManager::VideoStateUpdated(
154     sptr<CallBase> &callObjectPtr, VideoStateType priorVideoState, VideoStateType nextVideoState)
155 {
156     if (callObjectPtr == nullptr) {
157         TELEPHONY_LOGE("call object nullptr");
158         return;
159     }
160     if (callObjectPtr->GetCallType() != CallType::TYPE_IMS &&
161         callObjectPtr->GetCallType() != CallType::TYPE_BLUETOOTH) {
162         TELEPHONY_LOGE("other call not need control audio");
163         return;
164     }
165     AudioDevice device = {
166         .deviceType = AudioDeviceType::DEVICE_SPEAKER,
167         .address = { 0 },
168     };
169     AudioDeviceType initDeviceType = GetInitAudioDeviceType();
170     initCrsDeviceType_ = initDeviceType;
171     TELEPHONY_LOGI("before CRS, initDeviceType = %{public}d", initCrsDeviceType_);
172     if (callObjectPtr->GetCrsType() == CRS_TYPE && !IsVoIPCallActived()) {
173         AudioStandard::AudioRingerMode ringMode = DelayedSingleton<AudioProxy>::GetInstance()->GetRingerMode();
174         if (ringMode != AudioStandard::AudioRingerMode::RINGER_MODE_NORMAL) {
175             if (IsInEarAudioDevice(initDeviceType)) {
176                 device.deviceType = initDeviceType;
177                 SetAudioDevice(device);
178                 TELEPHONY_LOGI("crs reset to initDeviceType");
179             }
180         } else {
181             TELEPHONY_LOGI("crs ring tone should be speaker");
182             SetAudioDevice(device);
183         }
184         return;
185     }
186     CheckTypeAndSetAudioDevice(callObjectPtr, priorVideoState, nextVideoState, initDeviceType, device);
187 }
188 
IsInEarAudioDevice(AudioDeviceType initDeviceType)189 bool AudioControlManager::IsInEarAudioDevice(AudioDeviceType initDeviceType)
190 {
191     return (initDeviceType == AudioDeviceType::DEVICE_WIRED_HEADSET ||
192         initDeviceType == AudioDeviceType::DEVICE_BLUETOOTH_SCO ||
193         initDeviceType == AudioDeviceType::DEVICE_NEARLINK ||
194         initDeviceType == AudioDeviceType::DEVICE_BLUETOOTH_HEARING_AID);
195 }
196 
IsExternalAudioDevice(AudioDeviceType initDeviceType)197 bool AudioControlManager::IsExternalAudioDevice(AudioDeviceType initDeviceType)
198 {
199     return (initDeviceType == AudioDeviceType::DEVICE_WIRED_HEADSET ||
200         initDeviceType == AudioDeviceType::DEVICE_BLUETOOTH_SCO ||
201         initDeviceType == AudioDeviceType::DEVICE_NEARLINK ||
202         initDeviceType == AudioDeviceType::DEVICE_DISTRIBUTED_AUTOMOTIVE ||
203         initDeviceType == AudioDeviceType::DEVICE_BLUETOOTH_HEARING_AID);
204 }
205 
CheckTypeAndSetAudioDevice(sptr<CallBase> & callObjectPtr,VideoStateType priorVideoState,VideoStateType nextVideoState,AudioDeviceType & initDeviceType,AudioDevice & device)206 void AudioControlManager::CheckTypeAndSetAudioDevice(sptr<CallBase> &callObjectPtr, VideoStateType priorVideoState,
207     VideoStateType nextVideoState, AudioDeviceType &initDeviceType, AudioDevice &device)
208 {
209     TelCallState telCallState = callObjectPtr->GetTelCallState();
210     if (!IsVideoCall(priorVideoState) && IsVideoCall(nextVideoState) &&
211         (telCallState != TelCallState::CALL_STATUS_INCOMING && telCallState != TelCallState::CALL_STATUS_WAITING)) {
212         if (callObjectPtr->GetOriginalCallType() == VOICE_TYPE &&
213             (telCallState == TelCallState::CALL_STATUS_DIALING || telCallState == TelCallState::CALL_STATUS_ALERTING ||
214             telCallState == TelCallState::CALL_STATUS_DISCONNECTED)) {
215             TELEPHONY_LOGI("before modify set device to EARPIECE, now not set");
216             return;
217         }
218         if (IsExternalAudioDevice(initDeviceType)) {
219             device.deviceType = initDeviceType;
220         }
221         TELEPHONY_LOGI("set device type, type: %{public}d", static_cast<int32_t>(device.deviceType));
222         SetAudioDevice(device);
223     } else if (!DelayedSingleton<DistributedCommunicationManager>::GetInstance()->IsAudioOnSink() &&
224                !isSetAudioDeviceByUser_ && IsVideoCall(priorVideoState) && !IsVideoCall(nextVideoState)) {
225         device.deviceType = AudioDeviceType::DEVICE_EARPIECE;
226         if (IsExternalAudioDevice(initDeviceType)) {
227             device.deviceType = initDeviceType;
228         }
229         TELEPHONY_LOGI("set device type, type: %{public}d", static_cast<int32_t>(device.deviceType));
230         SetAudioDevice(device);
231     }
232 }
233 
UpdateDeviceTypeForVideoOrSatelliteCall()234 void AudioControlManager::UpdateDeviceTypeForVideoOrSatelliteCall()
235 {
236     sptr<CallBase> foregroundCall = CallObjectManager::GetForegroundCall();
237     if (foregroundCall == nullptr) {
238         TELEPHONY_LOGE("call object nullptr");
239         return;
240     }
241     if (foregroundCall->GetCallType() != CallType::TYPE_IMS ||
242         foregroundCall->GetCallType() != CallType::TYPE_SATELLITE ||
243         foregroundCall->GetCallType() != CallType::TYPE_BLUETOOTH) {
244         TELEPHONY_LOGE("other call not need control audio");
245         return;
246     }
247     AudioDevice device = {
248         .deviceType = AudioDeviceType::DEVICE_SPEAKER,
249         .address = { 0 },
250     };
251     AudioDeviceType initDeviceType = GetInitAudioDeviceType();
252     if (IsVideoCall(foregroundCall->GetVideoStateType()) ||
253         foregroundCall->GetCallType() == CallType::TYPE_SATELLITE) {
254         if (IsExternalAudioDevice(initDeviceType)) {
255             device.deviceType = initDeviceType;
256         }
257         TELEPHONY_LOGI("set device type, type: %{public}d", static_cast<int32_t>(device.deviceType));
258         SetAudioDevice(device);
259     }
260 }
261 
UpdateDeviceTypeForCrs(AudioDeviceType deviceType)262 void AudioControlManager::UpdateDeviceTypeForCrs(AudioDeviceType deviceType)
263 {
264     sptr<CallBase> incomingCall = CallObjectManager::GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING);
265     if (incomingCall == nullptr || incomingCall->IsAnsweredCall()) {
266         return;
267     }
268     if (incomingCall->GetCrsType() == CRS_TYPE && !IsVoIPCallActived()) {
269         AudioDevice device = {
270             .deviceType = AudioDeviceType::DEVICE_SPEAKER,
271             .address = { 0 },
272         };
273         AudioStandard::AudioRingerMode ringMode = DelayedSingleton<AudioProxy>::GetInstance()->GetRingerMode();
274         if (ringMode != AudioStandard::AudioRingerMode::RINGER_MODE_NORMAL) {
275             AudioDeviceType initDeviceType = GetInitAudioDeviceType();
276             if (IsInEarAudioDevice(initDeviceType)) {
277                 device.deviceType = initDeviceType;
278             }
279         }
280         TELEPHONY_LOGI("update deviceType = %{public}d,initCrsDeviceType_ %{public}d",
281             deviceType, initCrsDeviceType_);
282         initCrsDeviceType_ = deviceType;
283         if (device.deviceType == deviceType) {
284             return;
285         }
286         TELEPHONY_LOGI("crs ring tone should be speaker");
287         SetAudioDevice(device);
288     }
289 }
290 
UpdateDeviceTypeForVideoDialing()291 void AudioControlManager::UpdateDeviceTypeForVideoDialing()
292 {
293     sptr<CallBase> dialingCall = CallObjectManager::GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_DIALING);
294     if (dialingCall == nullptr) {
295         return;
296     }
297     if (dialingCall->GetVideoStateType() == VideoStateType::TYPE_VIDEO) {
298         AudioDevice device = {
299             .deviceType = AudioDeviceType::DEVICE_SPEAKER,
300             .address = { 0 },
301         };
302         AudioDeviceType initDeviceType = GetInitAudioDeviceType();
303         if (IsInEarAudioDevice(initDeviceType)) {
304             device.deviceType = initDeviceType;
305         }
306         TELEPHONY_LOGI("dialing video call should be speaker");
307         SetAudioDevice(device);
308     }
309 }
310 
IncomingCallActivated(sptr<CallBase> & callObjectPtr)311 void AudioControlManager::IncomingCallActivated(sptr<CallBase> &callObjectPtr) {}
312 
IncomingCallHungUp(sptr<CallBase> & callObjectPtr,bool isSendSms,std::string content)313 void AudioControlManager::IncomingCallHungUp(sptr<CallBase> &callObjectPtr, bool isSendSms, std::string content)
314 {
315     if (callObjectPtr == nullptr) {
316         TELEPHONY_LOGE("call object ptr nullptr");
317         return;
318     }
319     StopWaitingTone();
320 }
321 
HandleCallStateUpdated(sptr<CallBase> & callObjectPtr,TelCallState priorState,TelCallState nextState)322 void AudioControlManager::HandleCallStateUpdated(
323     sptr<CallBase> &callObjectPtr, TelCallState priorState, TelCallState nextState)
324 {
325     if (callObjectPtr == nullptr) {
326         TELEPHONY_LOGE("call object is nullptr");
327         return;
328     }
329     auto callStateProcessor = DelayedSingleton<CallStateProcessor>::GetInstance();
330     TELEPHONY_LOGI("HandleCallStateUpdated priorState:%{public}d, nextState:%{public}d", priorState, nextState);
331     if ((nextState == TelCallState::CALL_STATUS_DISCONNECTING || nextState == TelCallState::CALL_STATUS_DISCONNECTED) &&
332         callObjectPtr->GetAnsweredByPhone()) {
333         callStateProcessor->DeleteCall(callObjectPtr->GetCallID(), TelCallState::CALL_STATUS_ACTIVE);
334     }
335     if (nextState == TelCallState::CALL_STATUS_ANSWERED) {
336         TELEPHONY_LOGI("user answered, mute ringer instead of release renderer");
337         if (priorState == TelCallState::CALL_STATUS_INCOMING) {
338             callStateProcessor->DeleteCall(callObjectPtr->GetCallID(), priorState);
339             callObjectPtr->SetIsAnsweredByPhone(true);
340         }
341         MuteRinger();
342     }
343     if (nextState == TelCallState::CALL_STATUS_ACTIVE && callObjectPtr->GetAnsweredByPhone() &&
344         (priorState == TelCallState::CALL_STATUS_INCOMING || priorState == TelCallState::CALL_STATUS_WAITING)) {
345         UnmuteSoundTone();
346         return;
347     }
348     HandleNextState(callObjectPtr, nextState);
349     if (priorState == nextState) {
350         TELEPHONY_LOGI("prior state equals next state");
351         return;
352     }
353     HandlePriorState(callObjectPtr, priorState);
354 }
355 
UnmuteSoundTone()356 void AudioControlManager::UnmuteSoundTone()
357 {
358     auto weak = weak_from_this();
359     ffrt::submit_h([weak]() {
360         auto strong = weak.lock();
361         if (strong != nullptr) {
362             std::unique_lock<ffrt::mutex> lock(strong->crsMutex_);
363             if (strong->isCrsStartSoundTone_) {
364                 TELEPHONY_LOGI("crs unmuteSound");
365                 strong->isCrsStartSoundTone_ = false;
366             }
367             lock.unlock();
368             DelayedSingleton<AudioProxy>::GetInstance()->SetVoiceRingtoneMute(false);
369         }
370         }, {}, {}, ffrt::task_attr().delay(UNMUTE_SOUNDTONE_DELAY_TIME));
371 }
372 
HandleNextState(sptr<CallBase> & callObjectPtr,TelCallState nextState)373 void AudioControlManager::HandleNextState(sptr<CallBase> &callObjectPtr, TelCallState nextState)
374 {
375     TELEPHONY_LOGI("handle next state.");
376     AudioEvent event = AudioEvent::UNKNOWN_EVENT;
377     DelayedSingleton<CallStateProcessor>::GetInstance()->AddCall(callObjectPtr->GetCallID(), nextState);
378     switch (nextState) {
379         case TelCallState::CALL_STATUS_DIALING:
380             event = AudioEvent::NEW_DIALING_CALL;
381             audioInterruptState_ = AudioInterruptState::INTERRUPT_STATE_RINGING;
382             break;
383         case TelCallState::CALL_STATUS_ALERTING:
384             event = AudioEvent::NEW_ALERTING_CALL;
385             audioInterruptState_ = AudioInterruptState::INTERRUPT_STATE_RINGING;
386             break;
387         case TelCallState::CALL_STATUS_ACTIVE:
388         case TelCallState::CALL_STATUS_ANSWERED:
389             HandleNewActiveCall(callObjectPtr);
390             audioInterruptState_ = AudioInterruptState::INTERRUPT_STATE_ACTIVATED;
391             break;
392         case TelCallState::CALL_STATUS_WAITING:
393         case TelCallState::CALL_STATUS_INCOMING:
394             event = AudioEvent::NEW_INCOMING_CALL;
395             audioInterruptState_ = AudioInterruptState::INTERRUPT_STATE_RINGING;
396             break;
397         case TelCallState::CALL_STATUS_DISCONNECTING:
398         case TelCallState::CALL_STATUS_DISCONNECTED:
399             if (!CallObjectManager::HasIncomingCallCrsType() && !CallObjectManager::HasIncomingCallVideoRingType()) {
400                 if (isCrsVibrating_ || isVideoRingVibrating_) {
401                     DelayedSingleton<AudioProxy>::GetInstance()->StopVibrator();
402                     isCrsVibrating_ = false;
403                     isVideoRingVibrating_ = false;
404                 }
405             }
406             audioInterruptState_ = AudioInterruptState::INTERRUPT_STATE_DEACTIVATED;
407             break;
408         default:
409             break;
410     }
411     TELEPHONY_LOGI("HandleNextState ProcessEvent event=%{public}d", event);
412     if (event == AudioEvent::UNKNOWN_EVENT) {
413         return;
414     }
415     TELEPHONY_LOGI("handle next state, event: %{public}d.", event);
416     DelayedSingleton<AudioSceneProcessor>::GetInstance()->ProcessEvent(event);
417 }
418 
HandlePriorState(sptr<CallBase> & callObjectPtr,TelCallState priorState)419 void AudioControlManager::HandlePriorState(sptr<CallBase> &callObjectPtr, TelCallState priorState)
420 {
421     TELEPHONY_LOGI("handle prior state.");
422     AudioEvent event = AudioEvent::UNKNOWN_EVENT;
423     DelayedSingleton<CallStateProcessor>::GetInstance()->DeleteCall(callObjectPtr->GetCallID(), priorState);
424     int32_t stateNumber = DelayedSingleton<CallStateProcessor>::GetInstance()->GetCallNumber(priorState);
425     switch (priorState) {
426         case TelCallState::CALL_STATUS_DIALING:
427             if (stateNumber == EMPTY_VALUE) {
428                 event = AudioEvent::NO_MORE_DIALING_CALL;
429             }
430             break;
431         case TelCallState::CALL_STATUS_ALERTING:
432             if (stateNumber == EMPTY_VALUE) {
433                 event = AudioEvent::NO_MORE_ALERTING_CALL;
434             }
435             break;
436         case TelCallState::CALL_STATUS_INCOMING:
437         case TelCallState::CALL_STATUS_WAITING:
438             ProcessAudioWhenCallActive(callObjectPtr);
439             event = AudioEvent::NO_MORE_INCOMING_CALL;
440             break;
441         case TelCallState::CALL_STATUS_ACTIVE:
442             if (stateNumber == EMPTY_VALUE) {
443                 event = AudioEvent::NO_MORE_ACTIVE_CALL;
444             }
445             break;
446         case TelCallState::CALL_STATUS_HOLDING:
447             if (stateNumber == EMPTY_VALUE) {
448                 event = AudioEvent::NO_MORE_HOLDING_CALL;
449             }
450             break;
451         default:
452             break;
453     }
454     TELEPHONY_LOGI("HandlePriorState ProcessEvent event=%{public}d", event);
455     if (event == AudioEvent::UNKNOWN_EVENT) {
456         return;
457     }
458     TELEPHONY_LOGI("handle prior state, event: %{public}d.", event);
459     DelayedSingleton<AudioSceneProcessor>::GetInstance()->ProcessEvent(event);
460 }
461 
ProcessAudioWhenCallActive(sptr<CallBase> & callObjectPtr)462 void AudioControlManager::ProcessAudioWhenCallActive(sptr<CallBase> &callObjectPtr)
463 {
464     auto callRunningState = callObjectPtr->GetCallRunningState();
465     if (callRunningState == CallRunningState::CALL_RUNNING_STATE_ACTIVE ||
466         callRunningState == CallRunningState::CALL_RUNNING_STATE_RINGING) {
467         if (isCrsVibrating_ || isVideoRingVibrating_) {
468             DelayedSingleton<AudioProxy>::GetInstance()->StopVibrator();
469             isCrsVibrating_ = false;
470             isVideoRingVibrating_ = false;
471         }
472         ProcessSoundtone(callObjectPtr);
473         UpdateDeviceTypeForVideoOrSatelliteCall();
474     }
475 }
476 
ProcessSoundtone(sptr<CallBase> & callObjectPtr)477 void AudioControlManager::ProcessSoundtone(sptr<CallBase> &callObjectPtr)
478 {
479     int ringCallCount = CallObjectManager::GetCallNumByRunningState(CallRunningState::CALL_RUNNING_STATE_RINGING);
480     int minMulityCall = MIN_MULITY_ACTIVE_CALL_COUNT;
481     if (!callObjectPtr->GetAnsweredByPhone()) {
482         minMulityCall = MIN_DC_MULITY_ACTIVE_CALL_COUNT;
483     }
484     if (((CallObjectManager::GetCurrentCallNum() - ringCallCount) < minMulityCall)) {
485         if (isCrsStartSoundTone_ == true) {
486             if (callObjectPtr->GetAnsweredByPhone()) {
487                 ResumeCrsSoundTone();
488             }
489         } else {
490             TELEPHONY_LOGI("local ring  MT call is answer, now playsoundtone");
491             StopSoundtone();
492             PlaySoundtone();
493             if (callObjectPtr->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_RINGING) {
494                 TELEPHONY_LOGI("mute when mt call is answer");
495                 DelayedSingleton<AudioProxy>::GetInstance()->SetVoiceRingtoneMute(true);
496             }
497         }
498     }
499 }
500 
ResumeCrsSoundTone()501 void AudioControlManager::ResumeCrsSoundTone()
502 {
503     TELEPHONY_LOGI("ResumeCrsSoundTone start");
504     RestoreVoiceValumeIfNecessary();
505     AudioDevice device = {
506         .deviceType = AudioDeviceType::DEVICE_EARPIECE,
507         .address = { 0 },
508     };
509     DelayedSingleton<AudioProxy>::GetInstance()->GetPreferredOutputAudioDevice(device);
510     TELEPHONY_LOGI("crs soundtone preferred deivce = %{public}d", device.deviceType);
511     if (device.deviceType == AudioDeviceType::DEVICE_SPEAKER) {
512         device.deviceType = initCrsDeviceType_;
513         SetAudioDevice(device);
514     }
515     isCrsStartSoundTone_ = false;
516 }
517 
HandleNewActiveCall(sptr<CallBase> & callObjectPtr)518 void AudioControlManager::HandleNewActiveCall(sptr<CallBase> &callObjectPtr)
519 {
520     CallType callType = callObjectPtr->GetCallType();
521     AudioEvent event = AudioEvent::UNKNOWN_EVENT;
522     switch (callType) {
523         case CallType::TYPE_CS:
524         case CallType::TYPE_SATELLITE:
525             event = AudioEvent::NEW_ACTIVE_CS_CALL;
526             break;
527         case CallType::TYPE_IMS:
528         case CallType::TYPE_BLUETOOTH:
529             event = AudioEvent::NEW_ACTIVE_IMS_CALL;
530             break;
531         case CallType::TYPE_OTT:
532             event = AudioEvent::NEW_ACTIVE_OTT_CALL;
533             break;
534         default:
535             break;
536     }
537     if (event == AudioEvent::UNKNOWN_EVENT) {
538         return;
539     }
540     DelayedSingleton<AudioSceneProcessor>::GetInstance()->ProcessEvent(event);
541 }
542 
543 /**
544  * @param device , audio device
545  * usually called by the ui interaction , in purpose of switching to another audio device
546  */
SetAudioDevice(const AudioDevice & device)547 int32_t AudioControlManager::SetAudioDevice(const AudioDevice &device)
548 {
549     return SetAudioDevice(device, false);
550 }
551 
552 /**
553  * @param device , audio device
554  * @param isByUser , call from callui or not
555  * usually called by the ui interaction , in purpose of switching to another audio device
556  */
SetAudioDevice(const AudioDevice & device,bool isByUser)557 int32_t AudioControlManager::SetAudioDevice(const AudioDevice &device, bool isByUser)
558 {
559     bool hasCall = DelayedSingleton<CallControlManager>::GetInstance()->HasCall() ||
560         DelayedSingleton<CallControlManager>::GetInstance()->HasVoipCall();
561     if (!hasCall) {
562         TELEPHONY_LOGE("no call exists, set audio device failed");
563         return CALL_ERR_AUDIO_SET_AUDIO_DEVICE_FAILED;
564     }
565     TELEPHONY_LOGI("set audio device, type: %{public}d", static_cast<int32_t>(device.deviceType));
566     AudioDeviceType audioDeviceType = AudioDeviceType::DEVICE_UNKNOWN;
567     if (CallObjectManager::HasSatelliteCallExist() && device.deviceType == AudioDeviceType::DEVICE_EARPIECE) {
568         DelayedSingleton<CallDialog>::GetInstance()->DialogConnectExtension("SATELLITE_CALL_NOT_SUPPORT_EARPIECE");
569         return CALL_ERR_AUDIO_SET_AUDIO_DEVICE_FAILED;
570     }
571     isSetAudioDeviceByUser_ = isByUser;
572     switch (device.deviceType) {
573         case AudioDeviceType::DEVICE_SPEAKER:
574         case AudioDeviceType::DEVICE_EARPIECE:
575         case AudioDeviceType::DEVICE_WIRED_HEADSET:
576             audioDeviceType = device.deviceType;
577             break;
578         case AudioDeviceType::DEVICE_DISTRIBUTED_AUTOMOTIVE:
579         case AudioDeviceType::DEVICE_DISTRIBUTED_PHONE:
580         case AudioDeviceType::DEVICE_DISTRIBUTED_PAD:
581         case AudioDeviceType::DEVICE_DISTRIBUTED_PC:
582             return HandleDistributeAudioDevice(device);
583         case AudioDeviceType::DEVICE_BLUETOOTH_SCO:
584         case AudioDeviceType::DEVICE_NEARLINK:
585         case AudioDeviceType::DEVICE_BLUETOOTH_HEARING_AID: {
586             if (HandleWirelessAudioDevice(device) != TELEPHONY_SUCCESS) {
587                 return CALL_ERR_AUDIO_SET_AUDIO_DEVICE_FAILED;
588             }
589             audioDeviceType = device.deviceType;
590             break;
591         }
592         default:
593             break;
594     }
595     return SwitchAudioDevice(audioDeviceType);
596 }
597 
SwitchAudioDevice(AudioDeviceType audioDeviceType)598 int32_t AudioControlManager::SwitchAudioDevice(AudioDeviceType audioDeviceType)
599 {
600     if (audioDeviceType != AudioDeviceType::DEVICE_UNKNOWN) {
601         if (DelayedSingleton<DistributedCommunicationManager>::GetInstance()->IsAudioOnSink()) {
602             DelayedSingleton<DistributedCommunicationManager>::GetInstance()->SwitchToSourceDevice();
603         }
604         if (DelayedSingleton<DistributedCallManager>::GetInstance()->IsDCallDeviceSwitchedOn()) {
605             DelayedSingleton<DistributedCallManager>::GetInstance()->SwitchOffDCallDeviceSync();
606         }
607         if (DelayedSingleton<AudioDeviceManager>::GetInstance()->SwitchDevice(audioDeviceType)) {
608             return TELEPHONY_SUCCESS;
609         }
610     }
611     return CALL_ERR_AUDIO_SET_AUDIO_DEVICE_FAILED;
612 }
613 
HandleDistributeAudioDevice(const AudioDevice & device)614 int32_t AudioControlManager::HandleDistributeAudioDevice(const AudioDevice &device)
615 {
616     if (DelayedSingleton<DistributedCommunicationManager>::GetInstance()->IsDistributedDev(device)) {
617         if (DelayedSingleton<DistributedCommunicationManager>::GetInstance()->SwitchToSinkDevice(device)) {
618             return TELEPHONY_SUCCESS;
619         }
620         return CALL_ERR_AUDIO_SET_AUDIO_DEVICE_FAILED;
621     }
622     if (!DelayedSingleton<DistributedCallManager>::GetInstance()->IsDCallDeviceSwitchedOn()) {
623         if (DelayedSingleton<DistributedCallManager>::GetInstance()->SwitchOnDCallDeviceSync(device)) {
624             return TELEPHONY_SUCCESS;
625         }
626         return CALL_ERR_AUDIO_SET_AUDIO_DEVICE_FAILED;
627     }
628     return TELEPHONY_SUCCESS;
629 }
630 
HandleWirelessAudioDevice(const AudioDevice & device)631 int32_t AudioControlManager::HandleWirelessAudioDevice(const AudioDevice &device)
632 {
633     std::string address = device.address;
634     GetWirelessAudioDeviceAddress(device.deviceType, address);
635     if (address.empty()) {
636         return CALL_ERR_AUDIO_SET_AUDIO_DEVICE_FAILED;
637     }
638     std::shared_ptr<AudioStandard::AudioDeviceDescriptor> audioDev =
639         std::make_shared<AudioStandard::AudioDeviceDescriptor>();
640     audioDev->macAddress_ = address;
641     if (device.deviceType == AudioDeviceType::DEVICE_BLUETOOTH_SCO) {
642         audioDev->deviceType_ = AudioStandard::DEVICE_TYPE_BLUETOOTH_SCO;
643     } else if (device.deviceType == AudioDeviceType::DEVICE_NEARLINK) {
644         audioDev->deviceType_ = AudioStandard::DEVICE_TYPE_NEARLINK;
645     } else {
646         audioDev->deviceType_ = AudioStandard::DEVICE_TYPE_HEARING_AID;
647     }
648     audioDev->deviceRole_ = AudioStandard::OUTPUT_DEVICE;
649     audioDev->networkId_ = AudioStandard::LOCAL_NETWORK_ID;
650     std::vector<std::shared_ptr<AudioDeviceDescriptor>> remoteDevice;
651     remoteDevice.push_back(audioDev);
652     AudioSystemManager* audioSystemManager = AudioSystemManager::GetInstance();
653     sptr<AudioRendererFilter> audioRendererFilter = new(std::nothrow) AudioRendererFilter();
654     if (audioRendererFilter == nullptr) {
655         TELEPHONY_LOGE("audioRendererFilter is nullptr");
656         return CALL_ERR_AUDIO_SET_AUDIO_DEVICE_FAILED;
657     }
658     audioRendererFilter->rendererInfo.streamUsage = StreamUsage::STREAM_USAGE_VOICE_MODEM_COMMUNICATION;
659     int32_t ret = audioSystemManager->SelectOutputDevice(audioRendererFilter, remoteDevice);
660     if (ret != 0) {
661         TELEPHONY_LOGE("SelectOutputDevice failed");
662         return CALL_ERR_AUDIO_SET_AUDIO_DEVICE_FAILED;
663     }
664     return TELEPHONY_SUCCESS;
665 }
666 
GetWirelessAudioDeviceAddress(AudioDeviceType deviceType,std::string & address)667 void AudioControlManager::GetWirelessAudioDeviceAddress(AudioDeviceType deviceType, std::string &address)
668 {
669     if (!address.empty()) {
670         return;
671     }
672     if (deviceType == AudioDeviceType::DEVICE_BLUETOOTH_SCO) {
673         std::shared_ptr<AudioStandard::AudioDeviceDescriptor> activeBluetoothDevice =
674             AudioStandard::AudioRoutingManager::GetInstance()->GetActiveBluetoothDevice();
675         if (activeBluetoothDevice == nullptr || activeBluetoothDevice->macAddress_.empty()) {
676             TELEPHONY_LOGE("Get active bluetooth device failed.");
677             return;
678         }
679         address = activeBluetoothDevice->macAddress_;
680     } else if (deviceType == AudioDeviceType::DEVICE_NEARLINK) {
681         AudioDevice preferredAudioDevice;
682         if (!AudioDeviceManager::IsNearlinkActived(preferredAudioDevice)) {
683             TELEPHONY_LOGE("Get active nearlink device failed.");
684             return;
685         }
686         address = preferredAudioDevice.address;
687     } else {
688         AudioDevice preferredAudioDevice;
689         if (!AudioDeviceManager::IsBtHearingAidActived(preferredAudioDevice)) {
690             TELEPHONY_LOGE("Get active bt hearing aid device failed.");
691             return;
692         }
693         address = preferredAudioDevice.address;
694     }
695 }
696 
NeedPlayVideoRing(ContactInfo & contactInfo,sptr<CallBase> & callObjectPtr)697 bool AudioControlManager::NeedPlayVideoRing(ContactInfo &contactInfo, sptr<CallBase> &callObjectPtr)
698 {
699     int32_t userId = 0;
700     bool isUserUnlocked = false;
701     AccountSA::OsAccountManager::GetForegroundOsAccountLocalId(userId);
702     AccountSA::OsAccountManager::IsOsAccountVerified(userId, isUserUnlocked);
703     TELEPHONY_LOGI("isUserUnlocked: %{public}d", isUserUnlocked);
704     if (!isUserUnlocked) {
705         return false;
706     }
707     CallAttributeInfo info;
708     callObjectPtr->GetCallAttributeBaseInfo(info);
709     if (info.crsType == CRS_TYPE) {
710         TELEPHONY_LOGI("crs type call.");
711         return false;
712     }
713     bool isNotWearWatch = DelayedSingleton<CallControlManager>::GetInstance()->IsNotWearOnWrist();
714     if (isNotWearWatch) {
715         TELEPHONY_LOGI("isNotWearWatch: %{public}d", isNotWearWatch);
716         return false;
717     }
718 
719     if (std::string(contactInfo.ringtonePath).empty() && IsSystemVideoRing(callObjectPtr)) {
720         if (memcpy_s(contactInfo.ringtonePath, FILE_PATH_MAX_LEN, SYSTEM_VIDEO_RING, strlen(SYSTEM_VIDEO_RING)) !=
721             EOK) {
722             TELEPHONY_LOGE("memcpy_s ringtonePath fail");
723             return false;
724         };
725     }
726 
727     if (CallObjectManager::IsVideoRing(contactInfo.personalNotificationRingtone, contactInfo.ringtonePath)) {
728         TELEPHONY_LOGI("need play video ring.");
729         return true;
730     }
731     return false;
732 }
733 
IsSystemVideoRing(sptr<CallBase> & callObjectPtr)734 bool AudioControlManager::IsSystemVideoRing(sptr<CallBase> &callObjectPtr)
735 {
736     CallAttributeInfo info;
737     callObjectPtr->GetCallAttributeBaseInfo(info);
738     const std::shared_ptr<AbilityRuntime::Context> context;
739     Media::RingtoneType type = info.accountId == DEFAULT_SIM_SLOT_ID ? Media::RingtoneType::RINGTONE_TYPE_SIM_CARD_0 :
740         Media::RingtoneType::RINGTONE_TYPE_SIM_CARD_1;
741     std::shared_ptr<Media::SystemSoundManager> systemSoundManager =
742         Media::SystemSoundManagerFactory::CreateSystemSoundManager();
743     if (systemSoundManager == nullptr) {
744         TELEPHONY_LOGE("get systemSoundManager failed");
745         return false;
746     }
747     Media::ToneAttrs toneAttrs = systemSoundManager->GetCurrentRingtoneAttribute(type);
748     TELEPHONY_LOGI("type: %{public}d, mediatype: %{public}d", type, toneAttrs.GetMediaType());
749     if (toneAttrs.GetMediaType() == Media::ToneMediaType::MEDIA_TYPE_VID) {
750         return true;
751     } else {
752         return false;
753     }
754 }
755 
PlayRingtone()756 bool AudioControlManager::PlayRingtone()
757 {
758     int32_t ret;
759     if (!ShouldPlayRingtone()) {
760         TELEPHONY_LOGE("should not play ringtone");
761         return false;
762     }
763     ring_ = std::make_unique<Ring>();
764     if (ring_ == nullptr) {
765         TELEPHONY_LOGE("create ring object failed");
766         return false;
767     }
768     sptr<CallBase> incomingCall = CallObjectManager::GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING);
769     if (incomingCall == nullptr) {
770         TELEPHONY_LOGE("incomingCall is nullptr");
771         return false;
772     }
773     CallAttributeInfo info;
774     incomingCall->GetCallAttributeBaseInfo(info);
775     ContactInfo contactInfo = incomingCall->GetCallerInfo();
776     AudioStandard::AudioRingerMode ringMode = DelayedSingleton<AudioProxy>::GetInstance()->GetRingerMode();
777     if (incomingCall->GetCrsType() == CRS_TYPE) {
778         return dealCrsScene(ringMode);
779     }
780     if (CallObjectManager::IsVideoRing(contactInfo.personalNotificationRingtone, contactInfo.ringtonePath)) {
781         if ((ringMode == AudioStandard::AudioRingerMode::RINGER_MODE_NORMAL && IsRingingVibrateModeOn()) ||
782             ringMode == AudioStandard::AudioRingerMode::RINGER_MODE_VIBRATE) {
783             TELEPHONY_LOGI("need start vibrator.");
784             isVideoRingVibrating_ = (DelayedSingleton<AudioProxy>::GetInstance()->StartVibrator() == TELEPHONY_SUCCESS);
785         }
786         return true;
787     }
788     if (incomingCall->GetCallType() == CallType::TYPE_BLUETOOTH) {
789         ret = ring_->Play(info.accountId, contactInfo.ringtonePath, Media::HapticStartupMode::FAST);
790     } else {
791         ret = ring_->Play(info.accountId, contactInfo.ringtonePath, Media::HapticStartupMode::DEFAULT);
792     }
793     if (ret != TELEPHONY_SUCCESS) {
794         TELEPHONY_LOGE("play ringtone failed");
795         return false;
796     }
797     TELEPHONY_LOGI("play ringtone success");
798     PostProcessRingtone();
799     return true;
800 }
801 
PlayForNoRing()802 bool AudioControlManager::PlayForNoRing()
803 {
804     if (isPlayForNoRing_) {
805         TELEPHONY_LOGI("isPlayForNoRing_ is true,return");
806         return true;
807     }
808     AudioStandard::AudioRendererParams rendererParams;
809     rendererParams.sampleFormat = AudioStandard::SAMPLE_S24LE;
810     rendererParams.channelCount = AudioStandard::STEREO;
811     if (audioRenderer_ == nullptr) {
812         audioRenderer_ = AudioStandard::AudioRenderer::Create(AudioStandard::AudioStreamType::STREAM_VOICE_RING);
813     }
814     if (audioRenderer_ == nullptr) {
815         TELEPHONY_LOGE("audioRenderer_ is nullptr");
816         return TELEPHONY_ERR_LOCAL_PTR_NULL;
817     }
818     int32_t audioRet = audioRenderer_->SetParams(rendererParams);
819     bool isStarted = audioRenderer_->Start();
820     TELEPHONY_LOGI("PlayForNoRing isStarted : %{public}d, audioRet: %{public}d", isStarted, audioRet);
821     isPlayForNoRing_ = true;
822     return isStarted;
823 }
824 
dealCrsScene(const AudioStandard::AudioRingerMode & ringMode)825 bool AudioControlManager::dealCrsScene(const AudioStandard::AudioRingerMode &ringMode)
826 {
827     if (!isCrsVibrating_ && (ringMode != AudioStandard::AudioRingerMode::RINGER_MODE_SILENT)) {
828         if (ringMode == AudioStandard::AudioRingerMode::RINGER_MODE_VIBRATE || IsRingingVibrateModeOn()) {
829             isCrsVibrating_ = (DelayedSingleton<AudioProxy>::GetInstance()->StartVibrator() == TELEPHONY_SUCCESS);
830         }
831     }
832     if ((ringMode == AudioStandard::AudioRingerMode::RINGER_MODE_NORMAL) || IsBtOrWireHeadPlugin()) {
833         isCrsStartSoundTone_ = true;
834         if (PlaySoundtone()) {
835             TELEPHONY_LOGI("play soundtone success");
836             AdjustVolumesForCrs();
837             return true;
838         }
839         AdjustVolumesForCrs();
840         TELEPHONY_LOGE("play soundtone fail.");
841         return false;
842     }
843     TELEPHONY_LOGI("type_crs but not play ringtone");
844     return false;
845 }
846 
PostProcessRingtone()847 void AudioControlManager::PostProcessRingtone()
848 {
849     sptr<CallBase> incomingCall = CallObjectManager::GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING);
850     if (incomingCall == nullptr) {
851         TELEPHONY_LOGI("play ringtone success but incoming call is null stop it");
852         StopRingtone();
853         return;
854     }
855     AAFwk::WantParams params = incomingCall->GetExtraParams();
856     bool isNeedMuteRing = static_cast<bool>(params.GetIntParam("isNeedMuteRing", 0));
857     if (isNeedMuteRing) {
858         TELEPHONY_LOGI("play ringtone success but need mute it");
859         MuteRinger();
860         params.SetParam("isNeedMuteRing", AAFwk::Integer::Box(0));
861         incomingCall->SetExtraParams(params);
862     }
863 }
864 
IsDistributeCallSinkStatus()865 bool AudioControlManager::IsDistributeCallSinkStatus()
866 {
867     std::string dcStatus = "";
868     auto settingHelper = SettingsDataShareHelper::GetInstance();
869     if (settingHelper != nullptr) {
870         OHOS::Uri settingUri(SettingsDataShareHelper::SETTINGS_DATASHARE_URI);
871         settingHelper->Query(settingUri, "distributed_modem_state", dcStatus);
872     }
873     TELEPHONY_LOGI("distributed communication modem status: %{public}s", dcStatus.c_str());
874     if (dcStatus != "1_sink") {
875         return false;
876     }
877     return true;
878 }
879 
PlaySoundtone()880 bool AudioControlManager::PlaySoundtone()
881 {
882     if (IsDistributeCallSinkStatus()) {
883         TELEPHONY_LOGI("distribute call sink status, no need to play sound tone");
884         return true;
885     }
886     if (soundState_ == SoundState::SOUNDING) {
887         TELEPHONY_LOGE("should not play soundTone");
888         return false;
889     }
890     if (sound_ == nullptr) {
891         sound_ = std::make_unique<Sound>();
892         if (sound_ == nullptr) {
893             TELEPHONY_LOGE("create sound object failed");
894             return false;
895         }
896     }
897     if (sound_->Play() != TELEPHONY_SUCCESS) {
898         TELEPHONY_LOGE("play soundtone failed");
899         return false;
900     }
901     TELEPHONY_LOGI("play soundtone success");
902     return true;
903 }
904 
StopSoundtone()905 bool AudioControlManager::StopSoundtone()
906 {
907     if (soundState_ == SoundState::STOPPED) {
908         TELEPHONY_LOGI("soundtone already stopped");
909         return true;
910     }
911     if (sound_ == nullptr) {
912         TELEPHONY_LOGE("sound_ is nullptr");
913         return false;
914     }
915     DelayedSingleton<AudioProxy>::GetInstance()->SetVoiceRingtoneMute(false);
916     if (sound_->Stop() != TELEPHONY_SUCCESS) {
917         TELEPHONY_LOGE("stop soundtone failed");
918         return false;
919     }
920     sound_->ReleaseRenderer();
921     TELEPHONY_LOGI("stop soundtone success");
922     RestoreVoiceValumeIfNecessary();
923     isCrsStartSoundTone_ = false;
924     return true;
925 }
926 
StopRingtone()927 bool AudioControlManager::StopRingtone()
928 {
929     if (isPlayForNoRing_) {
930         return StopForNoRing();
931     }
932     if (ringState_ == RingState::STOPPED) {
933         TELEPHONY_LOGI("ringtone already stopped");
934         return true;
935     }
936     if (ring_ == nullptr) {
937         TELEPHONY_LOGE("ring_ is nullptr");
938         return false;
939     }
940     if (ring_->Stop() != TELEPHONY_SUCCESS) {
941         TELEPHONY_LOGE("stop ringtone failed");
942         return false;
943     }
944     ring_->ReleaseRenderer();
945     TELEPHONY_LOGI("stop ringtone success");
946     return true;
947 }
948 
StopForNoRing()949 bool AudioControlManager::StopForNoRing()
950 {
951     isPlayForNoRing_ = false;
952     if (audioRenderer_ == nullptr) {
953         TELEPHONY_LOGE("audioRenderer_ is nullptr");
954         return false;
955     }
956     audioRenderer_->Stop();
957     audioRenderer_->Release();
958     audioRenderer_ = nullptr;
959     TELEPHONY_LOGI("StopForNoRing success");
960     return true;
961 }
962 
963 /**
964  * while audio state changed , maybe need to reinitialize the audio device
965  * in order to get the initialization status of audio device , need to consider varieties of  audio conditions
966  */
GetInitAudioDeviceType() const967 AudioDeviceType AudioControlManager::GetInitAudioDeviceType() const
968 {
969     if (audioInterruptState_ == AudioInterruptState::INTERRUPT_STATE_DEACTIVATED) {
970         return AudioDeviceType::DEVICE_DISABLE;
971     } else {
972         if (DelayedSingleton<DistributedCommunicationManager>::GetInstance()->IsConnected()) {
973             AudioDevice device = {
974                 .deviceType = AudioDeviceType::DEVICE_UNKNOWN,
975             };
976             (void)DelayedSingleton<AudioProxy>::GetInstance()->GetPreferredOutputAudioDevice(device);
977             return device.deviceType;
978         }
979 
980         /**
981          * Init audio device type according to the priority in different call state:
982          * In voice call state, bluetooth sco > wired headset > earpiece > speaker
983          * In video call state, bluetooth sco > wired headset > speaker > earpiece
984          */
985         if (AudioDeviceManager::IsDistributedCallConnected()) {
986             return AudioDeviceType::DEVICE_DISTRIBUTED_AUTOMOTIVE;
987         }
988         AudioDevice device;
989         if (AudioDeviceManager::IsNearlinkActived(device)) {
990             return AudioDeviceType::DEVICE_NEARLINK;
991         }
992         if (AudioDeviceManager::IsBtActived()) {
993             return AudioDeviceType::DEVICE_BLUETOOTH_SCO;
994         }
995         if (AudioDeviceManager::IsWiredHeadsetConnected()) {
996             return AudioDeviceType::DEVICE_WIRED_HEADSET;
997         }
998         if (AudioDeviceManager::IsBtHearingAidActived(device)) {
999             return AudioDeviceType::DEVICE_BLUETOOTH_HEARING_AID;
1000         }
1001         sptr<CallBase> liveCall = CallObjectManager::GetForegroundCall();
1002         if (liveCall != nullptr && (liveCall->GetVideoStateType() == VideoStateType::TYPE_VIDEO ||
1003             liveCall->GetCallType() == CallType::TYPE_SATELLITE ||
1004             liveCall->GetCallType() == CallType::TYPE_BLUETOOTH)) {
1005             TELEPHONY_LOGI("current video or satellite call speaker is active");
1006             return AudioDeviceType::DEVICE_SPEAKER;
1007         }
1008         if (AudioDeviceManager::IsEarpieceAvailable()) {
1009             return AudioDeviceType::DEVICE_EARPIECE;
1010         }
1011         return AudioDeviceType::DEVICE_SPEAKER;
1012     }
1013 }
1014 
1015 /**
1016  * @param isMute , mute state
1017  * usually called by the ui interaction , mute or unmute microphone
1018  */
SetMute(bool isMute)1019 int32_t AudioControlManager::SetMute(bool isMute)
1020 {
1021     bool hasCall = DelayedSingleton<CallControlManager>::GetInstance()->HasCall();
1022     if (!hasCall) {
1023         TELEPHONY_LOGE("no call exists, set mute failed");
1024         return CALL_ERR_AUDIO_SETTING_MUTE_FAILED;
1025     }
1026     bool enabled = false;
1027     if ((DelayedSingleton<CallControlManager>::GetInstance()->HasEmergency(enabled) == TELEPHONY_SUCCESS) && enabled) {
1028         isMute = false;
1029     }
1030     sptr<CallBase> currentCall = frontCall_;
1031     if (currentCall == nullptr) {
1032         TELEPHONY_LOGE("frontCall_ is nullptr");
1033         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1034     }
1035     if (DelayedSingleton<CallControlManager>::GetInstance()->IsCallExist(CallType::TYPE_BLUETOOTH,
1036         TelCallState::CALL_STATUS_ACTIVE)) {
1037         std::string strMute = isMute ? "true" : "false";
1038         TELEPHONY_LOGI("SetMute strMute=%{public}s", strMute.c_str());
1039         std::vector<std::pair<std::string, std::string>> vec = {
1040             std::pair<std::string, std::string>("hfp_set_mic_mute", strMute)
1041         };
1042         OHOS::AudioStandard::AudioSystemManager::GetInstance()->SetExtraParameters("hfp_extra", vec);
1043         currentCall->SetMicPhoneState(isMute);
1044     } else {
1045         if (!DelayedSingleton<AudioProxy>::GetInstance()->SetMicrophoneMute(isMute)) {
1046             TELEPHONY_LOGE("set mute failed");
1047             return CALL_ERR_AUDIO_SETTING_MUTE_FAILED;
1048         }
1049     }
1050     DelayedSingleton<AudioDeviceManager>::GetInstance()->ReportAudioDeviceInfo();
1051     if (currentCall->GetCallType() != CallType::TYPE_BLUETOOTH) {
1052         bool muted = DelayedSingleton<AudioProxy>::GetInstance()->IsMicrophoneMute();
1053         currentCall->SetMicPhoneState(muted);
1054         TELEPHONY_LOGI("SetMute success callId:%{public}d, mute:%{public}d", currentCall->GetCallID(), muted);
1055     }
1056     return TELEPHONY_SUCCESS;
1057 }
1058 
MuteRinger()1059 int32_t AudioControlManager::MuteRinger()
1060 {
1061     if (isVideoRingVibrating_) {
1062         DelayedSingleton<AudioProxy>::GetInstance()->StopVibrator();
1063         isVideoRingVibrating_ = false;
1064     }
1065     sptr<CallBase> incomingCall = CallObjectManager::GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_RINGING);
1066     if (incomingCall != nullptr) {
1067         if (incomingCall->GetCrsType() == CRS_TYPE && !IsVoIPCallActived()) {
1068             TELEPHONY_LOGI("Mute network ring tone.");
1069             MuteNetWorkRingTone(true);
1070         }
1071     }
1072     SendMuteRingEvent();
1073     if (ringState_ == RingState::STOPPED) {
1074         TELEPHONY_LOGI("ring already stopped");
1075         if (incomingCall != nullptr) {
1076             AAFwk::WantParams params = incomingCall->GetExtraParams();
1077             params.SetParam("isNeedMuteRing", AAFwk::Integer::Box(1));
1078             incomingCall->SetExtraParams(params);
1079         }
1080         return TELEPHONY_SUCCESS;
1081     }
1082     if (ring_ == nullptr) {
1083         TELEPHONY_LOGE("ring is nullptr");
1084         return CALL_ERR_AUDIO_SETTING_MUTE_FAILED;
1085     }
1086     if (ring_->SetMute() != TELEPHONY_SUCCESS) {
1087         TELEPHONY_LOGE("SetMute fail");
1088         return CALL_ERR_AUDIO_SETTING_MUTE_FAILED;
1089     }
1090     TELEPHONY_LOGI("mute ring success");
1091     return TELEPHONY_SUCCESS;
1092 }
1093 
SendMuteRingEvent()1094 void AudioControlManager::SendMuteRingEvent()
1095 {
1096     CallEventInfo eventInfo;
1097     eventInfo.eventId = CallAbilityEventId::EVENT_MUTE_RING;
1098     DelayedSingleton<CallAbilityReportProxy>::GetInstance()->CallEventUpdated(eventInfo);
1099 }
1100 
PlayCallEndedTone(CallEndedType type)1101 void AudioControlManager::PlayCallEndedTone(CallEndedType type)
1102 {
1103     int32_t state;
1104     DelayedSingleton<CallControlManager>::GetInstance()->GetVoIPCallState(state);
1105     if (state != static_cast<int32_t>(CallStateToApp::CALL_STATE_IDLE)) {
1106         TELEPHONY_LOGI("not play callEndTone when has voip call");
1107         return;
1108     }
1109     AudioStandard::AudioRingerMode ringMode = DelayedSingleton<AudioProxy>::GetInstance()->GetRingerMode();
1110     if (ringMode != AudioStandard::AudioRingerMode::RINGER_MODE_NORMAL) {
1111         HandleNotNormalRingerMode(type);
1112         return;
1113     }
1114     switch (type) {
1115         case CallEndedType::PHONE_IS_BUSY:
1116             PlayCallTone(ToneDescriptor::TONE_ENGAGED);
1117             break;
1118         case CallEndedType::CALL_ENDED_NORMALLY:
1119             if (toneState_ == ToneState::TONEING) {
1120                 StopCallTone();
1121             }
1122             TELEPHONY_LOGI("play call ended tone");
1123             if (IsBtCallDisconnected()) {
1124                 return;
1125             }
1126             if (PlayCallTone(ToneDescriptor::TONE_FINISHED) != TELEPHONY_SUCCESS) {
1127                 StopCallTone();
1128                 TELEPHONY_LOGE("play call ended tone failed");
1129                 return;
1130             }
1131             toneState_ = ToneState::CALLENDED;
1132             std::this_thread::sleep_for(std::chrono::milliseconds(CALL_ENDED_PLAY_TIME));
1133             toneState_ = ToneState::TONEING;
1134             if (StopCallTone() != TELEPHONY_SUCCESS) {
1135                 TELEPHONY_LOGE("stop call ended tone failed");
1136                 return;
1137             }
1138             break;
1139         case CallEndedType::UNKNOWN:
1140             PlayCallTone(ToneDescriptor::TONE_UNKNOWN);
1141             break;
1142         case CallEndedType::INVALID_NUMBER:
1143             PlayCallTone(ToneDescriptor::TONE_INVALID_NUMBER);
1144             break;
1145         default:
1146             break;
1147     }
1148 }
1149 
HandleNotNormalRingerMode(CallEndedType type)1150 void AudioControlManager::HandleNotNormalRingerMode(CallEndedType type)
1151 {
1152     TELEPHONY_LOGE("ringer mode is not normal");
1153     switch (type) {
1154         case CallEndedType::CALL_ENDED_NORMALLY:
1155             if (toneState_ == ToneState::TONEING) {
1156                 StopCallTone();
1157                 TELEPHONY_LOGI("ringer mode is not normal, stop call tone!");
1158             }
1159             break;
1160         default:
1161             break;
1162     }
1163 }
1164 
GetCallList()1165 std::set<sptr<CallBase>> AudioControlManager::GetCallList()
1166 {
1167     std::lock_guard<std::mutex> lock(mutex_);
1168     return totalCalls_;
1169 }
1170 
GetCurrentActiveCall()1171 sptr<CallBase> AudioControlManager::GetCurrentActiveCall()
1172 {
1173     int32_t callId = DelayedSingleton<CallStateProcessor>::GetInstance()->GetCurrentActiveCall();
1174     if (callId != INVALID_CALLID) {
1175         return GetCallBase(callId);
1176     }
1177     return nullptr;
1178 }
1179 
GetCallBase(int32_t callId)1180 sptr<CallBase> AudioControlManager::GetCallBase(int32_t callId)
1181 {
1182     sptr<CallBase> callBase = nullptr;
1183     std::lock_guard<std::mutex> lock(mutex_);
1184     for (auto &call : totalCalls_) {
1185         if (call->GetCallID() == callId) {
1186             callBase = call;
1187             break;
1188         }
1189     }
1190     return callBase;
1191 }
1192 
IsEmergencyCallExists()1193 bool AudioControlManager::IsEmergencyCallExists()
1194 {
1195     std::lock_guard<std::mutex> lock(mutex_);
1196     for (auto call : totalCalls_) {
1197         if (call->GetEmergencyState()) {
1198             return true;
1199         }
1200     }
1201     return false;
1202 }
1203 
GetAudioInterruptState()1204 AudioInterruptState AudioControlManager::GetAudioInterruptState()
1205 {
1206     return audioInterruptState_;
1207 }
1208 
SetVolumeAudible()1209 void AudioControlManager::SetVolumeAudible()
1210 {
1211     DelayedSingleton<AudioProxy>::GetInstance()->SetVolumeAudible();
1212 }
1213 
SetRingState(RingState state)1214 void AudioControlManager::SetRingState(RingState state)
1215 {
1216     ringState_ = state;
1217 }
1218 
SetSoundState(SoundState state)1219 void AudioControlManager::SetSoundState(SoundState state)
1220 {
1221     soundState_ = state;
1222 }
1223 
SetToneState(ToneState state)1224 void AudioControlManager::SetToneState(ToneState state)
1225 {
1226     std::lock_guard<std::recursive_mutex> lock(toneStateLock_);
1227     toneState_ = state;
1228 }
1229 
SetLocalRingbackNeeded(bool isNeeded)1230 void AudioControlManager::SetLocalRingbackNeeded(bool isNeeded)
1231 {
1232     if (isLocalRingbackNeeded_ && !isNeeded) {
1233         StopRingback();
1234     }
1235     isLocalRingbackNeeded_ = isNeeded;
1236 }
1237 
IsNumberAllowed(const std::string & phoneNum)1238 bool AudioControlManager::IsNumberAllowed(const std::string &phoneNum)
1239 {
1240     // check whether the phone number is allowed or not , should not ring if number is not allowed
1241     return true;
1242 }
1243 
ShouldPlayRingtone() const1244 bool AudioControlManager::ShouldPlayRingtone() const
1245 {
1246     auto processor = DelayedSingleton<CallStateProcessor>::GetInstance();
1247     int32_t alertingCallNum = processor->GetCallNumber(TelCallState::CALL_STATUS_ALERTING);
1248     int32_t incomingCallNum = processor->GetCallNumber(TelCallState::CALL_STATUS_INCOMING);
1249     if (incomingCallNum == EMPTY_VALUE || alertingCallNum > EMPTY_VALUE || ringState_ == RingState::RINGING
1250         || (soundState_ == SoundState::SOUNDING && CallObjectManager::HasIncomingCallCrsType())) {
1251         TELEPHONY_LOGI("should not play ring tone.");
1252         return false;
1253     }
1254     return true;
1255 }
1256 
IsAudioActivated() const1257 bool AudioControlManager::IsAudioActivated() const
1258 {
1259     return audioInterruptState_ == AudioInterruptState::INTERRUPT_STATE_ACTIVATED ||
1260         audioInterruptState_ == AudioInterruptState::INTERRUPT_STATE_RINGING;
1261 }
1262 
PlayCallTone(ToneDescriptor type)1263 int32_t AudioControlManager::PlayCallTone(ToneDescriptor type)
1264 {
1265     std::lock_guard<std::recursive_mutex> lock(toneStateLock_);
1266     if (toneState_ == ToneState::TONEING) {
1267         TELEPHONY_LOGE("callTone is already playing");
1268         return CALL_ERR_AUDIO_TONE_PLAY_FAILED;
1269     }
1270     toneState_ = ToneState::TONEING;
1271     tone_ = std::make_unique<Tone>(type);
1272     if (tone_ == nullptr) {
1273         TELEPHONY_LOGE("create tone failed");
1274         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1275     }
1276     if (tone_->Play() != TELEPHONY_SUCCESS) {
1277         TELEPHONY_LOGE("play calltone failed");
1278         return CALL_ERR_AUDIO_TONE_PLAY_FAILED;
1279     }
1280     TELEPHONY_LOGI("play calltone success");
1281     return TELEPHONY_SUCCESS;
1282 }
1283 
StopCallTone()1284 int32_t AudioControlManager::StopCallTone()
1285 {
1286     TELEPHONY_LOGI("stop call tone enter");
1287     std::lock_guard<std::recursive_mutex> lock(toneStateLock_);
1288     if (toneState_ == ToneState::STOPPED) {
1289         TELEPHONY_LOGI("tone is already stopped");
1290         return TELEPHONY_SUCCESS;
1291     }
1292     if (toneState_ == ToneState::CALLENDED) {
1293         TELEPHONY_LOGE("call ended tone is running");
1294         return CALL_ERR_AUDIO_TONE_STOP_FAILED;
1295     }
1296     if (tone_ == nullptr) {
1297         TELEPHONY_LOGE("tone_ is nullptr");
1298         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1299     }
1300     if (tone_->Stop() != TELEPHONY_SUCCESS) {
1301         TELEPHONY_LOGE("stop calltone failed");
1302         return CALL_ERR_AUDIO_TONE_STOP_FAILED;
1303     }
1304     tone_->ReleaseRenderer();
1305     toneState_ = ToneState::STOPPED;
1306     TELEPHONY_LOGI("stop call tone success");
1307     return TELEPHONY_SUCCESS;
1308 }
1309 
IsTonePlaying()1310 bool AudioControlManager::IsTonePlaying()
1311 {
1312     std::lock_guard<std::recursive_mutex> lock(toneStateLock_);
1313     return toneState_ == ToneState::TONEING;
1314 }
1315 
IsCurrentRinging() const1316 bool AudioControlManager::IsCurrentRinging() const
1317 {
1318     return ringState_ == RingState::RINGING;
1319 }
1320 
PlayRingback()1321 int32_t AudioControlManager::PlayRingback()
1322 {
1323     if (!isLocalRingbackNeeded_) {
1324         return CALL_ERR_AUDIO_TONE_PLAY_FAILED;
1325     }
1326     return PlayCallTone(ToneDescriptor::TONE_RINGBACK);
1327 }
1328 
StopRingback()1329 int32_t AudioControlManager::StopRingback()
1330 {
1331     if (tone_ != nullptr && tone_->getCurrentToneType() == ToneDescriptor::TONE_RINGBACK) {
1332         return StopCallTone();
1333     }
1334     return TELEPHONY_SUCCESS;
1335 }
1336 
PlayWaitingTone()1337 int32_t AudioControlManager::PlayWaitingTone()
1338 {
1339     return PlayCallTone(ToneDescriptor::TONE_WAITING);
1340 }
1341 
StopWaitingTone()1342 int32_t AudioControlManager::StopWaitingTone()
1343 {
1344     if (tone_ != nullptr && tone_->getCurrentToneType() == ToneDescriptor::TONE_WAITING) {
1345         return StopCallTone();
1346     }
1347     return TELEPHONY_SUCCESS;
1348 }
1349 
PlayDtmfTone(char str)1350 int32_t AudioControlManager::PlayDtmfTone(char str)
1351 {
1352     ToneDescriptor dtmfTone = Tone::ConvertDigitToTone(str);
1353     std::unique_ptr<Tone> tone = std::make_unique<Tone>(dtmfTone);
1354     if (tone == nullptr) {
1355         TELEPHONY_LOGE("create dtmf tone failed");
1356         return TELEPHONY_ERR_LOCAL_PTR_NULL;
1357     }
1358     if (tone->Play() != TELEPHONY_SUCCESS) {
1359         TELEPHONY_LOGE("play dtmftone failed");
1360         return CALL_ERR_AUDIO_TONE_PLAY_FAILED;
1361     }
1362     TELEPHONY_LOGI("play dtmftone success");
1363     std::this_thread::sleep_for(std::chrono::milliseconds(DTMF_PLAY_TIME));
1364     if (tone->Stop() != TELEPHONY_SUCCESS) {
1365         TELEPHONY_LOGE("stop dtmftone failed");
1366         return CALL_ERR_AUDIO_TONE_STOP_FAILED;
1367     }
1368     tone->ReleaseRenderer();
1369     TELEPHONY_LOGI("stop dtmf tone success");
1370     return TELEPHONY_SUCCESS;
1371 }
1372 
StopDtmfTone()1373 int32_t AudioControlManager::StopDtmfTone()
1374 {
1375     return StopCallTone();
1376 }
1377 
OnPostDialNextChar(char str)1378 int32_t AudioControlManager::OnPostDialNextChar(char str)
1379 {
1380     int32_t result = PlayDtmfTone(str);
1381     if (result != TELEPHONY_SUCCESS) {
1382         return result;
1383     }
1384     return TELEPHONY_SUCCESS;
1385 }
1386 
NewCallCreated(sptr<CallBase> & callObjectPtr)1387 void AudioControlManager::NewCallCreated(sptr<CallBase> &callObjectPtr) {}
1388 
CallDestroyed(const DisconnectedDetails & details)1389 void AudioControlManager::CallDestroyed(const DisconnectedDetails &details) {}
1390 
IsSoundPlaying()1391 bool AudioControlManager::IsSoundPlaying()
1392 {
1393     return soundState_ == SoundState::SOUNDING;
1394 }
1395 
MuteNetWorkRingTone(bool isMute)1396 void AudioControlManager::MuteNetWorkRingTone(bool isMute)
1397 {
1398     if (soundState_ == SoundState::SOUNDING) {
1399         DelayedSingleton<AudioProxy>::GetInstance()->SetVoiceRingtoneMute(isMute);
1400     }
1401     TELEPHONY_LOGI("Set Voice Ringtone mute,isMute: %{public}d", isMute);
1402     if (isCrsVibrating_ && isMute) {
1403         DelayedSingleton<AudioProxy>::GetInstance()->StopVibrator();
1404         isCrsVibrating_ = false;
1405     }
1406 }
1407 
IsVideoCall(VideoStateType videoState)1408 bool AudioControlManager::IsVideoCall(VideoStateType videoState)
1409 {
1410     return videoState == VideoStateType::TYPE_VIDEO;
1411 }
1412 
IsBtOrWireHeadPlugin()1413 bool AudioControlManager::IsBtOrWireHeadPlugin()
1414 {
1415     return AudioDeviceManager::IsBtActived() || AudioDeviceManager::IsWiredHeadsetConnected();
1416 }
1417 
IsRingingVibrateModeOn()1418 bool AudioControlManager::IsRingingVibrateModeOn()
1419 {
1420     auto datashareHelper = SettingsDataShareHelper::GetInstance();
1421     std::string ringingVibrateModeEnable {"0"};
1422     std::vector<int> activedOsAccountIds;
1423     OHOS::AccountSA::OsAccountManager::QueryActiveOsAccountIds(activedOsAccountIds);
1424     if (activedOsAccountIds.empty()) {
1425         TELEPHONY_LOGW("activedOsAccountIds is empty");
1426         return false;
1427     }
1428     int userId = activedOsAccountIds[0];
1429     OHOS::Uri uri(
1430         "datashare:///com.ohos.settingsdata/entry/settingsdata/USER_SETTINGSDATA_"
1431         + std::to_string(userId) + "?Proxy=true");
1432     int resp = datashareHelper->Query(uri, "hw_vibrate_when_ringing", ringingVibrateModeEnable);
1433     if ((resp == TELEPHONY_SUCCESS && ringingVibrateModeEnable == "1") || resp == TELEPHONY_ERR_UNINIT) {
1434         TELEPHONY_LOGI("RingingVibrateModeOpen:true");
1435         return true;
1436     }
1437     return false;
1438 }
IsVoIPCallActived()1439 bool AudioControlManager::IsVoIPCallActived()
1440 {
1441     int32_t state;
1442     DelayedSingleton<CallControlManager>::GetInstance()->GetVoIPCallState(state);
1443     if (state == static_cast<int32_t>(CallStateToApp::CALL_STATE_IDLE) ||
1444         state == static_cast<int32_t>(CallStateToApp::CALL_STATE_UNKNOWN)) {
1445         return false;
1446     }
1447     TELEPHONY_LOGI("VoIP Call is actived");
1448     return true;
1449 }
1450 
IsBtCallDisconnected()1451 bool AudioControlManager::IsBtCallDisconnected()
1452 {
1453     sptr<CallBase> call = CallObjectManager::GetOneCallObject(CallRunningState::CALL_RUNNING_STATE_ENDED);
1454     if (call != nullptr && call->GetCallType() == CallType::TYPE_BLUETOOTH) {
1455         return true;
1456     }
1457     return false;
1458 }
1459 
SetRingToneVolume(float volume)1460 void AudioControlManager::SetRingToneVolume(float volume)
1461 {
1462     if (ring_ == nullptr) {
1463         TELEPHONY_LOGE("ring_ is nullptr ignore SetRingToneVolume");
1464         return;
1465     }
1466     if (volume >= 0.0f && volume <= 1.0f) {
1467         ring_->SetRingToneVolume(volume);
1468         return;
1469     } else {
1470         TELEPHONY_LOGE("volume is valid");
1471     }
1472 }
IsScoTemporarilyDisabled()1473 bool AudioControlManager::IsScoTemporarilyDisabled()
1474 {
1475     return isScoTemporarilyDisabled_;
1476 }
ExcludeBluetoothSco()1477 void AudioControlManager::ExcludeBluetoothSco()
1478 {
1479     TELEPHONY_LOGI("ExcludeBluetoothSco start");
1480     AudioSystemManager *audioSystemMananger = AudioSystemManager::GetInstance();
1481     if (audioSystemMananger == nullptr) {
1482         TELEPHONY_LOGI("audioSystemMananger nullptr");
1483         return;
1484     }
1485     std::shared_ptr<AudioStandard::AudioDeviceDescriptor> audioDev =
1486         std::make_shared<AudioStandard::AudioDeviceDescriptor>();
1487     if (audioDev != nullptr) {
1488         audioDev->macAddress_ = "";
1489         audioDev->deviceType_ = AudioStandard::DEVICE_TYPE_BLUETOOTH_SCO;
1490     }
1491     std::vector<std::shared_ptr<AudioDeviceDescriptor>> target;
1492     target.push_back(audioDev);
1493     if (target.size() <= 0) {
1494         TELEPHONY_LOGI("target.size <= 0");
1495         return;
1496     }
1497     int32_t result = audioSystemMananger->ExcludeOutputDevices(CALL_OUTPUT_DEVICES, target);
1498     if (result != TELEPHONY_SUCCESS) {
1499         TELEPHONY_LOGI("ExcludeOutputDevices failed");
1500         return;
1501     }
1502     isScoTemporarilyDisabled_ = true;
1503     TELEPHONY_LOGI("ExcludeBluetoothSco end");
1504 }
UnexcludeBluetoothSco()1505 void AudioControlManager::UnexcludeBluetoothSco()
1506 {
1507     TELEPHONY_LOGI("UnexcludeBluetoothSco start");
1508     AudioSystemManager *audioSystemMananger = AudioSystemManager::GetInstance();
1509     if (audioSystemMananger == nullptr) {
1510         TELEPHONY_LOGI("audioSystemMananger nullptr");
1511         return;
1512     }
1513     std::shared_ptr<AudioStandard::AudioDeviceDescriptor> audioDev =
1514         std::make_shared<AudioStandard::AudioDeviceDescriptor>();
1515     if (audioDev != nullptr) {
1516         audioDev->macAddress_ = "";
1517         audioDev->deviceType_ = AudioStandard::DEVICE_TYPE_BLUETOOTH_SCO;
1518     }
1519     std::vector<std::shared_ptr<AudioDeviceDescriptor>> target;
1520     target.push_back(audioDev);
1521     if (target.size() <= 0) {
1522         TELEPHONY_LOGI("target.size <= 0");
1523         return;
1524     }
1525     int32_t result = audioSystemMananger->UnexcludeOutputDevices(CALL_OUTPUT_DEVICES, target);
1526     if (result != TELEPHONY_SUCCESS) {
1527         TELEPHONY_LOGI("UnexcludeOutputDevices failed");
1528         return;
1529     }
1530     isScoTemporarilyDisabled_ = false;
1531     TELEPHONY_LOGI("UnexcludeBluetoothSco end");
1532 }
1533 
GetBackupVoiceVolume()1534 int32_t AudioControlManager::GetBackupVoiceVolume()
1535 {
1536     return voiceVolume_;
1537 }
1538 
SaveVoiceVolume(int32_t volume)1539 void AudioControlManager::SaveVoiceVolume(int32_t volume)
1540 {
1541     voiceVolume_ = volume;
1542 }
1543 
AdjustVolumesForCrs()1544 void AudioControlManager::AdjustVolumesForCrs()
1545 {
1546     auto audioProxy = DelayedSingleton<AudioProxy>::GetInstance();
1547     int32_t ringVolume = audioProxy->GetVolume(AudioStandard::AudioVolumeType::STREAM_RING);
1548     int32_t voiceVolume = audioProxy->GetVolume(AudioStandard::AudioVolumeType::STREAM_VOICE_CALL);
1549     TELEPHONY_LOGI("now ringVolume is %{public}d, voiceVolume is %{public}d", ringVolume, voiceVolume);
1550     audioProxy->SetVolume(AudioStandard::AudioVolumeType::STREAM_VOICE_CALL, ringVolume);
1551     SaveVoiceVolume(voiceVolume);
1552 }
1553 
RestoreVoiceValumeIfNecessary()1554 void AudioControlManager::RestoreVoiceValumeIfNecessary()
1555 {
1556     auto voiceVolume = GetBackupVoiceVolume();
1557     TELEPHONY_LOGI("now voiceVolume is %{public}d", voiceVolume);
1558     if (voiceVolume >= 0) {
1559         DelayedSingleton<AudioProxy>::GetInstance()->SetVolumeWithDevice(
1560             AudioStandard::AudioVolumeType::STREAM_VOICE_CALL, voiceVolume,
1561             AudioStandard::DeviceType::DEVICE_TYPE_SPEAKER);
1562         SaveVoiceVolume(-1);
1563     }
1564 }
1565 } // namespace Telephony
1566 } // namespace OHOS