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, 2378c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid __unused, 238caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent uint32_t samplingRate, 239caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_format_t format, 240caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_channel_mask_t channelMask, 241466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_input_flags_t flags __unused, 242466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId __unused) 243dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 244dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 245caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_INIT; 246dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 247c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent 248c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent audio_source_t inputSource = attr->source; 249c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent 250dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // already checked by client, but double-check in case the client wrapper is bypassed 251c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent if (inputSource >= AUDIO_SOURCE_CNT && inputSource != AUDIO_SOURCE_HOTWORD && 252c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent inputSource != AUDIO_SOURCE_FM_TUNER) { 253caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 254dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 255dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 256c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent if (inputSource == AUDIO_SOURCE_DEFAULT) { 257c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent inputSource = AUDIO_SOURCE_MIC; 258c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent } 259c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent 260ab300c8cbf5df98fddca39e8d1698b0307432152Eric Laurent if ((inputSource == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) { 261caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 262dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 263dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 2648b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 2658b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 2668b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 2678b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // the audio_in_acoustics_t parameter is ignored by get_input() 268c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent *input = mpAudioPolicy->get_input(mpAudioPolicy, inputSource, samplingRate, 2698b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent format, channelMask, (audio_in_acoustics_t) 0); 2708b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 2718b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 272caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (*input == AUDIO_IO_HANDLE_NONE) { 273caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return INVALID_OPERATION; 274dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 275dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 2768b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 2778b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // create audio pre processors according to input source 278c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent status_t status = audioPolicyEffects->addInputEffects(*input, inputSource, session); 2798b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (status != NO_ERROR && status != ALREADY_EXISTS) { 2808b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent ALOGW("Failed to add effects on input %d", input); 2818b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 282dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 283caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_ERROR; 284dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 285dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 2864dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioPolicyService::startInput(audio_io_handle_t input, 2874dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session __unused) 288dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 289dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 290dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 291dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 292dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 293dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 294dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->start_input(mpAudioPolicy, input); 295dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 296dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 2974dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioPolicyService::stopInput(audio_io_handle_t input, 2984dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session __unused) 299dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 300dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 301dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 302dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 303dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 304dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 305dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->stop_input(mpAudioPolicy, input); 306dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 307dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 3084dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentvoid AudioPolicyService::releaseInput(audio_io_handle_t input, 3094dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session __unused) 310dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 311dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 312dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return; 313dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 314dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 3158b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 3168b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 3178b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 3188b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent mpAudioPolicy->release_input(mpAudioPolicy, input); 3198b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 3208b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 3218b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 3228b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // release audio processors from the input 3238b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent status_t status = audioPolicyEffects->releaseInputEffects(input); 3248b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if(status != NO_ERROR) { 3258b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent ALOGW("Failed to release effects on input %d", input); 3268b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 327dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 328dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 329dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 330dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream, 331dce54a1492c410ad0d93253b341fb33305337505Eric Laurent int indexMin, 332dce54a1492c410ad0d93253b341fb33305337505Eric Laurent int indexMax) 333dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 334dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 335dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 336dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 337dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (!settingsAllowed()) { 338dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return PERMISSION_DENIED; 339dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 340223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 341dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return BAD_VALUE; 342dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 343dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 344dce54a1492c410ad0d93253b341fb33305337505Eric Laurent mpAudioPolicy->init_stream_volume(mpAudioPolicy, stream, indexMin, indexMax); 345dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_ERROR; 346dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 347dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 348dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream, 349dce54a1492c410ad0d93253b341fb33305337505Eric Laurent int index, 350dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_devices_t device) 351dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 352dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 353dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 354dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 355dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (!settingsAllowed()) { 356dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return PERMISSION_DENIED; 357dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 358223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 359dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return BAD_VALUE; 360dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 361dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 362dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy->set_stream_volume_index_for_device) { 363dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->set_stream_volume_index_for_device(mpAudioPolicy, 364dce54a1492c410ad0d93253b341fb33305337505Eric Laurent stream, 365dce54a1492c410ad0d93253b341fb33305337505Eric Laurent index, 366dce54a1492c410ad0d93253b341fb33305337505Eric Laurent device); 367dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } else { 368dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->set_stream_volume_index(mpAudioPolicy, stream, index); 369dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 370dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 371dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 372dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream, 373dce54a1492c410ad0d93253b341fb33305337505Eric Laurent int *index, 374dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_devices_t device) 375dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 376dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 377dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 378dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 379223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 380dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return BAD_VALUE; 381dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 382dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 383dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy->get_stream_volume_index_for_device) { 384dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->get_stream_volume_index_for_device(mpAudioPolicy, 385dce54a1492c410ad0d93253b341fb33305337505Eric Laurent stream, 386dce54a1492c410ad0d93253b341fb33305337505Eric Laurent index, 387dce54a1492c410ad0d93253b341fb33305337505Eric Laurent device); 388dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } else { 389dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->get_stream_volume_index(mpAudioPolicy, stream, index); 390dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 391dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 392dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 393dce54a1492c410ad0d93253b341fb33305337505Eric Laurentuint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream) 394dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 395223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 396b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return 0; 397dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 398dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 399dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return 0; 400dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 401dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->get_strategy_for_stream(mpAudioPolicy, stream); 402dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 403dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 404dce54a1492c410ad0d93253b341fb33305337505Eric Laurent//audio policy: use audio_device_t appropriately 405dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 406dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream) 407dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 408223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 409b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_DEVICE_NONE; 410dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 411dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 412b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_DEVICE_NONE; 413dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 414dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->get_devices_for_stream(mpAudioPolicy, stream); 415dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 416dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 417dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc) 418dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 419dce54a1492c410ad0d93253b341fb33305337505Eric Laurent // FIXME change return type to status_t, and return NO_INIT here 420dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 421dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return 0; 422dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 423dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 424dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->get_output_for_effect(mpAudioPolicy, desc); 425dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 426dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 427dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc, 428dce54a1492c410ad0d93253b341fb33305337505Eric Laurent audio_io_handle_t io, 429dce54a1492c410ad0d93253b341fb33305337505Eric Laurent uint32_t strategy, 430dce54a1492c410ad0d93253b341fb33305337505Eric Laurent int session, 431dce54a1492c410ad0d93253b341fb33305337505Eric Laurent int id) 432dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 433dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 434dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 435dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 436dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->register_effect(mpAudioPolicy, desc, io, strategy, session, id); 437dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 438dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 439dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::unregisterEffect(int id) 440dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 441dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 442dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 443dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 444dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->unregister_effect(mpAudioPolicy, id); 445dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 446dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 447dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setEffectEnabled(int id, bool enabled) 448dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 449dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 450dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 451dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 452dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->set_effect_enabled(mpAudioPolicy, id, enabled); 453dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 454dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 455dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 456dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 457223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 458b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 459dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 460dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 461b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 462dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 463dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 464dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->is_stream_active(mpAudioPolicy, stream, inPastMs); 465dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 466dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 467dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 468dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 469223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 470b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 471dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 472dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 473b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 474dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 475dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 476dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->is_stream_active_remotely(mpAudioPolicy, stream, inPastMs); 477dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 478dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 479dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isSourceActive(audio_source_t source) const 480dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 481dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 482dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return false; 483dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 484dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy->is_source_active == 0) { 485dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return false; 486dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 487dce54a1492c410ad0d93253b341fb33305337505Eric Laurent Mutex::Autolock _l(mLock); 488dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->is_source_active(mpAudioPolicy, source); 489dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 490dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 491dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::queryDefaultPreProcessing(int audioSession, 492dce54a1492c410ad0d93253b341fb33305337505Eric Laurent effect_descriptor_t *descriptors, 493dce54a1492c410ad0d93253b341fb33305337505Eric Laurent uint32_t *count) 494dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 495dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 496dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *count = 0; 497dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return NO_INIT; 498dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 4998b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 5008b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 5018b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 5028b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 5038b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 5048b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects == 0) { 5058b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent *count = 0; 5068b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent return NO_INIT; 5078b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 5088b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count); 509dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 510dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 511dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info) 512dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{ 513dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy == NULL) { 514dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("mpAudioPolicy == NULL"); 515dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return false; 516dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 517dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 518dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mpAudioPolicy->is_offload_supported == NULL) { 519dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("HAL does not implement is_offload_supported"); 520dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return false; 521dce54a1492c410ad0d93253b341fb33305337505Eric Laurent } 522dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 523dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mpAudioPolicy->is_offload_supported(mpAudioPolicy, &info); 524dce54a1492c410ad0d93253b341fb33305337505Eric Laurent} 525dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 5268670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::listAudioPorts(audio_port_role_t role __unused, 5278670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent audio_port_type_t type __unused, 5288670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent unsigned int *num_ports, 5298670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent struct audio_port *ports __unused, 5308670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent unsigned int *generation __unused) 5318670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{ 5328670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent *num_ports = 0; 5338670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent return INVALID_OPERATION; 5348670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent} 5358670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent 5368670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::getAudioPort(struct audio_port *port __unused) 5378670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{ 5388670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent return INVALID_OPERATION; 5398670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent} 5408670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent 5418670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch __unused, 5428670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent audio_patch_handle_t *handle __unused) 5438670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{ 5448670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent return INVALID_OPERATION; 5458670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent} 5468670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent 5478670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle __unused) 5488670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{ 5498670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent return INVALID_OPERATION; 5508670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent} 5518670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent 5528670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::listAudioPatches(unsigned int *num_patches, 5538670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent struct audio_patch *patches __unused, 5548670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent unsigned int *generation __unused) 5558670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{ 5568670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent *num_patches = 0; 5578670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent return INVALID_OPERATION; 5588670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent} 5598670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent 5608670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config __unused) 5618670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{ 5628670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent return INVALID_OPERATION; 5638670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent} 564dce54a1492c410ad0d93253b341fb33305337505Eric Laurent 565e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentstatus_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr, 566e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t *output, 567baac183f3808d7b68f184647a97bd381620415feEric Laurent audio_session_t session __unused, 568e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t *stream, 5698c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid __unused, 570e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent uint32_t samplingRate, 571e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_format_t format, 572e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_channel_mask_t channelMask, 573e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_output_flags_t flags, 574466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId __unused, 575e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent const audio_offload_info_t *offloadInfo) 5767c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent{ 577e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (attr != NULL) { 578e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *stream = audio_attributes_to_stream_type(attr); 579e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } else { 580e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (*stream == AUDIO_STREAM_DEFAULT) { 581e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return BAD_VALUE; 582e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 583e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 584e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent *output = getOutput(*stream, samplingRate, format, channelMask, 585e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent flags, offloadInfo); 586e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent if (*output == AUDIO_IO_HANDLE_NONE) { 587e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return INVALID_OPERATION; 588e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent } 589e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return NO_ERROR; 5907c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent} 5917c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent 592223fd5c9738e9665e495904d37d4632414b68c1eEric Laurentstatus_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session __unused, 593223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent audio_io_handle_t *ioHandle __unused, 594223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent audio_devices_t *device __unused) 595df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{ 596df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return INVALID_OPERATION; 597df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent} 598df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 599223fd5c9738e9665e495904d37d4632414b68c1eEric Laurentstatus_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session __unused) 600df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{ 601df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return INVALID_OPERATION; 602df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent} 6037c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent 604baac183f3808d7b68f184647a97bd381620415feEric Laurentstatus_t AudioPolicyService::registerPolicyMixes(Vector<AudioMix> mixes __unused, 605baac183f3808d7b68f184647a97bd381620415feEric Laurent bool registration __unused) 606baac183f3808d7b68f184647a97bd381620415feEric Laurent{ 607baac183f3808d7b68f184647a97bd381620415feEric Laurent return INVALID_OPERATION; 608baac183f3808d7b68f184647a97bd381620415feEric Laurent} 609baac183f3808d7b68f184647a97bd381620415feEric Laurent 610554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioPolicyService::startAudioSource(const struct audio_port_config *source, 611554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const audio_attributes_t *attributes, 612554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t *handle) 613554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{ 614554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return INVALID_OPERATION; 615554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent} 616554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 617554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle) 618554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{ 619554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return INVALID_OPERATION; 620554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent} 621554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 622dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}; // namespace android 623