• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 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 "AudioPolicyManager"
17 #endif
18 
19 #include "audio_policy_manager.h"
20 #include "audio_errors.h"
21 #include "audio_server_death_recipient.h"
22 #include "audio_policy_log.h"
23 #include "audio_utils.h"
24 #include "iservice_registry.h"
25 #include "system_ability_definition.h"
26 
27 namespace OHOS {
28 namespace AudioStandard {
29 using namespace std;
30 
31 const unsigned int TIME_OUT_SECONDS = 10;
32 
SelectOutputDevice(sptr<AudioRendererFilter> audioRendererFilter,std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors)33 int32_t AudioPolicyManager::SelectOutputDevice(sptr<AudioRendererFilter> audioRendererFilter,
34     std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors)
35 {
36     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
37     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, -1, "audio policy manager proxy is NULL.");
38     return gsp->SelectOutputDevice(audioRendererFilter, audioDeviceDescriptors);
39 }
40 
GetSelectedDeviceInfo(int32_t uid,int32_t pid,AudioStreamType streamType)41 std::string AudioPolicyManager::GetSelectedDeviceInfo(int32_t uid, int32_t pid, AudioStreamType streamType)
42 {
43     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
44     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, "", "audio policy manager proxy is NULL.");
45     return gsp->GetSelectedDeviceInfo(uid, pid, streamType);
46 }
47 
SelectInputDevice(sptr<AudioCapturerFilter> audioCapturerFilter,std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors)48 int32_t AudioPolicyManager::SelectInputDevice(sptr<AudioCapturerFilter> audioCapturerFilter,
49     std::vector<std::shared_ptr<AudioDeviceDescriptor>> audioDeviceDescriptors)
50 {
51     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
52     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, -1, "audio policy manager proxy is NULL.");
53     return gsp->SelectInputDevice(audioCapturerFilter, audioDeviceDescriptors);
54 }
55 
ExcludeOutputDevices(AudioDeviceUsage audioDevUsage,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & audioDeviceDescriptors)56 int32_t AudioPolicyManager::ExcludeOutputDevices(AudioDeviceUsage audioDevUsage,
57     std::vector<std::shared_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors)
58 {
59     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
60     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, -1, "audio policy manager proxy is NULL.");
61     return gsp->ExcludeOutputDevices(audioDevUsage, audioDeviceDescriptors);
62 }
63 
UnexcludeOutputDevices(AudioDeviceUsage audioDevUsage,std::vector<std::shared_ptr<AudioDeviceDescriptor>> & audioDeviceDescriptors)64 int32_t AudioPolicyManager::UnexcludeOutputDevices(AudioDeviceUsage audioDevUsage,
65     std::vector<std::shared_ptr<AudioDeviceDescriptor>> &audioDeviceDescriptors)
66 {
67     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
68     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, -1, "audio policy manager proxy is NULL.");
69     return gsp->UnexcludeOutputDevices(audioDevUsage, audioDeviceDescriptors);
70 }
71 
GetExcludedDevices(AudioDeviceUsage audioDevUsage)72 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioPolicyManager::GetExcludedDevices(
73     AudioDeviceUsage audioDevUsage)
74 {
75     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
76     if (gsp == nullptr) {
77         AUDIO_ERR_LOG("GetExcludedDevices: audio policy manager proxy is NULL.");
78         std::vector<std::shared_ptr<AudioDeviceDescriptor>> deviceInfo;
79         return deviceInfo;
80     }
81     return gsp->GetExcludedDevices(audioDevUsage);
82 }
83 
GetDevices(DeviceFlag deviceFlag)84 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioPolicyManager::GetDevices(DeviceFlag deviceFlag)
85 {
86     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
87     if (gsp == nullptr) {
88         AUDIO_ERR_LOG("GetDevices: audio policy manager proxy is NULL.");
89         std::vector<std::shared_ptr<AudioDeviceDescriptor>> deviceInfo;
90         return deviceInfo;
91     }
92     return gsp->GetDevices(deviceFlag);
93 }
94 
GetDevicesInner(DeviceFlag deviceFlag)95 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioPolicyManager::GetDevicesInner(DeviceFlag deviceFlag)
96 {
97     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
98     if (gsp == nullptr) {
99         AUDIO_ERR_LOG("audio policy manager proxy is NULL.");
100         std::vector<std::shared_ptr<AudioDeviceDescriptor>> deviceInfo;
101         return deviceInfo;
102     }
103     return gsp->GetDevicesInner(deviceFlag);
104 }
105 
GetPreferredOutputDeviceDescriptors(AudioRendererInfo & rendererInfo,bool forceNoBTPermission)106 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioPolicyManager::GetPreferredOutputDeviceDescriptors(
107     AudioRendererInfo &rendererInfo, bool forceNoBTPermission)
108 {
109     AudioXCollie audioXCollie("AudioPolicyManager::GetPreferredOutputDeviceDescriptors", TIME_OUT_SECONDS);
110     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
111     if (gsp == nullptr) {
112         AUDIO_ERR_LOG("GetPreferredOutputDeviceDescriptors: audio policy manager proxy is NULL.");
113         std::vector<std::shared_ptr<AudioDeviceDescriptor>> deviceInfo;
114         return deviceInfo;
115     }
116     return gsp->GetPreferredOutputDeviceDescriptors(rendererInfo, forceNoBTPermission);
117 }
118 
GetPreferredInputDeviceDescriptors(AudioCapturerInfo & captureInfo)119 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioPolicyManager::GetPreferredInputDeviceDescriptors(
120     AudioCapturerInfo &captureInfo)
121 {
122     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
123     if (gsp == nullptr) {
124         AUDIO_ERR_LOG("audio policy manager proxy is NULL.");
125         std::vector<std::shared_ptr<AudioDeviceDescriptor>> deviceInfo;
126         return deviceInfo;
127     }
128     return gsp->GetPreferredInputDeviceDescriptors(captureInfo);
129 }
130 
GetOutputDevice(sptr<AudioRendererFilter> audioRendererFilter)131 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioPolicyManager::GetOutputDevice(
132     sptr<AudioRendererFilter> audioRendererFilter)
133 {
134     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
135     if (gsp == nullptr) {
136         AUDIO_ERR_LOG("audio policy manager proxy is NULL.");
137         std::vector<std::shared_ptr<AudioDeviceDescriptor>> deviceInfo;
138         return deviceInfo;
139     }
140     return gsp->GetOutputDevice(audioRendererFilter);
141 }
142 
GetInputDevice(sptr<AudioCapturerFilter> audioCapturerFilter)143 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioPolicyManager::GetInputDevice(
144     sptr<AudioCapturerFilter> audioCapturerFilter)
145 {
146     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
147     if (gsp == nullptr) {
148         AUDIO_ERR_LOG("audio policy manager proxy is NULL.");
149         std::vector<std::shared_ptr<AudioDeviceDescriptor>> deviceInfo;
150         return deviceInfo;
151     }
152     return gsp->GetInputDevice(audioCapturerFilter);
153 }
154 
SetDeviceActive(InternalDeviceType deviceType,bool active,const int32_t uid)155 int32_t AudioPolicyManager::SetDeviceActive(InternalDeviceType deviceType, bool active, const int32_t uid)
156 {
157     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
158     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, -1, "audio policy manager proxy is NULL.");
159     return gsp->SetDeviceActive(deviceType, active, uid);
160 }
161 
IsDeviceActive(InternalDeviceType deviceType)162 bool AudioPolicyManager::IsDeviceActive(InternalDeviceType deviceType)
163 {
164     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
165     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, false, "audio policy manager proxy is NULL.");
166     return gsp->IsDeviceActive(deviceType);
167 }
168 
GetActiveOutputDevice()169 DeviceType AudioPolicyManager::GetActiveOutputDevice()
170 {
171     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
172     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, DEVICE_TYPE_INVALID, "audio policy manager proxy is NULL.");
173     return gsp->GetActiveOutputDevice();
174 }
175 
GetActiveInputDevice()176 DeviceType AudioPolicyManager::GetActiveInputDevice()
177 {
178     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
179     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, DEVICE_TYPE_INVALID, "audio policy manager proxy is NULL.");
180     return gsp->GetActiveInputDevice();
181 }
182 
SetDeviceChangeCallback(const int32_t clientId,const DeviceFlag flag,const std::shared_ptr<AudioManagerDeviceChangeCallback> & callback)183 int32_t AudioPolicyManager::SetDeviceChangeCallback(const int32_t clientId, const DeviceFlag flag,
184     const std::shared_ptr<AudioManagerDeviceChangeCallback> &callback)
185 {
186     AUDIO_DEBUG_LOG("AudioPolicyManager::SetDeviceChangeCallback");
187     bool hasSystemPermission = PermissionUtil::VerifySystemPermission();
188     switch (flag) {
189         case NONE_DEVICES_FLAG:
190         case DISTRIBUTED_OUTPUT_DEVICES_FLAG:
191         case DISTRIBUTED_INPUT_DEVICES_FLAG:
192         case ALL_DISTRIBUTED_DEVICES_FLAG:
193         case ALL_L_D_DEVICES_FLAG:
194             if (!hasSystemPermission) {
195                 AUDIO_ERR_LOG("SetDeviceChangeCallback: No system permission");
196                 return ERR_PERMISSION_DENIED;
197             }
198             break;
199         default:
200             break;
201     }
202 
203     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "SetDeviceChangeCallback: callback is nullptr");
204 
205     if (!isAudioPolicyClientRegisted_) {
206         const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
207         CHECK_AND_RETURN_RET_LOG(gsp != nullptr, -1, "audio policy manager proxy is NULL.");
208         int32_t ret = RegisterPolicyCallbackClientFunc(gsp);
209         if (ret != SUCCESS) {
210             return ret;
211         }
212     }
213 
214     std::lock_guard<std::mutex> lockCbMap(callbackChangeInfos_[CALLBACK_SET_DEVICE_CHANGE].mutex);
215     if (audioPolicyClientStubCB_ != nullptr) {
216         audioPolicyClientStubCB_->AddDeviceChangeCallback(flag, callback);
217         size_t callbackSize = audioPolicyClientStubCB_->GetDeviceChangeCallbackSize();
218         if (callbackSize == 1) {
219             callbackChangeInfos_[CALLBACK_SET_DEVICE_CHANGE].isEnable = true;
220             SetClientCallbacksEnable(CALLBACK_SET_DEVICE_CHANGE, true);
221         }
222     }
223     return SUCCESS;
224 }
225 
SetDistribuitedOutputChangeCallback(const std::shared_ptr<AudioDistribuitedOutputChangeCallback> & cb)226 int32_t AudioPolicyManager::SetDistribuitedOutputChangeCallback(
227     const std::shared_ptr<AudioDistribuitedOutputChangeCallback> &cb)
228 {
229     if (!isAudioPolicyClientRegisted_) {
230         const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
231         CHECK_AND_RETURN_RET_LOG(gsp != nullptr, -1, "audio policy manager proxy is NULL.");
232         int32_t ret = RegisterPolicyCallbackClientFunc(gsp);
233         if (ret != SUCCESS) {
234             return ret;
235         }
236     }
237 
238     std::lock_guard<std::mutex> lockCbMap(callbackChangeInfos_[CALLBACK_DISTRIBUTED_OUTPUT_CHANGE].mutex);
239     if (audioPolicyClientStubCB_ != nullptr) {
240         audioPolicyClientStubCB_->SetDistribuitedOutputChangeCallback(cb);
241         callbackChangeInfos_[CALLBACK_DISTRIBUTED_OUTPUT_CHANGE].isEnable = true;
242         SetClientCallbacksEnable(CALLBACK_DISTRIBUTED_OUTPUT_CHANGE, true);
243     }
244     return SUCCESS;
245 }
246 
UnsetDeviceChangeCallback(const int32_t clientId,DeviceFlag flag,std::shared_ptr<AudioManagerDeviceChangeCallback> & cb)247 int32_t AudioPolicyManager::UnsetDeviceChangeCallback(const int32_t clientId, DeviceFlag flag,
248     std::shared_ptr<AudioManagerDeviceChangeCallback> &cb)
249 {
250     AUDIO_DEBUG_LOG("AudioPolicyManager::UnsetDeviceChangeCallback");
251     std::lock_guard<std::mutex> lockCbMap(callbackChangeInfos_[CALLBACK_SET_DEVICE_CHANGE].mutex);
252     if (audioPolicyClientStubCB_ != nullptr) {
253         audioPolicyClientStubCB_->RemoveDeviceChangeCallback(flag, cb);
254         if (audioPolicyClientStubCB_->GetDeviceChangeCallbackSize() == 0) {
255             callbackChangeInfos_[CALLBACK_SET_DEVICE_CHANGE].isEnable = false;
256             SetClientCallbacksEnable(CALLBACK_SET_DEVICE_CHANGE, false);
257         }
258     }
259     return SUCCESS;
260 }
261 
SetPreferredOutputDeviceChangeCallback(const AudioRendererInfo & rendererInfo,const std::shared_ptr<AudioPreferredOutputDeviceChangeCallback> & callback)262 int32_t AudioPolicyManager::SetPreferredOutputDeviceChangeCallback(const AudioRendererInfo &rendererInfo,
263     const std::shared_ptr<AudioPreferredOutputDeviceChangeCallback> &callback)
264 {
265     AUDIO_DEBUG_LOG("AudioPolicyManager::SetPreferredOutputDeviceChangeCallback");
266     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
267 
268     if (!isAudioPolicyClientRegisted_) {
269         const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
270         CHECK_AND_RETURN_RET_LOG(gsp != nullptr, -1, "audio policy manager proxy is NULL.");
271         int32_t ret = RegisterPolicyCallbackClientFunc(gsp);
272         if (ret != SUCCESS) {
273             return ret;
274         }
275     }
276 
277     std::lock_guard<std::mutex> lockCbMap(callbackChangeInfos_[CALLBACK_PREFERRED_OUTPUT_DEVICE_CHANGE].mutex);
278     if (audioPolicyClientStubCB_ != nullptr) {
279         audioPolicyClientStubCB_->AddPreferredOutputDeviceChangeCallback(rendererInfo, callback);
280         rendererInfos_.push_back(rendererInfo);
281         SetCallbackRendererInfo(rendererInfo);
282         size_t callbackSize = audioPolicyClientStubCB_->GetPreferredOutputDeviceChangeCallbackSize();
283         if (callbackSize == 1) {
284             callbackChangeInfos_[CALLBACK_PREFERRED_OUTPUT_DEVICE_CHANGE].isEnable = true;
285             SetClientCallbacksEnable(CALLBACK_PREFERRED_OUTPUT_DEVICE_CHANGE, true);
286         }
287     }
288     return SUCCESS;
289 }
290 
SetPreferredInputDeviceChangeCallback(const AudioCapturerInfo & capturerInfo,const std::shared_ptr<AudioPreferredInputDeviceChangeCallback> & callback)291 int32_t AudioPolicyManager::SetPreferredInputDeviceChangeCallback(const AudioCapturerInfo &capturerInfo,
292     const std::shared_ptr<AudioPreferredInputDeviceChangeCallback> &callback)
293 {
294     AUDIO_DEBUG_LOG("AudioPolicyManager::SetPreferredInputDeviceChangeCallback");
295     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
296 
297     if (!isAudioPolicyClientRegisted_) {
298         const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
299         CHECK_AND_RETURN_RET_LOG(gsp != nullptr, -1, "audio policy manager proxy is NULL.");
300         int32_t ret = RegisterPolicyCallbackClientFunc(gsp);
301         if (ret != SUCCESS) {
302             return ret;
303         }
304     }
305 
306     std::lock_guard<std::mutex> lockCbMap(callbackChangeInfos_[CALLBACK_PREFERRED_INPUT_DEVICE_CHANGE].mutex);
307     if (audioPolicyClientStubCB_ != nullptr) {
308         audioPolicyClientStubCB_->AddPreferredInputDeviceChangeCallback(capturerInfo, callback);
309         capturerInfos_.push_back(capturerInfo);
310         SetCallbackCapturerInfo(capturerInfo);
311         size_t callbackSize = audioPolicyClientStubCB_->GetPreferredInputDeviceChangeCallbackSize();
312         if (callbackSize == 1) {
313             callbackChangeInfos_[CALLBACK_PREFERRED_INPUT_DEVICE_CHANGE].isEnable = true;
314             SetClientCallbacksEnable(CALLBACK_PREFERRED_INPUT_DEVICE_CHANGE, true);
315         }
316     }
317     return SUCCESS;
318 }
319 
UnsetPreferredOutputDeviceChangeCallback(const std::shared_ptr<AudioPreferredOutputDeviceChangeCallback> & callback)320 int32_t AudioPolicyManager::UnsetPreferredOutputDeviceChangeCallback(
321     const std::shared_ptr<AudioPreferredOutputDeviceChangeCallback> &callback)
322 {
323     AUDIO_DEBUG_LOG("AudioPolicyManager::UnsetPreferredOutputDeviceChangeCallback");
324     std::lock_guard<std::mutex> lockCbMap(callbackChangeInfos_[CALLBACK_PREFERRED_OUTPUT_DEVICE_CHANGE].mutex);
325     if (audioPolicyClientStubCB_ != nullptr) {
326         audioPolicyClientStubCB_->RemovePreferredOutputDeviceChangeCallback(callback);
327         if (audioPolicyClientStubCB_->GetPreferredOutputDeviceChangeCallbackSize() == 0) {
328             callbackChangeInfos_[CALLBACK_PREFERRED_OUTPUT_DEVICE_CHANGE].isEnable = false;
329             SetClientCallbacksEnable(CALLBACK_PREFERRED_OUTPUT_DEVICE_CHANGE, false);
330         }
331     }
332     return SUCCESS;
333 }
334 
UnsetPreferredInputDeviceChangeCallback(const std::shared_ptr<AudioPreferredInputDeviceChangeCallback> & callback)335 int32_t AudioPolicyManager::UnsetPreferredInputDeviceChangeCallback(
336     const std::shared_ptr<AudioPreferredInputDeviceChangeCallback> &callback)
337 {
338     AUDIO_DEBUG_LOG("AudioPolicyManager::UnsetPreferredInputDeviceChangeCallback");
339     std::lock_guard<std::mutex> lockCbMap(callbackChangeInfos_[CALLBACK_PREFERRED_INPUT_DEVICE_CHANGE].mutex);
340     if (audioPolicyClientStubCB_ != nullptr) {
341         audioPolicyClientStubCB_->RemovePreferredInputDeviceChangeCallback(callback);
342         if (audioPolicyClientStubCB_->GetPreferredInputDeviceChangeCallbackSize() == 0) {
343             callbackChangeInfos_[CALLBACK_PREFERRED_INPUT_DEVICE_CHANGE].isEnable = false;
344             SetClientCallbacksEnable(CALLBACK_PREFERRED_INPUT_DEVICE_CHANGE, false);
345         }
346     }
347     return SUCCESS;
348 }
349 
350 
RegisterDeviceChangeWithInfoCallback(const uint32_t sessionID,const std::weak_ptr<DeviceChangeWithInfoCallback> & callback)351 int32_t AudioPolicyManager::RegisterDeviceChangeWithInfoCallback(
352     const uint32_t sessionID, const std::weak_ptr<DeviceChangeWithInfoCallback> &callback)
353 {
354     AUDIO_DEBUG_LOG("In");
355 
356     if (callback.expired()) {
357         AUDIO_ERR_LOG("callback is expired");
358         return ERR_INVALID_PARAM;
359     }
360 
361     if (!isAudioPolicyClientRegisted_) {
362         const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
363         CHECK_AND_RETURN_RET_LOG(gsp != nullptr, ERROR, "audio policy manager proxy is NULL.");
364         int32_t ret = RegisterPolicyCallbackClientFunc(gsp);
365         if (ret != SUCCESS) {
366             return ret;
367         }
368     }
369 
370     std::lock_guard<std::mutex> lockCbMap(callbackChangeInfos_[CALLBACK_DEVICE_CHANGE_WITH_INFO].mutex);
371     if (audioPolicyClientStubCB_ != nullptr) {
372         audioPolicyClientStubCB_->AddDeviceChangeWithInfoCallback(sessionID, callback);
373         size_t callbackSize = audioPolicyClientStubCB_->GetDeviceChangeWithInfoCallbackkSize();
374         if (callbackSize == 1) {
375             callbackChangeInfos_[CALLBACK_DEVICE_CHANGE_WITH_INFO].isEnable = true;
376             SetClientCallbacksEnable(CALLBACK_DEVICE_CHANGE_WITH_INFO, true);
377         }
378     }
379     return SUCCESS;
380 }
381 
UnregisterDeviceChangeWithInfoCallback(const uint32_t sessionID)382 int32_t AudioPolicyManager::UnregisterDeviceChangeWithInfoCallback(const uint32_t sessionID)
383 {
384     AUDIO_DEBUG_LOG("In");
385     std::lock_guard<std::mutex> lockCbMap(callbackChangeInfos_[CALLBACK_DEVICE_CHANGE_WITH_INFO].mutex);
386     if (audioPolicyClientStubCB_ != nullptr) {
387         audioPolicyClientStubCB_->RemoveDeviceChangeWithInfoCallback(sessionID);
388         if (audioPolicyClientStubCB_->GetDeviceChangeWithInfoCallbackkSize() == 0) {
389             callbackChangeInfos_[CALLBACK_DEVICE_CHANGE_WITH_INFO].isEnable = false;
390             SetClientCallbacksEnable(CALLBACK_DEVICE_CHANGE_WITH_INFO, false);
391         }
392     }
393     return SUCCESS;
394 }
395 
GetAvailableDevices(AudioDeviceUsage usage)396 std::vector<std::shared_ptr<AudioDeviceDescriptor>> AudioPolicyManager::GetAvailableDevices(AudioDeviceUsage usage)
397 {
398     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
399     if (gsp == nullptr) {
400         AUDIO_ERR_LOG("GetAvailableMicrophones: audio policy manager proxy is NULL.");
401         std::vector<shared_ptr<AudioDeviceDescriptor>> descs;
402         return descs;
403     }
404     return gsp->GetAvailableDevices(usage);
405 }
406 
SetAvailableDeviceChangeCallback(const int32_t clientId,const AudioDeviceUsage usage,const std::shared_ptr<AudioManagerAvailableDeviceChangeCallback> & callback)407 int32_t AudioPolicyManager::SetAvailableDeviceChangeCallback(const int32_t clientId, const AudioDeviceUsage usage,
408     const std::shared_ptr<AudioManagerAvailableDeviceChangeCallback>& callback)
409 {
410     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
411     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, -1, "audio policy manager proxy is NULL.");
412     CHECK_AND_RETURN_RET_LOG(callback != nullptr, ERR_INVALID_PARAM, "callback is nullptr");
413 
414     auto deviceChangeCbStub = new(std::nothrow) AudioPolicyManagerListenerStub();
415     CHECK_AND_RETURN_RET_LOG(deviceChangeCbStub != nullptr, ERROR, "object null");
416 
417     deviceChangeCbStub->SetAvailableDeviceChangeCallback(callback);
418 
419     sptr<IRemoteObject> object = deviceChangeCbStub->AsObject();
420     if (object == nullptr) {
421         AUDIO_ERR_LOG("listenerStub->AsObject is nullptr..");
422         delete deviceChangeCbStub;
423         return ERROR;
424     }
425 
426     return gsp->SetAvailableDeviceChangeCallback(clientId, usage, object);
427 }
428 
UnsetAvailableDeviceChangeCallback(const int32_t clientId,AudioDeviceUsage usage)429 int32_t AudioPolicyManager::UnsetAvailableDeviceChangeCallback(const int32_t clientId, AudioDeviceUsage usage)
430 {
431     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
432     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, -1, "audio policy manager proxy is NULL.");
433     return gsp->UnsetAvailableDeviceChangeCallback(clientId, usage);
434 }
435 
SetCallDeviceActive(InternalDeviceType deviceType,bool active,std::string address,const int32_t uid)436 int32_t AudioPolicyManager::SetCallDeviceActive(InternalDeviceType deviceType, bool active, std::string address,
437     const int32_t uid)
438 {
439     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
440     if (gsp == nullptr) {
441         AUDIO_ERR_LOG("audio policy manager proxy is NULL.");
442         return -1;
443     }
444     return gsp->SetCallDeviceActive(deviceType, active, address, uid);
445 }
446 
GetActiveBluetoothDevice()447 std::shared_ptr<AudioDeviceDescriptor> AudioPolicyManager::GetActiveBluetoothDevice()
448 {
449     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
450     if (gsp == nullptr) {
451         AUDIO_ERR_LOG("audio policy manager proxy is NULL.");
452         return make_shared<AudioDeviceDescriptor>();
453     }
454     return gsp->GetActiveBluetoothDevice();
455 }
456 
FetchOutputDeviceForTrack(AudioStreamChangeInfo & streamChangeInfo,const AudioStreamDeviceChangeReasonExt reason)457 void AudioPolicyManager::FetchOutputDeviceForTrack(AudioStreamChangeInfo &streamChangeInfo,
458     const AudioStreamDeviceChangeReasonExt reason)
459 {
460     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
461     if (gsp != nullptr) {
462         gsp->FetchOutputDeviceForTrack(streamChangeInfo, reason);
463     } else {
464         AUDIO_ERR_LOG("audio policy manager proxy is NULL.");
465     }
466 }
467 
FetchInputDeviceForTrack(AudioStreamChangeInfo & streamChangeInfo)468 void AudioPolicyManager::FetchInputDeviceForTrack(AudioStreamChangeInfo &streamChangeInfo)
469 {
470     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
471     if (gsp != nullptr) {
472         gsp->FetchInputDeviceForTrack(streamChangeInfo);
473     } else {
474         AUDIO_ERR_LOG("audio policy manager proxy is NULL.");
475     }
476 }
477 
TriggerFetchDevice(AudioStreamDeviceChangeReasonExt reason)478 int32_t AudioPolicyManager::TriggerFetchDevice(AudioStreamDeviceChangeReasonExt reason)
479 {
480     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
481     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, ERROR, "audio policy manager proxy is NULL.");
482     return gsp->TriggerFetchDevice(reason);
483 }
484 
SetPreferredDevice(const PreferredType preferredType,const std::shared_ptr<AudioDeviceDescriptor> & desc,const int32_t uid)485 int32_t AudioPolicyManager::SetPreferredDevice(const PreferredType preferredType,
486     const std::shared_ptr<AudioDeviceDescriptor> &desc, const int32_t uid)
487 {
488     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
489     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, ERROR, "audio policy manager proxy is NULL.");
490     return gsp->SetPreferredDevice(preferredType, desc, uid);
491 }
492 
SetAudioDeviceAnahsCallback(const std::shared_ptr<AudioDeviceAnahs> & callback)493 int32_t AudioPolicyManager::SetAudioDeviceAnahsCallback(const std::shared_ptr<AudioDeviceAnahs> &callback)
494 {
495     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
496     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, ERROR, "audio policy manager proxy is NULL.");
497     if (callback == nullptr) {
498         return ERR_INVALID_PARAM;
499     };
500 
501     std::unique_lock<std::mutex> lock(listenerStubMutex_);
502     auto activeDistributedAnahsRoleCb = new (std::nothrow) AudioAnahsManagerListenerStub();
503     if (activeDistributedAnahsRoleCb == nullptr) {
504         AUDIO_ERR_LOG("object is nullptr");
505         return ERROR;
506     }
507     activeDistributedAnahsRoleCb->SetAudioDeviceAnahsCallback(callback);
508     sptr<IRemoteObject> object = activeDistributedAnahsRoleCb->AsObject();
509     if (object == nullptr) {
510         AUDIO_ERR_LOG("listenerStub is nullptr");
511         delete activeDistributedAnahsRoleCb;
512         return ERROR;
513     }
514     return gsp->SetAudioDeviceAnahsCallback(object);
515 }
516 
UnsetAudioDeviceAnahsCallback()517 int32_t AudioPolicyManager::UnsetAudioDeviceAnahsCallback()
518 {
519     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
520     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, ERROR, "audio policy manager proxy is NULL.");
521     return gsp->UnsetAudioDeviceAnahsCallback();
522 }
523 
MoveToNewPipe(const uint32_t sessionId,const AudioPipeType pipeType)524 int32_t AudioPolicyManager::MoveToNewPipe(const uint32_t sessionId, const AudioPipeType pipeType)
525 {
526     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
527     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, ERROR, "audio policy manager proxy is NULL.");
528     return gsp->MoveToNewPipe(sessionId, pipeType);
529 }
530 
SaveRemoteInfo(const std::string & networkId,DeviceType deviceType)531 void AudioPolicyManager::SaveRemoteInfo(const std::string &networkId, DeviceType deviceType)
532 {
533     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
534     if (gsp != nullptr) {
535         gsp->SaveRemoteInfo(networkId, deviceType);
536     } else {
537         AUDIO_ERR_LOG("audio policy manager proxy is NULL.");
538     }
539 }
540 
SetDeviceConnectionStatus(const std::shared_ptr<AudioDeviceDescriptor> & desc,const bool isConnected)541 int32_t AudioPolicyManager::SetDeviceConnectionStatus(const std::shared_ptr<AudioDeviceDescriptor> &desc,
542     const bool isConnected)
543 {
544     const sptr<IAudioPolicy> gsp = GetAudioPolicyManagerProxy();
545     CHECK_AND_RETURN_RET_LOG(gsp != nullptr, ERROR, "audio policy manager proxy is NULL.");
546     return gsp->SetDeviceConnectionStatus(desc, isConnected);
547 }
548 } // namespace AudioStandard
549 } // namespace OHOS
550