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 ¶meters, 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