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