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 792d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent // TODO: check if it is more appropriate to do it in platform specific policy manager 802d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent AudioSystem::setMode(state); 812d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 822d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 83dce54a1492c410ad0d93253b341fb33305337505Eric Laurent mAudioPolicyManager->setPhoneState(state); 84bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent mPhoneState = state; 852d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_ERROR; 862d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 872d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 88bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurentaudio_mode_t AudioPolicyService::getPhoneState() 89bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent{ 90bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent Mutex::Autolock _l(mLock); 91bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent return mPhoneState; 92bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent} 93bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent 942d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage, 952d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_policy_forced_cfg_t config) 962d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 97dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 982d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 992d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1002d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (!settingsAllowed()) { 1012d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return PERMISSION_DENIED; 1022d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1032d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) { 1042d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return BAD_VALUE; 1052d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1062d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) { 1072d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return BAD_VALUE; 1082d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1092d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("setForceUse()"); 1102d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 111dce54a1492c410ad0d93253b341fb33305337505Eric Laurent mAudioPolicyManager->setForceUse(usage, config); 1122d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_ERROR; 1132d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 1142d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 1152d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentaudio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage) 1162d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 117dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 1182d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return AUDIO_POLICY_FORCE_NONE; 1192d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1202d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) { 1212d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return AUDIO_POLICY_FORCE_NONE; 1222d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 123dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->getForceUse(usage); 1242d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 1252d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 1262d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentaudio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream, 1272d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent uint32_t samplingRate, 1282d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_format_t format, 1292d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_channel_mask_t channelMask, 1302d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_output_flags_t flags, 1312d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent const audio_offload_info_t *offloadInfo) 1322d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 133223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 134b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_IO_HANDLE_NONE; 135dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 136dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 137b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_IO_HANDLE_NONE; 1382d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1392d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("getOutput()"); 1402d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 141dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->getOutput(stream, samplingRate, 1422d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent format, channelMask, flags, offloadInfo); 1432d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 1442d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 145e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentstatus_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr, 146e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_io_handle_t *output, 147e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session, 148e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t *stream, 1498c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 150e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent uint32_t samplingRate, 151e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_format_t format, 152e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_channel_mask_t channelMask, 153e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_output_flags_t flags, 154466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId, 155e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent const audio_offload_info_t *offloadInfo) 1565bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi{ 1575bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi if (mAudioPolicyManager == NULL) { 158e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent return NO_INIT; 1595bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi } 1605bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi ALOGV("getOutput()"); 1615bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi Mutex::Autolock _l(mLock); 1628c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent 1638c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent // if the caller is us, trust the specified uid 1648c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent if (IPCThreadState::self()->getCallingPid() != getpid_cached || uid == (uid_t)-1) { 1658c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t newclientUid = IPCThreadState::self()->getCallingUid(); 1668c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent if (uid != (uid_t)-1 && uid != newclientUid) { 1678c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent ALOGW("%s uid %d tried to pass itself off as %d", __FUNCTION__, newclientUid, uid); 1688c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent } 1698c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid = newclientUid; 1708c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent } 1718c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, samplingRate, 172466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean format, channelMask, flags, selectedDeviceId, offloadInfo); 1735bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi} 1745bd3f38638acab633d181359cc9ec27b80f84d43Jean-Michel Trivi 1752d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::startOutput(audio_io_handle_t output, 1762d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_stream_type_t stream, 177e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 1782d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 179dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_CNT) { 180dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent return BAD_VALUE; 181dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 182dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 1832d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 1842d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 1852d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("startOutput()"); 1868b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 1878b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 1888b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 1898b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 1908b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 1918b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 1928b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // create audio processors according to stream 1938b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session); 1948b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (status != NO_ERROR && status != ALREADY_EXISTS) { 1958b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent ALOGW("Failed to add effects on session %d", session); 1968b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 197ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu } 1988b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 199dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->startOutput(output, stream, session); 2002d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 2012d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 2022d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::stopOutput(audio_io_handle_t output, 2032d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_stream_type_t stream, 204e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 2052d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 206dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_CNT) { 207dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent return BAD_VALUE; 208dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 209dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 2102d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 2112d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 2122d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("stopOutput()"); 2132d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent mOutputCommandThread->stopOutputCommand(output, stream, session); 2142d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_ERROR; 2152d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 2162d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 2172d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::doStopOutput(audio_io_handle_t output, 2182d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_stream_type_t stream, 219e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 2202d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 2212d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("doStopOutput from tid %d", gettid()); 2228b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 2238b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 2248b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 2258b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 2268b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 2278b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 2288b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // release audio processors from the stream 2298b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session); 2308b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (status != NO_ERROR && status != ALREADY_EXISTS) { 2318b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent ALOGW("Failed to release effects on session %d", session); 2328b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 233ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu } 2348b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 235dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->stopOutput(output, stream, session); 2362d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 2372d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 238e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentvoid AudioPolicyService::releaseOutput(audio_io_handle_t output, 239e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 240e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 2412d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 242dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 2432d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return; 2442d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 2452d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("releaseOutput()"); 246e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent mOutputCommandThread->releaseOutputCommand(output, stream, session); 2472d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 2482d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 249e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentvoid AudioPolicyService::doReleaseOutput(audio_io_handle_t output, 250e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_stream_type_t stream, 251e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent audio_session_t session) 2522d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 2532d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent ALOGV("doReleaseOutput from tid %d", gettid()); 2542d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 255e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent mAudioPolicyManager->releaseOutput(output, stream, session); 2562d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 2572d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 258caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurentstatus_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr, 259caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_io_handle_t *input, 260caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_session_t session, 2618c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t uid, 262caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent uint32_t samplingRate, 263caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_format_t format, 264caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent audio_channel_mask_t channelMask, 265466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_input_flags_t flags, 266466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean audio_port_handle_t selectedDeviceId) 2672d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 268dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 269caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_INIT; 2702d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 2712d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent // already checked by client, but double-check in case the client wrapper is bypassed 272caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent if (attr->source >= AUDIO_SOURCE_CNT && attr->source != AUDIO_SOURCE_HOTWORD && 273caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent attr->source != AUDIO_SOURCE_FM_TUNER) { 274caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 2752d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 2762d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 277ab300c8cbf5df98fddca39e8d1698b0307432152Eric Laurent if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) { 278caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return BAD_VALUE; 2792d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 2808b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 281caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status_t status; 28297bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi AudioPolicyInterface::input_type_t inputType; 2838c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent // if the caller is us, trust the specified uid 2848c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent if (IPCThreadState::self()->getCallingPid() != getpid_cached || uid == (uid_t)-1) { 2858c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid_t newclientUid = IPCThreadState::self()->getCallingUid(); 2868c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent if (uid != (uid_t)-1 && uid != newclientUid) { 2878c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent ALOGW("%s uid %d tried to pass itself off as %d", __FUNCTION__, newclientUid, uid); 2888c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent } 2898c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent uid = newclientUid; 2908c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent } 2918c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent 2928b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 2938b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 2948b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // the audio_in_acoustics_t parameter is ignored by get_input() 2958c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent status = mAudioPolicyManager->getInputForAttr(attr, input, session, uid, 296caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent samplingRate, format, channelMask, 2978c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent flags, selectedDeviceId, 2988c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent &inputType); 2998b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 30097bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi 30197bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi if (status == NO_ERROR) { 30297bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi // enforce permission (if any) required for each type of input 30397bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi switch (inputType) { 30497bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi case AudioPolicyInterface::API_INPUT_LEGACY: 30597bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi break; 30682db269d4797cb9909988b723d91fa2094a74b38Eric Laurent case AudioPolicyInterface::API_INPUT_TELEPHONY_RX: 30782db269d4797cb9909988b723d91fa2094a74b38Eric Laurent // FIXME: use the same permission as for remote submix for now. 30897bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi case AudioPolicyInterface::API_INPUT_MIX_CAPTURE: 30997bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi if (!captureAudioOutputAllowed()) { 31097bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi ALOGE("getInputForAttr() permission denied: capture not allowed"); 31197bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi status = PERMISSION_DENIED; 31297bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi } 31397bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi break; 31497bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE: 31597bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi if (!modifyAudioRoutingAllowed()) { 31697bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi ALOGE("getInputForAttr() permission denied: modify audio routing not allowed"); 31797bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi status = PERMISSION_DENIED; 31897bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi } 31997bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi break; 32097bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi case AudioPolicyInterface::API_INPUT_INVALID: 32197bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi default: 32297bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d", 32397bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi (int)inputType); 32497bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi } 32597bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi } 32697bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi 32797bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi if (status != NO_ERROR) { 32897bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi if (status == PERMISSION_DENIED) { 32997bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi mAudioPolicyManager->releaseInput(*input, session); 33097bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi } 33197bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi return status; 33297bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi } 3338b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 33497bb33f58d742539f3382583d7978fca71ffa2d5Jean-Michel Trivi 3358b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 3368b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // create audio pre processors according to input source 337caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent status_t status = audioPolicyEffects->addInputEffects(*input, attr->source, session); 3388b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (status != NO_ERROR && status != ALREADY_EXISTS) { 339caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent ALOGW("Failed to add effects on input %d", *input); 3408b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 3412d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 342caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent return NO_ERROR; 3432d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 3442d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 3454dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioPolicyService::startInput(audio_io_handle_t input, 3464dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 3472d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 348dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 3492d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 3502d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 3512d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 3522d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 3534dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent return mAudioPolicyManager->startInput(input, session); 3542d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 3552d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 3564dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioPolicyService::stopInput(audio_io_handle_t input, 3574dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 3582d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 359dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 3602d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 3612d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 3622d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 3632d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 3644dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent return mAudioPolicyManager->stopInput(input, session); 3652d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 3662d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 3674dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentvoid AudioPolicyService::releaseInput(audio_io_handle_t input, 3684dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent audio_session_t session) 3692d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 370dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 3712d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return; 3722d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 3738b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 3748b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 3758b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 3768b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent mAudioPolicyManager->releaseInput(input, session); 3778b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 3788b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 3798b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects != 0) { 3808b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent // release audio processors from the input 3818b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent status_t status = audioPolicyEffects->releaseInputEffects(input); 3828b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if(status != NO_ERROR) { 3838b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent ALOGW("Failed to release effects on input %d", input); 3848b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 3852d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 3862d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 3872d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 3882d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream, 3892d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent int indexMin, 3902d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent int indexMax) 3912d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 392dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 3932d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 3942d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 3952d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (!settingsAllowed()) { 3962d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return PERMISSION_DENIED; 3972d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 398223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 3992d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return BAD_VALUE; 4002d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 4012d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 402dce54a1492c410ad0d93253b341fb33305337505Eric Laurent mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax); 4032d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_ERROR; 4042d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4052d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4062d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream, 4072d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent int index, 4082d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_devices_t device) 4092d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 410dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 4112d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 4122d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 4132d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent if (!settingsAllowed()) { 4142d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return PERMISSION_DENIED; 4152d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 416223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 4172d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return BAD_VALUE; 4182d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 4192d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 420dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->setStreamVolumeIndex(stream, 421dce54a1492c410ad0d93253b341fb33305337505Eric Laurent index, 422dce54a1492c410ad0d93253b341fb33305337505Eric Laurent device); 4232d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4242d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4252d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream, 4262d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent int *index, 4272d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_devices_t device) 4282d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 429dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 4302d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 4312d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 432223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 4332d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return BAD_VALUE; 4342d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 4352d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 436dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->getStreamVolumeIndex(stream, 437dce54a1492c410ad0d93253b341fb33305337505Eric Laurent index, 438dce54a1492c410ad0d93253b341fb33305337505Eric Laurent device); 4392d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4402d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4412d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentuint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream) 4422d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 443223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 444b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return 0; 445dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 446dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 4472d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return 0; 4482d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 449dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->getStrategyForStream(stream); 4502d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4512d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4522d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent//audio policy: use audio_device_t appropriately 4532d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4542d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentaudio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream) 4552d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 456223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 457b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_DEVICE_NONE; 458dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 459dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 460b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return AUDIO_DEVICE_NONE; 4612d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 462dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->getDevicesForStream(stream); 4632d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4642d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4652d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentaudio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc) 4662d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 4672d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent // FIXME change return type to status_t, and return NO_INIT here 468dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 4692d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return 0; 4702d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 4712d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 472dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->getOutputForEffect(desc); 4732d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4742d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4752d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc, 4762d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent audio_io_handle_t io, 4772d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent uint32_t strategy, 4782d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent int session, 4792d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent int id) 4802d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 481dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 4822d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 4832d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 484dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id); 4852d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4862d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4872d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::unregisterEffect(int id) 4882d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 489dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 4902d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 4912d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 492dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->unregisterEffect(id); 4932d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 4942d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 4952d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::setEffectEnabled(int id, bool enabled) 4962d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 497dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 4982d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 4992d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 500dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->setEffectEnabled(id, enabled); 5012d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5022d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 5032d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentbool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const 5042d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 505223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 506b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 507dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 508dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 509b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 5102d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 5112d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 512dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->isStreamActive(stream, inPastMs); 5132d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5142d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 5152d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentbool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const 5162d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 517223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { 518b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 519dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent } 520dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 521b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent return false; 5222d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 5232d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 524dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs); 5252d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5262d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 5272d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentbool AudioPolicyService::isSourceActive(audio_source_t source) const 5282d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 529dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 5302d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return false; 5312d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 5322d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent Mutex::Autolock _l(mLock); 533dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->isSourceActive(source); 5342d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5352d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 5362d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentstatus_t AudioPolicyService::queryDefaultPreProcessing(int audioSession, 5372d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent effect_descriptor_t *descriptors, 5382d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent uint32_t *count) 5392d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 540dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 5412d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent *count = 0; 5422d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return NO_INIT; 5432d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 5448b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent sp<AudioPolicyEffects>audioPolicyEffects; 5458b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent { 5468b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent Mutex::Autolock _l(mLock); 5478b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent audioPolicyEffects = mAudioPolicyEffects; 5488b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 5498b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent if (audioPolicyEffects == 0) { 5508b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent *count = 0; 5518b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent return NO_INIT; 5528b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent } 5538b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count); 5542d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5552d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 5562d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurentbool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info) 5572d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent{ 558dce54a1492c410ad0d93253b341fb33305337505Eric Laurent if (mAudioPolicyManager == NULL) { 559dce54a1492c410ad0d93253b341fb33305337505Eric Laurent ALOGV("mAudioPolicyManager == NULL"); 5602d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent return false; 5612d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent } 5622d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 563dce54a1492c410ad0d93253b341fb33305337505Eric Laurent return mAudioPolicyManager->isOffloadSupported(info); 5642d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent} 5652d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 5666a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurentstatus_t AudioPolicyService::listAudioPorts(audio_port_role_t role, 5676a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent audio_port_type_t type, 568203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent unsigned int *num_ports, 5696a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent struct audio_port *ports, 5706a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent unsigned int *generation) 571203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 5726a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent Mutex::Autolock _l(mLock); 5736a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent if (mAudioPolicyManager == NULL) { 5746a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return NO_INIT; 5756a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent } 5766a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent 5776a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation); 578203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 579203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 5806a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurentstatus_t AudioPolicyService::getAudioPort(struct audio_port *port) 581203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 5826a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent Mutex::Autolock _l(mLock); 5836a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent if (mAudioPolicyManager == NULL) { 5846a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return NO_INIT; 5856a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent } 5866a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent 5876a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return mAudioPolicyManager->getAudioPort(port); 588203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 589203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 5906a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurentstatus_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch, 5916a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent audio_patch_handle_t *handle) 592203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 5936a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent Mutex::Autolock _l(mLock); 5945284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent if(!modifyAudioRoutingAllowed()) { 5955284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent return PERMISSION_DENIED; 5965284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent } 5976a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent if (mAudioPolicyManager == NULL) { 5986a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return NO_INIT; 5996a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent } 6006a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return mAudioPolicyManager->createAudioPatch(patch, handle, 6016a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent IPCThreadState::self()->getCallingUid()); 602203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 603203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 6046a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurentstatus_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle) 605203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 6066a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent Mutex::Autolock _l(mLock); 6075284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent if(!modifyAudioRoutingAllowed()) { 6085284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent return PERMISSION_DENIED; 6095284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent } 6106a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent if (mAudioPolicyManager == NULL) { 6116a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return NO_INIT; 6126a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent } 6136a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent 6146a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return mAudioPolicyManager->releaseAudioPatch(handle, 6156a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent IPCThreadState::self()->getCallingUid()); 616203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 617203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 618203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurentstatus_t AudioPolicyService::listAudioPatches(unsigned int *num_patches, 6196a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent struct audio_patch *patches, 6206a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent unsigned int *generation) 621203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 6226a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent Mutex::Autolock _l(mLock); 6236a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent if (mAudioPolicyManager == NULL) { 6246a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return NO_INIT; 6256a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent } 6266a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent 6276a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation); 628203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 629203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent 6306a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurentstatus_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config) 631203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent{ 6326a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent Mutex::Autolock _l(mLock); 6335284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent if(!modifyAudioRoutingAllowed()) { 6345284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent return PERMISSION_DENIED; 6355284ed53c14cd4d15bd793000ede7166d143e69aEric Laurent } 6366a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent if (mAudioPolicyManager == NULL) { 6376a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return NO_INIT; 6386a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent } 6396a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent 6406a94d69dc4f32abb53c466a96f905bb199be6417Eric Laurent return mAudioPolicyManager->setAudioPortConfig(config); 641203b1a18a806e2c56c701aac49cda963bccfad5bEric Laurent} 6422d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent 643df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurentstatus_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session, 644df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_io_handle_t *ioHandle, 645df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent audio_devices_t *device) 646df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{ 647df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (mAudioPolicyManager == NULL) { 648df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_INIT; 649df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 650df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 651df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device); 652df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent} 653df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 654df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurentstatus_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session) 655df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{ 656df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent if (mAudioPolicyManager == NULL) { 657df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return NO_INIT; 658df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent } 659df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 660df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent return mAudioPolicyManager->releaseSoundTriggerSession(session); 661df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent} 662df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent 663baac183f3808d7b68f184647a97bd381620415feEric Laurentstatus_t AudioPolicyService::registerPolicyMixes(Vector<AudioMix> mixes, bool registration) 664baac183f3808d7b68f184647a97bd381620415feEric Laurent{ 665baac183f3808d7b68f184647a97bd381620415feEric Laurent Mutex::Autolock _l(mLock); 666baac183f3808d7b68f184647a97bd381620415feEric Laurent if(!modifyAudioRoutingAllowed()) { 667baac183f3808d7b68f184647a97bd381620415feEric Laurent return PERMISSION_DENIED; 668baac183f3808d7b68f184647a97bd381620415feEric Laurent } 669baac183f3808d7b68f184647a97bd381620415feEric Laurent if (mAudioPolicyManager == NULL) { 670baac183f3808d7b68f184647a97bd381620415feEric Laurent return NO_INIT; 671baac183f3808d7b68f184647a97bd381620415feEric Laurent } 672baac183f3808d7b68f184647a97bd381620415feEric Laurent if (registration) { 673baac183f3808d7b68f184647a97bd381620415feEric Laurent return mAudioPolicyManager->registerPolicyMixes(mixes); 674baac183f3808d7b68f184647a97bd381620415feEric Laurent } else { 675baac183f3808d7b68f184647a97bd381620415feEric Laurent return mAudioPolicyManager->unregisterPolicyMixes(mixes); 676baac183f3808d7b68f184647a97bd381620415feEric Laurent } 677baac183f3808d7b68f184647a97bd381620415feEric Laurent} 678baac183f3808d7b68f184647a97bd381620415feEric Laurent 679554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioPolicyService::startAudioSource(const struct audio_port_config *source, 680554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent const audio_attributes_t *attributes, 681554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent audio_io_handle_t *handle) 682554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{ 683554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Mutex::Autolock _l(mLock); 684554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (mAudioPolicyManager == NULL) { 685554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_INIT; 686554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 687554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 688554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return mAudioPolicyManager->startAudioSource(source, attributes, handle); 689554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent} 690554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 691554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle) 692554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{ 693554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent Mutex::Autolock _l(mLock); 694554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent if (mAudioPolicyManager == NULL) { 695554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return NO_INIT; 696554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent } 697554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 698554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent return mAudioPolicyManager->stopAudioSource(handle); 699554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent} 700554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent 7012d388eccc9dc085337c7a03a68467cbee6b809e1Eric Laurent}; // namespace android 702