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> 27f380677f21240ffb78bcdf7c804fe0a7807fb08dEric Laurent#include <media/AudioPolicyHelper.h> 28dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 29dce54a1492c410ad0d93253b341fb33305337505Eric Laurentnamespace android { 30dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 31dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 32dce54a1492c410ad0d93253b341fb33305337505Eric Laurent// ---------------------------------------------------------------------------- 33dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 34dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device, 35dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_policy_dev_state_t state, 36e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_address, 37e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name __unused) 38dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 39dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 40dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 41dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 42dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (!settingsAllowed()) { 43dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return PERMISSION_DENIED; 44dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 45dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (!audio_is_output_device(device) && !audio_is_input_device(device)) { 46dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return BAD_VALUE; 47dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 48dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE && 49dce54a1492c410ad0d93253b341fb33305337505Eric Laurent state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) { 50dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return BAD_VALUE; 51dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 52dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 53dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("setDeviceConnectionState()"); 54dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 55dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->set_device_connection_state(mpAudioPolicy, device, 56dce54a1492c410ad0d93253b341fb33305337505Eric Laurent state, device_address); 57dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 58dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 59dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState( 60dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_devices_t device, 61dce54a1492c410ad0d93253b341fb33305337505Eric Laurent const char *device_address) 62dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 63dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 64dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE; 65dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 66dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->get_device_connection_state(mpAudioPolicy, device, 67dce54a1492c410ad0d93253b341fb33305337505Eric Laurent device_address); 68dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 69dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 70dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setPhoneState(audio_mode_t state) 71dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 72dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 73dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 74dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 75dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (!settingsAllowed()) { 76dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return PERMISSION_DENIED; 77dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 78dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (uint32_t(state) >= AUDIO_MODE_CNT) { 79dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return BAD_VALUE; 80dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 81dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 82dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("setPhoneState()"); 83dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 84dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // TODO: check if it is more appropriate to do it in platform specific policy manager 85dce54a1492c410ad0d93253b341fb33305337505Eric Laurent AudioSystem::setMode(state); 86dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 87dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 88dce54a1492c410ad0d93253b341fb33305337505Eric Laurent mpAudioPolicy->set_phone_state(mpAudioPolicy, state); 89bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent mPhoneState = state; 90dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_ERROR; 91dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 92dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 93bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurentaudio_mode_t AudioPolicyService::getPhoneState() 94bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent{ 95bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent Mutex::Autolock _l(mLock); 96bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return mPhoneState; 97bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent} 98bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 99dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage, 100dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_policy_forced_cfg_t config) 101dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 102dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 103dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 104dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 105dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (!settingsAllowed()) { 106dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return PERMISSION_DENIED; 107dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 108dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) { 109dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return BAD_VALUE; 110dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 111dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) { 112dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return BAD_VALUE; 113dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 114dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("setForceUse()"); 115dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 116dce54a1492c410ad0d93253b341fb33305337505Eric Laurent mpAudioPolicy->set_force_use(mpAudioPolicy, usage, config); 117dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_ERROR; 118dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 119dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 120dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage) 121dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 122dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 123dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return AUDIO_POLICY_FORCE_NONE; 124dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 125dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) { 126dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return AUDIO_POLICY_FORCE_NONE; 127dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 128dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->get_force_use(mpAudioPolicy, usage); 129dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 130dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 131dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream, 132dce54a1492c410ad0d93253b341fb33305337505Eric Laurent uint32_t samplingRate, 133dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_format_t format, 134dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_channel_mask_t channelMask, 135dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_output_flags_t flags, 136dce54a1492c410ad0d93253b341fb33305337505Eric Laurent const audio_offload_info_t *offloadInfo) 137dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 138223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 139b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_IO_HANDLE_NONE; 140dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 141dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 142b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_IO_HANDLE_NONE; 143dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 144dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("getOutput()"); 145dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 146dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->get_output(mpAudioPolicy, stream, samplingRate, 147dce54a1492c410ad0d93253b341fb33305337505Eric Laurent format, channelMask, flags, offloadInfo); 148dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 149dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 150dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::startOutput(audio_io_handle_t output, 151dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_stream_type_t stream, 152e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 153dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 154223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 155dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent return BAD_VALUE; 156dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 157dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 158dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 159dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 160dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("startOutput()"); 161ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu // create audio processors according to stream 1628b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 1638b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 1648b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 1658b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 1668b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 1678b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 1688b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session); 1698b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (status != NO_ERROR && status != ALREADY_EXISTS) { 1708b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent ALOGW("Failed to add effects on session %d", session); 1718b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 172ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu } 173ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu 1748b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 175dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->start_output(mpAudioPolicy, output, stream, session); 176dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 177dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 178dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::stopOutput(audio_io_handle_t output, 179dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_stream_type_t stream, 180e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 181dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 182223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 183dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent return BAD_VALUE; 184dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 185dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 186dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 187dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 188dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("stopOutput()"); 189dce54a1492c410ad0d93253b341fb33305337505Eric Laurent mOutputCommandThread->stopOutputCommand(output, stream, session); 190dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_ERROR; 191dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 192dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 193dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::doStopOutput(audio_io_handle_t output, 194dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_stream_type_t stream, 195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 196dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 197dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("doStopOutput from tid %d", gettid()); 198ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu // release audio processors from the stream 1998b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 2008b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 2018b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 2028b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 203ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu } 2048b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 2058b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session); 2068b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (status != NO_ERROR && status != ALREADY_EXISTS) { 2078b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent ALOGW("Failed to release effects on session %d", session); 2088b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 2098b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 2108b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 211dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->stop_output(mpAudioPolicy, output, stream, session); 212dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 213dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 214e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentvoid AudioPolicyService::releaseOutput(audio_io_handle_t output, 215e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 216e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 217dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 218dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 219dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return; 220dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 221dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("releaseOutput()"); 222e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent mOutputCommandThread->releaseOutputCommand(output, stream, session); 223dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 224dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 225e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentvoid AudioPolicyService::doReleaseOutput(audio_io_handle_t output, 226e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream __unused, 227e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session __unused) 228dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 229dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("doReleaseOutput from tid %d", gettid()); 230dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 231dce54a1492c410ad0d93253b341fb33305337505Eric Laurent mpAudioPolicy->release_output(mpAudioPolicy, output); 232dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 233dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 234caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurentstatus_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, 235caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t *input, 236caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session, 237b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent pid_t pid __unused, 2388c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid __unused, 239caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent uint32_t samplingRate, 240caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_format_t format, 241caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_channel_mask_t channelMask, 242466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_input_flags_t flags __unused, 243466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId __unused) 244dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 245dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 246caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_INIT; 247dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 248c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent 249c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent audio_source_t inputSource = attr->source; 250c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent 251dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // already checked by client, but double-check in case the client wrapper is bypassed 252c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent if (inputSource >= AUDIO_SOURCE_CNT && inputSource != AUDIO_SOURCE_HOTWORD && 253c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent inputSource != AUDIO_SOURCE_FM_TUNER) { 254caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 255dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 256dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 257c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent if (inputSource == AUDIO_SOURCE_DEFAULT) { 258c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent inputSource = AUDIO_SOURCE_MIC; 259c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent } 260c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent 261ab300c8cbf5df98fddca39e8d1698b0307432152Eric Laurent if ((inputSource == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) { 262caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 263dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 264dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 2658b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 2668b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 2678b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 2688b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // the audio_in_acoustics_t parameter is ignored by get_input() 269c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent *input = mpAudioPolicy->get_input(mpAudioPolicy, inputSource, samplingRate, 2708b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent format, channelMask, (audio_in_acoustics_t) 0); 2718b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 2728b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 273caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (*input == AUDIO_IO_HANDLE_NONE) { 274caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return INVALID_OPERATION; 275dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 276dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 2778b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 2788b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // create audio pre processors according to input source 279c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent status_t status = audioPolicyEffects->addInputEffects(*input, inputSource, session); 2808b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (status != NO_ERROR && status != ALREADY_EXISTS) { 2818b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent ALOGW("Failed to add effects on input %d", input); 2828b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 283dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 284caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_ERROR; 285dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 286dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 2874dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioPolicyService::startInput(audio_io_handle_t input, 2884dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session __unused) 289dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 290dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 291dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 292dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 293dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 294dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 295dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->start_input(mpAudioPolicy, input); 296dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 297dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 2984dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioPolicyService::stopInput(audio_io_handle_t input, 2994dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session __unused) 300dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 301dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 302dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 303dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 304dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 305dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 306dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->stop_input(mpAudioPolicy, input); 307dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 308dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 3094dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentvoid AudioPolicyService::releaseInput(audio_io_handle_t input, 310232f26f8b673973ffa463f80b08b731ffacc8785Eric Laurent audio_session_t session __unused) 311dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 312dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 313dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return; 314dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 315dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 3168b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 3178b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 3188b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 3198b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent mpAudioPolicy->release_input(mpAudioPolicy, input); 3208b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 3218b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 3228b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 3238b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // release audio processors from the input 324232f26f8b673973ffa463f80b08b731ffacc8785Eric Laurent status_t status = audioPolicyEffects->releaseInputEffects(input); 3258b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if(status != NO_ERROR) { 3268b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent ALOGW("Failed to release effects on input %d", input); 3278b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 328dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 329dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 330dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 331dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream, 332dce54a1492c410ad0d93253b341fb33305337505Eric Laurent int indexMin, 333dce54a1492c410ad0d93253b341fb33305337505Eric Laurent int indexMax) 334dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 335dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 336dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 337dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 338dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (!settingsAllowed()) { 339dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return PERMISSION_DENIED; 340dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 341223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 342dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return BAD_VALUE; 343dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 344dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 345dce54a1492c410ad0d93253b341fb33305337505Eric Laurent mpAudioPolicy->init_stream_volume(mpAudioPolicy, stream, indexMin, indexMax); 346dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_ERROR; 347dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 348dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 349dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream, 350dce54a1492c410ad0d93253b341fb33305337505Eric Laurent int index, 351dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_devices_t device) 352dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 353dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 354dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 355dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 356dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (!settingsAllowed()) { 357dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return PERMISSION_DENIED; 358dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 359223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 360dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return BAD_VALUE; 361dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 362dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 363dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy->set_stream_volume_index_for_device) { 364dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->set_stream_volume_index_for_device(mpAudioPolicy, 365dce54a1492c410ad0d93253b341fb33305337505Eric Laurent stream, 366dce54a1492c410ad0d93253b341fb33305337505Eric Laurent index, 367dce54a1492c410ad0d93253b341fb33305337505Eric Laurent device); 368dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } else { 369dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->set_stream_volume_index(mpAudioPolicy, stream, index); 370dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 371dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 372dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 373dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream, 374dce54a1492c410ad0d93253b341fb33305337505Eric Laurent int *index, 375dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_devices_t device) 376dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 377dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 378dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 379dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 380223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 381dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return BAD_VALUE; 382dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 383dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 384dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy->get_stream_volume_index_for_device) { 385dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->get_stream_volume_index_for_device(mpAudioPolicy, 386dce54a1492c410ad0d93253b341fb33305337505Eric Laurent stream, 387dce54a1492c410ad0d93253b341fb33305337505Eric Laurent index, 388dce54a1492c410ad0d93253b341fb33305337505Eric Laurent device); 389dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } else { 390dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->get_stream_volume_index(mpAudioPolicy, stream, index); 391dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 392dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 393dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 394dce54a1492c410ad0d93253b341fb33305337505Eric Laurentuint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream) 395dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 396223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 397b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return 0; 398dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 399dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 400dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return 0; 401dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 402dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->get_strategy_for_stream(mpAudioPolicy, stream); 403dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 404dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 405dce54a1492c410ad0d93253b341fb33305337505Eric Laurent//audio policy: use audio_device_t appropriately 406dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 407dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream) 408dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 409223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 410b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_DEVICE_NONE; 411dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 412dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 413b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_DEVICE_NONE; 414dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 415dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->get_devices_for_stream(mpAudioPolicy, stream); 416dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 417dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 418dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc) 419dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 420dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // FIXME change return type to status_t, and return NO_INIT here 421dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 422dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return 0; 423dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 424dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 425dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->get_output_for_effect(mpAudioPolicy, desc); 426dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 427dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 428dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc, 429dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_io_handle_t io, 430dce54a1492c410ad0d93253b341fb33305337505Eric Laurent uint32_t strategy, 431d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session, 432dce54a1492c410ad0d93253b341fb33305337505Eric Laurent int id) 433dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 434dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 435dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 436dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 437dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->register_effect(mpAudioPolicy, desc, io, strategy, session, id); 438dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 439dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 440dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::unregisterEffect(int id) 441dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 442dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 443dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 444dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 445dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->unregister_effect(mpAudioPolicy, id); 446dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 447dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 448dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setEffectEnabled(int id, bool enabled) 449dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 450dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 451dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 452dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 453dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->set_effect_enabled(mpAudioPolicy, id, enabled); 454dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 455dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 456dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 457dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 458223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 459b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 460dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 461dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 462b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 463dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 464dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 465dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->is_stream_active(mpAudioPolicy, stream, inPastMs); 466dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 467dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 468dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 469dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 470223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 471b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 472dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 473dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 474b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 475dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 476dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 477dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->is_stream_active_remotely(mpAudioPolicy, stream, inPastMs); 478dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 479dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 480dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isSourceActive(audio_source_t source) const 481dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 482dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 483dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return false; 484dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 485dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy->is_source_active == 0) { 486dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return false; 487dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 488dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 489dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->is_source_active(mpAudioPolicy, source); 490dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 491dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 492d848eb48c121c119e8ba7583efc75415fe102570Glenn Kastenstatus_t AudioPolicyService::queryDefaultPreProcessing(audio_session_t audioSession, 493dce54a1492c410ad0d93253b341fb33305337505Eric Laurent effect_descriptor_t *descriptors, 494dce54a1492c410ad0d93253b341fb33305337505Eric Laurent uint32_t *count) 495dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 496dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 497dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *count = 0; 498dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 499dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 5008b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 5018b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 5028b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 5038b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 5048b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 5058b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects == 0) { 5068b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent *count = 0; 5078b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent return NO_INIT; 5088b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 5098b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count); 510dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 511dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 512dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info) 513dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 514dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 515dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("mpAudioPolicy == NULL"); 516dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return false; 517dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 518dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 519dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy->is_offload_supported == NULL) { 520dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("HAL does not implement is_offload_supported"); 521dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return false; 522dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 523dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 524dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->is_offload_supported(mpAudioPolicy, &info); 525dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 526dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 5278670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::listAudioPorts(audio_port_role_t role __unused, 5288670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent audio_port_type_t type __unused, 5298670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent unsigned int *num_ports, 5308670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent struct audio_port *ports __unused, 5318670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent unsigned int *generation __unused) 5328670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{ 5338670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent *num_ports = 0; 5348670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent return INVALID_OPERATION; 5358670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent} 5368670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent 5378670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::getAudioPort(struct audio_port *port __unused) 5388670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{ 5398670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent return INVALID_OPERATION; 5408670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent} 5418670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent 5428670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch __unused, 5438670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent audio_patch_handle_t *handle __unused) 5448670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{ 5458670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent return INVALID_OPERATION; 5468670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent} 5478670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent 5488670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle __unused) 5498670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{ 5508670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent return INVALID_OPERATION; 5518670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent} 5528670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent 5538670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::listAudioPatches(unsigned int *num_patches, 5548670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent struct audio_patch *patches __unused, 5558670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent unsigned int *generation __unused) 5568670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{ 5578670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent *num_patches = 0; 5588670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent return INVALID_OPERATION; 5598670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent} 5608670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent 5618670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config __unused) 5628670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{ 5638670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent return INVALID_OPERATION; 5648670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent} 565dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 566e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentstatus_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr, 567e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t *output, 568baac183f3808d7b68f184647a97bd381620415feEric Laurent audio_session_t session __unused, 569e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t *stream, 5708c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid __unused, 571e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent uint32_t samplingRate, 572e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_format_t format, 573e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_channel_mask_t channelMask, 574e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_output_flags_t flags, 575466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId __unused, 576e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent const audio_offload_info_t *offloadInfo) 5777c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent{ 578e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (attr != NULL) { 579e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *stream = audio_attributes_to_stream_type(attr); 580e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 581e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (*stream == AUDIO_STREAM_DEFAULT) { 582e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 583e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 584e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 585e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *output = getOutput(*stream, samplingRate, format, channelMask, 586e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent flags, offloadInfo); 587e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (*output == AUDIO_IO_HANDLE_NONE) { 588e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return INVALID_OPERATION; 589e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 590e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return NO_ERROR; 5917c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent} 5927c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent 593223fd5c9738e9665e495904d37d4632414b68c1eEric Laurentstatus_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session __unused, 594223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent audio_io_handle_t *ioHandle __unused, 595223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent audio_devices_t *device __unused) 596df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{ 597df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return INVALID_OPERATION; 598df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent} 599df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 600223fd5c9738e9665e495904d37d4632414b68c1eEric Laurentstatus_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session __unused) 601df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{ 602df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return INVALID_OPERATION; 603df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent} 6047c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent 605baac183f3808d7b68f184647a97bd381620415feEric Laurentstatus_t AudioPolicyService::registerPolicyMixes(Vector<AudioMix> mixes __unused, 606baac183f3808d7b68f184647a97bd381620415feEric Laurent bool registration __unused) 607baac183f3808d7b68f184647a97bd381620415feEric Laurent{ 608baac183f3808d7b68f184647a97bd381620415feEric Laurent return INVALID_OPERATION; 609baac183f3808d7b68f184647a97bd381620415feEric Laurent} 610baac183f3808d7b68f184647a97bd381620415feEric Laurent 611554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioPolicyService::startAudioSource(const struct audio_port_config *source, 612554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const audio_attributes_t *attributes, 613554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t *handle) 614554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{ 615554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return INVALID_OPERATION; 616554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent} 617554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 618554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle) 619554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{ 620554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return INVALID_OPERATION; 621554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent} 622554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 6232ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hungstatus_t AudioPolicyService::setMasterMono(bool mono) 6242ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung{ 6252ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return INVALID_OPERATION; 6262ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung} 6272ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 6282ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hungstatus_t AudioPolicyService::getMasterMono(bool *mono) 6292ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung{ 6302ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return INVALID_OPERATION; 6312ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung} 6322ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 633dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}; // namespace android 634