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