• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 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 "AudioPolicyServer"
17 #endif
18 
19 #include "audio_policy_server.h"
20 
21 #ifdef FEATURE_MULTIMODALINPUT_INPUT
22 #include "input_manager.h"
23 
24 #endif
25 
26 #include "privacy_kit.h"
27 #include "tokenid_kit.h"
28 #include "common_event_manager.h"
29 #include "system_ability_definition.h"
30 #include "audio_policy_log.h"
31 #include "parameters.h"
32 #include "media_monitor_manager.h"
33 #include "client_type_manager.h"
34 #include "dfx_msg_manager.h"
35 #ifdef USB_ENABLE
36 #include "audio_usb_manager.h"
37 #endif
38 #include "audio_zone_service.h"
39 #include "istandard_audio_zone_client.h"
40 #include "audio_bundle_manager.h"
41 #include "audio_server_proxy.h"
42 #include "audio_policy_client_holder.h"
43 #include "standalone_mode_manager.h"
44 
45 using OHOS::Security::AccessToken::PrivacyKit;
46 using OHOS::Security::AccessToken::TokenIdKit;
47 using namespace std;
48 
49 namespace OHOS {
50 namespace AudioStandard {
51 
52 const std::vector<AudioStreamType> GET_STREAM_ALL_VOLUME_TYPES {
53     STREAM_VOICE_ASSISTANT,
54     STREAM_VOICE_CALL,
55     STREAM_ACCESSIBILITY,
56     STREAM_RING,
57     STREAM_ALARM,
58     STREAM_VOICE_RING,
59     STREAM_ULTRASONIC,
60     // adjust the type of music from the head of list to end, make sure music is updated last.
61     // avoid interference from ring updates on special platform.
62     // when the device is switched to headset,ring and alarm is dualtone type.
63     // dualtone type use fixed volume curve of speaker.
64     // the ring and alarm are classified into the music group.
65     // the music volume becomes abnormal when the db value of music is modified.
66     STREAM_MUSIC
67 };
68 
69 const std::list<AudioStreamType> CAN_MIX_MUTED_STREAM = {
70     STREAM_NOTIFICATION
71 };
72 
73 const size_t ADD_VOL_RECORD_LIMIT = 3;
74 constexpr int64_t ADD_VOL_DURATION_LIMIT = 800 * 1000 * 1000; // 800ms
75 const int64_t SILENT_FRAME_LIMIT = -50;
76 constexpr int32_t PARAMS_VOLUME_NUM = 5;
77 constexpr int32_t PARAMS_INTERRUPT_NUM = 4;
78 constexpr int32_t PARAMS_RENDER_STATE_NUM = 2;
79 constexpr int32_t EVENT_DES_SIZE = 80;
80 constexpr int32_t ADAPTER_STATE_CONTENT_DES_SIZE = 60;
81 constexpr int32_t API_VERSION_REMAINDER = 1000;
82 constexpr pid_t FIRST_SCREEN_ON_PID = 1000;
83 constexpr uid_t UID_CAST_ENGINE_SA = 5526;
84 constexpr uid_t UID_AUDIO = 1041;
85 constexpr uid_t UID_FOUNDATION_SA = 5523;
86 constexpr uid_t UID_BLUETOOTH_SA = 1002;
87 constexpr uid_t UID_CAR_DISTRIBUTED_ENGINE_SA = 65872;
88 constexpr uid_t UID_TV_PROCESS_SA = 7501;
89 constexpr uid_t UID_DP_PROCESS_SA = 7062;
90 constexpr uid_t UID_NEARLINK_SA = 7030;
91 constexpr uid_t UID_PENCIL_PROCESS_SA = 7555;
92 constexpr uid_t UID_RESOURCE_SCHEDULE_SERVICE = 1096;
93 constexpr uid_t UID_AVSESSION_SERVICE = 6700;
94 constexpr int64_t OFFLOAD_NO_SESSION_ID = -1;
95 const char* MANAGE_SYSTEM_AUDIO_EFFECTS = "ohos.permission.MANAGE_SYSTEM_AUDIO_EFFECTS";
96 const char* MANAGE_AUDIO_CONFIG = "ohos.permission.MANAGE_AUDIO_CONFIG";
97 const char* USE_BLUETOOTH_PERMISSION = "ohos.permission.USE_BLUETOOTH";
98 const char* MICROPHONE_CONTROL_PERMISSION = "ohos.permission.MICROPHONE_CONTROL";
99 const std::string CALLER_NAME = "audio_server";
100 static const int64_t WAIT_CLEAR_AUDIO_FOCUSINFOS_TIME_US = 300000; // 300ms
101 const std::string HIVIEWCARE_PERMISSION = "ohos.permission.ACCESS_HIVIEWCARE";
102 static const uint32_t DEVICE_CONNECTED_FLAG_DURATION_MS = 3000000; // 3s
103 constexpr int32_t MAX_STREAM_USAGE_COUNT = StreamUsage::STREAM_USAGE_MAX + 1;
104 constexpr int32_t MAX_SIZE = 1024;
105 constexpr int32_t DEFAULT_UID = 0;
106 constexpr int32_t DEFAULT_ZONEID = 0;
107 
108 constexpr int32_t UID_MEDIA = 1013;
109 constexpr int32_t UID_MCU = 7500;
110 constexpr int32_t UID_CAAS = 5527;
111 constexpr int32_t UID_TELEPHONY = 1001;
112 constexpr int32_t UID_DMSDP = 7071;
113 constexpr int32_t UID_TV_SERVICE = 7501;
114 static const int32_t DATASHARE_SERVICE_TIMEOUT_SECONDS = 10; // 10s is better
115 const std::set<int32_t> CALLBACK_TRUST_LIST = {
116     UID_MEDIA,
117     UID_MCU,
118     UID_CAAS,
119     UID_TELEPHONY,
120     UID_DMSDP,
121     UID_TV_SERVICE
122 };
123 
124 REGISTER_SYSTEM_ABILITY_BY_ID(AudioPolicyServer, AUDIO_POLICY_SERVICE_ID, true)
125 
126 std::map<PolicyType, uint32_t> POLICY_TYPE_MAP = {
127     {PolicyType::EDM_POLICY_TYPE, 0},
128     {PolicyType::PRIVACY_POLCIY_TYPE, 1},
129     {PolicyType::TEMPORARY_POLCIY_TYPE, 2}
130 };
131 
AudioPolicyServer(int32_t systemAbilityId,bool runOnCreate)132 AudioPolicyServer::AudioPolicyServer(int32_t systemAbilityId, bool runOnCreate)
133     : SystemAbility(systemAbilityId, runOnCreate),
134       audioEffectService_(AudioEffectService::GetAudioEffectService()),
135       audioAffinityManager_(AudioAffinityManager::GetAudioAffinityManager()),
136       audioCapturerSession_(AudioCapturerSession::GetInstance()),
137       audioStateManager_(AudioStateManager::GetAudioStateManager()),
138       audioToneManager_(AudioToneManager::GetInstance()),
139       audioMicrophoneDescriptor_(AudioMicrophoneDescriptor::GetInstance()),
140       audioDeviceStatus_(AudioDeviceStatus::GetInstance()),
141       audioConfigManager_(AudioPolicyConfigManager::GetInstance()),
142       audioSceneManager_(AudioSceneManager::GetInstance()),
143       audioConnectedDevice_(AudioConnectedDevice::GetInstance()),
144       audioDeviceLock_(AudioDeviceLock::GetInstance()),
145       streamCollector_(AudioStreamCollector::GetAudioStreamCollector()),
146       audioOffloadStream_(AudioOffloadStream::GetInstance()),
147       audioBackgroundManager_(AudioBackgroundManager::GetInstance()),
148       audioVolumeManager_(AudioVolumeManager::GetInstance()),
149       audioDeviceCommon_(AudioDeviceCommon::GetInstance()),
150       audioPolicyManager_(AudioPolicyManagerFactory::GetAudioPolicyManager()),
151       audioPolicyConfigManager_(AudioPolicyConfigManager::GetInstance()),
152       audioPolicyService_(AudioPolicyService::GetAudioPolicyService()),
153       audioPolicyUtils_(AudioPolicyUtils::GetInstance()),
154       audioDeviceManager_(AudioDeviceManager::GetAudioDeviceManager()),
155       audioSpatializationService_(AudioSpatializationService::GetAudioSpatializationService()),
156       audioCollaborativeService_(AudioCollaborativeService::GetAudioCollaborativeService()),
157       audioRouterCenter_(AudioRouterCenter::GetAudioRouterCenter()),
158       audioPolicyDump_(AudioPolicyDump::GetInstance()),
159 #ifdef USB_ENABLE
160       usbManager_(AudioUsbManager::GetInstance()),
161 #endif
162       audioActiveDevice_(AudioActiveDevice::GetInstance())
163 
164 {
165     volumeStep_ = system::GetIntParameter("const.multimedia.audio.volumestep", 1);
166     AUDIO_INFO_LOG("Get volumeStep parameter success %{public}d", volumeStep_);
167 
168     powerStateCallbackRegister_ = false;
169     supportVibrator_ = system::GetBoolParameter("const.vibrator.support_vibrator", true);
170     volumeApplyToAll_ = system::GetBoolParameter("const.audio.volume_apply_to_all", false);
171     screenOffAdjustVolumeEnable_ = system::GetBoolParameter("const.audio.screenoff_adjust_volume_enable", false);
172     if (volumeApplyToAll_) {
173         audioPolicyConfigManager_.SetNormalVoipFlag(true);
174     }
175 }
176 
TranslateKeyEvent(const int32_t keyType)177 static std::string TranslateKeyEvent(const int32_t keyType)
178 {
179     string event = "KEYCODE_UNKNOWN";
180 
181     if (keyType == OHOS::MMI::KeyEvent::KEYCODE_VOLUME_UP) {
182         event = "KEYCODE_VOLUME_UP";
183     } else if (keyType == OHOS::MMI::KeyEvent::KEYCODE_VOLUME_DOWN) {
184         event = "KEYCODE_VOLUME_DOWN";
185     } else if (keyType == OHOS::MMI::KeyEvent::KEYCODE_MUTE) {
186         event = "KEYCODE_MUTE";
187     }
188     return event;
189 }
190 
HasUsbDevice(const std::vector<std::shared_ptr<AudioDeviceDescriptor>> & devices)191 static bool HasUsbDevice(const std::vector<std::shared_ptr<AudioDeviceDescriptor>> &devices)
192 {
193     for (auto &item : devices) {
194         CHECK_AND_CONTINUE(item != nullptr);
195         if (IsUsb(item->deviceType_) && !item->hasPair_) {
196             return true;
197         }
198     }
199     return false;
200 }
201 
TranslateErrorCode(int32_t result)202 uint32_t AudioPolicyServer::TranslateErrorCode(int32_t result)
203 {
204     uint32_t resultForMonitor = 0;
205     switch (result) {
206         case ERR_INVALID_PARAM:
207             resultForMonitor = ERR_SUBSCRIBE_INVALID_PARAM;
208             break;
209         case ERR_NULL_POINTER:
210             resultForMonitor = ERR_SUBSCRIBE_KEY_OPTION_NULL;
211             break;
212         case ERR_MMI_CREATION:
213             resultForMonitor = ERR_SUBSCRIBE_MMI_NULL;
214             break;
215         case ERR_MMI_SUBSCRIBE:
216             resultForMonitor = ERR_MODE_SUBSCRIBE;
217             break;
218         default:
219             break;
220     }
221     return resultForMonitor;
222 }
223 
OnDump()224 void AudioPolicyServer::OnDump()
225 {
226     return;
227 }
228 
OnStart()229 void AudioPolicyServer::OnStart()
230 {
231     AUDIO_INFO_LOG("Audio policy server on start");
232     DlopenUtils::Init();
233     interruptService_ = std::make_shared<AudioInterruptService>();
234     interruptService_->Init(this);
235 
236     audioPolicyServerHandler_ = DelayedSingleton<AudioPolicyServerHandler>::GetInstance();
237     audioPolicyServerHandler_->Init(interruptService_);
238 
239     interruptService_->SetCallbackHandler(audioPolicyServerHandler_);
240 
241     AudioZoneService::GetInstance().Init(audioPolicyServerHandler_, interruptService_);
242     StandaloneModeManager::GetInstance().InIt(interruptService_);
243     if (audioPolicyManager_.SetAudioStreamRemovedCallback(this)) {
244         AUDIO_ERR_LOG("SetAudioStreamRemovedCallback failed");
245     }
246     audioPolicyService_.Init();
247 
248     coreService_ = AudioCoreService::GetCoreService();
249     coreService_->SetCallbackHandler(audioPolicyServerHandler_);
250     coreService_->Init();
251     eventEntry_ = coreService_->GetEventEntry();
252 
253     bool res = Publish(this);
254     if (!res) {
255         std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
256             Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::AUDIO_SERVICE_STARTUP_ERROR,
257             Media::MediaMonitor::EventType::FAULT_EVENT);
258         bean->Add("SERVICE_ID", static_cast<int32_t>(Media::MediaMonitor::AUDIO_POLICY_SERVICE_ID));
259         bean->Add("ERROR_CODE", static_cast<int32_t>(Media::MediaMonitor::AUDIO_POLICY_SERVER));
260         Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
261         AUDIO_INFO_LOG("publish sa err");
262     }
263     AddSystemAbilityListeners();
264 
265     Security::AccessToken::PermStateChangeScope scopeInfo;
266     scopeInfo.permList = {"ohos.permission.MICROPHONE"};
267     auto callbackPtr = std::make_shared<PerStateChangeCbCustomizeCallback>(scopeInfo, this);
268     callbackPtr->ready_ = false;
269     int32_t iRes = Security::AccessToken::AccessTokenKit::RegisterPermStateChangeCallback(callbackPtr);
270     if (iRes < 0) {
271         AUDIO_ERR_LOG("fail to call RegisterPermStateChangeCallback.");
272     }
273 #ifdef FEATURE_MULTIMODALINPUT_INPUT
274     SubscribeVolumeKeyEvents();
275 #endif
276     if (getpid() > FIRST_SCREEN_ON_PID) {
277         audioDeviceCommon_.SetFirstScreenOn();
278     }
279     // Restart to reload the volume.
280     InitKVStore();
281     isScreenOffOrLock_ = !PowerMgr::PowerMgrClient::GetInstance().IsScreenOn(true);
282     DlopenUtils::DeInit();
283     DfxMsgManager::GetInstance().Init();
284     AUDIO_INFO_LOG("Audio policy server start end");
285 }
286 
AddSystemAbilityListeners()287 void AudioPolicyServer::AddSystemAbilityListeners()
288 {
289     AddSystemAbilityListener(DISTRIBUTED_HARDWARE_DEVICEMANAGER_SA_ID);
290     AddSystemAbilityListener(AUDIO_DISTRIBUTED_SERVICE_ID);
291     AddSystemAbilityListener(DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID);
292     AddSystemAbilityListener(APP_MGR_SERVICE_ID);
293 #ifdef FEATURE_MULTIMODALINPUT_INPUT
294     AddSystemAbilityListener(MULTIMODAL_INPUT_SERVICE_ID);
295 #endif
296     AddSystemAbilityListener(BLUETOOTH_HOST_SYS_ABILITY_ID);
297     AddSystemAbilityListener(POWER_MANAGER_SERVICE_ID);
298     AddSystemAbilityListener(BACKGROUND_TASK_MANAGER_SERVICE_ID);
299 #ifdef USB_ENABLE
300     AddSystemAbilityListener(USB_SYSTEM_ABILITY_ID);
301 #endif
302     AddSystemAbilityListener(COMMON_EVENT_SERVICE_ID);
303 #ifdef SUPPORT_USER_ACCOUNT
304     AddSystemAbilityListener(SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN);
305 #endif
306 }
307 
OnStop()308 void AudioPolicyServer::OnStop()
309 {
310     audioPolicyService_.Deinit();
311     coreService_->DeInit();
312 #ifdef USB_ENABLE
313     usbManager_.Deinit();
314 #endif
315     UnRegisterPowerStateListener();
316     UnRegisterSyncHibernateListener();
317     return;
318 }
319 
OnAddSystemAbility(int32_t systemAbilityId,const std::string & deviceId)320 void AudioPolicyServer::OnAddSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
321 {
322     AUDIO_INFO_LOG("SA Id is :%{public}d", systemAbilityId);
323     int64_t stamp = ClockTime::GetCurNano();
324     switch (systemAbilityId) {
325 #ifdef FEATURE_MULTIMODALINPUT_INPUT
326         case MULTIMODAL_INPUT_SERVICE_ID:
327             SubscribeVolumeKeyEvents();
328             break;
329 #endif
330         case DISTRIBUTED_KV_DATA_SERVICE_ABILITY_ID:
331             HandleKvDataShareEvent();
332             break;
333         case DISTRIBUTED_HARDWARE_DEVICEMANAGER_SA_ID:
334             AddRemoteDevstatusCallback();
335             break;
336         case AUDIO_DISTRIBUTED_SERVICE_ID:
337             AddAudioServiceOnStart();
338             break;
339         case BLUETOOTH_HOST_SYS_ABILITY_ID:
340             RegisterBluetoothListener();
341             break;
342         case POWER_MANAGER_SERVICE_ID:
343             SubscribePowerStateChangeEvents();
344             RegisterPowerStateListener();
345             RegisterSyncHibernateListener();
346             break;
347         case SUBSYS_ACCOUNT_SYS_ABILITY_ID_BEGIN:
348             SubscribeOsAccountChangeEvents();
349             break;
350         case COMMON_EVENT_SERVICE_ID:
351             SubscribeCommonEventExecute();
352             break;
353         case BACKGROUND_TASK_MANAGER_SERVICE_ID:
354             SubscribeBackgroundTask();
355             break;
356 #ifdef USB_ENABLE
357         case USB_SYSTEM_ABILITY_ID:
358             usbManager_.Init(eventEntry_);
359             break;
360 #endif
361         default:
362             OnAddSystemAbilityExtract(systemAbilityId, deviceId);
363             break;
364     }
365     // eg. done systemAbilityId: [3001] cost 780ms
366     AUDIO_INFO_LOG("done systemAbilityId: [%{public}d] cost %{public}" PRId64 " ms", systemAbilityId,
367         (ClockTime::GetCurNano() - stamp) / AUDIO_US_PER_SECOND);
368 }
369 
RegisterDefaultVolumeTypeListener()370 void AudioPolicyServer::RegisterDefaultVolumeTypeListener()
371 {
372     if (interruptService_ == nullptr) {
373         AUDIO_ERR_LOG("RegisterDefaultVolumeTypeListener interruptService_ is nullptr!");
374         return;
375     }
376     interruptService_->RegisterDefaultVolumeTypeListener();
377 }
378 
OnAddSystemAbilityExtract(int32_t systemAbilityId,const std::string & deviceId)379 void AudioPolicyServer::OnAddSystemAbilityExtract(int32_t systemAbilityId, const std::string &deviceId)
380 {
381     switch (systemAbilityId) {
382         case APP_MGR_SERVICE_ID:
383             RegisterAppStateListener();
384             break;
385         default:
386             AUDIO_WARNING_LOG("OnAddSystemAbility unhandled sysabilityId:%{public}d", systemAbilityId);
387             break;
388     }
389 }
390 
HandleKvDataShareEvent()391 void AudioPolicyServer::HandleKvDataShareEvent()
392 {
393     AUDIO_INFO_LOG("OnAddSystemAbility kv data service start");
394     if (isInitMuteState_ == false && AudioPolicyUtils::GetInstance().IsDataShareReady()) {
395         AUDIO_INFO_LOG("datashare is ready and need init mic mute state");
396         InitMicrophoneMute();
397     }
398 }
399 
OnRemoveSystemAbility(int32_t systemAbilityId,const std::string & deviceId)400 void AudioPolicyServer::OnRemoveSystemAbility(int32_t systemAbilityId, const std::string &deviceId)
401 {
402     AUDIO_DEBUG_LOG("AudioPolicyServer::OnRemoveSystemAbility systemAbilityId:%{public}d removed", systemAbilityId);
403 }
404 
405 #ifdef FEATURE_MULTIMODALINPUT_INPUT
MaxOrMinVolumeOption(const int32_t & volLevel,const int32_t keyType,const AudioStreamType & streamInFocus)406 bool AudioPolicyServer::MaxOrMinVolumeOption(const int32_t &volLevel, const int32_t keyType,
407     const AudioStreamType &streamInFocus)
408 {
409     int32_t streamInFocusInt = static_cast<int32_t>(streamInFocus);
410     int32_t volumeLevelMax = -1;
411     int32_t volumeLevelMin = -1;
412     GetMaxVolumeLevel(streamInFocusInt, volumeLevelMax);
413     GetMinVolumeLevel(streamInFocusInt, volumeLevelMin);
414     bool volLevelCheck = (keyType == OHOS::MMI::KeyEvent::KEYCODE_VOLUME_UP) ?
415         volLevel >= volumeLevelMax : volLevel <= volumeLevelMin;
416     if (volLevelCheck) {
417         VolumeEvent volumeEvent;
418         volumeEvent.volumeType = (streamInFocus == STREAM_ALL) ? STREAM_MUSIC : streamInFocus;
419         volumeEvent.volume = volLevel;
420         volumeEvent.updateUi = true;
421         volumeEvent.volumeGroupId = 0;
422         volumeEvent.networkId = LOCAL_NETWORK_ID;
423         CHECK_AND_RETURN_RET_LOG(audioPolicyServerHandler_ != nullptr, false, "audioPolicyServerHandler_ is nullptr");
424         audioPolicyServerHandler_->SendVolumeKeyEventCallback(volumeEvent);
425         return true;
426     }
427 
428     return false;
429 }
430 #endif
431 
ChangeVolumeOnVoiceAssistant(AudioStreamType & streamInFocus)432 void AudioPolicyServer::ChangeVolumeOnVoiceAssistant(AudioStreamType &streamInFocus)
433 {
434     if (streamInFocus == AudioStreamType::STREAM_VOICE_ASSISTANT &&
435         audioActiveDevice_.GetCurrentOutputDeviceType() == DEVICE_TYPE_BLUETOOTH_A2DP) {
436         streamInFocus = AudioStreamType::STREAM_MUSIC;
437     }
438 }
439 
440 #ifdef FEATURE_MULTIMODALINPUT_INPUT
RegisterVolumeKeyEvents(const int32_t keyType)441 int32_t AudioPolicyServer::RegisterVolumeKeyEvents(const int32_t keyType)
442 {
443     if ((keyType != OHOS::MMI::KeyEvent::KEYCODE_VOLUME_UP) && (keyType != OHOS::MMI::KeyEvent::KEYCODE_VOLUME_DOWN)) {
444         AUDIO_ERR_LOG("VolumeKeyEvents: invalid key type : %{public}d", keyType);
445         return ERR_INVALID_PARAM;
446     }
447     AUDIO_INFO_LOG("RegisterVolumeKeyEvents: volume key: %{public}s.",
448         (keyType == OHOS::MMI::KeyEvent::KEYCODE_VOLUME_UP) ? "up" : "down");
449 
450     MMI::InputManager *im = MMI::InputManager::GetInstance();
451     CHECK_AND_RETURN_RET_LOG(im != nullptr, ERR_MMI_CREATION, "Failed to obtain INPUT manager");
452 
453     std::set<int32_t> preKeys;
454     std::shared_ptr<OHOS::MMI::KeyOption> keyOption = std::make_shared<OHOS::MMI::KeyOption>();
455     CHECK_AND_RETURN_RET_LOG(keyOption != nullptr, ERR_NULL_POINTER, "Invalid key option");
456     WatchTimeout guard("keyOption->SetPreKeys:RegisterVolumeKeyEvents");
457     keyOption->SetPreKeys(preKeys);
458     keyOption->SetFinalKey(keyType);
459     keyOption->SetFinalKeyDown(true);
460     keyOption->SetFinalKeyDownDuration(VOLUME_KEY_DURATION);
461     guard.CheckCurrTimeout();
462     int32_t keySubId = im->SubscribeKeyEvent(keyOption, [=](std::shared_ptr<MMI::KeyEvent> keyEventCallBack) {
463         AUDIO_PRERELEASE_LOGI("Receive volume key event: %{public}s.",
464             (keyType == OHOS::MMI::KeyEvent::KEYCODE_VOLUME_UP) ? "up" : "down");
465         int32_t ret = ProcessVolumeKeyEvents(keyType);
466         if (ret != AUDIO_OK) {
467             AUDIO_DEBUG_LOG("process volume key mute events need return[%{public}d]", ret);
468             return;
469         }
470     });
471     std::string RegistrationTime = GetTime();
472     std::string keyName = (keyType == OHOS::MMI::KeyEvent::KEYCODE_VOLUME_UP ? "Volume Up" : "Volume Down");
473     audioVolumeManager_.SaveVolumeKeyRegistrationInfo(keyName, RegistrationTime, keySubId,
474         keySubId >= 0 ? true : false);
475     AUDIO_INFO_LOG("RegisterVolumeKeyInfo keyType: %{public}s, RegistrationTime: %{public}s, keySubId: %{public}d,"
476         " Regist Success: %{public}s",
477         keyName.c_str(), RegistrationTime.c_str(), keySubId, keySubId >= 0 ? "true" : "false");
478 
479     if (keySubId < 0) {
480         AUDIO_ERR_LOG("key: %{public}s failed", (keyType == OHOS::MMI::KeyEvent::KEYCODE_VOLUME_UP) ? "up" : "down");
481         return ERR_MMI_SUBSCRIBE;
482     }
483     return keySubId;
484 }
485 
IsContinueAddVol()486 bool AudioPolicyServer::IsContinueAddVol()
487 {
488     int64_t cur = ClockTime::GetRealNano();
489     // record history
490     std::lock_guard<std::mutex> lock(volUpHistoryMutex_);
491     volUpHistory_.push_back(cur);
492     size_t total = volUpHistory_.size();
493     if (total < ADD_VOL_RECORD_LIMIT) {
494         return false;
495     }
496     // continue add vol for 3 times
497     int64_t first = volUpHistory_.front();
498     volUpHistory_.pop_front();
499     if (cur - first >= ADD_VOL_DURATION_LIMIT) {
500         return false;
501     }
502     AUDIO_WARNING_LOG("add vol %{public}zu times, first %{public}" PRId64" cur %{public}" PRId64 "", total, first, cur);
503     return true;
504 }
505 
TriggerMuteCheck()506 void AudioPolicyServer::TriggerMuteCheck()
507 {
508     Trace trace("AudioPolicyServer::TriggerMuteCheck");
509     // get current running sessionId
510     std::vector<std::shared_ptr<AudioRendererChangeInfo>> infos = {};
511     streamCollector_.GetRunningRendererInfos(infos);
512     if (infos.size() == 0) {
513         AUDIO_WARNING_LOG("no running stream");
514         return;
515     }
516 
517     std::set<std::string> deviceClassSet;
518     for (auto info : infos) {
519         if (info == nullptr || info->outputDeviceInfo.networkId_ != LOCAL_NETWORK_ID) {
520             continue;
521         }
522         auto deviceType = info->outputDeviceInfo.getType();
523         std::string sinkPortName = audioPolicyUtils_.GetSinkPortName(deviceType, info->rendererInfo.pipeType);
524         std::string deviceClass = audioPolicyUtils_.GetOutputDeviceClassBySinkPortName(sinkPortName);
525         deviceClassSet.insert(deviceClass);
526         AUDIO_INFO_LOG("uid-%{public}d pid-%{public}d:[%{public}d] running with pipe %{public}d on sink:%{public}s",
527             info->clientUID, info->clientPid, info->sessionId, info->rendererInfo.pipeType, deviceClass.c_str());
528     }
529 
530     bool mutePlay = false;
531     for (auto sinkName : deviceClassSet) {
532         int64_t volumeDataCount = AudioServerProxy::GetInstance().GetVolumeDataCount(sinkName);
533         if (volumeDataCount < SILENT_FRAME_LIMIT) {
534             mutePlay = true;
535             AUDIO_WARNING_LOG("sink:%{public}s running with mute data", sinkName.c_str());
536         }
537     }
538 
539     if (mutePlay) {
540         // print volume info
541         AudioStreamType streamInFocus = GetCurrentStreamInFocus();
542         int32_t volume = GetSystemVolumeLevelInternal(VolumeUtils::GetVolumeTypeFromStreamType(streamInFocus));
543         AUDIO_WARNING_LOG("StreamInFocus is [%{public}d], volume is %{public}d", streamInFocus, volume);
544     }
545 }
546 
ProcessVolumeKeyEvents(const int32_t keyType)547 int32_t AudioPolicyServer::ProcessVolumeKeyEvents(const int32_t keyType)
548 {
549     if (keyType == OHOS::MMI::KeyEvent::KEYCODE_VOLUME_UP && IsContinueAddVol()) {
550         std::thread([this]() { TriggerMuteCheck(); }).detach();
551     }
552     int32_t zoneId = AudioZoneService::GetInstance().CheckZoneExist(audioVolumeManager_.GetVolumeAdjustZoneId()) ?
553         audioVolumeManager_.GetVolumeAdjustZoneId() : 0;
554     AudioStreamType streamInFocus = AudioStreamType::STREAM_MUSIC; // use STREAM_MUSIC as default stream type
555     if (volumeApplyToAll_) {
556         streamInFocus = AudioStreamType::STREAM_ALL;
557     } else {
558         streamInFocus = VolumeUtils::GetVolumeTypeFromStreamType(GetCurrentStreamInFocus());
559     }
560     bool active = false;
561     IsStreamActive(streamInFocus, active);
562     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
563     if (isScreenOffOrLock_ && !active && !VolumeUtils::IsPCVolumeEnable() && !screenOffAdjustVolumeEnable_) {
564         AUDIO_INFO_LOG("isScreenOffOrLock: %{public}d, active: %{public}d, screenOffAdjustVolumeEnable: %{public}d",
565             isScreenOffOrLock_.load(), active, screenOffAdjustVolumeEnable_);
566         return AUDIO_OK;
567     }
568     if (!VolumeUtils::IsPCVolumeEnable()) {
569         ChangeVolumeOnVoiceAssistant(streamInFocus);
570     }
571     if (keyType == OHOS::MMI::KeyEvent::KEYCODE_VOLUME_UP && GetStreamMuteInternal(streamInFocus, zoneId)) {
572         AUDIO_INFO_LOG("VolumeKeyEvents: volumeKey: Up. volumeType %{public}d is mute. Unmute.", streamInFocus);
573         SetStreamMuteInternal(streamInFocus, false, true, DEVICE_TYPE_NONE, zoneId);
574         CHECK_AND_RETURN_RET_LOG(VolumeUtils::IsPCVolumeEnable(), ERROR_UNSUPPORTED, "phone need return");
575     }
576     if (keyType == OHOS::MMI::KeyEvent::KEYCODE_VOLUME_UP && GetStreamMuteInternal(STREAM_SYSTEM) &&
577         VolumeUtils::IsPCVolumeEnable()) {
578         SetStreamMuteInternal(STREAM_SYSTEM, false, true);
579     }
580     return SetVolumeInternalByKeyEvent(streamInFocus, zoneId, keyType);
581 }
582 #endif
583 
SetVolumeInternalByKeyEvent(AudioStreamType streamInFocus,int32_t zoneId,const int32_t keyType)584 int32_t AudioPolicyServer::SetVolumeInternalByKeyEvent(AudioStreamType streamInFocus, int32_t zoneId,
585     const int32_t keyType)
586 {
587     int32_t volumeLevelInInt = GetSystemVolumeLevelInternal(streamInFocus, zoneId);
588     if (MaxOrMinVolumeOption(volumeLevelInInt, keyType, streamInFocus)) {
589         AUDIO_ERR_LOG("device %{public}d, stream %{public}d, volumelevel %{public}d invalid",
590             audioActiveDevice_.GetCurrentOutputDeviceType(), streamInFocus, volumeLevelInInt);
591         return ERROR_INVALID_PARAM;
592     }
593 
594     volumeLevelInInt = (keyType == OHOS::MMI::KeyEvent::KEYCODE_VOLUME_UP) ? ++volumeLevelInInt : --volumeLevelInInt;
595     int32_t ret = SetSystemVolumeLevelInternal(streamInFocus, volumeLevelInInt, true, zoneId);
596     if (ret == ERR_SET_VOL_FAILED_BY_VOLUME_CONTROL_DISABLED) {
597         SendVolumeKeyEventCbWithUpdateUiOrNot(streamInFocus, true);
598     }
599     if (volumeLevelInInt <= 0 && VolumeUtils::IsPCVolumeEnable()) {
600         SetStreamMuteInternal(STREAM_SYSTEM, true, true);
601     }
602     return AUDIO_OK;
603 }
604 
605 #ifdef FEATURE_MULTIMODALINPUT_INPUT
RegisterVolumeKeyMuteEvents()606 int32_t AudioPolicyServer::RegisterVolumeKeyMuteEvents()
607 {
608     AUDIO_INFO_LOG("RegisterVolumeKeyMuteEvents: volume key: mute");
609     MMI::InputManager *im = MMI::InputManager::GetInstance();
610     CHECK_AND_RETURN_RET_LOG(im != nullptr, ERR_MMI_CREATION, "Failed to obtain INPUT manager");
611 
612     std::shared_ptr<OHOS::MMI::KeyOption> keyOptionMute = std::make_shared<OHOS::MMI::KeyOption>();
613     CHECK_AND_RETURN_RET_LOG(keyOptionMute != nullptr, ERR_NULL_POINTER, "keyOptionMute: Invalid key option");
614     std::set<int32_t> preKeys;
615     WatchTimeout guard("keyOption->SetPreKeys:RegisterVolumeKeyMuteEvents");
616     keyOptionMute->SetPreKeys(preKeys);
617     keyOptionMute->SetFinalKey(OHOS::MMI::KeyEvent::KEYCODE_VOLUME_MUTE);
618     keyOptionMute->SetFinalKeyDown(true);
619     keyOptionMute->SetFinalKeyDownDuration(VOLUME_MUTE_KEY_DURATION);
620     keyOptionMute->SetRepeat(false);
621     guard.CheckCurrTimeout();
622     int32_t muteKeySubId = im->SubscribeKeyEvent(keyOptionMute,
623         [this](std::shared_ptr<MMI::KeyEvent> keyEventCallBack) {
624             AUDIO_INFO_LOG("Receive volume key event: mute");
625             AudioStreamType streamInFocus = AudioStreamType::STREAM_MUSIC; // use STREAM_MUSIC as default stream type
626             bool isStreamMuted = false;
627             if (volumeApplyToAll_) {
628                 streamInFocus = STREAM_ALL;
629             } else {
630                 streamInFocus = VolumeUtils::GetVolumeTypeFromStreamType(GetCurrentStreamInFocus());
631             }
632             std::lock_guard<std::mutex> lock(systemVolumeMutex_);
633             isStreamMuted = GetStreamMuteInternal(streamInFocus);
634             SetStreamMuteInternal(streamInFocus, !isStreamMuted, true);
635         });
636     std::string keyType = "mute";
637     std::string RegistrationTime = GetTime();
638     audioVolumeManager_.SaveVolumeKeyRegistrationInfo(keyType, RegistrationTime, muteKeySubId,
639         muteKeySubId >= 0 ? true : false);
640     AUDIO_INFO_LOG("RegisterVolumeKeyInfo keyType: %{public}s, RegistrationTime: %{public}s, keySubId: %{public}d,"
641         " Regist Success: %{public}s",
642         keyType.c_str(), RegistrationTime.c_str(), muteKeySubId, muteKeySubId >= 0 ? "true" : "false");
643 
644     if (muteKeySubId < 0) {
645         AUDIO_ERR_LOG("SubscribeKeyEvent: subscribing for mute failed ");
646         return ERR_MMI_SUBSCRIBE;
647     }
648     return muteKeySubId;
649 }
650 #endif
651 
652 #ifdef FEATURE_MULTIMODALINPUT_INPUT
SubscribeVolumeKeyEvents()653 void AudioPolicyServer::SubscribeVolumeKeyEvents()
654 {
655     std::lock_guard<std::mutex> lock(subscribeVolumeKey_);
656     if (hasSubscribedVolumeKeyEvents_.load()) {
657         AUDIO_INFO_LOG("SubscribeVolumeKeyEvents: volume key events has been sunscirbed!");
658         return;
659     }
660 
661     AUDIO_INFO_LOG("SubscribeVolumeKeyEvents: first time.");
662     int32_t resultOfVolumeUp = RegisterVolumeKeyEvents(OHOS::MMI::KeyEvent::KEYCODE_VOLUME_UP);
663     SendMonitrtEvent(OHOS::MMI::KeyEvent::KEYCODE_VOLUME_UP, resultOfVolumeUp);
664     int32_t resultOfVolumeDown = RegisterVolumeKeyEvents(OHOS::MMI::KeyEvent::KEYCODE_VOLUME_DOWN);
665     SendMonitrtEvent(OHOS::MMI::KeyEvent::KEYCODE_VOLUME_DOWN, resultOfVolumeDown);
666     int32_t resultOfMute = RegisterVolumeKeyMuteEvents();
667     SendMonitrtEvent(OHOS::MMI::KeyEvent::KEYCODE_MUTE, resultOfMute);
668     if (resultOfVolumeUp >= 0 && resultOfVolumeDown >= 0 && resultOfMute >= 0) {
669         hasSubscribedVolumeKeyEvents_.store(true);
670     } else {
671         AUDIO_ERR_LOG("SubscribeVolumeKeyEvents: failed to subscribe key events.");
672         hasSubscribedVolumeKeyEvents_.store(false);
673     }
674 }
675 #endif
676 
SendMonitrtEvent(const int32_t keyType,int32_t resultOfVolumeKey)677 void AudioPolicyServer::SendMonitrtEvent(const int32_t keyType, int32_t resultOfVolumeKey)
678 {
679     std::shared_ptr<Media::MediaMonitor::EventBean> bean = std::make_shared<Media::MediaMonitor::EventBean>(
680         Media::MediaMonitor::ModuleId::AUDIO, Media::MediaMonitor::EventId::VOLUME_SUBSCRIBE,
681         Media::MediaMonitor::EventType::BEHAVIOR_EVENT);
682     bean->Add("SUBSCRIBE_KEY", TranslateKeyEvent(keyType));
683     bean->Add("SUBSCRIBE_RESULT", static_cast<int32_t>(TranslateErrorCode(resultOfVolumeKey)));
684     Media::MediaMonitor::MediaMonitorManager::GetInstance().WriteLogMsg(bean);
685 }
686 
SubscribeSafeVolumeEvent()687 void AudioPolicyServer::SubscribeSafeVolumeEvent()
688 {
689     AUDIO_INFO_LOG("enter");
690     audioPolicyService_.SubscribeSafeVolumeEvent();
691 }
692 
IsVolumeTypeValid(AudioStreamType streamType)693 bool AudioPolicyServer::IsVolumeTypeValid(AudioStreamType streamType)
694 {
695     bool result = false;
696     switch (streamType) {
697         case STREAM_MUSIC:
698         case STREAM_RING:
699         case STREAM_NOTIFICATION:
700         case STREAM_VOICE_CALL:
701         case STREAM_VOICE_COMMUNICATION:
702         case STREAM_VOICE_ASSISTANT:
703         case STREAM_ALARM:
704         case STREAM_SYSTEM:
705         case STREAM_ACCESSIBILITY:
706         case STREAM_ULTRASONIC:
707         case STREAM_NAVIGATION:
708         case STREAM_ALL:
709         case STREAM_VOICE_RING:
710         case STREAM_CAMCORDER:
711             result = true;
712             break;
713         default:
714             result = false;
715             AUDIO_ERR_LOG("IsVolumeTypeValid: streamType[%{public}d] is not supported", streamType);
716             break;
717     }
718     return result;
719 }
720 
IsVolumeLevelValid(AudioStreamType streamType,int32_t volumeLevel)721 bool AudioPolicyServer::IsVolumeLevelValid(AudioStreamType streamType, int32_t volumeLevel)
722 {
723     bool result = true;
724     if (volumeLevel < audioVolumeManager_.GetMinVolumeLevel(streamType) ||
725         volumeLevel > audioVolumeManager_.GetMaxVolumeLevel(streamType)) {
726         AUDIO_ERR_LOG("IsVolumeLevelValid: volumeLevel[%{public}d] is out of valid range for streamType[%{public}d]",
727             volumeLevel, streamType);
728         result = false;
729     }
730     return result;
731 }
732 
IsRingerModeValid(AudioRingerMode ringMode)733 bool AudioPolicyServer::IsRingerModeValid(AudioRingerMode ringMode)
734 {
735     bool result = false;
736     switch (ringMode) {
737         case RINGER_MODE_SILENT:
738         case RINGER_MODE_VIBRATE:
739         case RINGER_MODE_NORMAL:
740             result = true;
741             break;
742         default:
743             result = false;
744             AUDIO_ERR_LOG("IsRingerModeValid: ringMode[%{public}d] is not supported", ringMode);
745             break;
746     }
747     return result;
748 }
749 
SubscribeOsAccountChangeEvents()750 void AudioPolicyServer::SubscribeOsAccountChangeEvents()
751 {
752     AUDIO_INFO_LOG("OnAddSystemAbility os_account service start");
753     if (accountObserver_ == nullptr) {
754         AccountSA::OsAccountSubscribeInfo osAccountSubscribeInfo;
755         osAccountSubscribeInfo.SetOsAccountSubscribeType(AccountSA::OS_ACCOUNT_SUBSCRIBE_TYPE::SWITCHED);
756         accountObserver_ = std::make_shared<AudioOsAccountInfo>(osAccountSubscribeInfo, this);
757         ErrCode errCode = AccountSA::OsAccountManager::SubscribeOsAccount(accountObserver_);
758         CHECK_AND_RETURN_LOG(errCode == ERR_OK, "account observer register fail");
759         AUDIO_INFO_LOG("account observer register success");
760     } else {
761         AUDIO_ERR_LOG("account observer register already");
762     }
763 }
764 
AddAudioServiceOnStart()765 void AudioPolicyServer::AddAudioServiceOnStart()
766 {
767     AUDIO_INFO_LOG("OnAddSystemAbility audio service start");
768     if (!isFirstAudioServiceStart_) {
769         RegisterParamCallback();
770         ConnectServiceAdapter();
771         LoadEffectLibrary();
772         isFirstAudioServiceStart_ = true;
773     } else {
774         AUDIO_WARNING_LOG("OnAddSystemAbility audio service is not first start");
775     }
776 }
777 
AddRemoteDevstatusCallback()778 void AudioPolicyServer::AddRemoteDevstatusCallback()
779 {
780     AUDIO_INFO_LOG("add remote dev status callback start");
781     audioPolicyService_.RegisterRemoteDevStatusCallback();
782 }
783 
SubscribePowerStateChangeEvents()784 void AudioPolicyServer::SubscribePowerStateChangeEvents()
785 {
786     sptr<PowerMgr::IPowerStateCallback> powerStateCallback_;
787 
788     if (powerStateCallback_ == nullptr) {
789         powerStateCallback_ = new (std::nothrow) AudioPolicyServerPowerStateCallback(this);
790     }
791 
792     if (powerStateCallback_ == nullptr) {
793         AUDIO_ERR_LOG("subscribe create power state callback Create Error");
794         return;
795     }
796 
797     WatchTimeout guard("PowerMgr::PowerMgrClient::GetInstance().RegisterPowerStateCallback:AddRemoteDevstatus");
798     bool RegisterSuccess = PowerMgr::PowerMgrClient::GetInstance().RegisterPowerStateCallback(powerStateCallback_,
799         false);
800     guard.CheckCurrTimeout();
801     if (!RegisterSuccess) {
802         AUDIO_ERR_LOG("register power state callback failed");
803     } else {
804         AUDIO_INFO_LOG("register power state callback success");
805         powerStateCallbackRegister_ = true;
806     }
807 }
808 
OnReceiveEvent(const EventFwk::CommonEventData & eventData)809 void AudioCommonEventSubscriber::OnReceiveEvent(const EventFwk::CommonEventData &eventData)
810 {
811     if (eventReceiver_ == nullptr) {
812         AUDIO_ERR_LOG("eventReceiver_ is nullptr");
813         return;
814     }
815     eventReceiver_(eventData);
816 }
817 
SubscribeBackgroundTask()818 void AudioPolicyServer::SubscribeBackgroundTask()
819 {
820     AUDIO_INFO_LOG("In");
821     audioBackgroundManager_.SubscribeBackgroundTask();
822 }
823 
SubscribeCommonEventExecute()824 void AudioPolicyServer::SubscribeCommonEventExecute()
825 {
826     if (isAlreadyRegisterCommonEventListener_) {
827         AUDIO_INFO_LOG("already registed common event listener, return");
828         return;
829     }
830     SubscribeCommonEvent("usual.event.DATA_SHARE_READY");
831     SubscribeCommonEvent("usual.event.dms.rotation_changed");
832     SubscribeCommonEvent("usual.event.bluetooth.remotedevice.NAME_UPDATE");
833     SubscribeCommonEvent("usual.event.SCREEN_ON");
834     SubscribeCommonEvent("usual.event.SCREEN_OFF");
835     SubscribeCommonEvent("usual.event.SCREEN_LOCKED");
836     SubscribeCommonEvent("usual.event.SCREEN_UNLOCKED");
837     SubscribeCommonEvent("usual.event.LOCALE_CHANGED");
838 #ifdef USB_ENABLE
839     usbManager_.SubscribeEvent();
840 #endif
841     SubscribeSafeVolumeEvent();
842     isAlreadyRegisterCommonEventListener_ = true;
843 }
844 
SubscribeCommonEvent(const std::string event)845 void AudioPolicyServer::SubscribeCommonEvent(const std::string event)
846 {
847     EventFwk::MatchingSkills matchingSkills;
848     matchingSkills.AddEvent(event);
849     EventFwk::CommonEventSubscribeInfo subscribeInfo(matchingSkills);
850     if (event == "usual.event.dms.rotation_changed") {
851         subscribeInfo.SetPermission("ohos.permission.PUBLISH_DISPLAY_ROTATION_EVENT");
852     }
853     auto commonSubscribePtr = std::make_shared<AudioCommonEventSubscriber>(subscribeInfo,
854         std::bind(&AudioPolicyServer::OnReceiveEvent, this, std::placeholders::_1));
855     if (commonSubscribePtr == nullptr) {
856         AUDIO_ERR_LOG("commonSubscribePtr is nullptr");
857         return;
858     }
859     AUDIO_INFO_LOG("subscribe event: %s action", event.c_str());
860     EventFwk::CommonEventManager::SubscribeCommonEvent(commonSubscribePtr);
861 }
862 
OnReceiveEvent(const EventFwk::CommonEventData & eventData)863 void AudioPolicyServer::OnReceiveEvent(const EventFwk::CommonEventData &eventData)
864 {
865     const AAFwk::Want& want = eventData.GetWant();
866     std::string action = want.GetAction();
867     if (action == "usual.event.DATA_SHARE_READY") {
868         if (isInitRingtoneReady_ == false) {
869             std::thread([&]() { CallRingtoneLibrary(); }).detach();
870             isInitRingtoneReady_ = true;
871         }
872         audioPolicyManager_.SetDataShareReady(true);
873         RegisterDataObserver();
874         if (isInitMuteState_ == false) {
875             AUDIO_INFO_LOG("receive DATA_SHARE_READY action and need init mic mute state");
876             InitMicrophoneMute();
877         }
878         if (isInitSettingsData_ == false) {
879             AUDIO_INFO_LOG("First receive DATA_SHARE_READY action and need init SettingsData");
880             InitKVStore();
881             NotifySettingsDataReady();
882             isInitSettingsData_ = true;
883         }
884         RegisterDefaultVolumeTypeListener();
885         SubscribeAccessibilityConfigObserver();
886     } else if (action == "usual.event.dms.rotation_changed") {
887         uint32_t rotate = static_cast<uint32_t>(want.GetIntParam("rotation", 0));
888         AUDIO_INFO_LOG("Set rotation to audioeffectchainmanager is %{public}d", rotate);
889         AudioServerProxy::GetInstance().SetRotationToEffectProxy(rotate);
890     } else if (action == "usual.event.bluetooth.remotedevice.NAME_UPDATE") {
891         std::string deviceName  = want.GetStringParam("remoteName");
892         std::string macAddress = want.GetStringParam("deviceAddr");
893         eventEntry_->OnReceiveBluetoothEvent(macAddress, deviceName);
894     } else if (action == "usual.event.SCREEN_ON") {
895         AUDIO_INFO_LOG("receive SCREEN_ON action, control audio focus if need");
896         audioDeviceCommon_.SetFirstScreenOn();
897         if (powerStateListener_ == nullptr) {
898             AUDIO_ERR_LOG("powerStateListener_ is nullptr");
899             return;
900         }
901         powerStateListener_->ControlAudioFocus(false);
902     } else if (action == "usual.event.SCREEN_LOCKED") {
903         AUDIO_INFO_LOG("receive SCREEN_OFF or SCREEN_LOCKED action, control audio volume change if stream is active");
904         isScreenOffOrLock_ = true;
905     } else if (action == "usual.event.SCREEN_UNLOCKED") {
906         AUDIO_INFO_LOG("receive SCREEN_UNLOCKED action, can change volume");
907         isScreenOffOrLock_ = false;
908     } else if (action == "usual.event.LOCALE_CHANGED") {
909         CallRingtoneLibrary();
910     }
911 }
912 
CheckSubscribePowerStateChange()913 void AudioPolicyServer::CheckSubscribePowerStateChange()
914 {
915     if (powerStateCallbackRegister_) {
916         return;
917     }
918 
919     SubscribePowerStateChangeEvents();
920 
921     if (powerStateCallbackRegister_) {
922         AUDIO_DEBUG_LOG("PowerState CallBack Register Success");
923     } else {
924         AUDIO_ERR_LOG("PowerState CallBack Register Failed");
925     }
926 }
927 
AudioPolicyServerPowerStateCallback(AudioPolicyServer * policyServer)928 AudioPolicyServer::AudioPolicyServerPowerStateCallback::AudioPolicyServerPowerStateCallback(
929     AudioPolicyServer* policyServer) : PowerMgr::PowerStateCallbackStub(), policyServer_(policyServer)
930 {}
931 
OnAsyncPowerStateChanged(PowerMgr::PowerState state)932 void AudioPolicyServer::AudioPolicyServerPowerStateCallback::OnAsyncPowerStateChanged(PowerMgr::PowerState state)
933 {
934     policyServer_->audioOffloadStream_.HandlePowerStateChanged(state);
935 }
936 
InitKVStore()937 void AudioPolicyServer::InitKVStore()
938 {
939     audioVolumeManager_.InitKVStore();
940 }
941 
NotifySettingsDataReady()942 void AudioPolicyServer::NotifySettingsDataReady()
943 {
944     Trace trace("AudioPolicyServer::NotifySettingsDataReady");
945     AUDIO_INFO_LOG("SettingsData Ready");
946     AudioServerProxy::GetInstance().NotifySettingsDataReady();
947 }
948 
ConnectServiceAdapter()949 void AudioPolicyServer::ConnectServiceAdapter()
950 {
951     if (!eventEntry_->ConnectServiceAdapter()) {
952         AUDIO_ERR_LOG("ConnectServiceAdapter Error in connecting to audio service adapter");
953         return;
954     }
955 }
956 
LoadEffectLibrary()957 void AudioPolicyServer::LoadEffectLibrary()
958 {
959     audioPolicyService_.LoadEffectLibrary();
960 }
961 
GetMaxVolumeLevel(int32_t volumeType,int32_t & volumeLevel,int32_t deviceType)962 int32_t AudioPolicyServer::GetMaxVolumeLevel(int32_t volumeType, int32_t &volumeLevel, int32_t deviceType)
963 {
964     volumeLevel = audioVolumeManager_.GetMaxVolumeLevel(static_cast<AudioVolumeType>(volumeType),
965                                                         static_cast<DeviceType>(deviceType));
966     return SUCCESS;
967 }
968 
GetMinVolumeLevel(int32_t volumeType,int32_t & volumeLevel,int32_t deviceType)969 int32_t AudioPolicyServer::GetMinVolumeLevel(int32_t volumeType, int32_t &volumeLevel, int32_t deviceType)
970 {
971     volumeLevel = audioVolumeManager_.GetMinVolumeLevel(static_cast<AudioVolumeType>(volumeType),
972                                                         static_cast<DeviceType>(deviceType));
973     return SUCCESS;
974 }
975 
976 // deprecated since api 9.
SetSystemVolumeLevelLegacy(int32_t streamTypeIn,int32_t volumeLevel)977 int32_t AudioPolicyServer::SetSystemVolumeLevelLegacy(int32_t streamTypeIn, int32_t volumeLevel)
978 {
979     AudioStreamType streamType = static_cast<AudioStreamType>(streamTypeIn);
980     if (!IsVolumeTypeValid(streamType)) {
981         return ERR_NOT_SUPPORTED;
982     }
983     if (!IsVolumeLevelValid(streamType, volumeLevel)) {
984         return ERR_NOT_SUPPORTED;
985     }
986     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
987     int32_t zoneId = AudioZoneService::GetInstance().FindAudioZoneByUid(IPCSkeleton::GetCallingUid());
988     return SetSystemVolumeLevelInternal(streamType, volumeLevel, false, zoneId);
989 }
990 
SetAdjustVolumeForZone(int32_t zoneId)991 int32_t AudioPolicyServer::SetAdjustVolumeForZone(int32_t zoneId)
992 {
993     if (!PermissionUtil::VerifySystemPermission()) {
994         AUDIO_ERR_LOG("SetAppVolumeLevel: No system permission");
995         return ERR_PERMISSION_DENIED;
996     }
997     int32_t ret = audioVolumeManager_.SetAdjustVolumeForZone(zoneId);
998     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Fail to SetAdjustVolumeForZone");
999     return ret;
1000 }
1001 
1002 // LCOV_EXCL_START
SetAppVolumeMuted(int32_t appUid,bool muted,int32_t volumeFlag)1003 int32_t AudioPolicyServer::SetAppVolumeMuted(int32_t appUid, bool muted, int32_t volumeFlag)
1004 {
1005     if (!PermissionUtil::VerifySystemPermission()) {
1006         AUDIO_ERR_LOG("SetAppVolumeLevel: No system permission");
1007         return ERR_PERMISSION_DENIED;
1008     }
1009     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
1010     return SetAppVolumeMutedInternal(appUid, muted, volumeFlag == VolumeFlag::FLAG_SHOW_SYSTEM_UI);
1011 }
1012 
SetAppVolumeLevel(int32_t appUid,int32_t volumeLevel,int32_t volumeFlag)1013 int32_t AudioPolicyServer::SetAppVolumeLevel(int32_t appUid, int32_t volumeLevel, int32_t volumeFlag)
1014 {
1015     if (!PermissionUtil::VerifySystemPermission()) {
1016         AUDIO_ERR_LOG("SetAppVolumeLevel: No system permission");
1017         return ERR_PERMISSION_DENIED;
1018     }
1019     if (!IsVolumeLevelValid(STREAM_APP, volumeLevel)) {
1020         return ERR_INVALID_PARAM;
1021     }
1022     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
1023     return SetAppVolumeLevelInternal(appUid, volumeLevel, volumeFlag == VolumeFlag::FLAG_SHOW_SYSTEM_UI);
1024 }
1025 
SetAppRingMuted(int32_t appUid,bool muted)1026 int32_t AudioPolicyServer::SetAppRingMuted(int32_t appUid, bool muted)
1027 {
1028     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
1029     return SetAppRingMutedInternal(appUid, muted);
1030 }
1031 
SetSystemVolumeLevel(int32_t streamTypeIn,int32_t volumeLevel,int32_t volumeFlag,int32_t uid)1032 int32_t AudioPolicyServer::SetSystemVolumeLevel(int32_t streamTypeIn, int32_t volumeLevel, int32_t volumeFlag,
1033     int32_t uid)
1034 {
1035     AudioStreamType streamType = static_cast<AudioStreamType>(streamTypeIn);
1036     if (!PermissionUtil::VerifySystemPermission()) {
1037         AUDIO_ERR_LOG("SetSystemVolumeLevel: No system permission");
1038         return ERR_PERMISSION_DENIED;
1039     }
1040 
1041     if (!IsVolumeTypeValid(streamType)) {
1042         return ERR_NOT_SUPPORTED;
1043     }
1044     if (!IsVolumeLevelValid(streamType, volumeLevel)) {
1045         return ERR_NOT_SUPPORTED;
1046     }
1047 
1048     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
1049     bool flag = volumeFlag == VolumeFlag::FLAG_SHOW_SYSTEM_UI;
1050     int32_t zoneId = 0;
1051     if (uid != 0) {
1052         zoneId = AudioZoneService::GetInstance().FindAudioZoneByUid(uid);
1053         if (zoneId != 0 && AudioZoneService::GetInstance().IsSystemVolumeProxyEnable(zoneId)) {
1054             return AudioZoneService::GetInstance().SetSystemVolumeLevel(zoneId,
1055                 VolumeUtils::GetVolumeTypeFromStreamType(streamType), volumeLevel, flag);
1056         }
1057         return SetSystemVolumeLevelInternal(streamType, volumeLevel, flag, zoneId);
1058     }
1059     zoneId = AudioZoneService::GetInstance().FindAudioZoneByUid(IPCSkeleton::GetCallingUid());
1060     return SetSystemVolumeLevelInternal(streamType, volumeLevel, flag, zoneId);
1061 }
1062 
SetSystemVolumeLevelWithDevice(int32_t streamTypeIn,int32_t volumeLevel,int32_t deviceTypeIn,int32_t volumeFlag)1063 int32_t AudioPolicyServer::SetSystemVolumeLevelWithDevice(int32_t streamTypeIn, int32_t volumeLevel,
1064     int32_t deviceTypeIn, int32_t volumeFlag)
1065 {
1066     AudioStreamType streamType = static_cast<AudioStreamType>(streamTypeIn);
1067     DeviceType deviceType = static_cast<DeviceType>(deviceTypeIn);
1068     if (!PermissionUtil::VerifySystemPermission()) {
1069         AUDIO_ERR_LOG("SetSystemVolumeLevelWithDevice: No system permission");
1070         return ERR_PERMISSION_DENIED;
1071     }
1072 
1073     if (!IsVolumeTypeValid(streamType)) {
1074         return ERR_NOT_SUPPORTED;
1075     }
1076     if (!IsVolumeLevelValid(streamType, volumeLevel)) {
1077         return ERR_NOT_SUPPORTED;
1078     }
1079 
1080     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
1081     return SetSystemVolumeLevelWithDeviceInternal(streamType, volumeLevel,
1082         volumeFlag == VolumeFlag::FLAG_SHOW_SYSTEM_UI, deviceType);
1083 }
1084 
GetSystemActiveVolumeType(int32_t clientUid,int32_t & streamType)1085 int32_t AudioPolicyServer::GetSystemActiveVolumeType(int32_t clientUid, int32_t &streamType)
1086 {
1087     streamType = static_cast<int32_t>(GetSystemActiveVolumeTypeInternal(clientUid));
1088     return SUCCESS;
1089 }
1090 
GetSystemActiveVolumeTypeInternal(const int32_t clientUid)1091 AudioStreamType AudioPolicyServer::GetSystemActiveVolumeTypeInternal(const int32_t clientUid)
1092 {
1093     if (!PermissionUtil::VerifySystemPermission()) {
1094         AUDIO_ERR_LOG("No system permission");
1095         return AudioStreamType::STREAM_MUSIC;
1096     }
1097     int32_t zoneID = 0;
1098     AudioStreamType streamInFocus = VolumeUtils::GetVolumeTypeFromStreamType(
1099         GetCurrentStreamInFocus());
1100     if (clientUid != 0) {
1101         int32_t streamType = STREAM_DEFAULT;
1102         GetStreamInFocusByUid(clientUid, zoneID, streamType);
1103         streamInFocus = VolumeUtils::GetVolumeTypeFromStreamType(static_cast<AudioStreamType>(streamType));
1104     }
1105 
1106     AUDIO_INFO_LOG("Get active volume type success:= %{public}d", streamInFocus);
1107     return streamInFocus;
1108 }
1109 
GetAppVolumeLevel(int32_t appUid,int32_t & volumeLevel)1110 int32_t AudioPolicyServer::GetAppVolumeLevel(int32_t appUid, int32_t &volumeLevel)
1111 {
1112     AUDIO_INFO_LOG("GetAppVolumeLevel appUid : %{public}d", appUid);
1113     if (!PermissionUtil::VerifySystemPermission()) {
1114         return ERR_PERMISSION_DENIED;
1115     }
1116     return GetAppVolumeLevelInternal(appUid, volumeLevel);
1117 }
1118 // LCOV_EXCL_STOP
1119 
GetSelfAppVolumeLevel(int32_t & volumeLevel)1120 int32_t AudioPolicyServer::GetSelfAppVolumeLevel(int32_t &volumeLevel)
1121 {
1122     AUDIO_INFO_LOG("enter");
1123     int32_t appUid = IPCSkeleton::GetCallingUid();
1124     return GetAppVolumeLevelInternal(appUid, volumeLevel);
1125 }
1126 
GetSystemVolumeLevel(int32_t streamType,int32_t uid,int32_t & volumeLevel)1127 int32_t AudioPolicyServer::GetSystemVolumeLevel(int32_t streamType, int32_t uid, int32_t &volumeLevel)
1128 {
1129     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
1130     AudioStreamType newStreamType = static_cast<AudioStreamType>(streamType);
1131     int32_t zoneId = 0;
1132     if (uid != 0) {
1133         zoneId = AudioZoneService::GetInstance().FindAudioZoneByUid(uid);
1134         if (zoneId != 0 && AudioZoneService::GetInstance().IsSystemVolumeProxyEnable(zoneId)) {
1135             volumeLevel = AudioZoneService::GetInstance().GetSystemVolumeLevel(zoneId,
1136                 VolumeUtils::GetVolumeTypeFromStreamType(newStreamType));
1137             return SUCCESS;
1138         }
1139     } else {
1140         zoneId = AudioZoneService::GetInstance().FindAudioZoneByUid(IPCSkeleton::GetCallingUid());
1141     }
1142     volumeLevel = GetSystemVolumeLevelInternal(newStreamType, zoneId);
1143     return SUCCESS;
1144 }
1145 
GetSystemVolumeLevelNoMuteState(AudioStreamType streamType)1146 int32_t AudioPolicyServer::GetSystemVolumeLevelNoMuteState(AudioStreamType streamType)
1147 {
1148     if (streamType == STREAM_ALL) {
1149         streamType = STREAM_MUSIC;
1150     }
1151     int32_t volumeLevel = audioVolumeManager_.GetSystemVolumeLevelNoMuteState(streamType);
1152     AUDIO_DEBUG_LOG("GetVolumeNoMute streamType[%{public}d],volumeLevel[%{public}d]", streamType, volumeLevel);
1153     return volumeLevel;
1154 }
1155 
GetSystemVolumeLevelInternal(AudioStreamType streamType,int32_t zoneId)1156 int32_t AudioPolicyServer::GetSystemVolumeLevelInternal(AudioStreamType streamType, int32_t zoneId)
1157 {
1158     if (streamType == STREAM_ALL) {
1159         streamType = STREAM_MUSIC;
1160     }
1161     int32_t volumeLevel =  audioVolumeManager_.GetSystemVolumeLevel(streamType, zoneId);
1162     AUDIO_DEBUG_LOG("GetVolume streamType[%{public}d],volumeLevel[%{public}d]", streamType, volumeLevel);
1163     return volumeLevel;
1164 }
1165 
GetAppVolumeLevelInternal(int32_t appUid,int32_t & volumeLevel)1166 int32_t AudioPolicyServer::GetAppVolumeLevelInternal(int32_t appUid, int32_t &volumeLevel)
1167 {
1168     int32_t ret = audioVolumeManager_.GetAppVolumeLevel(appUid, volumeLevel);
1169     AUDIO_DEBUG_LOG("GetAppVolume appUid[%{public}d],volumeLevel[%{public}d]", appUid, volumeLevel);
1170     return ret;
1171 }
1172 
SetLowPowerVolume(int32_t streamId,float volume)1173 int32_t AudioPolicyServer::SetLowPowerVolume(int32_t streamId, float volume)
1174 {
1175     auto callerUid = IPCSkeleton::GetCallingUid();
1176     if (callerUid != UID_FOUNDATION_SA && callerUid != UID_RESOURCE_SCHEDULE_SERVICE) {
1177         AUDIO_ERR_LOG("SetLowPowerVolume callerUid Error: not foundation or resource_schedule_service");
1178         return ERROR;
1179     }
1180     return streamCollector_.SetLowPowerVolume(streamId, volume);
1181 }
1182 
GetFastStreamInfo(AudioStreamInfo & streamInfo)1183 int32_t AudioPolicyServer::GetFastStreamInfo(AudioStreamInfo &streamInfo)
1184 {
1185     streamInfo = audioPolicyService_.GetFastStreamInfo();
1186     return SUCCESS;
1187 }
1188 
GetLowPowerVolume(int32_t streamId,float & outVolume)1189 int32_t AudioPolicyServer::GetLowPowerVolume(int32_t streamId, float &outVolume)
1190 {
1191     outVolume = streamCollector_.GetLowPowerVolume(streamId);
1192     return SUCCESS;
1193 }
1194 
GetSingleStreamVolume(int32_t streamId,float & outVolume)1195 int32_t AudioPolicyServer::GetSingleStreamVolume(int32_t streamId, float &outVolume)
1196 {
1197     outVolume = streamCollector_.GetSingleStreamVolume(streamId);
1198     return SUCCESS;
1199 }
1200 
IsVolumeUnadjustable(bool & unadjustable)1201 int32_t AudioPolicyServer::IsVolumeUnadjustable(bool &unadjustable)
1202 {
1203     unadjustable = audioPolicyManager_.IsVolumeUnadjustable();
1204     return SUCCESS;
1205 }
1206 
CheckCanMuteVolumeTypeByStep(AudioVolumeType volumeType,int32_t volumeLevel)1207 bool AudioPolicyServer::CheckCanMuteVolumeTypeByStep(AudioVolumeType volumeType, int32_t volumeLevel)
1208 {
1209     if ((volumeLevel - volumeStep_) == 0 && !VolumeUtils::IsPCVolumeEnable() && (volumeType == STREAM_VOICE_ASSISTANT
1210         || volumeType == STREAM_VOICE_CALL || volumeType == STREAM_ALARM || volumeType == STREAM_ACCESSIBILITY ||
1211         volumeType == STREAM_VOICE_COMMUNICATION)) {
1212         return false;
1213     }
1214     return true;
1215 }
1216 
1217 // LCOV_EXCL_START
AdjustVolumeByStep(int32_t adjustTypeIn)1218 int32_t AudioPolicyServer::AdjustVolumeByStep(int32_t adjustTypeIn)
1219 {
1220     VolumeAdjustType adjustType = static_cast<VolumeAdjustType>(adjustTypeIn);
1221     auto callerUid = IPCSkeleton::GetCallingUid();
1222     AUDIO_INFO_LOG("Uid %{public}d send AdjustVolumeByStep volume key: %{public}s.", callerUid,
1223         (adjustType == VolumeAdjustType::VOLUME_UP) ? "up" : "down");
1224     if (!PermissionUtil::VerifySystemPermission()) {
1225         AUDIO_ERR_LOG("AdjustVolumeByStep: No system permission");
1226         return ERR_PERMISSION_DENIED;
1227     }
1228 
1229     AudioStreamType streamInFocus = VolumeUtils::GetVolumeTypeFromStreamType(
1230         GetCurrentStreamInFocus());
1231     if (streamInFocus == AudioStreamType::STREAM_DEFAULT) {
1232         streamInFocus = AudioStreamType::STREAM_MUSIC;
1233     }
1234 
1235     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
1236     int32_t volumeLevelInInt = 0;
1237     if (adjustType == VolumeAdjustType::VOLUME_UP && GetStreamMuteInternal(streamInFocus)) {
1238         SetStreamMuteInternal(streamInFocus, false, false);
1239         if (!VolumeUtils::IsPCVolumeEnable()) {
1240             AUDIO_DEBUG_LOG("phone need return");
1241             return SUCCESS;
1242         }
1243     }
1244     volumeLevelInInt = GetSystemVolumeLevelInternal(streamInFocus);
1245     int32_t minRet = -1;
1246     GetMinVolumeLevel(streamInFocus, minRet);
1247     int32_t maxRet = -1;
1248     GetMaxVolumeLevel(streamInFocus, maxRet);
1249     if (adjustType == VolumeAdjustType::VOLUME_UP) {
1250         CHECK_AND_RETURN_RET_LOG(volumeLevelInInt < maxRet, ERR_OPERATION_FAILED, "volumeLevelInInt is biggest");
1251         volumeLevelInInt = volumeLevelInInt + volumeStep_;
1252     } else {
1253         if (!CheckCanMuteVolumeTypeByStep(streamInFocus, volumeLevelInInt)) {
1254             // This type can not set to mute, but don't return error
1255             AUDIO_INFO_LOG("SetSystemVolumeLevel this type can not set mute");
1256             return SUCCESS;
1257         }
1258         CHECK_AND_RETURN_RET_LOG(volumeLevelInInt > minRet, ERR_OPERATION_FAILED, "volumeLevelInInt is smallest");
1259         volumeLevelInInt = volumeLevelInInt - volumeStep_;
1260     }
1261     volumeLevelInInt = volumeLevelInInt > maxRet ? maxRet :
1262         volumeLevelInInt;
1263     volumeLevelInInt = volumeLevelInInt < minRet ? minRet :
1264         volumeLevelInInt;
1265     int32_t ret = SetSystemVolumeLevelInternal(streamInFocus, volumeLevelInInt, false);
1266     return ret;
1267 }
1268 
AdjustSystemVolumeByStep(int32_t volumeTypeIn,int32_t adjustTypeIn)1269 int32_t AudioPolicyServer::AdjustSystemVolumeByStep(int32_t volumeTypeIn, int32_t adjustTypeIn)
1270 {
1271     AudioVolumeType volumeType = static_cast<AudioVolumeType>(volumeTypeIn);
1272     VolumeAdjustType adjustType = static_cast<VolumeAdjustType>(adjustTypeIn);
1273     auto callerUid = IPCSkeleton::GetCallingUid();
1274     AUDIO_INFO_LOG("Uid %{public}d send AdjustSystemVolumeByStep VolumeType: %{public}d volume key: %{public}s.",
1275         callerUid, volumeType, (adjustType == VolumeAdjustType::VOLUME_UP) ? "up" : "down");
1276     if (!PermissionUtil::VerifySystemPermission()) {
1277         AUDIO_ERR_LOG("AdjustSystemVolumeByStep: No system permission");
1278         return ERR_PERMISSION_DENIED;
1279     }
1280 
1281     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
1282     if (adjustType == VolumeAdjustType::VOLUME_UP && GetStreamMuteInternal(volumeType)) {
1283         SetStreamMuteInternal(volumeType, false, false);
1284         if (!VolumeUtils::IsPCVolumeEnable()) {
1285             AUDIO_DEBUG_LOG("phone need return");
1286             return SUCCESS;
1287         }
1288     }
1289     int32_t volumeLevelInInt = GetSystemVolumeLevelInternal(volumeType);
1290     int32_t minRet = -1;
1291     GetMinVolumeLevel(volumeType, minRet);
1292     int32_t maxRet = -1;
1293     GetMaxVolumeLevel(volumeType, maxRet);
1294     if (adjustType == VolumeAdjustType::VOLUME_UP) {
1295         CHECK_AND_RETURN_RET_LOG(volumeLevelInInt < maxRet, ERR_OPERATION_FAILED, "volumeLevelInInt is biggest");
1296         volumeLevelInInt = volumeLevelInInt + volumeStep_;
1297     } else {
1298         if (!CheckCanMuteVolumeTypeByStep(volumeType, volumeLevelInInt)) {
1299             // This type can not set to mute, but don't return error
1300             AUDIO_INFO_LOG("SetSystemVolumeLevel this type can not set mute");
1301             return SUCCESS;
1302         }
1303         CHECK_AND_RETURN_RET_LOG(volumeLevelInInt > minRet, ERR_OPERATION_FAILED, "volumeLevelInInt is smallest");
1304         volumeLevelInInt = volumeLevelInInt - volumeStep_;
1305     }
1306     volumeLevelInInt = volumeLevelInInt > maxRet ? maxRet :
1307         volumeLevelInInt;
1308     volumeLevelInInt = volumeLevelInInt < minRet ? minRet :
1309         volumeLevelInInt;
1310     int32_t ret = SetSystemVolumeLevelInternal(volumeType, volumeLevelInInt, false);
1311     return ret;
1312 }
1313 // LCOV_EXCL_STOP
1314 
GetSystemVolumeInDb(int32_t volumeTypeIn,int32_t volumeLevel,int32_t deviceTypeIn,float & volume)1315 int32_t AudioPolicyServer::GetSystemVolumeInDb(int32_t volumeTypeIn,
1316     int32_t volumeLevel, int32_t deviceTypeIn, float &volume)
1317 {
1318     AudioVolumeType volumeType = static_cast<AudioVolumeType>(volumeTypeIn);
1319     DeviceType deviceType = static_cast<DeviceType>(deviceTypeIn);
1320     if (!IsVolumeTypeValid(volumeType)) {
1321         volume = static_cast<float>(ERR_INVALID_PARAM);
1322         return ERR_INVALID_PARAM;
1323     }
1324     if (!IsVolumeLevelValid(volumeType, volumeLevel)) {
1325         volume = static_cast<float>(ERR_INVALID_PARAM);
1326         return ERR_INVALID_PARAM;
1327     }
1328 
1329     volume = audioPolicyManager_.GetSystemVolumeInDb(volumeType, volumeLevel, deviceType);
1330     return SUCCESS;
1331 }
1332 
1333 // deprecated since api 9.
SetStreamMuteLegacy(int32_t streamTypeIn,bool mute,int32_t deviceTypeIn)1334 int32_t AudioPolicyServer::SetStreamMuteLegacy(int32_t streamTypeIn, bool mute, int32_t deviceTypeIn)
1335 {
1336     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
1337     AudioStreamType streamType = static_cast<AudioStreamType>(streamTypeIn);
1338     DeviceType deviceType = static_cast<DeviceType>(deviceTypeIn);
1339     int32_t zoneId = AudioZoneService::GetInstance().FindAudioZoneByUid(IPCSkeleton::GetCallingUid());
1340     return SetStreamMuteInternal(streamType, mute, false, deviceType, zoneId);
1341 }
1342 
1343 // LCOV_EXCL_START
SetStreamMute(int32_t streamTypeIn,bool mute,int32_t deviceTypeIn)1344 int32_t AudioPolicyServer::SetStreamMute(int32_t streamTypeIn, bool mute, int32_t deviceTypeIn)
1345 {
1346     if (!PermissionUtil::VerifySystemPermission()) {
1347         AUDIO_ERR_LOG("No system permission");
1348         return ERR_PERMISSION_DENIED;
1349     }
1350 
1351     AudioStreamType streamType = static_cast<AudioStreamType>(streamTypeIn);
1352     DeviceType deviceType = static_cast<DeviceType>(deviceTypeIn);
1353     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
1354     int32_t zoneId = AudioZoneService::GetInstance().FindAudioZoneByUid(IPCSkeleton::GetCallingUid());
1355     return SetStreamMuteInternal(streamType, mute, false, deviceType, zoneId);
1356 }
1357 // LCOV_EXCL_STOP
1358 
SetStreamMuteInternal(AudioStreamType streamType,bool mute,bool isUpdateUi,const DeviceType & deviceType,int32_t zoneId)1359 int32_t AudioPolicyServer::SetStreamMuteInternal(AudioStreamType streamType, bool mute, bool isUpdateUi,
1360     const DeviceType &deviceType, int32_t zoneId)
1361 {
1362     AUDIO_INFO_LOG("SetStreamMuteInternal streamType: %{public}d, mute: %{public}d, updateUi: %{public}d",
1363         streamType, mute, isUpdateUi);
1364 
1365     if (streamType == STREAM_ALL) {
1366         for (auto audioStreamType : GET_STREAM_ALL_VOLUME_TYPES) {
1367             AUDIO_INFO_LOG("SetMute of STREAM_ALL for StreamType = %{public}d ", audioStreamType);
1368             int32_t setResult = SetSingleStreamMute(audioStreamType, mute, isUpdateUi, deviceType, zoneId);
1369             if (setResult != SUCCESS) {
1370                 return setResult;
1371             }
1372         }
1373         return SUCCESS;
1374     }
1375 
1376     return SetSingleStreamMute(streamType, mute, isUpdateUi, deviceType, zoneId);
1377 }
1378 
UpdateSystemMuteStateAccordingMusicState(AudioStreamType streamType,bool mute,bool isUpdateUi)1379 void AudioPolicyServer::UpdateSystemMuteStateAccordingMusicState(AudioStreamType streamType, bool mute, bool isUpdateUi)
1380 {
1381     // This function only applies to mute/unmute scenarios where the input type is music on the PC platform
1382     if (VolumeUtils::GetVolumeTypeFromStreamType(streamType) != AudioStreamType::STREAM_MUSIC ||
1383         !VolumeUtils::IsPCVolumeEnable()) {
1384         return;
1385     }
1386     if (mute && !GetStreamMuteInternal(STREAM_SYSTEM)) {
1387         // If the STREAM_MUSIC wants mute, synchronize the mute STREAM_SYSTEM
1388         audioVolumeManager_.SetStreamMute(STREAM_SYSTEM, mute);
1389         SendMuteKeyEventCbWithUpdateUiOrNot(STREAM_SYSTEM, isUpdateUi);
1390         AUDIO_WARNING_LOG("music is mute or volume change to 0 and need mute system stream");
1391     } else if (!mute && GetStreamMuteInternal(STREAM_SYSTEM)) {
1392         // If you STREAM_MUSIC unmute, you need to determine whether the volume is 0
1393         // if it is 0, the prompt sound will continue to be mute, and if it is not 0
1394         // you need to synchronize the unmute prompt sound
1395         bool isMute = (GetSystemVolumeLevelInternal(STREAM_MUSIC) == 0) ? true : false;
1396         audioVolumeManager_.SetStreamMute(STREAM_SYSTEM, isMute);
1397         SendMuteKeyEventCbWithUpdateUiOrNot(STREAM_SYSTEM, isUpdateUi);
1398         AUDIO_WARNING_LOG("music is unmute and volume is 0 and need %{public}d system stream", isMute);
1399     }
1400 }
1401 
SendMuteKeyEventCbWithUpdateUiOrNot(AudioStreamType streamType,const bool & isUpdateUi,int32_t zoneId)1402 void AudioPolicyServer::SendMuteKeyEventCbWithUpdateUiOrNot(AudioStreamType streamType,
1403     const bool& isUpdateUi, int32_t zoneId)
1404 {
1405     VolumeEvent volumeEvent;
1406     volumeEvent.volumeType = streamType;
1407     volumeEvent.volume = GetSystemVolumeLevelInternal(streamType, zoneId);
1408     volumeEvent.updateUi = isUpdateUi;
1409     volumeEvent.volumeGroupId = 0;
1410     volumeEvent.networkId = LOCAL_NETWORK_ID;
1411     if (audioPolicyServerHandler_ != nullptr) {
1412         audioPolicyServerHandler_->SendVolumeKeyEventCallback(volumeEvent);
1413     }
1414 }
1415 
SetSingleStreamMute(AudioStreamType streamType,bool mute,bool isUpdateUi,const DeviceType & deviceType,int32_t zoneId)1416 int32_t AudioPolicyServer::SetSingleStreamMute(AudioStreamType streamType, bool mute, bool isUpdateUi,
1417     const DeviceType &deviceType, int32_t zoneId)
1418 {
1419     bool updateRingerMode = false;
1420     if ((streamType == AudioStreamType::STREAM_RING || streamType == AudioStreamType::STREAM_VOICE_RING) &&
1421         VolumeUtils::GetVolumeTypeFromStreamType(streamType) == AudioStreamType::STREAM_RING) {
1422         // Check whether the currentRingerMode is suitable for the ringtone mute state.
1423         AudioRingerMode currentRingerMode = audioPolicyManager_.GetRingerMode();
1424         if ((currentRingerMode == RINGER_MODE_NORMAL && mute) || (currentRingerMode != RINGER_MODE_NORMAL && !mute)) {
1425             // When isUpdateUi is false, the func is called by others. Need to verify permission.
1426             if (!isUpdateUi && !VerifyPermission(ACCESS_NOTIFICATION_POLICY_PERMISSION)) {
1427                 AUDIO_ERR_LOG("ACCESS_NOTIFICATION_POLICY_PERMISSION permission denied for ringtone mute state!");
1428                 return ERR_PERMISSION_DENIED;
1429             }
1430             updateRingerMode = true;
1431         }
1432     }
1433 
1434     if (VolumeUtils::GetVolumeTypeFromStreamType(streamType) == AudioStreamType::STREAM_SYSTEM &&
1435         !mute && (GetSystemVolumeLevelNoMuteState(STREAM_MUSIC) == 0 || GetStreamMuteInternal(STREAM_MUSIC, zoneId))) {
1436         // when music type volume is not mute,system type volume can be muted separately.
1437         // but when trying to mute system type volume while the volume for music type is mute
1438         // or volume level is 0,system type volume can not be muted.
1439         AUDIO_WARNING_LOG("music volume is 0 or mute and no need unmute system stream!");
1440     } else {
1441         int32_t result = audioVolumeManager_.SetStreamMute(streamType, mute, STREAM_USAGE_UNKNOWN, deviceType, zoneId);
1442         CHECK_AND_RETURN_RET_LOG(result == SUCCESS, result, "Fail to set stream mute!");
1443     }
1444 
1445     if (!mute && GetSystemVolumeLevelInternal(streamType, zoneId) == 0 && !VolumeUtils::IsPCVolumeEnable()) {
1446         // If mute state is set to false but volume is 0, set volume to 1
1447         audioVolumeManager_.SetSystemVolumeLevel(streamType, 1, zoneId);
1448     }
1449     ProcUpdateRingerModeForMute(updateRingerMode, mute);
1450     SendMuteKeyEventCbWithUpdateUiOrNot(streamType, isUpdateUi, zoneId);
1451     UpdateSystemMuteStateAccordingMusicState(streamType, mute, isUpdateUi);
1452     return SUCCESS;
1453 }
1454 
ProcUpdateRingerModeForMute(bool updateRingerMode,bool mute)1455 void AudioPolicyServer::ProcUpdateRingerModeForMute(bool updateRingerMode, bool mute)
1456 {
1457     if (updateRingerMode) {
1458         AudioRingerMode ringerMode = mute ? (supportVibrator_ ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT) :
1459             RINGER_MODE_NORMAL;
1460         if (!supportVibrator_) {
1461             AUDIO_INFO_LOG("The device does not support vibration");
1462         }
1463         AUDIO_INFO_LOG("RingerMode should be set to %{public}d because of ring mute state", ringerMode);
1464         // Update ringer mode but no need to update mute state again.
1465         SetRingerModeInternal(ringerMode, true);
1466     }
1467 }
1468 
GetSystemVolumeDb(AudioStreamType streamType)1469 float AudioPolicyServer::GetSystemVolumeDb(AudioStreamType streamType)
1470 {
1471     return audioPolicyManager_.GetSystemVolumeDb(streamType);
1472 }
1473 
SetSelfAppVolumeLevel(int32_t volumeLevel,int32_t volumeFlag)1474 int32_t AudioPolicyServer::SetSelfAppVolumeLevel(int32_t volumeLevel, int32_t volumeFlag)
1475 {
1476     AUDIO_INFO_LOG("SetSelfAppVolumeLevel volumeLevel: %{public}d, volumeFlag: %{public}d",
1477         volumeLevel, volumeFlag);
1478     if (!IsVolumeLevelValid(STREAM_APP, volumeLevel)) {
1479         return ERR_INVALID_PARAM;
1480     }
1481     int32_t appUid = IPCSkeleton::GetCallingUid();
1482     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
1483     return SetAppVolumeLevelInternal(appUid, volumeLevel, volumeFlag == VolumeFlag::FLAG_SHOW_SYSTEM_UI);
1484 }
1485 
SetAppVolumeLevelInternal(int32_t appUid,int32_t volumeLevel,bool isUpdateUi)1486 int32_t AudioPolicyServer::SetAppVolumeLevelInternal(int32_t appUid, int32_t volumeLevel, bool isUpdateUi)
1487 {
1488     AUDIO_INFO_LOG("SetAppVolumeLevelInternal appUid: %{public}d, volumeLevel: %{public}d, updateUi: %{public}d",
1489         appUid, volumeLevel, isUpdateUi);
1490     return SetAppSingleStreamVolume(appUid, volumeLevel, isUpdateUi);
1491 }
1492 
SetAppRingMutedInternal(int32_t appUid,bool muted)1493 int32_t AudioPolicyServer::SetAppRingMutedInternal(int32_t appUid, bool muted)
1494 {
1495     AUDIO_INFO_LOG("SetAppRingMutedInternal appUid: %{public}d, muted: %{public}d", appUid, muted);
1496     int32_t ret = audioVolumeManager_.SetAppRingMuted(appUid, muted);
1497     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Failed to set app ring to mute");
1498     return SUCCESS;
1499 }
1500 
SetAppVolumeMutedInternal(int32_t appUid,bool muted,bool isUpdateUi)1501 int32_t AudioPolicyServer::SetAppVolumeMutedInternal(int32_t appUid, bool muted, bool isUpdateUi)
1502 {
1503     AUDIO_INFO_LOG("SetAppVolumeLevelInternal appUid: %{public}d, muted: %{public}d, updateUi: %{public}d",
1504         appUid, muted, isUpdateUi);
1505     int32_t ret = audioVolumeManager_.SetAppVolumeMuted(appUid, muted);
1506     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Fail to set App Volume mute");
1507     return ret;
1508 }
1509 
1510 // LCOV_EXCL_START
IsAppVolumeMute(int32_t appUid,bool owned,bool & isMute)1511 int32_t AudioPolicyServer::IsAppVolumeMute(int32_t appUid, bool owned, bool &isMute)
1512 {
1513     AUDIO_INFO_LOG("IsAppVolumeMute appUid: %{public}d, owned: %{public}d", appUid, owned);
1514     if (!PermissionUtil::VerifySystemPermission()) {
1515         AUDIO_ERR_LOG("only for system app");
1516         return ERR_PERMISSION_DENIED;
1517     }
1518     int32_t ret = audioVolumeManager_.IsAppVolumeMute(appUid, owned, isMute);
1519     return ret;
1520 }
1521 // LCOV_EXCL_STOP
1522 
SetSystemVolumeLevelInternal(AudioStreamType streamType,int32_t volumeLevel,bool isUpdateUi,int32_t zoneId)1523 int32_t AudioPolicyServer::SetSystemVolumeLevelInternal(AudioStreamType streamType, int32_t volumeLevel,
1524     bool isUpdateUi, int32_t zoneId)
1525 {
1526     AUDIO_INFO_LOG("streamType: %{public}d, volumeLevel: %{public}d, updateUi: %{public}d",
1527         streamType, volumeLevel, isUpdateUi);
1528     bool adjustable = false;
1529     IsVolumeUnadjustable(adjustable);
1530     if (adjustable) {
1531         AUDIO_ERR_LOG("Unadjustable device, not allow set volume");
1532         return ERR_OPERATION_FAILED;
1533     }
1534     bool mute = GetStreamMuteInternal(streamType, zoneId);
1535     if (streamType == STREAM_ALL) {
1536         for (auto audioStreamType : GET_STREAM_ALL_VOLUME_TYPES) {
1537             AUDIO_INFO_LOG("SetVolume of STREAM_ALL, SteamType = %{public}d, mute = %{public}d, level = %{public}d",
1538                 audioStreamType, mute, volumeLevel);
1539             int32_t setResult = SetSingleStreamVolume(audioStreamType, volumeLevel, isUpdateUi, mute, zoneId);
1540             if (setResult != SUCCESS && setResult != ERR_SET_VOL_FAILED_BY_SAFE_VOL &&
1541                 setResult != ERR_SET_VOL_FAILED_BY_VOLUME_CONTROL_DISABLED) {
1542                 return setResult;
1543             }
1544         }
1545         return SUCCESS;
1546     }
1547     return SetSingleStreamVolume(streamType, volumeLevel, isUpdateUi, mute, zoneId);
1548 }
1549 
SetSystemVolumeLevelWithDeviceInternal(AudioStreamType streamType,int32_t volumeLevel,bool isUpdateUi,DeviceType deviceType)1550 int32_t AudioPolicyServer::SetSystemVolumeLevelWithDeviceInternal(AudioStreamType streamType, int32_t volumeLevel,
1551     bool isUpdateUi, DeviceType deviceType)
1552 {
1553     AUDIO_INFO_LOG("%{public}s streamType: %{public}d, volumeLevel: %{public}d, "
1554         "updateUi: %{public}d, deviceType: %{public}d", __func__, streamType, volumeLevel, isUpdateUi, deviceType);
1555     bool adjustable = false;
1556     IsVolumeUnadjustable(adjustable);
1557     if (adjustable) {
1558         AUDIO_ERR_LOG("Unadjustable device, not allow set volume");
1559         return ERR_OPERATION_FAILED;
1560     }
1561     return SetSingleStreamVolumeWithDevice(streamType, volumeLevel, isUpdateUi, deviceType);
1562 }
1563 
SendVolumeKeyEventCbWithUpdateUiOrNot(AudioStreamType streamType,const bool & isUpdateUi,int32_t zoneId)1564 void AudioPolicyServer::SendVolumeKeyEventCbWithUpdateUiOrNot(AudioStreamType streamType,
1565     const bool& isUpdateUi, int32_t zoneId)
1566 {
1567     VolumeEvent volumeEvent;
1568     volumeEvent.volumeType = streamType;
1569     volumeEvent.volume = GetSystemVolumeLevelInternal(streamType, zoneId);
1570     volumeEvent.updateUi = isUpdateUi;
1571     volumeEvent.volumeGroupId = 0;
1572     volumeEvent.networkId = LOCAL_NETWORK_ID;
1573     bool ringerModeMute = audioVolumeManager_.IsRingerModeMute();
1574     if (audioPolicyServerHandler_ != nullptr && ringerModeMute) {
1575         audioPolicyServerHandler_->SendVolumeKeyEventCallback(volumeEvent);
1576     }
1577 }
1578 
UpdateMuteStateAccordingToVolLevel(AudioStreamType streamType,int32_t volumeLevel,bool mute,const bool & isUpdateUi,int32_t zoneId)1579 void AudioPolicyServer::UpdateMuteStateAccordingToVolLevel(AudioStreamType streamType, int32_t volumeLevel,
1580     bool mute, const bool& isUpdateUi, int32_t zoneId)
1581 {
1582     bool muteStatus = mute;
1583     if (volumeLevel == 0 && !mute) {
1584         muteStatus = true;
1585         audioVolumeManager_.SetStreamMute(streamType, true, STREAM_USAGE_UNKNOWN, DEVICE_TYPE_NONE, zoneId);
1586     } else if (volumeLevel > 0 && mute) {
1587         muteStatus = false;
1588         audioVolumeManager_.SetStreamMute(streamType, false, STREAM_USAGE_UNKNOWN, DEVICE_TYPE_NONE,
1589             zoneId);
1590     }
1591     SendVolumeKeyEventCbWithUpdateUiOrNot(streamType, isUpdateUi, zoneId);
1592     if (VolumeUtils::IsPCVolumeEnable()) {
1593         // system mute status should be aligned with music mute status.
1594         if (VolumeUtils::GetVolumeTypeFromStreamType(streamType) == STREAM_MUSIC &&
1595             muteStatus != GetStreamMuteInternal(STREAM_SYSTEM, zoneId)) {
1596             AUDIO_DEBUG_LOG("set system mute to %{public}d when STREAM_MUSIC.", muteStatus);
1597             audioVolumeManager_.SetStreamMute(STREAM_SYSTEM, muteStatus, STREAM_USAGE_UNKNOWN,
1598                 DEVICE_TYPE_NONE, zoneId);
1599             SendVolumeKeyEventCbWithUpdateUiOrNot(STREAM_SYSTEM, zoneId);
1600         } else if (VolumeUtils::GetVolumeTypeFromStreamType(streamType) == STREAM_SYSTEM &&
1601             muteStatus != GetStreamMuteInternal(STREAM_MUSIC, zoneId)) {
1602             bool isMute = (GetSystemVolumeLevelInternal(STREAM_MUSIC, zoneId) == 0) ? true : false;
1603             AUDIO_DEBUG_LOG("set system same to music muted or level is zero to %{public}d.", isMute);
1604             audioVolumeManager_.SetStreamMute(STREAM_SYSTEM, isMute, STREAM_USAGE_UNKNOWN, DEVICE_TYPE_NONE, zoneId);
1605             SendVolumeKeyEventCbWithUpdateUiOrNot(STREAM_SYSTEM, zoneId);
1606         }
1607     }
1608 }
1609 
ProcUpdateRingerMode()1610 void AudioPolicyServer::ProcUpdateRingerMode()
1611 {
1612     int32_t curRingVolumeLevel = GetSystemVolumeLevelNoMuteState(STREAM_RING);
1613     AudioRingerMode ringerMode = (curRingVolumeLevel > 0) ? RINGER_MODE_NORMAL :
1614         (supportVibrator_ ? RINGER_MODE_VIBRATE : RINGER_MODE_SILENT);
1615     if (!supportVibrator_) {
1616         AUDIO_INFO_LOG("The device does not support vibration");
1617     }
1618     AUDIO_INFO_LOG("RingerMode should be set to %{public}d because of ring volume level", ringerMode);
1619     // Update ringer mode but no need to update volume again.
1620     SetRingerModeInternal(ringerMode, true);
1621 }
1622 
SetAppSingleStreamVolume(int32_t appUid,int32_t volumeLevel,bool isUpdateUi)1623 int32_t AudioPolicyServer::SetAppSingleStreamVolume(int32_t appUid, int32_t volumeLevel, bool isUpdateUi)
1624 {
1625     int32_t ret = audioPolicyService_.SetAppVolumeLevel(appUid, volumeLevel);
1626     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Fail to set App Volume level");
1627 
1628     VolumeEvent volumeEvent;
1629     volumeEvent.volumeType = STREAM_APP;
1630     volumeEvent.volume = volumeLevel;
1631     volumeEvent.updateUi = isUpdateUi;
1632     volumeEvent.volumeGroupId = 0;
1633     volumeEvent.networkId = LOCAL_NETWORK_ID;
1634     volumeEvent.volumeMode = AUDIOSTREAM_VOLUMEMODE_APP_INDIVIDUAL;
1635     if (audioPolicyServerHandler_ != nullptr) {
1636         audioPolicyServerHandler_->SendAppVolumeChangeCallback(appUid, volumeEvent);
1637     }
1638     return ret;
1639 }
1640 
SetSingleStreamVolume(AudioStreamType streamType,int32_t volumeLevel,bool isUpdateUi,bool mute,int32_t zoneId)1641 int32_t AudioPolicyServer::SetSingleStreamVolume(AudioStreamType streamType, int32_t volumeLevel, bool isUpdateUi,
1642     bool mute, int32_t zoneId)
1643 {
1644     bool updateRingerMode = false;
1645     if ((streamType == AudioStreamType::STREAM_RING || streamType == AudioStreamType::STREAM_VOICE_RING) &&
1646         VolumeUtils::GetVolumeTypeFromStreamType(streamType) == AudioStreamType::STREAM_RING) {
1647         // Check whether the currentRingerMode is suitable for the ringtone volume level.
1648         AudioRingerMode currentRingerMode = audioPolicyManager_.GetRingerMode();
1649         if ((currentRingerMode == RINGER_MODE_NORMAL && volumeLevel == 0) ||
1650             (currentRingerMode != RINGER_MODE_NORMAL && volumeLevel > 0)) {
1651             // When isUpdateUi is false, the func is called by others. Need to verify permission.
1652             if (!isUpdateUi && !VerifyPermission(ACCESS_NOTIFICATION_POLICY_PERMISSION)) {
1653                 AUDIO_ERR_LOG("ACCESS_NOTIFICATION_POLICY_PERMISSION permission denied for ringtone volume!");
1654                 return ERR_PERMISSION_DENIED;
1655             }
1656             updateRingerMode = true;
1657         }
1658     }
1659 
1660     int32_t ret = audioVolumeManager_.SetSystemVolumeLevel(streamType, volumeLevel, zoneId);
1661     if (ret == SUCCESS) {
1662         std::string currentTime = GetTime();
1663         int32_t appUid = IPCSkeleton::GetCallingUid();
1664         AUDIO_INFO_LOG("SetSystemVolumeLevelInfo streamType: %{public}d, volumeLevel: %{public}d,"
1665             " appUid: %{public}d, setTime: %{public}s",
1666             streamType, volumeLevel, appUid, currentTime.c_str());
1667         audioVolumeManager_.SaveSystemVolumeLevelInfo(streamType, volumeLevel, appUid, currentTime);
1668         if (updateRingerMode) {
1669             ProcUpdateRingerMode();
1670         }
1671         UpdateMuteStateAccordingToVolLevel(streamType, volumeLevel, mute, isUpdateUi, zoneId);
1672     } else if (ret == ERR_SET_VOL_FAILED_BY_SAFE_VOL) {
1673         SendVolumeKeyEventCbWithUpdateUiOrNot(streamType, isUpdateUi, zoneId);
1674         AUDIO_ERR_LOG("fail to set system volume level by safe vol");
1675     } else {
1676         AUDIO_ERR_LOG("fail to set system volume level, ret is %{public}d", ret);
1677     }
1678 
1679     return ret;
1680 }
1681 
SetSingleStreamVolumeWithDevice(AudioStreamType streamType,int32_t volumeLevel,bool isUpdateUi,DeviceType deviceType)1682 int32_t AudioPolicyServer::SetSingleStreamVolumeWithDevice(AudioStreamType streamType, int32_t volumeLevel,
1683     bool isUpdateUi, DeviceType deviceType)
1684 {
1685     DeviceType curOutputDeviceType = audioActiveDevice_.GetCurrentOutputDeviceType();
1686     int32_t ret = SUCCESS;
1687     if (curOutputDeviceType != deviceType) {
1688         ret = audioVolumeManager_.SaveSpecifiedDeviceVolume(streamType, volumeLevel, deviceType);
1689     } else {
1690         bool mute = GetStreamMuteInternal(streamType);
1691         ret = SetSingleStreamVolume(streamType, volumeLevel, isUpdateUi, mute);
1692     }
1693     return ret;
1694 }
1695 
GetStreamMute(int32_t streamTypeIn,bool & mute)1696 int32_t AudioPolicyServer::GetStreamMute(int32_t streamTypeIn, bool &mute)
1697 {
1698     AudioStreamType streamType = static_cast<AudioStreamType>(streamTypeIn);
1699     if (streamType == AudioStreamType::STREAM_RING || streamType == AudioStreamType::STREAM_VOICE_RING) {
1700         bool ret = VerifyPermission(ACCESS_NOTIFICATION_POLICY_PERMISSION);
1701         CHECK_AND_RETURN_RET_LOG(ret, false,
1702             "GetStreamMute permission denied for stream type : %{public}d", streamType);
1703     }
1704     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
1705     int32_t zoneId = AudioZoneService::GetInstance().FindAudioZoneByUid(IPCSkeleton::GetCallingUid());
1706     mute = GetStreamMuteInternal(streamType, zoneId);
1707     return SUCCESS;
1708 }
1709 
GetStreamMuteInternal(AudioStreamType streamType,int32_t zoneId)1710 bool AudioPolicyServer::GetStreamMuteInternal(AudioStreamType streamType, int32_t zoneId)
1711 {
1712     if (streamType == STREAM_ALL) {
1713         streamType = STREAM_MUSIC;
1714     }
1715     bool isMuted = audioVolumeManager_.GetStreamMute(streamType, zoneId);
1716     AUDIO_DEBUG_LOG("GetMute streamType[%{public}d],mute[%{public}d]", streamType, isMuted);
1717     return isMuted;
1718 }
1719 
IsArmUsbDevice(const AudioDeviceDescriptor & desc)1720 bool AudioPolicyServer::IsArmUsbDevice(const AudioDeviceDescriptor &desc)
1721 {
1722     if (desc.deviceType_ == DEVICE_TYPE_USB_ARM_HEADSET) {
1723         return true;
1724     }
1725     if (desc.deviceType_ != DEVICE_TYPE_USB_HEADSET) {
1726         return false;
1727     }
1728     return eventEntry_->IsArmUsbDevice(desc);
1729 }
1730 
MapExternalToInternalDeviceType(AudioDeviceDescriptor & desc)1731 void AudioPolicyServer::MapExternalToInternalDeviceType(AudioDeviceDescriptor &desc)
1732 {
1733     if (desc.deviceType_ == DEVICE_TYPE_USB_HEADSET || desc.deviceType_ == DEVICE_TYPE_USB_DEVICE) {
1734         auto item = audioDeviceManager_.FindConnectedDeviceById(desc.deviceId_);
1735         if (item && IsUsb(item->deviceType_)) {
1736             desc.deviceType_ = item->deviceType_;
1737         }
1738     } else if (desc.deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP && desc.deviceRole_ == INPUT_DEVICE) {
1739         desc.deviceType_ = DEVICE_TYPE_BLUETOOTH_A2DP_IN;
1740     } else if (desc.deviceType_ == DEVICE_TYPE_NEARLINK && desc.deviceRole_ == INPUT_DEVICE) {
1741         desc.deviceType_ = DEVICE_TYPE_NEARLINK_IN;
1742     }
1743     if (desc.deviceType_ == DEVICE_TYPE_NEARLINK && desc.deviceRole_ == INPUT_DEVICE) {
1744         desc.deviceType_ = DEVICE_TYPE_NEARLINK_IN;
1745     }
1746 }
1747 
1748 // LCOV_EXCL_START
SelectOutputDevice(const sptr<AudioRendererFilter> & audioRendererFilter,const std::vector<std::shared_ptr<AudioDeviceDescriptor>> & audioDeviceDescriptors)1749 int32_t AudioPolicyServer::SelectOutputDevice(const sptr<AudioRendererFilter> &audioRendererFilter,
1750     const std::vector<std::shared_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors)
1751 {
1752     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED,
1753         "SelectOutputDevice: No system permission");
1754 
1755     std::vector<std::shared_ptr<AudioDeviceDescriptor>> targetOutputDevice;
1756     for (auto desc : audioDeviceDescriptors) {
1757         std::shared_ptr<AudioDeviceDescriptor> newDeviceDescriptor =
1758             std::const_pointer_cast<AudioDeviceDescriptor>(desc);
1759         CHECK_AND_RETURN_RET_LOG(newDeviceDescriptor != nullptr, ERR_MEMORY_ALLOC_FAILED, "memory alloc failed");
1760         MapExternalToInternalDeviceType(*newDeviceDescriptor);
1761         targetOutputDevice.push_back(newDeviceDescriptor);
1762     }
1763 
1764     return eventEntry_->SelectOutputDevice(audioRendererFilter, targetOutputDevice);
1765 }
1766 
GetSelectedDeviceInfo(int32_t uid,int32_t pid,int32_t streamTypeIn,std::string & info)1767 int32_t AudioPolicyServer::GetSelectedDeviceInfo(int32_t uid, int32_t pid, int32_t streamTypeIn,
1768     std::string &info)
1769 {
1770     AudioStreamType streamType = static_cast<AudioStreamType>(streamTypeIn);
1771     info = audioPolicyService_.GetSelectedDeviceInfo(uid, pid, streamType);
1772     return SUCCESS;
1773 }
1774 
SelectInputDevice(const sptr<AudioCapturerFilter> & audioCapturerFilter,const std::vector<std::shared_ptr<AudioDeviceDescriptor>> & audioDeviceDescriptors)1775 int32_t AudioPolicyServer::SelectInputDevice(const sptr<AudioCapturerFilter> &audioCapturerFilter,
1776     const std::vector<std::shared_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors)
1777 {
1778     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED,
1779         "SelectInputDevice: No system permission");
1780 
1781     std::vector<std::shared_ptr<AudioDeviceDescriptor>> targetInputDevice;
1782     for (auto desc : audioDeviceDescriptors) {
1783         std::shared_ptr<AudioDeviceDescriptor> newDeviceDescriptor =
1784             std::const_pointer_cast<AudioDeviceDescriptor>(desc);
1785         CHECK_AND_RETURN_RET_LOG(newDeviceDescriptor != nullptr, ERR_MEMORY_ALLOC_FAILED, "memory alloc failed");
1786         MapExternalToInternalDeviceType(*newDeviceDescriptor);
1787         targetInputDevice.push_back(newDeviceDescriptor);
1788     }
1789 
1790     int32_t ret = eventEntry_->SelectInputDevice(audioCapturerFilter, targetInputDevice);
1791     return ret;
1792 }
1793 
ExcludeOutputDevices(int32_t audioDevUsageIn,const vector<shared_ptr<AudioDeviceDescriptor>> & audioDeviceDescriptors)1794 int32_t AudioPolicyServer::ExcludeOutputDevices(int32_t audioDevUsageIn,
1795     const vector<shared_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors)
1796 {
1797     auto newAudioDeviceDescriptors = audioDeviceDescriptors;
1798     AudioDeviceUsage audioDevUsage = static_cast<AudioDeviceUsage>(audioDevUsageIn);
1799     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED,
1800         "No system permission");
1801     return eventEntry_->ExcludeOutputDevices(audioDevUsage, newAudioDeviceDescriptors);
1802 }
1803 
UnexcludeOutputDevices(int32_t audioDevUsageIn,const vector<shared_ptr<AudioDeviceDescriptor>> & audioDeviceDescriptors)1804 int32_t AudioPolicyServer::UnexcludeOutputDevices(int32_t audioDevUsageIn,
1805     const vector<shared_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors)
1806 {
1807     auto newAudioDeviceDescriptors = audioDeviceDescriptors;
1808     AudioDeviceUsage audioDevUsage = static_cast<AudioDeviceUsage>(audioDevUsageIn);
1809     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED,
1810         "No system permission");
1811 
1812     return audioDeviceLock_.UnexcludeOutputDevices(audioDevUsage, newAudioDeviceDescriptors);
1813 }
1814 
GetExcludedDevices(int32_t audioDevUsageIn,vector<shared_ptr<AudioDeviceDescriptor>> & device)1815 int32_t AudioPolicyServer::GetExcludedDevices(int32_t audioDevUsageIn,
1816     vector<shared_ptr<AudioDeviceDescriptor>> &device)
1817 {
1818     AudioDeviceUsage audioDevUsage = static_cast<AudioDeviceUsage>(audioDevUsageIn);
1819     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED,
1820         "No system permission");
1821 
1822     device = audioDeviceLock_.GetExcludedDevices(audioDevUsage);
1823 
1824     int32_t apiVersion = HasUsbDevice(device) ? GetApiTargetVersion() : 0;
1825     for (auto &desc : device) {
1826         CHECK_AND_RETURN_RET_LOG(desc, ERR_MEMORY_ALLOC_FAILED, "nullptr");
1827         auto clientInfo = std::make_shared<AudioDeviceDescriptor::ClientInfo>(apiVersion);
1828         desc->SetClientInfo(clientInfo);
1829     }
1830     return SUCCESS;
1831 }
1832 
GetDevices(int32_t deviceFlagIn,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & deviceDescs)1833 int32_t AudioPolicyServer::GetDevices(int32_t deviceFlagIn,
1834     std::vector<std::shared_ptr<AudioDeviceDescriptor>> &deviceDescs)
1835 {
1836     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
1837     DeviceFlag deviceFlag = static_cast<DeviceFlag>(deviceFlagIn);
1838     switch (deviceFlag) {
1839         case NONE_DEVICES_FLAG:
1840         case DISTRIBUTED_OUTPUT_DEVICES_FLAG:
1841         case DISTRIBUTED_INPUT_DEVICES_FLAG:
1842         case ALL_DISTRIBUTED_DEVICES_FLAG:
1843         case ALL_L_D_DEVICES_FLAG:
1844             if (!hasSystemPermission) {
1845                 AUDIO_ERR_LOG("GetDevices: No system permission");
1846                 deviceDescs.clear();
1847                 return ERR_PERMISSION_DENIED;
1848             }
1849             break;
1850         default:
1851             break;
1852     }
1853 
1854     deviceDescs = eventEntry_->GetDevices(deviceFlag);
1855 
1856     int32_t apiVersion = HasUsbDevice(deviceDescs) ? GetApiTargetVersion() : 0;
1857     for (auto &desc : deviceDescs) {
1858         CHECK_AND_RETURN_RET_LOG(desc, ERR_MEMORY_ALLOC_FAILED, "nullptr");
1859         if (desc->IsAudioDeviceDescriptor()) {
1860             desc->deviceType_ = desc->MapInternalToExternalDeviceType(apiVersion);
1861         }
1862         if (!hasSystemPermission) {
1863             desc->networkId_ = "";
1864             desc->interruptGroupId_ = GROUP_ID_NONE;
1865             desc->volumeGroupId_ = GROUP_ID_NONE;
1866         }
1867     }
1868 
1869     bool hasBTPermission = VerifyBluetoothPermission();
1870     if (!hasBTPermission) {
1871         audioPolicyService_.UpdateDescWhenNoBTPermission(deviceDescs);
1872     }
1873 
1874     return SUCCESS;
1875 }
1876 // LCOV_EXCL_STOP
1877 
GetDevicesInner(int32_t deviceFlagIn,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & deviceDescs)1878 int32_t AudioPolicyServer::GetDevicesInner(int32_t deviceFlagIn,
1879     std::vector<std::shared_ptr<AudioDeviceDescriptor>> &deviceDescs)
1880 {
1881     auto callerUid = IPCSkeleton::GetCallingUid();
1882     if (callerUid != UID_AUDIO) {
1883         return ERR_INVALID_OPERATION;
1884     }
1885     DeviceFlag deviceFlag = static_cast<DeviceFlag>(deviceFlagIn);
1886     deviceDescs = audioConnectedDevice_.GetDevicesInner(deviceFlag);
1887 
1888     return SUCCESS;
1889 }
1890 
1891 // LCOV_EXCL_START
GetOutputDevice(const sptr<AudioRendererFilter> & audioRendererFilter,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & deviceDescs)1892 int32_t AudioPolicyServer::GetOutputDevice(const sptr<AudioRendererFilter> &audioRendererFilter,
1893     std::vector<std::shared_ptr<AudioDeviceDescriptor>> &deviceDescs)
1894 {
1895     if (!PermissionUtil::VerifySystemPermission()) {
1896         AUDIO_ERR_LOG("only for system app");
1897         return ERR_INVALID_OPERATION;
1898     }
1899     deviceDescs = audioPolicyService_.GetOutputDevice(audioRendererFilter);
1900 
1901     int32_t apiVersion = HasUsbDevice(deviceDescs) ? GetApiTargetVersion() : 0;
1902     for (auto &desc : deviceDescs) {
1903         CHECK_AND_RETURN_RET_LOG(desc, ERR_MEMORY_ALLOC_FAILED, "nullptr");
1904         if (desc->IsAudioDeviceDescriptor()) {
1905             desc->deviceType_ = desc->MapInternalToExternalDeviceType(apiVersion);
1906         }
1907     }
1908 
1909     return SUCCESS;
1910 }
1911 
GetInputDevice(const sptr<AudioCapturerFilter> & audioCapturerFilter,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & deviceDescs)1912 int32_t AudioPolicyServer::GetInputDevice(const sptr<AudioCapturerFilter> &audioCapturerFilter,
1913     std::vector<std::shared_ptr<AudioDeviceDescriptor>> &deviceDescs)
1914 {
1915     if (!PermissionUtil::VerifySystemPermission()) {
1916         AUDIO_ERR_LOG("only for system app");
1917         return ERR_INVALID_OPERATION;
1918     }
1919     deviceDescs = audioPolicyService_.GetInputDevice(audioCapturerFilter);
1920 
1921     int32_t apiVersion = HasUsbDevice(deviceDescs) ? GetApiTargetVersion() : 0;
1922     for (auto &desc : deviceDescs) {
1923         CHECK_AND_RETURN_RET_LOG(desc, ERR_MEMORY_ALLOC_FAILED, "nullptr");
1924         if (desc->IsAudioDeviceDescriptor()) {
1925             desc->deviceType_ = desc->MapInternalToExternalDeviceType(apiVersion);
1926         }
1927     }
1928 
1929     return SUCCESS;
1930 }
1931 
VerifyVoiceCallPermission(uint64_t fullTokenId,Security::AccessToken::AccessTokenID tokenId)1932 int32_t AudioPolicyServer::VerifyVoiceCallPermission(
1933     uint64_t fullTokenId, Security::AccessToken::AccessTokenID tokenId)
1934 {
1935     bool hasSystemPermission = TokenIdKit::IsSystemAppByFullTokenID(fullTokenId);
1936     CHECK_AND_RETURN_RET_LOG(hasSystemPermission, ERR_PERMISSION_DENIED, "No system permission");
1937 
1938     bool hasRecordVoiceCallPermission = VerifyPermission(RECORD_VOICE_CALL_PERMISSION, tokenId, true);
1939     CHECK_AND_RETURN_RET_LOG(hasRecordVoiceCallPermission, ERR_PERMISSION_DENIED, "No permission");
1940     return SUCCESS;
1941 }
1942 // LCOV_EXCL_STOP
1943 
GetPreferredOutputDeviceDescriptors(const AudioRendererInfo & rendererInfo,bool forceNoBTPermission,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & deviceDescs)1944 int32_t AudioPolicyServer::GetPreferredOutputDeviceDescriptors(const AudioRendererInfo &rendererInfo,
1945     bool forceNoBTPermission, std::vector<std::shared_ptr<AudioDeviceDescriptor>> &deviceDescs)
1946 {
1947     AudioRendererInfo newRendererInfo = rendererInfo;
1948     deviceDescs = audioDeviceLock_.GetPreferredOutputDeviceDescriptors(newRendererInfo, LOCAL_NETWORK_ID);
1949 
1950     bool hasBTPermission = false;
1951     if (!forceNoBTPermission) {
1952         hasBTPermission = VerifyBluetoothPermission();
1953     }
1954 
1955     if (!hasBTPermission) {
1956         audioPolicyService_.UpdateDescWhenNoBTPermission(deviceDescs);
1957     }
1958 
1959     int32_t apiVersion = HasUsbDevice(deviceDescs) ? GetApiTargetVersion() : 0;
1960     for (auto &desc : deviceDescs) {
1961         CHECK_AND_RETURN_RET_LOG(desc, ERR_MEMORY_ALLOC_FAILED, "nullptr");
1962         desc->descriptorType_ = AudioDeviceDescriptor::AUDIO_DEVICE_DESCRIPTOR;
1963         if (desc->IsAudioDeviceDescriptor()) {
1964             desc->deviceType_ = desc->MapInternalToExternalDeviceType(apiVersion);
1965         }
1966     }
1967 
1968     return SUCCESS;
1969 }
1970 
GetPreferredInputDeviceDescriptors(const AudioCapturerInfo & captureInfoIn,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & deviceDescs)1971 int32_t AudioPolicyServer::GetPreferredInputDeviceDescriptors(const AudioCapturerInfo &captureInfoIn,
1972     std::vector<std::shared_ptr<AudioDeviceDescriptor>> &deviceDescs)
1973 {
1974     AudioCapturerInfo captureInfo = captureInfoIn;
1975     deviceDescs = eventEntry_->GetPreferredInputDeviceDescriptors(captureInfo);
1976     bool hasBTPermission = VerifyBluetoothPermission();
1977     if (!hasBTPermission) {
1978         audioPolicyService_.UpdateDescWhenNoBTPermission(deviceDescs);
1979     }
1980 
1981     return SUCCESS;
1982 }
1983 
SetClientCallbacksEnable(int32_t callbackchangeIn,bool enable)1984 int32_t AudioPolicyServer::SetClientCallbacksEnable(int32_t callbackchangeIn, bool enable)
1985 {
1986     CallbackChange callbackchange = static_cast<CallbackChange>(callbackchangeIn);
1987     if (audioPolicyServerHandler_ != nullptr) {
1988         return audioPolicyServerHandler_->SetClientCallbacksEnable(callbackchange, enable);
1989     } else {
1990         AUDIO_ERR_LOG("audioPolicyServerHandler_ is nullptr");
1991         return AUDIO_ERR;
1992     }
1993 }
1994 
SetCallbackRendererInfo(const AudioRendererInfo & rendererInfo)1995 int32_t AudioPolicyServer::SetCallbackRendererInfo(const AudioRendererInfo &rendererInfo)
1996 {
1997     if (audioPolicyServerHandler_ != nullptr) {
1998         audioPolicyServerHandler_->SetCallbackRendererInfo(rendererInfo);
1999     }
2000     return SUCCESS;
2001 }
2002 
SetCallbackCapturerInfo(const AudioCapturerInfo & capturerInfo)2003 int32_t AudioPolicyServer::SetCallbackCapturerInfo(const AudioCapturerInfo &capturerInfo)
2004 {
2005     if (audioPolicyServerHandler_ != nullptr) {
2006         audioPolicyServerHandler_->SetCallbackCapturerInfo(capturerInfo);
2007     }
2008     return SUCCESS;
2009 }
2010 
IsStreamActive(int32_t streamType,bool & active)2011 int32_t AudioPolicyServer::IsStreamActive(int32_t streamType, bool &active)
2012 {
2013     active = audioSceneManager_.IsStreamActive(static_cast<AudioStreamType>(streamType));
2014     return SUCCESS;
2015 }
2016 
IsStreamActiveByStreamUsage(int32_t streamUsage,bool & active)2017 int32_t AudioPolicyServer::IsStreamActiveByStreamUsage(int32_t streamUsage, bool &active)
2018 {
2019     int32_t volumeType = static_cast<int32_t>(VolumeUtils::GetVolumeTypeFromStreamUsage(
2020         static_cast<StreamUsage>(streamUsage)));
2021     return IsStreamActive(volumeType, active);
2022 }
2023 
IsFastPlaybackSupported(const AudioStreamInfo & streamInfo,int32_t usage,bool & support)2024 int32_t AudioPolicyServer::IsFastPlaybackSupported(const AudioStreamInfo &streamInfo, int32_t usage, bool &support)
2025 {
2026     AudioRendererInfo rendererInfo = {};
2027     rendererInfo.streamUsage = static_cast<StreamUsage>(usage);
2028     std::vector<std::shared_ptr<AudioDeviceDescriptor>> desc{};
2029     GetPreferredOutputDeviceDescriptors(rendererInfo, false, desc);
2030     AudioStreamInfo newStreamInfo = streamInfo;
2031     support = audioConfigManager_.IsFastStreamSupported(newStreamInfo, desc);
2032     return SUCCESS;
2033 }
2034 
IsFastRecordingSupported(const AudioStreamInfo & streamInfo,int32_t source,bool & support)2035 int32_t AudioPolicyServer::IsFastRecordingSupported(const AudioStreamInfo &streamInfo, int32_t source, bool &support)
2036 {
2037     AudioCapturerInfo capturerInfo = {};
2038     capturerInfo.sourceType = static_cast<SourceType>(source);
2039     std::vector<std::shared_ptr<AudioDeviceDescriptor>> desc{};
2040     GetPreferredInputDeviceDescriptors(capturerInfo, desc);
2041     AudioStreamInfo newStreamInfo = streamInfo;
2042     support = audioConfigManager_.IsFastStreamSupported(newStreamInfo, desc);
2043     return SUCCESS;
2044 }
2045 
SetDeviceActive(int32_t deviceType,bool active,int32_t uid)2046 int32_t AudioPolicyServer::SetDeviceActive(int32_t deviceType, bool active, int32_t uid)
2047 {
2048     return eventEntry_->SetDeviceActive(static_cast<InternalDeviceType>(deviceType), active, uid);
2049 }
2050 
2051 // LCOV_EXCL_START
SetInputDevice(int32_t deviceType,uint32_t sessionID,int32_t sourceType,bool isRunning)2052 int32_t AudioPolicyServer::SetInputDevice(int32_t deviceType, uint32_t sessionID, int32_t sourceType, bool isRunning)
2053 {
2054     if (!PermissionUtil::VerifySystemPermission()) {
2055         AUDIO_ERR_LOG("SetInputDevice: No system permission");
2056         return ERR_PERMISSION_DENIED;
2057     }
2058     return eventEntry_->SetInputDevice(static_cast<DeviceType>(deviceType), sessionID,
2059         static_cast<SourceType>(sourceType), isRunning);
2060 }
2061 // LCOV_EXCL_STOP
2062 
IsDeviceActive(int32_t deviceType,bool & active)2063 int32_t AudioPolicyServer::IsDeviceActive(int32_t deviceType, bool &active)
2064 {
2065     active = audioActiveDevice_.IsDeviceActive(static_cast<InternalDeviceType>(deviceType));
2066     return SUCCESS;
2067 }
2068 
GetActiveOutputDevice(int32_t & deviceType)2069 int32_t AudioPolicyServer::GetActiveOutputDevice(int32_t &deviceType)
2070 {
2071     deviceType = audioActiveDevice_.GetCurrentOutputDeviceType();
2072     return SUCCESS;
2073 }
2074 
GetDmDeviceType(uint16_t & deviceType)2075 int32_t AudioPolicyServer::GetDmDeviceType(uint16_t &deviceType)
2076 {
2077     auto callerUid = IPCSkeleton::GetCallingUid();
2078     if (callerUid != UID_AUDIO) {
2079         AUDIO_ERR_LOG("No permission");
2080         return ERROR;
2081     }
2082     deviceType = audioDeviceStatus_.GetDmDeviceType();
2083     return SUCCESS;
2084 }
2085 
GetActiveInputDevice(int32_t & deviceType)2086 int32_t AudioPolicyServer::GetActiveInputDevice(int32_t &deviceType)
2087 {
2088     deviceType = static_cast<int32_t>(audioActiveDevice_.GetCurrentInputDeviceType());
2089     return SUCCESS;
2090 }
2091 
2092 // deprecated since api 9.
SetRingerModeLegacy(int32_t ringMode)2093 int32_t AudioPolicyServer::SetRingerModeLegacy(int32_t ringMode)
2094 {
2095     pid_t pid = IPCSkeleton::GetCallingPid();
2096     AudioRingerMode ringModeIn = static_cast<AudioRingerMode>(ringMode);
2097     AUDIO_INFO_LOG("Set ringer mode to %{public}d, pid : %{public}d", ringModeIn, pid);
2098     if (!IsRingerModeValid(ringModeIn)) {
2099         AUDIO_ERR_LOG("The ringerMode is an invalid parameter.");
2100         return ERR_INVALID_PARAM;
2101     }
2102     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
2103     return SetRingerModeInner(static_cast<AudioRingerMode>(ringMode));
2104 }
2105 
2106 // LCOV_EXCL_START
SetRingerMode(int32_t ringModeIn)2107 int32_t AudioPolicyServer::SetRingerMode(int32_t ringModeIn)
2108 {
2109     pid_t pid = IPCSkeleton::GetCallingPid();
2110     AudioRingerMode ringMode = static_cast<AudioRingerMode>(ringModeIn);
2111     AUDIO_INFO_LOG("Set ringer mode to %{public}d, pid : %{public}d", ringMode, pid);
2112     if (!IsRingerModeValid(ringMode)) {
2113         AUDIO_ERR_LOG("The ringerMode is an invalid parameter.");
2114         return ERR_INVALID_PARAM;
2115     }
2116     if (!PermissionUtil::VerifySystemPermission()) {
2117         AUDIO_ERR_LOG("No system permission");
2118         return ERR_PERMISSION_DENIED;
2119     }
2120 
2121     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
2122     int32_t result = SetRingerModeInner(ringMode);
2123     if (result == SUCCESS) {
2124         std::string currentTime = GetTime();
2125         std::string callerName = AudioBundleManager::GetBundleName();
2126         if (callerName == "") {
2127             callerName = CALLER_NAME;
2128         }
2129         AUDIO_INFO_LOG("SetRingerModeInfo ringerMode: %{public}d, bundleName: %{public}s, setTime: %{public}s",
2130             ringMode, callerName.c_str(), currentTime.c_str());
2131         audioPolicyManager_.SaveRingerModeInfo(ringMode, callerName, currentTime);
2132     }
2133     return result;
2134 }
2135 // LCOV_EXCL_STOP
2136 
SetRingerModeInner(AudioRingerMode ringMode)2137 int32_t AudioPolicyServer::SetRingerModeInner(AudioRingerMode ringMode)
2138 {
2139     bool isPermissionRequired = false;
2140 
2141     if (ringMode == AudioRingerMode::RINGER_MODE_SILENT) {
2142         isPermissionRequired = true;
2143     } else {
2144         AudioRingerMode currentRingerMode = audioPolicyManager_.GetRingerMode();
2145         if (currentRingerMode == AudioRingerMode::RINGER_MODE_SILENT) {
2146             isPermissionRequired = true;
2147         }
2148     }
2149 
2150     // only switch to silent need check NOTIFICATION.
2151     if (isPermissionRequired) {
2152         bool result = VerifyPermission(ACCESS_NOTIFICATION_POLICY_PERMISSION);
2153         CHECK_AND_RETURN_RET_LOG(result, ERR_PERMISSION_DENIED,
2154             "Access policy permission denied for ringerMode : %{public}d", ringMode);
2155     }
2156 
2157     return SetRingerModeInternal(ringMode);
2158 }
2159 
SetRingerModeInternal(AudioRingerMode inputRingerMode,bool hasUpdatedVolume)2160 int32_t AudioPolicyServer::SetRingerModeInternal(AudioRingerMode inputRingerMode, bool hasUpdatedVolume)
2161 {
2162     // PC ringmode not support silent or vibrate
2163     AudioRingerMode ringerMode = VolumeUtils::IsPCVolumeEnable() ? RINGER_MODE_NORMAL : inputRingerMode;
2164     AUDIO_INFO_LOG("Set ringer mode to %{public}d. hasUpdatedVolume %{public}d", ringerMode, hasUpdatedVolume);
2165     int32_t ret = coreService_->SetRingerMode(ringerMode);
2166     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "Fail to set ringer mode!");
2167 
2168     if (!hasUpdatedVolume) {
2169         // need to set volume according to ringermode
2170         bool muteState = (ringerMode == RINGER_MODE_NORMAL) ? false : true;
2171         AudioInterrupt audioInterrupt;
2172         int32_t zoneID = 0;
2173         GetSessionInfoInFocus(audioInterrupt, zoneID);
2174         audioVolumeManager_.SetStreamMute(STREAM_RING, muteState, audioInterrupt.streamUsage);
2175         if (!muteState && GetSystemVolumeLevelInternal(STREAM_RING) == 0) {
2176             // if mute state is false but volume is 0, set volume to 1. Send volumeChange callback.
2177             SetSystemVolumeLevelInternal(STREAM_RING, 1, false);
2178         }
2179     }
2180 
2181     if (audioPolicyServerHandler_ != nullptr) {
2182         audioPolicyServerHandler_->SendRingerModeUpdatedCallback(ringerMode);
2183     }
2184     return ret;
2185 }
2186 
2187 #ifdef FEATURE_DTMF_TONE
GetToneConfig(int32_t ltonetype,const std::string & countryCode,std::shared_ptr<ToneInfo> & config)2188 int32_t AudioPolicyServer::GetToneConfig(int32_t ltonetype, const std::string &countryCode,
2189     std::shared_ptr<ToneInfo> &config)
2190 {
2191     config = audioToneManager_.GetToneConfig(ltonetype, countryCode);
2192     return SUCCESS;
2193 }
2194 
GetSupportedTones(const std::string & countryCode,std::vector<int32_t> & tones)2195 int32_t AudioPolicyServer::GetSupportedTones(const std::string &countryCode, std::vector<int32_t> &tones)
2196 {
2197     tones = audioToneManager_.GetSupportedTones(countryCode);
2198     return SUCCESS;
2199 }
2200 #endif
2201 
InitMicrophoneMute()2202 void AudioPolicyServer::InitMicrophoneMute()
2203 {
2204     AUDIO_INFO_LOG("Entered %{public}s", __func__);
2205     if (isInitMuteState_) {
2206         AUDIO_ERR_LOG("mic mutestate has already been initialized");
2207         return;
2208     }
2209     bool isMute = false;
2210     int32_t ret = audioMicrophoneDescriptor_.InitPersistentMicrophoneMuteState(isMute);
2211     AUDIO_INFO_LOG("Get persistent mic ismute: %{public}d  state from setting db", isMute);
2212     if (ret != SUCCESS) {
2213         AUDIO_ERR_LOG("InitMicrophoneMute InitPersistentMicrophoneMuteState result %{public}d", ret);
2214         return;
2215     }
2216     isInitMuteState_ = true;
2217     if (audioPolicyServerHandler_ != nullptr) {
2218         MicStateChangeEvent micStateChangeEvent;
2219         micStateChangeEvent.mute = isMute;
2220         audioPolicyServerHandler_->SendMicStateUpdatedCallback(micStateChangeEvent);
2221     }
2222 }
2223 
SetMicrophoneMuteCommon(bool isMute,bool isLegacy)2224 int32_t AudioPolicyServer::SetMicrophoneMuteCommon(bool isMute, bool isLegacy)
2225 {
2226     std::lock_guard<std::mutex> lock(micStateChangeMutex_);
2227     bool originalMicrophoneMute = false;
2228     IsMicrophoneMute(originalMicrophoneMute);
2229     int32_t ret = audioMicrophoneDescriptor_.SetMicrophoneMute(isMute);
2230     bool newMicrophoneMute = false;
2231     IsMicrophoneMute(newMicrophoneMute);
2232     if (ret == SUCCESS && originalMicrophoneMute != newMicrophoneMute && audioPolicyServerHandler_ != nullptr) {
2233         MicStateChangeEvent micStateChangeEvent;
2234         micStateChangeEvent.mute = newMicrophoneMute;
2235         AUDIO_INFO_LOG("SendMicStateUpdatedCallback when set common mic mute state:%{public}d, isLegacy:%{public}d",
2236             newMicrophoneMute, isLegacy);
2237         audioPolicyServerHandler_->SendMicStateUpdatedCallback(micStateChangeEvent);
2238     }
2239     return ret;
2240 }
2241 
SetMicrophoneMute(bool isMute)2242 int32_t AudioPolicyServer::SetMicrophoneMute(bool isMute)
2243 {
2244     AUDIO_INFO_LOG("[%{public}d] set to %{public}s", IPCSkeleton::GetCallingPid(), (isMute ? "true" : "false"));
2245     bool ret = VerifyPermission(MICROPHONE_PERMISSION);
2246     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED,
2247         "MICROPHONE permission denied");
2248     return SetMicrophoneMuteCommon(isMute, true);
2249 }
2250 
SetMicrophoneMuteAudioConfig(bool isMute)2251 int32_t AudioPolicyServer::SetMicrophoneMuteAudioConfig(bool isMute)
2252 {
2253     AUDIO_INFO_LOG("[%{public}d] set to %{public}s", IPCSkeleton::GetCallingPid(), (isMute ? "true" : "false"));
2254     const char* MANAGE_AUDIO_CONFIG = "ohos.permission.MANAGE_AUDIO_CONFIG";
2255     bool ret = VerifyPermission(MANAGE_AUDIO_CONFIG);
2256     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED,
2257         "MANAGE_AUDIO_CONFIG permission denied");
2258     lastMicMuteSettingPid_ = IPCSkeleton::GetCallingPid();
2259     WatchTimeout guard("PrivacyKit::SetMutePolicy:SetMicrophoneMuteAudioConfig");
2260     PrivacyKit::SetMutePolicy(POLICY_TYPE_MAP[TEMPORARY_POLCIY_TYPE], MICPHONE_CALLER, isMute,
2261         IPCSkeleton::GetCallingTokenID());
2262     guard.CheckCurrTimeout();
2263     return SetMicrophoneMuteCommon(isMute, false);
2264 }
2265 
SetMicrophoneMutePersistent(bool isMute,int32_t typeIn)2266 int32_t AudioPolicyServer::SetMicrophoneMutePersistent(bool isMute, int32_t typeIn)
2267 {
2268     PolicyType type = static_cast<PolicyType>(typeIn);
2269     AUDIO_INFO_LOG("Entered %{public}s isMute:%{public}d, type:%{public}d", __func__, isMute, type);
2270     bool hasPermission = VerifyPermission(MICROPHONE_CONTROL_PERMISSION);
2271     CHECK_AND_RETURN_RET_LOG(hasPermission, ERR_PERMISSION_DENIED,
2272         "MICROPHONE_CONTROL_PERMISSION permission denied");
2273     WatchTimeout guard("PrivacyKit::SetMutePolicy:SetMicrophoneMutePersistent");
2274     bool originalMicrophoneMute = false;
2275     IsMicrophoneMute(originalMicrophoneMute);
2276     int32_t ret = PrivacyKit::SetMutePolicy(POLICY_TYPE_MAP[type], MICPHONE_CALLER, isMute,
2277         IPCSkeleton::GetCallingTokenID());
2278     guard.CheckCurrTimeout();
2279     if (ret != SUCCESS) {
2280         AUDIO_ERR_LOG("PrivacyKit SetMutePolicy failed ret is %{public}d", ret);
2281         return ret;
2282     }
2283     ret = audioMicrophoneDescriptor_.SetMicrophoneMutePersistent(isMute);
2284     bool newMicrophoneMute = false;
2285     IsMicrophoneMute(newMicrophoneMute);
2286     if (ret == SUCCESS && originalMicrophoneMute != newMicrophoneMute && audioPolicyServerHandler_ != nullptr) {
2287         MicStateChangeEvent micStateChangeEvent;
2288         micStateChangeEvent.mute = newMicrophoneMute;
2289         AUDIO_INFO_LOG("SendMicStateUpdatedCallback when set persistent mic mute state:%{public}d", newMicrophoneMute);
2290         audioPolicyServerHandler_->SendMicStateUpdatedCallback(micStateChangeEvent);
2291     }
2292     return ret;
2293 }
2294 
GetPersistentMicMuteState(bool & mute)2295 int32_t AudioPolicyServer::GetPersistentMicMuteState(bool &mute)
2296 {
2297     bool hasPermission = VerifyPermission(MICROPHONE_CONTROL_PERMISSION);
2298     CHECK_AND_RETURN_RET_LOG(hasPermission, ERR_PERMISSION_DENIED,
2299         "MICROPHONE_CONTROL_PERMISSION permission denied");
2300 
2301     mute = audioMicrophoneDescriptor_.GetPersistentMicMuteState();
2302     return SUCCESS;
2303 }
2304 
2305 // deprecated since 9.
IsMicrophoneMuteLegacy(bool & mute)2306 int32_t AudioPolicyServer::IsMicrophoneMuteLegacy(bool &mute)
2307 {
2308     // AudioManager.IsMicrophoneMute check micphone right.
2309     if (!VerifyPermission(MICROPHONE_PERMISSION)) {
2310         AUDIO_ERR_LOG("MICROPHONE permission denied");
2311         mute = false;
2312         return ERR_PERMISSION_DENIED;
2313     }
2314     return IsMicrophoneMute(mute);
2315 }
2316 
IsMicrophoneMute(bool & mute)2317 int32_t AudioPolicyServer::IsMicrophoneMute(bool &mute)
2318 {
2319     // AudioVolumeGroupManager.IsMicrophoneMute didn't check micphone right.
2320     mute = audioMicrophoneDescriptor_.IsMicrophoneMute();
2321     return SUCCESS;
2322 }
2323 
GetRingerMode(int32_t & ringerMode)2324 int32_t AudioPolicyServer::GetRingerMode(int32_t &ringerMode)
2325 {
2326     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
2327     ringerMode = static_cast<int32_t>(audioPolicyManager_.GetRingerMode());
2328     return SUCCESS;
2329 }
2330 
2331 // LCOV_EXCL_START
SetAudioScene(int32_t audioSceneIn)2332 int32_t AudioPolicyServer::SetAudioScene(int32_t audioSceneIn)
2333 {
2334     AudioScene audioScene = static_cast<AudioScene>(audioSceneIn);
2335     CHECK_AND_RETURN_RET_LOG(audioScene > AUDIO_SCENE_INVALID && audioScene < AUDIO_SCENE_MAX,
2336         ERR_INVALID_PARAM, "param is invalid");
2337     bool ret = PermissionUtil::VerifySystemPermission();
2338     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
2339     switch (audioScene) {
2340         case AUDIO_SCENE_DEFAULT:
2341         case AUDIO_SCENE_RINGING:
2342         case AUDIO_SCENE_PHONE_CALL:
2343         case AUDIO_SCENE_PHONE_CHAT:
2344             return eventEntry_->SetAudioScene(audioScene);
2345 
2346         default:
2347             AUDIO_ERR_LOG("param is invalid: %{public}d", audioScene);
2348             return ERR_INVALID_PARAM;
2349     }
2350 }
2351 // LCOV_EXCL_STOP
2352 
SetAudioSceneInternal(AudioScene audioScene,const int32_t uid,const int32_t pid)2353 int32_t AudioPolicyServer::SetAudioSceneInternal(AudioScene audioScene, const int32_t uid, const int32_t pid)
2354 {
2355     return eventEntry_->SetAudioScene(audioScene, uid, pid);
2356 }
2357 
GetAudioScene(int32_t & scene)2358 int32_t AudioPolicyServer::GetAudioScene(int32_t &scene)
2359 {
2360     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
2361     scene = static_cast<int32_t>(audioSceneManager_.GetAudioScene(hasSystemPermission));
2362     return SUCCESS;
2363 }
2364 
SetAudioInterruptCallback(uint32_t sessionID,const sptr<IRemoteObject> & object,uint32_t clientUid,int32_t zoneID)2365 int32_t AudioPolicyServer::SetAudioInterruptCallback(uint32_t sessionID, const sptr<IRemoteObject> &object,
2366     uint32_t clientUid, int32_t zoneID)
2367 {
2368     if (interruptService_ == nullptr) {
2369         AUDIO_ERR_LOG("The interruptService_ is nullptr!");
2370         return ERR_UNKNOWN;
2371     }
2372     if (coreService_ == nullptr) {
2373         AUDIO_ERR_LOG("The coreService_ is nullptr!");
2374         return ERR_UNKNOWN;
2375     }
2376 
2377     uid_t callingUid = static_cast<uid_t>(IPCSkeleton::GetCallingUid());
2378     AUDIO_INFO_LOG("The sessionId %{public}u, callingUid %{public}u, clientUid %{public}u",
2379         sessionID, callingUid, clientUid);
2380     if (CALLBACK_TRUST_LIST.count(callingUid) == 0) {
2381         // Verify whether the clientUid is valid.
2382         if (callingUid != clientUid) {
2383             AUDIO_ERR_LOG("The callingUid is not equal to clientUid and is not MEDIA_SERVICE_UID!");
2384             return ERR_UNKNOWN;
2385         }
2386         if (!coreService_->IsStreamBelongToUid(callingUid, sessionID)) {
2387             AUDIO_ERR_LOG("The sessionId %{public}u does not belong to uid %{public}u!", sessionID, callingUid);
2388             return ERR_UNKNOWN;
2389         }
2390     }
2391 
2392     return interruptService_->SetAudioInterruptCallback(zoneID, sessionID, object, clientUid);
2393 }
2394 
UnsetAudioInterruptCallback(uint32_t sessionID,int32_t zoneID)2395 int32_t AudioPolicyServer::UnsetAudioInterruptCallback(uint32_t sessionID, int32_t zoneID)
2396 {
2397     if (interruptService_ != nullptr) {
2398         return interruptService_->UnsetAudioInterruptCallback(zoneID, sessionID);
2399     }
2400     return ERR_UNKNOWN;
2401 }
2402 
VerifySessionId(uint32_t sessionId,uint32_t clientUid)2403 bool AudioPolicyServer::VerifySessionId(uint32_t sessionId, uint32_t clientUid)
2404 {
2405     uid_t callingUid = static_cast<uid_t>(IPCSkeleton::GetCallingUid());
2406     AUDIO_INFO_LOG("The sessionId %{public}u, callingUid %{public}u, clientUid %{public}u",
2407         sessionId, callingUid, clientUid);
2408     CHECK_AND_RETURN_RET(CALLBACK_TRUST_LIST.count(callingUid) == 0, true);
2409 
2410     CHECK_AND_RETURN_RET_LOG(callingUid == clientUid, false,
2411         "The callingUid is not equal to clientUid and is not MEDIA_SERVICE_UID!");
2412     CHECK_AND_RETURN_RET_LOG(coreService_ != nullptr, false, "coreService_ is nullptr");
2413     CHECK_AND_RETURN_RET_LOG(coreService_->IsStreamBelongToUid(callingUid, sessionId), false,
2414         "The sessionId %{public}u does not belong to uid %{public}u!", false, callingUid);
2415     return true;
2416 }
2417 
SetAudioRouteCallback(uint32_t sessionId,const sptr<IRemoteObject> & object,uint32_t clientUid)2418 int32_t AudioPolicyServer::SetAudioRouteCallback(uint32_t sessionId, const sptr<IRemoteObject> &object,
2419     uint32_t clientUid)
2420 {
2421     CHECK_AND_RETURN_RET_LOG(coreService_ != nullptr, ERR_UNKNOWN, "coreService_ is nullptr");
2422     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_UNKNOWN, "object is nullptr");
2423     CHECK_AND_RETURN_RET_LOG(VerifySessionId(sessionId, clientUid), ERR_UNKNOWN, "invalid sessionId %{public}u",
2424         sessionId);
2425     coreService_->SetAudioRouteCallback(sessionId, object);
2426     return SUCCESS;
2427 }
2428 
UnsetAudioRouteCallback(uint32_t sessionId)2429 int32_t AudioPolicyServer::UnsetAudioRouteCallback(uint32_t sessionId)
2430 {
2431     CHECK_AND_RETURN_RET_LOG(coreService_ != nullptr, ERR_UNKNOWN, "coreService_ is nullptr");
2432     coreService_->UnsetAudioRouteCallback(sessionId);
2433     return SUCCESS;
2434 }
2435 
SetAudioManagerInterruptCallback(int32_t,const sptr<IRemoteObject> & object)2436 int32_t AudioPolicyServer::SetAudioManagerInterruptCallback(int32_t /* clientId */,
2437                                                             const sptr<IRemoteObject> &object)
2438 {
2439     if (interruptService_ != nullptr) {
2440         return interruptService_->SetAudioManagerInterruptCallback(object);
2441     }
2442     return ERR_UNKNOWN;
2443 }
2444 
UnsetAudioManagerInterruptCallback(int32_t)2445 int32_t AudioPolicyServer::UnsetAudioManagerInterruptCallback(int32_t /* clientId */)
2446 {
2447     if (interruptService_ != nullptr) {
2448         return interruptService_->UnsetAudioManagerInterruptCallback();
2449     }
2450     return ERR_UNKNOWN;
2451 }
2452 
2453 // LCOV_EXCL_START
SetQueryClientTypeCallback(const sptr<IRemoteObject> & object)2454 int32_t AudioPolicyServer::SetQueryClientTypeCallback(const sptr<IRemoteObject> &object)
2455 {
2456     if (!PermissionUtil::VerifyIsAudio()) {
2457         AUDIO_ERR_LOG("not audio calling!");
2458         return ERR_OPERATION_FAILED;
2459     }
2460     return audioPolicyService_.SetQueryClientTypeCallback(object);
2461 }
2462 
SetQueryDeviceVolumeBehaviorCallback(const sptr<IRemoteObject> & object)2463 int32_t AudioPolicyServer::SetQueryDeviceVolumeBehaviorCallback(const sptr<IRemoteObject> &object)
2464 {
2465     if (object == nullptr) {
2466         AUDIO_ERR_LOG("callback is nullptr!");
2467         return ERR_INVALID_PARAM;
2468     }
2469     if (!PermissionUtil::VerifyIsAudio()) {
2470         AUDIO_ERR_LOG("not audio calling!");
2471         return ERR_OPERATION_FAILED;
2472     }
2473     AUDIO_INFO_LOG("in!");
2474     return audioPolicyService_.SetQueryDeviceVolumeBehaviorCallback(object);
2475 }
2476 
SetAudioClientInfoMgrCallback(const sptr<IRemoteObject> & object)2477 int32_t AudioPolicyServer::SetAudioClientInfoMgrCallback(const sptr<IRemoteObject> &object)
2478 {
2479     if (!PermissionUtil::VerifyIsAudio()) {
2480         AUDIO_ERR_LOG("not audio calling!");
2481         return ERR_OPERATION_FAILED;
2482     }
2483 
2484     sptr<IStandardAudioPolicyManagerListener> callback = iface_cast<IStandardAudioPolicyManagerListener>(object);
2485 
2486     if (callback != nullptr) {
2487         return audioStateManager_.SetAudioClientInfoMgrCallback(callback);
2488     } else {
2489         AUDIO_ERR_LOG("Client info manager callback is null");
2490     }
2491     return SUCCESS;
2492 }
2493 
SetQueryBundleNameListCallback(const sptr<IRemoteObject> & object)2494 int32_t AudioPolicyServer::SetQueryBundleNameListCallback(const sptr<IRemoteObject> &object)
2495 {
2496     if (!PermissionUtil::VerifyIsAudio()) {
2497         AUDIO_ERR_LOG("not audio calling!");
2498         return ERR_OPERATION_FAILED;
2499     }
2500 
2501     if (interruptService_ != nullptr) {
2502         return interruptService_->SetQueryBundleNameListCallback(object);
2503     }
2504     return ERR_UNKNOWN;
2505 }
2506 // LCOV_EXCL_STOP
2507 
SetAudioVKBInfoMgrCallback(const sptr<IRemoteObject> & object)2508 int32_t AudioPolicyServer::SetAudioVKBInfoMgrCallback(const sptr<IRemoteObject> &object)
2509 {
2510     if (!PermissionUtil::VerifyIsAudio()) {
2511         AUDIO_ERR_LOG("not audio calling!");
2512         return ERR_OPERATION_FAILED;
2513     }
2514 
2515     sptr<IStandardAudioPolicyManagerListener> callback = iface_cast<IStandardAudioPolicyManagerListener>(object);
2516 
2517     if (callback != nullptr) {
2518         return audioStateManager_.SetAudioVKBInfoMgrCallback(callback);
2519     } else {
2520         AUDIO_ERR_LOG("VKB info manager callback is null");
2521     }
2522     return SUCCESS;
2523 }
2524 
CheckVKBInfo(const std::string & bundleName,bool & isValid)2525 int32_t AudioPolicyServer::CheckVKBInfo(const std::string &bundleName, bool &isValid)
2526 {
2527     if (!PermissionUtil::VerifySystemPermission()) {
2528         AUDIO_ERR_LOG("No system permission");
2529         return ERR_PERMISSION_DENIED;
2530     }
2531     return audioStateManager_.CheckVKBInfo(bundleName, isValid);
2532 }
2533 
RequestAudioFocus(int32_t clientId,const AudioInterrupt & audioInterrupt)2534 int32_t AudioPolicyServer::RequestAudioFocus(int32_t clientId, const AudioInterrupt &audioInterrupt)
2535 {
2536     if (interruptService_ != nullptr) {
2537         return interruptService_->RequestAudioFocus(clientId, audioInterrupt);
2538     }
2539     return ERR_UNKNOWN;
2540 }
2541 
AbandonAudioFocus(int32_t clientId,const AudioInterrupt & audioInterrupt)2542 int32_t AudioPolicyServer::AbandonAudioFocus(int32_t clientId, const AudioInterrupt &audioInterrupt)
2543 {
2544     if (interruptService_ != nullptr) {
2545         return interruptService_->AbandonAudioFocus(clientId, audioInterrupt);
2546     }
2547     return ERR_UNKNOWN;
2548 }
2549 
ProcessRemoteInterrupt(std::set<int32_t> sessionIds,InterruptEventInternal interruptEvent)2550 void AudioPolicyServer::ProcessRemoteInterrupt(std::set<int32_t> sessionIds, InterruptEventInternal interruptEvent)
2551 {
2552     if (interruptService_ != nullptr) {
2553         interruptService_->ProcessRemoteInterrupt(sessionIds, interruptEvent);
2554     }
2555 }
2556 
GetStreamIdsForAudioSessionByStreamUsage(const int32_t zoneId,const std::set<StreamUsage> & streamUsageSet)2557 std::set<int32_t> AudioPolicyServer::GetStreamIdsForAudioSessionByStreamUsage(
2558     const int32_t zoneId, const std::set<StreamUsage> &streamUsageSet)
2559 {
2560     std::set<int32_t> streamIds;
2561     if (interruptService_ != nullptr) {
2562         streamIds = interruptService_->GetStreamIdsForAudioSessionByStreamUsage(zoneId, streamUsageSet);
2563     }
2564 
2565     return streamIds;
2566 }
2567 
ActivateAudioInterrupt(const AudioInterrupt & audioInterruptIn,int32_t zoneID,bool isUpdatedAudioStrategy)2568 int32_t AudioPolicyServer::ActivateAudioInterrupt(
2569     const AudioInterrupt &audioInterruptIn, int32_t zoneID, bool isUpdatedAudioStrategy)
2570 {
2571     Trace trace("AudioPolicyServer::ActivateAudioInterrupt");
2572     AudioInterrupt audioInterrupt = audioInterruptIn;
2573     if (interruptService_ == nullptr) {
2574         AUDIO_ERR_LOG("The interruptService_ is nullptr");
2575         return ERR_UNKNOWN;
2576     }
2577 
2578     auto it = std::find(CAN_MIX_MUTED_STREAM.begin(), CAN_MIX_MUTED_STREAM.end(),
2579         audioInterrupt.audioFocusType.streamType);
2580     if (it != CAN_MIX_MUTED_STREAM.end()) {
2581         AudioStreamType streamInFocus = VolumeUtils::GetVolumeTypeFromStreamType(
2582             audioInterrupt.audioFocusType.streamType);
2583         int32_t volumeLevel = GetSystemVolumeLevelInternal(streamInFocus);
2584         if (volumeLevel == 0) {
2585             audioInterrupt.sessionStrategy.concurrencyMode = AudioConcurrencyMode::SILENT;
2586         }
2587     }
2588     StreamUsage streamUsage = interruptService_->GetAudioSessionStreamUsage(audioInterrupt.pid);
2589     streamUsage = ((streamUsage != StreamUsage::STREAM_USAGE_INVALID) &&
2590         interruptService_->IsAudioSessionActivated(audioInterrupt.pid)) ? streamUsage : audioInterrupt.streamUsage;
2591     int32_t zoneId = AudioZoneService::GetInstance().FindAudioZone(audioInterrupt.uid, streamUsage);
2592     int32_t ret = -1;
2593     if (StandaloneModeManager::GetInstance().CheckAndRecordStandaloneApp(audioInterrupt.uid,
2594         false, audioInterrupt.streamId)) {
2595         return SUCCESS;
2596     } else {
2597         ret = AudioZoneService::GetInstance().ActivateAudioInterrupt(zoneId, audioInterrupt,
2598             isUpdatedAudioStrategy);
2599     }
2600     if ((ret == SUCCESS) && (interruptService_->IsSessionNeedToFetchOutputDevice(IPCSkeleton::GetCallingPid()))) {
2601         eventEntry_->FetchOutputDeviceAndRoute("ActivateAudioInterrupt",
2602             AudioStreamDeviceChangeReasonExt::ExtEnum::SET_DEFAULT_OUTPUT_DEVICE);
2603     }
2604 
2605     return ret;
2606 }
2607 
SetAppConcurrencyMode(const int32_t appUid,const int32_t mode)2608 int32_t AudioPolicyServer::SetAppConcurrencyMode(const int32_t appUid, const int32_t mode)
2609 {
2610     if (interruptService_ != nullptr) {
2611         return StandaloneModeManager::GetInstance().SetAppConcurrencyMode(IPCSkeleton::GetCallingPid(), appUid, mode);
2612     }
2613     return ERR_UNKNOWN;
2614 }
2615 
SetAppSlientOnDisplay(const int32_t displayId)2616 int32_t AudioPolicyServer::SetAppSlientOnDisplay(const int32_t displayId)
2617 {
2618     if (interruptService_ != nullptr) {
2619         return StandaloneModeManager::GetInstance().SetAppSlientOnDisplay(IPCSkeleton::GetCallingPid(), displayId);
2620     }
2621     return ERR_UNKNOWN;
2622 }
DeactivateAudioInterrupt(const AudioInterrupt & audioInterrupt,int32_t zoneID)2623 int32_t AudioPolicyServer::DeactivateAudioInterrupt(const AudioInterrupt &audioInterrupt, int32_t zoneID)
2624 {
2625     if (interruptService_ != nullptr) {
2626         int32_t zoneId = AudioZoneService::GetInstance().FindAudioZone(audioInterrupt.uid,
2627             audioInterrupt.streamUsage);
2628         StandaloneModeManager::GetInstance().EraseDeactivateAudioStream(audioInterrupt.uid,
2629             audioInterrupt.streamId);
2630         return AudioZoneService::GetInstance().DeactivateAudioInterrupt(zoneId, audioInterrupt);
2631     }
2632     return ERR_UNKNOWN;
2633 }
2634 
ActivatePreemptMode()2635 int32_t AudioPolicyServer::ActivatePreemptMode()
2636 {
2637     uid_t callingUid = static_cast<uid_t>(IPCSkeleton::GetCallingUid());
2638     if (callingUid != PREEMPT_UID) {
2639         AUDIO_ERR_LOG("Error callingUid uid: %{public}d", callingUid);
2640         return ERROR;
2641     }
2642     if (interruptService_ != nullptr) {
2643         return interruptService_->ActivatePreemptMode();
2644     }
2645     return ERR_UNKNOWN;
2646 }
2647 
DeactivatePreemptMode()2648 int32_t AudioPolicyServer::DeactivatePreemptMode()
2649 {
2650     uid_t callingUid = static_cast<uid_t>(IPCSkeleton::GetCallingUid());
2651     if (callingUid != PREEMPT_UID) {
2652         AUDIO_ERR_LOG("Error callingUid uid: %{public}d", callingUid);
2653         return ERROR;
2654     }
2655     if (interruptService_ != nullptr) {
2656         return interruptService_->DeactivatePreemptMode();
2657     }
2658     return ERR_UNKNOWN;
2659 }
2660 
OnAudioStreamRemoved(const uint64_t sessionID)2661 void AudioPolicyServer::OnAudioStreamRemoved(const uint64_t sessionID)
2662 {
2663     CHECK_AND_RETURN_LOG(audioPolicyServerHandler_ != nullptr, "audioPolicyServerHandler_ is nullptr");
2664     audioPolicyServerHandler_->SendCapturerRemovedEvent(sessionID, false);
2665 }
2666 
GetCurrentStreamInFocus()2667 AudioStreamType AudioPolicyServer::GetCurrentStreamInFocus()
2668 {
2669     int32_t streamType = STREAM_DEFAULT;
2670     GetStreamInFocus(DEFAULT_ZONEID, streamType);
2671     CHECK_AND_RETURN_RET(audioVolumeManager_.IsNeedForceControlVolumeType(), static_cast<AudioStreamType>(streamType));
2672     AUDIO_INFO_LOG("force volume type, type:%{public}d", audioVolumeManager_.GetForceControlVolumeType());
2673     return audioVolumeManager_.GetForceControlVolumeType();
2674 }
2675 
GetStreamInFocus(int32_t zoneID,int32_t & streamType)2676 int32_t AudioPolicyServer::GetStreamInFocus(int32_t zoneID, int32_t &streamType)
2677 {
2678     if (interruptService_ != nullptr) {
2679         streamType = static_cast<int32_t>(interruptService_->GetStreamInFocus(zoneID));
2680     } else {
2681         streamType = static_cast<int32_t>(STREAM_MUSIC);
2682     }
2683     return SUCCESS;
2684 }
2685 
2686 // LCOV_EXCL_START
GetStreamInFocusByUid(int32_t uid,int32_t zoneID,int32_t & streamType)2687 int32_t AudioPolicyServer::GetStreamInFocusByUid(int32_t uid, int32_t zoneID, int32_t &streamType)
2688 {
2689     if (!PermissionUtil::VerifySystemPermission()) {
2690         AUDIO_ERR_LOG("No system permission");
2691         streamType = static_cast<int32_t>(STREAM_MUSIC);
2692         return SUCCESS;
2693     }
2694 
2695     if (interruptService_ != nullptr) {
2696         streamType = static_cast<int32_t>(interruptService_->GetStreamInFocusByUid(uid, zoneID));
2697         return SUCCESS;
2698     }
2699     streamType = static_cast<int32_t>(STREAM_MUSIC);
2700     return SUCCESS;
2701 }
2702 // LCOV_EXCL_STOP
2703 
GetSessionInfoInFocus(AudioInterrupt & audioInterrupt,int32_t zoneID)2704 int32_t AudioPolicyServer::GetSessionInfoInFocus(AudioInterrupt &audioInterrupt, int32_t zoneID)
2705 {
2706     if (interruptService_ != nullptr) {
2707         return interruptService_->GetSessionInfoInFocus(audioInterrupt, zoneID);
2708     }
2709     return ERR_UNKNOWN;
2710 }
2711 
GetAudioFocusInfoList(std::vector<std::map<AudioInterrupt,int32_t>> & focusInfoList,int32_t zoneID)2712 int32_t AudioPolicyServer::GetAudioFocusInfoList(std::vector<std::map<AudioInterrupt, int32_t>> &focusInfoList,
2713     int32_t zoneID)
2714 {
2715     std::list<std::pair<AudioInterrupt, AudioFocuState>> focusInfoListIn;
2716     if (interruptService_ != nullptr) {
2717         int32_t ret = interruptService_->GetAudioFocusInfoList(zoneID, focusInfoListIn);
2718         focusInfoList = ToIpcInterrupts(focusInfoListIn);
2719         return ret;
2720     }
2721     return ERR_UNKNOWN;
2722 }
2723 
VerifyPermission(const std::string & permissionName,uint32_t tokenId,bool isRecording)2724 bool AudioPolicyServer::VerifyPermission(const std::string &permissionName, uint32_t tokenId, bool isRecording)
2725 {
2726     AUDIO_DEBUG_LOG("Verify permission [%{public}s]", permissionName.c_str());
2727 
2728     uid_t callingUid = static_cast<uid_t>(IPCSkeleton::GetCallingUid());
2729     if (callingUid == UID_AUDIO) {
2730         return true;
2731     }
2732 
2733     if (!isRecording) {
2734 #ifdef AUDIO_BUILD_VARIANT_ROOT
2735         // root user case for auto test
2736         if (callingUid == ROOT_UID) {
2737             return true;
2738         }
2739 #endif
2740         tokenId = IPCSkeleton::GetCallingTokenID();
2741     }
2742 
2743     int res = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenId, permissionName);
2744     CHECK_AND_RETURN_RET_LOG(res == Security::AccessToken::PermissionState::PERMISSION_GRANTED,
2745         false, "Permission denied [%{public}s]", permissionName.c_str());
2746 
2747     return true;
2748 }
2749 
VerifyBluetoothPermission()2750 bool AudioPolicyServer::VerifyBluetoothPermission()
2751 {
2752 #ifdef AUDIO_BUILD_VARIANT_ROOT
2753     // root user case for auto test
2754     uid_t callingUid = static_cast<uid_t>(IPCSkeleton::GetCallingUid());
2755     if (callingUid == ROOT_UID) {
2756         return true;
2757     }
2758 #endif
2759     uint32_t tokenId = IPCSkeleton::GetCallingTokenID();
2760 
2761     WatchTimeout guard("VerifyBluetooth");
2762     int res = Security::AccessToken::AccessTokenKit::VerifyAccessToken(tokenId, USE_BLUETOOTH_PERMISSION);
2763     CHECK_AND_RETURN_RET(res == Security::AccessToken::PermissionState::PERMISSION_GRANTED, false);
2764 
2765     return true;
2766 }
2767 
GetStreamVolumeInfoMap(StreamVolumeInfoMap & streamVolumeInfos)2768 void AudioPolicyServer::GetStreamVolumeInfoMap(StreamVolumeInfoMap &streamVolumeInfos)
2769 {
2770     audioPolicyManager_.GetStreamVolumeInfoMap(streamVolumeInfos);
2771 }
2772 
Dump(int32_t fd,const std::vector<std::u16string> & args)2773 int32_t AudioPolicyServer::Dump(int32_t fd, const std::vector<std::u16string> &args)
2774 {
2775     AUDIO_DEBUG_LOG("Dump Process Invoked");
2776     std::queue<std::u16string> argQue;
2777     for (decltype(args.size()) index = 0; index < args.size(); ++index) {
2778         argQue.push(args[index]);
2779     }
2780     std::string dumpString;
2781     InitPolicyDumpMap();
2782     ArgInfoDump(dumpString, argQue);
2783 
2784     return write(fd, dumpString.c_str(), dumpString.size());
2785 }
2786 
InitPolicyDumpMap()2787 void AudioPolicyServer::InitPolicyDumpMap()
2788 {
2789     dumpFuncMap[u"-h"] = &AudioPolicyServer::InfoDumpHelp;
2790     dumpFuncMap[u"-d"] = &AudioPolicyServer::AudioDevicesDump;
2791     dumpFuncMap[u"-m"] = &AudioPolicyServer::AudioModeDump;
2792     dumpFuncMap[u"-v"] = &AudioPolicyServer::AudioVolumeDump;
2793     dumpFuncMap[u"-az"] = &AudioPolicyServer::AudioInterruptZoneDump;
2794     dumpFuncMap[u"-apc"] = &AudioPolicyServer::AudioPolicyParserDump;
2795     dumpFuncMap[u"-s"] = &AudioPolicyServer::AudioStreamDump;
2796     dumpFuncMap[u"-xp"] = &AudioPolicyServer::XmlParsedDataMapDump;
2797     dumpFuncMap[u"-e"] = &AudioPolicyServer::EffectManagerInfoDump;
2798     dumpFuncMap[u"-ms"] = &AudioPolicyServer::MicrophoneMuteInfoDump;
2799     dumpFuncMap[u"-as"] = &AudioPolicyServer::AudioSessionInfoDump;
2800     dumpFuncMap[u"-ap"] = &AudioPolicyServer::AudioPipeManagerDump;
2801     dumpFuncMap[u"-sd"] = &AudioPolicyServer::SelectDeviceDump;
2802 }
2803 
PolicyDataDump(std::string & dumpString)2804 void AudioPolicyServer::PolicyDataDump(std::string &dumpString)
2805 {
2806     AudioDevicesDump(dumpString);
2807     AudioModeDump(dumpString);
2808     AudioVolumeDump(dumpString);
2809     AudioInterruptZoneDump(dumpString);
2810     AudioSessionInfoDump(dumpString);
2811     AudioPolicyParserDump(dumpString);
2812     AudioStreamDump(dumpString);
2813     XmlParsedDataMapDump(dumpString);
2814     EffectManagerInfoDump(dumpString);
2815     MicrophoneMuteInfoDump(dumpString);
2816     AudioPipeManagerDump(dumpString);
2817     SelectDeviceDump(dumpString);
2818 }
2819 
AudioDevicesDump(std::string & dumpString)2820 void AudioPolicyServer::AudioDevicesDump(std::string &dumpString)
2821 {
2822     audioPolicyDump_.DevicesInfoDump(dumpString);
2823 }
2824 
AudioModeDump(std::string & dumpString)2825 void AudioPolicyServer::AudioModeDump(std::string &dumpString)
2826 {
2827     audioPolicyDump_.AudioModeDump(dumpString);
2828 }
2829 
AudioInterruptZoneDump(std::string & dumpString)2830 void AudioPolicyServer::AudioInterruptZoneDump(std::string &dumpString)
2831 {
2832     interruptService_->AudioInterruptZoneDump(dumpString);
2833 }
2834 
AudioPolicyParserDump(std::string & dumpString)2835 void AudioPolicyServer::AudioPolicyParserDump(std::string &dumpString)
2836 {
2837     audioPolicyDump_.AudioPolicyParserDump(dumpString);
2838 }
2839 
AudioVolumeDump(std::string & dumpString)2840 void AudioPolicyServer::AudioVolumeDump(std::string &dumpString)
2841 {
2842     audioPolicyDump_.StreamVolumesDump(dumpString);
2843 }
2844 
AudioStreamDump(std::string & dumpString)2845 void AudioPolicyServer::AudioStreamDump(std::string &dumpString)
2846 {
2847     audioPolicyDump_.AudioStreamDump(dumpString);
2848 }
2849 
XmlParsedDataMapDump(std::string & dumpString)2850 void AudioPolicyServer::XmlParsedDataMapDump(std::string &dumpString)
2851 {
2852     audioPolicyDump_.XmlParsedDataMapDump(dumpString);
2853 }
2854 
EffectManagerInfoDump(std::string & dumpString)2855 void AudioPolicyServer::EffectManagerInfoDump(std::string &dumpString)
2856 {
2857     audioPolicyDump_.EffectManagerInfoDump(dumpString);
2858 }
2859 
MicrophoneMuteInfoDump(std::string & dumpString)2860 void AudioPolicyServer::MicrophoneMuteInfoDump(std::string &dumpString)
2861 {
2862     audioPolicyDump_.MicrophoneMuteInfoDump(dumpString);
2863 }
2864 
AudioSessionInfoDump(std::string & dumpString)2865 void AudioPolicyServer::AudioSessionInfoDump(std::string &dumpString)
2866 {
2867     interruptService_->AudioSessionInfoDump(dumpString);
2868 }
2869 
AudioPipeManagerDump(std::string & dumpString)2870 void AudioPolicyServer::AudioPipeManagerDump(std::string &dumpString)
2871 {
2872     if (coreService_ != nullptr) {
2873         coreService_->DumpPipeManager(dumpString);
2874     }
2875 }
2876 
SelectDeviceDump(std::string & dumpString)2877 void AudioPolicyServer::SelectDeviceDump(std::string &dumpString)
2878 {
2879     if (coreService_ != nullptr) {
2880         coreService_->DumpSelectHistory(dumpString);
2881     }
2882 }
2883 
ArgInfoDump(std::string & dumpString,std::queue<std::u16string> & argQue)2884 void AudioPolicyServer::ArgInfoDump(std::string &dumpString, std::queue<std::u16string> &argQue)
2885 {
2886     dumpString += "AudioPolicyServer Data Dump:\n\n";
2887     if (argQue.empty()) {
2888         PolicyDataDump(dumpString);
2889         return;
2890     }
2891     while (!argQue.empty()) {
2892         std::u16string para = argQue.front();
2893         if (para == u"-h") {
2894             dumpString.clear();
2895             (this->*dumpFuncMap[para])(dumpString);
2896             return;
2897         } else if (dumpFuncMap.count(para) == 0) {
2898             dumpString.clear();
2899             AppendFormat(dumpString, "Please input correct param:\n");
2900             InfoDumpHelp(dumpString);
2901             return;
2902         } else {
2903             (this->*dumpFuncMap[para])(dumpString);
2904         }
2905         argQue.pop();
2906     }
2907 }
2908 
InfoDumpHelp(std::string & dumpString)2909 void AudioPolicyServer::InfoDumpHelp(std::string &dumpString)
2910 {
2911     AppendFormat(dumpString, "usage:\n");
2912     AppendFormat(dumpString, "  -h\t\t\t|help text for hidumper audio policy\n");
2913     AppendFormat(dumpString, "  -d\t\t\t|dump devices info\n");
2914     AppendFormat(dumpString, "  -m\t\t\t|dump ringer mode and call status\n");
2915     AppendFormat(dumpString, "  -v\t\t\t|dump stream volume info\n");
2916     AppendFormat(dumpString, "  -az\t\t\t|dump audio in interrupt zone info\n");
2917     AppendFormat(dumpString, "  -apc\t\t\t|dump audio policy config xml parser info\n");
2918     AppendFormat(dumpString, "  -s\t\t\t|dump stream info\n");
2919     AppendFormat(dumpString, "  -xp\t\t\t|dump xml data map\n");
2920     AppendFormat(dumpString, "  -e\t\t\t|dump audio effect manager info\n");
2921     AppendFormat(dumpString, "  -as\t\t\t|dump audio session info\n");
2922     AppendFormat(dumpString, "  -ap\t\t\t|dump audio pipe manager info\n");
2923 }
2924 
GetPreferredOutputStreamType(const AudioRendererInfo & rendererInfo,int32_t & streamType)2925 int32_t AudioPolicyServer::GetPreferredOutputStreamType(const AudioRendererInfo &rendererInfo, int32_t &streamType)
2926 {
2927     std::string bundleName = "";
2928     AudioRendererInfo newRendererInfo = rendererInfo;
2929     bool isFastControlled = audioPolicyService_.getFastControlParam();
2930     if (isFastControlled && rendererInfo.rendererFlags == AUDIO_FLAG_MMAP) {
2931         bundleName = AudioBundleManager::GetBundleName();
2932         AUDIO_INFO_LOG("bundleName %{public}s", bundleName.c_str());
2933         streamType = eventEntry_->GetPreferredOutputStreamType(newRendererInfo, bundleName);
2934     }
2935     streamType = eventEntry_->GetPreferredOutputStreamType(newRendererInfo, "");
2936     return SUCCESS;
2937 }
2938 
GetPreferredInputStreamType(const AudioCapturerInfo & capturerInfo,int32_t & streamType)2939 int32_t AudioPolicyServer::GetPreferredInputStreamType(const AudioCapturerInfo &capturerInfo, int32_t &streamType)
2940 {
2941     AudioCapturerInfo newCapturerInfo = capturerInfo;
2942     streamType = eventEntry_->GetPreferredInputStreamType(newCapturerInfo);
2943     return SUCCESS;
2944 }
2945 
CreateRendererClient(const std::shared_ptr<AudioStreamDescriptor> & streamDesc,uint32_t & flag,uint32_t & sessionId,std::string & networkId)2946 int32_t AudioPolicyServer::CreateRendererClient(const std::shared_ptr<AudioStreamDescriptor> &streamDesc,
2947     uint32_t &flag, uint32_t &sessionId, std::string &networkId)
2948 {
2949     CHECK_AND_RETURN_RET_LOG(coreService_ != nullptr && eventEntry_ != nullptr, ERR_NULL_POINTER,
2950         "Core service not inited");
2951     bool disableFastStream = coreService_->GetDisableFastStreamParam();
2952     if (disableFastStream) {
2953         std::string bundleName = AudioBundleManager::GetBundleName();
2954         streamDesc->SetBunduleName(bundleName);
2955     }
2956     uint32_t flagIn = AUDIO_OUTPUT_FLAG_NORMAL;
2957     std::string networkIdIn = LOCAL_NETWORK_ID;
2958     int32_t ret = eventEntry_->CreateRendererClient(streamDesc, flagIn, sessionId, networkIdIn);
2959     flag = flagIn;
2960     networkId = networkIdIn;
2961     return ret;
2962 }
2963 
CreateCapturerClient(const std::shared_ptr<AudioStreamDescriptor> & streamDesc,uint32_t & flag,uint32_t & sessionId)2964 int32_t AudioPolicyServer::CreateCapturerClient(const std::shared_ptr<AudioStreamDescriptor> &streamDesc,
2965     uint32_t &flag, uint32_t &sessionId)
2966 {
2967     uint32_t flagIn = AUDIO_INPUT_FLAG_NORMAL;
2968     int32_t ret =  eventEntry_->CreateCapturerClient(streamDesc, flagIn, sessionId);
2969     flag = flagIn;
2970     return ret;
2971 }
2972 
RegisterTracker(int32_t modeIn,const AudioStreamChangeInfo & streamChangeInfoIn,const sptr<IRemoteObject> & object)2973 int32_t AudioPolicyServer::RegisterTracker(int32_t modeIn, const AudioStreamChangeInfo &streamChangeInfoIn,
2974     const sptr<IRemoteObject> &object)
2975 {
2976     AudioMode mode = static_cast<AudioMode>(modeIn);
2977     AudioStreamChangeInfo streamChangeInfo = streamChangeInfoIn;
2978     // update the clientUid
2979     auto callerUid = IPCSkeleton::GetCallingUid();
2980     streamChangeInfo.audioRendererChangeInfo.createrUID = callerUid;
2981     streamChangeInfo.audioCapturerChangeInfo.createrUID = callerUid;
2982     int appVolume = 0;
2983     GetAppVolumeLevel(callerUid, appVolume);
2984     streamChangeInfo.audioRendererChangeInfo.appVolume = appVolume;
2985     AUDIO_DEBUG_LOG("RegisterTracker: [caller uid: %{public}d]", callerUid);
2986     if (callerUid != MEDIA_SERVICE_UID) {
2987         if (mode == AUDIO_MODE_PLAYBACK) {
2988             streamChangeInfo.audioRendererChangeInfo.clientUID = callerUid;
2989             AUDIO_DEBUG_LOG("Non media service caller, use the uid retrieved. ClientUID:%{public}d]",
2990                 streamChangeInfo.audioRendererChangeInfo.clientUID);
2991         } else {
2992             streamChangeInfo.audioCapturerChangeInfo.clientUID = callerUid;
2993             streamChangeInfo.audioCapturerChangeInfo.appTokenId = IPCSkeleton::GetCallingTokenID();
2994 
2995             AUDIO_DEBUG_LOG("Non media service caller, use the uid retrieved. ClientUID:%{public}d]",
2996                 streamChangeInfo.audioCapturerChangeInfo.clientUID);
2997         }
2998     }
2999     RegisterClientDeathRecipient(object, TRACKER_CLIENT);
3000     int32_t apiVersion = GetApiTargetVersion();
3001     return eventEntry_->RegisterTracker(mode, streamChangeInfo, object, apiVersion);
3002 }
3003 
UpdateTracker(int32_t modeIn,const AudioStreamChangeInfo & streamChangeInfoIn)3004 int32_t AudioPolicyServer::UpdateTracker(int32_t modeIn, const AudioStreamChangeInfo &streamChangeInfoIn)
3005 {
3006     Trace trace("AudioPolicyServer::UpdateTracker");
3007     AudioMode mode = static_cast<AudioMode>(modeIn);
3008     AudioStreamChangeInfo streamChangeInfo = streamChangeInfoIn;
3009 
3010     // update the clientUid
3011     auto callerUid = IPCSkeleton::GetCallingUid();
3012     streamChangeInfo.audioRendererChangeInfo.createrUID = callerUid;
3013     streamChangeInfo.audioCapturerChangeInfo.createrUID = callerUid;
3014     AUDIO_DEBUG_LOG("UpdateTracker: [caller uid: %{public}d]", callerUid);
3015     if (callerUid != MEDIA_SERVICE_UID) {
3016         if (mode == AUDIO_MODE_PLAYBACK) {
3017             streamChangeInfo.audioRendererChangeInfo.clientUID = callerUid;
3018             AUDIO_DEBUG_LOG("Non media service caller, use the uid retrieved. ClientUID:%{public}d]",
3019                 streamChangeInfo.audioRendererChangeInfo.clientUID);
3020         } else {
3021             streamChangeInfo.audioCapturerChangeInfo.clientUID = callerUid;
3022             AUDIO_DEBUG_LOG("Non media service caller, use the uid retrieved. ClientUID:%{public}d]",
3023                 streamChangeInfo.audioCapturerChangeInfo.clientUID);
3024         }
3025     }
3026     int appVolume = 0;
3027     GetAppVolumeLevel(streamChangeInfo.audioRendererChangeInfo.clientUID, appVolume);
3028     streamChangeInfo.audioRendererChangeInfo.appVolume = appVolume;
3029     int32_t ret = eventEntry_->UpdateTracker(mode, streamChangeInfo);
3030     return ret;
3031 }
3032 
FetchOutputDeviceForTrack(const AudioStreamChangeInfo & streamChangeInfoIn,const AudioStreamDeviceChangeReasonExt & reason)3033 int32_t AudioPolicyServer::FetchOutputDeviceForTrack(const AudioStreamChangeInfo &streamChangeInfoIn,
3034     const AudioStreamDeviceChangeReasonExt &reason)
3035 {
3036     // update the clientUid
3037     auto callerUid = IPCSkeleton::GetCallingUid();
3038     AudioStreamChangeInfo streamChangeInfo = streamChangeInfoIn;
3039     streamChangeInfo.audioRendererChangeInfo.createrUID = callerUid;
3040     AUDIO_DEBUG_LOG("[caller uid: %{public}d]", callerUid);
3041     if (callerUid != MEDIA_SERVICE_UID) {
3042         streamChangeInfo.audioRendererChangeInfo.clientUID = callerUid;
3043         AUDIO_DEBUG_LOG("Non media service caller, use the uid retrieved. ClientUID:%{public}d]",
3044             streamChangeInfo.audioRendererChangeInfo.clientUID);
3045     }
3046     eventEntry_->FetchOutputDeviceForTrack(streamChangeInfo, reason);
3047     return SUCCESS;
3048 }
3049 
FetchInputDeviceForTrack(const AudioStreamChangeInfo & streamChangeInfoIn)3050 int32_t AudioPolicyServer::FetchInputDeviceForTrack(const AudioStreamChangeInfo &streamChangeInfoIn)
3051 {
3052     // update the clientUid
3053     auto callerUid = IPCSkeleton::GetCallingUid();
3054     AudioStreamChangeInfo streamChangeInfo = streamChangeInfoIn;
3055     streamChangeInfo.audioCapturerChangeInfo.createrUID = callerUid;
3056     AUDIO_DEBUG_LOG("[caller uid: %{public}d]", callerUid);
3057     if (callerUid != MEDIA_SERVICE_UID) {
3058         streamChangeInfo.audioCapturerChangeInfo.clientUID = callerUid;
3059         AUDIO_DEBUG_LOG("Non media service caller, use the uid retrieved. ClientUID:%{public}d]",
3060             streamChangeInfo.audioCapturerChangeInfo.clientUID);
3061     }
3062     eventEntry_->FetchInputDeviceForTrack(streamChangeInfo);
3063     return SUCCESS;
3064 }
3065 
GetCurrentRendererChangeInfos(std::vector<shared_ptr<AudioRendererChangeInfo>> & audioRendererChangeInfos)3066 int32_t AudioPolicyServer::GetCurrentRendererChangeInfos(
3067     std::vector<shared_ptr<AudioRendererChangeInfo>> &audioRendererChangeInfos)
3068 {
3069     bool hasBTPermission = VerifyBluetoothPermission();
3070     AUDIO_DEBUG_LOG("GetCurrentRendererChangeInfos: BT use permission: %{public}d", hasBTPermission);
3071     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3072     AUDIO_DEBUG_LOG("GetCurrentRendererChangeInfos: System use permission: %{public}d", hasSystemPermission);
3073 
3074     return eventEntry_->GetCurrentRendererChangeInfos(audioRendererChangeInfos,
3075         hasBTPermission, hasSystemPermission);
3076 }
3077 
GetCurrentCapturerChangeInfos(std::vector<shared_ptr<AudioCapturerChangeInfo>> & audioCapturerChangeInfos)3078 int32_t AudioPolicyServer::GetCurrentCapturerChangeInfos(
3079     std::vector<shared_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos)
3080 {
3081     bool hasBTPermission = VerifyBluetoothPermission();
3082     AUDIO_DEBUG_LOG("GetCurrentCapturerChangeInfos: BT use permission: %{public}d", hasBTPermission);
3083     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3084     AUDIO_DEBUG_LOG("GetCurrentCapturerChangeInfos: System use permission: %{public}d", hasSystemPermission);
3085 
3086     return eventEntry_->GetCurrentCapturerChangeInfos(audioCapturerChangeInfos,
3087         hasBTPermission, hasSystemPermission);
3088 }
3089 
RegisterClientDeathRecipient(const sptr<IRemoteObject> & object,DeathRecipientId id)3090 void AudioPolicyServer::RegisterClientDeathRecipient(const sptr<IRemoteObject> &object, DeathRecipientId id)
3091 {
3092     AUDIO_DEBUG_LOG("Register clients death recipient!! RecipientId: %{public}d", id);
3093     std::lock_guard<std::mutex> lock(clientDiedListenerStateMutex_);
3094     CHECK_AND_RETURN_LOG(object != nullptr, "Client proxy obj NULL!!");
3095 
3096     pid_t pid = IPCSkeleton::GetCallingPid();
3097     pid_t uid = IPCSkeleton::GetCallingUid();
3098     if (id == TRACKER_CLIENT && std::find(clientDiedListenerState_.begin(), clientDiedListenerState_.end(), pid)
3099         != clientDiedListenerState_.end()) {
3100         AUDIO_INFO_LOG("Tracker has been registered for uid:%{public}d pid:%{public}d!", uid, pid);
3101         return;
3102     }
3103     sptr<AudioServerDeathRecipient> deathRecipient_ = new(std::nothrow) AudioServerDeathRecipient(pid, uid);
3104     if (deathRecipient_ != nullptr) {
3105         if (id == TRACKER_CLIENT) {
3106             deathRecipient_->SetNotifyCb(
3107                 [this] (pid_t pid, pid_t uid) { this->RegisteredTrackerClientDied(pid, uid); });
3108         } else {
3109             AUDIO_PRERELEASE_LOGI("RegisteredStreamListenerClientDied register!!");
3110             deathRecipient_->SetNotifyCb(
3111                 [this] (pid_t pid, pid_t uid) { this->RegisteredStreamListenerClientDied(pid, uid); });
3112         }
3113         bool result = object->AddDeathRecipient(deathRecipient_);
3114         if (result && id == TRACKER_CLIENT) {
3115             clientDiedListenerState_.push_back(pid);
3116         }
3117         if (!result) {
3118             AUDIO_WARNING_LOG("failed to add deathRecipient");
3119         }
3120     }
3121 }
3122 
RegisteredTrackerClientDied(pid_t pid,pid_t uid)3123 void AudioPolicyServer::RegisteredTrackerClientDied(pid_t pid, pid_t uid)
3124 {
3125     AUDIO_INFO_LOG("RegisteredTrackerClient died: remove entry, pid %{public}d uid %{public}d", pid, uid);
3126     audioAffinityManager_.DelSelectCapturerDevice(uid);
3127     audioAffinityManager_.DelSelectRendererDevice(uid);
3128     std::lock_guard<std::mutex> lock(clientDiedListenerStateMutex_);
3129     eventEntry_->RegisteredTrackerClientDied(uid, pid);
3130 
3131     auto filter = [&pid](int val) {
3132         return pid == val;
3133     };
3134     clientDiedListenerState_.erase(std::remove_if(clientDiedListenerState_.begin(), clientDiedListenerState_.end(),
3135         filter), clientDiedListenerState_.end());
3136 }
3137 
RegisteredStreamListenerClientDied(pid_t pid,pid_t uid)3138 void AudioPolicyServer::RegisteredStreamListenerClientDied(pid_t pid, pid_t uid)
3139 {
3140     AUDIO_INFO_LOG("RegisteredStreamListenerClient died: remove entry, pid %{public}d uid %{public}d", pid, uid);
3141     audioAffinityManager_.DelSelectCapturerDevice(uid);
3142     audioAffinityManager_.DelSelectRendererDevice(uid);
3143     StandaloneModeManager::GetInstance().ResumeAllStandaloneApp(pid);
3144     if (pid == lastMicMuteSettingPid_) {
3145         // The last app with the non-persistent microphone setting died, restore the default non-persistent value
3146         AUDIO_INFO_LOG("Cliet died and reset non-persist mute state");
3147         audioMicrophoneDescriptor_.SetMicrophoneMute(false);
3148     }
3149     if (interruptService_ != nullptr) {
3150         int32_t zoneId = AudioZoneService::GetInstance().FindAudioZoneByUid(uid);
3151         AUDIO_INFO_LOG("deactivate audio session for pid %{public}d, zoneId %{public}d", pid, zoneId);
3152         interruptService_->DeactivateAudioSession(zoneId, pid);
3153     }
3154 
3155     if (audioPolicyServerHandler_ != nullptr) {
3156         audioPolicyServerHandler_->RemoveAudioPolicyClientProxyMap(pid);
3157     }
3158 
3159     AudioZoneService::GetInstance().UnRegisterAudioZoneClient(pid);
3160     AudioZoneService::GetInstance().ReleaseAudioZoneByClientPid(pid);
3161 }
3162 
ResumeStreamState()3163 int32_t AudioPolicyServer::ResumeStreamState()
3164 {
3165     AUDIO_INFO_LOG("AVSession is not alive.");
3166     return streamCollector_.ResumeStreamState();
3167 }
3168 
3169 // LCOV_EXCL_START
UpdateStreamState(int32_t clientUid,int32_t streamSetStateIn,int32_t streamUsageIn)3170 int32_t AudioPolicyServer::UpdateStreamState(int32_t clientUid,
3171     int32_t streamSetStateIn, int32_t streamUsageIn)
3172 {
3173     StreamSetState streamSetState = static_cast<StreamSetState>(streamSetStateIn);
3174     StreamUsage streamUsage = static_cast<StreamUsage>(streamUsageIn);
3175 
3176     auto callerUid = IPCSkeleton::GetCallingUid();
3177     // This function can only be used by av_session
3178     CHECK_AND_RETURN_RET_LOG(callerUid == UID_AVSESSION_SERVICE, ERROR,
3179         "UpdateStreamState callerUid is error: not av_session");
3180 
3181     AUDIO_INFO_LOG("UpdateStreamState::uid:%{public}d streamSetState:%{public}d audioStreamUsage:%{public}d",
3182         clientUid, streamSetState, streamUsage);
3183     StreamSetState setState = StreamSetState::STREAM_PAUSE;
3184     switch (streamSetState) {
3185         case StreamSetState::STREAM_PAUSE:
3186             setState = StreamSetState::STREAM_PAUSE;
3187             break;
3188         case StreamSetState::STREAM_RESUME:
3189             setState = StreamSetState::STREAM_RESUME;
3190             break;
3191         case StreamSetState::STREAM_MUTE:
3192             setState = StreamSetState::STREAM_MUTE;
3193             break;
3194         case StreamSetState::STREAM_UNMUTE:
3195             setState = StreamSetState::STREAM_UNMUTE;
3196             break;
3197         default:
3198             AUDIO_INFO_LOG("UpdateStreamState::streamSetState value is error");
3199             break;
3200     }
3201     StreamSetStateEventInternal setStateEvent = {};
3202     setStateEvent.streamSetState = setState;
3203     setStateEvent.streamUsage = streamUsage;
3204 
3205     return streamCollector_.UpdateStreamState(clientUid, setStateEvent);
3206 }
3207 
GetVolumeGroupInfos(const std::string & networkId,std::vector<sptr<VolumeGroupInfo>> & infos)3208 int32_t AudioPolicyServer::GetVolumeGroupInfos(const std::string &networkId, std::vector<sptr<VolumeGroupInfo>> &infos)
3209 {
3210     bool ret = PermissionUtil::VerifySystemPermission();
3211     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED,
3212         "No system permission");
3213 
3214     infos = eventEntry_->GetVolumeGroupInfos();
3215     auto filter = [&networkId](const sptr<VolumeGroupInfo>& info) {
3216         return networkId != info->networkId_;
3217     };
3218     infos.erase(std::remove_if(infos.begin(), infos.end(), filter), infos.end());
3219 
3220     return SUCCESS;
3221 }
3222 // LCOV_EXCL_STOP
3223 
GetNetworkIdByGroupId(int32_t groupId,std::string & networkId)3224 int32_t AudioPolicyServer::GetNetworkIdByGroupId(int32_t groupId, std::string &networkId)
3225 {
3226     auto volumeGroupInfos = eventEntry_->GetVolumeGroupInfos();
3227 
3228     auto filter = [&groupId](const sptr<VolumeGroupInfo> &info) {
3229         return groupId != info->volumeGroupId_;
3230     };
3231     volumeGroupInfos.erase(std::remove_if(volumeGroupInfos.begin(), volumeGroupInfos.end(), filter),
3232         volumeGroupInfos.end());
3233     if (volumeGroupInfos.size() > 0) {
3234         networkId = volumeGroupInfos[0]->networkId_;
3235         AUDIO_INFO_LOG("GetNetworkIdByGroupId: get networkId %{public}s.", networkId.c_str());
3236     } else {
3237         AUDIO_ERR_LOG("GetNetworkIdByGroupId: has no valid group");
3238         return ERROR;
3239     }
3240 
3241     return SUCCESS;
3242 }
3243 
RemoteParameterCallback(sptr<AudioPolicyServer> server)3244 AudioPolicyServer::RemoteParameterCallback::RemoteParameterCallback(sptr<AudioPolicyServer> server)
3245 {
3246     server_ = server;
3247 }
3248 
OnAudioParameterChange(const std::string networkId,const AudioParamKey key,const std::string & condition,const std::string & value)3249 void AudioPolicyServer::RemoteParameterCallback::OnAudioParameterChange(const std::string networkId,
3250     const AudioParamKey key, const std::string &condition, const std::string &value)
3251 {
3252     AUDIO_INFO_LOG("key:%{public}d, condition:%{public}s, value:%{public}s",
3253         key, condition.c_str(), value.c_str());
3254     CHECK_AND_RETURN_LOG(server_ != nullptr, "AudioPolicyServer is nullptr");
3255     switch (key) {
3256         case VOLUME:
3257             VolumeOnChange(networkId, condition);
3258             break;
3259         case INTERRUPT:
3260             InterruptOnChange(networkId, condition);
3261             break;
3262         case PARAM_KEY_STATE:
3263             StateOnChange(networkId, condition, value);
3264             break;
3265         default:
3266             AUDIO_DEBUG_LOG("[AudioPolicyServer]: No processing");
3267             break;
3268     }
3269 }
3270 
VolumeOnChange(const std::string networkId,const std::string & condition)3271 void AudioPolicyServer::RemoteParameterCallback::VolumeOnChange(const std::string networkId,
3272     const std::string &condition)
3273 {
3274     VolumeEvent volumeEvent;
3275     volumeEvent.networkId = networkId;
3276     char eventDes[EVENT_DES_SIZE];
3277     if (sscanf_s(condition.c_str(), "%[^;];AUDIO_STREAM_TYPE=%d;VOLUME_LEVEL=%d;IS_UPDATEUI=%d;VOLUME_GROUP_ID=%d;",
3278         eventDes, EVENT_DES_SIZE, &(volumeEvent.volumeType), &(volumeEvent.volume), &(volumeEvent.updateUi),
3279         &(volumeEvent.volumeGroupId)) < PARAMS_VOLUME_NUM) {
3280         AUDIO_ERR_LOG("[VolumeOnChange]: Failed parse condition");
3281         return;
3282     }
3283 
3284     volumeEvent.updateUi = false;
3285     CHECK_AND_RETURN_LOG(server_->audioPolicyServerHandler_ != nullptr, "audioPolicyServerHandler_ is nullptr");
3286     server_->audioPolicyServerHandler_->SendVolumeKeyEventCallback(volumeEvent);
3287 }
3288 
InterruptOnChange(const std::string networkId,const std::string & condition)3289 void AudioPolicyServer::RemoteParameterCallback::InterruptOnChange(const std::string networkId,
3290     const std::string &condition)
3291 {
3292     AUDIO_INFO_LOG("InterruptOnChange : networkId: %{public}s, condition: %{public}s.", networkId.c_str(),
3293         condition.c_str());
3294     char eventDes[EVENT_DES_SIZE];
3295     InterruptType type = INTERRUPT_TYPE_BEGIN;
3296     InterruptForceType forceType = INTERRUPT_SHARE;
3297     InterruptHint hint = INTERRUPT_HINT_NONE;
3298     int32_t audioCategory = 0;
3299 
3300     int ret = sscanf_s(condition.c_str(), "%[^;];EVENT_TYPE=%d;FORCE_TYPE=%d;HINT_TYPE=%d;AUDIOCATEGORY=%d;",
3301         eventDes, EVENT_DES_SIZE, &type, &forceType, &hint, &audioCategory);
3302     CHECK_AND_RETURN_LOG(ret >= PARAMS_INTERRUPT_NUM, "[InterruptOnChange]: Failed parse condition");
3303 
3304     std::set<int32_t> sessionIdMedia = AudioStreamCollector::GetAudioStreamCollector().
3305         GetSessionIdsOnRemoteDeviceByStreamUsage(StreamUsage::STREAM_USAGE_MUSIC);
3306     std::set<int32_t> sessionIdMovie = AudioStreamCollector::GetAudioStreamCollector().
3307         GetSessionIdsOnRemoteDeviceByStreamUsage(StreamUsage::STREAM_USAGE_MOVIE);
3308     std::set<int32_t> sessionIdGame = AudioStreamCollector::GetAudioStreamCollector().
3309         GetSessionIdsOnRemoteDeviceByStreamUsage(StreamUsage::STREAM_USAGE_GAME);
3310     std::set<int32_t> sessionIdAudioBook = AudioStreamCollector::GetAudioStreamCollector().
3311         GetSessionIdsOnRemoteDeviceByStreamUsage(StreamUsage::STREAM_USAGE_AUDIOBOOK);
3312     std::set<int32_t> sessionIds = {};
3313     sessionIds.insert(sessionIdMedia.begin(), sessionIdMedia.end());
3314     sessionIds.insert(sessionIdMovie.begin(), sessionIdMovie.end());
3315     sessionIds.insert(sessionIdGame.begin(), sessionIdGame.end());
3316     sessionIds.insert(sessionIdAudioBook.begin(), sessionIdAudioBook.end());
3317 
3318     const std::set<StreamUsage> streamUsageSet = {
3319         StreamUsage::STREAM_USAGE_MUSIC,
3320         StreamUsage::STREAM_USAGE_MOVIE,
3321         StreamUsage::STREAM_USAGE_GAME,
3322         StreamUsage::STREAM_USAGE_AUDIOBOOK};
3323 
3324     InterruptEventInternal interruptEvent {type, forceType, hint, 0.2f};
3325     if (server_ != nullptr) {
3326         std::set<int32_t> fakeSessionIds = server_->GetStreamIdsForAudioSessionByStreamUsage(0, streamUsageSet);
3327         sessionIds.insert(fakeSessionIds.begin(), fakeSessionIds.end());
3328         server_->ProcessRemoteInterrupt(sessionIds, interruptEvent);
3329     }
3330 }
3331 
StateOnChange(const std::string networkId,const std::string & condition,const std::string & value)3332 void AudioPolicyServer::RemoteParameterCallback::StateOnChange(const std::string networkId,
3333     const std::string &condition, const std::string &value)
3334 {
3335     char eventDes[EVENT_DES_SIZE];
3336     char contentDes[ADAPTER_STATE_CONTENT_DES_SIZE];
3337     int ret = sscanf_s(condition.c_str(), "%[^;];%s", eventDes, EVENT_DES_SIZE, contentDes,
3338         ADAPTER_STATE_CONTENT_DES_SIZE);
3339     CHECK_AND_RETURN_LOG(ret >= PARAMS_RENDER_STATE_NUM, "StateOnChange: Failed parse condition");
3340     CHECK_AND_RETURN_LOG(strcmp(eventDes, "ERR_EVENT") == 0,
3341         "StateOnChange: Event %{public}s is not supported.", eventDes);
3342 
3343     std::string devTypeKey = "DEVICE_TYPE=";
3344     std::string contentDesStr = std::string(contentDes);
3345     auto devTypeKeyPos =  contentDesStr.find(devTypeKey);
3346     CHECK_AND_RETURN_LOG(devTypeKeyPos != std::string::npos,
3347         "StateOnChange: Not find daudio device type info, contentDes %{public}s.", contentDesStr.c_str());
3348     size_t devTypeValPos = devTypeKeyPos + devTypeKey.length();
3349     CHECK_AND_RETURN_LOG(devTypeValPos < contentDesStr.length(),
3350         "StateOnChange: Not find daudio device type value, contentDes %{public}s.", contentDesStr.c_str());
3351 
3352     if (contentDesStr[devTypeValPos] == DAUDIO_DEV_TYPE_SPK) {
3353         server_->coreService_->NotifyRemoteRenderState(networkId, contentDesStr, value);
3354     } else if (contentDesStr[devTypeValPos] == DAUDIO_DEV_TYPE_MIC) {
3355         AUDIO_INFO_LOG("StateOnChange: ERR_EVENT of DAUDIO_DEV_TYPE_MIC.");
3356     } else {
3357         AUDIO_ERR_LOG("StateOnChange: Device type is not supported, contentDes %{public}s.", contentDesStr.c_str());
3358     }
3359 }
3360 
PermStateChangeCallback(Security::AccessToken::PermStateChangeInfo & result)3361 void AudioPolicyServer::PerStateChangeCbCustomizeCallback::PermStateChangeCallback(
3362     Security::AccessToken::PermStateChangeInfo &result)
3363 {
3364     ready_ = true;
3365     Security::AccessToken::HapTokenInfo hapTokenInfo;
3366     int32_t res = Security::AccessToken::AccessTokenKit::GetHapTokenInfo(result.tokenID, hapTokenInfo);
3367     if (res < 0) {
3368         AUDIO_ERR_LOG("Call GetHapTokenInfo fail.");
3369     }
3370 
3371     bool targetMuteState = (result.permStateChangeType > 0) ? false : true;
3372     int32_t appUid = AudioBundleManager::GetUidByBundleName(hapTokenInfo.bundleName, hapTokenInfo.userID);
3373     if (appUid < 0) {
3374         AUDIO_ERR_LOG("fail to get uid.");
3375     } else {
3376         int32_t streamSet = server_->audioPolicyService_.SetSourceOutputStreamMute(appUid, targetMuteState);
3377         if (streamSet > 0) {
3378             UpdateMicPrivacyByCapturerState(targetMuteState, result.tokenID, appUid);
3379         }
3380     }
3381 }
3382 
UpdateMicPrivacyByCapturerState(bool targetMuteState,uint32_t targetTokenId,int32_t appUid)3383 void AudioPolicyServer::PerStateChangeCbCustomizeCallback::UpdateMicPrivacyByCapturerState(
3384     bool targetMuteState, uint32_t targetTokenId, int32_t appUid)
3385 {
3386     std::vector<std::shared_ptr<AudioCapturerChangeInfo>> capturerChangeInfos;
3387     server_->audioPolicyService_.GetCurrentCapturerChangeInfos(capturerChangeInfos, true, true);
3388     for (auto &info : capturerChangeInfos) {
3389         if (info->appTokenId == targetTokenId && info->capturerState == CAPTURER_RUNNING) {
3390             AUDIO_INFO_LOG("update using mic %{public}d for uid: %{public}d because permission changed",
3391                 targetMuteState, appUid);
3392             int32_t res = SUCCESS;
3393             if (targetMuteState) {
3394                 res = PermissionUtil::StopUsingPermission(targetTokenId, MICROPHONE_PERMISSION);
3395             } else {
3396                 res = PermissionUtil::StartUsingPermission(targetTokenId, MICROPHONE_PERMISSION);
3397             }
3398             if (res != SUCCESS) {
3399                 AUDIO_ERR_LOG("update using permission failed, error code %{public}d", res);
3400             }
3401         }
3402     }
3403 }
3404 
RegisterParamCallback()3405 void AudioPolicyServer::RegisterParamCallback()
3406 {
3407     AUDIO_INFO_LOG("RegisterParamCallback");
3408     remoteParameterCallback_ = std::make_shared<RemoteParameterCallback>(this);
3409     audioPolicyService_.SetParameterCallback(remoteParameterCallback_);
3410     // regiest policy provider in audio server
3411     audioPolicyService_.RegiestPolicy();
3412     eventEntry_->RegistCoreService();
3413 }
3414 
RegisterBluetoothListener()3415 void AudioPolicyServer::RegisterBluetoothListener()
3416 {
3417     AUDIO_INFO_LOG("OnAddSystemAbility bluetooth service start");
3418     coreService_->RegisterBluetoothListener();
3419 }
3420 
SubscribeAccessibilityConfigObserver()3421 void AudioPolicyServer::SubscribeAccessibilityConfigObserver()
3422 {
3423     AUDIO_INFO_LOG("SubscribeAccessibilityConfigObserver");
3424     audioPolicyService_.SubscribeAccessibilityConfigObserver();
3425 }
3426 
3427 // LCOV_EXCL_START
SetSystemSoundUri(const std::string & key,const std::string & uri)3428 int32_t AudioPolicyServer::SetSystemSoundUri(const std::string &key, const std::string &uri)
3429 {
3430     if (!PermissionUtil::VerifySystemPermission()) {
3431         AUDIO_ERR_LOG("GetVolumeGroupInfos: No system permission");
3432         return ERR_PERMISSION_DENIED;
3433     }
3434     AUDIO_INFO_LOG("key: %{public}s, uri: %{public}s", key.c_str(), uri.c_str());
3435     return audioPolicyManager_.SetSystemSoundUri(key, uri);
3436 }
3437 
GetSystemSoundUri(const std::string & key,std::string & uri)3438 int32_t AudioPolicyServer::GetSystemSoundUri(const std::string &key, std::string &uri)
3439 {
3440     if (!PermissionUtil::VerifySystemPermission()) {
3441         AUDIO_ERR_LOG("GetVolumeGroupInfos: No system permission");
3442         uri = "";
3443         return ERR_PERMISSION_DENIED;
3444     }
3445     AUDIO_INFO_LOG("key: %{public}s", key.c_str());
3446     uri = audioPolicyManager_.GetSystemSoundUri(key);
3447     return SUCCESS;
3448 }
3449 // LCOV_EXCL_STOP
3450 
GetMinStreamVolume(float & volume)3451 int32_t AudioPolicyServer::GetMinStreamVolume(float &volume)
3452 {
3453     volume = audioPolicyManager_.GetMinStreamVolume();
3454     return SUCCESS;
3455 }
3456 
GetMaxStreamVolume(float & volume)3457 int32_t AudioPolicyServer::GetMaxStreamVolume(float &volume)
3458 {
3459     volume = audioPolicyManager_.GetMaxStreamVolume();
3460     return SUCCESS;
3461 }
3462 
GetMaxRendererInstances(int32_t & ret)3463 int32_t AudioPolicyServer::GetMaxRendererInstances(int32_t &ret)
3464 {
3465     AUDIO_INFO_LOG("GetMaxRendererInstances");
3466     int32_t retryCount = 20; // 20 * 200000us = 4s, wait up to 4s
3467     while (!isFirstAudioServiceStart_) {
3468         retryCount--;
3469         if (retryCount > 0) {
3470             AUDIO_WARNING_LOG("Audio server is not start");
3471             usleep(200000); // Wait 200000us when audio server is not started
3472         } else {
3473             break;
3474         }
3475     }
3476     ret = audioPolicyService_.GetMaxRendererInstances();
3477     return SUCCESS;
3478 }
3479 
RegisterDataObserver()3480 void AudioPolicyServer::RegisterDataObserver()
3481 {
3482     audioPolicyService_.RegisterDataObserver();
3483 }
3484 
QueryEffectSceneMode(SupportedEffectConfig & supportedEffectConfig)3485 int32_t AudioPolicyServer::QueryEffectSceneMode(SupportedEffectConfig &supportedEffectConfig)
3486 {
3487     audioPolicyService_.QueryEffectManagerSceneMode(supportedEffectConfig);
3488     return SUCCESS;
3489 }
3490 
GetHardwareOutputSamplingRate(const std::shared_ptr<AudioDeviceDescriptor> & desc,int32_t & ret)3491 int32_t AudioPolicyServer::GetHardwareOutputSamplingRate(const std::shared_ptr<AudioDeviceDescriptor> &desc,
3492     int32_t &ret)
3493 {
3494     MapExternalToInternalDeviceType(*desc);
3495     ret = audioPolicyService_.GetHardwareOutputSamplingRate(desc);
3496     return SUCCESS;
3497 }
3498 
GetAudioCapturerMicrophoneDescriptors(int32_t sessionId,vector<sptr<MicrophoneDescriptor>> & micDescs)3499 int32_t AudioPolicyServer::GetAudioCapturerMicrophoneDescriptors(int32_t sessionId,
3500     vector<sptr<MicrophoneDescriptor>> &micDescs)
3501 {
3502     micDescs = coreService_->GetAudioCapturerMicrophoneDescriptors(sessionId);
3503     return SUCCESS;
3504 }
3505 
GetAvailableMicrophones(std::vector<sptr<MicrophoneDescriptor>> & retMicList)3506 int32_t AudioPolicyServer::GetAvailableMicrophones(std::vector<sptr<MicrophoneDescriptor>> &retMicList)
3507 {
3508     retMicList = eventEntry_->GetAvailableMicrophones();
3509     return SUCCESS;
3510 }
3511 
SetDeviceAbsVolumeSupported(const std::string & macAddress,bool support)3512 int32_t AudioPolicyServer::SetDeviceAbsVolumeSupported(const std::string &macAddress, bool support)
3513 {
3514     auto callerUid = IPCSkeleton::GetCallingUid();
3515     if (callerUid != UID_BLUETOOTH_SA) {
3516         AUDIO_ERR_LOG("SetDeviceAbsVolumeSupported: Error caller uid: %{public}d", callerUid);
3517         return ERROR;
3518     }
3519     return audioVolumeManager_.SetDeviceAbsVolumeSupported(macAddress, support);
3520 }
3521 
IsAbsVolumeScene(bool & ret)3522 int32_t AudioPolicyServer::IsAbsVolumeScene(bool &ret)
3523 {
3524     ret = audioPolicyManager_.IsAbsVolumeScene();
3525     return SUCCESS;
3526 }
3527 
SetA2dpDeviceVolume(const std::string & macAddress,int32_t volume,bool updateUi)3528 int32_t AudioPolicyServer::SetA2dpDeviceVolume(const std::string &macAddress, int32_t volume,
3529     bool updateUi)
3530 {
3531     auto callerUid = IPCSkeleton::GetCallingUid();
3532     if (callerUid != UID_BLUETOOTH_SA) {
3533         AUDIO_ERR_LOG("SetA2dpDeviceVolume: Error caller uid: %{public}d", callerUid);
3534         return ERROR;
3535     }
3536 
3537     AudioStreamType streamInFocus = AudioStreamType::STREAM_MUSIC; // use STREAM_MUSIC as default stream type
3538 
3539     if (!IsVolumeLevelValid(streamInFocus, volume)) {
3540         return ERR_NOT_SUPPORTED;
3541     }
3542     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
3543     int32_t ret = audioVolumeManager_.SetA2dpDeviceVolume(macAddress, volume);
3544 
3545     VolumeEvent volumeEvent;
3546     volumeEvent.volumeType = streamInFocus;
3547     volumeEvent.volume = volume;
3548     volumeEvent.updateUi = updateUi;
3549     volumeEvent.volumeGroupId = 0;
3550     volumeEvent.networkId = LOCAL_NETWORK_ID;
3551     if (ret == SUCCESS && audioPolicyServerHandler_ != nullptr &&
3552         audioPolicyManager_.GetActiveDevice() == DEVICE_TYPE_BLUETOOTH_A2DP) {
3553         audioPolicyServerHandler_->SendVolumeKeyEventCallback(volumeEvent);
3554     }
3555     return ret;
3556 }
3557 
SetNearlinkDeviceVolume(const std::string & macAddress,int32_t streamTypeIn,int32_t volume,bool updateUi)3558 int32_t AudioPolicyServer::SetNearlinkDeviceVolume(const std::string &macAddress, int32_t streamTypeIn,
3559     int32_t volume, bool updateUi)
3560 {
3561     AudioStreamType streamType = static_cast<AudioStreamType>(streamTypeIn);
3562     std::vector<uid_t> allowedUids = { UID_NEARLINK_SA };
3563     bool ret = PermissionUtil::CheckCallingUidPermission(allowedUids);
3564     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "Uid Check Failed");
3565 
3566     CHECK_AND_RETURN_RET_LOG(IsVolumeLevelValid(streamType, volume), ERR_NOT_SUPPORTED,
3567         "Error volume level: %{public}d", volume);
3568 
3569     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
3570     if (streamType == STREAM_MUSIC) {
3571         audioPolicyManager_.SetSleVoiceStatusFlag(false);
3572         int32_t result = audioVolumeManager_.SetNearlinkDeviceVolume(macAddress, streamType, volume);
3573         CHECK_AND_RETURN_RET_LOG(result == SUCCESS, result, "Set volume failed");
3574 
3575         VolumeEvent volumeEvent = VolumeEvent(streamType, volume, updateUi);
3576 
3577         CHECK_AND_RETURN_RET_LOG(audioPolicyServerHandler_ != nullptr, ERROR, "audioPolicyServerHandler_ is nullptr");
3578         if (audioActiveDevice_.GetCurrentOutputDeviceType() == DEVICE_TYPE_NEARLINK) {
3579             audioPolicyServerHandler_->SendVolumeKeyEventCallback(volumeEvent);
3580         }
3581     } else {
3582         audioPolicyManager_.SetSleVoiceStatusFlag(true);
3583         return SetSystemVolumeLevelWithDeviceInternal(streamType, volume, updateUi, DEVICE_TYPE_NEARLINK);
3584     }
3585 
3586     return SUCCESS;
3587 }
3588 
GetAvailableDevices(int32_t usageIn,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & descs)3589 int32_t AudioPolicyServer::GetAvailableDevices(int32_t usageIn,
3590     std::vector<std::shared_ptr<AudioDeviceDescriptor>> &descs)
3591 {
3592     AudioDeviceUsage usage = static_cast<AudioDeviceUsage>(usageIn);
3593     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3594     switch (usage) {
3595         case MEDIA_OUTPUT_DEVICES:
3596         case MEDIA_INPUT_DEVICES:
3597         case ALL_MEDIA_DEVICES:
3598         case CALL_OUTPUT_DEVICES:
3599         case CALL_INPUT_DEVICES:
3600         case ALL_CALL_DEVICES:
3601         case D_ALL_DEVICES:
3602             break;
3603         default:
3604             AUDIO_ERR_LOG("Invalid device usage:%{public}d", usage);
3605             return ERR_INVALID_PARAM;
3606     }
3607 
3608     descs = eventEntry_->GetAvailableDevices(usage);
3609 
3610     if (!hasSystemPermission) {
3611         for (auto &desc : descs) {
3612             CHECK_AND_CONTINUE(desc != nullptr);
3613             desc->networkId_ = "";
3614             desc->interruptGroupId_ = GROUP_ID_NONE;
3615             desc->volumeGroupId_ = GROUP_ID_NONE;
3616         }
3617     }
3618 
3619     std::vector<std::shared_ptr<AudioDeviceDescriptor>> deviceDevices = {};
3620     for (auto &desc : descs) {
3621         deviceDevices.push_back(std::make_shared<AudioDeviceDescriptor>(*desc));
3622     }
3623 
3624     bool hasBTPermission = VerifyBluetoothPermission();
3625     if (!hasBTPermission) {
3626         audioPolicyService_.UpdateDescWhenNoBTPermission(deviceDevices);
3627         descs.clear();
3628         for (auto &dec : deviceDevices) {
3629             CHECK_AND_CONTINUE(dec != nullptr);
3630             descs.push_back(make_shared<AudioDeviceDescriptor>(*dec));
3631         }
3632     }
3633 
3634     return SUCCESS;
3635 }
3636 
SetAvailableDeviceChangeCallback(int32_t,int32_t usageIn,const sptr<IRemoteObject> & object)3637 int32_t AudioPolicyServer::SetAvailableDeviceChangeCallback(int32_t /*clientId*/, int32_t usageIn,
3638     const sptr<IRemoteObject> &object)
3639 {
3640     AudioDeviceUsage usage = static_cast<AudioDeviceUsage>(usageIn);
3641     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM,
3642         "SetAvailableDeviceChangeCallback set listener object is nullptr");
3643     switch (usage) {
3644         case MEDIA_OUTPUT_DEVICES:
3645         case MEDIA_INPUT_DEVICES:
3646         case ALL_MEDIA_DEVICES:
3647         case CALL_OUTPUT_DEVICES:
3648         case CALL_INPUT_DEVICES:
3649         case ALL_CALL_DEVICES:
3650         case D_ALL_DEVICES:
3651             break;
3652         default:
3653             AUDIO_ERR_LOG("Invalid AudioDeviceUsage");
3654             return ERR_INVALID_PARAM;
3655     }
3656 
3657     int32_t clientPid = IPCSkeleton::GetCallingPid();
3658     bool hasBTPermission = VerifyBluetoothPermission();
3659     return audioPolicyService_.SetAvailableDeviceChangeCallback(clientPid, usage, object, hasBTPermission);
3660 }
3661 
UnsetAvailableDeviceChangeCallback(int32_t,int32_t usageIn)3662 int32_t AudioPolicyServer::UnsetAvailableDeviceChangeCallback(int32_t /*clientId*/, int32_t usageIn)
3663 {
3664     AudioDeviceUsage usage = static_cast<AudioDeviceUsage>(usageIn);
3665     int32_t clientPid = IPCSkeleton::GetCallingPid();
3666     AUDIO_INFO_LOG("Start");
3667     if (audioPolicyServerHandler_ != nullptr) {
3668         audioPolicyServerHandler_->RemoveAvailableDeviceChangeMap(clientPid, usage);
3669     }
3670     return SUCCESS;
3671 }
3672 
OffloadStopPlaying(const AudioInterrupt & audioInterrupt)3673 int32_t AudioPolicyServer::OffloadStopPlaying(const AudioInterrupt &audioInterrupt)
3674 {
3675     return audioPolicyService_.OffloadStopPlaying(std::vector<int32_t>(1, audioInterrupt.streamId));
3676 }
3677 
3678 // LCOV_EXCL_START
ConfigDistributedRoutingRole(const std::shared_ptr<AudioDeviceDescriptor> & descriptor,int32_t typeIn)3679 int32_t AudioPolicyServer::ConfigDistributedRoutingRole(
3680     const std::shared_ptr<AudioDeviceDescriptor> &descriptor, int32_t typeIn)
3681 {
3682     CastType type = static_cast<CastType>(typeIn);
3683     if (!PermissionUtil::VerifySystemPermission()) {
3684         AUDIO_ERR_LOG("No system permission");
3685         return ERR_PERMISSION_DENIED;
3686     }
3687     std::lock_guard<std::mutex> lock(descLock_);
3688     coreService_->ConfigDistributedRoutingRole(descriptor, type);
3689     OnDistributedRoutingRoleChange(descriptor, type);
3690     return SUCCESS;
3691 }
3692 // LCOV_EXCL_STOP
3693 
SetDistributedRoutingRoleCallback(const sptr<IRemoteObject> & object)3694 int32_t AudioPolicyServer::SetDistributedRoutingRoleCallback(const sptr<IRemoteObject> &object)
3695 {
3696     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM,
3697         "SetDistributedRoutingRoleCallback set listener object is nullptr");
3698     int32_t clientPid = IPCSkeleton::GetCallingPid();
3699     AUDIO_INFO_LOG("Entered %{public}s", __func__);
3700     sptr<IStandardAudioRoutingManagerListener> listener = iface_cast<IStandardAudioRoutingManagerListener>(object);
3701     if (listener != nullptr && audioPolicyServerHandler_ != nullptr) {
3702         audioPolicyServerHandler_->AddDistributedRoutingRoleChangeCbsMap(clientPid, listener);
3703     }
3704     return SUCCESS;
3705 }
3706 
UnsetDistributedRoutingRoleCallback()3707 int32_t AudioPolicyServer::UnsetDistributedRoutingRoleCallback()
3708 {
3709     int32_t clientPid = IPCSkeleton::GetCallingPid();
3710     AUDIO_INFO_LOG("Entered %{public}s", __func__);
3711     if (audioPolicyServerHandler_ != nullptr) {
3712         return audioPolicyServerHandler_->RemoveDistributedRoutingRoleChangeCbsMap(clientPid);
3713     }
3714     return SUCCESS;
3715 }
3716 
OnDistributedRoutingRoleChange(const std::shared_ptr<AudioDeviceDescriptor> descriptor,const CastType type)3717 void AudioPolicyServer::OnDistributedRoutingRoleChange(const std::shared_ptr<AudioDeviceDescriptor> descriptor,
3718     const CastType type)
3719 {
3720     CHECK_AND_RETURN_LOG(audioPolicyServerHandler_ != nullptr, "audioPolicyServerHandler_ is nullptr");
3721     audioPolicyServerHandler_->SendDistributedRoutingRoleChange(descriptor, type);
3722 }
3723 
RegisterPowerStateListener()3724 void AudioPolicyServer::RegisterPowerStateListener()
3725 {
3726     if (powerStateListener_ == nullptr) {
3727         powerStateListener_ = new (std::nothrow) PowerStateListener(this);
3728     }
3729 
3730     if (powerStateListener_ == nullptr) {
3731         AUDIO_ERR_LOG("create power state listener failed");
3732         return;
3733     }
3734 
3735     auto& powerMgrClient = OHOS::PowerMgr::PowerMgrClient::GetInstance();
3736     WatchTimeout guard("powerMgrClient.RegisterSyncSleepCallback:RegisterPowerStateListener");
3737     bool ret = powerMgrClient.RegisterSyncSleepCallback(powerStateListener_, SleepPriority::HIGH);
3738     guard.CheckCurrTimeout();
3739     if (!ret) {
3740         AUDIO_ERR_LOG("register sync sleep callback failed");
3741     } else {
3742         AUDIO_INFO_LOG("register sync sleep callback success");
3743     }
3744 }
3745 
UnRegisterPowerStateListener()3746 void AudioPolicyServer::UnRegisterPowerStateListener()
3747 {
3748     if (powerStateListener_ == nullptr) {
3749         AUDIO_ERR_LOG("power state listener is null");
3750         return;
3751     }
3752 
3753     auto& powerMgrClient = OHOS::PowerMgr::PowerMgrClient::GetInstance();
3754     WatchTimeout guard("powerMgrClient.UnRegisterSyncSleepCallback:UnRegisterPowerStateListener");
3755     bool ret = powerMgrClient.UnRegisterSyncSleepCallback(powerStateListener_);
3756     guard.CheckCurrTimeout();
3757     if (!ret) {
3758         AUDIO_WARNING_LOG("unregister sync sleep callback failed");
3759     } else {
3760         powerStateListener_ = nullptr;
3761         AUDIO_INFO_LOG("unregister sync sleep callback success");
3762     }
3763 }
3764 
RegisterAppStateListener()3765 void AudioPolicyServer::RegisterAppStateListener()
3766 {
3767     AUDIO_INFO_LOG("OnAddSystemAbility app manager service start");
3768     if (appStateListener_ == nullptr) {
3769         appStateListener_ = new(std::nothrow) AppStateListener();
3770     }
3771 
3772     if (appStateListener_ == nullptr) {
3773         AUDIO_ERR_LOG("create app state listener failed");
3774         return;
3775     }
3776 
3777     if (appManager_.RegisterAppStateCallback(appStateListener_) != AppExecFwk::AppMgrResultCode::RESULT_OK) {
3778         AUDIO_ERR_LOG("register app state callback failed");
3779     }
3780 }
3781 
RegisterSyncHibernateListener()3782 void AudioPolicyServer::RegisterSyncHibernateListener()
3783 {
3784     if (syncHibernateListener_ == nullptr) {
3785         syncHibernateListener_ = new (std::nothrow) SyncHibernateListener(this);
3786     }
3787 
3788     if (syncHibernateListener_ == nullptr) {
3789         AUDIO_ERR_LOG("create sync hibernate listener failed");
3790         return;
3791     }
3792 
3793     auto& powerMgrClient = OHOS::PowerMgr::PowerMgrClient::GetInstance();
3794     WatchTimeout guard("powerMgrClient.RegisterSyncHibernateCallback:RegisterSyncHibernateListener");
3795     bool ret = powerMgrClient.RegisterSyncHibernateCallback(syncHibernateListener_);
3796     guard.CheckCurrTimeout();
3797     if (!ret) {
3798         AUDIO_ERR_LOG("register sync hibernate callback failed");
3799     } else {
3800         AUDIO_INFO_LOG("register sync hibernate callback success");
3801     }
3802 }
3803 
UnRegisterSyncHibernateListener()3804 void AudioPolicyServer::UnRegisterSyncHibernateListener()
3805 {
3806     if (syncHibernateListener_ == nullptr) {
3807         AUDIO_ERR_LOG("sync hibernate listener is null");
3808         return;
3809     }
3810 
3811     auto& powerMgrClient = OHOS::PowerMgr::PowerMgrClient::GetInstance();
3812     WatchTimeout guard("powerMgrClient.UnRegisterSyncHibernateCallback:UnRegisterSyncHibernateListener");
3813     bool ret = powerMgrClient.UnRegisterSyncHibernateCallback(syncHibernateListener_);
3814     guard.CheckCurrTimeout();
3815     if (!ret) {
3816         AUDIO_WARNING_LOG("unregister sync hibernate callback failed");
3817     } else {
3818         syncHibernateListener_ = nullptr;
3819         AUDIO_INFO_LOG("unregister sync hibernate callback success");
3820     }
3821 }
3822 
3823 // LCOV_EXCL_START
IsSpatializationEnabled(bool & ret)3824 int32_t AudioPolicyServer::IsSpatializationEnabled(bool &ret)
3825 {
3826     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3827     if (!hasSystemPermission) {
3828         ret = false;
3829         return ERR_PERMISSION_DENIED;
3830     }
3831     ret = audioSpatializationService_.IsSpatializationEnabled();
3832     return SUCCESS;
3833 }
3834 
IsSpatializationEnabled(const std::string & address,bool & ret)3835 int32_t AudioPolicyServer::IsSpatializationEnabled(const std::string &address, bool &ret)
3836 {
3837     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3838     if (!hasSystemPermission) {
3839         return false;
3840     }
3841     ret = audioSpatializationService_.IsSpatializationEnabled(address);
3842     return SUCCESS;
3843 }
3844 
IsSpatializationEnabledForCurrentDevice(bool & ret)3845 int32_t AudioPolicyServer::IsSpatializationEnabledForCurrentDevice(bool &ret)
3846 {
3847     ret = audioSpatializationService_.IsSpatializationEnabledForCurrentDevice();
3848     return SUCCESS;
3849 }
3850 
SetSpatializationEnabled(bool enable)3851 int32_t AudioPolicyServer::SetSpatializationEnabled(bool enable)
3852 {
3853     if (!VerifyPermission(MANAGE_SYSTEM_AUDIO_EFFECTS)) {
3854         AUDIO_ERR_LOG("MANAGE_SYSTEM_AUDIO_EFFECTS permission check failed");
3855         return ERR_PERMISSION_DENIED;
3856     }
3857     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3858     if (!hasSystemPermission) {
3859         return ERR_PERMISSION_DENIED;
3860     }
3861     return audioSpatializationService_.SetSpatializationEnabled(enable);
3862 }
3863 
SetSpatializationEnabled(const std::shared_ptr<AudioDeviceDescriptor> & selectedAudioDevice,bool enable)3864 int32_t AudioPolicyServer::SetSpatializationEnabled(const std::shared_ptr<AudioDeviceDescriptor> &selectedAudioDevice,
3865     bool enable)
3866 {
3867     if (!VerifyPermission(MANAGE_SYSTEM_AUDIO_EFFECTS)) {
3868         AUDIO_ERR_LOG("MANAGE_SYSTEM_AUDIO_EFFECTS permission check failed");
3869         return ERR_PERMISSION_DENIED;
3870     }
3871     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3872     if (!hasSystemPermission) {
3873         return ERR_PERMISSION_DENIED;
3874     }
3875     return audioSpatializationService_.SetSpatializationEnabled(selectedAudioDevice, enable);
3876 }
3877 
IsHeadTrackingEnabled(bool & ret)3878 int32_t AudioPolicyServer::IsHeadTrackingEnabled(bool &ret)
3879 {
3880     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3881     if (!hasSystemPermission) {
3882         return ERR_PERMISSION_DENIED;
3883     }
3884     ret = audioSpatializationService_.IsHeadTrackingEnabled();
3885     return SUCCESS;
3886 }
3887 
IsHeadTrackingEnabled(const std::string & address,bool & ret)3888 int32_t AudioPolicyServer::IsHeadTrackingEnabled(const std::string &address, bool &ret)
3889 {
3890     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3891     if (!hasSystemPermission) {
3892         return ERR_PERMISSION_DENIED;
3893     }
3894     ret = audioSpatializationService_.IsHeadTrackingEnabled(address);
3895     return SUCCESS;
3896 }
3897 
SetHeadTrackingEnabled(bool enable)3898 int32_t AudioPolicyServer::SetHeadTrackingEnabled(bool enable)
3899 {
3900     if (!VerifyPermission(MANAGE_SYSTEM_AUDIO_EFFECTS)) {
3901         AUDIO_ERR_LOG("MANAGE_SYSTEM_AUDIO_EFFECTS permission check failed");
3902         return ERR_PERMISSION_DENIED;
3903     }
3904     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3905     if (!hasSystemPermission) {
3906         return ERR_PERMISSION_DENIED;
3907     }
3908     return audioSpatializationService_.SetHeadTrackingEnabled(enable);
3909 }
3910 
SetHeadTrackingEnabled(const std::shared_ptr<AudioDeviceDescriptor> & selectedAudioDevice,bool enable)3911 int32_t AudioPolicyServer::SetHeadTrackingEnabled(const std::shared_ptr<AudioDeviceDescriptor> &selectedAudioDevice,
3912     bool enable)
3913 {
3914     if (!VerifyPermission(MANAGE_SYSTEM_AUDIO_EFFECTS)) {
3915         AUDIO_ERR_LOG("MANAGE_SYSTEM_AUDIO_EFFECTS permission check failed");
3916         return ERR_PERMISSION_DENIED;
3917     }
3918     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3919     if (!hasSystemPermission) {
3920         return ERR_PERMISSION_DENIED;
3921     }
3922     return audioSpatializationService_.SetHeadTrackingEnabled(selectedAudioDevice, enable);
3923 }
3924 
GetSpatializationState(int32_t streamUsage,AudioSpatializationState & state)3925 int32_t AudioPolicyServer::GetSpatializationState(int32_t streamUsage,
3926     AudioSpatializationState &state)
3927 {
3928     state = audioSpatializationService_.GetSpatializationState(static_cast<StreamUsage>(streamUsage));
3929     return SUCCESS;
3930 }
3931 
IsSpatializationSupported(bool & ret)3932 int32_t AudioPolicyServer::IsSpatializationSupported(bool &ret)
3933 {
3934     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3935     if (!hasSystemPermission) {
3936         return ERR_PERMISSION_DENIED;
3937     }
3938     ret = audioSpatializationService_.IsSpatializationSupported();
3939     return SUCCESS;
3940 }
3941 
IsSpatializationSupportedForDevice(const std::string & address,bool & ret)3942 int32_t AudioPolicyServer::IsSpatializationSupportedForDevice(const std::string &address, bool &ret)
3943 {
3944     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3945     if (!hasSystemPermission) {
3946         return ERR_PERMISSION_DENIED;
3947     }
3948     ret = audioSpatializationService_.IsSpatializationSupportedForDevice(address);
3949     return SUCCESS;
3950 }
3951 
IsHeadTrackingSupported(bool & ret)3952 int32_t AudioPolicyServer::IsHeadTrackingSupported(bool &ret)
3953 {
3954     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3955     if (!hasSystemPermission) {
3956         return ERR_PERMISSION_DENIED;
3957     }
3958     ret = audioSpatializationService_.IsHeadTrackingSupported();
3959     return SUCCESS;
3960 }
3961 
IsHeadTrackingSupportedForDevice(const std::string & address,bool & ret)3962 int32_t AudioPolicyServer::IsHeadTrackingSupportedForDevice(const std::string &address, bool &ret)
3963 {
3964     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3965     if (!hasSystemPermission) {
3966         return ERR_PERMISSION_DENIED;
3967     }
3968     ret = audioSpatializationService_.IsHeadTrackingSupportedForDevice(address);
3969     return SUCCESS;
3970 }
3971 
UpdateSpatialDeviceState(const AudioSpatialDeviceState & audioSpatialDeviceState)3972 int32_t AudioPolicyServer::UpdateSpatialDeviceState(const AudioSpatialDeviceState &audioSpatialDeviceState)
3973 {
3974     if (!VerifyPermission(MANAGE_SYSTEM_AUDIO_EFFECTS)) {
3975         AUDIO_ERR_LOG("MANAGE_SYSTEM_AUDIO_EFFECTS permission check failed");
3976         return ERR_PERMISSION_DENIED;
3977     }
3978     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
3979     if (!hasSystemPermission) {
3980         return ERR_PERMISSION_DENIED;
3981     }
3982     return audioSpatializationService_.UpdateSpatialDeviceState(audioSpatialDeviceState);
3983 }
3984 // LCOV_EXCL_STOP
3985 
RegisterSpatializationStateEventListener(uint32_t sessionID,int32_t streamUsageIn,const sptr<IRemoteObject> & object)3986 int32_t AudioPolicyServer::RegisterSpatializationStateEventListener(uint32_t sessionID,
3987     int32_t streamUsageIn, const sptr<IRemoteObject> &object)
3988 {
3989     StreamUsage streamUsage = static_cast<StreamUsage>(streamUsageIn);
3990     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM, "obj is null");
3991     return audioSpatializationService_.RegisterSpatializationStateEventListener(sessionID, streamUsage, object);
3992 }
3993 
UnregisterSpatializationStateEventListener(uint32_t sessionID)3994 int32_t AudioPolicyServer::UnregisterSpatializationStateEventListener(uint32_t sessionID)
3995 {
3996     return audioSpatializationService_.UnregisterSpatializationStateEventListener(sessionID);
3997 }
3998 
RegisterPolicyCallbackClient(const sptr<IRemoteObject> & object,const int32_t zoneID)3999 int32_t AudioPolicyServer::RegisterPolicyCallbackClient(const sptr<IRemoteObject> &object, const int32_t zoneID)
4000 {
4001     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM,
4002         "RegisterPolicyCallbackClient listener object is nullptr");
4003 
4004     sptr<IAudioPolicyClient> audioPolicyClient = iface_cast<IAudioPolicyClient>(object);
4005     CHECK_AND_RETURN_RET_LOG(audioPolicyClient != nullptr, ERR_INVALID_PARAM,
4006         "RegisterPolicyCallbackClient listener obj cast failed");
4007 
4008     auto callback = std::make_shared<AudioPolicyClientHolder>(audioPolicyClient);
4009     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "Create AudioPolicyClientHolder failed");
4010 
4011     int32_t clientPid = IPCSkeleton::GetCallingPid();
4012     AUDIO_DEBUG_LOG("register clientPid: %{public}d", clientPid);
4013 
4014     bool hasBTPermission = VerifyBluetoothPermission();
4015     bool hasSysPermission = PermissionUtil::VerifySystemPermission();
4016     callback->hasBTPermission_ = hasBTPermission;
4017     callback->hasSystemPermission_ = hasSysPermission;
4018     callback->apiVersion_ = GetApiTargetVersion();
4019     if (audioPolicyServerHandler_ != nullptr) {
4020         audioPolicyServerHandler_->AddAudioPolicyClientProxyMap(clientPid, callback);
4021     }
4022 
4023     RegisterClientDeathRecipient(object, LISTENER_CLIENT);
4024     return SUCCESS;
4025 }
4026 
CreateAudioInterruptZone(const std::set<int32_t> & pids,const int32_t zoneID)4027 int32_t AudioPolicyServer::CreateAudioInterruptZone(const std::set<int32_t> &pids, const int32_t zoneID)
4028 {
4029     return ERR_UNKNOWN;
4030 }
4031 
AddAudioInterruptZonePids(const std::set<int32_t> & pids,const int32_t zoneID)4032 int32_t AudioPolicyServer::AddAudioInterruptZonePids(const std::set<int32_t> &pids, const int32_t zoneID)
4033 {
4034     return ERR_UNKNOWN;
4035 }
4036 
RemoveAudioInterruptZonePids(const std::set<int32_t> & pids,const int32_t zoneID)4037 int32_t AudioPolicyServer::RemoveAudioInterruptZonePids(const std::set<int32_t> &pids, const int32_t zoneID)
4038 {
4039     return ERR_UNKNOWN;
4040 }
4041 
ReleaseAudioInterruptZone(const int32_t zoneID)4042 int32_t AudioPolicyServer::ReleaseAudioInterruptZone(const int32_t zoneID)
4043 {
4044     return ERR_UNKNOWN;
4045 }
4046 
RegisterAudioZoneClient(const sptr<IRemoteObject> & object)4047 int32_t AudioPolicyServer::RegisterAudioZoneClient(const sptr<IRemoteObject> &object)
4048 {
4049     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM,
4050         "RegisterAudioZoneClient listener object is nullptr");
4051 
4052     sptr<IStandardAudioZoneClient> client = iface_cast<IStandardAudioZoneClient>(object);
4053     CHECK_AND_RETURN_RET_LOG(client != nullptr, ERR_INVALID_PARAM,
4054         "RegisterAudioZoneClient listener obj cast failed");
4055 
4056     int32_t clientPid = IPCSkeleton::GetCallingPid();
4057     AUDIO_DEBUG_LOG("register clientPid: %{public}d", clientPid);
4058 
4059     AudioZoneService::GetInstance().RegisterAudioZoneClient(clientPid, client);
4060 
4061     RegisterClientDeathRecipient(object, LISTENER_CLIENT);
4062     return SUCCESS;
4063 }
4064 
CreateAudioZone(const std::string & name,const AudioZoneContext & context,int32_t & zoneId,int32_t pid)4065 int32_t AudioPolicyServer::CreateAudioZone(const std::string &name, const AudioZoneContext &context, int32_t &zoneId,
4066     int32_t pid)
4067 {
4068     CHECK_AND_RETURN_RET_LOG(!name.empty(), ERR_INVALID_PARAM, "audio zone name is empty");
4069     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4070     zoneId = AudioZoneService::GetInstance().CreateAudioZone(name, context, static_cast<pid_t>(pid));
4071     return SUCCESS;
4072 }
4073 
ReleaseAudioZone(int32_t zoneId)4074 int32_t AudioPolicyServer::ReleaseAudioZone(int32_t zoneId)
4075 {
4076     CHECK_AND_RETURN_RET_LOG(zoneId > 0, ERR_INVALID_PARAM, "audio zone id is invalid");
4077     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4078     AudioZoneService::GetInstance().ReleaseAudioZone(zoneId);
4079     return SUCCESS;
4080 }
4081 
GetAllAudioZone(std::vector<std::shared_ptr<AudioZoneDescriptor>> & descs)4082 int32_t AudioPolicyServer::GetAllAudioZone(std::vector<std::shared_ptr<AudioZoneDescriptor>> &descs)
4083 {
4084     descs = AudioZoneService::GetInstance().GetAllAudioZone();
4085     return SUCCESS;
4086 }
4087 
GetAudioZone(int32_t zoneId,std::shared_ptr<AudioZoneDescriptor> & desc)4088 int32_t AudioPolicyServer::GetAudioZone(int32_t zoneId, std::shared_ptr<AudioZoneDescriptor> &desc)
4089 {
4090     CHECK_AND_RETURN_RET_LOG(zoneId > 0, ERR_INVALID_PARAM, "audio zone id is invalid");
4091     desc = AudioZoneService::GetInstance().GetAudioZone(zoneId);
4092     CHECK_AND_RETURN_RET_LOG(desc != nullptr, ERR_NULL_POINTER, "desc is nullptr");
4093     return SUCCESS;
4094 }
4095 
GetAudioZoneByName(const std::string & name,int32_t & zoneId)4096 int32_t AudioPolicyServer::GetAudioZoneByName(const std::string &name, int32_t &zoneId)
4097 {
4098     CHECK_AND_RETURN_RET_LOG(!name.empty(), ERR_INVALID_PARAM, "audio zone name is empty");
4099     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4100     zoneId = AudioZoneService::GetInstance().GetAudioZoneByName(name);
4101     return SUCCESS;
4102 }
4103 
BindDeviceToAudioZone(int32_t zoneId,const std::vector<std::shared_ptr<AudioDeviceDescriptor>> & devices)4104 int32_t AudioPolicyServer::BindDeviceToAudioZone(int32_t zoneId,
4105     const std::vector<std::shared_ptr<AudioDeviceDescriptor>> &devices)
4106 {
4107     CHECK_AND_RETURN_RET_LOG(zoneId > 0, ERR_INVALID_PARAM, "audio zone id is invalid");
4108     size_t size = devices.size();
4109     CHECK_AND_RETURN_RET_LOG(size > 0 && size < MAX_SIZE, ERR_INVALID_PARAM, "invalid device size: %{public}zu", size);
4110     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4111     return AudioZoneService::GetInstance().BindDeviceToAudioZone(zoneId, devices);
4112 }
4113 
UnBindDeviceToAudioZone(int32_t zoneId,const std::vector<std::shared_ptr<AudioDeviceDescriptor>> & devices)4114 int32_t AudioPolicyServer::UnBindDeviceToAudioZone(int32_t zoneId,
4115     const std::vector<std::shared_ptr<AudioDeviceDescriptor>> &devices)
4116 {
4117     CHECK_AND_RETURN_RET_LOG(zoneId > 0, ERR_INVALID_PARAM, "audio zone id is invalid");
4118     size_t size = devices.size();
4119     CHECK_AND_RETURN_RET_LOG(size > 0 && size < MAX_SIZE, ERR_INVALID_PARAM, "invalid device size: %{public}zu", size);
4120     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4121     return AudioZoneService::GetInstance().UnBindDeviceToAudioZone(zoneId, devices);
4122 }
4123 
EnableAudioZoneReport(bool enable)4124 int32_t AudioPolicyServer::EnableAudioZoneReport(bool enable)
4125 {
4126     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4127     int32_t clientPid = IPCSkeleton::GetCallingPid();
4128     return AudioZoneService::GetInstance().EnableAudioZoneReport(clientPid, enable);
4129 }
4130 
EnableAudioZoneChangeReport(int32_t zoneId,bool enable)4131 int32_t AudioPolicyServer::EnableAudioZoneChangeReport(int32_t zoneId, bool enable)
4132 {
4133     CHECK_AND_RETURN_RET_LOG(zoneId > 0, ERR_INVALID_PARAM, "audio zone id is invalid");
4134     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4135     int32_t clientPid = IPCSkeleton::GetCallingPid();
4136     return AudioZoneService::GetInstance().EnableAudioZoneChangeReport(clientPid, zoneId, enable);
4137 }
4138 
AddUidToAudioZone(int32_t zoneId,int32_t uid)4139 int32_t AudioPolicyServer::AddUidToAudioZone(int32_t zoneId, int32_t uid)
4140 {
4141     CHECK_AND_RETURN_RET_LOG(zoneId > 0, ERR_INVALID_PARAM, "audio zone id is invalid");
4142     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4143     return AudioZoneService::GetInstance().AddUidToAudioZone(zoneId, uid);
4144 }
4145 
RemoveUidFromAudioZone(int32_t zoneId,int32_t uid)4146 int32_t AudioPolicyServer::RemoveUidFromAudioZone(int32_t zoneId, int32_t uid)
4147 {
4148     CHECK_AND_RETURN_RET_LOG(zoneId > 0, ERR_INVALID_PARAM, "audio zone id is invalid");
4149     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4150     return AudioZoneService::GetInstance().RemoveUidFromAudioZone(zoneId, uid);
4151 }
4152 
AddStreamToAudioZone(int32_t zoneId,const AudioZoneStream & stream)4153 int32_t AudioPolicyServer::AddStreamToAudioZone(int32_t zoneId, const AudioZoneStream &stream)
4154 {
4155     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4156     return AudioZoneService::GetInstance().AddStreamToAudioZone(zoneId, stream);
4157 }
4158 
AddStreamsToAudioZone(int32_t zoneId,const std::vector<AudioZoneStream> & streams)4159 int32_t AudioPolicyServer::AddStreamsToAudioZone(int32_t zoneId, const std::vector<AudioZoneStream> &streams)
4160 {
4161     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4162     return AudioZoneService::GetInstance().AddStreamsToAudioZone(zoneId, streams);
4163 }
4164 
RemoveStreamFromAudioZone(int32_t zoneId,const AudioZoneStream & stream)4165 int32_t AudioPolicyServer::RemoveStreamFromAudioZone(int32_t zoneId, const AudioZoneStream &stream)
4166 {
4167     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4168     return AudioZoneService::GetInstance().RemoveStreamFromAudioZone(zoneId, stream);
4169 }
4170 
RemoveStreamsFromAudioZone(int32_t zoneId,const std::vector<AudioZoneStream> & streams)4171 int32_t AudioPolicyServer::RemoveStreamsFromAudioZone(int32_t zoneId, const std::vector<AudioZoneStream> &streams)
4172 {
4173     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4174     return AudioZoneService::GetInstance().RemoveStreamsFromAudioZone(zoneId, streams);
4175 }
4176 
SetZoneDeviceVisible(bool visible)4177 int32_t AudioPolicyServer::SetZoneDeviceVisible(bool visible)
4178 {
4179     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4180     AudioZoneService::GetInstance().SetZoneDeviceVisible(visible);
4181     return SUCCESS;
4182 }
4183 
EnableSystemVolumeProxy(int32_t zoneId,bool enable)4184 int32_t AudioPolicyServer::EnableSystemVolumeProxy(int32_t zoneId, bool enable)
4185 {
4186     CHECK_AND_RETURN_RET_LOG(zoneId > 0, ERR_INVALID_PARAM, "audio zone id is invalid");
4187     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4188     int32_t clientPid = IPCSkeleton::GetCallingPid();
4189     return AudioZoneService::GetInstance().EnableSystemVolumeProxy(clientPid, zoneId, enable);
4190 }
4191 
GetAudioInterruptForZone(int32_t zoneId,std::vector<std::map<AudioInterrupt,int32_t>> & retList)4192 int32_t AudioPolicyServer::GetAudioInterruptForZone(int32_t zoneId,
4193     std::vector<std::map<AudioInterrupt, int32_t>> &retList)
4194 {
4195     CHECK_AND_RETURN_RET_LOG(zoneId > 0, ERR_INVALID_PARAM, "audio zone id is invalid");
4196     retList = ToIpcInterrupts(AudioZoneService::GetInstance().GetAudioInterruptForZone(zoneId));
4197     return SUCCESS;
4198 }
4199 
GetAudioInterruptForZone(int32_t zoneId,const std::string & deviceTag,std::vector<std::map<AudioInterrupt,int32_t>> & retList)4200 int32_t AudioPolicyServer::GetAudioInterruptForZone(int32_t zoneId, const std::string &deviceTag,
4201     std::vector<std::map<AudioInterrupt, int32_t>> &retList)
4202 {
4203     CHECK_AND_RETURN_RET_LOG(zoneId > 0, ERR_INVALID_PARAM, "audio zone id is invalid");
4204     retList = ToIpcInterrupts(AudioZoneService::GetInstance().GetAudioInterruptForZone(zoneId, deviceTag));
4205     return SUCCESS;
4206 }
4207 
4208 // LCOV_EXCL_START
EnableAudioZoneInterruptReport(int32_t zoneId,const std::string & deviceTag,bool enable)4209 int32_t AudioPolicyServer::EnableAudioZoneInterruptReport(int32_t zoneId, const std::string &deviceTag, bool enable)
4210 {
4211     CHECK_AND_RETURN_RET_LOG(zoneId > 0, ERR_INVALID_PARAM, "audio zone id is invalid");
4212     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4213     int32_t clientPid = IPCSkeleton::GetCallingPid();
4214     return AudioZoneService::GetInstance().EnableAudioZoneInterruptReport(clientPid, zoneId, deviceTag, enable);
4215 }
4216 
InjectInterruptToAudioZone(int32_t zoneId,const std::vector<std::map<AudioInterrupt,int32_t>> & interruptsIn)4217 int32_t AudioPolicyServer::InjectInterruptToAudioZone(int32_t zoneId,
4218     const std::vector<std::map<AudioInterrupt, int32_t>> &interruptsIn)
4219 {
4220     CHECK_AND_RETURN_RET_LOG(zoneId > 0, ERR_INVALID_PARAM, "audio zone id is invalid");
4221     size_t size = interruptsIn.size();
4222     CHECK_AND_RETURN_RET_LOG(size > 0 && size < MAX_SIZE, ERR_INVALID_PARAM,
4223         "invalid interrupt size: %{public}zu", size);
4224     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4225     auto interrupts = FromIpcInterrupts(interruptsIn);
4226     return AudioZoneService::GetInstance().InjectInterruptToAudioZone(zoneId, interrupts);
4227 }
4228 
InjectInterruptToAudioZone(int32_t zoneId,const std::string & deviceTag,const std::vector<std::map<AudioInterrupt,int32_t>> & interruptsIn)4229 int32_t AudioPolicyServer::InjectInterruptToAudioZone(int32_t zoneId, const std::string &deviceTag,
4230     const std::vector<std::map<AudioInterrupt, int32_t>> &interruptsIn)
4231 {
4232     CHECK_AND_RETURN_RET_LOG(zoneId > 0, ERR_INVALID_PARAM, "audio zone id is invalid");
4233     size_t size = interruptsIn.size();
4234     CHECK_AND_RETURN_RET_LOG(size > 0 && size < MAX_SIZE, ERR_INVALID_PARAM,
4235         "invalid interrupt size: %{public}zu", size);
4236     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "no system permission");
4237     auto interrupts = FromIpcInterrupts(interruptsIn);
4238     return AudioZoneService::GetInstance().InjectInterruptToAudioZone(zoneId, deviceTag, interrupts);
4239 }
4240 
SetCallDeviceActive(int32_t deviceTypeIn,bool active,const std::string & address,int32_t uid)4241 int32_t AudioPolicyServer::SetCallDeviceActive(int32_t deviceTypeIn, bool active,
4242     const std::string &address, int32_t uid)
4243 {
4244     InternalDeviceType deviceType = static_cast<InternalDeviceType>(deviceTypeIn);
4245     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
4246     if (!hasSystemPermission) {
4247         AUDIO_ERR_LOG("No system permission");
4248         return ERR_SYSTEM_PERMISSION_DENIED;
4249     }
4250     switch (deviceType) {
4251         case DeviceType::DEVICE_TYPE_EARPIECE:
4252         case DeviceType::DEVICE_TYPE_SPEAKER:
4253         case DeviceType::DEVICE_TYPE_BLUETOOTH_SCO:
4254             break;
4255         default:
4256             AUDIO_ERR_LOG("device=%{public}d not supported", deviceType);
4257             return ERR_NOT_SUPPORTED;
4258     }
4259     return eventEntry_->SetCallDeviceActive(deviceType, active, address, uid);
4260 }
4261 
GetActiveBluetoothDevice(std::shared_ptr<AudioDeviceDescriptor> & descs)4262 int32_t AudioPolicyServer::GetActiveBluetoothDevice(std::shared_ptr<AudioDeviceDescriptor> &descs)
4263 {
4264     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
4265     if (!hasSystemPermission) {
4266         AUDIO_ERR_LOG("No system permission");
4267         return ERR_PERMISSION_DENIED;
4268     }
4269 
4270     descs = eventEntry_->GetActiveBluetoothDevice();
4271 
4272     bool hasBTPermission = VerifyBluetoothPermission();
4273     if (!hasBTPermission) {
4274         CHECK_AND_RETURN_RET_LOG(descs != nullptr, ERROR, "descs is nullptr");
4275         descs->deviceName_ = "";
4276         descs->macAddress_ = "";
4277     }
4278 
4279     return SUCCESS;
4280 }
4281 
GetConverterConfig(ConverterConfig & cfg)4282 int32_t AudioPolicyServer::GetConverterConfig(ConverterConfig &cfg)
4283 {
4284     cfg = AudioConverterParser::GetInstance().LoadConfig();
4285     return SUCCESS;
4286 }
4287 
GetSpatializationSceneType(int32_t & type)4288 int32_t AudioPolicyServer::GetSpatializationSceneType(int32_t &type)
4289 {
4290     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
4291     if (!hasSystemPermission) {
4292         return ERR_PERMISSION_DENIED;
4293     }
4294     type = static_cast<int32_t>(audioSpatializationService_.GetSpatializationSceneType());
4295     return SUCCESS;
4296 }
4297 
SetSpatializationSceneType(int32_t spatializationSceneTypeIn)4298 int32_t AudioPolicyServer::SetSpatializationSceneType(int32_t spatializationSceneTypeIn)
4299 {
4300     AudioSpatializationSceneType spatializationSceneType =
4301         static_cast<AudioSpatializationSceneType>(spatializationSceneTypeIn);
4302     if (!VerifyPermission(MANAGE_SYSTEM_AUDIO_EFFECTS)) {
4303         AUDIO_ERR_LOG("MANAGE_SYSTEM_AUDIO_EFFECTS permission check failed");
4304         return ERR_PERMISSION_DENIED;
4305     }
4306     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
4307     if (!hasSystemPermission) {
4308         return ERR_PERMISSION_DENIED;
4309     }
4310     return audioSpatializationService_.SetSpatializationSceneType(spatializationSceneType);
4311 }
4312 
DisableSafeMediaVolume()4313 int32_t AudioPolicyServer::DisableSafeMediaVolume()
4314 {
4315     if (!VerifyPermission(MODIFY_AUDIO_SETTINGS_PERMISSION)) {
4316         AUDIO_ERR_LOG("MODIFY_AUDIO_SETTINGS_PERMISSION permission check failed");
4317         return ERR_PERMISSION_DENIED;
4318     }
4319     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
4320     if (!hasSystemPermission) {
4321         return ERR_SYSTEM_PERMISSION_DENIED;
4322     }
4323     return audioVolumeManager_.DisableSafeMediaVolume();
4324 }
4325 
GetApiTargetVersion()4326 int32_t AudioPolicyServer::GetApiTargetVersion()
4327 {
4328     AppExecFwk::BundleInfo bundleInfo = AudioBundleManager::GetBundleInfo();
4329 
4330     // Taking remainder of large integers
4331     int32_t apiTargetversion = bundleInfo.applicationInfo.apiTargetVersion % API_VERSION_REMAINDER;
4332     return apiTargetversion;
4333 }
4334 
IsHighResolutionExist(bool & ret)4335 int32_t AudioPolicyServer::IsHighResolutionExist(bool &ret)
4336 {
4337     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
4338     if (!hasSystemPermission) {
4339         AUDIO_ERR_LOG("No system permission");
4340         return ERR_PERMISSION_DENIED;
4341     }
4342     ret = isHighResolutionExist_;
4343     return SUCCESS;
4344 }
4345 
SetHighResolutionExist(bool highResExist)4346 int32_t AudioPolicyServer::SetHighResolutionExist(bool highResExist)
4347 {
4348     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
4349     if (!hasSystemPermission) {
4350         AUDIO_ERR_LOG("No system permission");
4351         return ERR_PERMISSION_DENIED;
4352     }
4353     isHighResolutionExist_ = highResExist;
4354     return SUCCESS;
4355 }
4356 // LCOV_EXCL_STOP
4357 
GetMaxAmplitude(int32_t deviceId,float & ret)4358 int32_t AudioPolicyServer::GetMaxAmplitude(int32_t deviceId, float &ret)
4359 {
4360     AudioInterrupt audioInterrupt;
4361     int32_t zoneID = 0;
4362     GetSessionInfoInFocus(audioInterrupt, zoneID);
4363     ret = audioActiveDevice_.GetMaxAmplitude(deviceId, audioInterrupt);
4364     return SUCCESS;
4365 }
4366 
IsHeadTrackingDataRequested(const std::string & macAddress,bool & ret)4367 int32_t AudioPolicyServer::IsHeadTrackingDataRequested(const std::string &macAddress, bool &ret)
4368 {
4369     ret = audioSpatializationService_.IsHeadTrackingDataRequested(macAddress);
4370     return SUCCESS;
4371 }
4372 
SetAudioDeviceRefinerCallback(const sptr<IRemoteObject> & object)4373 int32_t AudioPolicyServer::SetAudioDeviceRefinerCallback(const sptr<IRemoteObject> &object)
4374 {
4375     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM, "SetAudioDeviceRefinerCallback object is nullptr");
4376     auto callerUid = IPCSkeleton::GetCallingUid();
4377     if (callerUid != UID_AUDIO) {
4378         return ERROR;
4379     }
4380     return audioRouterCenter_.SetAudioDeviceRefinerCallback(object);
4381 }
4382 
UnsetAudioDeviceRefinerCallback()4383 int32_t AudioPolicyServer::UnsetAudioDeviceRefinerCallback()
4384 {
4385     auto callerUid = IPCSkeleton::GetCallingUid();
4386     if (callerUid != UID_AUDIO) {
4387         return ERROR;
4388     }
4389     return audioRouterCenter_.UnsetAudioDeviceRefinerCallback();
4390 }
4391 
TriggerFetchDevice(const AudioStreamDeviceChangeReasonExt & reason)4392 int32_t AudioPolicyServer::TriggerFetchDevice(const AudioStreamDeviceChangeReasonExt &reason)
4393 {
4394     auto callerUid = IPCSkeleton::GetCallingUid();
4395     if (callerUid != UID_AUDIO) {
4396         return ERROR;
4397     }
4398     CHECK_AND_RETURN_RET_LOG(eventEntry_ != nullptr, ERR_NULL_POINTER, "eventEntry_ is nullptr");
4399     return eventEntry_->TriggerFetchDevice(reason);
4400 }
4401 
SetPreferredDevice(int32_t preferredTypeIn,const std::shared_ptr<AudioDeviceDescriptor> & desc,int32_t uid)4402 int32_t AudioPolicyServer::SetPreferredDevice(int32_t preferredTypeIn,
4403     const std::shared_ptr<AudioDeviceDescriptor> &desc, int32_t uid)
4404 {
4405     PreferredType preferredType = static_cast<PreferredType>(preferredTypeIn);
4406     auto callerUid = IPCSkeleton::GetCallingUid();
4407     if (callerUid != UID_AUDIO) {
4408         AUDIO_ERR_LOG("No permission");
4409         return ERROR;
4410     }
4411     return audioPolicyUtils_.SetPreferredDevice(preferredType, desc, uid, "SetPreferredDevice");
4412 }
4413 
SetDeviceVolumeBehavior(const std::string & networkId,int32_t deviceType,const VolumeBehavior & volumeBehavior)4414 int32_t AudioPolicyServer::SetDeviceVolumeBehavior(const std::string &networkId, int32_t deviceType,
4415     const VolumeBehavior &volumeBehavior)
4416 {
4417     AUDIO_INFO_LOG("networkId [%{public}s], deviceType [%{public}d], isReady [%{public}d], "\
4418         "isVolumeControlDisabled [%{public}d], databaseVolumeName [%{public}s]", networkId.c_str(), deviceType,
4419         volumeBehavior.isReady, volumeBehavior.isVolumeControlDisabled, volumeBehavior.databaseVolumeName.c_str());
4420     auto callerUid = IPCSkeleton::GetCallingUid();
4421     if (callerUid != UID_AUDIO) {
4422         AUDIO_ERR_LOG("No permission");
4423         return ERR_PERMISSION_DENIED;
4424     }
4425 
4426     auto mediaDeviceList = audioRouterCenter_.FetchOutputDevices(STREAM_USAGE_MEDIA, -1,
4427         "SetDeviceVolumeBehavior_1", ROUTER_TYPE_USER_SELECT);
4428     CHECK_AND_RETURN_RET_LOG(!mediaDeviceList.empty(), ERROR, "mediaDeviceList is empty");
4429     std::shared_ptr<AudioDeviceDescriptor> newMediaDescriptor = mediaDeviceList.front();
4430     CHECK_AND_RETURN_RET_LOG(newMediaDescriptor != nullptr, ERROR, "newMediaDescriptor is nullptr");
4431 
4432     auto callDeviceList = audioRouterCenter_.FetchOutputDevices(STREAM_USAGE_VOICE_COMMUNICATION, -1,
4433         "SetDeviceVolumeBehavior_2", ROUTER_TYPE_USER_SELECT);
4434     CHECK_AND_RETURN_RET_LOG(!callDeviceList.empty(), ERROR, "callDeviceList is empty");
4435     std::shared_ptr<AudioDeviceDescriptor> newCallDescriptor = callDeviceList.front();
4436     CHECK_AND_RETURN_RET_LOG(newCallDescriptor != nullptr, ERROR, "newCallDescriptor is nullptr");
4437 
4438     DeviceType deviceTypeEnum = static_cast<DeviceType>(deviceType);
4439     if (networkId == newMediaDescriptor->networkId_ && deviceTypeEnum == newMediaDescriptor->deviceType_) {
4440         audioPolicyUtils_.SetPreferredDevice(AUDIO_MEDIA_RENDER, std::make_shared<AudioDeviceDescriptor>());
4441     }
4442     if (networkId == newCallDescriptor->networkId_ && deviceTypeEnum == newCallDescriptor->deviceType_) {
4443         audioPolicyUtils_.SetPreferredDevice(AUDIO_CALL_RENDER, std::make_shared<AudioDeviceDescriptor>(), SYSTEM_UID,
4444             "SetDeviceVolumeBehavior");
4445     }
4446     audioDeviceManager_.SetDeviceVolumeBehavior(networkId, deviceTypeEnum, volumeBehavior);
4447     return SUCCESS;
4448 }
4449 
SetAudioDeviceAnahsCallback(const sptr<IRemoteObject> & object)4450 int32_t AudioPolicyServer::SetAudioDeviceAnahsCallback(const sptr<IRemoteObject> &object)
4451 {
4452     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM, "SetAudioDeviceAnahsCallback object is nullptr");
4453     auto callerUid = IPCSkeleton::GetCallingUid();
4454     if (callerUid != UID_AUDIO) {
4455         return ERROR;
4456     }
4457     return coreService_->SetAudioDeviceAnahsCallback(object);
4458 }
4459 
UnsetAudioDeviceAnahsCallback()4460 int32_t AudioPolicyServer::UnsetAudioDeviceAnahsCallback()
4461 {
4462     auto callerUid = IPCSkeleton::GetCallingUid();
4463     if (callerUid != UID_AUDIO) {
4464         return ERROR;
4465     }
4466     return coreService_->UnsetAudioDeviceAnahsCallback();
4467 }
4468 
SendVolumeKeyEventToRssWhenAccountsChanged()4469 void AudioPolicyServer::SendVolumeKeyEventToRssWhenAccountsChanged()
4470 {
4471     AUDIO_INFO_LOG("Send VolumeKeyEvent to Rss");
4472     VolumeEvent volumeEvent;
4473     volumeEvent.volumeType = STREAM_MUSIC;
4474     volumeEvent.volume = GetSystemVolumeLevelInternal(STREAM_MUSIC);
4475     volumeEvent.updateUi = false;
4476     volumeEvent.notifyRssWhenAccountsChange = true;
4477     if (audioPolicyServerHandler_ != nullptr) {
4478         audioPolicyServerHandler_->SendVolumeKeyEventCallback(volumeEvent);
4479     }
4480 }
4481 
NotifyAccountsChanged(const int & id)4482 void AudioPolicyServer::NotifyAccountsChanged(const int &id)
4483 {
4484     CHECK_AND_RETURN_LOG(interruptService_ != nullptr, "interruptService_ is nullptr");
4485     interruptService_->ClearAudioFocusInfoListOnAccountsChanged(id);
4486     // Asynchronous clear audio focus infos
4487     usleep(WAIT_CLEAR_AUDIO_FOCUSINFOS_TIME_US);
4488     audioPolicyService_.NotifyAccountsChanged(id);
4489     SendVolumeKeyEventToRssWhenAccountsChanged();
4490     RegisterDefaultVolumeTypeListener();
4491 }
4492 
MoveToNewPipe(uint32_t sessionId,int32_t pipeType)4493 int32_t AudioPolicyServer::MoveToNewPipe(uint32_t sessionId, int32_t pipeType)
4494 {
4495     return audioOffloadStream_.MoveToNewPipe(sessionId, static_cast<AudioPipeType>(pipeType));
4496 }
4497 
CheckHibernateState(bool hibernate)4498 void AudioPolicyServer::CheckHibernateState(bool hibernate)
4499 {
4500     AudioServerProxy::GetInstance().CheckHibernateStateProxy(hibernate);
4501 }
4502 
UpdateSafeVolumeByS4()4503 void AudioPolicyServer::UpdateSafeVolumeByS4()
4504 {
4505     audioVolumeManager_.UpdateSafeVolumeByS4();
4506 }
4507 
CheckConnectedDevice()4508 void AudioPolicyServer::CheckConnectedDevice()
4509 {
4510     auto isUsbHeadsetConnected =
4511         audioConnectedDevice_.GetConnectedDeviceByType(DEVICE_TYPE_USB_HEADSET);
4512     auto isUsbArmHeadsetConnected =
4513         audioConnectedDevice_.GetConnectedDeviceByType(DEVICE_TYPE_USB_ARM_HEADSET);
4514 
4515     bool flag = (isUsbHeadsetConnected != nullptr || isUsbArmHeadsetConnected != nullptr) ? true : false;
4516     AudioServerProxy::GetInstance().SetDeviceConnectedFlag(flag);
4517 }
4518 
SetDeviceConnectedFlagFalseAfterDuration()4519 void AudioPolicyServer::SetDeviceConnectedFlagFalseAfterDuration()
4520 {
4521     usleep(DEVICE_CONNECTED_FLAG_DURATION_MS); // 3s
4522     AudioServerProxy::GetInstance().SetDeviceConnectedFlag(false);
4523 }
4524 
4525 // LCOV_EXCL_START
GetSupportedAudioEffectProperty(AudioEffectPropertyArrayV3 & propertyArray)4526 int32_t AudioPolicyServer::GetSupportedAudioEffectProperty(AudioEffectPropertyArrayV3 &propertyArray)
4527 {
4528     bool ret = PermissionUtil::VerifySystemPermission();
4529     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "No system permission");
4530     if (!VerifyPermission(MANAGE_SYSTEM_AUDIO_EFFECTS)) {
4531         AUDIO_ERR_LOG("MANAGE_SYSTEM_AUDIO_EFFECTS permission check failed");
4532         return ERR_PERMISSION_DENIED;
4533     }
4534     audioPolicyService_.GetSupportedAudioEffectProperty(propertyArray);
4535     size_t size = propertyArray.property.size();
4536     CHECK_AND_RETURN_RET_LOG(size <= AUDIO_EFFECT_COUNT_UPPER_LIMIT, ERROR,
4537         "get supported audio effect property size invalid.");
4538     return AUDIO_OK;
4539 }
4540 
SetAudioEffectProperty(const AudioEffectPropertyArrayV3 & propertyArray)4541 int32_t AudioPolicyServer::SetAudioEffectProperty(const AudioEffectPropertyArrayV3 &propertyArray)
4542 {
4543     size_t size = propertyArray.property.size();
4544     CHECK_AND_RETURN_RET_LOG(size > 0 && size <= AUDIO_EFFECT_COUNT_UPPER_LIMIT,
4545         ERROR_INVALID_PARAM, "set audio effect property array size invalid");
4546     bool ret = PermissionUtil::VerifySystemPermission();
4547     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "No system permission");
4548     if (!VerifyPermission(MANAGE_SYSTEM_AUDIO_EFFECTS)) {
4549         AUDIO_ERR_LOG("MANAGE_SYSTEM_AUDIO_EFFECTS permission check failed");
4550         return ERR_PERMISSION_DENIED;
4551     }
4552     return audioPolicyService_.SetAudioEffectProperty(propertyArray);
4553 }
4554 
GetAudioEffectProperty(AudioEffectPropertyArrayV3 & propertyArray)4555 int32_t AudioPolicyServer::GetAudioEffectProperty(AudioEffectPropertyArrayV3 &propertyArray)
4556 {
4557     bool ret = PermissionUtil::VerifySystemPermission();
4558     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "No system permission");
4559     if (!VerifyPermission(MANAGE_SYSTEM_AUDIO_EFFECTS)) {
4560         AUDIO_ERR_LOG("MANAGE_SYSTEM_AUDIO_EFFECTS permission check failed");
4561         return ERR_PERMISSION_DENIED;
4562     }
4563     int32_t res = audioPolicyService_.GetAudioEffectProperty(propertyArray);
4564     size_t size = propertyArray.property.size();
4565     CHECK_AND_RETURN_RET_LOG(size <= AUDIO_EFFECT_COUNT_UPPER_LIMIT, ERROR, "size invalid.");
4566     return res;
4567 }
4568 
GetSupportedAudioEffectProperty(AudioEffectPropertyArray & propertyArray)4569 int32_t AudioPolicyServer::GetSupportedAudioEffectProperty(AudioEffectPropertyArray &propertyArray)
4570 {
4571     bool ret = PermissionUtil::VerifySystemPermission();
4572     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "No system permission");
4573     int32_t res = audioPolicyService_.GetSupportedAudioEffectProperty(propertyArray);
4574     size_t size = propertyArray.property.size();
4575     CHECK_AND_RETURN_RET_LOG(size <= AUDIO_EFFECT_COUNT_UPPER_LIMIT, ERROR,
4576         "get supported audio effect property size invalid.");
4577     return res;
4578 }
4579 // LCOV_EXCL_STOP
4580 
GetSupportedAudioEnhanceProperty(AudioEnhancePropertyArray & propertyArray)4581 int32_t AudioPolicyServer::GetSupportedAudioEnhanceProperty(AudioEnhancePropertyArray &propertyArray)
4582 {
4583     bool ret = PermissionUtil::VerifySystemPermission();
4584     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "No system permission");
4585     int32_t res = audioPolicyService_.GetSupportedAudioEnhanceProperty(propertyArray);
4586     size_t size = propertyArray.property.size();
4587     CHECK_AND_RETURN_RET_LOG(size <= AUDIO_EFFECT_COUNT_UPPER_LIMIT, ERROR,
4588         "get supported audio effect property size invalid.");
4589     return res;
4590 }
4591 
GetAudioEnhanceProperty(AudioEnhancePropertyArray & propertyArray)4592 int32_t AudioPolicyServer::GetAudioEnhanceProperty(AudioEnhancePropertyArray &propertyArray)
4593 {
4594     bool ret = PermissionUtil::VerifySystemPermission();
4595     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "No system permission");
4596     return audioPolicyService_.GetAudioEnhanceProperty(propertyArray);
4597 }
4598 
SetAudioEnhanceProperty(const AudioEnhancePropertyArray & propertyArray)4599 int32_t AudioPolicyServer::SetAudioEnhanceProperty(const AudioEnhancePropertyArray &propertyArray)
4600 {
4601     size_t size = propertyArray.property.size();
4602     CHECK_AND_RETURN_RET_LOG(size > 0 && size <= AUDIO_EFFECT_COUNT_UPPER_LIMIT,
4603         ERROR_INVALID_PARAM, "set audio enhance property array size invalid");
4604     bool ret = PermissionUtil::VerifySystemPermission();
4605     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "No system permission");
4606     return audioPolicyService_.SetAudioEnhanceProperty(propertyArray);
4607 }
4608 
SetAudioEffectProperty(const AudioEffectPropertyArray & propertyArray)4609 int32_t AudioPolicyServer::SetAudioEffectProperty(const AudioEffectPropertyArray &propertyArray)
4610 {
4611     size_t size = propertyArray.property.size();
4612     CHECK_AND_RETURN_RET_LOG(size > 0 && size <= AUDIO_EFFECT_COUNT_UPPER_LIMIT,
4613         ERROR_INVALID_PARAM, "set audio effect property array size invalid");
4614     bool ret = PermissionUtil::VerifySystemPermission();
4615     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "No system permission");
4616     return audioPolicyService_.SetAudioEffectProperty(propertyArray);
4617 }
4618 
GetAudioEffectProperty(AudioEffectPropertyArray & propertyArray)4619 int32_t AudioPolicyServer::GetAudioEffectProperty(AudioEffectPropertyArray &propertyArray)
4620 {
4621     bool ret = PermissionUtil::VerifySystemPermission();
4622     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "No system permission");
4623     int32_t res = audioPolicyService_.GetAudioEffectProperty(propertyArray);
4624     size_t size = propertyArray.property.size();
4625     CHECK_AND_RETURN_RET_LOG(size <= AUDIO_EFFECT_COUNT_UPPER_LIMIT, ERROR, "size invalid.");
4626     return res;
4627 }
4628 
InjectInterruption(const std::string & networkId,const InterruptEvent & event)4629 int32_t AudioPolicyServer::InjectInterruption(const std::string &networkId, const InterruptEvent &event)
4630 {
4631     auto callerUid = IPCSkeleton::GetCallingUid();
4632     if (callerUid != UID_CAST_ENGINE_SA) {
4633         AUDIO_ERR_LOG("InjectInterruption callerUid is Error: not cast_engine");
4634         return ERROR;
4635     }
4636     CHECK_AND_RETURN_RET_LOG(audioPolicyServerHandler_ != nullptr, ERROR, "audioPolicyServerHandler_ is nullptr");
4637     std::set<int32_t> sessionIds =
4638         AudioStreamCollector::GetAudioStreamCollector().GetSessionIdsOnRemoteDeviceByDeviceType(
4639             DEVICE_TYPE_REMOTE_CAST);
4640 
4641     if (interruptService_ != nullptr) {
4642         std::set<int32_t> fakeSessionIds =
4643             interruptService_->GetStreamIdsForAudioSessionByDeviceType(0, DEVICE_TYPE_REMOTE_CAST);
4644         sessionIds.insert(fakeSessionIds.begin(), fakeSessionIds.end());
4645     }
4646 
4647     InterruptEventInternal interruptEvent { event.eventType, event.forceType, event.hintType, 0.2f};
4648     ProcessRemoteInterrupt(sessionIds, interruptEvent);
4649     return SUCCESS;
4650 }
4651 
CheckAudioSessionStrategy(const AudioSessionStrategy & sessionStrategy)4652 bool AudioPolicyServer::CheckAudioSessionStrategy(const AudioSessionStrategy &sessionStrategy)
4653 {
4654     bool result = false;
4655     switch (sessionStrategy.concurrencyMode) {
4656         case AudioConcurrencyMode::DEFAULT:
4657         case AudioConcurrencyMode::MIX_WITH_OTHERS:
4658         case AudioConcurrencyMode::DUCK_OTHERS:
4659         case AudioConcurrencyMode::PAUSE_OTHERS:
4660             result = true;
4661             break;
4662         default:
4663             AUDIO_ERR_LOG("Invalid concurrency mode: %{public}d!",
4664                 static_cast<int32_t>(sessionStrategy.concurrencyMode));
4665             result = false;
4666             break;
4667     }
4668     return result;
4669 }
4670 
ActivateAudioSession(int32_t strategyIn)4671 int32_t AudioPolicyServer::ActivateAudioSession(int32_t strategyIn)
4672 {
4673     AudioConcurrencyMode mode = static_cast<AudioConcurrencyMode>(strategyIn);
4674     AudioSessionStrategy strategy{mode};
4675     if (interruptService_ == nullptr) {
4676         AUDIO_ERR_LOG("interruptService_ is nullptr!");
4677         return ERR_UNKNOWN;
4678     }
4679 
4680     if (!CheckAudioSessionStrategy(strategy)) {
4681         AUDIO_ERR_LOG("The audio session strategy is invalid!");
4682         return ERR_INVALID_PARAM;
4683     }
4684 
4685     int32_t callerPid = IPCSkeleton::GetCallingPid();
4686     int32_t zoneId = AudioZoneService::GetInstance().FindAudioSessionZoneid(
4687         IPCSkeleton::GetCallingUid(), callerPid, true);
4688     AUDIO_INFO_LOG("activate audio session with concurrencyMode %{public}d for pid %{public}d, zoneId %{public}d",
4689         static_cast<int32_t>(strategy.concurrencyMode), callerPid, zoneId);
4690 
4691     bool isStandalone = StandaloneModeManager::GetInstance().CheckAndRecordStandaloneApp(
4692         IPCSkeleton::GetCallingUid(), true);
4693     int32_t ret = interruptService_->ActivateAudioSession(zoneId, callerPid, strategy, isStandalone);
4694     if ((ret == SUCCESS) && (interruptService_->IsSessionNeedToFetchOutputDevice(callerPid)) &&
4695         (eventEntry_ != nullptr)) {
4696         eventEntry_->FetchOutputDeviceAndRoute("ActivateAudioSession",
4697             AudioStreamDeviceChangeReasonExt::ExtEnum::SET_DEFAULT_OUTPUT_DEVICE);
4698     }
4699 
4700     if (audioPolicyServerHandler_ != nullptr) {
4701         audioPolicyServerHandler_->SendAudioSessionDeviceChange(
4702             AudioStreamDeviceChangeReason::AUDIO_SESSION_ACTIVATE, callerPid);
4703     }
4704 
4705     return ret;
4706 }
4707 
DeactivateAudioSession()4708 int32_t AudioPolicyServer::DeactivateAudioSession()
4709 {
4710     if (interruptService_ == nullptr) {
4711         AUDIO_ERR_LOG("interruptService_ is nullptr!");
4712         return ERR_UNKNOWN;
4713     }
4714     int32_t callerPid = IPCSkeleton::GetCallingPid();
4715     int32_t zoneId = AudioZoneService::GetInstance().FindAudioSessionZoneid(
4716         IPCSkeleton::GetCallingUid(), callerPid, false);
4717     AUDIO_INFO_LOG("deactivate audio session for pid %{public}d, zoneId %{public}d", callerPid, zoneId);
4718     return interruptService_->DeactivateAudioSession(zoneId, callerPid);
4719 }
4720 
IsAudioSessionActivated(bool & isActive)4721 int32_t AudioPolicyServer::IsAudioSessionActivated(bool &isActive)
4722 {
4723     if (interruptService_ == nullptr) {
4724         AUDIO_ERR_LOG("interruptService_ is nullptr!");
4725         isActive = false;
4726         return ERR_MEMORY_ALLOC_FAILED;
4727     }
4728     int32_t callerPid = IPCSkeleton::GetCallingPid();
4729     isActive = interruptService_->IsAudioSessionActivated(callerPid);
4730     AUDIO_INFO_LOG("callerPid %{public}d, isSessionActive: %{public}d.", callerPid, isActive);
4731     return SUCCESS;
4732 }
4733 
SetAudioSessionScene(int32_t audioSessionScene)4734 int32_t AudioPolicyServer::SetAudioSessionScene(int32_t audioSessionScene)
4735 {
4736     if (interruptService_ == nullptr) {
4737         AUDIO_ERR_LOG("interruptService_ is nullptr!");
4738         return ERR_UNKNOWN;
4739     }
4740     int32_t callerPid = IPCSkeleton::GetCallingPid();
4741     return interruptService_->SetAudioSessionScene(callerPid, static_cast<AudioSessionScene>(audioSessionScene));
4742 }
4743 
GetDefaultOutputDevice(int32_t & deviceType)4744 int32_t AudioPolicyServer::GetDefaultOutputDevice(int32_t &deviceType)
4745 {
4746     if (eventEntry_ == nullptr) {
4747         AUDIO_ERR_LOG("eventEntry_ is nullptr!");
4748         return ERR_UNKNOWN;
4749     }
4750 
4751     DeviceType deviceTypeOut = DEVICE_TYPE_NONE;
4752     int32_t callerPid = IPCSkeleton::GetCallingPid();
4753     int32_t ret = eventEntry_->GetSessionDefaultOutputDevice(callerPid, deviceTypeOut);
4754     deviceType = static_cast<int32_t>(deviceTypeOut);
4755     return ret;
4756 }
4757 
SetDefaultOutputDevice(int32_t deviceType)4758 int32_t AudioPolicyServer::SetDefaultOutputDevice(int32_t deviceType)
4759 {
4760     if ((eventEntry_ == nullptr) || (interruptService_ == nullptr)) {
4761         AUDIO_ERR_LOG("eventEntry_ or interruptService_ is nullptr!");
4762         return ERR_UNKNOWN;
4763     }
4764 
4765     int32_t callerPid = IPCSkeleton::GetCallingPid();
4766     int32_t ret = eventEntry_->SetSessionDefaultOutputDevice(callerPid, static_cast<DeviceType>(deviceType));
4767     if ((ret == SUCCESS) && (interruptService_->IsSessionNeedToFetchOutputDevice(callerPid))) {
4768         eventEntry_->FetchOutputDeviceAndRoute("SetDefaultOutputDevice",
4769             AudioStreamDeviceChangeReasonExt::ExtEnum::SET_DEFAULT_OUTPUT_DEVICE);
4770     }
4771 
4772     return ret;
4773 }
4774 
LoadSplitModule(const std::string & splitArgs,const std::string & networkId)4775 int32_t AudioPolicyServer::LoadSplitModule(const std::string &splitArgs, const std::string &networkId)
4776 {
4777     auto callerUid = IPCSkeleton::GetCallingUid();
4778     if (callerUid != UID_CAR_DISTRIBUTED_ENGINE_SA) {
4779         AUDIO_ERR_LOG("callerUid %{public}d is not allow LoadSplitModule", callerUid);
4780         return ERR_PERMISSION_DENIED;
4781     }
4782     return eventEntry_->LoadSplitModule(splitArgs, networkId);
4783 }
4784 
IsAllowedPlayback(int32_t uid,int32_t pid,bool & isAllowed)4785 int32_t AudioPolicyServer::IsAllowedPlayback(int32_t uid, int32_t pid, bool &isAllowed)
4786 {
4787     auto callerUid = IPCSkeleton::GetCallingUid();
4788     if (callerUid != MEDIA_SERVICE_UID) {
4789         auto callerPid = IPCSkeleton::GetCallingPid();
4790         isAllowed = audioBackgroundManager_.IsAllowedPlayback(callerUid, callerPid);
4791         return SUCCESS;
4792     }
4793     isAllowed = audioBackgroundManager_.IsAllowedPlayback(uid, pid);
4794     return SUCCESS;
4795 }
4796 
SetVoiceRingtoneMute(bool isMute)4797 int32_t AudioPolicyServer::SetVoiceRingtoneMute(bool isMute)
4798 {
4799     constexpr int32_t foundationUid = 5523; // "uid" : "foundation"
4800     auto callerUid = IPCSkeleton::GetCallingUid();
4801     // This function can only be used by foundation
4802     CHECK_AND_RETURN_RET_LOG(callerUid == foundationUid, ERROR,
4803         "SetVoiceRingtoneMute callerUid is error: not foundation");
4804     AUDIO_INFO_LOG("Set VoiceRingtone is %{public}d", isMute);
4805     return audioVolumeManager_.SetVoiceRingtoneMute(isMute);
4806 }
4807 
NotifySessionStateChange(int32_t uid,int32_t pid,bool hasSession)4808 int32_t AudioPolicyServer::NotifySessionStateChange(int32_t uid, int32_t pid, bool hasSession)
4809 {
4810     AUDIO_INFO_LOG("UID:%{public}d, PID:%{public}d, Session State: %{public}d", uid, pid, hasSession);
4811     auto callerUid = IPCSkeleton::GetCallingUid();
4812     // This function can only be used by av_session
4813     CHECK_AND_RETURN_RET_LOG(callerUid == UID_AVSESSION_SERVICE, ERROR,
4814         "NotifySessionStateChange callerUid is error: not av_session");
4815     return audioBackgroundManager_.NotifySessionStateChange(uid, pid, hasSession);
4816 }
4817 
NotifyFreezeStateChange(const std::set<int32_t> & pidList,bool isFreeze)4818 int32_t AudioPolicyServer::NotifyFreezeStateChange(const std::set<int32_t> &pidList, bool isFreeze)
4819 {
4820     constexpr size_t size = 100;
4821     CHECK_AND_RETURN_RET_LOG(pidList.size() <= size, ERROR, "pidList more than 100.");
4822     AUDIO_INFO_LOG("In");
4823     auto callerUid = IPCSkeleton::GetCallingUid();
4824     // This function can only be used by RSS
4825     CHECK_AND_RETURN_RET_LOG(callerUid == UID_RESOURCE_SCHEDULE_SERVICE, ERROR,
4826         "NotifyFreezeStateChange callerUid is error: not RSS");
4827     return audioBackgroundManager_.NotifyFreezeStateChange(pidList, isFreeze);
4828 }
4829 
ResetAllProxy()4830 int32_t AudioPolicyServer::ResetAllProxy()
4831 {
4832     AUDIO_INFO_LOG("In");
4833     auto callerUid = IPCSkeleton::GetCallingUid();
4834     // This function can only be used by RSS
4835     CHECK_AND_RETURN_RET_LOG(callerUid == UID_RESOURCE_SCHEDULE_SERVICE, ERROR,
4836         "ResetAllProxy callerUid is error: not RSS");
4837     return audioBackgroundManager_.ResetAllProxy();
4838 }
4839 
NotifyProcessBackgroundState(int32_t uid,int32_t pid)4840 int32_t AudioPolicyServer::NotifyProcessBackgroundState(int32_t uid, int32_t pid)
4841 {
4842     AUDIO_INFO_LOG("In");
4843     bool ret = PermissionUtil::VerifySystemPermission();
4844     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
4845     audioBackgroundManager_.NotifyAppStateChange(uid, pid, STATE_BACKGROUND);
4846     return SUCCESS;
4847 }
4848 
SetVirtualCall(bool isVirtual)4849 int32_t AudioPolicyServer::SetVirtualCall(bool isVirtual)
4850 {
4851     constexpr int32_t meetServiceUid = 5523; // "uid" : "meetservice"
4852     auto callerUid = IPCSkeleton::GetCallingUid();
4853     // This function can only be used by meetservice
4854     CHECK_AND_RETURN_RET_LOG(callerUid == meetServiceUid, ERROR,
4855         "SetVirtualCall callerUid is error: not meetservice");
4856     AUDIO_INFO_LOG("Set VirtualCall is %{public}d", isVirtual);
4857     return audioDeviceCommon_.SetVirtualCall(callerUid, isVirtual);
4858 }
4859 
SetDeviceConnectionStatus(const std::shared_ptr<AudioDeviceDescriptor> & desc,bool isConnected)4860 int32_t AudioPolicyServer::SetDeviceConnectionStatus(const std::shared_ptr<AudioDeviceDescriptor> &desc,
4861     bool isConnected)
4862 {
4863     AUDIO_INFO_LOG("deviceType: %{public}d, deviceRole: %{public}d, isConnected: %{public}d",
4864         desc->deviceType_, desc->deviceRole_, isConnected);
4865 
4866     std::vector<uid_t> allowedUids = {
4867         UID_TV_PROCESS_SA, UID_DP_PROCESS_SA, UID_PENCIL_PROCESS_SA, UID_NEARLINK_SA, UID_BLUETOOTH_SA
4868     };
4869     CHECK_AND_RETURN_RET_LOG(PermissionUtil::CheckCallingUidPermission(allowedUids), ERR_PERMISSION_DENIED,
4870         "uid permission denied");
4871 
4872     bool ret = VerifyPermission(MANAGE_AUDIO_CONFIG);
4873     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "MANAGE_AUDIO_CONFIG permission denied");
4874 
4875     eventEntry_->OnDeviceStatusUpdated(*desc, isConnected);
4876     return SUCCESS;
4877 }
4878 
SetQueryAllowedPlaybackCallback(const sptr<IRemoteObject> & object)4879 int32_t AudioPolicyServer::SetQueryAllowedPlaybackCallback(const sptr<IRemoteObject> &object)
4880 {
4881     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_NULL_OBJECT, "object is null");
4882     auto callerUid = IPCSkeleton::GetCallingUid();
4883     // This function can only be used by av_session
4884     CHECK_AND_RETURN_RET_LOG(callerUid == UID_AVSESSION_SERVICE, ERROR,
4885         "SetQueryAllowedPlaybackCallback callerUid is error: not av_session");
4886     return audioBackgroundManager_.SetQueryAllowedPlaybackCallback(object);
4887 }
4888 
SetBackgroundMuteCallback(const sptr<IRemoteObject> & object)4889 int32_t AudioPolicyServer::SetBackgroundMuteCallback(const sptr<IRemoteObject> &object)
4890 {
4891     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_NULL_OBJECT, "object is null");
4892     auto callerUid = IPCSkeleton::GetCallingUid();
4893     // This function can only be used by media_service
4894     CHECK_AND_RETURN_RET_LOG(callerUid == MEDIA_SERVICE_UID, ERROR,
4895         "SetBackgroundMuteCallback callerUid is error: not media_service");
4896     return audioBackgroundManager_.SetBackgroundMuteCallback(object);
4897 }
4898 
GetDirectPlaybackSupport(const AudioStreamInfo & streamInfo,int32_t streamUsage,int32_t & retMod)4899 int32_t AudioPolicyServer::GetDirectPlaybackSupport(const AudioStreamInfo &streamInfo,
4900     int32_t streamUsage, int32_t &retMod)
4901 {
4902     retMod = coreService_->GetDirectPlaybackSupport(streamInfo, static_cast<StreamUsage>(streamUsage));
4903     return SUCCESS;
4904 }
4905 
GetMaxVolumeLevelByUsage(int32_t streamUsage,int32_t & retMaxVolumeLevel)4906 int32_t AudioPolicyServer::GetMaxVolumeLevelByUsage(int32_t streamUsage, int32_t &retMaxVolumeLevel)
4907 {
4908     CHECK_AND_RETURN_RET_LOG(streamUsage >= STREAM_USAGE_UNKNOWN && streamUsage <= STREAM_USAGE_MAX,
4909         ERR_INVALID_PARAM, "GetMaxVolumeLevelByUsage: Invalid streamUsage");
4910     int32_t volumeType = static_cast<int32_t>(VolumeUtils::GetVolumeTypeFromStreamUsage(
4911         static_cast<StreamUsage>(streamUsage)));
4912     GetMaxVolumeLevel(volumeType, retMaxVolumeLevel);
4913     return SUCCESS;
4914 }
4915 
GetMinVolumeLevelByUsage(int32_t streamUsage,int32_t & retMinVolumeLevel)4916 int32_t AudioPolicyServer::GetMinVolumeLevelByUsage(int32_t streamUsage, int32_t &retMinVolumeLevel)
4917 {
4918     CHECK_AND_RETURN_RET_LOG(streamUsage >= STREAM_USAGE_UNKNOWN && streamUsage <= STREAM_USAGE_MAX,
4919         ERR_INVALID_PARAM, "GetMinVolumeLevelByUsage: Invalid streamUsage");
4920     int32_t volumeType = static_cast<int32_t>(VolumeUtils::GetVolumeTypeFromStreamUsage(
4921         static_cast<StreamUsage>(streamUsage)));
4922     GetMinVolumeLevel(volumeType, retMinVolumeLevel);
4923     return SUCCESS;
4924 }
4925 
GetVolumeLevelByUsage(int32_t streamUsage,int32_t & retVolumeLevel)4926 int32_t AudioPolicyServer::GetVolumeLevelByUsage(int32_t streamUsage, int32_t &retVolumeLevel)
4927 {
4928     CHECK_AND_RETURN_RET_LOG(streamUsage >= STREAM_USAGE_UNKNOWN && streamUsage <= STREAM_USAGE_MAX,
4929         ERR_INVALID_PARAM, "GetVolumeLevelByUsage: Invalid streamUsage");
4930     int32_t volumeType = static_cast<int32_t>(VolumeUtils::GetVolumeTypeFromStreamUsage(
4931         static_cast<StreamUsage>(streamUsage)));
4932     GetSystemVolumeLevel(volumeType, DEFAULT_UID, retVolumeLevel);
4933     return SUCCESS;
4934 }
4935 
GetStreamMuteByUsage(int32_t streamUsage,bool & isMute)4936 int32_t AudioPolicyServer::GetStreamMuteByUsage(int32_t streamUsage, bool &isMute)
4937 {
4938     CHECK_AND_RETURN_RET_LOG(streamUsage >= STREAM_USAGE_UNKNOWN && streamUsage <= STREAM_USAGE_MAX,
4939         ERR_INVALID_PARAM, "GetStreamMuteByUsage: Invalid streamUsage");
4940     int32_t volumeType = static_cast<int32_t>(VolumeUtils::GetVolumeTypeFromStreamUsage(
4941         static_cast<StreamUsage>(streamUsage)));
4942     GetStreamMute(volumeType, isMute);
4943     return SUCCESS;
4944 }
4945 
GetVolumeInDbByStream(int32_t streamUsageIn,int32_t volumeLevel,int32_t deviceType,float & ret)4946 int32_t AudioPolicyServer::GetVolumeInDbByStream(int32_t streamUsageIn, int32_t volumeLevel,
4947     int32_t deviceType, float &ret)
4948 {
4949     StreamUsage streamUsage = static_cast<StreamUsage>(streamUsageIn);
4950     CHECK_AND_RETURN_RET_LOG(streamUsage >= STREAM_USAGE_UNKNOWN && streamUsage <= STREAM_USAGE_MAX,
4951         ERR_INVALID_PARAM, "GetVolumeInDbByStream: Invalid streamUsage");
4952     return GetSystemVolumeInDb(VolumeUtils::GetVolumeTypeFromStreamUsage(streamUsage), volumeLevel, deviceType, ret);
4953 }
4954 
GetSupportedAudioVolumeTypes(std::vector<int32_t> & ret)4955 int32_t AudioPolicyServer::GetSupportedAudioVolumeTypes(std::vector<int32_t> &ret)
4956 {
4957     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "No system permission");
4958 
4959     std::vector<AudioVolumeType> out = VolumeUtils::GetSupportedAudioVolumeTypes();
4960     ret.clear();
4961     for (auto &item : out) {
4962         ret.push_back(static_cast<int32_t>(item));
4963     }
4964     return SUCCESS;
4965 }
4966 
GetAudioVolumeTypeByStreamUsage(int32_t streamUsageIn,int32_t & ret)4967 int32_t AudioPolicyServer::GetAudioVolumeTypeByStreamUsage(int32_t streamUsageIn, int32_t &ret)
4968 {
4969     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "No system permission");
4970 
4971     StreamUsage streamUsage = static_cast<StreamUsage>(streamUsageIn);
4972     ret = static_cast<int32_t>(VolumeUtils::GetVolumeTypeFromStreamUsage(streamUsage));
4973     return SUCCESS;
4974 }
4975 
GetStreamUsagesByVolumeType(int32_t audioVolumeTypeIn,std::vector<int32_t> & ret)4976 int32_t AudioPolicyServer::GetStreamUsagesByVolumeType(int32_t audioVolumeTypeIn, std::vector<int32_t> &ret)
4977 {
4978     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "No system permission");
4979 
4980     AudioVolumeType audioVolumeType = static_cast<AudioVolumeType>(audioVolumeTypeIn);
4981     std::vector<StreamUsage> out = VolumeUtils::GetStreamUsagesByVolumeType(audioVolumeType);
4982 
4983     ret.clear();
4984     for (auto &item : out) {
4985         ret.push_back(static_cast<int32_t>(item));
4986     }
4987     return SUCCESS;
4988 }
4989 
SetCallbackStreamUsageInfo(const std::set<int32_t> & streamUsages)4990 int32_t AudioPolicyServer::SetCallbackStreamUsageInfo(const std::set<int32_t> &streamUsages)
4991 {
4992     size_t size = streamUsages.size();
4993     CHECK_AND_RETURN_RET_LOG(size <= MAX_STREAM_USAGE_COUNT, ERR_INVALID_PARAM, "size upper limit.");
4994     std::set<StreamUsage> streamUsagesTmp;
4995     for (auto streamUsage : streamUsages) {
4996         CHECK_AND_RETURN_RET_LOG(streamUsage >= STREAM_USAGE_UNKNOWN && streamUsage <= STREAM_USAGE_MAX,
4997             ERR_INVALID_PARAM, "streamUsage is invalid.");
4998         streamUsagesTmp.insert(static_cast<StreamUsage>(streamUsage));
4999     }
5000 
5001     if (audioPolicyServerHandler_ != nullptr) {
5002         return audioPolicyServerHandler_->SetCallbackStreamUsageInfo(streamUsagesTmp);
5003     } else {
5004         AUDIO_ERR_LOG("audioPolicyServerHandler_ is nullptr");
5005         return AUDIO_ERR;
5006     }
5007 }
5008 
ForceStopAudioStream(int32_t audioTypeIn)5009 int32_t AudioPolicyServer::ForceStopAudioStream(int32_t audioTypeIn)
5010 {
5011     StopAudioType audioType = static_cast<StopAudioType>(audioTypeIn);
5012     CHECK_AND_RETURN_RET_LOG(audioType >= STOP_ALL && audioType <= STOP_RECORD,
5013         ERR_INVALID_PARAM, "Invalid audioType");
5014     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "No system permission");
5015 #ifdef AUDIO_BUILD_VARIANT_ROOT
5016     // root user case for auto test
5017     CHECK_AND_RETURN_RET_LOG(static_cast<uid_t>(IPCSkeleton::GetCallingUid()) == ROOT_UID,
5018         ERR_PERMISSION_DENIED, "not root user");
5019 #else
5020     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifyPermission(HIVIEWCARE_PERMISSION,
5021         IPCSkeleton::GetCallingTokenID()), ERR_PERMISSION_DENIED, "not hiviewcare");
5022 #endif
5023     AUDIO_INFO_LOG("stop audio stream, type:%{public}d", audioType);
5024     return AudioServerProxy::GetInstance().ForceStopAudioStreamProxy(audioType);
5025 }
5026 
IsCapturerFocusAvailable(const AudioCapturerInfo & capturerInfo,bool & ret)5027 int32_t AudioPolicyServer::IsCapturerFocusAvailable(const AudioCapturerInfo &capturerInfo, bool &ret)
5028 {
5029     CHECK_AND_RETURN_RET_LOG(interruptService_ != nullptr, ERROR, "interruptService_ is nullptr");
5030     int32_t zoneId = AudioZoneService::GetInstance().FindAudioZoneByUid(IPCSkeleton::GetCallingUid());
5031     ret = interruptService_->IsCapturerFocusAvailable(zoneId, capturerInfo);
5032     return SUCCESS;
5033 }
5034 
ForceVolumeKeyControlType(int32_t volumeType,int32_t duration,int32_t & ret)5035 int32_t AudioPolicyServer::ForceVolumeKeyControlType(int32_t volumeType, int32_t duration, int32_t &ret)
5036 {
5037     CHECK_AND_RETURN_RET_LOG(VerifyPermission(MODIFY_AUDIO_SETTINGS_PERMISSION), ERR_PERMISSION_DENIED,
5038         "MODIFY_AUDIO_SETTINGS_PERMISSION permission check failed");
5039     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(),
5040         ERR_SYSTEM_PERMISSION_DENIED, "no system permission");
5041     ret = audioVolumeManager_.ForceVolumeKeyControlType(static_cast<AudioVolumeType>(volumeType), duration);
5042     return SUCCESS;
5043 }
5044 
UpdateDefaultOutputDeviceWhenStarting(const uint32_t sessionID)5045 void AudioPolicyServer::UpdateDefaultOutputDeviceWhenStarting(const uint32_t sessionID)
5046 {
5047     audioDeviceManager_.UpdateDefaultOutputDeviceWhenStarting(sessionID);
5048     TriggerFetchDevice(AudioStreamDeviceChangeReasonExt());
5049 }
5050 
UpdateDefaultOutputDeviceWhenStopping(const uint32_t sessionID)5051 void AudioPolicyServer::UpdateDefaultOutputDeviceWhenStopping(const uint32_t sessionID)
5052 {
5053     audioDeviceManager_.UpdateDefaultOutputDeviceWhenStopping(sessionID);
5054     TriggerFetchDevice(AudioStreamDeviceChangeReasonExt());
5055 }
5056 
IsAcousticEchoCancelerSupported(int32_t sourceType,bool & ret)5057 int32_t AudioPolicyServer::IsAcousticEchoCancelerSupported(int32_t sourceType, bool &ret)
5058 {
5059     ret = AudioServerProxy::GetInstance().IsAcousticEchoCancelerSupported(static_cast<SourceType>(sourceType));
5060     return SUCCESS;
5061 }
5062 
5063 
SetKaraokeParameters(const std::string & parameters,bool & ret)5064 int32_t AudioPolicyServer::SetKaraokeParameters(const std::string &parameters, bool &ret)
5065 {
5066     ret = AudioServerProxy::GetInstance().SetKaraokeParameters(parameters);
5067     return SUCCESS;
5068 }
5069 
IsAudioLoopbackSupported(int32_t modeIn,bool & ret)5070 int32_t AudioPolicyServer::IsAudioLoopbackSupported(int32_t modeIn, bool &ret)
5071 {
5072     AudioLoopbackMode mode = static_cast<AudioLoopbackMode>(modeIn);
5073     ret = AudioServerProxy::GetInstance().IsAudioLoopbackSupported(mode);
5074     return SUCCESS;
5075 }
5076 
UpdateDeviceInfo(const std::shared_ptr<AudioDeviceDescriptor> & deviceDesc,int32_t command)5077 int32_t AudioPolicyServer::UpdateDeviceInfo(const std::shared_ptr<AudioDeviceDescriptor> &deviceDesc, int32_t command)
5078 {
5079     std::vector<uid_t> allowedUids = { UID_NEARLINK_SA };
5080     CHECK_AND_RETURN_RET_LOG(PermissionUtil::CheckCallingUidPermission(allowedUids), ERR_PERMISSION_DENIED,
5081         "uid permission denied");
5082 
5083     CHECK_AND_RETURN_RET_LOG(deviceDesc != nullptr, ERR_INVALID_PARAM, "deviceDesc is nullptr");
5084 
5085     eventEntry_->OnDeviceInfoUpdated(*deviceDesc, static_cast<DeviceInfoUpdateCommand>(command));
5086     return SUCCESS;
5087 }
5088 
SetSleAudioOperationCallback(const sptr<IRemoteObject> & object)5089 int32_t AudioPolicyServer::SetSleAudioOperationCallback(const sptr<IRemoteObject> &object)
5090 {
5091     CHECK_AND_RETURN_RET_LOG(object != nullptr, ERR_INVALID_PARAM, "object is nullptr");
5092 
5093     bool ret = PermissionUtil::VerifyIsAudio();
5094     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "Uid Check Failed");
5095 
5096     return audioPolicyService_.SetSleAudioOperationCallback(object);
5097 }
5098 
SetCollaborativePlaybackEnabledForDevice(const std::shared_ptr<AudioDeviceDescriptor> & selectedAudioDevice,bool enabled)5099 int32_t AudioPolicyServer::SetCollaborativePlaybackEnabledForDevice(
5100     const std::shared_ptr<AudioDeviceDescriptor> &selectedAudioDevice, bool enabled)
5101 {
5102     CHECK_AND_RETURN_RET_LOG(PermissionUtil::VerifySystemPermission(), ERR_PERMISSION_DENIED, "No system permission");
5103     return audioCollaborativeService_.SetCollaborativePlaybackEnabledForDevice(selectedAudioDevice, enabled);
5104 }
5105 
IsCollaborativePlaybackSupported(bool & ret)5106 int32_t AudioPolicyServer::IsCollaborativePlaybackSupported(bool &ret)
5107 {
5108     if (!PermissionUtil::VerifySystemPermission()) {
5109         ret = false;
5110         AUDIO_ERR_LOG("No system permission");
5111         return ERR_PERMISSION_DENIED;
5112     }
5113     ret = audioCollaborativeService_.IsCollaborativePlaybackSupported();
5114     return SUCCESS;
5115 }
5116 
IsCollaborativePlaybackEnabledForDevice(const std::shared_ptr<AudioDeviceDescriptor> & selectedAudioDevice,bool & enabled)5117 int32_t AudioPolicyServer::IsCollaborativePlaybackEnabledForDevice(
5118     const std::shared_ptr<AudioDeviceDescriptor> &selectedAudioDevice, bool &enabled)
5119 {
5120     if (!PermissionUtil::VerifySystemPermission()) {
5121         enabled = false;
5122         AUDIO_ERR_LOG("No system permission");
5123         return ERR_PERMISSION_DENIED;
5124     }
5125     enabled = audioCollaborativeService_.IsCollaborativePlaybackEnabledForDevice(selectedAudioDevice);
5126     return SUCCESS;
5127 }
5128 
CallRingtoneLibrary()5129 int32_t AudioPolicyServer::CallRingtoneLibrary()
5130 {
5131     Trace trace("AudioPolicyServer::CallRingtoneLibrary");
5132     AUDIO_INFO_LOG("Enter CallRingtoneLibrary");
5133     auto saManager = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
5134     CHECK_AND_RETURN_RET_LOG(saManager != nullptr, ERROR, "Get system ability manager failed.");
5135 
5136     AudioXCollie audioXCollie("CallRingtoneLibrary::start", DATASHARE_SERVICE_TIMEOUT_SECONDS,
5137         [](void *) {
5138             AUDIO_ERR_LOG("CallRingtoneLibrary timeout");
5139         }, nullptr, AUDIO_XCOLLIE_FLAG_LOG);
5140 
5141     auto remoteObj = saManager->GetSystemAbility(STORAGE_MANAGER_MANAGER_ID);
5142     CHECK_AND_RETURN_RET_LOG(remoteObj != nullptr, ERROR, "Get system ability failed.");
5143 
5144     auto dataShareHelper = DataShare::DataShareHelper::Creator(remoteObj, "datashare:///ringtone", "",
5145         DATASHARE_SERVICE_TIMEOUT_SECONDS);
5146     CHECK_AND_RETURN_RET_LOG(dataShareHelper != nullptr, ERROR, "Create dataShare failed, datashare or library error.");
5147     dataShareHelper->Release();
5148     return SUCCESS;
5149 }
5150 
SetSystemVolumeDegree(int32_t streamTypeIn,int32_t volumeDegree,int32_t volumeFlag,int32_t uid)5151 int32_t AudioPolicyServer::SetSystemVolumeDegree(int32_t streamTypeIn, int32_t volumeDegree, int32_t volumeFlag,
5152     int32_t uid)
5153 {
5154     AudioStreamType streamType = static_cast<AudioStreamType>(streamTypeIn);
5155     if (!PermissionUtil::VerifySystemPermission()) {
5156         AUDIO_ERR_LOG("No system permission");
5157         return ERR_PERMISSION_DENIED;
5158     }
5159 
5160     if (!IsVolumeTypeValid(streamType)) {
5161         return ERR_NOT_SUPPORTED;
5162     }
5163 
5164     bool adjustable = false;
5165     IsVolumeUnadjustable(adjustable);
5166     if (adjustable) {
5167         AUDIO_ERR_LOG("Unadjustable device, not allow set degree");
5168         return ERR_OPERATION_FAILED;
5169     }
5170     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
5171     bool flag = volumeFlag == VolumeFlag::FLAG_SHOW_SYSTEM_UI;
5172     int32_t volumeLevel = VolumeUtils::VolumeDegreeToLevel(volumeDegree);
5173     int32_t callingUid =  uid != 0 ? uid : IPCSkeleton::GetCallingUid();
5174     int32_t zoneId = AudioZoneService::GetInstance().FindAudioZoneByUid(callingUid);
5175     SetSystemVolumeLevelInternal(streamType, volumeLevel, flag, zoneId);
5176 
5177     return SetSystemVolumeDegreeInner(streamType, volumeDegree, flag, uid);
5178 }
5179 
SetSystemVolumeDegreeInner(AudioStreamType streamType,int32_t volumeDegree,bool volumeFlag,int32_t uid)5180 int32_t AudioPolicyServer::SetSystemVolumeDegreeInner(AudioStreamType streamType, int32_t volumeDegree,
5181     bool volumeFlag, int32_t uid)
5182 {
5183     int32_t ret = audioVolumeManager_.SetSystemVolumeDegree(streamType, volumeDegree, volumeFlag);
5184     if (ret != SUCCESS) {
5185         AUDIO_ERR_LOG("Update volume degree failed, err:%{public}d", ret);
5186     }
5187     return ret;
5188 }
5189 
GetSystemVolumeDegree(int32_t streamType,int32_t uid,int32_t & volumeDegree)5190 int32_t AudioPolicyServer::GetSystemVolumeDegree(int32_t streamType, int32_t uid, int32_t &volumeDegree)
5191 {
5192     std::lock_guard<std::mutex> lock(systemVolumeMutex_);
5193     AudioStreamType newStreamType = static_cast<AudioStreamType>(streamType);
5194     volumeDegree = audioVolumeManager_.GetSystemVolumeDegree(newStreamType);
5195     return SUCCESS;
5196 }
5197 
GetMinVolumeDegree(int32_t volumeType,int32_t & volumeDegree)5198 int32_t AudioPolicyServer::GetMinVolumeDegree(int32_t volumeType, int32_t &volumeDegree)
5199 {
5200     volumeDegree = audioVolumeManager_.GetMinVolumeDegree(static_cast<AudioVolumeType>(volumeType));
5201     return SUCCESS;
5202 }
5203 } // namespace AudioStandard
5204 } // namespace OHOS
5205