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 // if the caller is us, trust the specified uid
168 if (IPCThreadState::self()->getCallingPid() != getpid_cached || uid == (uid_t)-1) {
169 uid_t newclientUid = IPCThreadState::self()->getCallingUid();
170 if (uid != (uid_t)-1 && uid != newclientUid) {
171 ALOGW("%s uid %d tried to pass itself off as %d", __FUNCTION__, newclientUid, uid);
172 }
173 uid = newclientUid;
174 }
175 return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, samplingRate,
176 format, channelMask, flags, selectedDeviceId, offloadInfo);
177 }
178
startOutput(audio_io_handle_t output,audio_stream_type_t stream,audio_session_t session)179 status_t AudioPolicyService::startOutput(audio_io_handle_t output,
180 audio_stream_type_t stream,
181 audio_session_t session)
182 {
183 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
184 return BAD_VALUE;
185 }
186 if (mAudioPolicyManager == NULL) {
187 return NO_INIT;
188 }
189 ALOGV("startOutput()");
190 sp<AudioPolicyEffects>audioPolicyEffects;
191 {
192 Mutex::Autolock _l(mLock);
193 audioPolicyEffects = mAudioPolicyEffects;
194 }
195 if (audioPolicyEffects != 0) {
196 // create audio processors according to stream
197 status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
198 if (status != NO_ERROR && status != ALREADY_EXISTS) {
199 ALOGW("Failed to add effects on session %d", session);
200 }
201 }
202 Mutex::Autolock _l(mLock);
203 return mAudioPolicyManager->startOutput(output, stream, session);
204 }
205
stopOutput(audio_io_handle_t output,audio_stream_type_t stream,audio_session_t session)206 status_t AudioPolicyService::stopOutput(audio_io_handle_t output,
207 audio_stream_type_t stream,
208 audio_session_t session)
209 {
210 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
211 return BAD_VALUE;
212 }
213 if (mAudioPolicyManager == NULL) {
214 return NO_INIT;
215 }
216 ALOGV("stopOutput()");
217 mOutputCommandThread->stopOutputCommand(output, stream, session);
218 return NO_ERROR;
219 }
220
doStopOutput(audio_io_handle_t output,audio_stream_type_t stream,audio_session_t session)221 status_t AudioPolicyService::doStopOutput(audio_io_handle_t output,
222 audio_stream_type_t stream,
223 audio_session_t session)
224 {
225 ALOGV("doStopOutput from tid %d", gettid());
226 sp<AudioPolicyEffects>audioPolicyEffects;
227 {
228 Mutex::Autolock _l(mLock);
229 audioPolicyEffects = mAudioPolicyEffects;
230 }
231 if (audioPolicyEffects != 0) {
232 // release audio processors from the stream
233 status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
234 if (status != NO_ERROR && status != ALREADY_EXISTS) {
235 ALOGW("Failed to release effects on session %d", session);
236 }
237 }
238 Mutex::Autolock _l(mLock);
239 return mAudioPolicyManager->stopOutput(output, stream, session);
240 }
241
releaseOutput(audio_io_handle_t output,audio_stream_type_t stream,audio_session_t session)242 void AudioPolicyService::releaseOutput(audio_io_handle_t output,
243 audio_stream_type_t stream,
244 audio_session_t session)
245 {
246 if (mAudioPolicyManager == NULL) {
247 return;
248 }
249 ALOGV("releaseOutput()");
250 mOutputCommandThread->releaseOutputCommand(output, stream, session);
251 }
252
doReleaseOutput(audio_io_handle_t output,audio_stream_type_t stream,audio_session_t session)253 void AudioPolicyService::doReleaseOutput(audio_io_handle_t output,
254 audio_stream_type_t stream,
255 audio_session_t session)
256 {
257 ALOGV("doReleaseOutput from tid %d", gettid());
258 Mutex::Autolock _l(mLock);
259 mAudioPolicyManager->releaseOutput(output, stream, session);
260 }
261
getInputForAttr(const audio_attributes_t * attr,audio_io_handle_t * input,audio_session_t session,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)262 status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
263 audio_io_handle_t *input,
264 audio_session_t session,
265 uid_t uid,
266 uint32_t samplingRate,
267 audio_format_t format,
268 audio_channel_mask_t channelMask,
269 audio_input_flags_t flags,
270 audio_port_handle_t selectedDeviceId)
271 {
272 if (mAudioPolicyManager == NULL) {
273 return NO_INIT;
274 }
275 // already checked by client, but double-check in case the client wrapper is bypassed
276 if (attr->source >= AUDIO_SOURCE_CNT && attr->source != AUDIO_SOURCE_HOTWORD &&
277 attr->source != AUDIO_SOURCE_FM_TUNER) {
278 return BAD_VALUE;
279 }
280
281 if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
282 return BAD_VALUE;
283 }
284 sp<AudioPolicyEffects>audioPolicyEffects;
285 status_t status;
286 AudioPolicyInterface::input_type_t inputType;
287 // if the caller is us, trust the specified uid
288 if (IPCThreadState::self()->getCallingPid() != getpid_cached || uid == (uid_t)-1) {
289 uid_t newclientUid = IPCThreadState::self()->getCallingUid();
290 if (uid != (uid_t)-1 && uid != newclientUid) {
291 ALOGW("%s uid %d tried to pass itself off as %d", __FUNCTION__, newclientUid, uid);
292 }
293 uid = newclientUid;
294 }
295
296 {
297 Mutex::Autolock _l(mLock);
298 // the audio_in_acoustics_t parameter is ignored by get_input()
299 status = mAudioPolicyManager->getInputForAttr(attr, input, session, uid,
300 samplingRate, format, channelMask,
301 flags, selectedDeviceId,
302 &inputType);
303 audioPolicyEffects = mAudioPolicyEffects;
304
305 if (status == NO_ERROR) {
306 // enforce permission (if any) required for each type of input
307 switch (inputType) {
308 case AudioPolicyInterface::API_INPUT_LEGACY:
309 break;
310 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX:
311 // FIXME: use the same permission as for remote submix for now.
312 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
313 if (!captureAudioOutputAllowed()) {
314 ALOGE("getInputForAttr() permission denied: capture not allowed");
315 status = PERMISSION_DENIED;
316 }
317 break;
318 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE:
319 if (!modifyAudioRoutingAllowed()) {
320 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed");
321 status = PERMISSION_DENIED;
322 }
323 break;
324 case AudioPolicyInterface::API_INPUT_INVALID:
325 default:
326 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d",
327 (int)inputType);
328 }
329 }
330
331 if (status != NO_ERROR) {
332 if (status == PERMISSION_DENIED) {
333 mAudioPolicyManager->releaseInput(*input, session);
334 }
335 return status;
336 }
337 }
338
339 if (audioPolicyEffects != 0) {
340 // create audio pre processors according to input source
341 status_t status = audioPolicyEffects->addInputEffects(*input, attr->source, session);
342 if (status != NO_ERROR && status != ALREADY_EXISTS) {
343 ALOGW("Failed to add effects on input %d", *input);
344 }
345 }
346 return NO_ERROR;
347 }
348
startInput(audio_io_handle_t input,audio_session_t session)349 status_t AudioPolicyService::startInput(audio_io_handle_t input,
350 audio_session_t session)
351 {
352 if (mAudioPolicyManager == NULL) {
353 return NO_INIT;
354 }
355 Mutex::Autolock _l(mLock);
356
357 return mAudioPolicyManager->startInput(input, session);
358 }
359
stopInput(audio_io_handle_t input,audio_session_t session)360 status_t AudioPolicyService::stopInput(audio_io_handle_t input,
361 audio_session_t session)
362 {
363 if (mAudioPolicyManager == NULL) {
364 return NO_INIT;
365 }
366 Mutex::Autolock _l(mLock);
367
368 return mAudioPolicyManager->stopInput(input, session);
369 }
370
releaseInput(audio_io_handle_t input,audio_session_t session)371 void AudioPolicyService::releaseInput(audio_io_handle_t input,
372 audio_session_t session)
373 {
374 if (mAudioPolicyManager == NULL) {
375 return;
376 }
377 sp<AudioPolicyEffects>audioPolicyEffects;
378 {
379 Mutex::Autolock _l(mLock);
380 mAudioPolicyManager->releaseInput(input, session);
381 audioPolicyEffects = mAudioPolicyEffects;
382 }
383 if (audioPolicyEffects != 0) {
384 // release audio processors from the input
385 status_t status = audioPolicyEffects->releaseInputEffects(input);
386 if(status != NO_ERROR) {
387 ALOGW("Failed to release effects on input %d", input);
388 }
389 }
390 }
391
initStreamVolume(audio_stream_type_t stream,int indexMin,int indexMax)392 status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
393 int indexMin,
394 int indexMax)
395 {
396 if (mAudioPolicyManager == NULL) {
397 return NO_INIT;
398 }
399 if (!settingsAllowed()) {
400 return PERMISSION_DENIED;
401 }
402 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
403 return BAD_VALUE;
404 }
405 Mutex::Autolock _l(mLock);
406 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
407 return NO_ERROR;
408 }
409
setStreamVolumeIndex(audio_stream_type_t stream,int index,audio_devices_t device)410 status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
411 int index,
412 audio_devices_t device)
413 {
414 if (mAudioPolicyManager == NULL) {
415 return NO_INIT;
416 }
417 if (!settingsAllowed()) {
418 return PERMISSION_DENIED;
419 }
420 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
421 return BAD_VALUE;
422 }
423 Mutex::Autolock _l(mLock);
424 return mAudioPolicyManager->setStreamVolumeIndex(stream,
425 index,
426 device);
427 }
428
getStreamVolumeIndex(audio_stream_type_t stream,int * index,audio_devices_t device)429 status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
430 int *index,
431 audio_devices_t device)
432 {
433 if (mAudioPolicyManager == NULL) {
434 return NO_INIT;
435 }
436 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
437 return BAD_VALUE;
438 }
439 Mutex::Autolock _l(mLock);
440 return mAudioPolicyManager->getStreamVolumeIndex(stream,
441 index,
442 device);
443 }
444
getStrategyForStream(audio_stream_type_t stream)445 uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
446 {
447 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
448 return 0;
449 }
450 if (mAudioPolicyManager == NULL) {
451 return 0;
452 }
453 return mAudioPolicyManager->getStrategyForStream(stream);
454 }
455
456 //audio policy: use audio_device_t appropriately
457
getDevicesForStream(audio_stream_type_t stream)458 audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
459 {
460 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
461 return AUDIO_DEVICE_NONE;
462 }
463 if (mAudioPolicyManager == NULL) {
464 return AUDIO_DEVICE_NONE;
465 }
466 return mAudioPolicyManager->getDevicesForStream(stream);
467 }
468
getOutputForEffect(const effect_descriptor_t * desc)469 audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
470 {
471 // FIXME change return type to status_t, and return NO_INIT here
472 if (mAudioPolicyManager == NULL) {
473 return 0;
474 }
475 Mutex::Autolock _l(mLock);
476 return mAudioPolicyManager->getOutputForEffect(desc);
477 }
478
registerEffect(const effect_descriptor_t * desc,audio_io_handle_t io,uint32_t strategy,int session,int id)479 status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
480 audio_io_handle_t io,
481 uint32_t strategy,
482 int session,
483 int id)
484 {
485 if (mAudioPolicyManager == NULL) {
486 return NO_INIT;
487 }
488 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
489 }
490
unregisterEffect(int id)491 status_t AudioPolicyService::unregisterEffect(int id)
492 {
493 if (mAudioPolicyManager == NULL) {
494 return NO_INIT;
495 }
496 return mAudioPolicyManager->unregisterEffect(id);
497 }
498
setEffectEnabled(int id,bool enabled)499 status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
500 {
501 if (mAudioPolicyManager == NULL) {
502 return NO_INIT;
503 }
504 return mAudioPolicyManager->setEffectEnabled(id, enabled);
505 }
506
isStreamActive(audio_stream_type_t stream,uint32_t inPastMs) const507 bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
508 {
509 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
510 return false;
511 }
512 if (mAudioPolicyManager == NULL) {
513 return false;
514 }
515 Mutex::Autolock _l(mLock);
516 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
517 }
518
isStreamActiveRemotely(audio_stream_type_t stream,uint32_t inPastMs) const519 bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
520 {
521 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
522 return false;
523 }
524 if (mAudioPolicyManager == NULL) {
525 return false;
526 }
527 Mutex::Autolock _l(mLock);
528 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
529 }
530
isSourceActive(audio_source_t source) const531 bool AudioPolicyService::isSourceActive(audio_source_t source) const
532 {
533 if (mAudioPolicyManager == NULL) {
534 return false;
535 }
536 Mutex::Autolock _l(mLock);
537 return mAudioPolicyManager->isSourceActive(source);
538 }
539
queryDefaultPreProcessing(int audioSession,effect_descriptor_t * descriptors,uint32_t * count)540 status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
541 effect_descriptor_t *descriptors,
542 uint32_t *count)
543 {
544 if (mAudioPolicyManager == NULL) {
545 *count = 0;
546 return NO_INIT;
547 }
548 sp<AudioPolicyEffects>audioPolicyEffects;
549 {
550 Mutex::Autolock _l(mLock);
551 audioPolicyEffects = mAudioPolicyEffects;
552 }
553 if (audioPolicyEffects == 0) {
554 *count = 0;
555 return NO_INIT;
556 }
557 return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
558 }
559
isOffloadSupported(const audio_offload_info_t & info)560 bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
561 {
562 if (mAudioPolicyManager == NULL) {
563 ALOGV("mAudioPolicyManager == NULL");
564 return false;
565 }
566
567 return mAudioPolicyManager->isOffloadSupported(info);
568 }
569
listAudioPorts(audio_port_role_t role,audio_port_type_t type,unsigned int * num_ports,struct audio_port * ports,unsigned int * generation)570 status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
571 audio_port_type_t type,
572 unsigned int *num_ports,
573 struct audio_port *ports,
574 unsigned int *generation)
575 {
576 Mutex::Autolock _l(mLock);
577 if (mAudioPolicyManager == NULL) {
578 return NO_INIT;
579 }
580
581 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
582 }
583
getAudioPort(struct audio_port * port)584 status_t AudioPolicyService::getAudioPort(struct audio_port *port)
585 {
586 Mutex::Autolock _l(mLock);
587 if (mAudioPolicyManager == NULL) {
588 return NO_INIT;
589 }
590
591 return mAudioPolicyManager->getAudioPort(port);
592 }
593
createAudioPatch(const struct audio_patch * patch,audio_patch_handle_t * handle)594 status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
595 audio_patch_handle_t *handle)
596 {
597 Mutex::Autolock _l(mLock);
598 if(!modifyAudioRoutingAllowed()) {
599 return PERMISSION_DENIED;
600 }
601 if (mAudioPolicyManager == NULL) {
602 return NO_INIT;
603 }
604 return mAudioPolicyManager->createAudioPatch(patch, handle,
605 IPCThreadState::self()->getCallingUid());
606 }
607
releaseAudioPatch(audio_patch_handle_t handle)608 status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
609 {
610 Mutex::Autolock _l(mLock);
611 if(!modifyAudioRoutingAllowed()) {
612 return PERMISSION_DENIED;
613 }
614 if (mAudioPolicyManager == NULL) {
615 return NO_INIT;
616 }
617
618 return mAudioPolicyManager->releaseAudioPatch(handle,
619 IPCThreadState::self()->getCallingUid());
620 }
621
listAudioPatches(unsigned int * num_patches,struct audio_patch * patches,unsigned int * generation)622 status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
623 struct audio_patch *patches,
624 unsigned int *generation)
625 {
626 Mutex::Autolock _l(mLock);
627 if (mAudioPolicyManager == NULL) {
628 return NO_INIT;
629 }
630
631 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
632 }
633
setAudioPortConfig(const struct audio_port_config * config)634 status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
635 {
636 Mutex::Autolock _l(mLock);
637 if(!modifyAudioRoutingAllowed()) {
638 return PERMISSION_DENIED;
639 }
640 if (mAudioPolicyManager == NULL) {
641 return NO_INIT;
642 }
643
644 return mAudioPolicyManager->setAudioPortConfig(config);
645 }
646
acquireSoundTriggerSession(audio_session_t * session,audio_io_handle_t * ioHandle,audio_devices_t * device)647 status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
648 audio_io_handle_t *ioHandle,
649 audio_devices_t *device)
650 {
651 if (mAudioPolicyManager == NULL) {
652 return NO_INIT;
653 }
654
655 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
656 }
657
releaseSoundTriggerSession(audio_session_t session)658 status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
659 {
660 if (mAudioPolicyManager == NULL) {
661 return NO_INIT;
662 }
663
664 return mAudioPolicyManager->releaseSoundTriggerSession(session);
665 }
666
registerPolicyMixes(Vector<AudioMix> mixes,bool registration)667 status_t AudioPolicyService::registerPolicyMixes(Vector<AudioMix> mixes, bool registration)
668 {
669 Mutex::Autolock _l(mLock);
670 if(!modifyAudioRoutingAllowed()) {
671 return PERMISSION_DENIED;
672 }
673 if (mAudioPolicyManager == NULL) {
674 return NO_INIT;
675 }
676 if (registration) {
677 return mAudioPolicyManager->registerPolicyMixes(mixes);
678 } else {
679 return mAudioPolicyManager->unregisterPolicyMixes(mixes);
680 }
681 }
682
startAudioSource(const struct audio_port_config * source,const audio_attributes_t * attributes,audio_io_handle_t * handle)683 status_t AudioPolicyService::startAudioSource(const struct audio_port_config *source,
684 const audio_attributes_t *attributes,
685 audio_io_handle_t *handle)
686 {
687 Mutex::Autolock _l(mLock);
688 if (mAudioPolicyManager == NULL) {
689 return NO_INIT;
690 }
691
692 return mAudioPolicyManager->startAudioSource(source, attributes, handle);
693 }
694
stopAudioSource(audio_io_handle_t handle)695 status_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle)
696 {
697 Mutex::Autolock _l(mLock);
698 if (mAudioPolicyManager == NULL) {
699 return NO_INIT;
700 }
701
702 return mAudioPolicyManager->stopAudioSource(handle);
703 }
704
705 }; // namespace android
706