AudioPolicyInterfaceImpl.cpp revision f53eaf49df1e1e1c01708919e9e0a046543de9b6
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
24namespace android {
25
26
27// ----------------------------------------------------------------------------
28
29status_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device,
30                                                  audio_policy_dev_state_t state,
31                                                  const char *device_address)
32{
33    if (mAudioPolicyManager == NULL) {
34        return NO_INIT;
35    }
36    if (!settingsAllowed()) {
37        return PERMISSION_DENIED;
38    }
39    if (!audio_is_output_device(device) && !audio_is_input_device(device)) {
40        return BAD_VALUE;
41    }
42    if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
43            state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
44        return BAD_VALUE;
45    }
46
47    ALOGV("setDeviceConnectionState()");
48    Mutex::Autolock _l(mLock);
49    return mAudioPolicyManager->setDeviceConnectionState(device,
50                                                      state, device_address);
51}
52
53audio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState(
54                                                              audio_devices_t device,
55                                                              const char *device_address)
56{
57    if (mAudioPolicyManager == NULL) {
58        return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
59    }
60    return mAudioPolicyManager->getDeviceConnectionState(device,
61                                                      device_address);
62}
63
64status_t AudioPolicyService::setPhoneState(audio_mode_t state)
65{
66    if (mAudioPolicyManager == NULL) {
67        return NO_INIT;
68    }
69    if (!settingsAllowed()) {
70        return PERMISSION_DENIED;
71    }
72    if (uint32_t(state) >= AUDIO_MODE_CNT) {
73        return BAD_VALUE;
74    }
75
76    ALOGV("setPhoneState()");
77
78    // TODO: check if it is more appropriate to do it in platform specific policy manager
79    AudioSystem::setMode(state);
80
81    Mutex::Autolock _l(mLock);
82    mAudioPolicyManager->setPhoneState(state);
83    mPhoneState = state;
84    return NO_ERROR;
85}
86
87audio_mode_t AudioPolicyService::getPhoneState()
88{
89    Mutex::Autolock _l(mLock);
90    return mPhoneState;
91}
92
93status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
94                                         audio_policy_forced_cfg_t config)
95{
96    if (mAudioPolicyManager == NULL) {
97        return NO_INIT;
98    }
99    if (!settingsAllowed()) {
100        return PERMISSION_DENIED;
101    }
102    if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
103        return BAD_VALUE;
104    }
105    if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
106        return BAD_VALUE;
107    }
108    ALOGV("setForceUse()");
109    Mutex::Autolock _l(mLock);
110    mAudioPolicyManager->setForceUse(usage, config);
111    return NO_ERROR;
112}
113
114audio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage)
115{
116    if (mAudioPolicyManager == NULL) {
117        return AUDIO_POLICY_FORCE_NONE;
118    }
119    if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
120        return AUDIO_POLICY_FORCE_NONE;
121    }
122    return mAudioPolicyManager->getForceUse(usage);
123}
124
125audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream,
126                                    uint32_t samplingRate,
127                                    audio_format_t format,
128                                    audio_channel_mask_t channelMask,
129                                    audio_output_flags_t flags,
130                                    const audio_offload_info_t *offloadInfo)
131{
132    if (mAudioPolicyManager == NULL) {
133        return 0;
134    }
135    ALOGV("getOutput()");
136    Mutex::Autolock _l(mLock);
137    return mAudioPolicyManager->getOutput(stream, samplingRate,
138                                    format, channelMask, flags, offloadInfo);
139}
140
141audio_io_handle_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
142                                    uint32_t samplingRate,
143                                    audio_format_t format,
144                                    audio_channel_mask_t channelMask,
145                                    audio_output_flags_t flags,
146                                    const audio_offload_info_t *offloadInfo)
147{
148    if (mAudioPolicyManager == NULL) {
149        return 0;
150    }
151    ALOGV("getOutput()");
152    Mutex::Autolock _l(mLock);
153    return mAudioPolicyManager->getOutputForAttr(attr, samplingRate,
154                                    format, channelMask, flags, offloadInfo);
155}
156
157status_t AudioPolicyService::startOutput(audio_io_handle_t output,
158                                         audio_stream_type_t stream,
159                                         int session)
160{
161    if (mAudioPolicyManager == NULL) {
162        return NO_INIT;
163    }
164    ALOGV("startOutput()");
165    sp<AudioPolicyEffects>audioPolicyEffects;
166    {
167        Mutex::Autolock _l(mLock);
168        audioPolicyEffects = mAudioPolicyEffects;
169    }
170    if (audioPolicyEffects != 0) {
171        // create audio processors according to stream
172        status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
173        if (status != NO_ERROR && status != ALREADY_EXISTS) {
174            ALOGW("Failed to add effects on session %d", session);
175        }
176    }
177    Mutex::Autolock _l(mLock);
178    return mAudioPolicyManager->startOutput(output, stream, session);
179}
180
181status_t AudioPolicyService::stopOutput(audio_io_handle_t output,
182                                        audio_stream_type_t stream,
183                                        int session)
184{
185    if (mAudioPolicyManager == NULL) {
186        return NO_INIT;
187    }
188    ALOGV("stopOutput()");
189    mOutputCommandThread->stopOutputCommand(output, stream, session);
190    return NO_ERROR;
191}
192
193status_t  AudioPolicyService::doStopOutput(audio_io_handle_t output,
194                                      audio_stream_type_t stream,
195                                      int session)
196{
197    ALOGV("doStopOutput from tid %d", gettid());
198    sp<AudioPolicyEffects>audioPolicyEffects;
199    {
200        Mutex::Autolock _l(mLock);
201        audioPolicyEffects = mAudioPolicyEffects;
202    }
203    if (audioPolicyEffects != 0) {
204        // release audio processors from the stream
205        status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
206        if (status != NO_ERROR && status != ALREADY_EXISTS) {
207            ALOGW("Failed to release effects on session %d", session);
208        }
209    }
210    Mutex::Autolock _l(mLock);
211    return mAudioPolicyManager->stopOutput(output, stream, session);
212}
213
214void AudioPolicyService::releaseOutput(audio_io_handle_t output)
215{
216    if (mAudioPolicyManager == NULL) {
217        return;
218    }
219    ALOGV("releaseOutput()");
220    mOutputCommandThread->releaseOutputCommand(output);
221}
222
223void AudioPolicyService::doReleaseOutput(audio_io_handle_t output)
224{
225    ALOGV("doReleaseOutput from tid %d", gettid());
226    Mutex::Autolock _l(mLock);
227    mAudioPolicyManager->releaseOutput(output);
228}
229
230audio_io_handle_t AudioPolicyService::getInput(audio_source_t inputSource,
231                                    uint32_t samplingRate,
232                                    audio_format_t format,
233                                    audio_channel_mask_t channelMask,
234                                    int audioSession,
235                                    audio_input_flags_t flags)
236{
237    if (mAudioPolicyManager == NULL) {
238        return 0;
239    }
240    // already checked by client, but double-check in case the client wrapper is bypassed
241    if (inputSource >= AUDIO_SOURCE_CNT && inputSource != AUDIO_SOURCE_HOTWORD &&
242        inputSource != AUDIO_SOURCE_FM_TUNER) {
243        return 0;
244    }
245
246    if (((inputSource == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) ||
247        ((inputSource == AUDIO_SOURCE_FM_TUNER) && !captureFmTunerAllowed())) {
248        return 0;
249    }
250    audio_io_handle_t input;
251    sp<AudioPolicyEffects>audioPolicyEffects;
252    {
253        Mutex::Autolock _l(mLock);
254        // the audio_in_acoustics_t parameter is ignored by get_input()
255        input = mAudioPolicyManager->getInput(inputSource, samplingRate,
256                                                       format, channelMask,
257                                                       (audio_session_t)audioSession, flags);
258        audioPolicyEffects = mAudioPolicyEffects;
259    }
260    if (input == 0) {
261        return input;
262    }
263    if (audioPolicyEffects != 0) {
264        // create audio pre processors according to input source
265        status_t status = audioPolicyEffects->addInputEffects(input, inputSource, audioSession);
266        if (status != NO_ERROR && status != ALREADY_EXISTS) {
267            ALOGW("Failed to add effects on input %d", input);
268        }
269    }
270    return input;
271}
272
273status_t AudioPolicyService::startInput(audio_io_handle_t input,
274                                        audio_session_t session)
275{
276    if (mAudioPolicyManager == NULL) {
277        return NO_INIT;
278    }
279    Mutex::Autolock _l(mLock);
280
281    return mAudioPolicyManager->startInput(input, session);
282}
283
284status_t AudioPolicyService::stopInput(audio_io_handle_t input,
285                                       audio_session_t session)
286{
287    if (mAudioPolicyManager == NULL) {
288        return NO_INIT;
289    }
290    Mutex::Autolock _l(mLock);
291
292    return mAudioPolicyManager->stopInput(input, session);
293}
294
295void AudioPolicyService::releaseInput(audio_io_handle_t input,
296                                      audio_session_t session)
297{
298    if (mAudioPolicyManager == NULL) {
299        return;
300    }
301    sp<AudioPolicyEffects>audioPolicyEffects;
302    {
303        Mutex::Autolock _l(mLock);
304        mAudioPolicyManager->releaseInput(input, session);
305        audioPolicyEffects = mAudioPolicyEffects;
306    }
307    if (audioPolicyEffects != 0) {
308        // release audio processors from the input
309        status_t status = audioPolicyEffects->releaseInputEffects(input);
310        if(status != NO_ERROR) {
311            ALOGW("Failed to release effects on input %d", input);
312        }
313    }
314}
315
316status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
317                                            int indexMin,
318                                            int indexMax)
319{
320    if (mAudioPolicyManager == NULL) {
321        return NO_INIT;
322    }
323    if (!settingsAllowed()) {
324        return PERMISSION_DENIED;
325    }
326    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
327        return BAD_VALUE;
328    }
329    Mutex::Autolock _l(mLock);
330    mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
331    return NO_ERROR;
332}
333
334status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
335                                                  int index,
336                                                  audio_devices_t device)
337{
338    if (mAudioPolicyManager == NULL) {
339        return NO_INIT;
340    }
341    if (!settingsAllowed()) {
342        return PERMISSION_DENIED;
343    }
344    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
345        return BAD_VALUE;
346    }
347    Mutex::Autolock _l(mLock);
348    return mAudioPolicyManager->setStreamVolumeIndex(stream,
349                                                    index,
350                                                    device);
351}
352
353status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
354                                                  int *index,
355                                                  audio_devices_t device)
356{
357    if (mAudioPolicyManager == NULL) {
358        return NO_INIT;
359    }
360    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
361        return BAD_VALUE;
362    }
363    Mutex::Autolock _l(mLock);
364    return mAudioPolicyManager->getStreamVolumeIndex(stream,
365                                                    index,
366                                                    device);
367}
368
369uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
370{
371    if (mAudioPolicyManager == NULL) {
372        return 0;
373    }
374    return mAudioPolicyManager->getStrategyForStream(stream);
375}
376
377//audio policy: use audio_device_t appropriately
378
379audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
380{
381    if (mAudioPolicyManager == NULL) {
382        return (audio_devices_t)0;
383    }
384    return mAudioPolicyManager->getDevicesForStream(stream);
385}
386
387audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
388{
389    // FIXME change return type to status_t, and return NO_INIT here
390    if (mAudioPolicyManager == NULL) {
391        return 0;
392    }
393    Mutex::Autolock _l(mLock);
394    return mAudioPolicyManager->getOutputForEffect(desc);
395}
396
397status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
398                                audio_io_handle_t io,
399                                uint32_t strategy,
400                                int session,
401                                int id)
402{
403    if (mAudioPolicyManager == NULL) {
404        return NO_INIT;
405    }
406    return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
407}
408
409status_t AudioPolicyService::unregisterEffect(int id)
410{
411    if (mAudioPolicyManager == NULL) {
412        return NO_INIT;
413    }
414    return mAudioPolicyManager->unregisterEffect(id);
415}
416
417status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
418{
419    if (mAudioPolicyManager == NULL) {
420        return NO_INIT;
421    }
422    return mAudioPolicyManager->setEffectEnabled(id, enabled);
423}
424
425bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
426{
427    if (mAudioPolicyManager == NULL) {
428        return 0;
429    }
430    Mutex::Autolock _l(mLock);
431    return mAudioPolicyManager->isStreamActive(stream, inPastMs);
432}
433
434bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
435{
436    if (mAudioPolicyManager == NULL) {
437        return 0;
438    }
439    Mutex::Autolock _l(mLock);
440    return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
441}
442
443bool AudioPolicyService::isSourceActive(audio_source_t source) const
444{
445    if (mAudioPolicyManager == NULL) {
446        return false;
447    }
448    Mutex::Autolock _l(mLock);
449    return mAudioPolicyManager->isSourceActive(source);
450}
451
452status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
453                                                       effect_descriptor_t *descriptors,
454                                                       uint32_t *count)
455{
456    if (mAudioPolicyManager == NULL) {
457        *count = 0;
458        return NO_INIT;
459    }
460    sp<AudioPolicyEffects>audioPolicyEffects;
461    {
462        Mutex::Autolock _l(mLock);
463        audioPolicyEffects = mAudioPolicyEffects;
464    }
465    if (audioPolicyEffects == 0) {
466        *count = 0;
467        return NO_INIT;
468    }
469    return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
470}
471
472bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
473{
474    if (mAudioPolicyManager == NULL) {
475        ALOGV("mAudioPolicyManager == NULL");
476        return false;
477    }
478
479    return mAudioPolicyManager->isOffloadSupported(info);
480}
481
482status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
483                                            audio_port_type_t type,
484                                            unsigned int *num_ports,
485                                            struct audio_port *ports,
486                                            unsigned int *generation)
487{
488    Mutex::Autolock _l(mLock);
489    if(!modifyAudioRoutingAllowed()) {
490        return PERMISSION_DENIED;
491    }
492    if (mAudioPolicyManager == NULL) {
493        return NO_INIT;
494    }
495
496    return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
497}
498
499status_t AudioPolicyService::getAudioPort(struct audio_port *port)
500{
501    Mutex::Autolock _l(mLock);
502    if(!modifyAudioRoutingAllowed()) {
503        return PERMISSION_DENIED;
504    }
505    if (mAudioPolicyManager == NULL) {
506        return NO_INIT;
507    }
508
509    return mAudioPolicyManager->getAudioPort(port);
510}
511
512status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
513        audio_patch_handle_t *handle)
514{
515    Mutex::Autolock _l(mLock);
516    if(!modifyAudioRoutingAllowed()) {
517        return PERMISSION_DENIED;
518    }
519    if (mAudioPolicyManager == NULL) {
520        return NO_INIT;
521    }
522    return mAudioPolicyManager->createAudioPatch(patch, handle,
523                                                  IPCThreadState::self()->getCallingUid());
524}
525
526status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
527{
528    Mutex::Autolock _l(mLock);
529    if(!modifyAudioRoutingAllowed()) {
530        return PERMISSION_DENIED;
531    }
532    if (mAudioPolicyManager == NULL) {
533        return NO_INIT;
534    }
535
536    return mAudioPolicyManager->releaseAudioPatch(handle,
537                                                     IPCThreadState::self()->getCallingUid());
538}
539
540status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
541        struct audio_patch *patches,
542        unsigned int *generation)
543{
544    Mutex::Autolock _l(mLock);
545    if(!modifyAudioRoutingAllowed()) {
546        return PERMISSION_DENIED;
547    }
548    if (mAudioPolicyManager == NULL) {
549        return NO_INIT;
550    }
551
552    return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
553}
554
555status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
556{
557    Mutex::Autolock _l(mLock);
558    if(!modifyAudioRoutingAllowed()) {
559        return PERMISSION_DENIED;
560    }
561    if (mAudioPolicyManager == NULL) {
562        return NO_INIT;
563    }
564
565    return mAudioPolicyManager->setAudioPortConfig(config);
566}
567
568status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
569                                       audio_io_handle_t *ioHandle,
570                                       audio_devices_t *device)
571{
572    if (mAudioPolicyManager == NULL) {
573        return NO_INIT;
574    }
575
576    return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
577}
578
579status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
580{
581    if (mAudioPolicyManager == NULL) {
582        return NO_INIT;
583    }
584
585    return mAudioPolicyManager->releaseSoundTriggerSession(session);
586}
587
588}; // namespace android
589