1 /*
2 * Copyright (c) 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
16 #ifndef LOG_TAG
17 #define LOG_TAG "AudioGeneralManager"
18 #endif
19
20 #include "audio_general_manager.h"
21
22 #include <mutex>
23 #include <unistd.h>
24 #include "audio_common_log.h"
25 #include "audio_errors.h"
26 #include "audio_focus_info_change_callback_impl.h"
27 #include "audio_policy_manager.h"
28 #include "audio_utils.h"
29 #include "iservice_registry.h"
30 #include "system_ability_definition.h"
31
32 namespace OHOS {
33 namespace AudioStandard {
34 constexpr unsigned int XCOLLIE_TIME_OUT_SECONDS = 10;
35 std::mutex g_asManagerProxyMutex;
36 sptr<IStandardAudioService> g_asManagerProxy = nullptr;
37
GetInstance()38 AudioGeneralManager *AudioGeneralManager::GetInstance()
39 {
40 static AudioGeneralManager AudioGeneralManager;
41 return &AudioGeneralManager;
42 }
43
AudioGeneralManager()44 AudioGeneralManager::AudioGeneralManager()
45 {
46 AUDIO_DEBUG_LOG("AudioGeneralManager start");
47 }
48
~AudioGeneralManager()49 AudioGeneralManager::~AudioGeneralManager()
50 {
51 AUDIO_DEBUG_LOG("AudioGeneralManager end");
52 }
53
GetCallingPid()54 int32_t AudioGeneralManager::GetCallingPid()
55 {
56 return getpid();
57 }
58
SetAudioDeviceRefinerCallback(const std::shared_ptr<AudioDeviceRefiner> & callback)59 int32_t AudioGeneralManager::SetAudioDeviceRefinerCallback(const std::shared_ptr<AudioDeviceRefiner> &callback)
60 {
61 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
62
63 return AudioPolicyManager::GetInstance().SetAudioDeviceRefinerCallback(callback);
64 }
65
SetAudioClientInfoMgrCallback(const std::shared_ptr<AudioClientInfoMgrCallback> & callback)66 int32_t AudioGeneralManager::SetAudioClientInfoMgrCallback(
67 const std::shared_ptr<AudioClientInfoMgrCallback> &callback)
68 {
69 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
70
71 return AudioPolicyManager::GetInstance().SetAudioClientInfoMgrCallback(callback);
72 }
73
GetPreferredOutputDeviceForRendererInfo(AudioRendererInfo rendererInfo,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & desc)74 int32_t AudioGeneralManager::GetPreferredOutputDeviceForRendererInfo(AudioRendererInfo rendererInfo,
75 std::vector<std::shared_ptr<AudioDeviceDescriptor>> &desc)
76 {
77 desc = AudioPolicyManager::GetInstance().GetPreferredOutputDeviceDescriptors(rendererInfo);
78
79 return SUCCESS;
80 }
81
UnsetAudioDeviceRefinerCallback()82 int32_t AudioGeneralManager::UnsetAudioDeviceRefinerCallback()
83 {
84 return AudioPolicyManager::GetInstance().UnsetAudioDeviceRefinerCallback();
85 }
86
SaveRemoteInfo(const std::string & networkId,DeviceType deviceType)87 void AudioGeneralManager::SaveRemoteInfo(const std::string &networkId, DeviceType deviceType)
88 {
89 AudioPolicyManager::GetInstance().SaveRemoteInfo(networkId, deviceType);
90 }
91
TriggerFetchDevice(AudioStreamDeviceChangeReasonExt reason)92 int32_t AudioGeneralManager::TriggerFetchDevice(AudioStreamDeviceChangeReasonExt reason)
93 {
94 return AudioPolicyManager::GetInstance().TriggerFetchDevice(reason);
95 }
96
SetPreferredDevice(const PreferredType preferredType,const std::shared_ptr<AudioDeviceDescriptor> & desc,const int32_t uid)97 int32_t AudioGeneralManager::SetPreferredDevice(const PreferredType preferredType,
98 const std::shared_ptr<AudioDeviceDescriptor> &desc, const int32_t uid)
99 {
100 return AudioPolicyManager::GetInstance().SetPreferredDevice(preferredType, desc, uid);
101 }
102
SetPreferredOutputDeviceChangeCallback(AudioRendererInfo rendererInfo,const std::shared_ptr<AudioPreferredOutputDeviceChangeCallback> & callback)103 int32_t AudioGeneralManager::SetPreferredOutputDeviceChangeCallback(AudioRendererInfo rendererInfo,
104 const std::shared_ptr<AudioPreferredOutputDeviceChangeCallback>& callback)
105 {
106 AUDIO_INFO_LOG("Entered %{public}s", __func__);
107 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
108
109 return AudioPolicyManager::GetInstance().SetPreferredOutputDeviceChangeCallback(rendererInfo, callback);
110 }
111
RegisterFocusInfoChangeCallback(const std::shared_ptr<AudioFocusInfoChangeCallback> & callback)112 int32_t AudioGeneralManager::RegisterFocusInfoChangeCallback(
113 const std::shared_ptr<AudioFocusInfoChangeCallback> &callback)
114 {
115 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is null");
116
117 int32_t clientId = GetCallingPid();
118 AUDIO_DEBUG_LOG("RegisterFocusInfoChangeCallback clientId:%{public}d", clientId);
119 if (audioFocusInfoCallback_ == nullptr) {
120 audioFocusInfoCallback_ = std::make_shared<AudioFocusInfoChangeCallbackImpl>();
121 CHECK_AND_RETURN_RET_LOG(audioFocusInfoCallback_ != nullptr, ERROR,
122 "Failed to allocate memory for audioInterruptCallback");
123 int32_t ret = AudioPolicyManager::GetInstance().RegisterFocusInfoChangeCallback(clientId,
124 audioFocusInfoCallback_);
125 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERROR, "Failed set callback");
126 }
127
128 std::shared_ptr<AudioFocusInfoChangeCallbackImpl> cbFocusInfo =
129 std::static_pointer_cast<AudioFocusInfoChangeCallbackImpl>(audioFocusInfoCallback_);
130 CHECK_AND_RETURN_RET_LOG(cbFocusInfo != nullptr, ERROR, "cbFocusInfo is nullptr");
131 cbFocusInfo->SaveCallback(callback);
132
133 return SUCCESS;
134 }
135
GetDevicesInner(DeviceFlag deviceFlag)136 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioGeneralManager::GetDevicesInner(DeviceFlag deviceFlag)
137 {
138 return AudioPolicyManager::GetInstance().GetDevicesInner(deviceFlag);
139 }
140
SetDeviceChangeCallback(const DeviceFlag flag,const std::shared_ptr<AudioManagerDeviceChangeCallback> & callback)141 int32_t AudioGeneralManager::SetDeviceChangeCallback(const DeviceFlag flag,
142 const std::shared_ptr<AudioManagerDeviceChangeCallback>& callback)
143 {
144 AUDIO_INFO_LOG("Entered %{public}s", __func__);
145 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
146
147 int32_t clientId = GetCallingPid();
148 return AudioPolicyManager::GetInstance().SetDeviceChangeCallback(clientId, flag, callback);
149 }
150
SetDistribuitedOutputChangeCallback(const std::shared_ptr<AudioDistribuitedOutputChangeCallback> & cb)151 int32_t AudioGeneralManager::SetDistribuitedOutputChangeCallback(
152 const std::shared_ptr<AudioDistribuitedOutputChangeCallback> &cb)
153 {
154 AUDIO_INFO_LOG("Entry.");
155 CHECK_AND_RETURN_RET_LOG(cb, ERR_INVALID_PARAM, "callback is nullptr");
156 return AudioPolicyManager::GetInstance().SetDistribuitedOutputChangeCallback(cb);
157 }
158
SetQueryClientTypeCallback(const std::shared_ptr<AudioQueryClientTypeCallback> & callback)159 int32_t AudioGeneralManager::SetQueryClientTypeCallback(const std::shared_ptr<AudioQueryClientTypeCallback>& callback)
160 {
161 AUDIO_INFO_LOG("Entered");
162 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
163 return AudioPolicyManager::GetInstance().SetQueryClientTypeCallback(callback);
164 }
165
GetAudioGeneralManagerProxy()166 const sptr<IStandardAudioService> AudioGeneralManager::GetAudioGeneralManagerProxy()
167 {
168 AudioXCollie xcollieGetAudioSystemManagerProxy("GetAudioGeneralManagerProxy", XCOLLIE_TIME_OUT_SECONDS);
169 std::lock_guard<std::mutex> lock(g_asManagerProxyMutex);
170 if (g_asManagerProxy == nullptr) {
171 AudioXCollie xcollieGetSystemAbilityManager("GetSystemAbilityManager", XCOLLIE_TIME_OUT_SECONDS);
172 auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
173 CHECK_AND_RETURN_RET_LOG(samgr != nullptr, nullptr, "get sa manager failed");
174 xcollieGetSystemAbilityManager.CancelXCollieTimer();
175
176 AudioXCollie xcollieGetSystemAbility("GetSystemAbility", XCOLLIE_TIME_OUT_SECONDS);
177 sptr<IRemoteObject> object = samgr->GetSystemAbility(AUDIO_DISTRIBUTED_SERVICE_ID);
178 CHECK_AND_RETURN_RET_LOG(object != nullptr, nullptr, "get audio service remote object failed");
179 g_asManagerProxy = iface_cast<IStandardAudioService>(object);
180 CHECK_AND_RETURN_RET_LOG(g_asManagerProxy != nullptr, nullptr, "get audio service proxy failed");
181 xcollieGetSystemAbility.CancelXCollieTimer();
182 }
183 sptr<IStandardAudioService> gasp = g_asManagerProxy;
184 return gasp;
185 }
186
SetExtraParameters(const std::string & key,const std::vector<std::pair<std::string,std::string>> & kvpairs)187 int32_t AudioGeneralManager::SetExtraParameters(const std::string &key,
188 const std::vector<std::pair<std::string, std::string>> &kvpairs)
189 {
190 const sptr<IStandardAudioService> gasp = GetAudioGeneralManagerProxy();
191 CHECK_AND_RETURN_RET_LOG(gasp != nullptr, 0, "Audio service unavailable.");
192 return gasp->SetExtraParameters(key, kvpairs);
193 }
194
GetVolume(AudioVolumeType volumeType) const195 int32_t AudioGeneralManager::GetVolume(AudioVolumeType volumeType) const
196 {
197 switch (volumeType) {
198 case STREAM_MUSIC:
199 case STREAM_RING:
200 case STREAM_NOTIFICATION:
201 case STREAM_VOICE_CALL:
202 case STREAM_VOICE_COMMUNICATION:
203 case STREAM_VOICE_ASSISTANT:
204 case STREAM_ALARM:
205 case STREAM_SYSTEM:
206 case STREAM_ACCESSIBILITY:
207 case STREAM_VOICE_RING:
208 break;
209 case STREAM_ULTRASONIC:
210 case STREAM_ALL:{
211 bool ret = PermissionUtil::VerifySelfPermission();
212 CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
213 break;
214 }
215 default:
216 AUDIO_ERR_LOG("volumeType[%{public}d] is not supported", volumeType);
217 return ERR_NOT_SUPPORTED;
218 }
219
220 return AudioPolicyManager::GetInstance().GetSystemVolumeLevel(volumeType);
221 }
222
UnregisterVolumeKeyEventCallback(const int32_t clientPid,const std::shared_ptr<VolumeKeyEventCallback> & callback)223 int32_t AudioGeneralManager::UnregisterVolumeKeyEventCallback(const int32_t clientPid,
224 const std::shared_ptr<VolumeKeyEventCallback> &callback)
225 {
226 AUDIO_DEBUG_LOG("UnregisterVolumeKeyEventCallback");
227 int32_t ret = AudioPolicyManager::GetInstance().UnsetVolumeKeyEventCallback(callback);
228 if (!ret) {
229 AUDIO_DEBUG_LOG("UnsetVolumeKeyEventCallback success");
230 volumeChangeClientPid_ = -1;
231 }
232 return ret;
233 }
234
GetActiveOutputDevice()235 DeviceType AudioGeneralManager::GetActiveOutputDevice()
236 {
237 return AudioPolicyManager::GetInstance().GetActiveOutputDevice();
238 }
239
GetAudioScene() const240 AudioScene AudioGeneralManager::GetAudioScene() const
241 {
242 return AudioPolicyManager::GetInstance().GetAudioScene();
243 }
244
SetAudioSceneChangeCallback(const std::shared_ptr<AudioManagerAudioSceneChangedCallback> & callback)245 int32_t AudioGeneralManager::SetAudioSceneChangeCallback(
246 const std::shared_ptr<AudioManagerAudioSceneChangedCallback> &callback)
247 {
248 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
249
250 int32_t clientId = GetCallingPid();
251 return AudioPolicyManager::GetInstance().SetAudioSceneChangeCallback(clientId, callback);
252 }
253
GetMaxVolume(AudioVolumeType volumeType)254 int32_t AudioGeneralManager::GetMaxVolume(AudioVolumeType volumeType)
255 {
256 if (volumeType == STREAM_ALL) {
257 bool ret = PermissionUtil::VerifySelfPermission();
258 CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
259 }
260
261 if (volumeType == STREAM_ULTRASONIC) {
262 bool ret = PermissionUtil::VerifySelfPermission();
263 CHECK_AND_RETURN_RET_LOG(ret, ERR_PERMISSION_DENIED, "No system permission");
264 }
265
266 return AudioPolicyManager::GetInstance().GetMaxVolumeLevel(volumeType);
267 }
268
UnregisterFocusInfoChangeCallback(const std::shared_ptr<AudioFocusInfoChangeCallback> & callback)269 int32_t AudioGeneralManager::UnregisterFocusInfoChangeCallback(
270 const std::shared_ptr<AudioFocusInfoChangeCallback> &callback)
271 {
272 int32_t clientId = GetCallingPid();
273 int32_t ret = 0;
274
275 if (callback == nullptr) {
276 ret = AudioPolicyManager::GetInstance().UnregisterFocusInfoChangeCallback(clientId);
277 audioFocusInfoCallback_.reset();
278 audioFocusInfoCallback_ = nullptr;
279 if (!ret) {
280 AUDIO_DEBUG_LOG("AudioSystemManager::UnregisterVolumeKeyEventCallback success");
281 }
282 return ret;
283 }
284 CHECK_AND_RETURN_RET_LOG(audioFocusInfoCallback_ != nullptr, ERROR,
285 "Failed to allocate memory for audioInterruptCallback");
286 std::shared_ptr<AudioFocusInfoChangeCallbackImpl> cbFocusInfo =
287 std::static_pointer_cast<AudioFocusInfoChangeCallbackImpl>(audioFocusInfoCallback_);
288 cbFocusInfo->RemoveCallback(callback);
289
290 return ret;
291 }
292
GetAudioFocusInfoList(std::list<std::pair<AudioInterrupt,AudioFocuState>> & focusInfoList)293 int32_t AudioGeneralManager::GetAudioFocusInfoList(std::list<std::pair<AudioInterrupt, AudioFocuState>> &focusInfoList)
294 {
295 AUDIO_DEBUG_LOG("Entered %{public}s", __func__);
296 return AudioPolicyManager::GetInstance().GetAudioFocusInfoList(focusInfoList);
297 }
298
SelectOutputDevice(std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const299 int32_t AudioGeneralManager::SelectOutputDevice(
300 std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors) const
301 {
302 CHECK_AND_RETURN_RET_LOG(audioDeviceDescriptors.size() == 1 && audioDeviceDescriptors[0] != nullptr,
303 ERR_INVALID_PARAM, "invalid parameter");
304 CHECK_AND_RETURN_RET_LOG(audioDeviceDescriptors[0]->deviceRole_ == DeviceRole::OUTPUT_DEVICE,
305 ERR_INVALID_OPERATION, "not an output device.");
306 size_t validSize = 64;
307 if (audioDeviceDescriptors[0]->networkId_ != LOCAL_NETWORK_ID &&
308 audioDeviceDescriptors[0]->networkId_.size() != validSize) {
309 AUDIO_ERR_LOG("SelectOutputDevice: invalid networkId.");
310 return ERR_INVALID_PARAM;
311 }
312 sptr<AudioRendererFilter> audioRendererFilter = new(std::nothrow) AudioRendererFilter();
313 audioRendererFilter->uid = -1;
314 int32_t ret = AudioPolicyManager::GetInstance().SelectOutputDevice(audioRendererFilter, audioDeviceDescriptors);
315 return ret;
316 }
317
RegisterVolumeKeyEventCallback(const int32_t clientPid,const std::shared_ptr<VolumeKeyEventCallback> & callback,API_VERSION api_v)318 int32_t AudioGeneralManager::RegisterVolumeKeyEventCallback(const int32_t clientPid,
319 const std::shared_ptr<VolumeKeyEventCallback> &callback, API_VERSION api_v)
320 {
321 AUDIO_DEBUG_LOG("AudioGeneralManager RegisterVolumeKeyEventCallback");
322
323 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM,
324 "RegisterVolumeKeyEventCallbackcallback is nullptr");
325 volumeChangeClientPid_ = clientPid;
326
327 return AudioPolicyManager::GetInstance().SetVolumeKeyEventCallback(clientPid, callback, api_v);
328 }
329
RegisterAudioCapturerEventListener(const int32_t clientPid,const std::shared_ptr<AudioCapturerStateChangeCallback> & callback)330 int32_t AudioGeneralManager::RegisterAudioCapturerEventListener(const int32_t clientPid,
331 const std::shared_ptr<AudioCapturerStateChangeCallback> &callback)
332 {
333 AUDIO_INFO_LOG("client id: %{public}d", clientPid);
334 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is null");
335 return AudioPolicyManager::GetInstance().RegisterAudioCapturerEventListener(clientPid, callback);
336 }
337
GetCurrentRendererChangeInfos(std::vector<std::shared_ptr<AudioRendererChangeInfo>> & audioRendererChangeInfos)338 int32_t AudioGeneralManager::GetCurrentRendererChangeInfos(
339 std::vector<std::shared_ptr<AudioRendererChangeInfo>> &audioRendererChangeInfos)
340 {
341 AUDIO_DEBUG_LOG("GetCurrentRendererChangeInfos");
342 return AudioPolicyManager::GetInstance().GetCurrentRendererChangeInfos(audioRendererChangeInfos);
343 }
344
RegisterAudioRendererEventListener(const std::shared_ptr<AudioRendererStateChangeCallback> & callback)345 int32_t AudioGeneralManager::RegisterAudioRendererEventListener(
346 const std::shared_ptr<AudioRendererStateChangeCallback> &callback)
347 {
348 AUDIO_INFO_LOG("in");
349 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is null");
350
351 int32_t ret = AudioPolicyManager::GetInstance().RegisterAudioRendererEventListener(callback);
352 CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ERR_INVALID_PARAM, "ret: %{public}d", ret);
353
354 return ret;
355 }
356
AudioFocusInfoChangeCallbackImpl()357 AudioFocusInfoChangeCallbackImpl::AudioFocusInfoChangeCallbackImpl()
358 {
359 AUDIO_INFO_LOG("AudioFocusInfoChangeCallbackImpl constructor");
360 }
361
~AudioFocusInfoChangeCallbackImpl()362 AudioFocusInfoChangeCallbackImpl::~AudioFocusInfoChangeCallbackImpl()
363 {
364 AUDIO_INFO_LOG("AudioFocusInfoChangeCallbackImpl: destroy");
365 }
366
SaveCallback(const std::weak_ptr<AudioFocusInfoChangeCallback> & callback)367 void AudioFocusInfoChangeCallbackImpl::SaveCallback(const std::weak_ptr<AudioFocusInfoChangeCallback> &callback)
368 {
369 AUDIO_INFO_LOG("Entered %{public}s", __func__);
370 bool hasCallback = false;
371 std::lock_guard<std::mutex> cbListLock(cbListMutex_);
372 for (auto it = callbackList_.begin(); it != callbackList_.end(); ++it) {
373 if ((*it).lock() == callback.lock()) {
374 hasCallback = true;
375 }
376 }
377 if (!hasCallback) {
378 callbackList_.push_back(callback);
379 }
380 }
381
RemoveCallback(const std::weak_ptr<AudioFocusInfoChangeCallback> & callback)382 void AudioFocusInfoChangeCallbackImpl::RemoveCallback(const std::weak_ptr<AudioFocusInfoChangeCallback> &callback)
383 {
384 AUDIO_INFO_LOG("Entered %{public}s", __func__);
385 std::lock_guard<std::mutex> cbListLock(cbListMutex_);
386 callbackList_.remove_if([&callback](std::weak_ptr<AudioFocusInfoChangeCallback> &callback_) {
387 return callback_.lock() == callback.lock();
388 });
389 }
390
GetPreferredInputDeviceForCapturerInfo(AudioCapturerInfo captureInfo,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & desc)391 int32_t AudioGeneralManager::GetPreferredInputDeviceForCapturerInfo(
392 AudioCapturerInfo captureInfo, std::vector<std::shared_ptr<AudioDeviceDescriptor>> &desc)
393 {
394 desc = AudioPolicyManager::GetInstance().GetPreferredInputDeviceDescriptors(captureInfo);
395 return SUCCESS;
396 }
397
SetPreferredInputDeviceChangeCallback(AudioCapturerInfo & capturerInfo,const std::shared_ptr<AudioPreferredInputDeviceChangeCallback> & callback)398 int32_t AudioGeneralManager::SetPreferredInputDeviceChangeCallback(
399 AudioCapturerInfo &capturerInfo, const std::shared_ptr<AudioPreferredInputDeviceChangeCallback> &callback)
400 {
401 AUDIO_INFO_LOG("Entered %{public}s", __func__);
402 CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
403
404 return AudioPolicyManager::GetInstance().SetPreferredInputDeviceChangeCallback(capturerInfo, callback);
405 }
406
GetCurrentCapturerChangeInfos(std::vector<std::shared_ptr<AudioCapturerChangeInfo>> & audioCapturerChangeInfos)407 int32_t AudioGeneralManager::GetCurrentCapturerChangeInfos(
408 std::vector<std::shared_ptr<AudioCapturerChangeInfo>> &audioCapturerChangeInfos)
409 {
410 AUDIO_DEBUG_LOG("GetCurrentCapturerChangeInfos");
411 return AudioPolicyManager::GetInstance().GetCurrentCapturerChangeInfos(audioCapturerChangeInfos);
412 }
413
414 } // namespace AudioStandard
415 } // namespace OHOS
416