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