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