1 /*
2  * Copyright (c) 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 #ifndef LOG_TAG
16 #define LOG_TAG "AudioAdapterManagerHandler"
17 #endif
18 
19 #include "audio_adapter_manager_handler.h"
20 #include "audio_policy_manager_factory.h"
21 
22 namespace OHOS {
23 namespace AudioStandard {
24 namespace {
25 constexpr int32_t MAX_DELAY_TIME = 4 * 1000;
26 }
AudioAdapterManagerHandler()27 AudioAdapterManagerHandler::AudioAdapterManagerHandler() : AppExecFwk::EventHandler(
28     AppExecFwk::EventRunner::Create("OS_APAdapterAsyncRunner"))
29 {
30     AUDIO_DEBUG_LOG("ctor");
31 }
32 
~AudioAdapterManagerHandler()33 AudioAdapterManagerHandler::~AudioAdapterManagerHandler()
34 {
35     AUDIO_WARNING_LOG("dtor should not happen");
36 };
37 
SendKvDataUpdate(const bool & isFirstBoot)38 bool AudioAdapterManagerHandler::SendKvDataUpdate(const bool &isFirstBoot)
39 {
40     auto eventContextObj = std::make_shared<bool>(isFirstBoot);
41     lock_guard<mutex> runnerlock(runnerMutex_);
42     bool ret = true;
43     if (isFirstBoot) {
44         ret = SendEvent(AppExecFwk::InnerEvent::Get(EventAdapterManagerServerCmd::DATABASE_UPDATE, eventContextObj),
45             MAX_DELAY_TIME);
46     } else {
47         ret = SendEvent(AppExecFwk::InnerEvent::Get(EventAdapterManagerServerCmd::DATABASE_UPDATE, eventContextObj));
48     }
49     CHECK_AND_RETURN_RET_LOG(ret, ret, "SendKvDataUpdate event failed");
50     return ret;
51 }
52 
SendSaveVolume(const DeviceType & deviceType,const AudioStreamType & streamType,const int32_t & volumeLevel)53 bool AudioAdapterManagerHandler::SendSaveVolume(const DeviceType &deviceType,
54     const AudioStreamType &streamType, const int32_t &volumeLevel)
55 {
56     auto eventContextObj = std::make_shared<VolumeDataEvent>(deviceType, streamType, volumeLevel);
57     lock_guard<mutex> runnerlock(runnerMutex_);
58     bool ret = true;
59     ret = SendEvent(AppExecFwk::InnerEvent::Get(EventAdapterManagerServerCmd::VOLUME_DATABASE_SAVE, eventContextObj));
60     CHECK_AND_RETURN_RET_LOG(ret, ret, "SendSaveVolume event failed");
61     return ret;
62 }
63 
SendStreamMuteStatusUpdate(const AudioStreamType & streamType,const bool & mute,const StreamUsage & streamUsage)64 bool AudioAdapterManagerHandler::SendStreamMuteStatusUpdate(const AudioStreamType &streamType, const bool &mute,
65     const StreamUsage &streamUsage)
66 {
67     auto eventContextObj = std::make_shared<StreamMuteStatusEvent>(streamType, mute, streamUsage);
68     lock_guard<mutex> runnerlock(runnerMutex_);
69     bool ret = true;
70     ret = SendEvent(AppExecFwk::InnerEvent::Get(EventAdapterManagerServerCmd::STREAM_MUTE_STATUS_UPDATE,
71         eventContextObj));
72     CHECK_AND_RETURN_RET_LOG(ret, ret, "SendStreamMuteStatusUpdate event failed");
73     return ret;
74 }
75 
SendRingerModeUpdate(const AudioRingerMode & ringerMode)76 bool AudioAdapterManagerHandler::SendRingerModeUpdate(const AudioRingerMode &ringerMode)
77 {
78     auto eventContextObj = std::make_shared<RingerModeEvent>(ringerMode);
79     lock_guard<mutex> runnerlock(runnerMutex_);
80     bool ret = true;
81     ret = SendEvent(AppExecFwk::InnerEvent::Get(EventAdapterManagerServerCmd::RINGER_MODE_UPDATE, eventContextObj));
82     CHECK_AND_RETURN_RET_LOG(ret, ret, "SendRingerModeUpdate event failed");
83     return ret;
84 }
85 
HandleUpdateKvDataEvent(const AppExecFwk::InnerEvent::Pointer & event)86 void AudioAdapterManagerHandler::HandleUpdateKvDataEvent(const AppExecFwk::InnerEvent::Pointer &event)
87 {
88     std::shared_ptr<bool> eventContextObj = event->GetSharedObject<bool>();
89     CHECK_AND_RETURN_LOG(eventContextObj != nullptr, "EventContextObj get nullptr");
90     bool isFristBoot = *eventContextObj;
91     AudioPolicyManagerFactory::GetAudioPolicyManager().HandleKvData(isFristBoot);
92 }
93 
HandleVolumeDataBaseSave(const AppExecFwk::InnerEvent::Pointer & event)94 void AudioAdapterManagerHandler::HandleVolumeDataBaseSave(const AppExecFwk::InnerEvent::Pointer &event)
95 {
96     std::shared_ptr<VolumeDataEvent> eventContextObj = event->GetSharedObject<VolumeDataEvent>();
97     CHECK_AND_RETURN_LOG(eventContextObj != nullptr, "EventContextObj get nullptr");
98     AudioPolicyManagerFactory::GetAudioPolicyManager().HandleSaveVolume(eventContextObj->deviceType_,
99         eventContextObj->streamType_, eventContextObj->volumeLevel_);
100 }
101 
HandleUpdateStreamMuteStatus(const AppExecFwk::InnerEvent::Pointer & event)102 void AudioAdapterManagerHandler::HandleUpdateStreamMuteStatus(const AppExecFwk::InnerEvent::Pointer &event)
103 {
104     std::shared_ptr<StreamMuteStatusEvent> eventContextObj = event->GetSharedObject<StreamMuteStatusEvent>();
105     CHECK_AND_RETURN_LOG(eventContextObj != nullptr, "EventContextObj get nullptr");
106     AudioPolicyManagerFactory::GetAudioPolicyManager().HandleStreamMuteStatus(eventContextObj->streamType_,
107         eventContextObj->mute_, eventContextObj->streamUsage_);
108 }
109 
HandleUpdateRingerMode(const AppExecFwk::InnerEvent::Pointer & event)110 void AudioAdapterManagerHandler::HandleUpdateRingerMode(const AppExecFwk::InnerEvent::Pointer &event)
111 {
112     std::shared_ptr<RingerModeEvent> eventContextObj = event->GetSharedObject<RingerModeEvent>();
113     CHECK_AND_RETURN_LOG(eventContextObj != nullptr, "EventContextObj get nullptr");
114     AudioPolicyManagerFactory::GetAudioPolicyManager().HandleRingerMode(eventContextObj->ringerMode_);
115 }
116 
ReleaseEventRunner()117 void AudioAdapterManagerHandler::ReleaseEventRunner()
118 {
119     SetEventRunner(nullptr);
120 }
121 
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)122 void AudioAdapterManagerHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
123 {
124     uint32_t eventId = event->GetInnerEventId();
125     AUDIO_DEBUG_LOG("handler process eventId:%{public}u", eventId);
126 
127     switch (eventId) {
128         case EventAdapterManagerServerCmd::DATABASE_UPDATE:
129             HandleUpdateKvDataEvent(event);
130             break;
131         case EventAdapterManagerServerCmd::VOLUME_DATABASE_SAVE:
132             HandleVolumeDataBaseSave(event);
133             break;
134         case STREAM_MUTE_STATUS_UPDATE:
135             HandleUpdateStreamMuteStatus(event);
136             break;
137         case RINGER_MODE_UPDATE:
138             HandleUpdateRingerMode(event);
139             break;
140         default:
141             break;
142     }
143 }
144 } // namespace AudioStandard
145 } // namespace OHOS
146