• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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