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 "ring.h"
17 
18 #include <thread>
19 
20 #include "audio_player.h"
21 #include "call_base.h"
22 #include "telephony_log_wrapper.h"
23 
24 namespace OHOS {
25 namespace Telephony {
26 static constexpr int32_t DEFAULT_SIM_SLOT_ID = 0;
27 
Ring()28 Ring::Ring() : audioPlayer_(new (std::nothrow) AudioPlayer())
29 {
30     Init();
31 }
32 
~Ring()33 Ring::~Ring()
34 {
35     if (audioPlayer_ != nullptr) {
36         delete audioPlayer_;
37         audioPlayer_ = nullptr;
38     }
39 }
40 
Init()41 void Ring::Init()
42 {
43     SystemSoundManager_ = Media::SystemSoundManagerFactory::CreateSystemSoundManager();
44     if (SystemSoundManager_ == nullptr) {
45         TELEPHONY_LOGE("get systemSoundManager failed");
46         return;
47     }
48 }
49 
Play(int32_t slotId)50 int32_t Ring::Play(int32_t slotId)
51 {
52     if (SystemSoundManager_ == nullptr || audioPlayer_ == nullptr) {
53         TELEPHONY_LOGE("SystemSoundManager_ or audioPlayer_ is nullptr");
54         return TELEPHONY_ERR_LOCAL_PTR_NULL;
55     }
56     const std::shared_ptr<AbilityRuntime::Context> context;
57     Media::RingtoneType type = slotId == DEFAULT_SIM_SLOT_ID ? Media::RingtoneType::RINGTONE_TYPE_SIM_CARD_0 :
58         Media::RingtoneType::RINGTONE_TYPE_SIM_CARD_1;
59     RingtonePlayer_ = SystemSoundManager_->GetRingtonePlayer(context, type);
60     if (RingtonePlayer_ == nullptr) {
61         TELEPHONY_LOGE("get RingtonePlayer failed");
62         return TELEPHONY_ERR_LOCAL_PTR_NULL;
63     }
64     audioPlayer_->RegisterRingCallback(RingtonePlayer_);
65     int32_t result = RingtonePlayer_->Configure(defaultVolume_, true);
66     if (result != TELEPHONY_SUCCESS) {
67         TELEPHONY_LOGE("configure failed");
68     }
69     audioPlayer_->SetStop(PlayerType::TYPE_RING, false);
70     return RingtonePlayer_->Start();
71 }
72 
Stop()73 int32_t Ring::Stop()
74 {
75     std::lock_guard<std::mutex> lock(mutex_);
76     if (audioPlayer_ == nullptr) {
77         TELEPHONY_LOGE("audioPlayer_ is nullptr");
78         return TELEPHONY_ERR_LOCAL_PTR_NULL;
79     }
80     int32_t result = TELEPHONY_SUCCESS;
81     audioPlayer_->SetStop(PlayerType::TYPE_RING, true);
82     if (RingtonePlayer_ == nullptr) {
83         TELEPHONY_LOGE("RingtonePlayer_ is nullptr");
84         return TELEPHONY_ERR_LOCAL_PTR_NULL;
85     }
86     result = RingtonePlayer_->Stop();
87     return result;
88 }
89 
ReleaseRenderer()90 void Ring::ReleaseRenderer()
91 {
92     if (RingtonePlayer_ == nullptr) {
93         TELEPHONY_LOGE("RingtonePlayer_ is nullptr");
94         return;
95     }
96     RingtonePlayer_->Release();
97 }
98 
SetMute()99 int32_t Ring::SetMute()
100 {
101     if (RingtonePlayer_ == nullptr) {
102         TELEPHONY_LOGE("RingtonePlayer_ is nullptr");
103         return TELEPHONY_ERR_LOCAL_PTR_NULL;
104     }
105     return RingtonePlayer_->Configure(0, true);
106 }
107 } // namespace Telephony
108 } // namespace OHOS