1 /*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define LOG_TAG "AudioPolicyIntefaceImpl"
18 //#define LOG_NDEBUG 0
19
20 #include <utils/Log.h>
21 #include "AudioPolicyService.h"
22 #include "ServiceUtilities.h"
23
24 namespace android {
25
26
27 // ----------------------------------------------------------------------------
28
setDeviceConnectionState(audio_devices_t device,audio_policy_dev_state_t state,const char * device_address,const char * device_name)29 status_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device,
30 audio_policy_dev_state_t state,
31 const char *device_address,
32 const char *device_name)
33 {
34 if (mAudioPolicyManager == NULL) {
35 return NO_INIT;
36 }
37 if (!settingsAllowed()) {
38 return PERMISSION_DENIED;
39 }
40 if (!audio_is_output_device(device) && !audio_is_input_device(device)) {
41 return BAD_VALUE;
42 }
43 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
44 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
45 return BAD_VALUE;
46 }
47
48 ALOGV("setDeviceConnectionState()");
49 Mutex::Autolock _l(mLock);
50 return mAudioPolicyManager->setDeviceConnectionState(device, state,
51 device_address, device_name);
52 }
53
getDeviceConnectionState(audio_devices_t device,const char * device_address)54 audio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState(
55 audio_devices_t device,
56 const char *device_address)
57 {
58 if (mAudioPolicyManager == NULL) {
59 return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
60 }
61 return mAudioPolicyManager->getDeviceConnectionState(device,
62 device_address);
63 }
64
setPhoneState(audio_mode_t state)65 status_t AudioPolicyService::setPhoneState(audio_mode_t state)
66 {
67 if (mAudioPolicyManager == NULL) {
68 return NO_INIT;
69 }
70 if (!settingsAllowed()) {
71 return PERMISSION_DENIED;
72 }
73 if (uint32_t(state) >= AUDIO_MODE_CNT) {
74 return BAD_VALUE;
75 }
76
77 ALOGV("setPhoneState()");
78
79 // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic
80 // operation from policy manager standpoint (no other operation (e.g track start or stop)
81 // can be interleaved).
82 Mutex::Autolock _l(mLock);
83
84 // TODO: check if it is more appropriate to do it in platform specific policy manager
85 AudioSystem::setMode(state);
86
87 mAudioPolicyManager->setPhoneState(state);
88 mPhoneState = state;
89 return NO_ERROR;
90 }
91
getPhoneState()92 audio_mode_t AudioPolicyService::getPhoneState()
93 {
94 Mutex::Autolock _l(mLock);
95 return mPhoneState;
96 }
97
setForceUse(audio_policy_force_use_t usage,audio_policy_forced_cfg_t config)98 status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
99 audio_policy_forced_cfg_t config)
100 {
101 if (mAudioPolicyManager == NULL) {
102 return NO_INIT;
103 }
104 if (!settingsAllowed()) {
105 return PERMISSION_DENIED;
106 }
107 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
108 return BAD_VALUE;
109 }
110 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
111 return BAD_VALUE;
112 }
113 ALOGV("setForceUse()");
114 Mutex::Autolock _l(mLock);
115 mAudioPolicyManager->setForceUse(usage, config);
116 return NO_ERROR;
117 }
118
getForceUse(audio_policy_force_use_t usage)119 audio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage)
120 {
121 if (mAudioPolicyManager == NULL) {
122 return AUDIO_POLICY_FORCE_NONE;
123 }
124 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
125 return AUDIO_POLICY_FORCE_NONE;
126 }
127 return mAudioPolicyManager->getForceUse(usage);
128 }
129
getOutput(audio_stream_type_t stream,uint32_t samplingRate,audio_format_t format,audio_channel_mask_t channelMask,audio_output_flags_t flags,const audio_offload_info_t * offloadInfo)130 audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream,
131 uint32_t samplingRate,
132 audio_format_t format,
133 audio_channel_mask_t channelMask,
134 audio_output_flags_t flags,
135 const audio_offload_info_t *offloadInfo)
136 {
137 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
138 return AUDIO_IO_HANDLE_NONE;
139 }
140 if (mAudioPolicyManager == NULL) {
141 return AUDIO_IO_HANDLE_NONE;
142 }
143 ALOGV("getOutput()");
144 Mutex::Autolock _l(mLock);
145 return mAudioPolicyManager->getOutput(stream, samplingRate,
146 format, channelMask, flags, offloadInfo);
147 }
148
getOutputForAttr(const audio_attributes_t * attr,audio_io_handle_t * output,audio_session_t session,audio_stream_type_t * stream,uid_t uid,uint32_t samplingRate,audio_format_t format,audio_channel_mask_t channelMask,audio_output_flags_t flags,audio_port_handle_t selectedDeviceId,const audio_offload_info_t * offloadInfo)149 status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
150 audio_io_handle_t *output,
151 audio_session_t session,
152 audio_stream_type_t *stream,
153 uid_t uid,
154 uint32_t samplingRate,
155 audio_format_t format,
156 audio_channel_mask_t channelMask,
157 audio_output_flags_t flags,
158 audio_port_handle_t selectedDeviceId,
159 const audio_offload_info_t *offloadInfo)
160 {
161 if (mAudioPolicyManager == NULL) {
162 return NO_INIT;
163 }
164 ALOGV("getOutput()");
165 Mutex::Autolock _l(mLock);
166
167 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
168 if (!isTrustedCallingUid(callingUid) || uid == (uid_t)-1) {
169 ALOGW_IF(uid != (uid_t)-1 && uid != callingUid,
170 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, uid);
171 uid = callingUid;
172 }
173 return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, samplingRate,
174 format, channelMask, flags, selectedDeviceId, offloadInfo);
175 }
176
startOutput(audio_io_handle_t output,audio_stream_type_t stream,audio_session_t session)177 status_t AudioPolicyService::startOutput(audio_io_handle_t output,
178 audio_stream_type_t stream,
179 audio_session_t session)
180 {
181 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
182 return BAD_VALUE;
183 }
184 if (mAudioPolicyManager == NULL) {
185 return NO_INIT;
186 }
187 ALOGV("startOutput()");
188 sp<AudioPolicyEffects>audioPolicyEffects;
189 {
190 Mutex::Autolock _l(mLock);
191 audioPolicyEffects = mAudioPolicyEffects;
192 }
193 if (audioPolicyEffects != 0) {
194 // create audio processors according to stream
195 status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
196 if (status != NO_ERROR && status != ALREADY_EXISTS) {
197 ALOGW("Failed to add effects on session %d", session);
198 }
199 }
200 Mutex::Autolock _l(mLock);
201 return mAudioPolicyManager->startOutput(output, stream, session);
202 }
203
stopOutput(audio_io_handle_t output,audio_stream_type_t stream,audio_session_t session)204 status_t AudioPolicyService::stopOutput(audio_io_handle_t output,
205 audio_stream_type_t stream,
206 audio_session_t session)
207 {
208 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
209 return BAD_VALUE;
210 }
211 if (mAudioPolicyManager == NULL) {
212 return NO_INIT;
213 }
214 ALOGV("stopOutput()");
215 mOutputCommandThread->stopOutputCommand(output, stream, session);
216 return NO_ERROR;
217 }
218
doStopOutput(audio_io_handle_t output,audio_stream_type_t stream,audio_session_t session)219 status_t AudioPolicyService::doStopOutput(audio_io_handle_t output,
220 audio_stream_type_t stream,
221 audio_session_t session)
222 {
223 ALOGV("doStopOutput from tid %d", gettid());
224 sp<AudioPolicyEffects>audioPolicyEffects;
225 {
226 Mutex::Autolock _l(mLock);
227 audioPolicyEffects = mAudioPolicyEffects;
228 }
229 if (audioPolicyEffects != 0) {
230 // release audio processors from the stream
231 status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
232 if (status != NO_ERROR && status != ALREADY_EXISTS) {
233 ALOGW("Failed to release effects on session %d", session);
234 }
235 }
236 Mutex::Autolock _l(mLock);
237 return mAudioPolicyManager->stopOutput(output, stream, session);
238 }
239
releaseOutput(audio_io_handle_t output,audio_stream_type_t stream,audio_session_t session)240 void AudioPolicyService::releaseOutput(audio_io_handle_t output,
241 audio_stream_type_t stream,
242 audio_session_t session)
243 {
244 if (mAudioPolicyManager == NULL) {
245 return;
246 }
247 ALOGV("releaseOutput()");
248 mOutputCommandThread->releaseOutputCommand(output, stream, session);
249 }
250
doReleaseOutput(audio_io_handle_t output,audio_stream_type_t stream,audio_session_t session)251 void AudioPolicyService::doReleaseOutput(audio_io_handle_t output,
252 audio_stream_type_t stream,
253 audio_session_t session)
254 {
255 ALOGV("doReleaseOutput from tid %d", gettid());
256 Mutex::Autolock _l(mLock);
257 mAudioPolicyManager->releaseOutput(output, stream, session);
258 }
259
getInputForAttr(const audio_attributes_t * attr,audio_io_handle_t * input,audio_session_t session,pid_t pid,uid_t uid,uint32_t samplingRate,audio_format_t format,audio_channel_mask_t channelMask,audio_input_flags_t flags,audio_port_handle_t selectedDeviceId)260 status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
261 audio_io_handle_t *input,
262 audio_session_t session,
263 pid_t pid,
264 uid_t uid,
265 uint32_t samplingRate,
266 audio_format_t format,
267 audio_channel_mask_t channelMask,
268 audio_input_flags_t flags,
269 audio_port_handle_t selectedDeviceId)
270 {
271 if (mAudioPolicyManager == NULL) {
272 return NO_INIT;
273 }
274 // already checked by client, but double-check in case the client wrapper is bypassed
275 if (attr->source >= AUDIO_SOURCE_CNT && attr->source != AUDIO_SOURCE_HOTWORD &&
276 attr->source != AUDIO_SOURCE_FM_TUNER) {
277 return BAD_VALUE;
278 }
279
280 if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
281 return BAD_VALUE;
282 }
283 sp<AudioPolicyEffects>audioPolicyEffects;
284 status_t status;
285 AudioPolicyInterface::input_type_t inputType;
286
287 bool updatePid = (pid == -1);
288 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
289 if (!isTrustedCallingUid(callingUid)) {
290 ALOGW_IF(uid != (uid_t)-1 && uid != callingUid,
291 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, uid);
292 uid = callingUid;
293 updatePid = true;
294 }
295
296 if (updatePid) {
297 const pid_t callingPid = IPCThreadState::self()->getCallingPid();
298 ALOGW_IF(pid != (pid_t)-1 && pid != callingPid,
299 "%s uid %d pid %d tried to pass itself off as pid %d",
300 __func__, callingUid, callingPid, pid);
301 pid = callingPid;
302 }
303
304 {
305 Mutex::Autolock _l(mLock);
306 // the audio_in_acoustics_t parameter is ignored by get_input()
307 status = mAudioPolicyManager->getInputForAttr(attr, input, session, uid,
308 samplingRate, format, channelMask,
309 flags, selectedDeviceId,
310 &inputType);
311 audioPolicyEffects = mAudioPolicyEffects;
312
313 if (status == NO_ERROR) {
314 // enforce permission (if any) required for each type of input
315 switch (inputType) {
316 case AudioPolicyInterface::API_INPUT_LEGACY:
317 break;
318 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX:
319 // FIXME: use the same permission as for remote submix for now.
320 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
321 if (!captureAudioOutputAllowed(pid, uid)) {
322 ALOGE("getInputForAttr() permission denied: capture not allowed");
323 status = PERMISSION_DENIED;
324 }
325 break;
326 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE:
327 if (!modifyAudioRoutingAllowed()) {
328 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed");
329 status = PERMISSION_DENIED;
330 }
331 break;
332 case AudioPolicyInterface::API_INPUT_INVALID:
333 default:
334 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d",
335 (int)inputType);
336 }
337 }
338
339 if (status != NO_ERROR) {
340 if (status == PERMISSION_DENIED) {
341 mAudioPolicyManager->releaseInput(*input, session);
342 }
343 return status;
344 }
345 }
346
347 if (audioPolicyEffects != 0) {
348 // create audio pre processors according to input source
349 status_t status = audioPolicyEffects->addInputEffects(*input, attr->source, session);
350 if (status != NO_ERROR && status != ALREADY_EXISTS) {
351 ALOGW("Failed to add effects on input %d", *input);
352 }
353 }
354 return NO_ERROR;
355 }
356
startInput(audio_io_handle_t input,audio_session_t session)357 status_t AudioPolicyService::startInput(audio_io_handle_t input,
358 audio_session_t session)
359 {
360 if (mAudioPolicyManager == NULL) {
361 return NO_INIT;
362 }
363 Mutex::Autolock _l(mLock);
364
365 return mAudioPolicyManager->startInput(input, session);
366 }
367
stopInput(audio_io_handle_t input,audio_session_t session)368 status_t AudioPolicyService::stopInput(audio_io_handle_t input,
369 audio_session_t session)
370 {
371 if (mAudioPolicyManager == NULL) {
372 return NO_INIT;
373 }
374 Mutex::Autolock _l(mLock);
375
376 return mAudioPolicyManager->stopInput(input, session);
377 }
378
releaseInput(audio_io_handle_t input,audio_session_t session)379 void AudioPolicyService::releaseInput(audio_io_handle_t input,
380 audio_session_t session)
381 {
382 if (mAudioPolicyManager == NULL) {
383 return;
384 }
385 sp<AudioPolicyEffects>audioPolicyEffects;
386 {
387 Mutex::Autolock _l(mLock);
388 audioPolicyEffects = mAudioPolicyEffects;
389 }
390 if (audioPolicyEffects != 0) {
391 // release audio processors from the input
392 status_t status = audioPolicyEffects->releaseInputEffects(input);
393 if(status != NO_ERROR) {
394 ALOGW("Failed to release effects on input %d", input);
395 }
396 }
397 {
398 Mutex::Autolock _l(mLock);
399 mAudioPolicyManager->releaseInput(input, session);
400 }
401 }
402
initStreamVolume(audio_stream_type_t stream,int indexMin,int indexMax)403 status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
404 int indexMin,
405 int indexMax)
406 {
407 if (mAudioPolicyManager == NULL) {
408 return NO_INIT;
409 }
410 if (!settingsAllowed()) {
411 return PERMISSION_DENIED;
412 }
413 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
414 return BAD_VALUE;
415 }
416 Mutex::Autolock _l(mLock);
417 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
418 return NO_ERROR;
419 }
420
setStreamVolumeIndex(audio_stream_type_t stream,int index,audio_devices_t device)421 status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
422 int index,
423 audio_devices_t device)
424 {
425 if (mAudioPolicyManager == NULL) {
426 return NO_INIT;
427 }
428 if (!settingsAllowed()) {
429 return PERMISSION_DENIED;
430 }
431 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
432 return BAD_VALUE;
433 }
434 Mutex::Autolock _l(mLock);
435 return mAudioPolicyManager->setStreamVolumeIndex(stream,
436 index,
437 device);
438 }
439
getStreamVolumeIndex(audio_stream_type_t stream,int * index,audio_devices_t device)440 status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
441 int *index,
442 audio_devices_t device)
443 {
444 if (mAudioPolicyManager == NULL) {
445 return NO_INIT;
446 }
447 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
448 return BAD_VALUE;
449 }
450 Mutex::Autolock _l(mLock);
451 return mAudioPolicyManager->getStreamVolumeIndex(stream,
452 index,
453 device);
454 }
455
getStrategyForStream(audio_stream_type_t stream)456 uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
457 {
458 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
459 return 0;
460 }
461 if (mAudioPolicyManager == NULL) {
462 return 0;
463 }
464 return mAudioPolicyManager->getStrategyForStream(stream);
465 }
466
467 //audio policy: use audio_device_t appropriately
468
getDevicesForStream(audio_stream_type_t stream)469 audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
470 {
471 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
472 return AUDIO_DEVICE_NONE;
473 }
474 if (mAudioPolicyManager == NULL) {
475 return AUDIO_DEVICE_NONE;
476 }
477 Mutex::Autolock _l(mLock);
478 return mAudioPolicyManager->getDevicesForStream(stream);
479 }
480
getOutputForEffect(const effect_descriptor_t * desc)481 audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
482 {
483 // FIXME change return type to status_t, and return NO_INIT here
484 if (mAudioPolicyManager == NULL) {
485 return 0;
486 }
487 Mutex::Autolock _l(mLock);
488 return mAudioPolicyManager->getOutputForEffect(desc);
489 }
490
registerEffect(const effect_descriptor_t * desc,audio_io_handle_t io,uint32_t strategy,audio_session_t session,int id)491 status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
492 audio_io_handle_t io,
493 uint32_t strategy,
494 audio_session_t session,
495 int id)
496 {
497 if (mAudioPolicyManager == NULL) {
498 return NO_INIT;
499 }
500 Mutex::Autolock _l(mEffectsLock);
501 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
502 }
503
unregisterEffect(int id)504 status_t AudioPolicyService::unregisterEffect(int id)
505 {
506 if (mAudioPolicyManager == NULL) {
507 return NO_INIT;
508 }
509 Mutex::Autolock _l(mEffectsLock);
510 return mAudioPolicyManager->unregisterEffect(id);
511 }
512
setEffectEnabled(int id,bool enabled)513 status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
514 {
515 if (mAudioPolicyManager == NULL) {
516 return NO_INIT;
517 }
518 Mutex::Autolock _l(mEffectsLock);
519 return mAudioPolicyManager->setEffectEnabled(id, enabled);
520 }
521
isStreamActive(audio_stream_type_t stream,uint32_t inPastMs) const522 bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
523 {
524 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
525 return false;
526 }
527 if (mAudioPolicyManager == NULL) {
528 return false;
529 }
530 Mutex::Autolock _l(mLock);
531 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
532 }
533
isStreamActiveRemotely(audio_stream_type_t stream,uint32_t inPastMs) const534 bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
535 {
536 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
537 return false;
538 }
539 if (mAudioPolicyManager == NULL) {
540 return false;
541 }
542 Mutex::Autolock _l(mLock);
543 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
544 }
545
isSourceActive(audio_source_t source) const546 bool AudioPolicyService::isSourceActive(audio_source_t source) const
547 {
548 if (mAudioPolicyManager == NULL) {
549 return false;
550 }
551 Mutex::Autolock _l(mLock);
552 return mAudioPolicyManager->isSourceActive(source);
553 }
554
queryDefaultPreProcessing(audio_session_t audioSession,effect_descriptor_t * descriptors,uint32_t * count)555 status_t AudioPolicyService::queryDefaultPreProcessing(audio_session_t audioSession,
556 effect_descriptor_t *descriptors,
557 uint32_t *count)
558 {
559 if (mAudioPolicyManager == NULL) {
560 *count = 0;
561 return NO_INIT;
562 }
563 sp<AudioPolicyEffects>audioPolicyEffects;
564 {
565 Mutex::Autolock _l(mLock);
566 audioPolicyEffects = mAudioPolicyEffects;
567 }
568 if (audioPolicyEffects == 0) {
569 *count = 0;
570 return NO_INIT;
571 }
572 return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
573 }
574
isOffloadSupported(const audio_offload_info_t & info)575 bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
576 {
577 if (mAudioPolicyManager == NULL) {
578 ALOGV("mAudioPolicyManager == NULL");
579 return false;
580 }
581 Mutex::Autolock _l(mLock);
582 Mutex::Autolock _le(mEffectsLock); // isOffloadSupported queries for
583 // non-offloadable effects
584 return mAudioPolicyManager->isOffloadSupported(info);
585 }
586
listAudioPorts(audio_port_role_t role,audio_port_type_t type,unsigned int * num_ports,struct audio_port * ports,unsigned int * generation)587 status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
588 audio_port_type_t type,
589 unsigned int *num_ports,
590 struct audio_port *ports,
591 unsigned int *generation)
592 {
593 Mutex::Autolock _l(mLock);
594 if (mAudioPolicyManager == NULL) {
595 return NO_INIT;
596 }
597
598 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
599 }
600
getAudioPort(struct audio_port * port)601 status_t AudioPolicyService::getAudioPort(struct audio_port *port)
602 {
603 Mutex::Autolock _l(mLock);
604 if (mAudioPolicyManager == NULL) {
605 return NO_INIT;
606 }
607
608 return mAudioPolicyManager->getAudioPort(port);
609 }
610
createAudioPatch(const struct audio_patch * patch,audio_patch_handle_t * handle)611 status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
612 audio_patch_handle_t *handle)
613 {
614 Mutex::Autolock _l(mLock);
615 if(!modifyAudioRoutingAllowed()) {
616 return PERMISSION_DENIED;
617 }
618 if (mAudioPolicyManager == NULL) {
619 return NO_INIT;
620 }
621 return mAudioPolicyManager->createAudioPatch(patch, handle,
622 IPCThreadState::self()->getCallingUid());
623 }
624
releaseAudioPatch(audio_patch_handle_t handle)625 status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
626 {
627 Mutex::Autolock _l(mLock);
628 if(!modifyAudioRoutingAllowed()) {
629 return PERMISSION_DENIED;
630 }
631 if (mAudioPolicyManager == NULL) {
632 return NO_INIT;
633 }
634
635 return mAudioPolicyManager->releaseAudioPatch(handle,
636 IPCThreadState::self()->getCallingUid());
637 }
638
listAudioPatches(unsigned int * num_patches,struct audio_patch * patches,unsigned int * generation)639 status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
640 struct audio_patch *patches,
641 unsigned int *generation)
642 {
643 Mutex::Autolock _l(mLock);
644 if (mAudioPolicyManager == NULL) {
645 return NO_INIT;
646 }
647
648 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
649 }
650
setAudioPortConfig(const struct audio_port_config * config)651 status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
652 {
653 Mutex::Autolock _l(mLock);
654 if(!modifyAudioRoutingAllowed()) {
655 return PERMISSION_DENIED;
656 }
657 if (mAudioPolicyManager == NULL) {
658 return NO_INIT;
659 }
660
661 return mAudioPolicyManager->setAudioPortConfig(config);
662 }
663
acquireSoundTriggerSession(audio_session_t * session,audio_io_handle_t * ioHandle,audio_devices_t * device)664 status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
665 audio_io_handle_t *ioHandle,
666 audio_devices_t *device)
667 {
668 if (mAudioPolicyManager == NULL) {
669 return NO_INIT;
670 }
671
672 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
673 }
674
releaseSoundTriggerSession(audio_session_t session)675 status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
676 {
677 if (mAudioPolicyManager == NULL) {
678 return NO_INIT;
679 }
680
681 return mAudioPolicyManager->releaseSoundTriggerSession(session);
682 }
683
registerPolicyMixes(Vector<AudioMix> mixes,bool registration)684 status_t AudioPolicyService::registerPolicyMixes(Vector<AudioMix> mixes, bool registration)
685 {
686 Mutex::Autolock _l(mLock);
687 if(!modifyAudioRoutingAllowed()) {
688 return PERMISSION_DENIED;
689 }
690 if (mAudioPolicyManager == NULL) {
691 return NO_INIT;
692 }
693 if (registration) {
694 return mAudioPolicyManager->registerPolicyMixes(mixes);
695 } else {
696 return mAudioPolicyManager->unregisterPolicyMixes(mixes);
697 }
698 }
699
startAudioSource(const struct audio_port_config * source,const audio_attributes_t * attributes,audio_io_handle_t * handle)700 status_t AudioPolicyService::startAudioSource(const struct audio_port_config *source,
701 const audio_attributes_t *attributes,
702 audio_io_handle_t *handle)
703 {
704 Mutex::Autolock _l(mLock);
705 if (mAudioPolicyManager == NULL) {
706 return NO_INIT;
707 }
708
709 return mAudioPolicyManager->startAudioSource(source, attributes, handle,
710 IPCThreadState::self()->getCallingUid());
711 }
712
stopAudioSource(audio_io_handle_t handle)713 status_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle)
714 {
715 Mutex::Autolock _l(mLock);
716 if (mAudioPolicyManager == NULL) {
717 return NO_INIT;
718 }
719
720 return mAudioPolicyManager->stopAudioSource(handle);
721 }
722
setMasterMono(bool mono)723 status_t AudioPolicyService::setMasterMono(bool mono)
724 {
725 if (mAudioPolicyManager == NULL) {
726 return NO_INIT;
727 }
728 if (!settingsAllowed()) {
729 return PERMISSION_DENIED;
730 }
731 Mutex::Autolock _l(mLock);
732 return mAudioPolicyManager->setMasterMono(mono);
733 }
734
getMasterMono(bool * mono)735 status_t AudioPolicyService::getMasterMono(bool *mono)
736 {
737 if (mAudioPolicyManager == NULL) {
738 return NO_INIT;
739 }
740 Mutex::Autolock _l(mLock);
741 return mAudioPolicyManager->getMasterMono(mono);
742 }
743
744 }; // namespace android
745