AudioPolicyInterfaceImplLegacy.cpp revision 8670c31fddbeadcf9627aa970c69a823f13939ff
1dce54a1492c410ad0d93253b341fb33305337505Eric Laurent/*
2dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * Copyright (C) 2009 The Android Open Source Project
3dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *
4dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * you may not use this file except in compliance with the License.
6dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * You may obtain a copy of the License at
7dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *
8dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *
10dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * Unless required by applicable law or agreed to in writing, software
11dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * See the License for the specific language governing permissions and
14dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * limitations under the License.
15dce54a1492c410ad0d93253b341fb33305337505Eric Laurent */
16dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
17dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#define LOG_TAG "AudioPolicyService"
18dce54a1492c410ad0d93253b341fb33305337505Eric Laurent//#define LOG_NDEBUG 0
19dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
20dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <utils/Log.h>
21dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include "AudioPolicyService.h"
22dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include "ServiceUtilities.h"
23dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
24dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <system/audio.h>
25dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <system/audio_policy.h>
26dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <hardware/audio_policy.h>
27dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
28dce54a1492c410ad0d93253b341fb33305337505Eric Laurentnamespace android {
29dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
30dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
31dce54a1492c410ad0d93253b341fb33305337505Eric Laurent// ----------------------------------------------------------------------------
32dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
33dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device,
34dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  audio_policy_dev_state_t state,
35dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  const char *device_address)
36dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
37dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
38dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
39dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
40dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!settingsAllowed()) {
41dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
42dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
43dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!audio_is_output_device(device) && !audio_is_input_device(device)) {
44dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
45dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
46dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
47dce54a1492c410ad0d93253b341fb33305337505Eric Laurent            state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
48dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
49dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
50dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
51dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("setDeviceConnectionState()");
52dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
53dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->set_device_connection_state(mpAudioPolicy, device,
54dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                      state, device_address);
55dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
56dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
57dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState(
58dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                              audio_devices_t device,
59dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                              const char *device_address)
60dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
61dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
62dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
63dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
64dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_device_connection_state(mpAudioPolicy, device,
65dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                      device_address);
66dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
67dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
68dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setPhoneState(audio_mode_t state)
69dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
70dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
71dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
72dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
73dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!settingsAllowed()) {
74dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
75dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
76dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (uint32_t(state) >= AUDIO_MODE_CNT) {
77dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
78dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
79dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
80dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("setPhoneState()");
81dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
82dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    // TODO: check if it is more appropriate to do it in platform specific policy manager
83dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    AudioSystem::setMode(state);
84dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
85dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
86dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mpAudioPolicy->set_phone_state(mpAudioPolicy, state);
87dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return NO_ERROR;
88dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
89dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
90dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
91dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                         audio_policy_forced_cfg_t config)
92dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
93dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
94dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
95dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
96dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!settingsAllowed()) {
97dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
98dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
99dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
100dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
101dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
102dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
103dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
104dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
105dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("setForceUse()");
106dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
107dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mpAudioPolicy->set_force_use(mpAudioPolicy, usage, config);
108dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return NO_ERROR;
109dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
110dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
111dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage)
112dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
113dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
114dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return AUDIO_POLICY_FORCE_NONE;
115dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
116dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
117dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return AUDIO_POLICY_FORCE_NONE;
118dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
119dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_force_use(mpAudioPolicy, usage);
120dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
121dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
122dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream,
123dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    uint32_t samplingRate,
124dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    audio_format_t format,
125dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    audio_channel_mask_t channelMask,
126dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    audio_output_flags_t flags,
127dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    const audio_offload_info_t *offloadInfo)
128dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
129dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
130dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
131dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
132dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("getOutput()");
133dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
134dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_output(mpAudioPolicy, stream, samplingRate,
135dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    format, channelMask, flags, offloadInfo);
136dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
137dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
138dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::startOutput(audio_io_handle_t output,
139dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                         audio_stream_type_t stream,
140dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                         int session)
141dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
142dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
143dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
144dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
145dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("startOutput()");
146dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
147dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->start_output(mpAudioPolicy, output, stream, session);
148dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
149dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
150dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::stopOutput(audio_io_handle_t output,
151dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                        audio_stream_type_t stream,
152dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                        int session)
153dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
154dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
155dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
156dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
157dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("stopOutput()");
158dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mOutputCommandThread->stopOutputCommand(output, stream, session);
159dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return NO_ERROR;
160dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
161dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
162dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t  AudioPolicyService::doStopOutput(audio_io_handle_t output,
163dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                      audio_stream_type_t stream,
164dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                      int session)
165dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
166dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("doStopOutput from tid %d", gettid());
167dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
168dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->stop_output(mpAudioPolicy, output, stream, session);
169dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
170dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
171dce54a1492c410ad0d93253b341fb33305337505Eric Laurentvoid AudioPolicyService::releaseOutput(audio_io_handle_t output)
172dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
173dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
174dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return;
175dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
176dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("releaseOutput()");
177dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mOutputCommandThread->releaseOutputCommand(output);
178dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
179dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
180dce54a1492c410ad0d93253b341fb33305337505Eric Laurentvoid AudioPolicyService::doReleaseOutput(audio_io_handle_t output)
181dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
182dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("doReleaseOutput from tid %d", gettid());
183dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
184dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mpAudioPolicy->release_output(mpAudioPolicy, output);
185dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
186dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
187dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t AudioPolicyService::getInput(audio_source_t inputSource,
188dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    uint32_t samplingRate,
189dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    audio_format_t format,
190dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    audio_channel_mask_t channelMask,
191dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    int audioSession)
192dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
193dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
194dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
195dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
196dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    // already checked by client, but double-check in case the client wrapper is bypassed
197dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (inputSource >= AUDIO_SOURCE_CNT && inputSource != AUDIO_SOURCE_HOTWORD) {
198dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
199dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
200dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
201dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if ((inputSource == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
202dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
203dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
204dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
205dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
206dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    // the audio_in_acoustics_t parameter is ignored by get_input()
207dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    audio_io_handle_t input = mpAudioPolicy->get_input(mpAudioPolicy, inputSource, samplingRate,
208dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                   format, channelMask, (audio_in_acoustics_t) 0);
209dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
210dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (input == 0) {
211dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return input;
212dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
213dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    // create audio pre processors according to input source
214dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    audio_source_t aliasSource = (inputSource == AUDIO_SOURCE_HOTWORD) ?
215dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    AUDIO_SOURCE_VOICE_RECOGNITION : inputSource;
216dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
217dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ssize_t index = mInputSources.indexOfKey(aliasSource);
218dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (index < 0) {
219dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return input;
220dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
221dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ssize_t idx = mInputs.indexOfKey(input);
222dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    InputDesc *inputDesc;
223dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (idx < 0) {
224dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        inputDesc = new InputDesc(audioSession);
225dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        mInputs.add(input, inputDesc);
226dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    } else {
227dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        inputDesc = mInputs.valueAt(idx);
228dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
229dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
230dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Vector <EffectDesc *> effects = mInputSources.valueAt(index)->mEffects;
231dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    for (size_t i = 0; i < effects.size(); i++) {
232dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        EffectDesc *effect = effects[i];
233dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        sp<AudioEffect> fx = new AudioEffect(NULL, &effect->mUuid, -1, 0, 0, audioSession, input);
234dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        status_t status = fx->initCheck();
235dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        if (status != NO_ERROR && status != ALREADY_EXISTS) {
236dce54a1492c410ad0d93253b341fb33305337505Eric Laurent            ALOGW("Failed to create Fx %s on input %d", effect->mName, input);
237dce54a1492c410ad0d93253b341fb33305337505Eric Laurent            // fx goes out of scope and strong ref on AudioEffect is released
238dce54a1492c410ad0d93253b341fb33305337505Eric Laurent            continue;
239dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        }
240dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        for (size_t j = 0; j < effect->mParams.size(); j++) {
241dce54a1492c410ad0d93253b341fb33305337505Eric Laurent            fx->setParameter(effect->mParams[j]);
242dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        }
243dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        inputDesc->mEffects.add(fx);
244dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
245dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    setPreProcessorEnabled(inputDesc, true);
246dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return input;
247dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
248dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
249dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::startInput(audio_io_handle_t input)
250dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
251dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
252dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
253dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
254dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
255dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
256dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->start_input(mpAudioPolicy, input);
257dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
258dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
259dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::stopInput(audio_io_handle_t input)
260dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
261dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
262dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
263dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
264dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
265dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
266dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->stop_input(mpAudioPolicy, input);
267dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
268dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
269dce54a1492c410ad0d93253b341fb33305337505Eric Laurentvoid AudioPolicyService::releaseInput(audio_io_handle_t input)
270dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
271dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
272dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return;
273dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
274dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
275dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mpAudioPolicy->release_input(mpAudioPolicy, input);
276dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
277dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ssize_t index = mInputs.indexOfKey(input);
278dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (index < 0) {
279dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return;
280dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
281dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    InputDesc *inputDesc = mInputs.valueAt(index);
282dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    setPreProcessorEnabled(inputDesc, false);
283dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    delete inputDesc;
284dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mInputs.removeItemsAt(index);
285dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
286dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
287dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
288dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                            int indexMin,
289dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                            int indexMax)
290dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
291dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
292dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
293dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
294dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!settingsAllowed()) {
295dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
296dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
297dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
298dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
299dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
300dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
301dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mpAudioPolicy->init_stream_volume(mpAudioPolicy, stream, indexMin, indexMax);
302dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return NO_ERROR;
303dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
304dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
305dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
306dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  int index,
307dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  audio_devices_t device)
308dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
309dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
310dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
311dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
312dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!settingsAllowed()) {
313dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
314dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
315dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
316dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
317dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
318dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
319dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy->set_stream_volume_index_for_device) {
320dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return mpAudioPolicy->set_stream_volume_index_for_device(mpAudioPolicy,
321dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                stream,
322dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                index,
323dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                device);
324dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    } else {
325dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return mpAudioPolicy->set_stream_volume_index(mpAudioPolicy, stream, index);
326dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
327dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
328dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
329dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
330dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  int *index,
331dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  audio_devices_t device)
332dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
333dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
334dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
335dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
336dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
337dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
338dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
339dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
340dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy->get_stream_volume_index_for_device) {
341dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return mpAudioPolicy->get_stream_volume_index_for_device(mpAudioPolicy,
342dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                stream,
343dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                index,
344dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                device);
345dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    } else {
346dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return mpAudioPolicy->get_stream_volume_index(mpAudioPolicy, stream, index);
347dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
348dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
349dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
350dce54a1492c410ad0d93253b341fb33305337505Eric Laurentuint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
351dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
352dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
353dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
354dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
355dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_strategy_for_stream(mpAudioPolicy, stream);
356dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
357dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
358dce54a1492c410ad0d93253b341fb33305337505Eric Laurent//audio policy: use audio_device_t appropriately
359dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
360dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
361dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
362dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
363dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return (audio_devices_t)0;
364dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
365dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_devices_for_stream(mpAudioPolicy, stream);
366dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
367dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
368dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
369dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
370dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    // FIXME change return type to status_t, and return NO_INIT here
371dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
372dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
373dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
374dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
375dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_output_for_effect(mpAudioPolicy, desc);
376dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
377dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
378dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
379dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                audio_io_handle_t io,
380dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                uint32_t strategy,
381dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                int session,
382dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                int id)
383dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
384dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
385dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
386dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
387dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->register_effect(mpAudioPolicy, desc, io, strategy, session, id);
388dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
389dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
390dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::unregisterEffect(int id)
391dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
392dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
393dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
394dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
395dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->unregister_effect(mpAudioPolicy, id);
396dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
397dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
398dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
399dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
400dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
401dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
402dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
403dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->set_effect_enabled(mpAudioPolicy, id, enabled);
404dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
405dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
406dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
407dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
408dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
409dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
410dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
411dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
412dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->is_stream_active(mpAudioPolicy, stream, inPastMs);
413dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
414dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
415dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
416dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
417dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
418dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
419dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
420dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
421dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->is_stream_active_remotely(mpAudioPolicy, stream, inPastMs);
422dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
423dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
424dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isSourceActive(audio_source_t source) const
425dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
426dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
427dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return false;
428dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
429dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy->is_source_active == 0) {
430dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return false;
431dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
432dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
433dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->is_source_active(mpAudioPolicy, source);
434dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
435dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
436dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
437dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                       effect_descriptor_t *descriptors,
438dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                       uint32_t *count)
439dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
440dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
441dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
442dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        *count = 0;
443dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
444dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
445dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
446dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    status_t status = NO_ERROR;
447dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
448dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    size_t index;
449dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    for (index = 0; index < mInputs.size(); index++) {
450dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        if (mInputs.valueAt(index)->mSessionId == audioSession) {
451dce54a1492c410ad0d93253b341fb33305337505Eric Laurent            break;
452dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        }
453dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
454dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (index == mInputs.size()) {
455dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        *count = 0;
456dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
457dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
458dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Vector< sp<AudioEffect> > effects = mInputs.valueAt(index)->mEffects;
459dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
460dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    for (size_t i = 0; i < effects.size(); i++) {
461dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        effect_descriptor_t desc = effects[i]->descriptor();
462dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        if (i < *count) {
463dce54a1492c410ad0d93253b341fb33305337505Eric Laurent            descriptors[i] = desc;
464dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        }
465dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
466dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (effects.size() > *count) {
467dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        status = NO_MEMORY;
468dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
469dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    *count = effects.size();
470dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return status;
471dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
472dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
473dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
474dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
475dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
476dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        ALOGV("mpAudioPolicy == NULL");
477dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return false;
478dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
479dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
480dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy->is_offload_supported == NULL) {
481dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        ALOGV("HAL does not implement is_offload_supported");
482dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return false;
483dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
484dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
485dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->is_offload_supported(mpAudioPolicy, &info);
486dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
487dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
4888670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::listAudioPorts(audio_port_role_t role __unused,
4898670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent                                            audio_port_type_t type __unused,
4908670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent                                            unsigned int *num_ports,
4918670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent                                            struct audio_port *ports __unused,
4928670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent                                            unsigned int *generation __unused)
4938670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
4948670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    *num_ports = 0;
4958670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
4968670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
4978670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
4988670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::getAudioPort(struct audio_port *port __unused)
4998670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5008670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5018670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5028670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5038670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch __unused,
5048670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent        audio_patch_handle_t *handle __unused)
5058670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5068670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5078670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5088670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5098670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle __unused)
5108670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5118670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5128670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5138670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5148670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
5158670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent        struct audio_patch *patches __unused,
5168670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent        unsigned int *generation __unused)
5178670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5188670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    *num_patches = 0;
5198670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5208670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5218670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5228670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config __unused)
5238670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5248670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5258670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
526dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
527dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}; // namespace android
528