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