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