12d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent/* 22d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent * Copyright (C) 2009 The Android Open Source Project 32d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent * 42d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 52d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent * you may not use this file except in compliance with the License. 62d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent * You may obtain a copy of the License at 72d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent * 82d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 92d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent * 102d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent * Unless required by applicable law or agreed to in writing, software 112d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 122d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent * See the License for the specific language governing permissions and 142d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent * limitations under the License. 152d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent */ 162d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 17dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#define LOG_TAG "AudioPolicyIntefaceImpl" 182d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent//#define LOG_NDEBUG 0 192d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 202d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent#include <utils/Log.h> 212d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent#include "AudioPolicyService.h" 222d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent#include "ServiceUtilities.h" 232d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 242d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentnamespace android { 252d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 262d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 272d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent// ---------------------------------------------------------------------------- 282d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 292d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device, 302d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_policy_dev_state_t state, 31e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_address, 32e743a47f445f02a0612018fa5640301304844fbfPaul McLean const char *device_name) 332d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 34dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 352d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 362d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 372d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (!settingsAllowed()) { 382d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return PERMISSION_DENIED; 392d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 402d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (!audio_is_output_device(device) && !audio_is_input_device(device)) { 412d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return BAD_VALUE; 422d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 432d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE && 442d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) { 452d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return BAD_VALUE; 462d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 472d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 482d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("setDeviceConnectionState()"); 492d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 50e743a47f445f02a0612018fa5640301304844fbfPaul McLean return mAudioPolicyManager->setDeviceConnectionState(device, state, 51e743a47f445f02a0612018fa5640301304844fbfPaul McLean device_address, device_name); 522d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 532d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 542d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentaudio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState( 552d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_devices_t device, 562d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent const char *device_address) 572d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 58dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 592d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE; 602d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 61dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->getDeviceConnectionState(device, 622d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent device_address); 632d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 642d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 652d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::setPhoneState(audio_mode_t state) 662d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 67dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 682d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 692d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 702d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (!settingsAllowed()) { 712d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return PERMISSION_DENIED; 722d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 732d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (uint32_t(state) >= AUDIO_MODE_CNT) { 742d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return BAD_VALUE; 752d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 762d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 772d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("setPhoneState()"); 782d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 79beb07febdc0cae2f43a2008d3bd06b7bb933b19aEric Laurent // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic 80beb07febdc0cae2f43a2008d3bd06b7bb933b19aEric Laurent // operation from policy manager standpoint (no other operation (e.g track start or stop) 81beb07febdc0cae2f43a2008d3bd06b7bb933b19aEric Laurent // can be interleaved). 82beb07febdc0cae2f43a2008d3bd06b7bb933b19aEric Laurent Mutex::Autolock _l(mLock); 83beb07febdc0cae2f43a2008d3bd06b7bb933b19aEric Laurent 842d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent // TODO: check if it is more appropriate to do it in platform specific policy manager 852d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent AudioSystem::setMode(state); 862d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 87dce54a1492c410ad0d93253b341fb33305337505Eric Laurent mAudioPolicyManager->setPhoneState(state); 88bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent mPhoneState = state; 892d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_ERROR; 902d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 912d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 92bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurentaudio_mode_t AudioPolicyService::getPhoneState() 93bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent{ 94bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent Mutex::Autolock _l(mLock); 95bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return mPhoneState; 96bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent} 97bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 982d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage, 992d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_policy_forced_cfg_t config) 1002d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 101dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 1022d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 1032d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1042d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (!settingsAllowed()) { 1052d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return PERMISSION_DENIED; 1062d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1072d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) { 1082d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return BAD_VALUE; 1092d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1102d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) { 1112d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return BAD_VALUE; 1122d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1132d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("setForceUse()"); 1142d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 115dce54a1492c410ad0d93253b341fb33305337505Eric Laurent mAudioPolicyManager->setForceUse(usage, config); 1162d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_ERROR; 1172d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 1182d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 1192d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentaudio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage) 1202d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 121dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 1222d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return AUDIO_POLICY_FORCE_NONE; 1232d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1242d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) { 1252d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return AUDIO_POLICY_FORCE_NONE; 1262d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 127dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->getForceUse(usage); 1282d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 1292d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 1302d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentaudio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream, 1312d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent uint32_t samplingRate, 1322d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_format_t format, 1332d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_channel_mask_t channelMask, 1342d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_output_flags_t flags, 1352d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent const audio_offload_info_t *offloadInfo) 1362d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 137223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 138b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_IO_HANDLE_NONE; 139dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 140dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 141b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_IO_HANDLE_NONE; 1422d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1432d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("getOutput()"); 1442d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 145dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->getOutput(stream, samplingRate, 1462d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent format, channelMask, flags, offloadInfo); 1472d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 1482d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 149e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentstatus_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr, 150e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t *output, 151e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session, 152e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t *stream, 1538c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 154e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent uint32_t samplingRate, 155e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_format_t format, 156e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_channel_mask_t channelMask, 157e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_output_flags_t flags, 158466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId, 159e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent const audio_offload_info_t *offloadInfo) 1605bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi{ 1615bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (mAudioPolicyManager == NULL) { 162e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return NO_INIT; 1635bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 1645bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi ALOGV("getOutput()"); 1655bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi Mutex::Autolock _l(mLock); 1668c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent 167dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen const uid_t callingUid = IPCThreadState::self()->getCallingUid(); 168dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen if (!isTrustedCallingUid(callingUid) || uid == (uid_t)-1) { 169dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen ALOGW_IF(uid != (uid_t)-1 && uid != callingUid, 170dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, uid); 171dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen uid = callingUid; 1728c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent } 1738c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, samplingRate, 174466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean format, channelMask, flags, selectedDeviceId, offloadInfo); 1755bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi} 1765bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 1772d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::startOutput(audio_io_handle_t output, 1782d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_stream_type_t stream, 179e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 1802d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 181dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_CNT) { 182dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent return BAD_VALUE; 183dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 184dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 1852d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 1862d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1872d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("startOutput()"); 1888b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 1898b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 1908b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 1918b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 1928b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 1938b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 1948b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // create audio processors according to stream 1958b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session); 1968b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (status != NO_ERROR && status != ALREADY_EXISTS) { 1978b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent ALOGW("Failed to add effects on session %d", session); 1988b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 199ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu } 2008b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 201dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->startOutput(output, stream, session); 2022d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 2032d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 2042d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::stopOutput(audio_io_handle_t output, 2052d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_stream_type_t stream, 206e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 2072d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 208dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_CNT) { 209dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent return BAD_VALUE; 210dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 211dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 2122d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 2132d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 2142d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("stopOutput()"); 2152d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent mOutputCommandThread->stopOutputCommand(output, stream, session); 2162d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_ERROR; 2172d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 2182d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 2192d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::doStopOutput(audio_io_handle_t output, 2202d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_stream_type_t stream, 221e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 2222d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 2232d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("doStopOutput from tid %d", gettid()); 2248b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 2258b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 2268b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 2278b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 2288b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 2298b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 2308b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // release audio processors from the stream 2318b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session); 2328b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (status != NO_ERROR && status != ALREADY_EXISTS) { 2338b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent ALOGW("Failed to release effects on session %d", session); 2348b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 235ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu } 2368b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 237dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->stopOutput(output, stream, session); 2382d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 2392d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 240e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentvoid AudioPolicyService::releaseOutput(audio_io_handle_t output, 241e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 242e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 2432d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 244dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 2452d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return; 2462d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 2472d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("releaseOutput()"); 248e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent mOutputCommandThread->releaseOutputCommand(output, stream, session); 2492d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 2502d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 251e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentvoid AudioPolicyService::doReleaseOutput(audio_io_handle_t output, 252e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 253e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 2542d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 2552d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("doReleaseOutput from tid %d", gettid()); 2562d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 257e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent mAudioPolicyManager->releaseOutput(output, stream, session); 2582d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 2592d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 260caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurentstatus_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, 261caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t *input, 262caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session, 263b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent pid_t pid, 2648c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 265caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent uint32_t samplingRate, 266caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_format_t format, 267caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_channel_mask_t channelMask, 268466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_input_flags_t flags, 269466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId) 2702d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 271dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 272caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_INIT; 2732d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 2742d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent // already checked by client, but double-check in case the client wrapper is bypassed 275caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (attr->source >= AUDIO_SOURCE_CNT && attr->source != AUDIO_SOURCE_HOTWORD && 276caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent attr->source != AUDIO_SOURCE_FM_TUNER) { 277caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 2782d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 2792d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 280ab300c8cbf5df98fddca39e8d1698b0307432152Eric Laurent if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) { 281caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 2822d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 2838b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 284caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status_t status; 28597bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi AudioPolicyInterface::input_type_t inputType; 286b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent 287b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent bool updatePid = (pid == -1); 288dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen const uid_t callingUid = IPCThreadState::self()->getCallingUid(); 289b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent if (!isTrustedCallingUid(callingUid)) { 2909f39f8d6cc1445c338d8cb635fdbc167c4200971Eric Laurent ALOGW_IF(uid != (uid_t)-1 && uid != callingUid, 291dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, uid); 292dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen uid = callingUid; 293b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent updatePid = true; 294b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent } 295b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent 296b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent if (updatePid) { 297b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent const pid_t callingPid = IPCThreadState::self()->getCallingPid(); 2989f39f8d6cc1445c338d8cb635fdbc167c4200971Eric Laurent ALOGW_IF(pid != (pid_t)-1 && pid != callingPid, 299b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent "%s uid %d pid %d tried to pass itself off as pid %d", 300b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent __func__, callingUid, callingPid, pid); 301b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent pid = callingPid; 3028c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent } 3038c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent 3048b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 3058b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 3068b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // the audio_in_acoustics_t parameter is ignored by get_input() 3078c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent status = mAudioPolicyManager->getInputForAttr(attr, input, session, uid, 308caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent samplingRate, format, channelMask, 3098c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent flags, selectedDeviceId, 3108c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent &inputType); 3118b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 31297bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi 31397bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi if (status == NO_ERROR) { 31497bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi // enforce permission (if any) required for each type of input 31597bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi switch (inputType) { 31697bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi case AudioPolicyInterface::API_INPUT_LEGACY: 31797bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi break; 31882db269d4797cb9909988b723d91fa2094a74b38Eric Laurent case AudioPolicyInterface::API_INPUT_TELEPHONY_RX: 31982db269d4797cb9909988b723d91fa2094a74b38Eric Laurent // FIXME: use the same permission as for remote submix for now. 32097bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi case AudioPolicyInterface::API_INPUT_MIX_CAPTURE: 321b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent if (!captureAudioOutputAllowed(pid, uid)) { 32297bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi ALOGE("getInputForAttr() permission denied: capture not allowed"); 32397bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi status = PERMISSION_DENIED; 32497bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi } 32597bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi break; 32697bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE: 32797bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi if (!modifyAudioRoutingAllowed()) { 32897bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi ALOGE("getInputForAttr() permission denied: modify audio routing not allowed"); 32997bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi status = PERMISSION_DENIED; 33097bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi } 33197bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi break; 33297bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi case AudioPolicyInterface::API_INPUT_INVALID: 33397bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi default: 33497bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d", 33597bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi (int)inputType); 33697bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi } 33797bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi } 33897bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi 33997bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi if (status != NO_ERROR) { 34097bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi if (status == PERMISSION_DENIED) { 34197bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi mAudioPolicyManager->releaseInput(*input, session); 34297bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi } 34397bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi return status; 34497bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi } 3458b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 34697bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi 3478b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 3488b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // create audio pre processors according to input source 349caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status_t status = audioPolicyEffects->addInputEffects(*input, attr->source, session); 3508b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (status != NO_ERROR && status != ALREADY_EXISTS) { 351caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGW("Failed to add effects on input %d", *input); 3528b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 3532d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 354caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_ERROR; 3552d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 3562d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 3574dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioPolicyService::startInput(audio_io_handle_t input, 3584dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 3592d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 360dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 3612d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 3622d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 3632d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 364fb66dd9f95a1168698f072c4e5c2a2cf8c49a80fEric Laurent 365232f26f8b673973ffa463f80b08b731ffacc8785Eric Laurent return mAudioPolicyManager->startInput(input, session); 3662d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 3672d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 3684dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioPolicyService::stopInput(audio_io_handle_t input, 3694dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 3702d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 371dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 3722d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 3732d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 3742d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 3752d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 3764dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent return mAudioPolicyManager->stopInput(input, session); 3772d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 3782d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 3794dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentvoid AudioPolicyService::releaseInput(audio_io_handle_t input, 3804dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 3812d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 382dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 3832d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return; 3842d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 3858b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 3868b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 3878b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 3888b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 3898b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 3908b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 3918b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // release audio processors from the input 392232f26f8b673973ffa463f80b08b731ffacc8785Eric Laurent status_t status = audioPolicyEffects->releaseInputEffects(input); 3938b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if(status != NO_ERROR) { 3948b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent ALOGW("Failed to release effects on input %d", input); 3958b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 3962d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 397b378b73dd7480b584340b8028802c9ca2d625123Eric Laurent { 398b378b73dd7480b584340b8028802c9ca2d625123Eric Laurent Mutex::Autolock _l(mLock); 399b378b73dd7480b584340b8028802c9ca2d625123Eric Laurent mAudioPolicyManager->releaseInput(input, session); 400b378b73dd7480b584340b8028802c9ca2d625123Eric Laurent } 4012d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4022d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4032d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream, 4042d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent int indexMin, 4052d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent int indexMax) 4062d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 407dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 4082d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 4092d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 4102d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (!settingsAllowed()) { 4112d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return PERMISSION_DENIED; 4122d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 413223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 4142d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return BAD_VALUE; 4152d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 4162d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 417dce54a1492c410ad0d93253b341fb33305337505Eric Laurent mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax); 4182d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_ERROR; 4192d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4202d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4212d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream, 4222d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent int index, 4232d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_devices_t device) 4242d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 425dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 4262d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 4272d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 4282d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (!settingsAllowed()) { 4292d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return PERMISSION_DENIED; 4302d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 431223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 4322d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return BAD_VALUE; 4332d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 4342d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 435dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->setStreamVolumeIndex(stream, 436dce54a1492c410ad0d93253b341fb33305337505Eric Laurent index, 437dce54a1492c410ad0d93253b341fb33305337505Eric Laurent device); 4382d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4392d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4402d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream, 4412d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent int *index, 4422d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_devices_t device) 4432d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 444dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 4452d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 4462d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 447223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 4482d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return BAD_VALUE; 4492d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 4502d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 451dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->getStreamVolumeIndex(stream, 452dce54a1492c410ad0d93253b341fb33305337505Eric Laurent index, 453dce54a1492c410ad0d93253b341fb33305337505Eric Laurent device); 4542d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4552d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4562d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentuint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream) 4572d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 458223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 459b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return 0; 460dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 461dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 4622d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return 0; 4632d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 464dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->getStrategyForStream(stream); 4652d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4662d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4672d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent//audio policy: use audio_device_t appropriately 4682d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4692d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentaudio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream) 4702d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 471223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 472b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_DEVICE_NONE; 473dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 474dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 475b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_DEVICE_NONE; 4762d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 477dfb9f3b053fa8ff7e622783a2040953442c44700Haynes Mathew George Mutex::Autolock _l(mLock); 478dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->getDevicesForStream(stream); 4792d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4802d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4812d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentaudio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc) 4822d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 4832d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent // FIXME change return type to status_t, and return NO_INIT here 484dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 4852d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return 0; 4862d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 4872d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 488dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->getOutputForEffect(desc); 4892d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4902d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4912d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc, 4922d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_io_handle_t io, 4932d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent uint32_t strategy, 494d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten audio_session_t session, 4952d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent int id) 4962d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 497dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 4982d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 4992d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 500bab7bf46e15f7e2e304081c5cc56f8d58f5f09f3Haynes Mathew George Mutex::Autolock _l(mEffectsLock); 501dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id); 5022d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5032d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 5042d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::unregisterEffect(int id) 5052d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 506dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 5072d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 5082d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 509bab7bf46e15f7e2e304081c5cc56f8d58f5f09f3Haynes Mathew George Mutex::Autolock _l(mEffectsLock); 510dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->unregisterEffect(id); 5112d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5122d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 5132d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::setEffectEnabled(int id, bool enabled) 5142d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 515dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 5162d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 5172d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 518bab7bf46e15f7e2e304081c5cc56f8d58f5f09f3Haynes Mathew George Mutex::Autolock _l(mEffectsLock); 519dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->setEffectEnabled(id, enabled); 5202d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5212d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 5222d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentbool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 5232d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 524223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 525b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 526dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 527dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 528b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 5292d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 5302d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 531dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->isStreamActive(stream, inPastMs); 5322d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5332d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 5342d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentbool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 5352d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 536223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 537b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 538dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 539dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 540b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 5412d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 5422d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 543dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs); 5442d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5452d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 5462d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentbool AudioPolicyService::isSourceActive(audio_source_t source) const 5472d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 548dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 5492d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return false; 5502d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 5512d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 552dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->isSourceActive(source); 5532d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5542d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 555d848eb48c121c119e8ba7583efc75415fe102570Glenn Kastenstatus_t AudioPolicyService::queryDefaultPreProcessing(audio_session_t audioSession, 5562d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent effect_descriptor_t *descriptors, 5572d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent uint32_t *count) 5582d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 559dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 5602d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent *count = 0; 5612d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 5622d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 5638b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 5648b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 5658b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 5668b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 5678b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 5688b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects == 0) { 5698b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent *count = 0; 5708b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent return NO_INIT; 5718b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 572232f26f8b673973ffa463f80b08b731ffacc8785Eric Laurent return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count); 5732d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5742d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 5752d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentbool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info) 5762d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 577dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 578dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("mAudioPolicyManager == NULL"); 5792d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return false; 5802d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 5812ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung Mutex::Autolock _l(mLock); 582bab7bf46e15f7e2e304081c5cc56f8d58f5f09f3Haynes Mathew George Mutex::Autolock _le(mEffectsLock); // isOffloadSupported queries for 583bab7bf46e15f7e2e304081c5cc56f8d58f5f09f3Haynes Mathew George // non-offloadable effects 584dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->isOffloadSupported(info); 5852d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5862d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 5876a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurentstatus_t AudioPolicyService::listAudioPorts(audio_port_role_t role, 5886a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent audio_port_type_t type, 589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *num_ports, 5906a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent struct audio_port *ports, 5916a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent unsigned int *generation) 592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 5936a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent Mutex::Autolock _l(mLock); 5946a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent if (mAudioPolicyManager == NULL) { 5956a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return NO_INIT; 5966a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent } 5976a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent 5986a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation); 599203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 600203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 6016a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurentstatus_t AudioPolicyService::getAudioPort(struct audio_port *port) 602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 6036a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent Mutex::Autolock _l(mLock); 6046a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent if (mAudioPolicyManager == NULL) { 6056a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return NO_INIT; 6066a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent } 6076a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent 6086a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return mAudioPolicyManager->getAudioPort(port); 609203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 610203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 6116a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurentstatus_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch, 6126a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent audio_patch_handle_t *handle) 613203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 6146a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent Mutex::Autolock _l(mLock); 6155284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent if(!modifyAudioRoutingAllowed()) { 6165284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent return PERMISSION_DENIED; 6175284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent } 6186a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent if (mAudioPolicyManager == NULL) { 6196a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return NO_INIT; 6206a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent } 6216a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return mAudioPolicyManager->createAudioPatch(patch, handle, 6226a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent IPCThreadState::self()->getCallingUid()); 623203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 624203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 6256a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurentstatus_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle) 626203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 6276a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent Mutex::Autolock _l(mLock); 6285284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent if(!modifyAudioRoutingAllowed()) { 6295284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent return PERMISSION_DENIED; 6305284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent } 6316a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent if (mAudioPolicyManager == NULL) { 6326a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return NO_INIT; 6336a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent } 6346a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent 6356a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return mAudioPolicyManager->releaseAudioPatch(handle, 6366a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent IPCThreadState::self()->getCallingUid()); 637203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 638203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 639203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurentstatus_t AudioPolicyService::listAudioPatches(unsigned int *num_patches, 6406a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent struct audio_patch *patches, 6416a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent unsigned int *generation) 642203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 6436a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent Mutex::Autolock _l(mLock); 6446a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent if (mAudioPolicyManager == NULL) { 6456a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return NO_INIT; 6466a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent } 6476a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent 6486a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation); 649203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 650203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 6516a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurentstatus_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config) 652203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 6536a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent Mutex::Autolock _l(mLock); 6545284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent if(!modifyAudioRoutingAllowed()) { 6555284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent return PERMISSION_DENIED; 6565284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent } 6576a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent if (mAudioPolicyManager == NULL) { 6586a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return NO_INIT; 6596a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent } 6606a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent 6616a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return mAudioPolicyManager->setAudioPortConfig(config); 662203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 6632d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 664df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurentstatus_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session, 665df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t *ioHandle, 666df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t *device) 667df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{ 6681baa0a2040448e90edb135591b784f6ed6509755Andy Hung Mutex::Autolock _l(mLock); 669df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (mAudioPolicyManager == NULL) { 670df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_INIT; 671df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 672df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 673df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device); 674df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent} 675df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 676df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurentstatus_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session) 677df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{ 6781baa0a2040448e90edb135591b784f6ed6509755Andy Hung Mutex::Autolock _l(mLock); 679df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (mAudioPolicyManager == NULL) { 680df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_INIT; 681df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 682df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 683df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return mAudioPolicyManager->releaseSoundTriggerSession(session); 684df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent} 685df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 686baac183f3808d7b68f184647a97bd381620415feEric Laurentstatus_t AudioPolicyService::registerPolicyMixes(Vector<AudioMix> mixes, bool registration) 687baac183f3808d7b68f184647a97bd381620415feEric Laurent{ 688baac183f3808d7b68f184647a97bd381620415feEric Laurent Mutex::Autolock _l(mLock); 689baac183f3808d7b68f184647a97bd381620415feEric Laurent if(!modifyAudioRoutingAllowed()) { 690baac183f3808d7b68f184647a97bd381620415feEric Laurent return PERMISSION_DENIED; 691baac183f3808d7b68f184647a97bd381620415feEric Laurent } 692baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mAudioPolicyManager == NULL) { 693baac183f3808d7b68f184647a97bd381620415feEric Laurent return NO_INIT; 694baac183f3808d7b68f184647a97bd381620415feEric Laurent } 695baac183f3808d7b68f184647a97bd381620415feEric Laurent if (registration) { 696baac183f3808d7b68f184647a97bd381620415feEric Laurent return mAudioPolicyManager->registerPolicyMixes(mixes); 697baac183f3808d7b68f184647a97bd381620415feEric Laurent } else { 698baac183f3808d7b68f184647a97bd381620415feEric Laurent return mAudioPolicyManager->unregisterPolicyMixes(mixes); 699baac183f3808d7b68f184647a97bd381620415feEric Laurent } 700baac183f3808d7b68f184647a97bd381620415feEric Laurent} 701baac183f3808d7b68f184647a97bd381620415feEric Laurent 702554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioPolicyService::startAudioSource(const struct audio_port_config *source, 703554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const audio_attributes_t *attributes, 704554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t *handle) 705554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{ 706554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Mutex::Autolock _l(mLock); 707554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (mAudioPolicyManager == NULL) { 708554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_INIT; 709554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 710554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 711d60560af7cb559762593161c8202459cc01fb0f5Eric Laurent return mAudioPolicyManager->startAudioSource(source, attributes, handle, 712d60560af7cb559762593161c8202459cc01fb0f5Eric Laurent IPCThreadState::self()->getCallingUid()); 713554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent} 714554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 715554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle) 716554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{ 717554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Mutex::Autolock _l(mLock); 718554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (mAudioPolicyManager == NULL) { 719554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_INIT; 720554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 721554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 722554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return mAudioPolicyManager->stopAudioSource(handle); 723554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent} 724554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 7252ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hungstatus_t AudioPolicyService::setMasterMono(bool mono) 7262ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung{ 7272ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (mAudioPolicyManager == NULL) { 7282ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return NO_INIT; 7292ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 7302ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (!settingsAllowed()) { 7312ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return PERMISSION_DENIED; 7322ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 7332ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung Mutex::Autolock _l(mLock); 7342ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return mAudioPolicyManager->setMasterMono(mono); 7352ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung} 7362ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 7372ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hungstatus_t AudioPolicyService::getMasterMono(bool *mono) 7382ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung{ 7392ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung if (mAudioPolicyManager == NULL) { 7402ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return NO_INIT; 7412ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung } 7422ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung Mutex::Autolock _l(mLock); 7432ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung return mAudioPolicyManager->getMasterMono(mono); 7442ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung} 7452ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung 7462d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent}; // namespace android 747