AudioPolicyInterfaceImpl.cpp revision 8670c31fddbeadcf9627aa970c69a823f13939ff
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/*
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * Copyright (C) 2009 The Android Open Source Project
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer *
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * Licensed under the Apache License, Version 2.0 (the "License");
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner * you may not use this file except in compliance with the License.
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner * You may obtain a copy of the License at
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer *
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer *      http://www.apache.org/licenses/LICENSE-2.0
9ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett *
10ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett * Unless required by applicable law or agreed to in writing, software
11ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett * distributed under the License is distributed on an "AS IS" BASIS,
12ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * See the License for the specific language governing permissions and
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer * limitations under the License.
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer */
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LOG_TAG "AudioPolicyIntefaceImpl"
18ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek//#define LOG_NDEBUG 0
1930a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth
2030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include <utils/Log.h>
21ad75653f81dece1c806e9c28dd7e7582c9929a27Ted Kremenek#include "AudioPolicyService.h"
2207369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman#include "ServiceUtilities.h"
23ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor
24d249e1d1f1498b81314459ceda19d6ff25c278adDouglas Gregornamespace android {
2530a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth
267532dc66648cfe7432c9fe66dec5225f0ab301c6Douglas Gregor
27464175bba1318bef7905122e9fda20cff926df78Chris Lattner// ----------------------------------------------------------------------------
2830a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth
2930a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruthstatus_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device,
3030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth                                                  audio_policy_dev_state_t state,
3130a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth                                                  const char *device_address)
3230a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth{
3330a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth    if (mAudioPolicyManager == NULL) {
34464175bba1318bef7905122e9fda20cff926df78Chris Lattner        return NO_INIT;
3568d331a78e655d97294e94fcfa63f92cc1f40578Steve Naroff    }
364f32786ac45210143654390177105eb749b614e9Ted Kremenek    if (!settingsAllowed()) {
372cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor        return PERMISSION_DENIED;
38432a8893f7e30d141d7f279bd00b741a3cdac81fFariborz Jahanian    }
39c1b0f7fa9b755ab59129ae85187d0d4f91379995Argyrios Kyrtzidis    if (!audio_is_output_device(device) && !audio_is_input_device(device)) {
406c2b6eb8d836da19007f7540709e16d5e39a1cbaChris Lattner        return BAD_VALUE;
415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
43b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner            state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
44b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner        return BAD_VALUE;
45b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    }
46b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner
475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    ALOGV("setDeviceConnectionState()");
48a9376d470ccb0eac74fe09a6b2a18a890f1d17c4Chris Lattner    Mutex::Autolock _l(mLock);
496b96742ceedebb5eb8f1299ab67cb3ecd6d92aafReid Kleckner    return mAudioPolicyManager->setDeviceConnectionState(device,
50e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar                                                      state, device_address);
515e530af5d51572a0ed5dbe50da54bd333840c63dDavid Chisnall}
52bdc601b196c48d4cd56a5ceb45d41ae4e87371abKen Dyck
53d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikieaudio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState(
54e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar                                                              audio_devices_t device,
552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor                                                              const char *device_address)
567b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidis{
57c7229c338c21ef26b01ef3ecf9eec4fd373fa9ecChris Lattner    if (mAudioPolicyManager == NULL) {
58211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
59e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar    }
60d934112e6170b0fd940d8e40db6936cea2cdcf62Douglas Gregor    return mAudioPolicyManager->getDeviceConnectionState(device,
61071cc7deffad608165b1ddd5263e8bf181861520Charles Davis                                                      device_address);
62e91593ef084479340582b2ba177b44be50a717b7Daniel Dunbar}
6314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
640d8df780aef1acda5962347a32591efc629b6748Anders Carlssonstatus_t AudioPolicyService::setPhoneState(audio_mode_t state)
65c56f34a1c1779de15330bdb3eec39b3418802d47Daniel Dunbar{
660076ea62c2da91121bca6d402da67f0b611fc8bbDmitri Gribenko    if (mAudioPolicyManager == NULL) {
670d8df780aef1acda5962347a32591efc629b6748Anders Carlsson        return NO_INIT;
68ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    }
691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!settingsAllowed()) {
701b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner        return PERMISSION_DENIED;
711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
721abee64ad71519ea9d91f1fe76441b9cdb75b6c0Dmitri Gribenko    if (uint32_t(state) >= AUDIO_MODE_CNT) {
731abee64ad71519ea9d91f1fe76441b9cdb75b6c0Dmitri Gribenko        return BAD_VALUE;
741abee64ad71519ea9d91f1fe76441b9cdb75b6c0Dmitri Gribenko    }
751abee64ad71519ea9d91f1fe76441b9cdb75b6c0Dmitri Gribenko
76ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett    ALOGV("setPhoneState()");
77ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett
78c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith    // TODO: check if it is more appropriate to do it in platform specific policy manager
79ef99001908e799c388f1363b1e607dad5f5b57d3John McCall    AudioSystem::setMode(state);
80ef99001908e799c388f1363b1e607dad5f5b57d3John McCall
81f512acee01617c9da8079ed88ded3bb9f2418349Benjamin Kramer    Mutex::Autolock _l(mLock);
824ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    mAudioPolicyManager->setPhoneState(state);
834ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    return NO_ERROR;
844ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad}
8512df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner
864ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatus_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
874ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                         audio_policy_forced_cfg_t config)
884ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad{
894ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    if (mAudioPolicyManager == NULL) {
904ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad        return NO_INIT;
914ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    }
924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    if (!settingsAllowed()) {
934ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad        return PERMISSION_DENIED;
944ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    }
954ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
964ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad        return BAD_VALUE;
974ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    }
988026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl    if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
998026f6d82f7fa544bc0453714fe94bca62a1196eSebastian Redl        return BAD_VALUE;
1004ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    }
1014ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    ALOGV("setForceUse()");
1024ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    Mutex::Autolock _l(mLock);
1034ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    mAudioPolicyManager->setForceUse(usage, config);
1044ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    return NO_ERROR;
105c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor}
106c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
1074ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadaudio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage)
108ef99001908e799c388f1363b1e607dad5f5b57d3John McCall{
1094ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    if (mAudioPolicyManager == NULL) {
1104ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad        return AUDIO_POLICY_FORCE_NONE;
1114ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    }
1124ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
1134ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad        return AUDIO_POLICY_FORCE_NONE;
11433500955d731c73717af52088b7fc0e7a85681e7John McCall    }
1157536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor    return mAudioPolicyManager->getForceUse(usage);
1164ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad}
1174ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad
118483b9f3bc05c5409e2c6643f1c9d91e21c8ff9d2Richard Smithaudio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream,
119b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman                                    uint32_t samplingRate,
1209d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall                                    audio_format_t format,
1211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                                    audio_channel_mask_t channelMask,
1224ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                    audio_output_flags_t flags,
1234ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                    const audio_offload_info_t *offloadInfo)
124146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall{
125146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    if (mAudioPolicyManager == NULL) {
126146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall        return 0;
127146060435c3efce95c95a092c7a1eb651cfb9ae0John McCall    }
1281aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    ALOGV("getOutput()");
1291aee05d08b2184acadeb36de300e216390780d6cDouglas Gregor    Mutex::Autolock _l(mLock);
130ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor    return mAudioPolicyManager->getOutput(stream, samplingRate,
131ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor                                    format, channelMask, flags, offloadInfo);
132ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor}
1334ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad
1344ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatus_t AudioPolicyService::startOutput(audio_io_handle_t output,
135ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor                                         audio_stream_type_t stream,
136ab452ba8323d1985e08bade2bced588cddf2cc28Douglas Gregor                                         int session)
137ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett{
138ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett    if (mAudioPolicyManager == NULL) {
139ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett        return NO_INIT;
1404ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    }
1414ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    ALOGV("startOutput()");
1424ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    Mutex::Autolock _l(mLock);
1434ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    return mAudioPolicyManager->startOutput(output, stream, session);
144f98aba35e6c3da5aae61843fc01334939e4e12ecEli Friedman}
145ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett
146bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbarstatus_t AudioPolicyService::stopOutput(audio_io_handle_t output,
147bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar                                        audio_stream_type_t stream,
148bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar                                        int session)
149bc5419a2edc4030d1a623576fe339fbd3eed17a6Daniel Dunbar{
150ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett    if (mAudioPolicyManager == NULL) {
151cd03f862d82cac28c9517e2036716f8d49112c8bRichard Smith        return NO_INIT;
152f53df2398e07d13be9962b95aebc19b31706fa33Anders Carlsson    }
1538a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    ALOGV("stopOutput()");
1548a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis    mOutputCommandThread->stopOutputCommand(output, stream, session);
155b40034c2e580ab3b08de9dfb738d8e5d8ef79136Argyrios Kyrtzidis    return NO_ERROR;
156b40034c2e580ab3b08de9dfb738d8e5d8ef79136Argyrios Kyrtzidis}
157b40034c2e580ab3b08de9dfb738d8e5d8ef79136Argyrios Kyrtzidis
158b40034c2e580ab3b08de9dfb738d8e5d8ef79136Argyrios Kyrtzidisstatus_t  AudioPolicyService::doStopOutput(audio_io_handle_t output,
1598a1d722f13df383600f36d77f842957c8adb5f1bArgyrios Kyrtzidis                                      audio_stream_type_t stream,
1601ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian                                      int session)
161830937bc1100fba7682f7c32c40512085870f50cFariborz Jahanian{
1621ceee5c42d5c410217f67d384eecc6ea4a2bba9bFariborz Jahanian    ALOGV("doStopOutput from tid %d", gettid());
163af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet    Mutex::Autolock _l(mLock);
164ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett    return mAudioPolicyManager->stopOutput(output, stream, session);
165af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichet}
1660d95f0d7b81110f77e99e833f766d19be7b7e072Francois Pichet
167af0f4d0b2e38c810effc8b024ad2fb6604eec5d3Francois Pichetvoid AudioPolicyService::releaseOutput(audio_io_handle_t output)
168211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith{
169211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    if (mAudioPolicyManager == NULL) {
170211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith        return;
171211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    }
172211c8ddb5b500ed84833751363d0cfe1115f4dd3Richard Smith    ALOGV("releaseOutput()");
1733e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    mOutputCommandThread->releaseOutputCommand(output);
1743e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor}
1753e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
1763e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregorvoid AudioPolicyService::doReleaseOutput(audio_io_handle_t output)
1773e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor{
1783e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    ALOGV("doReleaseOutput from tid %d", gettid());
1793e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    Mutex::Autolock _l(mLock);
1803e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    mAudioPolicyManager->releaseOutput(output);
1813e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor}
1823e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor
1833e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregoraudio_io_handle_t AudioPolicyService::getInput(audio_source_t inputSource,
1843e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                    uint32_t samplingRate,
1853e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                    audio_format_t format,
1863e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                    audio_channel_mask_t channelMask,
1873e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor                                    int audioSession)
1883e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor{
1894ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    if (mAudioPolicyManager == NULL) {
1904ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad        return 0;
1913e1274f2b99cb99c03cc8e2c6517c37d330b597aDouglas Gregor    }
1924ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    // already checked by client, but double-check in case the client wrapper is bypassed
1934ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad    if (inputSource >= AUDIO_SOURCE_CNT && inputSource != AUDIO_SOURCE_HOTWORD) {
194006113841bdae1edb77aef75ba1ffdf2e55a3094Argyrios Kyrtzidis        return 0;
195772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    }
196772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor
197006113841bdae1edb77aef75ba1ffdf2e55a3094Argyrios Kyrtzidis    if ((inputSource == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
198772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor        return 0;
199772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    }
200cac18add73d095eaab600aefe27ea7174aec4922Nico Weber
201cac18add73d095eaab600aefe27ea7174aec4922Nico Weber    Mutex::Autolock _l(mLock);
202cac18add73d095eaab600aefe27ea7174aec4922Nico Weber    // the audio_in_acoustics_t parameter is ignored by get_input()
203772eeaefef2c883aabe35caf4543e7e32d290183Douglas Gregor    audio_io_handle_t input = mAudioPolicyManager->getInput(inputSource, samplingRate,
204c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge                                                   format, channelMask, (audio_in_acoustics_t) 0);
205c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge
206c5613b26a24a33d7450e3d0bf315c6ccc920ce7bMeador Inge    if (input == 0) {
207d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff        return input;
208ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett    }
2094dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    // create audio pre processors according to input source
2104dfd02a17c6d604c72e6936527c5e1c56d3ecb7aDouglas Gregor    audio_source_t aliasSource = (inputSource == AUDIO_SOURCE_HOTWORD) ?
211ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett                                    AUDIO_SOURCE_VOICE_RECOGNITION : inputSource;
2127a27ea52b7bd635c89bec5a9c521a3bf7d204238Douglas Gregor
2131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ssize_t index = mInputSources.indexOfKey(aliasSource);
214ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett    if (index < 0) {
21579d6726921897811232554ed94c5d77b5b7b3fc0Douglas Gregor        return input;
216a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor    }
217ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett    ssize_t idx = mInputs.indexOfKey(input);
218a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor    InputDesc *inputDesc;
219961713055e636170da59d7006a878cb4ba518a5dFariborz Jahanian    if (idx < 0) {
220961713055e636170da59d7006a878cb4ba518a5dFariborz Jahanian        inputDesc = new InputDesc(audioSession);
221961713055e636170da59d7006a878cb4ba518a5dFariborz Jahanian        mInputs.add(input, inputDesc);
222a6ea10e22b600d92e084f6b11b9b9a92d0eb2412Douglas Gregor    } else {
22301a4cf11777bb34c35f5d251a9e95eb736d0842bDouglas Gregor        inputDesc = mInputs.valueAt(idx);
22401a4cf11777bb34c35f5d251a9e95eb736d0842bDouglas Gregor    }
22501a4cf11777bb34c35f5d251a9e95eb736d0842bDouglas Gregor
22601a4cf11777bb34c35f5d251a9e95eb736d0842bDouglas Gregor    Vector <EffectDesc *> effects = mInputSources.valueAt(index)->mEffects;
22701a4cf11777bb34c35f5d251a9e95eb736d0842bDouglas Gregor    for (size_t i = 0; i < effects.size(); i++) {
22801a4cf11777bb34c35f5d251a9e95eb736d0842bDouglas Gregor        EffectDesc *effect = effects[i];
229a526c5c67e5a0473c340903ee542ce570119665fTed Kremenek        sp<AudioEffect> fx = new AudioEffect(NULL, &effect->mUuid, -1, 0, 0, audioSession, input);
2304ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad        status_t status = fx->initCheck();
231f64bc202a2bcdf7b10f418ad52aaa7366c8ffef9Fariborz Jahanian        if (status != NO_ERROR && status != ALREADY_EXISTS) {
232f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian            ALOGW("Failed to create Fx %s on input %d", effect->mName, input);
233f7992132207d7ddc8810a135cec97ebe5805e500Fariborz Jahanian            // fx goes out of scope and strong ref on AudioEffect is released
234f64bc202a2bcdf7b10f418ad52aaa7366c8ffef9Fariborz Jahanian            continue;
2357a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek        }
236e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor        for (size_t j = 0; j < effect->mParams.size(); j++) {
237e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor            fx->setParameter(effect->mParams[j]);
238e97179c675b341927807c718be215c8d1aab8acbDouglas Gregor        }
239c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor        inputDesc->mEffects.add(fx);
240c29f77b769bcc5b6dc85e72c8e3cc2e348e5cf25Douglas Gregor    }
2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    setPreProcessorEnabled(inputDesc, true);
2428fad9941a635a42ee644e7396ca84cbaaa5c1b6eMike Stump    return input;
243782fa308a765aeac2acb39c4e697c937ec21185bMike Stump}
2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2458fad9941a635a42ee644e7396ca84cbaaa5c1b6eMike Stumpstatus_t AudioPolicyService::startInput(audio_io_handle_t input)
246782fa308a765aeac2acb39c4e697c937ec21185bMike Stump{
2471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (mAudioPolicyManager == NULL) {
248e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola        return NO_INIT;
249e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    }
250e2d4f4ed44a32f179c6d48cd1dba8346ab2129d9Rafael Espindola    Mutex::Autolock _l(mLock);
251adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump
2525c0d3d66bf06213009802876a14e6298efc1e0b0Douglas Gregor    return mAudioPolicyManager->startInput(input);
2535c0d3d66bf06213009802876a14e6298efc1e0b0Douglas Gregor}
2545c0d3d66bf06213009802876a14e6298efc1e0b0Douglas Gregor
2554ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatus_t AudioPolicyService::stopInput(audio_io_handle_t input)
256adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump{
257083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    if (mAudioPolicyManager == NULL) {
2585c0d3d66bf06213009802876a14e6298efc1e0b0Douglas Gregor        return NO_INIT;
2595c0d3d66bf06213009802876a14e6298efc1e0b0Douglas Gregor    }
2605c0d3d66bf06213009802876a14e6298efc1e0b0Douglas Gregor    Mutex::Autolock _l(mLock);
2614ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad
262083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump    return mAudioPolicyManager->stopInput(input);
26314b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne}
26414b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbourne
26514b6ba77710d6431794d65c7d58c6f29c3dc956ePeter Collingbournevoid AudioPolicyService::releaseInput(audio_io_handle_t input)
266bf1a028246d884a540aeafa38e89be59a269b072John McCall{
267bf1a028246d884a540aeafa38e89be59a269b072John McCall    if (mAudioPolicyManager == NULL) {
2681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        return;
26968584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor    }
27068584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor    Mutex::Autolock _l(mLock);
27168584ed35ad819a1668e3f527ba7f5dd4ae6a333Douglas Gregor    mAudioPolicyManager->releaseInput(input);
2726320064d0c60fa8683f5623881c9394fd4aa7689Douglas Gregor
2732455636163fdd18581d7fdae816433f886d88213Mike Stump    ssize_t index = mInputs.indexOfKey(input);
274ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    if (index < 0) {
275ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo        return;
276ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    }
277ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    InputDesc *inputDesc = mInputs.valueAt(index);
278ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    setPreProcessorEnabled(inputDesc, false);
279ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    delete inputDesc;
280ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    mInputs.removeItemsAt(index);
281ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo}
282ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo
283ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufostatus_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
2847caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor                                            int indexMin,
285ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo                                            int indexMax)
286ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo{
287ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    if (mAudioPolicyManager == NULL) {
288ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo        return NO_INIT;
289ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    }
290ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    if (!settingsAllowed()) {
291ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo        return PERMISSION_DENIED;
292ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    }
2937caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
2947caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor        return BAD_VALUE;
2957caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor    }
2967caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor    Mutex::Autolock _l(mLock);
2977caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor    mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
2987caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor    return NO_ERROR;
2997caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor}
3007caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor
3017caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregorstatus_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
3027caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor                                                  int index,
3037caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor                                                  audio_devices_t device)
3047caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor{
3057caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor    if (mAudioPolicyManager == NULL) {
3067caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor        return NO_INIT;
3077caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor    }
3081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!settingsAllowed()) {
3097caa6825f42a0f7e97d6fc06233133c42b218e46Douglas Gregor        return PERMISSION_DENIED;
310251b4ff2578e26959a4c036140ccd61c5e9292f2Douglas Gregor    }
311ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
312ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo        return BAD_VALUE;
3131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
314ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    Mutex::Autolock _l(mLock);
315ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett    return mAudioPolicyManager->setStreamVolumeIndex(stream,
316ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett                                                    index,
317ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett                                                    device);
318ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett}
3190d8df780aef1acda5962347a32591efc629b6748Anders Carlsson
3200d8df780aef1acda5962347a32591efc629b6748Anders Carlssonstatus_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
3210d8df780aef1acda5962347a32591efc629b6748Anders Carlsson                                                  int *index,
3220d8df780aef1acda5962347a32591efc629b6748Anders Carlsson                                                  audio_devices_t device)
3230d8df780aef1acda5962347a32591efc629b6748Anders Carlsson{
3240d8df780aef1acda5962347a32591efc629b6748Anders Carlsson    if (mAudioPolicyManager == NULL) {
3250d8df780aef1acda5962347a32591efc629b6748Anders Carlsson        return NO_INIT;
3260d8df780aef1acda5962347a32591efc629b6748Anders Carlsson    }
3270d8df780aef1acda5962347a32591efc629b6748Anders Carlsson    if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
3280d8df780aef1acda5962347a32591efc629b6748Anders Carlsson        return BAD_VALUE;
3290d8df780aef1acda5962347a32591efc629b6748Anders Carlsson    }
3300d8df780aef1acda5962347a32591efc629b6748Anders Carlsson    Mutex::Autolock _l(mLock);
3310d8df780aef1acda5962347a32591efc629b6748Anders Carlsson    return mAudioPolicyManager->getStreamVolumeIndex(stream,
3320d8df780aef1acda5962347a32591efc629b6748Anders Carlsson                                                    index,
3330d8df780aef1acda5962347a32591efc629b6748Anders Carlsson                                                    device);
3340d8df780aef1acda5962347a32591efc629b6748Anders Carlsson}
3350d8df780aef1acda5962347a32591efc629b6748Anders Carlsson
3360d8df780aef1acda5962347a32591efc629b6748Anders Carlssonuint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
337ed97649e9574b9d854fa4d6109c9333ae0993554John McCall{
338ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    if (mAudioPolicyManager == NULL) {
339ed97649e9574b9d854fa4d6109c9333ae0993554John McCall        return 0;
340ed97649e9574b9d854fa4d6109c9333ae0993554John McCall    }
3411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return mAudioPolicyManager->getStrategyForStream(stream);
342d8b285fee4471f393da8ee30f552ceacdc362afaAnders Carlsson}
3431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3447d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor//audio policy: use audio_device_t appropriately
3457d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor
3467d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregoraudio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
3477d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor{
3487d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor    if (mAudioPolicyManager == NULL) {
3497d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor        return (audio_devices_t)0;
350c1b0f7fa9b755ab59129ae85187d0d4f91379995Argyrios Kyrtzidis    }
3517d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor    return mAudioPolicyManager->getDevicesForStream(stream);
3527d10b7eb670b821741b4c96f6cf7afbc3bb39abeDouglas Gregor}
35307369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman
35407369dde9d72213bf8a48288cd8b29999af9a40cEli Friedmanaudio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
35507369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman{
35607369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman    // FIXME change return type to status_t, and return NO_INIT here
35707369dde9d72213bf8a48288cd8b29999af9a40cEli Friedman    if (mAudioPolicyManager == NULL) {
35866cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie        return 0;
3595e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman    }
3605e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman    Mutex::Autolock _l(mLock);
3615e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman    return mAudioPolicyManager->getOutputForEffect(desc);
36266cff7257698d5528632917d38f9a3037bb1506dDavid Blaikie}
363ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett
364ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennettstatus_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
365d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek                                audio_io_handle_t io,
366d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek                                uint32_t strategy,
367d211cb709510fbe7e75167b9feee0050851d001aTed Kremenek                                int session,
368e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor                                int id)
369e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor{
370e664977aca2a05a77abab5a06dc0fb69e870cfb9Douglas Gregor    if (mAudioPolicyManager == NULL) {
371ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis        return NO_INIT;
372ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidis    }
373ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennett    return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
374b800dc2d5e27ec60f567567b623cdc61152b8fb8Chris Lattner}
3751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
376ca0d10edcf1192ab8546a75e8be5bab7ef32e488James Dennettstatus_t AudioPolicyService::unregisterEffect(int id)
377e7d07d113677a39026ff5119b8b67f6fe8ca9793Ted Kremenek{
3783e3cd93b2fd9644e970c389e715c13883faf68b6Douglas Gregor    if (mAudioPolicyManager == NULL) {
379e7d07d113677a39026ff5119b8b67f6fe8ca9793Ted Kremenek        return NO_INIT;
38063fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor    }
38163fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor    return mAudioPolicyManager->unregisterEffect(id);
38263fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor}
38363fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor
3844ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foadstatus_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
3851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{
386fe6b2d481d91140923f4541f273b253291884214Douglas Gregor    if (mAudioPolicyManager == NULL) {
387d7a3e2c5f61cd4893f95b69a424fe4def3aa0f69Benjamin Kramer        return NO_INIT;
388071cc7deffad608165b1ddd5263e8bf181861520Charles Davis    }
389071cc7deffad608165b1ddd5263e8bf181861520Charles Davis    return mAudioPolicyManager->setEffectEnabled(id, enabled);
3906f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith}
391071cc7deffad608165b1ddd5263e8bf181861520Charles Davis
39236d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidisbool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
393207f4d8543529221932af82836016a2ef066c917Peter Collingbourne{
394bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    if (mAudioPolicyManager == NULL) {
395207f4d8543529221932af82836016a2ef066c917Peter Collingbourne        return 0;
39636d2fd44bfeec417bbd7465218353abb8bf7e95dArgyrios Kyrtzidis    }
39701a4cf11777bb34c35f5d251a9e95eb736d0842bDouglas Gregor    Mutex::Autolock _l(mLock);
39801a4cf11777bb34c35f5d251a9e95eb736d0842bDouglas Gregor    return mAudioPolicyManager->isStreamActive(stream, inPastMs);
3994d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor}
4004d8d22bfaed6e5d7da6b5556415b18c43b44e36cDouglas Gregor
401bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorbool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
4028987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor{
40330c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor    if (mAudioPolicyManager == NULL) {
4041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        return 0;
40571993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    }
40629238a0bf7cbf5b396efb451a0adb5fe4aa037caSteve Naroff    Mutex::Autolock _l(mLock);
4071b63e4f732dbc73d90abf886b4d21f8e3a165f6dChris Lattner    return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
4084ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad}
4096f42b62b6194f53bcbc349f5d17388e1936535d7Dylan Noblesmith
4107b90340c9c7d07aef4e301e72b5e8a30d5f4f0c8Argyrios Kyrtzidisbool AudioPolicyService::isSourceActive(audio_source_t source) const
4112e1cd4264d363ca869bf37ef160902f211d21b8cDouglas Gregor{
412ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    if (mAudioPolicyManager == NULL) {
413ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek        return false;
414ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    }
415ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    Mutex::Autolock _l(mLock);
416ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    return mAudioPolicyManager->isSourceActive(source);
417ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek}
418ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek
419ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimekstatus_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
420ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek                                                       effect_descriptor_t *descriptors,
421ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek                                                       uint32_t *count)
422ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek{
423ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek
424ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    if (mAudioPolicyManager == NULL) {
425ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek        *count = 0;
426ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek        return NO_INIT;
427ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    }
428ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    Mutex::Autolock _l(mLock);
429ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    status_t status = NO_ERROR;
430ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek
431ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    size_t index;
432ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    for (index = 0; index < mInputs.size(); index++) {
433ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek        if (mInputs.valueAt(index)->mSessionId == audioSession) {
434ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek            break;
435ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek        }
436ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    }
437ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    if (index == mInputs.size()) {
438ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek        *count = 0;
439ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek        return BAD_VALUE;
440ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    }
441ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    Vector< sp<AudioEffect> > effects = mInputs.valueAt(index)->mEffects;
442ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek
443ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    for (size_t i = 0; i < effects.size(); i++) {
444ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek        effect_descriptor_t desc = effects[i]->descriptor();
445ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek        if (i < *count) {
446ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek            descriptors[i] = desc;
447cff15128c6c089bd6fae841b80680e6f5afbf0bfReid Kleckner        }
448ff9a01000ff74a994aa3da26ea2ec732c97291b7Manuel Klimek    }
449023bd7d6ff3bf9ad6c9fa2e404924195e4f31584Benjamin Kramer    if (effects.size() > *count) {
450023bd7d6ff3bf9ad6c9fa2e404924195e4f31584Benjamin Kramer        status = NO_MEMORY;
451023bd7d6ff3bf9ad6c9fa2e404924195e4f31584Benjamin Kramer    }
4528987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor    *count = effects.size();
453023bd7d6ff3bf9ad6c9fa2e404924195e4f31584Benjamin Kramer    return status;
4548987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor}
4558987b2385d9ba63ada66e1344ace79b04d5cb5c3Douglas Gregor
45630c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregorbool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
4577a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek{
458a9376d470ccb0eac74fe09a6b2a18a890f1d17c4Chris Lattner    if (mAudioPolicyManager == NULL) {
459a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko        ALOGV("mAudioPolicyManager == NULL");
460a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko        return false;
461a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    }
462a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko
463a5ef44ff5d93a3be6ca67782828157a71894cf0cDmitri Gribenko    return mAudioPolicyManager->isOffloadSupported(info);
464605c59a1d1a11112c643031770c616e2e441c349Eli Friedman}
46563fe86bee66fc145942c56b2cc564ea0b9b9ea12Douglas Gregor
466c0ac4923f08b25ae973a8ee7942cf3eb89da57b7Steve Naroffstatus_t AudioPolicyService::listAudioPorts(audio_port_role_t role __unused,
4674ba2a17694148e16eaa8d3917f657ffcd3667be4Jay Foad                                            audio_port_type_t type __unused,
468fe6b2d481d91140923f4541f273b253291884214Douglas Gregor                                            unsigned int *num_ports,
46961e0b94838127601718c64b80940868d4b995e1fTed Kremenek                                            struct audio_port *ports __unused,
47061e0b94838127601718c64b80940868d4b995e1fTed Kremenek                                            unsigned int *generation __unused)
471ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek{
47261e0b94838127601718c64b80940868d4b995e1fTed Kremenek    *num_ports = 0;
47361e0b94838127601718c64b80940868d4b995e1fTed Kremenek    return INVALID_OPERATION;
474ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek}
475ba29bd25515fbd99e98ba0fedb9d93617b27609eTed Kremenek
47661e0b94838127601718c64b80940868d4b995e1fTed Kremenekstatus_t AudioPolicyService::getAudioPort(struct audio_port *port __unused)
477d7a3e2c5f61cd4893f95b69a424fe4def3aa0f69Benjamin Kramer{
478d7a3e2c5f61cd4893f95b69a424fe4def3aa0f69Benjamin Kramer    return INVALID_OPERATION;
479fe6b2d481d91140923f4541f273b253291884214Douglas Gregor}
480fe6b2d481d91140923f4541f273b253291884214Douglas Gregor
481bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregorstatus_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch __unused,
482bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor        audio_patch_handle_t *handle __unused)
483538bbe597b935a74d95c668ad209536753f13481Fariborz Jahanian{
484538bbe597b935a74d95c668ad209536753f13481Fariborz Jahanian    return INVALID_OPERATION;
4854e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie}
4861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
487d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikiestatus_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle __unused)
48878a916ec5ff5b66adec3c499e1b9af7b87668309Argyrios Kyrtzidis{
4891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return INVALID_OPERATION;
4909c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek}
4919c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek
492ef177820100ab583b08fd3056e2a5a52ee4b1629Argyrios Kyrtzidisstatus_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
493aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        struct audio_patch *patches __unused,
494aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko        unsigned int *generation __unused)
495aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko{
496aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    *num_patches = 0;
497aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko    return INVALID_OPERATION;
498aa0cd85838f2a024e589ea4e8c2094130065af21Dmitri Gribenko}
499f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko
500f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenkostatus_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config __unused)
501f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko{
502f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko    return INVALID_OPERATION;
503f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko}
504f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko
505f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko}; // namespace android
506f50555eedef33fd5a67d369aa0ae8a6f1d201543Dmitri Gribenko