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