• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #ifndef LOG_TAG
16 #define LOG_TAG "AudioSystemManager"
17 #endif
18 
19 #include "audio_system_manager.h"
20 
21 #include "ipc_skeleton.h"
22 #include "iservice_registry.h"
23 #include "system_ability_definition.h"
24 #include "bundle_mgr_interface.h"
25 
26 #include "audio_common_log.h"
27 #include "audio_errors.h"
28 #include "audio_manager_base.h"
29 #include "audio_server_death_recipient.h"
30 #include "audio_policy_manager.h"
31 #include "audio_utils.h"
32 #include "audio_manager_listener_stub_impl.h"
33 #include "audio_policy_interface.h"
34 #include "audio_focus_info_change_callback_impl.h"
35 #include "audio_workgroup_callback_stub.h"
36 #include "audio_qosmanager.h"
37 #include "rtg_interface.h"
38 #include "qos.h"
39 #include "istandard_audio_service.h"
40 #include "audio_workgroup_callback_impl.h"
41 using namespace OHOS::RME;
42 
43 namespace OHOS {
44 namespace AudioStandard {
45 using namespace std;
46 constexpr unsigned int GET_BUNDLE_INFO_TIME_OUT_SECONDS = 10;
47 constexpr unsigned int XCOLLIE_TIME_OUT_SECONDS = 10;
48 constexpr unsigned int MS_PER_SECOND = 1000;
49 constexpr size_t VALID_REMOTE_NETWORK_ID_LENGTH = 64;
50 const map<pair<ContentType, StreamUsage>, AudioStreamType> AudioSystemManager::streamTypeMap_
51     = AudioSystemManager::CreateStreamMap();
52 mutex g_asProxyMutex;
53 mutex g_audioListenerMutex;
54 sptr<IStandardAudioService> g_asProxy = nullptr;
55 sptr<AudioManagerListenerStubImpl> g_audioListener = nullptr;
56 
AudioSystemManager()57 AudioSystemManager::AudioSystemManager()
58 {
59     AUDIO_DEBUG_LOG("AudioSystemManager start");
60 }
61 
~AudioSystemManager()62 AudioSystemManager::~AudioSystemManager()
63 {
64     AUDIO_DEBUG_LOG("~AudioSystemManager");
65     if (cbClientId_ != -1) {
66         UnsetRingerModeCallback(cbClientId_);
67     }
68 
69     if (volumeChangeClientPid_ != -1) {
70         AUDIO_DEBUG_LOG("UnregisterVolumeKeyEventCallback");
71         (void)UnregisterVolumeKeyEventCallback(volumeChangeClientPid_);
72         (void)UnregisterStreamVolumeChangeCallback(volumeChangeClientPid_);
73         (void)UnregisterSystemVolumeChangeCallback(volumeChangeClientPid_);
74     }
75 }
76 
GetInstance()77 AudioSystemManager *AudioSystemManager::GetInstance()
78 {
79     static AudioSystemManager audioManager;
80     return &audioManager;
81 }
82 
GetCallingPid() const83 int32_t AudioSystemManager::GetCallingPid() const
84 {
85     return getpid();
86 }
87 
CreateStreamMap()88 map<pair<ContentType, StreamUsage>, AudioStreamType> AudioSystemManager::CreateStreamMap()
89 {
90     map<pair<ContentType, StreamUsage>, AudioStreamType> streamMap;
91     // Mapping relationships from content and usage to stream type in design
92     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_UNKNOWN)] = STREAM_MUSIC;
93     streamMap[make_pair(CONTENT_TYPE_SPEECH, STREAM_USAGE_VOICE_COMMUNICATION)] = STREAM_VOICE_COMMUNICATION;
94     streamMap[make_pair(CONTENT_TYPE_SPEECH, STREAM_USAGE_VIDEO_COMMUNICATION)] = STREAM_VOICE_COMMUNICATION;
95     streamMap[make_pair(CONTENT_TYPE_SPEECH, STREAM_USAGE_VOICE_MODEM_COMMUNICATION)] = STREAM_VOICE_CALL;
96     streamMap[make_pair(CONTENT_TYPE_SPEECH, STREAM_USAGE_VOICE_CALL_ASSISTANT)] = STREAM_VOICE_CALL_ASSISTANT;
97     streamMap[make_pair(CONTENT_TYPE_PROMPT, STREAM_USAGE_SYSTEM)] = STREAM_SYSTEM;
98     streamMap[make_pair(CONTENT_TYPE_MUSIC, STREAM_USAGE_NOTIFICATION_RINGTONE)] = STREAM_RING;
99     streamMap[make_pair(CONTENT_TYPE_MUSIC, STREAM_USAGE_MEDIA)] = STREAM_MUSIC;
100     streamMap[make_pair(CONTENT_TYPE_MOVIE, STREAM_USAGE_MEDIA)] = STREAM_MOVIE;
101     streamMap[make_pair(CONTENT_TYPE_GAME, STREAM_USAGE_MEDIA)] = STREAM_GAME;
102     streamMap[make_pair(CONTENT_TYPE_SPEECH, STREAM_USAGE_MEDIA)] = STREAM_SPEECH;
103     streamMap[make_pair(CONTENT_TYPE_MUSIC, STREAM_USAGE_ALARM)] = STREAM_ALARM;
104     streamMap[make_pair(CONTENT_TYPE_PROMPT, STREAM_USAGE_NOTIFICATION)] = STREAM_NOTIFICATION;
105     streamMap[make_pair(CONTENT_TYPE_PROMPT, STREAM_USAGE_ENFORCED_TONE)] = STREAM_SYSTEM_ENFORCED;
106     streamMap[make_pair(CONTENT_TYPE_DTMF, STREAM_USAGE_VOICE_COMMUNICATION)] = STREAM_DTMF;
107     streamMap[make_pair(CONTENT_TYPE_SPEECH, STREAM_USAGE_VOICE_ASSISTANT)] = STREAM_VOICE_ASSISTANT;
108     streamMap[make_pair(CONTENT_TYPE_SPEECH, STREAM_USAGE_ACCESSIBILITY)] = STREAM_ACCESSIBILITY;
109     streamMap[make_pair(CONTENT_TYPE_ULTRASONIC, STREAM_USAGE_SYSTEM)] = STREAM_ULTRASONIC;
110 
111     // Old mapping relationships from content and usage to stream type
112     streamMap[make_pair(CONTENT_TYPE_MUSIC, STREAM_USAGE_VOICE_ASSISTANT)] = STREAM_VOICE_ASSISTANT;
113     streamMap[make_pair(CONTENT_TYPE_SONIFICATION, STREAM_USAGE_UNKNOWN)] = STREAM_NOTIFICATION;
114     streamMap[make_pair(CONTENT_TYPE_SONIFICATION, STREAM_USAGE_MEDIA)] = STREAM_NOTIFICATION;
115     streamMap[make_pair(CONTENT_TYPE_SONIFICATION, STREAM_USAGE_NOTIFICATION_RINGTONE)] = STREAM_RING;
116     streamMap[make_pair(CONTENT_TYPE_RINGTONE, STREAM_USAGE_UNKNOWN)] = STREAM_RING;
117     streamMap[make_pair(CONTENT_TYPE_RINGTONE, STREAM_USAGE_MEDIA)] = STREAM_RING;
118     streamMap[make_pair(CONTENT_TYPE_RINGTONE, STREAM_USAGE_NOTIFICATION_RINGTONE)] = STREAM_RING;
119 
120     AudioSystemManager::CreateStreamMap(streamMap);
121     return streamMap;
122 }
123 
CreateStreamMap(map<pair<ContentType,StreamUsage>,AudioStreamType> & streamMap)124 void AudioSystemManager::CreateStreamMap(map<pair<ContentType, StreamUsage>, AudioStreamType> &streamMap)
125 {
126     // Only use stream usage to choose stream type
127     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_MEDIA)] = STREAM_MUSIC;
128     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_MUSIC)] = STREAM_MUSIC;
129     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VOICE_COMMUNICATION)] = STREAM_VOICE_COMMUNICATION;
130     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VIDEO_COMMUNICATION)] = STREAM_VOICE_COMMUNICATION;
131     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VOICE_MODEM_COMMUNICATION)] = STREAM_VOICE_CALL;
132     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VOICE_CALL_ASSISTANT)] = STREAM_VOICE_CALL_ASSISTANT;
133     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VOICE_ASSISTANT)] = STREAM_VOICE_ASSISTANT;
134     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_ALARM)] = STREAM_ALARM;
135     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VOICE_MESSAGE)] = STREAM_VOICE_MESSAGE;
136     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_NOTIFICATION_RINGTONE)] = STREAM_RING;
137     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_RINGTONE)] = STREAM_RING;
138     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_NOTIFICATION)] = STREAM_NOTIFICATION;
139     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_ACCESSIBILITY)] = STREAM_ACCESSIBILITY;
140     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_SYSTEM)] = STREAM_SYSTEM;
141     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_MOVIE)] = STREAM_MOVIE;
142     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_GAME)] = STREAM_GAME;
143     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_AUDIOBOOK)] = STREAM_SPEECH;
144     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_NAVIGATION)] = STREAM_NAVIGATION;
145     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_DTMF)] = STREAM_DTMF;
146     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_ENFORCED_TONE)] = STREAM_SYSTEM_ENFORCED;
147     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_ULTRASONIC)] = STREAM_ULTRASONIC;
148     streamMap[make_pair(CONTENT_TYPE_UNKNOWN, STREAM_USAGE_VOICE_RINGTONE)] = STREAM_VOICE_RING;
149 }
150 
GetStreamType(ContentType contentType,StreamUsage streamUsage)151 AudioStreamType AudioSystemManager::GetStreamType(ContentType contentType, StreamUsage streamUsage)
152 {
153     AudioStreamType streamType = AudioStreamType::STREAM_MUSIC;
154     auto pos = streamTypeMap_.find(make_pair(contentType, streamUsage));
155     if (pos != streamTypeMap_.end()) {
156         streamType = pos->second;
157     } else {
158         AUDIO_ERR_LOG("The pair of contentType and streamUsage is not in design. Use the default stream type");
159     }
160 
161     if (streamType == AudioStreamType::STREAM_MEDIA) {
162         streamType = AudioStreamType::STREAM_MUSIC;
163     }
164 
165     return streamType;
166 }
167 
GetAudioSystemManagerProxy()168 inline const sptr<IStandardAudioService> GetAudioSystemManagerProxy()
169 {
170     AudioXCollie xcollieGetAudioSystemManagerProxy("GetAudioSystemManagerProxy", XCOLLIE_TIME_OUT_SECONDS,
171          nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG);
172     lock_guard<mutex> lock(g_asProxyMutex);
173     if (g_asProxy == nullptr) {
174         AudioXCollie xcollieGetSystemAbilityManager("GetSystemAbilityManager", XCOLLIE_TIME_OUT_SECONDS,
175              nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG);
176         auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
177         CHECK_AND_RETURN_RET_LOG(samgr != nullptr, nullptr, "get sa manager failed");
178         xcollieGetSystemAbilityManager.CancelXCollieTimer();
179 
180         AudioXCollie xcollieGetSystemAbility("GetSystemAbility", XCOLLIE_TIME_OUT_SECONDS);
181         sptr<IRemoteObject> object = samgr->GetSystemAbility(AUDIO_DISTRIBUTED_SERVICE_ID);
182         CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr, "get audio service remote object failed");
183         g_asProxy = iface_cast<IStandardAudioService>(object);
184         CHECK_AND_RETURN_RET_LOG(g_asProxy != nullptr, nullptr, "get audio service proxy failed");
185         xcollieGetSystemAbility.CancelXCollieTimer();
186 
187         // register death recipent to restore proxy
188         sptr<AudioServerDeathRecipient> asDeathRecipient =
189             new(std::nothrow) AudioServerDeathRecipient(getpid(), getuid());
190         if (asDeathRecipient != nullptr) {
191             asDeathRecipient->SetNotifyCb([] (pid_t pid, pid_t uid) {
192                 AudioSystemManager::AudioServerDied(pid, uid);
193             });
194             bool result = object->AddDeathRecipient(asDeathRecipient);
195             if (!result) {
196                 AUDIO_ERR_LOG("failed to add deathRecipient");
197             }
198         }
199     }
200     sptr<IStandardAudioService> gasp = g_asProxy;
201     return gasp;
202 }
203 
AudioServerDied(pid_t pid,pid_t uid)204 void AudioSystemManager::AudioServerDied(pid_t pid, pid_t uid)
205 {
206     AUDIO_INFO_LOG("audio server died, will restore proxy in next call");
207     {
208         lock_guard<mutex> lock(g_asProxyMutex);
209         g_asProxy = nullptr;
210     }
211     {
212         lock_guard<mutex> lock(g_audioListenerMutex);
213         g_audioListener = nullptr;
214     }
215 }
216 
RegisterRendererDataTransferCallback(const DataTransferMonitorParam & param,const std::shared_ptr<AudioRendererDataTransferStateChangeCallback> & callback)217 int32_t AudioSystemManager::RegisterRendererDataTransferCallback(const DataTransferMonitorParam &param,
218     const std::shared_ptr<AudioRendererDataTransferStateChangeCallback> &callback)
219 {
220     AUDIO_INFO_LOG("in");
221     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERROR_INVALID_PARAM, "callback is null");
222     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
223     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERROR, "Audio service unavailable.");
224 
225     int32_t ret = SUCCESS;
226 
227     lock_guard<mutex> lock(g_audioListenerMutex);
228     if (g_audioListener == nullptr) {
229         g_audioListener = new(std::nothrow) AudioManagerListenerStubImpl();
230         if (g_audioListener == nullptr) {
231             AUDIO_ERR_LOG("g_audioListener is null");
232             return ERROR;
233         }
234 
235         sptr<IRemoteObject> object = g_audioListener->AsObject();
236         if (object == nullptr) {
237             AUDIO_ERR_LOG("as object result is null");
238             g_audioListener = nullptr;
239             return ERROR;
240         }
241 
242         ret = gasp->RegisterDataTransferCallback(object);
243         CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR_INVALID_PARAM, "ret: %{public}d", ret);
244     }
245 
246     auto callbackId = g_audioListener->AddDataTransferStateChangeCallback(param, callback);
247     CHECK_AND_RETURN_RET_LOG(callbackId != -1, ERROR_SYSTEM, "out of max register count");
248     ret = gasp->RegisterDataTransferMonitorParam(callbackId, param);
249     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR_INVALID_PARAM, "ret: %{public}d", ret);
250     return ret;
251 }
252 
253 
UnregisterRendererDataTransferCallback(const std::shared_ptr<AudioRendererDataTransferStateChangeCallback> & callback)254 int32_t AudioSystemManager::UnregisterRendererDataTransferCallback(
255     const std::shared_ptr<AudioRendererDataTransferStateChangeCallback> &callback)
256 {
257     AUDIO_INFO_LOG("in");
258     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERROR_INVALID_PARAM, "callback is null");
259     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
260     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERROR, "Audio service unavailable.");
261 
262     lock_guard<mutex> lock(g_audioListenerMutex);
263     CHECK_AND_RETURN_RET_LOG(g_audioListener != nullptr, ERROR_INVALID_PARAM, "audio listener is null");
264     auto callbackIds = g_audioListener->RemoveDataTransferStateChangeCallback(callback);
265 
266     for (auto callbackId : callbackIds) {
267         gasp->UnregisterDataTransferMonitorParam(callbackId);
268     }
269 
270     return SUCCESS;
271 }
272 
SetRingerMode(AudioRingerMode ringMode)273 int32_t AudioSystemManager::SetRingerMode(AudioRingerMode ringMode)
274 {
275     // Deprecated. Please use the SetRingerMode interface of AudioGroupManager.
276     AUDIO_WARNING_LOG("Use the deprecated SetRingerMode func. ringer mode [%{public}d]", ringMode);
277     std::lock_guard<std::mutex> lockSet(ringerModeCallbackMutex_);
278     ringModeBackup_ = ringMode;
279     if (ringerModeCallback_ != nullptr) {
280         ringerModeCallback_->OnRingerModeUpdated(ringModeBackup_);
281     }
282 
283     return SUCCESS;
284 }
285 
GetSelfBundleName(int32_t uid)286 std::string AudioSystemManager::GetSelfBundleName(int32_t uid)
287 {
288     AudioXCollie audioXCollie("AudioSystemManager::GetSelfBundleName_FromUid", GET_BUNDLE_INFO_TIME_OUT_SECONDS,
289          nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG);
290     std::string bundleName = "";
291 
292     WatchTimeout guard("SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager():GetSelfBundleName");
293     sptr<ISystemAbilityManager> systemAbilityManager =
294         SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
295     guard.CheckCurrTimeout();
296     sptr<OHOS::IRemoteObject> remoteObject =
297         systemAbilityManager->CheckSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
298     CHECK_AND_RETURN_RET_LOG(remoteObject != nullptr, bundleName, "remoteObject is null");
299 
300     sptr<AppExecFwk::IBundleMgr> iBundleMgr = iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
301     CHECK_AND_RETURN_RET_LOG(iBundleMgr != nullptr, bundleName, "bundlemgr interface is null");
302 
303     WatchTimeout reguard("bundleMgrProxy->GetNameForUid:GetSelfBundleName");
304     iBundleMgr->GetNameForUid(uid, bundleName);
305     reguard.CheckCurrTimeout();
306     return bundleName;
307 }
308 
GetRingerMode()309 AudioRingerMode AudioSystemManager::GetRingerMode()
310 {
311     return ringModeBackup_;
312 }
313 
SetAudioScene(const AudioScene & scene)314 int32_t AudioSystemManager::SetAudioScene(const AudioScene &scene)
315 {
316     AUDIO_DEBUG_LOG("audioScene_=%{public}d done", scene);
317     return AudioPolicyManager::GetInstance().SetAudioScene(scene);
318 }
319 
GetAudioScene() const320 AudioScene AudioSystemManager::GetAudioScene() const
321 {
322     auto audioScene = AudioPolicyManager::GetInstance().GetAudioScene();
323     AUDIO_DEBUG_LOG("origin audioScene: %{public}d", audioScene);
324     switch (audioScene) {
325         case AUDIO_SCENE_CALL_START:
326         case AUDIO_SCENE_CALL_END:
327             return AUDIO_SCENE_DEFAULT;
328 
329         case AUDIO_SCENE_VOICE_RINGING:
330             return AUDIO_SCENE_RINGING;
331 
332         default:
333             return audioScene;
334     }
335 }
336 
SetDeviceActive(DeviceType deviceType,bool flag,const int32_t clientUid) const337 int32_t AudioSystemManager::SetDeviceActive(DeviceType deviceType, bool flag, const int32_t clientUid) const
338 {
339     int32_t uid = clientUid == -1 ? getuid() : clientUid;
340     if (!IsActiveDeviceType(deviceType)) {
341         AUDIO_ERR_LOG("device=%{public}d not supported", deviceType);
342         return ERR_NOT_SUPPORTED;
343     }
344 
345     /* Call Audio Policy SetDeviceActive */
346     return (AudioPolicyManager::GetInstance().SetDeviceActive(static_cast<InternalDeviceType>(deviceType), flag, uid));
347 }
348 
IsDeviceActive(DeviceType deviceType) const349 bool AudioSystemManager::IsDeviceActive(DeviceType deviceType) const
350 {
351     if (!IsActiveDeviceType(deviceType)) {
352         AUDIO_ERR_LOG("device=%{public}d not supported", deviceType);
353         return ERR_NOT_SUPPORTED;
354     }
355 
356     /* Call Audio Policy IsDeviceActive */
357     return (AudioPolicyManager::GetInstance().IsDeviceActive(static_cast<InternalDeviceType>(deviceType)));
358 }
359 
GetActiveOutputDevice()360 DeviceType AudioSystemManager::GetActiveOutputDevice()
361 {
362     return AudioPolicyManager::GetInstance().GetActiveOutputDevice();
363 }
364 
GetActiveInputDevice()365 DeviceType AudioSystemManager::GetActiveInputDevice()
366 {
367     return AudioPolicyManager::GetInstance().GetActiveInputDevice();
368 }
369 
IsStreamActive(AudioVolumeType volumeType) const370 bool AudioSystemManager::IsStreamActive(AudioVolumeType volumeType) const
371 {
372     switch (volumeType) {
373         case STREAM_MUSIC:
374         case STREAM_RING:
375         case STREAM_NOTIFICATION:
376         case STREAM_VOICE_CALL:
377         case STREAM_VOICE_COMMUNICATION:
378         case STREAM_VOICE_ASSISTANT:
379         case STREAM_ALARM:
380         case STREAM_SYSTEM:
381         case STREAM_ACCESSIBILITY:
382         case STREAM_VOICE_RING:
383         case STREAM_CAMCORDER:
384             break;
385         case STREAM_ULTRASONIC:{
386             bool ret = PermissionUtil::VerifySelfPermission();
387             CHECK_AND_RETURN_RET_LOG(ret, false, "volumeType=%{public}d. No system permission", volumeType);
388             break;
389         }
390         case STREAM_ALL:
391         default:
392             AUDIO_ERR_LOG("volumeType=%{public}d not supported", volumeType);
393             return false;
394     }
395 
396     return AudioPolicyManager::GetInstance().IsStreamActive(volumeType);
397 }
398 
SetAsrAecMode(const AsrAecMode asrAecMode)399 int32_t AudioSystemManager::SetAsrAecMode(const AsrAecMode asrAecMode)
400 {
401     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
402     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
403     return gasp->SetAsrAecMode(static_cast<int32_t>(asrAecMode));
404 }
405 
GetAsrAecMode(AsrAecMode & asrAecMode)406 int32_t AudioSystemManager::GetAsrAecMode(AsrAecMode &asrAecMode)
407 {
408     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
409     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
410     int32_t mode = 0;
411     int32_t ret = gasp->GetAsrAecMode(mode);
412     CHECK_AND_RETURN_RET_LOG(ret == 0, AUDIO_ERR, "Get AsrAec Mode audio parameters failed");
413     asrAecMode = static_cast<AsrAecMode>(mode);
414     return 0;
415 }
416 
SetAsrNoiseSuppressionMode(const AsrNoiseSuppressionMode asrNoiseSuppressionMode)417 int32_t AudioSystemManager::SetAsrNoiseSuppressionMode(const AsrNoiseSuppressionMode asrNoiseSuppressionMode)
418 {
419     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
420     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
421     return gasp->SetAsrNoiseSuppressionMode(static_cast<int32_t>(asrNoiseSuppressionMode));
422 }
423 
GetAsrNoiseSuppressionMode(AsrNoiseSuppressionMode & asrNoiseSuppressionMode)424 int32_t AudioSystemManager::GetAsrNoiseSuppressionMode(AsrNoiseSuppressionMode &asrNoiseSuppressionMode)
425 {
426     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
427     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
428     int32_t mode = 0;
429     int32_t ret = gasp->GetAsrNoiseSuppressionMode(mode);
430     CHECK_AND_RETURN_RET_LOG(ret == 0, AUDIO_ERR, "Get AsrAec Mode audio parameters failed");
431     asrNoiseSuppressionMode = static_cast<AsrNoiseSuppressionMode>(mode);
432     return 0;
433 }
434 
SetAsrWhisperDetectionMode(const AsrWhisperDetectionMode asrWhisperDetectionMode)435 int32_t AudioSystemManager::SetAsrWhisperDetectionMode(const AsrWhisperDetectionMode asrWhisperDetectionMode)
436 {
437     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
438     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
439     return gasp->SetAsrWhisperDetectionMode(static_cast<int32_t>(asrWhisperDetectionMode));
440 }
441 
GetAsrWhisperDetectionMode(AsrWhisperDetectionMode & asrWhisperDetectionMode)442 int32_t AudioSystemManager::GetAsrWhisperDetectionMode(AsrWhisperDetectionMode &asrWhisperDetectionMode)
443 {
444     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
445     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
446     int32_t mode = 0;
447     int32_t ret = gasp->GetAsrWhisperDetectionMode(mode);
448     CHECK_AND_RETURN_RET_LOG(ret == 0, AUDIO_ERR, "Get AsrWhisperDetection Mode audio parameters failed");
449     asrWhisperDetectionMode = static_cast<AsrWhisperDetectionMode>(mode);
450     return 0;
451 }
452 
SetAsrVoiceControlMode(const AsrVoiceControlMode asrVoiceControlMode,bool on)453 int32_t AudioSystemManager::SetAsrVoiceControlMode(const AsrVoiceControlMode asrVoiceControlMode, bool on)
454 {
455     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
456     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
457     return gasp->SetAsrVoiceControlMode(static_cast<int32_t>(asrVoiceControlMode), on);
458 }
459 
SetAsrVoiceMuteMode(const AsrVoiceMuteMode asrVoiceMuteMode,bool on)460 int32_t AudioSystemManager::SetAsrVoiceMuteMode(const AsrVoiceMuteMode asrVoiceMuteMode, bool on)
461 {
462     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
463     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
464     return gasp->SetAsrVoiceMuteMode(static_cast<int32_t>(asrVoiceMuteMode), on);
465 }
466 
IsWhispering()467 int32_t AudioSystemManager::IsWhispering()
468 {
469     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
470     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
471     int32_t whisperRes = 0;
472     gasp->IsWhispering(whisperRes);
473     return whisperRes;
474 }
475 
GetAudioParameter(const std::string key)476 const std::string AudioSystemManager::GetAudioParameter(const std::string key)
477 {
478     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
479     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, "", "Audio service unavailable.");
480     std::string value = "";
481     gasp->GetAudioParameter(key, value);
482     return value;
483 }
484 
SetAudioParameter(const std::string & key,const std::string & value)485 void AudioSystemManager::SetAudioParameter(const std::string &key, const std::string &value)
486 {
487     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
488     CHECK_AND_RETURN_LOG(gasp != nullptr, "Audio service unavailable.");
489     gasp->SetAudioParameter(key, value);
490 }
491 
GetExtraParameters(const std::string & mainKey,const std::vector<std::string> & subKeys,std::vector<std::pair<std::string,std::string>> & result)492 int32_t AudioSystemManager::GetExtraParameters(const std::string &mainKey,
493     const std::vector<std::string> &subKeys, std::vector<std::pair<std::string, std::string>> &result)
494 {
495     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
496     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
497     std::vector<StringPair> resultPair;
498     int32_t ret = gasp->GetExtraParameters(mainKey, subKeys, resultPair);
499     CHECK_AND_RETURN_RET_LOG(ret == 0, ret, "Get extra parameters failed");
500     for (auto &pair : resultPair) {
501         result.push_back(std::make_pair(pair.firstParam, pair.secondParam));
502     }
503     return ret;
504 }
505 
SetExtraParameters(const std::string & key,const std::vector<std::pair<std::string,std::string>> & kvpairs)506 int32_t AudioSystemManager::SetExtraParameters(const std::string &key,
507     const std::vector<std::pair<std::string, std::string>> &kvpairs)
508 {
509     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
510     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
511     std::vector<StringPair> pairs;
512     for (const auto &pair : kvpairs) {
513         pairs.push_back({pair.first, pair.second});
514     }
515     return gasp->SetExtraParameters(key, pairs);
516 }
517 
GetTransactionId(DeviceType deviceType,DeviceRole deviceRole)518 uint64_t AudioSystemManager::GetTransactionId(DeviceType deviceType, DeviceRole deviceRole)
519 {
520     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
521     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
522     uint64_t transactionId = 0;
523     int32_t res = gasp->GetTransactionId(deviceType, deviceRole, transactionId);
524     CHECK_AND_RETURN_RET_LOG(res == 0, 0, "GetTransactionId failed");
525     return transactionId;
526 }
527 
SetSelfAppVolume(int32_t volume,int32_t flag)528 int32_t AudioSystemManager::SetSelfAppVolume(int32_t volume, int32_t flag)
529 {
530     AUDIO_INFO_LOG("enter AudioSystemManager::SetSelfAppVolume");
531     return AudioPolicyManager::GetInstance().SetSelfAppVolumeLevel(volume);
532 }
533 
534 // LCOV_EXCL_START
SetAppVolume(int32_t appUid,int32_t volume,int32_t flag)535 int32_t AudioSystemManager::SetAppVolume(int32_t appUid, int32_t volume, int32_t flag)
536 {
537     AUDIO_INFO_LOG("enter AudioSystemManager::SetAppVolume");
538     bool ret = PermissionUtil::VerifyIsSystemApp();
539     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "SetAppVolume: No system permission");
540     ret = PermissionUtil::VerifySelfPermission();
541     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "SetAppVolume: No system permission");
542     return AudioPolicyManager::GetInstance().SetAppVolumeLevel(appUid, volume);
543 }
544 
GetAppVolume(int32_t appUid,int32_t & volumeLevel) const545 int32_t AudioSystemManager::GetAppVolume(int32_t appUid, int32_t &volumeLevel) const
546 {
547     AUDIO_INFO_LOG("enter AudioSystemManager::GetAppVolume");
548     bool ret = PermissionUtil::VerifyIsSystemApp();
549     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "GetAppVolume: No system permission");
550     ret = PermissionUtil::VerifySelfPermission();
551     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "GetAppVolume: No system permission");
552     return AudioPolicyManager::GetInstance().GetAppVolumeLevel(appUid, volumeLevel);
553 }
554 
GetSelfAppVolume(int32_t & volumeLevel) const555 int32_t AudioSystemManager::GetSelfAppVolume(int32_t &volumeLevel) const
556 {
557     AUDIO_INFO_LOG("enter AudioSystemManager::GetSelfAppVolume");
558     return AudioPolicyManager::GetInstance().GetSelfAppVolumeLevel(volumeLevel);
559 }
560 
SetAppVolumeMuted(int32_t appUid,bool muted,int32_t volumeFlag)561 int32_t AudioSystemManager::SetAppVolumeMuted(int32_t appUid, bool muted, int32_t volumeFlag)
562 {
563     AUDIO_INFO_LOG("SetAppVolumeMuted: appUid[%{public}d], muted[%{public}d], flag[%{public}d]",
564         appUid, muted, volumeFlag);
565     bool ret = PermissionUtil::VerifyIsSystemApp();
566     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "SetAppVolumeMuted: No system permission");
567     ret = PermissionUtil::VerifySelfPermission();
568     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "SetAppVolumeMuted: No system permission");
569     return AudioPolicyManager::GetInstance().SetAppVolumeMuted(appUid, muted, volumeFlag);
570 }
571 
SetAppRingMuted(int32_t appUid,bool muted)572 int32_t AudioSystemManager::SetAppRingMuted(int32_t appUid, bool muted)
573 {
574     bool ret = PermissionUtil::VerifySelfPermission();
575     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "SetAppRingMuted: No system permission");
576     return AudioPolicyManager::GetInstance().SetAppRingMuted(appUid, muted);
577 }
578 // LCOV_EXCL_STOP
579 
UnsetSelfAppVolumeCallback(const std::shared_ptr<AudioManagerAppVolumeChangeCallback> & callback)580 int32_t AudioSystemManager::UnsetSelfAppVolumeCallback(
581     const std::shared_ptr<AudioManagerAppVolumeChangeCallback> &callback)
582 {
583     return AudioPolicyManager::GetInstance().UnsetSelfAppVolumeCallback(callback);
584 }
585 
SetSelfAppVolumeCallback(const std::shared_ptr<AudioManagerAppVolumeChangeCallback> & callback)586 int32_t AudioSystemManager::SetSelfAppVolumeCallback(
587     const std::shared_ptr<AudioManagerAppVolumeChangeCallback> &callback)
588 {
589     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM,
590         "SetSelfAppVolumeCallback: callback is nullptr");
591     return AudioPolicyManager::GetInstance().SetSelfAppVolumeChangeCallback(callback);
592 }
593 
SetAppVolumeCallbackForUid(const int32_t appUid,const std::shared_ptr<AudioManagerAppVolumeChangeCallback> & callback)594 int32_t AudioSystemManager::SetAppVolumeCallbackForUid(const int32_t appUid,
595     const std::shared_ptr<AudioManagerAppVolumeChangeCallback> &callback)
596 {
597     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM,
598         "SetAppVolumeCallbackForUid: callback is nullptr");
599     return AudioPolicyManager::GetInstance().SetAppVolumeChangeCallbackForUid(appUid, callback);
600 }
601 
UnsetAppVolumeCallbackForUid(const std::shared_ptr<AudioManagerAppVolumeChangeCallback> & callback)602 int32_t AudioSystemManager::UnsetAppVolumeCallbackForUid(
603     const std::shared_ptr<AudioManagerAppVolumeChangeCallback> &callback)
604 {
605     return AudioPolicyManager::GetInstance().UnsetAppVolumeCallbackForUid(callback);
606 }
607 
IsAppVolumeMute(int32_t appUid,bool owned,bool & isMute)608 int32_t AudioSystemManager::IsAppVolumeMute(int32_t appUid, bool owned, bool &isMute)
609 {
610     AUDIO_INFO_LOG("IsAppVolumeMute: appUid[%{public}d], muted[%{public}d]", appUid, owned);
611     bool ret = PermissionUtil::VerifyIsSystemApp();
612     CHECK_AND_RETURN_RET_LOG(ret, ERR_SYSTEM_PERMISSION_DENIED, "IsAppVolumeMute: No system permission");
613     ret = PermissionUtil::VerifySelfPermission();
614     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "IsAppVolumeMute: No system permission");
615     return AudioPolicyManager::GetInstance().IsAppVolumeMute(appUid, owned, isMute);
616 }
617 
UnsetActiveVolumeTypeCallback(const std::shared_ptr<AudioManagerActiveVolumeTypeChangeCallback> & callback)618 int32_t AudioSystemManager::UnsetActiveVolumeTypeCallback(
619     const std::shared_ptr<AudioManagerActiveVolumeTypeChangeCallback> &callback)
620 {
621     return AudioPolicyManager::GetInstance().UnsetActiveVolumeTypeCallback(callback);
622 }
623 
SetActiveVolumeTypeCallback(const std::shared_ptr<AudioManagerActiveVolumeTypeChangeCallback> & callback)624 int32_t AudioSystemManager::SetActiveVolumeTypeCallback(
625     const std::shared_ptr<AudioManagerActiveVolumeTypeChangeCallback> &callback)
626 {
627     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM,
628         "SetActiveVolumeTypeCallback: callback is nullptr");
629     return AudioPolicyManager::GetInstance().SetActiveVolumeTypeCallback(callback);
630 }
631 
SetVolume(AudioVolumeType volumeType,int32_t volumeLevel) const632 int32_t AudioSystemManager::SetVolume(AudioVolumeType volumeType, int32_t volumeLevel) const
633 {
634     AUDIO_INFO_LOG("SetSystemVolume: volumeType[%{public}d], volumeLevel[%{public}d]", volumeType, volumeLevel);
635 
636     /* Validate volumeType and return INVALID_PARAMS error */
637     switch (volumeType) {
638         case STREAM_VOICE_CALL:
639         case STREAM_VOICE_COMMUNICATION:
640         case STREAM_RING:
641         case STREAM_MUSIC:
642         case STREAM_ALARM:
643         case STREAM_SYSTEM:
644         case STREAM_ACCESSIBILITY:
645         case STREAM_VOICE_ASSISTANT:
646         case STREAM_VOICE_RING:
647             break;
648         case STREAM_ULTRASONIC:
649         case STREAM_ALL:{
650             bool ret = PermissionUtil::VerifySelfPermission();
651             CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
652             break;
653         }
654         default:
655             AUDIO_ERR_LOG("volumeType[%{public}d] is not supported", volumeType);
656             return ERR_NOT_SUPPORTED;
657     }
658 
659     /* Call Audio Policy SetSystemVolumeLevel */
660     return AudioPolicyManager::GetInstance().SetSystemVolumeLevel(volumeType, volumeLevel, true);
661 }
662 
SetVolumeWithDevice(AudioVolumeType volumeType,int32_t volumeLevel,DeviceType deviceType) const663 int32_t AudioSystemManager::SetVolumeWithDevice(AudioVolumeType volumeType, int32_t volumeLevel,
664     DeviceType deviceType) const
665 {
666     AUDIO_INFO_LOG("%{public}s: volumeType[%{public}d], volumeLevel[%{public}d], deviceType[%{public}d]",
667         __func__, volumeType, volumeLevel, deviceType);
668 
669     /* Validate volumeType and return INVALID_PARAMS error */
670     switch (volumeType) {
671         case STREAM_VOICE_CALL:
672         case STREAM_VOICE_COMMUNICATION:
673         case STREAM_RING:
674         case STREAM_MUSIC:
675         case STREAM_ALARM:
676         case STREAM_SYSTEM:
677         case STREAM_ACCESSIBILITY:
678         case STREAM_VOICE_ASSISTANT:
679         case STREAM_VOICE_RING:
680             break;
681         case STREAM_ULTRASONIC:
682         case STREAM_ALL:{
683             bool ret = PermissionUtil::VerifySelfPermission();
684             CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
685             break;
686         }
687         default:
688             AUDIO_ERR_LOG("volumeType[%{public}d] is not supported", volumeType);
689             return ERR_NOT_SUPPORTED;
690     }
691 
692     /* Call Audio Policy SetSystemVolumeLevel */
693     return AudioPolicyManager::GetInstance().SetSystemVolumeLevelWithDevice(volumeType, volumeLevel, deviceType);
694 }
695 
GetVolume(AudioVolumeType volumeType) const696 int32_t AudioSystemManager::GetVolume(AudioVolumeType volumeType) const
697 {
698     switch (volumeType) {
699         case STREAM_MUSIC:
700         case STREAM_RING:
701         case STREAM_NOTIFICATION:
702         case STREAM_VOICE_CALL:
703         case STREAM_VOICE_COMMUNICATION:
704         case STREAM_VOICE_ASSISTANT:
705         case STREAM_ALARM:
706         case STREAM_SYSTEM:
707         case STREAM_ACCESSIBILITY:
708         case STREAM_VOICE_RING:
709             break;
710         case STREAM_ULTRASONIC:
711         case STREAM_ALL:{
712             bool ret = PermissionUtil::VerifySelfPermission();
713             CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
714             break;
715         }
716         default:
717             AUDIO_ERR_LOG("volumeType[%{public}d] is not supported", volumeType);
718             return ERR_NOT_SUPPORTED;
719     }
720 
721     return AudioPolicyManager::GetInstance().GetSystemVolumeLevel(volumeType);
722 }
723 
SetLowPowerVolume(int32_t streamId,float volume) const724 int32_t AudioSystemManager::SetLowPowerVolume(int32_t streamId, float volume) const
725 {
726     AUDIO_INFO_LOG("streamId:%{public}d, vol:%{public}f.", streamId, volume);
727     CHECK_AND_RETURN_RET_LOG((volume >= 0) && (volume <= 1.0), ERR_INVALID_PARAM,
728         "Invalid Volume Input!");
729 
730     return AudioPolicyManager::GetInstance().SetLowPowerVolume(streamId, volume);
731 }
732 
GetLowPowerVolume(int32_t streamId) const733 float AudioSystemManager::GetLowPowerVolume(int32_t streamId) const
734 {
735     return AudioPolicyManager::GetInstance().GetLowPowerVolume(streamId);
736 }
737 
GetSingleStreamVolume(int32_t streamId) const738 float AudioSystemManager::GetSingleStreamVolume(int32_t streamId) const
739 {
740     return AudioPolicyManager::GetInstance().GetSingleStreamVolume(streamId);
741 }
742 
GetMaxVolume(AudioVolumeType volumeType)743 int32_t AudioSystemManager::GetMaxVolume(AudioVolumeType volumeType)
744 {
745     if (volumeType == STREAM_ALL) {
746         bool ret = PermissionUtil::VerifySelfPermission();
747         CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
748     }
749 
750     if (volumeType == STREAM_ULTRASONIC) {
751         bool ret = PermissionUtil::VerifySelfPermission();
752         CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
753     }
754 
755     return AudioPolicyManager::GetInstance().GetMaxVolumeLevel(volumeType);
756 }
757 
GetMinVolume(AudioVolumeType volumeType)758 int32_t AudioSystemManager::GetMinVolume(AudioVolumeType volumeType)
759 {
760     if (volumeType == STREAM_ALL) {
761         bool ret = PermissionUtil::VerifySelfPermission();
762         CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
763     }
764 
765     if (volumeType == STREAM_ULTRASONIC) {
766         bool ret = PermissionUtil::VerifySelfPermission();
767         CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "STREAM_ULTRASONIC No system permission");
768     }
769 
770     return AudioPolicyManager::GetInstance().GetMinVolumeLevel(volumeType);
771 }
772 
GetDeviceMaxVolume(AudioVolumeType volumeType,DeviceType deviceType)773 int32_t AudioSystemManager::GetDeviceMaxVolume(AudioVolumeType volumeType, DeviceType deviceType)
774 {
775     if (volumeType == STREAM_ALL) {
776         bool ret1 = PermissionUtil::VerifySelfPermission();
777         CHECK_AND_RETURN_RET_LOG(ret1, ERR_PERMISSION_DENIED, "No system permission");
778     }
779 
780     if (volumeType == STREAM_ULTRASONIC) {
781         bool ret2 = PermissionUtil::VerifySelfPermission();
782         CHECK_AND_RETURN_RET_LOG(ret2, ERR_PERMISSION_DENIED, "STREAM_ULTRASONIC No system permission");
783     }
784 
785     return AudioPolicyManager::GetInstance().GetMaxVolumeLevel(volumeType, deviceType);
786 }
787 
GetDeviceMinVolume(AudioVolumeType volumeType,DeviceType deviceType)788 int32_t AudioSystemManager::GetDeviceMinVolume(AudioVolumeType volumeType, DeviceType deviceType)
789 {
790     if (volumeType == STREAM_ALL) {
791         bool ret1 = PermissionUtil::VerifySelfPermission();
792         CHECK_AND_RETURN_RET_LOG(ret1, ERR_PERMISSION_DENIED, "No system permission");
793     }
794 
795     if (volumeType == STREAM_ULTRASONIC) {
796         bool ret2 = PermissionUtil::VerifySelfPermission();
797         CHECK_AND_RETURN_RET_LOG(ret2, ERR_PERMISSION_DENIED, "STREAM_ULTRASONIC No system permission");
798     }
799 
800     return AudioPolicyManager::GetInstance().GetMinVolumeLevel(volumeType, deviceType);
801 }
802 
SetMute(AudioVolumeType volumeType,bool mute,const DeviceType & deviceType) const803 int32_t AudioSystemManager::SetMute(AudioVolumeType volumeType, bool mute, const DeviceType &deviceType) const
804 {
805     AUDIO_INFO_LOG("SetStreamMute for volumeType [%{public}d], mute [%{public}d]", volumeType, mute);
806     switch (volumeType) {
807         case STREAM_MUSIC:
808         case STREAM_RING:
809         case STREAM_NOTIFICATION:
810         case STREAM_VOICE_CALL:
811         case STREAM_VOICE_COMMUNICATION:
812         case STREAM_VOICE_ASSISTANT:
813         case STREAM_ALARM:
814         case STREAM_SYSTEM:
815         case STREAM_ACCESSIBILITY:
816         case STREAM_VOICE_RING:
817             break;
818         case STREAM_ULTRASONIC:
819         case STREAM_ALL:{
820             bool ret = PermissionUtil::VerifySelfPermission();
821             CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
822             break;
823         }
824         default:
825             AUDIO_ERR_LOG("volumeType=%{public}d not supported", volumeType);
826             return ERR_NOT_SUPPORTED;
827     }
828 
829     /* Call Audio Policy SetStreamMute */
830     return AudioPolicyManager::GetInstance().SetStreamMute(volumeType, mute, true, deviceType);
831 }
832 
IsStreamMute(AudioVolumeType volumeType) const833 bool AudioSystemManager::IsStreamMute(AudioVolumeType volumeType) const
834 {
835     AUDIO_DEBUG_LOG("AudioSystemManager::GetMute Client");
836 
837     switch (volumeType) {
838         case STREAM_MUSIC:
839         case STREAM_RING:
840         case STREAM_NOTIFICATION:
841         case STREAM_VOICE_CALL:
842         case STREAM_VOICE_COMMUNICATION:
843         case STREAM_VOICE_ASSISTANT:
844         case STREAM_ALARM:
845         case STREAM_SYSTEM:
846         case STREAM_ACCESSIBILITY:
847         case STREAM_VOICE_RING:
848             break;
849         case STREAM_ULTRASONIC:
850         case STREAM_ALL:{
851             bool ret = PermissionUtil::VerifySelfPermission();
852             CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
853             break;
854         }
855         default:
856             AUDIO_ERR_LOG("volumeType=%{public}d not supported", volumeType);
857             return false;
858     }
859 
860     return AudioPolicyManager::GetInstance().GetStreamMute(volumeType);
861 }
862 
GetVolumeInUnitOfDb(AudioVolumeType volumeType,int32_t volumeLevel,DeviceType device)863 float AudioSystemManager::GetVolumeInUnitOfDb(AudioVolumeType volumeType, int32_t volumeLevel, DeviceType device)
864 {
865     AUDIO_INFO_LOG("enter AudioSystemManager::GetVolumeInUnitOfDb");
866     return AudioPolicyManager::GetInstance().GetSystemVolumeInDb(volumeType, volumeLevel, device);
867 }
868 
SetDeviceChangeCallback(const DeviceFlag flag,const std::shared_ptr<AudioManagerDeviceChangeCallback> & callback)869 int32_t AudioSystemManager::SetDeviceChangeCallback(const DeviceFlag flag,
870     const std::shared_ptr<AudioManagerDeviceChangeCallback>& callback)
871 {
872     AUDIO_INFO_LOG("Entered %{public}s", __func__);
873     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
874 
875     int32_t clientId = GetCallingPid();
876     return AudioPolicyManager::GetInstance().SetDeviceChangeCallback(clientId, flag, callback);
877 }
878 
UnsetDeviceChangeCallback(DeviceFlag flag,std::shared_ptr<AudioManagerDeviceChangeCallback> cb)879 int32_t AudioSystemManager::UnsetDeviceChangeCallback(DeviceFlag flag,
880     std::shared_ptr<AudioManagerDeviceChangeCallback> cb)
881 {
882     AUDIO_INFO_LOG("Entered %{public}s", __func__);
883     int32_t clientId = GetCallingPid();
884     return AudioPolicyManager::GetInstance().UnsetDeviceChangeCallback(clientId, flag, cb);
885 }
886 
SetMicrophoneBlockedCallback(const std::shared_ptr<AudioManagerMicrophoneBlockedCallback> & callback)887 int32_t AudioSystemManager::SetMicrophoneBlockedCallback(
888     const std::shared_ptr<AudioManagerMicrophoneBlockedCallback>& callback)
889 {
890     AUDIO_INFO_LOG("Entered %{public}s", __func__);
891     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
892 
893     int32_t clientId = GetCallingPid();
894     return AudioPolicyManager::GetInstance().SetMicrophoneBlockedCallback(clientId, callback);
895 }
896 
UnsetMicrophoneBlockedCallback(const std::shared_ptr<AudioManagerMicrophoneBlockedCallback> callback)897 int32_t AudioSystemManager::UnsetMicrophoneBlockedCallback(
898     const std::shared_ptr<AudioManagerMicrophoneBlockedCallback> callback)
899 {
900     AUDIO_INFO_LOG("Entered %{public}s", __func__);
901     int32_t clientId = GetCallingPid();
902     return AudioPolicyManager::GetInstance().UnsetMicrophoneBlockedCallback(clientId, callback);
903 }
904 
SetAudioSceneChangeCallback(const std::shared_ptr<AudioManagerAudioSceneChangedCallback> & callback)905 int32_t AudioSystemManager::SetAudioSceneChangeCallback(
906     const std::shared_ptr<AudioManagerAudioSceneChangedCallback>& callback)
907 {
908     AUDIO_INFO_LOG("Entered %{public}s", __func__);
909     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
910 
911     int32_t clientId = GetCallingPid();
912     return AudioPolicyManager::GetInstance().SetAudioSceneChangeCallback(clientId, callback);
913 }
914 
UnsetAudioSceneChangeCallback(const std::shared_ptr<AudioManagerAudioSceneChangedCallback> callback)915 int32_t AudioSystemManager::UnsetAudioSceneChangeCallback(
916     const std::shared_ptr<AudioManagerAudioSceneChangedCallback> callback)
917 {
918     AUDIO_INFO_LOG("Entered %{public}s", __func__);
919     return AudioPolicyManager::GetInstance().UnsetAudioSceneChangeCallback(callback);
920 }
921 
SetQueryClientTypeCallback(const std::shared_ptr<AudioQueryClientTypeCallback> & callback)922 int32_t AudioSystemManager::SetQueryClientTypeCallback(const std::shared_ptr<AudioQueryClientTypeCallback> &callback)
923 {
924     AUDIO_INFO_LOG("In");
925     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
926     return AudioPolicyManager::GetInstance().SetQueryClientTypeCallback(callback);
927 }
928 
SetAudioClientInfoMgrCallback(const std::shared_ptr<AudioClientInfoMgrCallback> & callback)929 int32_t AudioSystemManager::SetAudioClientInfoMgrCallback(const std::shared_ptr<AudioClientInfoMgrCallback> &callback)
930 {
931     AUDIO_INFO_LOG("In");
932     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
933     return AudioPolicyManager::GetInstance().SetAudioClientInfoMgrCallback(callback);
934 }
935 
SetAudioVKBInfoMgrCallback(const std::shared_ptr<AudioVKBInfoMgrCallback> & callback)936 int32_t AudioSystemManager::SetAudioVKBInfoMgrCallback(const std::shared_ptr<AudioVKBInfoMgrCallback> &callback)
937 {
938     AUDIO_INFO_LOG("In");
939     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
940     return AudioPolicyManager::GetInstance().SetAudioVKBInfoMgrCallback(callback);
941 }
942 
CheckVKBInfo(const std::string & bundleName,bool & isValid)943 int32_t AudioSystemManager::CheckVKBInfo(const std::string &bundleName, bool &isValid)
944 {
945     AUDIO_INFO_LOG("In");
946     return AudioPolicyManager::GetInstance().CheckVKBInfo(bundleName, isValid);
947 }
948 
SetQueryBundleNameListCallback(const std::shared_ptr<AudioQueryBundleNameListCallback> & callback)949 int32_t AudioSystemManager::SetQueryBundleNameListCallback(
950     const std::shared_ptr<AudioQueryBundleNameListCallback> &callback)
951 {
952     AUDIO_INFO_LOG("In");
953     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
954     return AudioPolicyManager::GetInstance().SetQueryBundleNameListCallback(callback);
955 }
956 
SetRingerModeCallback(const int32_t clientId,const std::shared_ptr<AudioRingerModeCallback> & callback)957 int32_t AudioSystemManager::SetRingerModeCallback(const int32_t clientId,
958                                                   const std::shared_ptr<AudioRingerModeCallback> &callback)
959 {
960     std::lock_guard<std::mutex> lockSet(ringerModeCallbackMutex_);
961     bool ret = PermissionUtil::VerifySelfPermission();
962     CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
963     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
964 
965     cbClientId_ = clientId;
966     ringerModeCallback_ = callback;
967 
968     return SUCCESS;
969 }
970 
UnsetRingerModeCallback(const int32_t clientId) const971 int32_t AudioSystemManager::UnsetRingerModeCallback(const int32_t clientId) const
972 {
973     CHECK_AND_RETURN_RET(clientId == cbClientId_, ERR_INVALID_OPERATION);
974 
975     return SUCCESS;
976 }
977 
SetMicrophoneMute(bool isMute)978 int32_t AudioSystemManager::SetMicrophoneMute(bool isMute)
979 {
980     return AudioPolicyManager::GetInstance().SetMicrophoneMute(isMute);
981 }
982 
SetVoiceRingtoneMute(bool isMute)983 int32_t AudioSystemManager::SetVoiceRingtoneMute(bool isMute)
984 {
985     AUDIO_INFO_LOG("Set Voice Ringtone is %{public}d", isMute);
986     return AudioPolicyManager::GetInstance().SetVoiceRingtoneMute(isMute);
987 }
988 
IsMicrophoneMute()989 bool AudioSystemManager::IsMicrophoneMute()
990 {
991     std::shared_ptr<AudioGroupManager> groupManager = GetGroupManager(DEFAULT_VOLUME_GROUP_ID);
992     CHECK_AND_RETURN_RET_LOG(groupManager != nullptr, false, "failed, groupManager is null");
993     return groupManager->IsMicrophoneMuteLegacy();
994 }
995 
SelectOutputDevice(std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const996 int32_t AudioSystemManager::SelectOutputDevice(
997     std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const
998 {
999     CHECK_AND_RETURN_RET_LOG(audioDeviceDescriptors.size() == 1 && audioDeviceDescriptors[0] != nullptr,
1000         ERR_INVALID_PARAM, "invalid parameter");
1001     CHECK_AND_RETURN_RET_LOG(audioDeviceDescriptors[0]->deviceRole_ == DeviceRole::OUTPUT_DEVICE,
1002         ERR_INVALID_OPERATION, "not an output device.");
1003     if (audioDeviceDescriptors[0]->networkId_ != LOCAL_NETWORK_ID &&
1004         audioDeviceDescriptors[0]->networkId_.size() != VALID_REMOTE_NETWORK_ID_LENGTH) {
1005         AUDIO_ERR_LOG("SelectOutputDevice: invalid networkId.");
1006         return ERR_INVALID_PARAM;
1007     }
1008     sptr<AudioRendererFilter> audioRendererFilter = new(std::nothrow) AudioRendererFilter();
1009     audioRendererFilter->uid = -1;
1010     int32_t ret = AudioPolicyManager::GetInstance().SelectOutputDevice(audioRendererFilter, audioDeviceDescriptors);
1011     return ret;
1012 }
1013 
SelectInputDevice(std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const1014 int32_t AudioSystemManager::SelectInputDevice(
1015     std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const
1016 {
1017     CHECK_AND_RETURN_RET_LOG(audioDeviceDescriptors.size() == 1 && audioDeviceDescriptors[0] != nullptr,
1018         ERR_INVALID_PARAM, "invalid parameter");
1019     CHECK_AND_RETURN_RET_LOG(audioDeviceDescriptors[0]->deviceRole_ == DeviceRole::INPUT_DEVICE,
1020         ERR_INVALID_OPERATION, "not an output device.");
1021     sptr<AudioCapturerFilter> audioCapturerFilter = new(std::nothrow) AudioCapturerFilter();
1022     audioCapturerFilter->uid = -1;
1023     int32_t ret = AudioPolicyManager::GetInstance().SelectInputDevice(audioCapturerFilter, audioDeviceDescriptors);
1024     return ret;
1025 }
1026 
GetSelectedDeviceInfo(int32_t uid,int32_t pid,AudioStreamType streamType) const1027 std::string AudioSystemManager::GetSelectedDeviceInfo(int32_t uid, int32_t pid, AudioStreamType streamType) const
1028 {
1029     return AudioPolicyManager::GetInstance().GetSelectedDeviceInfo(uid, pid, streamType);
1030 }
1031 
SelectOutputDevice(sptr<AudioRendererFilter> audioRendererFilter,std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const1032 int32_t AudioSystemManager::SelectOutputDevice(sptr<AudioRendererFilter> audioRendererFilter,
1033     std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const
1034 {
1035     // basic check
1036     CHECK_AND_RETURN_RET_LOG(audioRendererFilter != nullptr && audioDeviceDescriptors.size() != 0,
1037         ERR_INVALID_PARAM, "invalid parameter");
1038 
1039     size_t validDeviceSize = 1;
1040     CHECK_AND_RETURN_RET_LOG(audioDeviceDescriptors.size() <= validDeviceSize &&
1041         audioDeviceDescriptors[0] != nullptr, ERR_INVALID_OPERATION, "device error");
1042     audioRendererFilter->streamType = AudioSystemManager::GetStreamType(audioRendererFilter->rendererInfo.contentType,
1043         audioRendererFilter->rendererInfo.streamUsage);
1044     // operation chack
1045     CHECK_AND_RETURN_RET_LOG(audioDeviceDescriptors[0]->deviceRole_ == DeviceRole::OUTPUT_DEVICE,
1046         ERR_INVALID_OPERATION, "not an output device.");
1047 
1048     CHECK_AND_RETURN_RET_LOG(audioDeviceDescriptors[0]->networkId_ == LOCAL_NETWORK_ID ||
1049         audioDeviceDescriptors[0]->networkId_.size() == VALID_REMOTE_NETWORK_ID_LENGTH,
1050         ERR_INVALID_PARAM, "invalid networkId.");
1051     CHECK_AND_RETURN_RET_LOG(audioRendererFilter->uid >= 0 || (audioRendererFilter->uid == -1),
1052         ERR_INVALID_PARAM, "invalid uid.");
1053 
1054     AUDIO_DEBUG_LOG("[%{public}d] SelectOutputDevice: uid<%{public}d> streamType<%{public}d> device<name:%{public}s>",
1055         getpid(), audioRendererFilter->uid, static_cast<int32_t>(audioRendererFilter->streamType),
1056         (audioDeviceDescriptors[0]->networkId_.c_str()));
1057 
1058     return AudioPolicyManager::GetInstance().SelectOutputDevice(audioRendererFilter, audioDeviceDescriptors);
1059 }
1060 
SelectInputDevice(sptr<AudioCapturerFilter> audioCapturerFilter,std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const1061 int32_t AudioSystemManager::SelectInputDevice(sptr<AudioCapturerFilter> audioCapturerFilter,
1062     std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const
1063 {
1064     // basic check
1065     CHECK_AND_RETURN_RET_LOG(audioCapturerFilter != nullptr && audioDeviceDescriptors.size() != 0,
1066         ERR_INVALID_PARAM, "invalid parameter");
1067 
1068     size_t validDeviceSize = 1;
1069     CHECK_AND_RETURN_RET_LOG(audioDeviceDescriptors.size() <= validDeviceSize && audioDeviceDescriptors[0] != nullptr,
1070         ERR_INVALID_OPERATION, "device error.");
1071     // operation chack
1072     CHECK_AND_RETURN_RET_LOG(audioDeviceDescriptors[0]->deviceRole_ == DeviceRole::INPUT_DEVICE,
1073         ERR_INVALID_OPERATION, "not an input device");
1074     CHECK_AND_RETURN_RET_LOG(audioCapturerFilter->uid >= 0 || (audioCapturerFilter->uid == -1),
1075         ERR_INVALID_PARAM, "invalid uid.");
1076     AUDIO_DEBUG_LOG("[%{public}d] SelectInputDevice: uid<%{public}d> device<type:%{public}d>",
1077         getpid(), audioCapturerFilter->uid, static_cast<int32_t>(audioDeviceDescriptors[0]->deviceType_));
1078 
1079     return AudioPolicyManager::GetInstance().SelectInputDevice(audioCapturerFilter, audioDeviceDescriptors);
1080 }
1081 
1082 // LCOV_EXCL_START
ExcludeOutputDevices(AudioDeviceUsage audioDevUsage,std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const1083 int32_t AudioSystemManager::ExcludeOutputDevices(AudioDeviceUsage audioDevUsage,
1084     std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const
1085 {
1086     CHECK_AND_RETURN_RET_LOG(audioDevUsage == MEDIA_OUTPUT_DEVICES || audioDevUsage == CALL_OUTPUT_DEVICES,
1087         ERR_INVALID_PARAM, "invalid parameter: only support output device");
1088     CHECK_AND_RETURN_RET_LOG(!audioDeviceDescriptors.empty(), ERR_INVALID_PARAM, "invalid parameter: empty list");
1089     for (const auto &devDesc : audioDeviceDescriptors) {
1090         CHECK_AND_RETURN_RET_LOG(devDesc != nullptr, ERR_INVALID_PARAM, "invalid parameter: mull pointer in list");
1091         CHECK_AND_RETURN_RET_LOG(!(devDesc->deviceType_ == DEVICE_TYPE_SPEAKER &&
1092             devDesc->networkId_ == LOCAL_NETWORK_ID),
1093             ERR_INVALID_PARAM, "invalid parameter: speaker can not be excluded.");
1094         CHECK_AND_RETURN_RET_LOG(devDesc->deviceType_ != DEVICE_TYPE_EARPIECE, ERR_INVALID_PARAM,
1095             "invalid parameter: earpiece can not be excluded.");
1096         CHECK_AND_RETURN_RET_LOG(devDesc->networkId_ == LOCAL_NETWORK_ID ||
1097             devDesc->networkId_.size() == VALID_REMOTE_NETWORK_ID_LENGTH,
1098             ERR_INVALID_PARAM, "invalid parameter: invalid networkId.");
1099     }
1100     return AudioPolicyManager::GetInstance().ExcludeOutputDevices(audioDevUsage, audioDeviceDescriptors);
1101 }
1102 
UnexcludeOutputDevices(AudioDeviceUsage audioDevUsage,std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const1103 int32_t AudioSystemManager::UnexcludeOutputDevices(AudioDeviceUsage audioDevUsage,
1104     std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const
1105 {
1106     CHECK_AND_RETURN_RET_LOG(audioDevUsage == MEDIA_OUTPUT_DEVICES || audioDevUsage == CALL_OUTPUT_DEVICES,
1107         ERR_INVALID_PARAM, "invalid parameter: only support output device");
1108     CHECK_AND_RETURN_RET_LOG(!audioDeviceDescriptors.empty(), ERR_INVALID_PARAM, "invalid parameter: empty list");
1109     for (const auto &devDesc : audioDeviceDescriptors) {
1110         CHECK_AND_RETURN_RET_LOG(devDesc != nullptr, ERR_INVALID_PARAM, "invalid parameter: mull pointer in list");
1111         CHECK_AND_RETURN_RET_LOG(!(devDesc->deviceType_ == DEVICE_TYPE_SPEAKER &&
1112             devDesc->networkId_ == LOCAL_NETWORK_ID),
1113             ERR_INVALID_PARAM, "invalid parameter: speaker can not be excluded.");
1114         CHECK_AND_RETURN_RET_LOG(devDesc->deviceType_ != DEVICE_TYPE_EARPIECE, ERR_INVALID_PARAM,
1115             "invalid parameter: earpiece can not be excluded.");
1116         CHECK_AND_RETURN_RET_LOG(devDesc->networkId_ == LOCAL_NETWORK_ID ||
1117             devDesc->networkId_.size() == VALID_REMOTE_NETWORK_ID_LENGTH,
1118             ERR_INVALID_PARAM, "invalid parameter: invalid networkId.");
1119     }
1120     return AudioPolicyManager::GetInstance().UnexcludeOutputDevices(audioDevUsage, audioDeviceDescriptors);
1121 }
1122 
UnexcludeOutputDevices(AudioDeviceUsage audioDevUsage) const1123 int32_t AudioSystemManager::UnexcludeOutputDevices(AudioDeviceUsage audioDevUsage) const
1124 {
1125     CHECK_AND_RETURN_RET_LOG(audioDevUsage == MEDIA_OUTPUT_DEVICES || audioDevUsage == CALL_OUTPUT_DEVICES,
1126         ERR_INVALID_PARAM, "invalid parameter: only support output device");
1127     auto unexcludeOutputDevices = GetExcludedDevices(audioDevUsage);
1128     if (unexcludeOutputDevices.empty()) {
1129         return SUCCESS;
1130     }
1131     for (const auto &devDesc : unexcludeOutputDevices) {
1132         CHECK_AND_RETURN_RET_LOG(devDesc != nullptr, ERR_INVALID_PARAM, "invalid parameter: mull pointer in list");
1133         CHECK_AND_RETURN_RET_LOG(!(devDesc->deviceType_ == DEVICE_TYPE_SPEAKER &&
1134             devDesc->networkId_ == LOCAL_NETWORK_ID),
1135             ERR_INVALID_PARAM, "invalid parameter: speaker can not be excluded.");
1136         CHECK_AND_RETURN_RET_LOG(devDesc->deviceType_ != DEVICE_TYPE_EARPIECE, ERR_INVALID_PARAM,
1137             "invalid parameter: earpiece can not be excluded.");
1138         CHECK_AND_RETURN_RET_LOG(devDesc->networkId_ == LOCAL_NETWORK_ID ||
1139             devDesc->networkId_.size() == VALID_REMOTE_NETWORK_ID_LENGTH,
1140             ERR_INVALID_PARAM, "invalid parameter: invalid networkId.");
1141     }
1142     return AudioPolicyManager::GetInstance().UnexcludeOutputDevices(audioDevUsage, unexcludeOutputDevices);
1143 }
1144 // LCOV_EXCL_STOP
1145 
GetExcludedDevices(AudioDeviceUsage audioDevUsage) const1146 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioSystemManager::GetExcludedDevices(
1147     AudioDeviceUsage audioDevUsage) const
1148 {
1149     return AudioPolicyManager::GetInstance().GetExcludedDevices(audioDevUsage);
1150 }
1151 
GetDevices(DeviceFlag deviceFlag)1152 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioSystemManager::GetDevices(DeviceFlag deviceFlag)
1153 {
1154     return AudioPolicyManager::GetInstance().GetDevices(deviceFlag);
1155 }
1156 
GetDevicesInner(DeviceFlag deviceFlag)1157 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioSystemManager::GetDevicesInner(DeviceFlag deviceFlag)
1158 {
1159     return AudioPolicyManager::GetInstance().GetDevicesInner(deviceFlag);
1160 }
1161 
GetActiveOutputDeviceDescriptors()1162 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioSystemManager::GetActiveOutputDeviceDescriptors()
1163 {
1164     AudioRendererInfo rendererInfo;
1165     return AudioPolicyManager::GetInstance().GetPreferredOutputDeviceDescriptors(rendererInfo);
1166 }
1167 
GetPreferredInputDeviceDescriptors()1168 int32_t AudioSystemManager::GetPreferredInputDeviceDescriptors()
1169 {
1170     AudioCapturerInfo capturerInfo;
1171     auto dec = AudioPolicyManager::GetInstance().GetPreferredInputDeviceDescriptors(capturerInfo);
1172     CHECK_AND_RETURN_RET(dec.size() > 0, ERROR_INVALID_PARAM);
1173     return SUCCESS;
1174 }
1175 
GetOutputDevice(sptr<AudioRendererFilter> audioRendererFilter)1176 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioSystemManager::GetOutputDevice(
1177     sptr<AudioRendererFilter> audioRendererFilter)
1178 {
1179     return AudioPolicyManager::GetInstance().GetOutputDevice(audioRendererFilter);
1180 }
1181 
GetInputDevice(sptr<AudioCapturerFilter> audioCapturerFilter)1182 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioSystemManager::GetInputDevice(
1183     sptr<AudioCapturerFilter> audioCapturerFilter)
1184 {
1185     return AudioPolicyManager::GetInstance().GetInputDevice(audioCapturerFilter);
1186 }
1187 
GetAudioFocusInfoList(std::list<std::pair<AudioInterrupt,AudioFocuState>> & focusInfoList)1188 int32_t AudioSystemManager::GetAudioFocusInfoList(std::list<std::pair<AudioInterrupt, AudioFocuState>> &focusInfoList)
1189 {
1190     AUDIO_DEBUG_LOG("Entered %{public}s", __func__);
1191     return AudioPolicyManager::GetInstance().GetAudioFocusInfoList(focusInfoList);
1192 }
1193 
RegisterFocusInfoChangeCallback(const std::shared_ptr<AudioFocusInfoChangeCallback> & callback)1194 int32_t AudioSystemManager::RegisterFocusInfoChangeCallback(
1195     const std::shared_ptr<AudioFocusInfoChangeCallback> &callback)
1196 {
1197     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is null");
1198 
1199     int32_t clientId = GetCallingPid();
1200     AUDIO_DEBUG_LOG("RegisterFocusInfoChangeCallback clientId:%{public}d", clientId);
1201     if (audioFocusInfoCallback_ == nullptr) {
1202         audioFocusInfoCallback_ = std::make_shared<AudioFocusInfoChangeCallbackImpl>();
1203         CHECK_AND_RETURN_RET_LOG(audioFocusInfoCallback_ != nullptr, ERROR,
1204             "Failed to allocate memory for audioInterruptCallback");
1205         int32_t ret = AudioPolicyManager::GetInstance().RegisterFocusInfoChangeCallback(clientId,
1206             audioFocusInfoCallback_);
1207         CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "Failed set callback");
1208     }
1209 
1210     std::shared_ptr<AudioFocusInfoChangeCallbackImpl> cbFocusInfo =
1211         std::static_pointer_cast<AudioFocusInfoChangeCallbackImpl>(audioFocusInfoCallback_);
1212     CHECK_AND_RETURN_RET_LOG(cbFocusInfo != nullptr, ERROR, "cbFocusInfo is nullptr");
1213     cbFocusInfo->SaveCallback(callback);
1214 
1215     return SUCCESS;
1216 }
1217 
UnregisterFocusInfoChangeCallback(const std::shared_ptr<AudioFocusInfoChangeCallback> & callback)1218 int32_t AudioSystemManager::UnregisterFocusInfoChangeCallback(
1219     const std::shared_ptr<AudioFocusInfoChangeCallback> &callback)
1220 {
1221     int32_t clientId = GetCallingPid();
1222     int32_t ret = 0;
1223 
1224     if (callback == nullptr) {
1225         ret = AudioPolicyManager::GetInstance().UnregisterFocusInfoChangeCallback(clientId);
1226         audioFocusInfoCallback_.reset();
1227         audioFocusInfoCallback_ = nullptr;
1228         if (!ret) {
1229             AUDIO_DEBUG_LOG("AudioSystemManager::UnregisterVolumeKeyEventCallback success");
1230         }
1231         return ret;
1232     }
1233     CHECK_AND_RETURN_RET_LOG(audioFocusInfoCallback_ != nullptr, ERROR,
1234         "Failed to allocate memory for audioInterruptCallback");
1235     std::shared_ptr<AudioFocusInfoChangeCallbackImpl> cbFocusInfo =
1236         std::static_pointer_cast<AudioFocusInfoChangeCallbackImpl>(audioFocusInfoCallback_);
1237     cbFocusInfo->RemoveCallback(callback);
1238 
1239     return ret;
1240 }
1241 
RegisterVolumeKeyEventCallback(const int32_t clientPid,const std::shared_ptr<VolumeKeyEventCallback> & callback,API_VERSION api_v)1242 int32_t AudioSystemManager::RegisterVolumeKeyEventCallback(const int32_t clientPid,
1243     const std::shared_ptr<VolumeKeyEventCallback> &callback, API_VERSION api_v)
1244 {
1245     AUDIO_DEBUG_LOG("AudioSystemManager RegisterVolumeKeyEventCallback");
1246 
1247     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM,
1248         "RegisterVolumeKeyEventCallbackcallback is nullptr");
1249     volumeChangeClientPid_ = clientPid;
1250 
1251     return AudioPolicyManager::GetInstance().SetVolumeKeyEventCallback(clientPid, callback, api_v);
1252 }
1253 
UnregisterVolumeKeyEventCallback(const int32_t clientPid,const std::shared_ptr<VolumeKeyEventCallback> & callback)1254 int32_t AudioSystemManager::UnregisterVolumeKeyEventCallback(const int32_t clientPid,
1255     const std::shared_ptr<VolumeKeyEventCallback> &callback)
1256 {
1257     AUDIO_DEBUG_LOG("UnregisterVolumeKeyEventCallback");
1258     int32_t ret = AudioPolicyManager::GetInstance().UnsetVolumeKeyEventCallback(callback);
1259     if (!ret) {
1260         AUDIO_DEBUG_LOG("UnsetVolumeKeyEventCallback success");
1261     }
1262     return ret;
1263 }
1264 
RegisterVolumeDegreeCallback(const int32_t clientPid,const std::shared_ptr<VolumeKeyEventCallback> & callback)1265 int32_t AudioSystemManager::RegisterVolumeDegreeCallback(const int32_t clientPid,
1266     const std::shared_ptr<VolumeKeyEventCallback> &callback)
1267 {
1268     AUDIO_DEBUG_LOG("register");
1269 
1270     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM,
1271         "nullptr");
1272     volumeChangeClientPid_ = clientPid;
1273 
1274     return AudioPolicyManager::GetInstance().SetVolumeDegreeCallback(clientPid, callback);
1275 }
1276 
UnregisterVolumeDegreeCallback(const int32_t clientPid,const std::shared_ptr<VolumeKeyEventCallback> & callback)1277 int32_t AudioSystemManager::UnregisterVolumeDegreeCallback(const int32_t clientPid,
1278     const std::shared_ptr<VolumeKeyEventCallback> &callback)
1279 {
1280     AUDIO_DEBUG_LOG("unregister");
1281     int32_t ret = AudioPolicyManager::GetInstance().UnsetVolumeDegreeCallback(callback);
1282     if (!ret) {
1283         AUDIO_DEBUG_LOG("success");
1284     }
1285     return ret;
1286 }
1287 
RegisterSystemVolumeChangeCallback(const int32_t clientPid,const std::shared_ptr<SystemVolumeChangeCallback> & callback)1288 int32_t AudioSystemManager::RegisterSystemVolumeChangeCallback(const int32_t clientPid,
1289     const std::shared_ptr<SystemVolumeChangeCallback> &callback)
1290 {
1291     AUDIO_DEBUG_LOG("AudioSystemManager RegisterSystemVolumeChangeCallback");
1292 
1293     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM,
1294         "RegisterSystemVolumeChangeCallback callback is nullptr");
1295     volumeChangeClientPid_ = clientPid;
1296 
1297     return AudioPolicyManager::GetInstance().SetSystemVolumeChangeCallback(clientPid, callback);
1298 }
1299 
UnregisterSystemVolumeChangeCallback(const int32_t clientPid,const std::shared_ptr<SystemVolumeChangeCallback> & callback)1300 int32_t AudioSystemManager::UnregisterSystemVolumeChangeCallback(const int32_t clientPid,
1301     const std::shared_ptr<SystemVolumeChangeCallback> &callback)
1302 {
1303     AUDIO_DEBUG_LOG("UnregisterSystemVolumeChangeCallback");
1304     int32_t ret = AudioPolicyManager::GetInstance().UnsetSystemVolumeChangeCallback(callback);
1305     if (!ret) {
1306         AUDIO_DEBUG_LOG("UnsetSystemVolumeChangeCallback success");
1307     }
1308     return ret;
1309 }
1310 
SetAudioMonoState(bool monoState)1311 void AudioSystemManager::SetAudioMonoState(bool monoState)
1312 {
1313     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
1314     CHECK_AND_RETURN_LOG(gasp != nullptr, "Audio service unavailable.");
1315     gasp->SetAudioMonoState(monoState);
1316 }
1317 
SetAudioBalanceValue(float balanceValue)1318 void AudioSystemManager::SetAudioBalanceValue(float balanceValue)
1319 {
1320     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
1321     CHECK_AND_RETURN_LOG(gasp != nullptr, "Audio service unavailable.");
1322     gasp->SetAudioBalanceValue(balanceValue);
1323 }
1324 
SetSystemSoundUri(const std::string & key,const std::string & uri)1325 int32_t AudioSystemManager::SetSystemSoundUri(const std::string &key, const std::string &uri)
1326 {
1327     return AudioPolicyManager::GetInstance().SetSystemSoundUri(key, uri);
1328 }
1329 
GetSystemSoundUri(const std::string & key)1330 std::string AudioSystemManager::GetSystemSoundUri(const std::string &key)
1331 {
1332     return AudioPolicyManager::GetInstance().GetSystemSoundUri(key);
1333 }
1334 
1335 // Below stub implementation is added to handle compilation error in call manager
1336 // Once call manager adapt to new interrupt implementation, this will be removed
SetAudioManagerCallback(const AudioVolumeType streamType,const std::shared_ptr<AudioManagerCallback> & callback)1337 int32_t AudioSystemManager::SetAudioManagerCallback(const AudioVolumeType streamType,
1338                                                     const std::shared_ptr<AudioManagerCallback> &callback)
1339 {
1340     AUDIO_DEBUG_LOG("stub implementation");
1341     return SUCCESS;
1342 }
1343 
UnsetAudioManagerCallback(const AudioVolumeType streamType) const1344 int32_t AudioSystemManager::UnsetAudioManagerCallback(const AudioVolumeType streamType) const
1345 {
1346     AUDIO_DEBUG_LOG("stub implementation");
1347     return SUCCESS;
1348 }
1349 
ActivateAudioInterrupt(AudioInterrupt & audioInterrupt)1350 int32_t AudioSystemManager::ActivateAudioInterrupt(AudioInterrupt &audioInterrupt)
1351 {
1352     AUDIO_DEBUG_LOG("stub implementation");
1353     return AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt);
1354 }
1355 
SetAppConcurrencyMode(const int32_t appUid,const int32_t mode)1356 int32_t AudioSystemManager::SetAppConcurrencyMode(const int32_t appUid, const int32_t mode)
1357 {
1358     AUDIO_DEBUG_LOG("stub implementation");
1359     return AudioPolicyManager::GetInstance().SetAppConcurrencyMode(appUid, mode);
1360 }
1361 
SetAppSlientOnDisplay(const int32_t displayId)1362 int32_t AudioSystemManager::SetAppSlientOnDisplay(const int32_t displayId)
1363 {
1364     AUDIO_DEBUG_LOG("stub implementation");
1365     return AudioPolicyManager::GetInstance().SetAppSlientOnDisplay(displayId);
1366 }
1367 
DeactivateAudioInterrupt(const AudioInterrupt & audioInterrupt) const1368 int32_t AudioSystemManager::DeactivateAudioInterrupt(const AudioInterrupt &audioInterrupt) const
1369 {
1370     AUDIO_DEBUG_LOG("stub implementation");
1371     return AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt);
1372 }
1373 
ActivatePreemptMode() const1374 int32_t AudioSystemManager::ActivatePreemptMode() const
1375 {
1376     AUDIO_DEBUG_LOG("ActivatePreemptMode");
1377     return AudioPolicyManager::GetInstance().ActivatePreemptMode();
1378 }
1379 
DeactivatePreemptMode() const1380 int32_t AudioSystemManager::DeactivatePreemptMode() const
1381 {
1382     AUDIO_DEBUG_LOG("DeactivatePreemptMode");
1383     return AudioPolicyManager::GetInstance().DeactivatePreemptMode();
1384 }
1385 
SetForegroundList(std::vector<std::string> list)1386 int32_t AudioSystemManager::SetForegroundList(std::vector<std::string> list)
1387 {
1388     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
1389     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_ILLEGAL_STATE, "Audio service unavailable.");
1390     std::string identity = IPCSkeleton::ResetCallingIdentity();
1391     int32_t ret = gasp->SetForegroundList(list);
1392     IPCSkeleton::SetCallingIdentity(identity);
1393     CHECK_AND_RETURN_RET_LOG(ret == 0, ret, "failed: %{public}d", ret);
1394     return ret;
1395 }
1396 
GetStandbyStatus(uint32_t sessionId,bool & isStandby,int64_t & enterStandbyTime)1397 int32_t AudioSystemManager::GetStandbyStatus(uint32_t sessionId, bool &isStandby, int64_t &enterStandbyTime)
1398 {
1399     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
1400     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_ILLEGAL_STATE, "Audio service unavailable.");
1401     int32_t ret = gasp->GetStandbyStatus(sessionId, isStandby, enterStandbyTime);
1402     CHECK_AND_RETURN_RET_LOG(ret == 0, ret, "failed: %{public}d", ret);
1403     return ret;
1404 }
1405 
1406 #ifdef HAS_FEATURE_INNERCAPTURER
CheckCaptureLimit(const AudioPlaybackCaptureConfig & config,int32_t & innerCapId)1407 int32_t AudioSystemManager::CheckCaptureLimit(const AudioPlaybackCaptureConfig &config, int32_t &innerCapId)
1408 {
1409     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
1410     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_ILLEGAL_STATE, "Audio service unavailable.");
1411     int32_t ret = gasp->CheckCaptureLimit(config, innerCapId);
1412     CHECK_AND_RETURN_RET_LOG(ret == 0, ret, "failed: %{public}d", ret);
1413     return ret;
1414 }
1415 
ReleaseCaptureLimit(int32_t innerCapId)1416 int32_t AudioSystemManager::ReleaseCaptureLimit(int32_t innerCapId)
1417 {
1418     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
1419     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_ILLEGAL_STATE, "Audio service unavailable.");
1420     int32_t ret = gasp->ReleaseCaptureLimit(innerCapId);
1421     CHECK_AND_RETURN_RET_LOG(ret == 0, ret, "failed: %{public}d", ret);
1422     return ret;
1423 }
1424 #endif
1425 
GenerateSessionId(uint32_t & sessionId)1426 int32_t AudioSystemManager::GenerateSessionId(uint32_t &sessionId)
1427 {
1428     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
1429     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
1430     int32_t ret = gasp->GenerateSessionId(sessionId);
1431     CHECK_AND_RETURN_RET_LOG(ret == 0, AUDIO_ERR, "Get sessionId failed");
1432     return 0;
1433 }
1434 
SetAudioInterruptCallback(const uint32_t sessionID,const std::shared_ptr<AudioInterruptCallback> & callback,uint32_t clientUid,const int32_t zoneID)1435 int32_t AudioSystemManager::SetAudioInterruptCallback(const uint32_t sessionID,
1436     const std::shared_ptr<AudioInterruptCallback> &callback, uint32_t clientUid, const int32_t zoneID)
1437 {
1438     return AudioPolicyManager::GetInstance().SetAudioInterruptCallback(sessionID, callback, clientUid, zoneID);
1439 }
1440 
UnsetAudioInterruptCallback(const int32_t zoneId,const uint32_t sessionId)1441 int32_t AudioSystemManager::UnsetAudioInterruptCallback(const int32_t zoneId, const uint32_t sessionId)
1442 {
1443     return AudioPolicyManager::GetInstance().UnsetAudioInterruptCallback(zoneId, sessionId);
1444 }
1445 
SetAudioManagerInterruptCallback(const std::shared_ptr<AudioManagerCallback> & callback)1446 int32_t AudioSystemManager::SetAudioManagerInterruptCallback(const std::shared_ptr<AudioManagerCallback> &callback)
1447 {
1448     int32_t clientId = GetCallingPid();
1449     AUDIO_INFO_LOG("client id: %{public}d", clientId);
1450     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is null");
1451 
1452     if (audioInterruptCallback_ != nullptr) {
1453         callback->cbMutex_.lock();
1454         AUDIO_DEBUG_LOG("reset existing callback object");
1455         AudioPolicyManager::GetInstance().UnsetAudioManagerInterruptCallback(clientId);
1456         audioInterruptCallback_.reset();
1457         audioInterruptCallback_ = nullptr;
1458         callback->cbMutex_.unlock();
1459     }
1460 
1461     audioInterruptCallback_ = std::make_shared<AudioManagerInterruptCallbackImpl>();
1462     CHECK_AND_RETURN_RET_LOG(audioInterruptCallback_ != nullptr, ERROR,
1463         "Failed to allocate memory for audioInterruptCallback");
1464 
1465     int32_t ret =
1466         AudioPolicyManager::GetInstance().SetAudioManagerInterruptCallback(clientId, audioInterruptCallback_);
1467     CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "Failed set callback");
1468 
1469     std::shared_ptr<AudioManagerInterruptCallbackImpl> cbInterrupt =
1470         std::static_pointer_cast<AudioManagerInterruptCallbackImpl>(audioInterruptCallback_);
1471     CHECK_AND_RETURN_RET_LOG(cbInterrupt != nullptr, ERROR, "cbInterrupt is nullptr");
1472     cbInterrupt->SaveCallback(callback);
1473 
1474     return SUCCESS;
1475 }
1476 
UnsetAudioManagerInterruptCallback()1477 int32_t AudioSystemManager::UnsetAudioManagerInterruptCallback()
1478 {
1479     int32_t clientId = GetCallingPid();
1480     AUDIO_INFO_LOG("client id: %{public}d", clientId);
1481 
1482     int32_t ret = AudioPolicyManager::GetInstance().UnsetAudioManagerInterruptCallback(clientId);
1483     if (audioInterruptCallback_ != nullptr) {
1484         audioInterruptCallback_.reset();
1485         audioInterruptCallback_ = nullptr;
1486     }
1487 
1488     return ret;
1489 }
1490 
RequestAudioFocus(const AudioInterrupt & audioInterrupt)1491 int32_t AudioSystemManager::RequestAudioFocus(const AudioInterrupt &audioInterrupt)
1492 {
1493     int32_t clientId = GetCallingPid();
1494     AUDIO_INFO_LOG("RequestAudioFocus client id: %{public}d", clientId);
1495     CHECK_AND_RETURN_RET_LOG(audioInterrupt.contentType >= CONTENT_TYPE_UNKNOWN &&
1496         audioInterrupt.contentType <= CONTENT_TYPE_ULTRASONIC, ERR_INVALID_PARAM, "Invalid content type");
1497     CHECK_AND_RETURN_RET_LOG(audioInterrupt.streamUsage >= STREAM_USAGE_UNKNOWN &&
1498         audioInterrupt.streamUsage <= STREAM_USAGE_ULTRASONIC, ERR_INVALID_PARAM, "Invalid stream usage");
1499     CHECK_AND_RETURN_RET_LOG(audioInterrupt.audioFocusType.streamType >= STREAM_VOICE_CALL &&
1500         audioInterrupt.audioFocusType.streamType <= STREAM_TYPE_MAX, ERR_INVALID_PARAM, "Invalid stream type");
1501     return AudioPolicyManager::GetInstance().RequestAudioFocus(clientId, audioInterrupt);
1502 }
1503 
AbandonAudioFocus(const AudioInterrupt & audioInterrupt)1504 int32_t AudioSystemManager::AbandonAudioFocus(const AudioInterrupt &audioInterrupt)
1505 {
1506     int32_t clientId = GetCallingPid();
1507     AUDIO_INFO_LOG("AbandonAudioFocus client id: %{public}d", clientId);
1508     CHECK_AND_RETURN_RET_LOG(audioInterrupt.contentType >= CONTENT_TYPE_UNKNOWN &&
1509         audioInterrupt.contentType <= CONTENT_TYPE_ULTRASONIC, ERR_INVALID_PARAM, "Invalid content type");
1510     CHECK_AND_RETURN_RET_LOG(audioInterrupt.streamUsage >= STREAM_USAGE_UNKNOWN &&
1511         audioInterrupt.streamUsage <= STREAM_USAGE_ULTRASONIC, ERR_INVALID_PARAM, "Invalid stream usage");
1512     CHECK_AND_RETURN_RET_LOG(audioInterrupt.audioFocusType.streamType >= STREAM_VOICE_CALL &&
1513         audioInterrupt.audioFocusType.streamType <= STREAM_TYPE_MAX, ERR_INVALID_PARAM, "Invalid stream type");
1514     return AudioPolicyManager::GetInstance().AbandonAudioFocus(clientId, audioInterrupt);
1515 }
1516 
GetVolumeGroups(std::string networkId,std::vector<sptr<VolumeGroupInfo>> & infos)1517 int32_t AudioSystemManager::GetVolumeGroups(std::string networkId, std::vector<sptr<VolumeGroupInfo>> &infos)
1518 {
1519     return AudioPolicyManager::GetInstance().GetVolumeGroupInfos(networkId, infos);
1520 }
1521 
GetGroupManager(int32_t groupId)1522 std::shared_ptr<AudioGroupManager> AudioSystemManager::GetGroupManager(int32_t groupId)
1523 {
1524     std::lock_guard<std::mutex> lock(groupManagerMapMutex_);
1525     std::vector<std::shared_ptr<AudioGroupManager>>::iterator iter = groupManagerMap_.begin();
1526     while (iter != groupManagerMap_.end()) {
1527         if ((*iter)->GetGroupId() == groupId) {
1528             return *iter;
1529         } else {
1530             iter++;
1531         }
1532     }
1533 
1534     std::shared_ptr<AudioGroupManager> groupManager = std::make_shared<AudioGroupManager>(groupId);
1535     if (groupManager->Init() == SUCCESS) {
1536         groupManagerMap_.push_back(groupManager);
1537     } else {
1538         groupManager = nullptr;
1539     }
1540     return groupManager;
1541 }
1542 
AudioManagerInterruptCallbackImpl()1543 AudioManagerInterruptCallbackImpl::AudioManagerInterruptCallbackImpl()
1544 {
1545     AUDIO_INFO_LOG("AudioManagerInterruptCallbackImpl constructor");
1546 }
1547 
~AudioManagerInterruptCallbackImpl()1548 AudioManagerInterruptCallbackImpl::~AudioManagerInterruptCallbackImpl()
1549 {
1550     AUDIO_DEBUG_LOG("AudioManagerInterruptCallbackImpl: instance destroy");
1551 }
1552 
SaveCallback(const std::weak_ptr<AudioManagerCallback> & callback)1553 void AudioManagerInterruptCallbackImpl::SaveCallback(const std::weak_ptr<AudioManagerCallback> &callback)
1554 {
1555     auto wp = callback.lock();
1556     if (wp != nullptr) {
1557         callback_ = callback;
1558     } else {
1559         AUDIO_ERR_LOG("callback is nullptr");
1560     }
1561 }
1562 
OnInterrupt(const InterruptEventInternal & interruptEvent)1563 void AudioManagerInterruptCallbackImpl::OnInterrupt(const InterruptEventInternal &interruptEvent)
1564 {
1565     cb_ = callback_.lock();
1566     if (cb_ != nullptr) {
1567         cb_->cbMutex_.lock();
1568         InterruptAction interruptAction = {};
1569         interruptAction.actionType = (interruptEvent.eventType == INTERRUPT_TYPE_BEGIN)
1570             ? TYPE_INTERRUPT : TYPE_ACTIVATED;
1571         interruptAction.interruptType = interruptEvent.eventType;
1572         interruptAction.interruptHint = interruptEvent.hintType;
1573         interruptAction.activated = (interruptEvent.eventType == INTERRUPT_TYPE_BEGIN) ? false : true;
1574         cb_->OnInterrupt(interruptAction);
1575         AUDIO_DEBUG_LOG("Notify event to app complete");
1576         cb_->cbMutex_.unlock();
1577     } else {
1578         AUDIO_ERR_LOG("callback is null");
1579     }
1580 
1581     return;
1582 }
1583 
RequestIndependentInterrupt(FocusType focusType)1584 bool AudioSystemManager::RequestIndependentInterrupt(FocusType focusType)
1585 {
1586     AUDIO_INFO_LOG("RequestIndependentInterrupt : foncusType");
1587     AudioInterrupt audioInterrupt;
1588     int32_t clientId = GetCallingPid();
1589     audioInterrupt.contentType = ContentType::CONTENT_TYPE_SPEECH;
1590     audioInterrupt.streamUsage = StreamUsage::STREAM_USAGE_MEDIA;
1591     audioInterrupt.audioFocusType.streamType = AudioStreamType::STREAM_RECORDING;
1592     audioInterrupt.streamId = static_cast<uint32_t>(clientId);
1593     int32_t result = AudioPolicyManager::GetInstance().ActivateAudioInterrupt(audioInterrupt);
1594 
1595     AUDIO_DEBUG_LOG("Rresult -> %{public}d", result);
1596     return (result == SUCCESS) ? true:false;
1597 }
AbandonIndependentInterrupt(FocusType focusType)1598 bool AudioSystemManager::AbandonIndependentInterrupt(FocusType focusType)
1599 {
1600     AUDIO_INFO_LOG("AbandonIndependentInterrupt : foncusType");
1601     AudioInterrupt audioInterrupt;
1602     int32_t clientId = GetCallingPid();
1603     audioInterrupt.contentType = ContentType::CONTENT_TYPE_SPEECH;
1604     audioInterrupt.streamUsage = StreamUsage::STREAM_USAGE_MEDIA;
1605     audioInterrupt.audioFocusType.streamType = AudioStreamType::STREAM_RECORDING;
1606     audioInterrupt.streamId = static_cast<uint32_t>(clientId);
1607     int32_t result = AudioPolicyManager::GetInstance().DeactivateAudioInterrupt(audioInterrupt);
1608     AUDIO_DEBUG_LOG("result -> %{public}d", result);
1609     return (result == SUCCESS) ? true:false;
1610 }
1611 
UpdateStreamState(const int32_t clientUid,StreamSetState streamSetState,StreamUsage streamUsage)1612 int32_t AudioSystemManager::UpdateStreamState(const int32_t clientUid,
1613     StreamSetState streamSetState, StreamUsage streamUsage)
1614 {
1615     AUDIO_INFO_LOG("clientUid:%{public}d streamSetState:%{public}d streamUsage:%{public}d",
1616         clientUid, streamSetState, streamUsage);
1617     return AudioPolicyManager::GetInstance().UpdateStreamState(clientUid, streamSetState, streamUsage);
1618 }
1619 
GetSelfBundleName()1620 std::string AudioSystemManager::GetSelfBundleName()
1621 {
1622     AudioXCollie audioXCollie("AudioSystemManager::GetSelfBundleName", GET_BUNDLE_INFO_TIME_OUT_SECONDS,
1623          nullptr, nullptr, AUDIO_XCOLLIE_FLAG_LOG);
1624 
1625     std::string bundleName = "";
1626 
1627     WatchTimeout guard("SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();GetSelfBundleName");
1628     sptr<ISystemAbilityManager> systemAbilityManager =
1629         SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
1630     guard.CheckCurrTimeout();
1631     sptr<OHOS::IRemoteObject> remoteObject =
1632         systemAbilityManager->CheckSystemAbility(BUNDLE_MGR_SERVICE_SYS_ABILITY_ID);
1633     CHECK_AND_RETURN_RET_LOG(remoteObject != nullptr, bundleName, "remoteObject is null");
1634 
1635     sptr<AppExecFwk::IBundleMgr> iBundleMgr = iface_cast<AppExecFwk::IBundleMgr>(remoteObject);
1636     CHECK_AND_RETURN_RET_LOG(iBundleMgr != nullptr, bundleName, "bundlemgr interface is null");
1637 
1638     AppExecFwk::BundleInfo bundleInfo;
1639     WatchTimeout reguard("iBundleMgr->GetBundleInfoForSelf:GetSelfBundleName");
1640     if (iBundleMgr->GetBundleInfoForSelf(0, bundleInfo) == ERR_OK) {
1641         bundleName = bundleInfo.name;
1642     } else {
1643         AUDIO_DEBUG_LOG("Get bundle info failed");
1644     }
1645     reguard.CheckCurrTimeout();
1646     return bundleName;
1647 }
1648 
SetDeviceAbsVolumeSupported(const std::string & macAddress,const bool support)1649 int32_t AudioSystemManager::SetDeviceAbsVolumeSupported(const std::string &macAddress, const bool support)
1650 {
1651     AUDIO_INFO_LOG("AudioSystemManager::SetDeviceAbsVolumeSupported");
1652     return AudioPolicyManager::GetInstance().SetDeviceAbsVolumeSupported(macAddress, support);
1653 }
1654 
SetAdjustVolumeForZone(int32_t zoneId)1655 int32_t AudioSystemManager::SetAdjustVolumeForZone(int32_t zoneId)
1656 {
1657     return AudioPolicyManager::GetInstance().SetAdjustVolumeForZone(zoneId);
1658 }
1659 
SetA2dpDeviceVolume(const std::string & macAddress,const int32_t volume,const bool updateUi)1660 int32_t AudioSystemManager::SetA2dpDeviceVolume(const std::string &macAddress, const int32_t volume,
1661     const bool updateUi)
1662 {
1663     AUDIO_INFO_LOG("volume: %{public}d, update ui: %{public}d", volume, updateUi);
1664     return AudioPolicyManager::GetInstance().SetA2dpDeviceVolume(macAddress, volume, updateUi);
1665 }
1666 
SetNearlinkDeviceVolume(const std::string & macAddress,AudioVolumeType volumeType,const int32_t volume,const bool updateUi)1667 int32_t AudioSystemManager::SetNearlinkDeviceVolume(const std::string &macAddress, AudioVolumeType volumeType,
1668     const int32_t volume, const bool updateUi)
1669 {
1670     AUDIO_INFO_LOG("volume: %{public}d, update ui: %{public}d", volume, updateUi);
1671     return AudioPolicyManager::GetInstance().SetNearlinkDeviceVolume(macAddress, volumeType, volume, updateUi);
1672 }
1673 
GetPinValueFromType(DeviceType deviceType,DeviceRole deviceRole) const1674 AudioPin AudioSystemManager::GetPinValueFromType(DeviceType deviceType, DeviceRole deviceRole) const
1675 {
1676     AudioPin pin = AUDIO_PIN_NONE;
1677     uint16_t dmDeviceType = 0;
1678     switch (deviceType) {
1679         case OHOS::AudioStandard::DEVICE_TYPE_NONE:
1680         case OHOS::AudioStandard::DEVICE_TYPE_INVALID:
1681             pin = AUDIO_PIN_NONE;
1682             break;
1683         case OHOS::AudioStandard::DEVICE_TYPE_DEFAULT:
1684             if (deviceRole == DeviceRole::INPUT_DEVICE) {
1685                 pin = AUDIO_PIN_IN_DAUDIO_DEFAULT;
1686             } else {
1687                 pin = AUDIO_PIN_OUT_DAUDIO_DEFAULT;
1688             }
1689             break;
1690         case OHOS::AudioStandard::DEVICE_TYPE_SPEAKER:
1691             pin = AUDIO_PIN_OUT_SPEAKER;
1692             break;
1693         case OHOS::AudioStandard::DEVICE_TYPE_MIC:
1694         case OHOS::AudioStandard::DEVICE_TYPE_WAKEUP:
1695             pin = AUDIO_PIN_IN_MIC;
1696             break;
1697         case OHOS::AudioStandard::DEVICE_TYPE_WIRED_HEADSET:
1698         case OHOS::AudioStandard::DEVICE_TYPE_WIRED_HEADPHONES:
1699         case OHOS::AudioStandard::DEVICE_TYPE_DP:
1700         case OHOS::AudioStandard::DEVICE_TYPE_USB_HEADSET:
1701         case OHOS::AudioStandard::DEVICE_TYPE_HDMI:
1702         case OHOS::AudioStandard::DEVICE_TYPE_ACCESSORY:
1703             pin = GetPinValueForPeripherals(deviceType, deviceRole, dmDeviceType);
1704             break;
1705         default:
1706             OtherDeviceTypeCases(deviceType);
1707             break;
1708     }
1709     return pin;
1710 }
1711 
OtherDeviceTypeCases(DeviceType deviceType) const1712 void AudioSystemManager::OtherDeviceTypeCases(DeviceType deviceType) const
1713 {
1714     switch (deviceType) {
1715         case OHOS::AudioStandard::DEVICE_TYPE_FILE_SINK:
1716         case OHOS::AudioStandard::DEVICE_TYPE_FILE_SOURCE:
1717         case OHOS::AudioStandard::DEVICE_TYPE_BLUETOOTH_SCO:
1718         case OHOS::AudioStandard::DEVICE_TYPE_BLUETOOTH_A2DP:
1719         case OHOS::AudioStandard::DEVICE_TYPE_MAX:
1720             AUDIO_INFO_LOG("don't supported the device type");
1721             break;
1722         default:
1723             AUDIO_INFO_LOG("invalid input parameter");
1724             break;
1725     }
1726 }
1727 
GetPinValueForPeripherals(DeviceType deviceType,DeviceRole deviceRole,uint16_t dmDeviceType) const1728 AudioPin AudioSystemManager::GetPinValueForPeripherals(DeviceType deviceType, DeviceRole deviceRole,
1729     uint16_t dmDeviceType) const
1730 {
1731     AudioPin pin = AUDIO_PIN_NONE;
1732     switch (deviceType) {
1733         case OHOS::AudioStandard::DEVICE_TYPE_WIRED_HEADSET:
1734             if (deviceRole == DeviceRole::INPUT_DEVICE) {
1735                 pin = AUDIO_PIN_IN_HS_MIC;
1736             } else {
1737                 pin = AUDIO_PIN_OUT_HEADSET;
1738             }
1739             break;
1740         case OHOS::AudioStandard::DEVICE_TYPE_WIRED_HEADPHONES:
1741             pin = AUDIO_PIN_OUT_HEADPHONE;
1742             break;
1743         case OHOS::AudioStandard::DEVICE_TYPE_DP:
1744             pin = AUDIO_PIN_OUT_DP;
1745             break;
1746         case OHOS::AudioStandard::DEVICE_TYPE_USB_HEADSET:
1747             if (deviceRole == DeviceRole::INPUT_DEVICE) {
1748                 pin = AUDIO_PIN_IN_USB_HEADSET;
1749             } else {
1750                 pin = AUDIO_PIN_OUT_USB_HEADSET;
1751             }
1752             break;
1753         case OHOS::AudioStandard::DEVICE_TYPE_HDMI:
1754             pin = AUDIO_PIN_OUT_HDMI;
1755             break;
1756         case OHOS::AudioStandard::DEVICE_TYPE_ACCESSORY:
1757             dmDeviceType = GetDmDeviceType();
1758             if (dmDeviceType == DM_DEVICE_TYPE_PENCIL) {
1759                 pin = AUDIO_PIN_IN_PENCIL;
1760             } else if (dmDeviceType == DM_DEVICE_TYPE_UWB) {
1761                 pin = AUDIO_PIN_IN_UWB;
1762             }
1763             break;
1764         default:
1765             AUDIO_INFO_LOG("other case");
1766     }
1767     return pin;
1768 }
1769 
GetTypeValueFromPin(AudioPin pin) const1770 DeviceType AudioSystemManager::GetTypeValueFromPin(AudioPin pin) const
1771 {
1772     DeviceType type = DEVICE_TYPE_NONE;
1773     switch (pin) {
1774         case OHOS::AudioStandard::AUDIO_PIN_NONE:
1775             type = DEVICE_TYPE_NONE;
1776             break;
1777         case OHOS::AudioStandard::AUDIO_PIN_OUT_SPEAKER:
1778             type = DEVICE_TYPE_SPEAKER;
1779             break;
1780         case OHOS::AudioStandard::AUDIO_PIN_OUT_HEADSET:
1781             break;
1782         case OHOS::AudioStandard::AUDIO_PIN_OUT_LINEOUT:
1783             break;
1784         case OHOS::AudioStandard::AUDIO_PIN_OUT_HDMI:
1785             break;
1786         case OHOS::AudioStandard::AUDIO_PIN_OUT_USB:
1787             break;
1788         case OHOS::AudioStandard::AUDIO_PIN_OUT_USB_EXT:
1789             break;
1790         case OHOS::AudioStandard::AUDIO_PIN_OUT_DAUDIO_DEFAULT:
1791             type = DEVICE_TYPE_DEFAULT;
1792             break;
1793         case OHOS::AudioStandard::AUDIO_PIN_IN_MIC:
1794             type = DEVICE_TYPE_MIC;
1795             break;
1796         case OHOS::AudioStandard::AUDIO_PIN_IN_HS_MIC:
1797             type = DEVICE_TYPE_WIRED_HEADSET;
1798             break;
1799         case OHOS::AudioStandard::AUDIO_PIN_IN_LINEIN:
1800             break;
1801         case OHOS::AudioStandard::AUDIO_PIN_IN_USB_EXT:
1802             break;
1803         case OHOS::AudioStandard::AUDIO_PIN_IN_DAUDIO_DEFAULT:
1804             type = DEVICE_TYPE_DEFAULT;
1805             break;
1806         case OHOS::AudioStandard::AUDIO_PIN_IN_PENCIL:
1807         case OHOS::AudioStandard::AUDIO_PIN_IN_UWB:
1808             type = DEVICE_TYPE_ACCESSORY;
1809             break;
1810         default:
1811             AUDIO_INFO_LOG("invalid input parameter");
1812             break;
1813     }
1814     return type;
1815 }
1816 
RegisterWakeupSourceCallback()1817 int32_t AudioSystemManager::RegisterWakeupSourceCallback()
1818 {
1819     AUDIO_INFO_LOG("RegisterWakeupSourceCallback");
1820     remoteWakeUpCallback_ = std::make_shared<WakeUpCallbackImpl>(this);
1821 
1822     sptr<AudioManagerListenerStubImpl> wakeupCloseCbStub = new(std::nothrow) AudioManagerListenerStubImpl();
1823     CHECK_AND_RETURN_RET_LOG(wakeupCloseCbStub != nullptr, ERROR,
1824         "wakeupCloseCbStub is null");
1825     wakeupCloseCbStub->SetWakeupSourceCallback(remoteWakeUpCallback_);
1826 
1827     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
1828     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERROR, "GetAudioParameter::Audio service unavailable.");
1829 
1830     sptr<IRemoteObject> object = wakeupCloseCbStub->AsObject();
1831     if (object == nullptr) {
1832         AUDIO_ERR_LOG("SetWakeupCloseCallback listenerStub object is nullptr");
1833         return ERROR;
1834     }
1835     return gasp->SetWakeupSourceCallback(object);
1836 }
1837 
SetAudioCapturerSourceCallback(const std::shared_ptr<AudioCapturerSourceCallback> & callback)1838 int32_t AudioSystemManager::SetAudioCapturerSourceCallback(
1839     const std::shared_ptr<AudioCapturerSourceCallback> &callback)
1840 {
1841     audioCapturerSourceCallback_ = callback;
1842     return RegisterWakeupSourceCallback();
1843 }
1844 
SetWakeUpSourceCloseCallback(const std::shared_ptr<WakeUpSourceCloseCallback> & callback)1845 int32_t AudioSystemManager::SetWakeUpSourceCloseCallback(const std::shared_ptr<WakeUpSourceCloseCallback> &callback)
1846 {
1847     audioWakeUpSourceCloseCallback_ = callback;
1848     return RegisterWakeupSourceCallback();
1849 }
1850 
SetAvailableDeviceChangeCallback(const AudioDeviceUsage usage,const std::shared_ptr<AudioManagerAvailableDeviceChangeCallback> & callback)1851 int32_t AudioSystemManager::SetAvailableDeviceChangeCallback(const AudioDeviceUsage usage,
1852     const std::shared_ptr<AudioManagerAvailableDeviceChangeCallback>& callback)
1853 {
1854     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
1855 
1856     int32_t clientId = GetCallingPid();
1857     return AudioPolicyManager::GetInstance().SetAvailableDeviceChangeCallback(clientId, usage, callback);
1858 }
1859 
UnsetAvailableDeviceChangeCallback(AudioDeviceUsage usage)1860 int32_t AudioSystemManager::UnsetAvailableDeviceChangeCallback(AudioDeviceUsage usage)
1861 {
1862     int32_t clientId = GetCallingPid();
1863     return AudioPolicyManager::GetInstance().UnsetAvailableDeviceChangeCallback(clientId, usage);
1864 }
1865 
ConfigDistributedRoutingRole(std::shared_ptr<AudioDeviceDescriptor> descriptor,CastType type)1866 int32_t AudioSystemManager::ConfigDistributedRoutingRole(
1867     std::shared_ptr<AudioDeviceDescriptor> descriptor, CastType type)
1868 {
1869     if (descriptor == nullptr) {
1870         AUDIO_ERR_LOG("ConfigDistributedRoutingRole: invalid parameter");
1871         return ERR_INVALID_PARAM;
1872     }
1873     AUDIO_INFO_LOG(" Entered ConfigDistributedRoutingRole casttype %{public}d", type);
1874     if (descriptor->deviceRole_ != DeviceRole::OUTPUT_DEVICE) {
1875         AUDIO_ERR_LOG("ConfigDistributedRoutingRole: not an output device");
1876         return ERR_INVALID_PARAM;
1877     }
1878 
1879     if (descriptor->networkId_ != LOCAL_NETWORK_ID &&
1880         descriptor->networkId_.size() != VALID_REMOTE_NETWORK_ID_LENGTH) {
1881         AUDIO_ERR_LOG("ConfigDistributedRoutingRole: invalid networkId");
1882         return ERR_INVALID_PARAM;
1883     }
1884 
1885     int32_t ret = AudioPolicyManager::GetInstance().ConfigDistributedRoutingRole(descriptor, type);
1886     return ret;
1887 }
1888 
SetDistributedRoutingRoleCallback(const std::shared_ptr<AudioDistributedRoutingRoleCallback> & callback)1889 int32_t AudioSystemManager::SetDistributedRoutingRoleCallback(
1890     const std::shared_ptr<AudioDistributedRoutingRoleCallback> &callback)
1891 {
1892     if (callback == nullptr) {
1893         AUDIO_ERR_LOG("SetDistributedRoutingRoleCallback: callback is nullptr");
1894         return ERR_INVALID_PARAM;
1895     }
1896 
1897     if (audioDistributedRoutingRoleCallback_ == nullptr) {
1898         audioDistributedRoutingRoleCallback_ = std::make_shared<AudioDistributedRoutingRoleCallbackImpl>();
1899         if (audioDistributedRoutingRoleCallback_ == nullptr) {
1900             AUDIO_ERR_LOG("AudioSystemManger failed to allocate memory for distributedRoutingRole callback");
1901             return ERROR;
1902         }
1903         int32_t ret = AudioPolicyManager::GetInstance().
1904             SetDistributedRoutingRoleCallback(audioDistributedRoutingRoleCallback_);
1905         if (ret != SUCCESS) {
1906             AUDIO_ERR_LOG("AudioSystemManger failed to set distributedRoutingRole callback");
1907             return ERROR;
1908         }
1909     }
1910 
1911     std::shared_ptr<AudioDistributedRoutingRoleCallbackImpl> cbImpl =
1912         std::static_pointer_cast<AudioDistributedRoutingRoleCallbackImpl>(audioDistributedRoutingRoleCallback_);
1913     if (cbImpl == nullptr) {
1914         AUDIO_ERR_LOG("AudioSystemManger cbImpl is nullptr");
1915         return ERROR;
1916     }
1917     cbImpl->SaveCallback(callback);
1918     return SUCCESS;
1919 }
1920 
UnsetDistributedRoutingRoleCallback(const std::shared_ptr<AudioDistributedRoutingRoleCallback> & callback)1921 int32_t AudioSystemManager::UnsetDistributedRoutingRoleCallback(
1922     const std::shared_ptr<AudioDistributedRoutingRoleCallback> &callback)
1923 {
1924     int32_t ret = AudioPolicyManager::GetInstance().UnsetDistributedRoutingRoleCallback();
1925     if (audioDistributedRoutingRoleCallback_ != nullptr) {
1926         audioDistributedRoutingRoleCallback_.reset();
1927         audioDistributedRoutingRoleCallback_ = nullptr;
1928     }
1929 
1930     std::shared_ptr<AudioDistributedRoutingRoleCallbackImpl> cbImpl =
1931         std::static_pointer_cast<AudioDistributedRoutingRoleCallbackImpl>(audioDistributedRoutingRoleCallback_);
1932     if (cbImpl == nullptr) {
1933         AUDIO_ERR_LOG("AudioSystemManger cbImpl is nullptr");
1934         return ERROR;
1935     }
1936     cbImpl->RemoveCallback(callback);
1937     return ret;
1938 }
1939 
SaveCallback(const std::shared_ptr<AudioDistributedRoutingRoleCallback> & callback)1940 void AudioDistributedRoutingRoleCallbackImpl::SaveCallback(
1941     const std::shared_ptr<AudioDistributedRoutingRoleCallback> &callback)
1942 {
1943     bool hasCallback = false;
1944     std::lock_guard<std::mutex> cbListLock(cbListMutex_);
1945     for (auto it = callbackList_.begin(); it != callbackList_.end(); ++it) {
1946         if ((*it) == callback) {
1947             hasCallback = true;
1948         }
1949     }
1950     if (!hasCallback) {
1951         callbackList_.push_back(callback);
1952     }
1953 }
1954 
RemoveCallback(const std::shared_ptr<AudioDistributedRoutingRoleCallback> & callback)1955 void AudioDistributedRoutingRoleCallbackImpl::RemoveCallback(
1956     const std::shared_ptr<AudioDistributedRoutingRoleCallback> &callback)
1957 {
1958     AUDIO_INFO_LOG("Entered %{public}s", __func__);
1959     std::lock_guard<std::mutex> cbListLock(cbListMutex_);
1960     callbackList_.remove_if([&callback](std::shared_ptr<AudioDistributedRoutingRoleCallback> &callback_) {
1961         return callback_ == callback;
1962     });
1963 }
1964 
OnDistributedRoutingRoleChange(std::shared_ptr<AudioDeviceDescriptor> descriptor,const CastType type)1965 void AudioDistributedRoutingRoleCallbackImpl::OnDistributedRoutingRoleChange(
1966     std::shared_ptr<AudioDeviceDescriptor>descriptor, const CastType type)
1967 {
1968     std::vector<std::shared_ptr<AudioDistributedRoutingRoleCallback>> temp_;
1969     std::unique_lock<mutex> cbListLock(cbListMutex_);
1970     for (auto callback = callbackList_.begin(); callback != callbackList_.end(); ++callback) {
1971         cb_ = (*callback);
1972         if (cb_ != nullptr) {
1973             AUDIO_DEBUG_LOG("OnDistributedRoutingRoleChange : Notify event to app complete");
1974             temp_.push_back(cb_);
1975         } else {
1976             AUDIO_ERR_LOG("OnDistributedRoutingRoleChange: callback is null");
1977         }
1978     }
1979     cbListLock.unlock();
1980     for (uint32_t i = 0; i < temp_.size(); i++) {
1981         temp_[i]->OnDistributedRoutingRoleChange(descriptor, type);
1982     }
1983     return;
1984 }
1985 
AudioDistributedRoutingRoleCallbackImpl()1986 AudioDistributedRoutingRoleCallbackImpl::AudioDistributedRoutingRoleCallbackImpl()
1987 {
1988     AUDIO_INFO_LOG("AudioDistributedRoutingRoleCallbackImpl constructor");
1989 }
1990 
~AudioDistributedRoutingRoleCallbackImpl()1991 AudioDistributedRoutingRoleCallbackImpl::~AudioDistributedRoutingRoleCallbackImpl()
1992 {
1993     AUDIO_INFO_LOG("AudioDistributedRoutingRoleCallbackImpl destroy");
1994 }
1995 
SetCallDeviceActive(DeviceType deviceType,bool flag,std::string address,const int32_t clientUid) const1996 int32_t AudioSystemManager::SetCallDeviceActive(DeviceType deviceType, bool flag, std::string address,
1997     const int32_t clientUid) const
1998 {
1999     int32_t uid = clientUid == -1 ? getuid() : clientUid;
2000     return (AudioPolicyManager::GetInstance().SetCallDeviceActive(static_cast<InternalDeviceType>(deviceType),
2001         flag, address, uid));
2002 }
2003 
GetEffectLatency(const std::string & sessionId)2004 uint32_t AudioSystemManager::GetEffectLatency(const std::string &sessionId)
2005 {
2006     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
2007     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_INVALID_PARAM, "Audio service unavailable.");
2008     uint32_t latency = 0;
2009     int32_t res = gasp->GetEffectLatency(sessionId, latency);
2010     CHECK_AND_RETURN_RET_LOG(res == SUCCESS, ERR_OPERATION_FAILED, "GetEffectLatency failed");
2011     return latency;
2012 }
2013 
DisableSafeMediaVolume()2014 int32_t AudioSystemManager::DisableSafeMediaVolume()
2015 {
2016     return AudioPolicyManager::GetInstance().DisableSafeMediaVolume();
2017 }
2018 
InjectInterruption(const std::string networkId,InterruptEvent & event)2019 int32_t AudioSystemManager::InjectInterruption(const std::string networkId, InterruptEvent &event)
2020 {
2021     return AudioPolicyManager::GetInstance().InjectInterruption(networkId, event);
2022 }
2023 
LoadSplitModule(const std::string & splitArgs,const std::string & networkId)2024 int32_t AudioSystemManager::LoadSplitModule(const std::string &splitArgs, const std::string &networkId)
2025 {
2026     return AudioPolicyManager::GetInstance().LoadSplitModule(splitArgs, networkId);
2027 }
2028 
SetVirtualCall(const bool isVirtual)2029 int32_t AudioSystemManager::SetVirtualCall(const bool isVirtual)
2030 {
2031     return AudioPolicyManager::GetInstance().SetVirtualCall(isVirtual);
2032 }
2033 
SetQueryAllowedPlaybackCallback(const std::shared_ptr<AudioQueryAllowedPlaybackCallback> & callback)2034 int32_t AudioSystemManager::SetQueryAllowedPlaybackCallback(
2035     const std::shared_ptr<AudioQueryAllowedPlaybackCallback> &callback)
2036 {
2037     AUDIO_INFO_LOG("In");
2038     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
2039     return AudioPolicyManager::GetInstance().SetQueryAllowedPlaybackCallback(callback);
2040 }
2041 
SetBackgroundMuteCallback(const std::shared_ptr<AudioBackgroundMuteCallback> & callback)2042 int32_t AudioSystemManager::SetBackgroundMuteCallback(
2043     const std::shared_ptr<AudioBackgroundMuteCallback> &callback)
2044 {
2045     AUDIO_INFO_LOG("In");
2046     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
2047     return AudioPolicyManager::GetInstance().SetBackgroundMuteCallback(callback);
2048 }
2049 
OnVoiceWakeupState(bool state)2050 int32_t AudioSystemManager::OnVoiceWakeupState(bool state)
2051 {
2052     AUDIO_INFO_LOG("%{public}d", state);
2053     return SUCCESS;
2054 }
2055 
GetDmDeviceType() const2056 uint16_t AudioSystemManager::GetDmDeviceType() const
2057 {
2058     return AudioPolicyManager::GetInstance().GetDmDeviceType();
2059 }
2060 
NotifySessionStateChange(const int32_t uid,const int32_t pid,const bool hasSession)2061 int32_t AudioSystemManager::NotifySessionStateChange(const int32_t uid, const int32_t pid, const bool hasSession)
2062 {
2063     AUDIO_INFO_LOG("Set uid:%{public}d, pid:%{public}d, Session state:%{public}d", uid, pid, hasSession);
2064     return AudioPolicyManager::GetInstance().NotifySessionStateChange(uid, pid, hasSession);
2065 }
2066 
NotifyFreezeStateChange(const std::set<int32_t> & pidList,const bool isFreeze)2067 int32_t AudioSystemManager::NotifyFreezeStateChange(const std::set<int32_t> &pidList, const bool isFreeze)
2068 {
2069     AUDIO_INFO_LOG("In");
2070     return AudioPolicyManager::GetInstance().NotifyFreezeStateChange(pidList, isFreeze);
2071 }
2072 
ResetAllProxy()2073 int32_t AudioSystemManager::ResetAllProxy()
2074 {
2075     AUDIO_INFO_LOG("RSS IN");
2076     return AudioPolicyManager::GetInstance().ResetAllProxy();
2077 }
2078 
NotifyProcessBackgroundState(const int32_t uid,const int32_t pid)2079 int32_t AudioSystemManager::NotifyProcessBackgroundState(const int32_t uid, const int32_t pid)
2080 {
2081     AUDIO_INFO_LOG("RSS IN");
2082     return AudioPolicyManager::GetInstance().NotifyProcessBackgroundState(uid, pid);
2083 }
2084 
GetMaxVolumeByUsage(StreamUsage streamUsage)2085 int32_t AudioSystemManager::GetMaxVolumeByUsage(StreamUsage streamUsage)
2086 {
2087     AUDIO_INFO_LOG("GetMaxVolumeByUsage for streamUsage [%{public}d]", streamUsage);
2088     switch (streamUsage) {
2089         case STREAM_USAGE_UNKNOWN:
2090         case STREAM_USAGE_MUSIC:
2091         case STREAM_USAGE_VOICE_COMMUNICATION:
2092         case STREAM_USAGE_VOICE_ASSISTANT:
2093         case STREAM_USAGE_ALARM:
2094         case STREAM_USAGE_VOICE_MESSAGE:
2095         case STREAM_USAGE_RINGTONE:
2096         case STREAM_USAGE_NOTIFICATION:
2097         case STREAM_USAGE_ACCESSIBILITY:
2098         case STREAM_USAGE_MOVIE:
2099         case STREAM_USAGE_GAME:
2100         case STREAM_USAGE_AUDIOBOOK:
2101         case STREAM_USAGE_NAVIGATION:
2102         case STREAM_USAGE_VIDEO_COMMUNICATION:
2103             break;
2104         case STREAM_USAGE_SYSTEM:
2105         case STREAM_USAGE_DTMF:
2106         case STREAM_USAGE_ENFORCED_TONE:
2107         case STREAM_USAGE_ULTRASONIC: {
2108             bool ret = PermissionUtil::VerifySelfPermission();
2109             CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
2110             break;
2111         }
2112         default:
2113             AUDIO_ERR_LOG("streamUsage=%{public}d not supported", streamUsage);
2114             return ERR_NOT_SUPPORTED;
2115     }
2116     return AudioPolicyManager::GetInstance().GetMaxVolumeLevelByUsage(streamUsage);
2117 }
2118 
GetMinVolumeByUsage(StreamUsage streamUsage)2119 int32_t AudioSystemManager::GetMinVolumeByUsage(StreamUsage streamUsage)
2120 {
2121     AUDIO_INFO_LOG("GetMinVolumeByUsage for streamUsage [%{public}d]", streamUsage);
2122     switch (streamUsage) {
2123         case STREAM_USAGE_UNKNOWN:
2124         case STREAM_USAGE_MUSIC:
2125         case STREAM_USAGE_VOICE_COMMUNICATION:
2126         case STREAM_USAGE_VOICE_ASSISTANT:
2127         case STREAM_USAGE_ALARM:
2128         case STREAM_USAGE_VOICE_MESSAGE:
2129         case STREAM_USAGE_RINGTONE:
2130         case STREAM_USAGE_NOTIFICATION:
2131         case STREAM_USAGE_ACCESSIBILITY:
2132         case STREAM_USAGE_MOVIE:
2133         case STREAM_USAGE_GAME:
2134         case STREAM_USAGE_AUDIOBOOK:
2135         case STREAM_USAGE_NAVIGATION:
2136         case STREAM_USAGE_VIDEO_COMMUNICATION:
2137             break;
2138         case STREAM_USAGE_SYSTEM:
2139         case STREAM_USAGE_DTMF:
2140         case STREAM_USAGE_ENFORCED_TONE:
2141         case STREAM_USAGE_ULTRASONIC: {
2142             bool ret = PermissionUtil::VerifySelfPermission();
2143             CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
2144             break;
2145         }
2146         default:
2147             AUDIO_ERR_LOG("streamUsage=%{public}d not supported", streamUsage);
2148             return ERR_NOT_SUPPORTED;
2149     }
2150     return AudioPolicyManager::GetInstance().GetMinVolumeLevelByUsage(streamUsage);
2151 }
2152 
GetVolumeByUsage(StreamUsage streamUsage)2153 int32_t AudioSystemManager::GetVolumeByUsage(StreamUsage streamUsage)
2154 {
2155     AUDIO_INFO_LOG("GetVolumeByUsage for streamUsage [%{public}d]", streamUsage);
2156     switch (streamUsage) {
2157         case STREAM_USAGE_UNKNOWN:
2158         case STREAM_USAGE_MUSIC:
2159         case STREAM_USAGE_VOICE_COMMUNICATION:
2160         case STREAM_USAGE_VOICE_ASSISTANT:
2161         case STREAM_USAGE_ALARM:
2162         case STREAM_USAGE_VOICE_MESSAGE:
2163         case STREAM_USAGE_RINGTONE:
2164         case STREAM_USAGE_NOTIFICATION:
2165         case STREAM_USAGE_ACCESSIBILITY:
2166         case STREAM_USAGE_MOVIE:
2167         case STREAM_USAGE_GAME:
2168         case STREAM_USAGE_AUDIOBOOK:
2169         case STREAM_USAGE_NAVIGATION:
2170         case STREAM_USAGE_VIDEO_COMMUNICATION:
2171             break;
2172         case STREAM_USAGE_SYSTEM:
2173         case STREAM_USAGE_DTMF:
2174         case STREAM_USAGE_ENFORCED_TONE:
2175         case STREAM_USAGE_ULTRASONIC: {
2176             bool ret = PermissionUtil::VerifySelfPermission();
2177             CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
2178             break;
2179         }
2180         default:
2181             AUDIO_ERR_LOG("streamUsage=%{public}d not supported", streamUsage);
2182             return ERR_NOT_SUPPORTED;
2183     }
2184     return AudioPolicyManager::GetInstance().GetVolumeLevelByUsage(streamUsage);
2185 }
2186 
IsStreamMuteByUsage(StreamUsage streamUsage,bool & isMute)2187 int32_t AudioSystemManager::IsStreamMuteByUsage(StreamUsage streamUsage, bool &isMute)
2188 {
2189     AUDIO_INFO_LOG("IsStreamMuteByUsage for streamUsage [%{public}d]", streamUsage);
2190     switch (streamUsage) {
2191         case STREAM_USAGE_UNKNOWN:
2192         case STREAM_USAGE_MUSIC:
2193         case STREAM_USAGE_VOICE_COMMUNICATION:
2194         case STREAM_USAGE_VOICE_ASSISTANT:
2195         case STREAM_USAGE_ALARM:
2196         case STREAM_USAGE_VOICE_MESSAGE:
2197         case STREAM_USAGE_RINGTONE:
2198         case STREAM_USAGE_NOTIFICATION:
2199         case STREAM_USAGE_ACCESSIBILITY:
2200         case STREAM_USAGE_MOVIE:
2201         case STREAM_USAGE_GAME:
2202         case STREAM_USAGE_AUDIOBOOK:
2203         case STREAM_USAGE_NAVIGATION:
2204         case STREAM_USAGE_VIDEO_COMMUNICATION:
2205             break;
2206         case STREAM_USAGE_SYSTEM:
2207         case STREAM_USAGE_DTMF:
2208         case STREAM_USAGE_ENFORCED_TONE:
2209         case STREAM_USAGE_ULTRASONIC: {
2210             bool ret = PermissionUtil::VerifySelfPermission();
2211             CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
2212             break;
2213         }
2214         default:
2215             AUDIO_ERR_LOG("streamUsage=%{public}d not supported", streamUsage);
2216             return ERR_NOT_SUPPORTED;
2217     }
2218     isMute = AudioPolicyManager::GetInstance().GetStreamMuteByUsage(streamUsage);
2219     return SUCCESS;
2220 }
2221 
GetVolumeInDbByStream(StreamUsage streamUsage,int32_t volumeLevel,DeviceType deviceType)2222 float AudioSystemManager::GetVolumeInDbByStream(StreamUsage streamUsage, int32_t volumeLevel, DeviceType deviceType)
2223 {
2224     AUDIO_INFO_LOG("GetVolumeInDbByStream for streamUsage [%{public}d]", streamUsage);
2225     switch (streamUsage) {
2226         case STREAM_USAGE_UNKNOWN:
2227         case STREAM_USAGE_MUSIC:
2228         case STREAM_USAGE_VOICE_COMMUNICATION:
2229         case STREAM_USAGE_VOICE_ASSISTANT:
2230         case STREAM_USAGE_ALARM:
2231         case STREAM_USAGE_VOICE_MESSAGE:
2232         case STREAM_USAGE_RINGTONE:
2233         case STREAM_USAGE_NOTIFICATION:
2234         case STREAM_USAGE_ACCESSIBILITY:
2235         case STREAM_USAGE_MOVIE:
2236         case STREAM_USAGE_GAME:
2237         case STREAM_USAGE_AUDIOBOOK:
2238         case STREAM_USAGE_NAVIGATION:
2239         case STREAM_USAGE_VIDEO_COMMUNICATION:
2240             break;
2241         case STREAM_USAGE_SYSTEM:
2242         case STREAM_USAGE_DTMF:
2243         case STREAM_USAGE_ENFORCED_TONE:
2244         case STREAM_USAGE_ULTRASONIC: {
2245             bool ret = PermissionUtil::VerifySelfPermission();
2246             CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
2247             break;
2248         }
2249         default:
2250             AUDIO_ERR_LOG("streamUsage=%{public}d not supported", streamUsage);
2251             return ERR_NOT_SUPPORTED;
2252     }
2253     return AudioPolicyManager::GetInstance().GetVolumeInDbByStream(streamUsage, volumeLevel, deviceType);
2254 }
2255 
GetSupportedAudioVolumeTypes()2256 std::vector<AudioVolumeType> AudioSystemManager::GetSupportedAudioVolumeTypes()
2257 {
2258     bool ret = PermissionUtil::VerifySelfPermission();
2259     CHECK_AND_RETURN_RET_LOG(ret, {}, "No system App");
2260     AUDIO_INFO_LOG("enter AudioSystemManager::GetSupportedAudioVolumeTypes");
2261     return AudioPolicyManager::GetInstance().GetSupportedAudioVolumeTypes();
2262 }
2263 
GetAudioVolumeTypeByStreamUsage(StreamUsage streamUsage)2264 AudioVolumeType AudioSystemManager::GetAudioVolumeTypeByStreamUsage(StreamUsage streamUsage)
2265 {
2266     bool ret = PermissionUtil::VerifySelfPermission();
2267     CHECK_AND_RETURN_RET_LOG(ret, STREAM_DEFAULT, "No system App");
2268     AUDIO_INFO_LOG("enter AudioSystemManager::GetAudioVolumeTypeByStreamUsage");
2269     return AudioPolicyManager::GetInstance().GetAudioVolumeTypeByStreamUsage(streamUsage);
2270 }
2271 
GetStreamUsagesByVolumeType(AudioVolumeType audioVolumeType)2272 std::vector<StreamUsage> AudioSystemManager::GetStreamUsagesByVolumeType(AudioVolumeType audioVolumeType)
2273 {
2274     bool ret = PermissionUtil::VerifySelfPermission();
2275     CHECK_AND_RETURN_RET_LOG(ret, {}, "No system App");
2276     AUDIO_INFO_LOG("enter AudioSystemManager::GetStreamUsagesByVolumeType");
2277     return AudioPolicyManager::GetInstance().GetStreamUsagesByVolumeType(audioVolumeType);
2278 }
2279 
2280 
RegisterStreamVolumeChangeCallback(const int32_t clientPid,const std::set<StreamUsage> & streamUsages,const std::shared_ptr<StreamVolumeChangeCallback> & callback)2281 int32_t AudioSystemManager::RegisterStreamVolumeChangeCallback(const int32_t clientPid,
2282     const std::set<StreamUsage> &streamUsages, const std::shared_ptr<StreamVolumeChangeCallback> &callback)
2283 {
2284     AUDIO_DEBUG_LOG("register StreamVolumeChangeCallback clientPid:%{public}d", clientPid);
2285 
2286     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
2287     volumeChangeClientPid_ = clientPid;
2288 
2289     return AudioPolicyManager::GetInstance().SetStreamVolumeChangeCallback(clientPid, streamUsages, callback);
2290 }
2291 
UnregisterStreamVolumeChangeCallback(const int32_t clientPid,const std::shared_ptr<StreamVolumeChangeCallback> & callback)2292 int32_t AudioSystemManager::UnregisterStreamVolumeChangeCallback(const int32_t clientPid,
2293     const std::shared_ptr<StreamVolumeChangeCallback> &callback)
2294 {
2295     AUDIO_DEBUG_LOG("unregister StreamVolumeChangeCallback clientPid:%{public}d", clientPid);
2296     return AudioPolicyManager::GetInstance().UnsetStreamVolumeChangeCallback(callback);
2297 }
2298 
CreateAudioWorkgroup()2299 int32_t AudioSystemManager::CreateAudioWorkgroup()
2300 {
2301     hasSystemPermission_ = PermissionUtil::VerifySelfPermission();
2302     sptr<AudioWorkgroupCallbackImpl> workgroup = new(std::nothrow) AudioWorkgroupCallbackImpl();
2303     if (workgroup == nullptr) {
2304         AUDIO_ERR_LOG("[WorkgroupInClient] workgroup is null");
2305         return ERROR;
2306     }
2307 
2308     auto callback = std::make_shared<AudioWorkgroupChangeCallbackImpl>();
2309     if (callback == nullptr) {
2310         AUDIO_ERR_LOG("[WorkgroupInClient]workgroupChangeCallback_ Allocation Failed");
2311         return ERROR;
2312     }
2313     workgroup->AddWorkgroupChangeCallback(callback);
2314 
2315     sptr<IRemoteObject> object = workgroup->AsObject();
2316     if (object == nullptr) {
2317         AUDIO_ERR_LOG("[WorkgroupInClient] object is null");
2318         return ERROR;
2319     }
2320 
2321     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
2322     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_INVALID_PARAM, "Audio service unavailable.");
2323     int32_t workgroupId = 0;
2324     int32_t res = gasp->CreateAudioWorkgroup(getpid(), object, workgroupId);
2325     CHECK_AND_RETURN_RET_LOG(res == SUCCESS && workgroupId >= 0, AUDIO_ERR,
2326         "CreateAudioWorkgroup failed, res:%{public}d workgroupId:%{public}d", res, workgroupId);
2327 
2328     std::lock_guard<std::mutex> lock(workgroupPrioRecorderMutex_);
2329     workgroupPrioRecorderMap_.emplace(workgroupId, std::make_shared<WorkgroupPrioRecorder>(workgroupId));
2330     return workgroupId;
2331 }
2332 
ReleaseAudioWorkgroup(int32_t workgroupId)2333 int32_t AudioSystemManager::ReleaseAudioWorkgroup(int32_t workgroupId)
2334 {
2335     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
2336     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_INVALID_PARAM, "Audio service unavailable.");
2337     int32_t ret = gasp->ReleaseAudioWorkgroup(getpid(), workgroupId);
2338 
2339     std::shared_ptr<WorkgroupPrioRecorder> recorder = GetRecorderByGrpId(workgroupId);
2340     if (recorder != nullptr) {
2341         if (recorder->RestoreGroupPrio(false) != AUDIO_OK) {
2342             AUDIO_ERR_LOG("[WorkgroupInClient] restore grp:%{public}d prio failed", workgroupId);
2343         } else {
2344             std::lock_guard<std::mutex> lock(workgroupPrioRecorderMutex_);
2345             workgroupPrioRecorderMap_.erase(workgroupId);
2346         }
2347     }
2348 
2349     int32_t pid = getpid();
2350     std::lock_guard<std::mutex> lock(startGroupPermissionMapMutex_);
2351     startGroupPermissionMap_[pid].erase(workgroupId);
2352     if (startGroupPermissionMap_[pid].size() == 0) {
2353         startGroupPermissionMap_.erase(pid);
2354     }
2355     return ret;
2356 }
2357 
AddThreadToGroup(int32_t workgroupId,int32_t tokenId)2358 int32_t AudioSystemManager::AddThreadToGroup(int32_t workgroupId, int32_t tokenId)
2359 {
2360     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
2361     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_INVALID_PARAM, "Audio service unavailable.");
2362 
2363     std::shared_ptr<WorkgroupPrioRecorder> recorder = GetRecorderByGrpId(workgroupId);
2364     if (recorder != nullptr) {
2365         recorder->RecordThreadPrio(tokenId);
2366     }
2367 
2368     return gasp->AddThreadToGroup(getpid(), workgroupId, tokenId);
2369 }
2370 
RemoveThreadFromGroup(int32_t workgroupId,int32_t tokenId)2371 int32_t AudioSystemManager::RemoveThreadFromGroup(int32_t workgroupId, int32_t tokenId)
2372 {
2373     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
2374     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_INVALID_PARAM, "Audio service unavailable.");
2375 
2376     std::shared_ptr<WorkgroupPrioRecorder> recorder = GetRecorderByGrpId(workgroupId);
2377     if (recorder != nullptr) {
2378         if (recorder->RestoreThreadPrio(tokenId) != AUDIO_OK) {
2379             AUDIO_INFO_LOG("[WorkgroupInClient] restore thread:%{public}d prio failed", tokenId);
2380         }
2381     }
2382 
2383     return gasp->RemoveThreadFromGroup(getpid(), workgroupId, tokenId);
2384 }
2385 
ExcuteAudioWorkgroupPrioImprove(int32_t workgroupId,const std::unordered_map<int32_t,bool> threads,bool & needUpdatePrio)2386 int32_t AudioSystemManager::ExcuteAudioWorkgroupPrioImprove(int32_t workgroupId,
2387     const std::unordered_map<int32_t, bool> threads, bool &needUpdatePrio)
2388 {
2389     bool restoreByPermission = false;
2390     std::shared_ptr<WorkgroupPrioRecorder> recorder = GetRecorderByGrpId(workgroupId);
2391     if (!recorder) {
2392         AUDIO_ERR_LOG("[WorkgroupInClient] GetRecorderByGrpId workgroupId:%{public}d failed", workgroupId);
2393         return AUDIO_ERR;
2394     }
2395 
2396     restoreByPermission = recorder->GetRestoreByPermission();
2397     if (needUpdatePrio || restoreByPermission) {
2398         const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
2399         CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_INVALID_PARAM, "Audio service unavailable.");
2400         int32_t ipcRet = gasp->ImproveAudioWorkgroupPrio(getpid(), threads);
2401         if (ipcRet != SUCCESS) {
2402             AUDIO_ERR_LOG("[WorkgroupInClient] change prio for grp:%{public}d failed, ret:%{public}d",
2403                 workgroupId, ipcRet);
2404             return AUDIO_ERR;
2405         }
2406         needUpdatePrio = false;
2407         recorder->SetRestoreByPermission(false);
2408     }
2409 
2410     return AUDIO_OK;
2411 }
2412 
StartGroup(int32_t workgroupId,uint64_t startTime,uint64_t deadlineTime,const std::unordered_map<int32_t,bool> threads,bool & needUpdatePrio)2413 int32_t AudioSystemManager::StartGroup(int32_t workgroupId, uint64_t startTime, uint64_t deadlineTime,
2414     const std::unordered_map<int32_t, bool> threads, bool &needUpdatePrio)
2415 {
2416     if (!IsValidToStartGroup(workgroupId)) {
2417         return AUDIO_ERR;
2418     }
2419 
2420     Trace trace("[WorkgroupInClient] StartGroup workgroupId:" + std::to_string(workgroupId) +
2421         " startTime:" + std::to_string(startTime) + " deadlineTime:" + std::to_string(deadlineTime));
2422     CHECK_AND_RETURN_RET_LOG(deadlineTime > startTime, ERR_INVALID_PARAM, "Invalid Audio Deadline params");
2423     RME::SetFrameRateAndPrioType(workgroupId, MS_PER_SECOND/(deadlineTime - startTime), 0);
2424 
2425     if (ExcuteAudioWorkgroupPrioImprove(workgroupId, threads, needUpdatePrio) != AUDIO_OK) {
2426         AUDIO_ERR_LOG("[WorkgroupInClient] excute audioworkgroup prio improve failed");
2427         return AUDIO_ERR;
2428     }
2429 
2430     if (RME::BeginFrameFreq(deadlineTime - startTime) != 0) {
2431         AUDIO_ERR_LOG("[WorkgroupInClient] Audio Deadline BeginFrame failed");
2432         return AUDIO_ERR;
2433     }
2434     return AUDIO_OK;
2435 }
2436 
StopGroup(int32_t workgroupId)2437 int32_t AudioSystemManager::StopGroup(int32_t workgroupId)
2438 {
2439     if (EndFrameFreq(0) != 0) {
2440         AUDIO_ERR_LOG("[WorkgroupInClient] Audio Deadline EndFrame failed");
2441         return AUDIO_ERR;
2442     }
2443     return AUDIO_OK;
2444 }
2445 
OnWorkgroupChange(const AudioWorkgroupChangeInfo & info)2446 void AudioSystemManager::AudioWorkgroupChangeCallbackImpl::OnWorkgroupChange(
2447     const AudioWorkgroupChangeInfo &info)
2448 {
2449     AudioSystemManager::GetInstance()->OnWorkgroupChange(info);
2450 }
2451 
OnWorkgroupChange(const AudioWorkgroupChangeInfo & info)2452 void AudioSystemManager::OnWorkgroupChange(const AudioWorkgroupChangeInfo &info)
2453 {
2454     std::lock_guard<std::mutex> lock(startGroupPermissionMapMutex_);
2455     startGroupPermissionMap_[info.pid][info.groupId] = info.startAllowed;
2456     std::vector<int32_t> workgroupIdNeedRestore;
2457 
2458     for (const auto &pair : startGroupPermissionMap_) {
2459         uint32_t pid = pair.first;
2460         const std::unordered_map<uint32_t, bool>& permissions = pair.second;
2461         for (const auto &innerPair : permissions) {
2462             uint32_t grpId = innerPair.first;
2463             bool permissionValue = innerPair.second;
2464             AUDIO_INFO_LOG("[WorkgroupInClient] pid = %{public}d, groupId = %{public}d, startAllowed = %{public}d",
2465                 pid, grpId, permissionValue);
2466             if (permissionValue == false) {
2467                 workgroupIdNeedRestore.push_back(grpId);
2468             }
2469         }
2470     }
2471 
2472     for (const auto &workgroupId : workgroupIdNeedRestore) {
2473         std::shared_ptr<WorkgroupPrioRecorder> recorder = GetRecorderByGrpId(workgroupId);
2474         if (recorder != nullptr) {
2475             if (recorder->RestoreGroupPrio(true) != AUDIO_OK) {
2476                 AUDIO_INFO_LOG("[WorkgroupInClient] restore grp:%{public}d prio in cb failed", workgroupId);
2477             }
2478         }
2479     }
2480 }
2481 
IsValidToStartGroup(int32_t workgroupId)2482 bool AudioSystemManager::IsValidToStartGroup(int32_t workgroupId)
2483 {
2484     if (hasSystemPermission_) {
2485         return true;
2486     }
2487 
2488     int32_t pid = getpid();
2489     std::lock_guard<std::mutex> lock(startGroupPermissionMapMutex_);
2490     auto outerIt = startGroupPermissionMap_.find(pid);
2491     if (outerIt == startGroupPermissionMap_.end()) {
2492         return false;
2493     }
2494     const auto& innerMap = outerIt->second;
2495     for (const auto& pair : innerMap) {
2496         if (pair.second) {
2497             return true;
2498         }
2499     }
2500     return false;
2501 }
2502 
ForceVolumeKeyControlType(AudioVolumeType volumeType,int32_t duration)2503 int32_t AudioSystemManager::ForceVolumeKeyControlType(AudioVolumeType volumeType, int32_t duration)
2504 {
2505     AUDIO_INFO_LOG("volumeType:%{public}d, duration:%{public}d", volumeType, duration);
2506     return AudioPolicyManager::GetInstance().ForceVolumeKeyControlType(volumeType, duration);
2507 }
2508 
SetRenderWhitelist(std::vector<std::string> list)2509 int32_t AudioSystemManager::SetRenderWhitelist(std::vector<std::string> list)
2510 {
2511     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
2512     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_INVALID_PARAM, "Audio service unavailable.");
2513     std::string identity = IPCSkeleton::ResetCallingIdentity();
2514     int32_t ret = gasp->SetRenderWhitelist(list);
2515     IPCSkeleton::SetCallingIdentity(identity);
2516     CHECK_AND_RETURN_RET_LOG(ret == 0, ret, "failed: %{public}d", ret);
2517     return ret;
2518 }
2519 
WorkgroupPrioRecorder(int32_t grpId)2520 AudioSystemManager::WorkgroupPrioRecorder::WorkgroupPrioRecorder(int32_t grpId)
2521 {
2522     grpId_ = grpId;
2523     restoreByPermission_ = false;
2524 }
2525 
SetRestoreByPermission(bool isByPermission)2526 void AudioSystemManager::WorkgroupPrioRecorder::SetRestoreByPermission(bool isByPermission)
2527 {
2528     restoreByPermission_ = isByPermission;
2529 }
2530 
GetRestoreByPermission()2531 bool AudioSystemManager::WorkgroupPrioRecorder::GetRestoreByPermission()
2532 {
2533     return restoreByPermission_;
2534 }
2535 
RecordThreadPrio(int32_t tokenId)2536 void AudioSystemManager::WorkgroupPrioRecorder::RecordThreadPrio(int32_t tokenId)
2537 {
2538     std::lock_guard<std::mutex> lock(workgroupThreadsMutex_);
2539     auto it = threads_.find(tokenId);
2540     if (it == threads_.end()) {
2541         OHOS::QOS::QosLevel qosLevel;
2542         int32_t ret = OHOS::QOS::GetThreadQos(qosLevel);
2543         threads_[tokenId] = (ret == -1 ? -1 : (int32_t)qosLevel);
2544     }
2545 }
2546 
RestoreGroupPrio(bool isByPermission)2547 int32_t AudioSystemManager::WorkgroupPrioRecorder::RestoreGroupPrio(bool isByPermission)
2548 {
2549     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
2550     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_INVALID_PARAM, "Audio service unavailable.");
2551 
2552     std::lock_guard<std::mutex> lock(workgroupThreadsMutex_);
2553     if (gasp->RestoreAudioWorkgroupPrio(getpid(), threads_) != AUDIO_OK) {
2554         AUDIO_ERR_LOG("[WorkgroupInClient] restore prio for workgroupId:%{public}d failed", GetGrpId());
2555         return AUDIO_ERR;
2556     }
2557 
2558     if (!isByPermission) {
2559         threads_.clear();
2560     } else {
2561         restoreByPermission_ = true;
2562     }
2563     return AUDIO_OK;
2564 }
2565 
RestoreThreadPrio(int32_t tokenId)2566 int32_t AudioSystemManager::WorkgroupPrioRecorder::RestoreThreadPrio(int32_t tokenId)
2567 {
2568     const sptr<IStandardAudioService> gasp = GetAudioSystemManagerProxy();
2569     CHECK_AND_RETURN_RET_LOG(gasp != nullptr, ERR_INVALID_PARAM, "Audio service unavailable.");
2570     std::lock_guard<std::mutex> lock(workgroupThreadsMutex_);
2571     auto it = threads_.find(tokenId);
2572     int ipcRet;
2573     if (it != threads_.end()) {
2574         std::unordered_map<int32_t, int32_t> thread = {{it->first, it->second}};
2575         ipcRet = gasp->RestoreAudioWorkgroupPrio(getpid(), thread);
2576         if (ipcRet != SUCCESS) {
2577             AUDIO_ERR_LOG("[WorkgroupInClient] change prio for tokenId:%{public}d failed, ret:%{public}d",
2578                 tokenId, ipcRet);
2579             return AUDIO_ERR;
2580         } else {
2581             threads_.erase(tokenId);
2582         }
2583     }
2584     return AUDIO_OK;
2585 }
2586 
GetGrpId()2587 int32_t AudioSystemManager::WorkgroupPrioRecorder::GetGrpId()
2588 {
2589     return grpId_;
2590 }
2591 
GetRecorderByGrpId(int32_t grpId)2592 std::shared_ptr<AudioSystemManager::WorkgroupPrioRecorder> AudioSystemManager::GetRecorderByGrpId(int32_t grpId)
2593 {
2594     std::lock_guard<std::mutex> lock(workgroupPrioRecorderMutex_);
2595     auto it = workgroupPrioRecorderMap_.find(grpId);
2596     if (it != workgroupPrioRecorderMap_.end()) {
2597         return it->second;
2598     }
2599     return nullptr;
2600 }
2601 } // namespace AudioStandard
2602 } // namespace OHOS
2603