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