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