• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 #include "call_state_processor.h"
18 
19 #include "telephony_log_wrapper.h"
20 
21 #include "call_control_manager.h"
22 
23 namespace OHOS {
24 namespace Telephony {
AudioControlManager()25 AudioControlManager::AudioControlManager()
26     : isTonePlaying_(false), isLocalRingbackNeeded_(false), ring_(nullptr), tone_(nullptr)
27 {}
28 
~AudioControlManager()29 AudioControlManager::~AudioControlManager() {}
30 
Init()31 void AudioControlManager::Init()
32 {
33     DelayedSingleton<AudioDeviceManager>::GetInstance()->Init();
34     DelayedSingleton<AudioSceneProcessor>::GetInstance()->Init();
35 }
36 
CallStateUpdated(sptr<CallBase> & callObjectPtr,TelCallState priorState,TelCallState nextState)37 void AudioControlManager::CallStateUpdated(
38     sptr<CallBase> &callObjectPtr, TelCallState priorState, TelCallState nextState)
39 {
40     if (callObjectPtr == nullptr) {
41         TELEPHONY_LOGE("call object nullptr");
42         return;
43     }
44     if (totalCalls_.count(callObjectPtr) == 0) {
45         int32_t callId = callObjectPtr->GetCallID();
46         TelCallState callState = callObjectPtr->GetTelCallState();
47         TELEPHONY_LOGI("add new call , call id : %{public}d , call state : %{public}d", callId, callState);
48         totalCalls_.insert(callObjectPtr);
49     }
50     HandleCallStateUpdated(callObjectPtr, priorState, nextState);
51     if (nextState == TelCallState::CALL_STATUS_DISCONNECTED && totalCalls_.count(callObjectPtr) > 0) {
52         totalCalls_.erase(callObjectPtr);
53     }
54 }
55 
IncomingCallActivated(sptr<CallBase> & callObjectPtr)56 void AudioControlManager::IncomingCallActivated(sptr<CallBase> &callObjectPtr)
57 {
58     if (callObjectPtr == nullptr) {
59         TELEPHONY_LOGE("call object ptr nullptr");
60         return;
61     }
62     StopRingtone();
63     DelayedSingleton<AudioProxy>::GetInstance()->SetMicrophoneMute(false); // unmute microphone
64 }
65 
IncomingCallHungUp(sptr<CallBase> & callObjectPtr,bool isSendSms,std::string content)66 void AudioControlManager::IncomingCallHungUp(sptr<CallBase> &callObjectPtr, bool isSendSms, std::string content)
67 {
68     if (callObjectPtr == nullptr) {
69         TELEPHONY_LOGE("call object ptr nullptr");
70         return;
71     }
72     StopRingtone();
73     DelayedSingleton<AudioProxy>::GetInstance()->SetMicrophoneMute(true); // mute microphone
74 }
75 
HandleCallStateUpdated(sptr<CallBase> & callObjectPtr,TelCallState priorState,TelCallState nextState)76 void AudioControlManager::HandleCallStateUpdated(
77     sptr<CallBase> &callObjectPtr, TelCallState priorState, TelCallState nextState)
78 {
79     HandleNextState(callObjectPtr, nextState);
80     if (priorState == nextState) {
81         TELEPHONY_LOGI("prior state equals next state");
82         return;
83     }
84     HandlePriorState(callObjectPtr, priorState);
85 }
86 
HandleNextState(sptr<CallBase> & callObjectPtr,TelCallState nextState)87 void AudioControlManager::HandleNextState(sptr<CallBase> &callObjectPtr, TelCallState nextState)
88 {
89     AudioEvent event = AudioEvent::UNKNOWN_EVENT;
90     std::string number = callObjectPtr->GetAccountNumber();
91     DelayedSingleton<CallStateProcessor>::GetInstance()->AddCall(number, nextState);
92     switch (nextState) {
93         case TelCallState::CALL_STATUS_ALERTING:
94             event = AudioEvent::NEW_ALERTING_CALL;
95             break;
96         case TelCallState::CALL_STATUS_ACTIVE:
97             HandleNewActiveCall(callObjectPtr);
98             break;
99         case TelCallState::CALL_STATUS_INCOMING:
100             event = AudioEvent::NEW_INCOMING_CALL;
101             break;
102         default:
103             break;
104     }
105     if (event == AudioEvent::UNKNOWN_EVENT) {
106         return;
107     }
108     DelayedSingleton<AudioSceneProcessor>::GetInstance()->ProcessEvent(event);
109 }
110 
HandlePriorState(sptr<CallBase> & callObjectPtr,TelCallState priorState)111 void AudioControlManager::HandlePriorState(sptr<CallBase> &callObjectPtr, TelCallState priorState)
112 {
113     AudioEvent event = AudioEvent::UNKNOWN_EVENT;
114     std::string number = callObjectPtr->GetAccountNumber();
115     DelayedSingleton<CallStateProcessor>::GetInstance()->DeleteCall(number, priorState);
116     int32_t stateNumber = DelayedSingleton<CallStateProcessor>::GetInstance()->GetCallNumber(priorState);
117     switch (priorState) {
118         case TelCallState::CALL_STATUS_ALERTING:
119             if (stateNumber == EMPTY_VALUE) {
120                 StopRingback(); // should stop ringtone while no more alerting calls
121                 event = AudioEvent::NO_MORE_ALERTING_CALL;
122             }
123             break;
124         case TelCallState::CALL_STATUS_INCOMING:
125             if (stateNumber == EMPTY_VALUE) {
126                 StopRingtone(); // should stop ringtone while no more incoming calls
127                 event = AudioEvent::NO_MORE_INCOMING_CALL;
128             }
129             break;
130         case TelCallState::CALL_STATUS_ACTIVE:
131             if (stateNumber == EMPTY_VALUE) {
132                 // mute microphone while no more active call
133                 DelayedSingleton<AudioProxy>::GetInstance()->SetMicrophoneMute(true);
134                 event = AudioEvent::NO_MORE_ACTIVE_CALL;
135             }
136             break;
137         default:
138             break;
139     }
140     if (event == AudioEvent::UNKNOWN_EVENT) {
141         return;
142     }
143     DelayedSingleton<AudioSceneProcessor>::GetInstance()->ProcessEvent(event);
144 }
145 
HandleNewActiveCall(sptr<CallBase> & callObjectPtr)146 void AudioControlManager::HandleNewActiveCall(sptr<CallBase> &callObjectPtr)
147 {
148     std::string number = callObjectPtr->GetAccountNumber();
149     if (number.empty()) {
150         TELEPHONY_LOGE("call object account number empty");
151         return;
152     }
153     CallType callType = callObjectPtr->GetCallType();
154     AudioEvent event = AudioEvent::UNKNOWN_EVENT;
155     switch (callType) {
156         case CallType::TYPE_CS:
157             event = AudioEvent::NEW_ACTIVE_CS_CALL;
158             break;
159         case CallType::TYPE_IMS:
160             event = AudioEvent::NEW_ACTIVE_IMS_CALL;
161             break;
162         case CallType::TYPE_OTT:
163             event = AudioEvent::NEW_ACTIVE_OTT_CALL;
164             break;
165         default:
166             break;
167     }
168     if (event == AudioEvent::UNKNOWN_EVENT) {
169         return;
170     }
171     DelayedSingleton<AudioSceneProcessor>::GetInstance()->ProcessEvent(event);
172 }
173 
174 /**
175  * @param device , audio device
176  * usually called by the ui interaction , in purpose of switching to another audio device
177  */
SetAudioDevice(AudioDevice device)178 int32_t AudioControlManager::SetAudioDevice(AudioDevice device)
179 {
180     AudioDevice audioDevice = AudioDevice::DEVICE_UNKNOWN;
181     switch (device) {
182         case AudioDevice::DEVICE_SPEAKER:
183         case AudioDevice::DEVICE_EARPIECE:
184         case AudioDevice::DEVICE_WIRED_HEADSET:
185         case AudioDevice::DEVICE_BLUETOOTH_SCO:
186             audioDevice = device;
187             break;
188         default:
189             break;
190     }
191     if (audioDevice != AudioDevice::DEVICE_UNKNOWN &&
192         DelayedSingleton<AudioDeviceManager>::GetInstance()->SwitchDevice(audioDevice)) {
193         return TELEPHONY_SUCCESS;
194     }
195     return CALL_ERR_AUDIO_SET_AUDIO_DEVICE_FAILED;
196 }
197 
PlayRingtone()198 bool AudioControlManager::PlayRingtone()
199 {
200     if (!ShouldPlayRingtone()) {
201         TELEPHONY_LOGE("should not play ringtone");
202         return false;
203     }
204     ring_ = std::make_unique<Ring>();
205     if (ring_ == nullptr) {
206         TELEPHONY_LOGE("create ring object failed");
207         return false;
208     }
209     if (ring_->Play() != TELEPHONY_SUCCESS) {
210         TELEPHONY_LOGE("play ringtone failed");
211         return false;
212     }
213     TELEPHONY_LOGI("play ringtone success");
214     return true;
215 }
216 
PlayRingtone(const std::string & phoneNum)217 bool AudioControlManager::PlayRingtone(const std::string &phoneNum)
218 {
219     if (!IsNumberAllowed(phoneNum)) {
220         TELEPHONY_LOGE("number is not allowed");
221         return false;
222     }
223     if (!ShouldPlayRingtone()) {
224         TELEPHONY_LOGE("should not play ringtone");
225         return false;
226     }
227     ring_ = std::make_unique<Ring>();
228     if (ring_ == nullptr) {
229         TELEPHONY_LOGE("create ring failed");
230         return false;
231     }
232     if (ring_->Play() != TELEPHONY_SUCCESS) {
233         TELEPHONY_LOGE("play ringtone failed");
234         return false;
235     }
236     TELEPHONY_LOGI("play ringtone success");
237     return true;
238 }
239 
PlayRingtone(const std::string & phoneNum,const std::string & ringtonePath)240 bool AudioControlManager::PlayRingtone(const std::string &phoneNum, const std::string &ringtonePath)
241 {
242     if (!IsNumberAllowed(phoneNum)) {
243         TELEPHONY_LOGE("number is not allowed");
244         return false;
245     }
246     if (!ShouldPlayRingtone()) {
247         TELEPHONY_LOGE("should not play ringtone");
248         return false;
249     }
250     ring_ = std::make_unique<Ring>(ringtonePath);
251     if (ring_ == nullptr) {
252         TELEPHONY_LOGE("create ring failed");
253         return false;
254     }
255     if (ring_->Play() == TELEPHONY_SUCCESS) {
256         TELEPHONY_LOGE("play ringtone failed");
257         return false;
258     }
259     TELEPHONY_LOGI("play ringtone success");
260     return true;
261 }
262 
StopRingtone()263 bool AudioControlManager::StopRingtone()
264 {
265     if (ringState_ == RingState::STOPPED) {
266         TELEPHONY_LOGI("ringtone already stopped");
267         return true;
268     }
269     if (ring_ != nullptr && ring_->Stop() == TELEPHONY_SUCCESS) {
270         TELEPHONY_LOGI("stop ringtone success");
271         ring_ = nullptr;
272         return true;
273     }
274     TELEPHONY_LOGE("stop ringtone failed");
275     return false;
276 }
277 
SetAudioInterruptState(AudioInterruptState state)278 void AudioControlManager::SetAudioInterruptState(AudioInterruptState state)
279 {
280     TELEPHONY_LOGI("set audio interrupt state : %{public}d", state);
281     audioInterruptState_ = state;
282     /**
283      * send audio interrupt event to audio device manager , maybe need to reinitialize the audio device
284      */
285     AudioEvent event = AudioEvent::UNKNOWN_EVENT;
286     switch (audioInterruptState_) {
287         case AudioInterruptState::INTERRUPT_STATE_ACTIVATED:
288             event = AudioEvent::AUDIO_ACTIVATED;
289             break;
290         case AudioInterruptState::INTERRUPT_STATE_DEACTIVATED:
291             event = AudioEvent::AUDIO_DEACTIVATED;
292             break;
293         case AudioInterruptState::INTERRUPT_STATE_RINGING:
294             event = AudioEvent::AUDIO_RINGING;
295             break;
296         default:
297             break;
298     }
299     if (event == AudioEvent::UNKNOWN_EVENT) {
300         return;
301     }
302     DelayedSingleton<AudioDeviceManager>::GetInstance()->ProcessEvent(event);
303 }
304 
305 /**
306  * while audio state changed , maybe need to reinitialize the audio device
307  * in order to get the initialization status of audio device , need to consider varieties of  audio conditions
308  */
GetInitAudioDevice() const309 AudioDevice AudioControlManager::GetInitAudioDevice() const
310 {
311     if (audioInterruptState_ == AudioInterruptState::INTERRUPT_STATE_DEACTIVATED) {
312         return AudioDevice::DEVICE_DISABLE;
313     } else {
314         // interrupted or ringing , priority : bt sco , wired headset , speaker
315         if (AudioDeviceManager::IsBtScoConnected()) {
316             return AudioDevice::DEVICE_BLUETOOTH_SCO;
317         }
318         if (AudioDeviceManager::IsWiredHeadsetConnected()) {
319             return AudioDevice::DEVICE_WIRED_HEADSET;
320         }
321         if (audioInterruptState_ == AudioInterruptState::INTERRUPT_STATE_RINGING) {
322             return AudioDevice::DEVICE_SPEAKER;
323         }
324         if (GetCurrentActiveCall() != nullptr && GetCurrentActiveCall()->IsSpeakerphoneOn()) {
325             TELEPHONY_LOGI("current call speaker is active");
326             return AudioDevice::DEVICE_SPEAKER;
327         }
328         if (AudioDeviceManager::IsEarpieceAvailable()) {
329             return AudioDevice::DEVICE_EARPIECE;
330         }
331         return AudioDevice::DEVICE_SPEAKER;
332     }
333 }
334 
335 /**
336  * @param isMute , mute state
337  * usually called by the ui interaction , mute or unmute microphone
338  */
SetMute(bool isMute)339 int32_t AudioControlManager::SetMute(bool isMute)
340 {
341     bool hasCall = DelayedSingleton<CallControlManager>::GetInstance()->HasCall();
342     if (!hasCall) {
343         TELEPHONY_LOGE("no call exists, set mute failed");
344         return CALL_ERR_AUDIO_SETTING_MUTE_FAILED;
345     }
346     if (DelayedSingleton<CallControlManager>::GetInstance()->HasEmergency()) {
347         isMute = false;
348     }
349     if (DelayedSingleton<AudioProxy>::GetInstance()->SetMicrophoneMute(isMute)) {
350         TELEPHONY_LOGI("set mute success , current mute state : %{public}d", isMute);
351         return TELEPHONY_SUCCESS;
352     }
353     TELEPHONY_LOGE("set mute failed");
354     return CALL_ERR_AUDIO_SETTING_MUTE_FAILED;
355 }
356 
MuteRinger()357 int32_t AudioControlManager::MuteRinger()
358 {
359     if (ringState_ == RingState::STOPPED) {
360         TELEPHONY_LOGI("ring alreay stopped");
361         return TELEPHONY_SUCCESS;
362     }
363     if (ring_ != nullptr && ring_->Stop() == TELEPHONY_SUCCESS) {
364         TELEPHONY_LOGI("mute ring success");
365         return TELEPHONY_SUCCESS;
366     }
367     TELEPHONY_LOGE("mute ring failed");
368     return CALL_ERR_AUDIO_SETTING_MUTE_FAILED;
369 }
370 
PlayCallEndedTone(TelCallState priorState,TelCallState nextState,CallEndedType type)371 void AudioControlManager::PlayCallEndedTone(TelCallState priorState, TelCallState nextState, CallEndedType type)
372 {
373     if (nextState != TelCallState::CALL_STATUS_DISCONNECTED) {
374         return;
375     }
376     if (priorState == TelCallState::CALL_STATUS_ACTIVE || priorState == TelCallState::CALL_STATUS_DIALING ||
377         priorState == TelCallState::CALL_STATUS_HOLDING) {
378         switch (type) {
379             case CallEndedType::PHONE_IS_BUSY:
380                 PlayCallTone(ToneDescriptor::TONE_ENGAGED);
381                 break;
382             case CallEndedType::CALL_ENDED_NORMALLY:
383                 PlayCallTone(ToneDescriptor::TONE_FINISHED);
384                 break;
385             case CallEndedType::UNKNOWN:
386                 PlayCallTone(ToneDescriptor::TONE_UNKNOWN);
387                 break;
388             case CallEndedType::INVALID_NUMBER:
389                 PlayCallTone(ToneDescriptor::TONE_INVALID_NUMBER);
390                 break;
391             default:
392                 break;
393         }
394     }
395 }
396 
GetCallList()397 std::set<sptr<CallBase>> AudioControlManager::GetCallList()
398 {
399     return totalCalls_;
400 }
401 
GetCurrentActiveCall() const402 sptr<CallBase> AudioControlManager::GetCurrentActiveCall() const
403 {
404     std::string number = DelayedSingleton<CallStateProcessor>::GetInstance()->GetCurrentActiveCall();
405     if (!number.empty()) {
406         return GetCallBase(number);
407     }
408     return nullptr;
409 }
410 
GetCallBase(const std::string & phoneNum) const411 sptr<CallBase> AudioControlManager::GetCallBase(const std::string &phoneNum) const
412 {
413     sptr<CallBase> callBase = nullptr;
414     if (phoneNum.empty()) {
415         return callBase;
416     }
417     for (auto &call : totalCalls_) {
418         if (call->GetAccountNumber() == phoneNum) {
419             callBase = call;
420             break;
421         }
422     }
423     return callBase;
424 }
425 
IsEmergencyCallExists() const426 bool AudioControlManager::IsEmergencyCallExists() const
427 {
428     for (auto call : totalCalls_) {
429         if (call->GetEmergencyState()) {
430             return true;
431         }
432     }
433     return false;
434 }
435 
GetAudioInterruptState()436 AudioInterruptState AudioControlManager::GetAudioInterruptState()
437 {
438     return audioInterruptState_;
439 }
440 
SetVolumeAudible()441 void AudioControlManager::SetVolumeAudible()
442 {
443     DelayedSingleton<AudioProxy>::GetInstance()->SetVolumeAudible();
444 }
445 
SetRingState(RingState state)446 void AudioControlManager::SetRingState(RingState state)
447 {
448     ringState_ = state;
449 }
450 
SetLocalRingbackNeeded(bool isNeeded)451 void AudioControlManager::SetLocalRingbackNeeded(bool isNeeded)
452 {
453     isLocalRingbackNeeded_ = isNeeded;
454 }
455 
IsNumberAllowed(const std::string & phoneNum)456 bool AudioControlManager::IsNumberAllowed(const std::string &phoneNum)
457 {
458     // check whether the phone number is allowed or not , should not ring if number is not allowed
459     return true;
460 }
461 
ShouldPlayRingtone() const462 bool AudioControlManager::ShouldPlayRingtone() const
463 {
464     auto processor = DelayedSingleton<CallStateProcessor>::GetInstance();
465     int32_t alertingCallNum = processor->GetCallNumber(TelCallState::CALL_STATUS_ALERTING);
466     int32_t incomingCallNum = processor->GetCallNumber(TelCallState::CALL_STATUS_INCOMING);
467     if (incomingCallNum != EXIST_ONLY_ONE_CALL || alertingCallNum > EMPTY_VALUE ||
468         ringState_ == RingState::RINGING) {
469         return false;
470     }
471     return true;
472 }
473 
IsAudioActivated() const474 bool AudioControlManager::IsAudioActivated() const
475 {
476     return audioInterruptState_ == AudioInterruptState::INTERRUPT_STATE_ACTIVATED ||
477         audioInterruptState_ == AudioInterruptState::INTERRUPT_STATE_RINGING;
478 }
479 
PlayCallTone(ToneDescriptor type)480 int32_t AudioControlManager::PlayCallTone(ToneDescriptor type)
481 {
482     tone_ = std::make_unique<Tone>(type);
483     if (tone_ == nullptr) {
484         TELEPHONY_LOGE("create tone failed");
485         return TELEPHONY_ERR_LOCAL_PTR_NULL;
486     }
487     if (tone_->Play() == TELEPHONY_SUCCESS) {
488         isTonePlaying_ = true;
489         return TELEPHONY_SUCCESS;
490     }
491     TELEPHONY_LOGE("play call tone failed");
492     return CALL_ERR_AUDIO_TONE_PLAY_FAILED;
493 }
494 
StopCallTone()495 int32_t AudioControlManager::StopCallTone()
496 {
497     if (!isTonePlaying_) {
498         TELEPHONY_LOGI("tone is already stopped");
499         return TELEPHONY_SUCCESS;
500     }
501     if (tone_ != nullptr && tone_->Stop() == TELEPHONY_SUCCESS) {
502         isTonePlaying_ = false;
503         tone_ = nullptr;
504         return TELEPHONY_SUCCESS;
505     }
506     TELEPHONY_LOGE("stop call tone failed");
507     return CALL_ERR_AUDIO_TONE_STOP_FAILED;
508 }
509 
IsTonePlaying() const510 bool AudioControlManager::IsTonePlaying() const
511 {
512     return isTonePlaying_;
513 }
514 
IsCurrentRinging() const515 bool AudioControlManager::IsCurrentRinging() const
516 {
517     return ringState_ == RingState::RINGING;
518 }
519 
PlayRingback()520 int32_t AudioControlManager::PlayRingback()
521 {
522     if (!isLocalRingbackNeeded_) {
523         return CALL_ERR_AUDIO_TONE_PLAY_FAILED;
524     }
525     return PlayCallTone(ToneDescriptor::TONE_RINGBACK);
526 }
527 
StopRingback()528 int32_t AudioControlManager::StopRingback()
529 {
530     return StopCallTone();
531 }
532 
PlayWaitingTone()533 int32_t AudioControlManager::PlayWaitingTone()
534 {
535     return PlayCallTone(ToneDescriptor::TONE_WAITING);
536 }
537 
StopWaitingTone()538 int32_t AudioControlManager::StopWaitingTone()
539 {
540     return StopCallTone();
541 }
542 
NewCallCreated(sptr<CallBase> & callObjectPtr)543 void AudioControlManager::NewCallCreated(sptr<CallBase> &callObjectPtr) {}
544 
CallDestroyed(int32_t cause)545 void AudioControlManager::CallDestroyed(int32_t cause) {}
546 } // namespace Telephony
547 } // namespace OHOS