1dce54a1492c410ad0d93253b341fb33305337505Eric Laurent/*
2dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * Copyright (C) 2009 The Android Open Source Project
3dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *
4dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * you may not use this file except in compliance with the License.
6dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * You may obtain a copy of the License at
7dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *
8dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9dce54a1492c410ad0d93253b341fb33305337505Eric Laurent *
10dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * Unless required by applicable law or agreed to in writing, software
11dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * See the License for the specific language governing permissions and
14dce54a1492c410ad0d93253b341fb33305337505Eric Laurent * limitations under the License.
15dce54a1492c410ad0d93253b341fb33305337505Eric Laurent */
16dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
17dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#define LOG_TAG "AudioPolicyService"
18dce54a1492c410ad0d93253b341fb33305337505Eric Laurent//#define LOG_NDEBUG 0
19dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
20dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <utils/Log.h>
21dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include "AudioPolicyService.h"
22dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include "ServiceUtilities.h"
23dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
24dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <system/audio.h>
25dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <system/audio_policy.h>
26dce54a1492c410ad0d93253b341fb33305337505Eric Laurent#include <hardware/audio_policy.h>
27f380677f21240ffb78bcdf7c804fe0a7807fb08dEric Laurent#include <media/AudioPolicyHelper.h>
28dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
29dce54a1492c410ad0d93253b341fb33305337505Eric Laurentnamespace android {
30dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
31dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
32dce54a1492c410ad0d93253b341fb33305337505Eric Laurent// ----------------------------------------------------------------------------
33dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
34dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device,
35dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  audio_policy_dev_state_t state,
36e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                                  const char *device_address,
37e743a47f445f02a0612018fa5640301304844fbfPaul McLean                                                  const char *device_name __unused)
38dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
39dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
40dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
41dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
42dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!settingsAllowed()) {
43dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
44dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
45dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!audio_is_output_device(device) && !audio_is_input_device(device)) {
46dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
47dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
48dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
49dce54a1492c410ad0d93253b341fb33305337505Eric Laurent            state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
50dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
51dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
52dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
53dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("setDeviceConnectionState()");
54dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
55dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->set_device_connection_state(mpAudioPolicy, device,
56dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                      state, device_address);
57dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
58dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
59dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState(
60dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                              audio_devices_t device,
61dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                              const char *device_address)
62dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
63dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
64dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
65dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
66dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_device_connection_state(mpAudioPolicy, device,
67dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                      device_address);
68dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
69dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
70dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setPhoneState(audio_mode_t state)
71dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
72dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
73dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
74dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
75dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!settingsAllowed()) {
76dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
77dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
78dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (uint32_t(state) >= AUDIO_MODE_CNT) {
79dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
80dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
81dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
82dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("setPhoneState()");
83dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
84dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    // TODO: check if it is more appropriate to do it in platform specific policy manager
85dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    AudioSystem::setMode(state);
86dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
87dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
88dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mpAudioPolicy->set_phone_state(mpAudioPolicy, state);
89bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    mPhoneState = state;
90dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return NO_ERROR;
91dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
92dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
93bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurentaudio_mode_t AudioPolicyService::getPhoneState()
94bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent{
95bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    Mutex::Autolock _l(mLock);
96bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent    return mPhoneState;
97bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent}
98bb6c9a05840d924b502ce0f1868fca4881ada1edEric Laurent
99dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
100dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                         audio_policy_forced_cfg_t config)
101dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
102dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
103dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
104dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
105dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!settingsAllowed()) {
106dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
107dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
108dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
109dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
110dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
111dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
112dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
113dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
114dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("setForceUse()");
115dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
116dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mpAudioPolicy->set_force_use(mpAudioPolicy, usage, config);
117dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return NO_ERROR;
118dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
119dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
120dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage)
121dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
122dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
123dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return AUDIO_POLICY_FORCE_NONE;
124dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
125dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
126dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return AUDIO_POLICY_FORCE_NONE;
127dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
128dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_force_use(mpAudioPolicy, usage);
129dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
130dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
131dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream,
132dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    uint32_t samplingRate,
133dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    audio_format_t format,
134dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    audio_channel_mask_t channelMask,
135dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    audio_output_flags_t flags,
136dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    const audio_offload_info_t *offloadInfo)
137dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
138223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
139b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return AUDIO_IO_HANDLE_NONE;
140dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent    }
141dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
142b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return AUDIO_IO_HANDLE_NONE;
143dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
144dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("getOutput()");
145dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
146dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_output(mpAudioPolicy, stream, samplingRate,
147dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                    format, channelMask, flags, offloadInfo);
148dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
149dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
150dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::startOutput(audio_io_handle_t output,
151dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                         audio_stream_type_t stream,
152e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                         audio_session_t session)
153dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
154223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
155dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent        return BAD_VALUE;
156dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent    }
157dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
158dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
159dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
160dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("startOutput()");
161ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // create audio processors according to stream
1628b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    sp<AudioPolicyEffects>audioPolicyEffects;
1638b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    {
1648b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        Mutex::Autolock _l(mLock);
1658b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        audioPolicyEffects = mAudioPolicyEffects;
1668b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    }
1678b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    if (audioPolicyEffects != 0) {
1688b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
1698b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        if (status != NO_ERROR && status != ALREADY_EXISTS) {
1708b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent            ALOGW("Failed to add effects on session %d", session);
1718b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        }
172ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    }
173ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu
1748b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    Mutex::Autolock _l(mLock);
175dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->start_output(mpAudioPolicy, output, stream, session);
176dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
177dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
178dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::stopOutput(audio_io_handle_t output,
179dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                        audio_stream_type_t stream,
180e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                        audio_session_t session)
181dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
182223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
183dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent        return BAD_VALUE;
184dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent    }
185dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
186dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
187dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
188dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("stopOutput()");
189dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mOutputCommandThread->stopOutputCommand(output, stream, session);
190dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return NO_ERROR;
191dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
192dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
193dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t  AudioPolicyService::doStopOutput(audio_io_handle_t output,
194dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                      audio_stream_type_t stream,
195e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                      audio_session_t session)
196dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
197dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("doStopOutput from tid %d", gettid());
198ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    // release audio processors from the stream
1998b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    sp<AudioPolicyEffects>audioPolicyEffects;
2008b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    {
2018b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        Mutex::Autolock _l(mLock);
2028b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        audioPolicyEffects = mAudioPolicyEffects;
203ba2b43990a7b4f0f2c425cf6cdfc63376a45772cbryant_liu    }
2048b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    if (audioPolicyEffects != 0) {
2058b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
2068b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        if (status != NO_ERROR && status != ALREADY_EXISTS) {
2078b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent            ALOGW("Failed to release effects on session %d", session);
2088b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        }
2098b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    }
2108b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    Mutex::Autolock _l(mLock);
211dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->stop_output(mpAudioPolicy, output, stream, session);
212dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
213dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
214e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentvoid AudioPolicyService::releaseOutput(audio_io_handle_t output,
215e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                       audio_stream_type_t stream,
216e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                       audio_session_t session)
217dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
218dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
219dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return;
220dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
221dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("releaseOutput()");
222e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    mOutputCommandThread->releaseOutputCommand(output, stream, session);
223dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
224dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
225e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentvoid AudioPolicyService::doReleaseOutput(audio_io_handle_t output,
226e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                         audio_stream_type_t stream __unused,
227e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                         audio_session_t session __unused)
228dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
229dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    ALOGV("doReleaseOutput from tid %d", gettid());
230dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
231dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mpAudioPolicy->release_output(mpAudioPolicy, output);
232dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
233dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
234caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurentstatus_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
235caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                             audio_io_handle_t *input,
236caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                             audio_session_t session,
237b2379ba0a32638bae2ea0460644f68cf5a0967ceEric Laurent                                             pid_t pid __unused,
2388c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent                                             uid_t uid __unused,
239caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                             uint32_t samplingRate,
240caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                             audio_format_t format,
241caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                             audio_channel_mask_t channelMask,
242466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean                                             audio_input_flags_t flags __unused,
243466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean                                             audio_port_handle_t selectedDeviceId __unused)
244dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
245dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
246caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        return NO_INIT;
247dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
248c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent
249c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent    audio_source_t inputSource = attr->source;
250c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent
251dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    // already checked by client, but double-check in case the client wrapper is bypassed
252c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent    if (inputSource >= AUDIO_SOURCE_CNT && inputSource != AUDIO_SOURCE_HOTWORD &&
253c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent        inputSource != AUDIO_SOURCE_FM_TUNER) {
254caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        return BAD_VALUE;
255dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
256dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
257c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent    if (inputSource == AUDIO_SOURCE_DEFAULT) {
258c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent        inputSource = AUDIO_SOURCE_MIC;
259c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent    }
260c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent
261ab300c8cbf5df98fddca39e8d1698b0307432152Eric Laurent    if ((inputSource == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
262caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        return BAD_VALUE;
263dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
264dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
2658b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    sp<AudioPolicyEffects>audioPolicyEffects;
2668b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    {
2678b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        Mutex::Autolock _l(mLock);
2688b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        // the audio_in_acoustics_t parameter is ignored by get_input()
269c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent        *input = mpAudioPolicy->get_input(mpAudioPolicy, inputSource, samplingRate,
2708b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent                                             format, channelMask, (audio_in_acoustics_t) 0);
2718b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        audioPolicyEffects = mAudioPolicyEffects;
2728b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    }
273caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent    if (*input == AUDIO_IO_HANDLE_NONE) {
274caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        return INVALID_OPERATION;
275dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
276dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
2778b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    if (audioPolicyEffects != 0) {
2788b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        // create audio pre processors according to input source
279c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent        status_t status = audioPolicyEffects->addInputEffects(*input, inputSource, session);
2808b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        if (status != NO_ERROR && status != ALREADY_EXISTS) {
2818b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent            ALOGW("Failed to add effects on input %d", input);
2828b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        }
283dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
284caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent    return NO_ERROR;
285dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
286dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
2874dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioPolicyService::startInput(audio_io_handle_t input,
2884dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                                        audio_session_t session __unused)
289dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
290dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
291dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
292dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
293dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
294dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
295dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->start_input(mpAudioPolicy, input);
296dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
297dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
2984dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioPolicyService::stopInput(audio_io_handle_t input,
2994dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                                       audio_session_t session __unused)
300dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
301dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
302dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
303dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
304dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
305dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
306dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->stop_input(mpAudioPolicy, input);
307dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
308dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
3094dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentvoid AudioPolicyService::releaseInput(audio_io_handle_t input,
310232f26f8b673973ffa463f80b08b731ffacc8785Eric Laurent                                      audio_session_t session __unused)
311dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
312dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
313dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return;
314dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
315dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
3168b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    sp<AudioPolicyEffects>audioPolicyEffects;
3178b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    {
3188b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        Mutex::Autolock _l(mLock);
3198b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        mpAudioPolicy->release_input(mpAudioPolicy, input);
3208b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        audioPolicyEffects = mAudioPolicyEffects;
3218b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    }
3228b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    if (audioPolicyEffects != 0) {
3238b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        // release audio processors from the input
324232f26f8b673973ffa463f80b08b731ffacc8785Eric Laurent        status_t status = audioPolicyEffects->releaseInputEffects(input);
3258b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        if(status != NO_ERROR) {
3268b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent            ALOGW("Failed to release effects on input %d", input);
3278b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        }
328dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
329dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
330dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
331dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
332dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                            int indexMin,
333dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                            int indexMax)
334dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
335dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
336dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
337dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
338dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!settingsAllowed()) {
339dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
340dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
341223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
342dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
343dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
344dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
345dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mpAudioPolicy->init_stream_volume(mpAudioPolicy, stream, indexMin, indexMax);
346dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return NO_ERROR;
347dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
348dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
349dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
350dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  int index,
351dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  audio_devices_t device)
352dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
353dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
354dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
355dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
356dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!settingsAllowed()) {
357dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
358dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
359223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
360dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
361dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
362dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
363dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy->set_stream_volume_index_for_device) {
364dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return mpAudioPolicy->set_stream_volume_index_for_device(mpAudioPolicy,
365dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                stream,
366dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                index,
367dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                device);
368dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    } else {
369dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return mpAudioPolicy->set_stream_volume_index(mpAudioPolicy, stream, index);
370dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
371dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
372dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
373dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
374dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  int *index,
375dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  audio_devices_t device)
376dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
377dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
378dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
379dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
380223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
381dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
382dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
383dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
384dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy->get_stream_volume_index_for_device) {
385dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return mpAudioPolicy->get_stream_volume_index_for_device(mpAudioPolicy,
386dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                stream,
387dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                index,
388dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                device);
389dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    } else {
390dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return mpAudioPolicy->get_stream_volume_index(mpAudioPolicy, stream, index);
391dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
392dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
393dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
394dce54a1492c410ad0d93253b341fb33305337505Eric Laurentuint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
395dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
396223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
397b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return 0;
398dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent    }
399dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
400dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
401dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
402dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_strategy_for_stream(mpAudioPolicy, stream);
403dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
404dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
405dce54a1492c410ad0d93253b341fb33305337505Eric Laurent//audio policy: use audio_device_t appropriately
406dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
407dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
408dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
409223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
410b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return AUDIO_DEVICE_NONE;
411dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent    }
412dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
413b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return AUDIO_DEVICE_NONE;
414dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
415dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_devices_for_stream(mpAudioPolicy, stream);
416dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
417dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
418dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
419dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
420dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    // FIXME change return type to status_t, and return NO_INIT here
421dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
422dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
423dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
424dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
425dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_output_for_effect(mpAudioPolicy, desc);
426dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
427dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
428dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
429dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                audio_io_handle_t io,
430dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                uint32_t strategy,
431d848eb48c121c119e8ba7583efc75415fe102570Glenn Kasten                                audio_session_t session,
432dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                int id)
433dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
434dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
435dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
436dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
437dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->register_effect(mpAudioPolicy, desc, io, strategy, session, id);
438dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
439dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
440dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::unregisterEffect(int id)
441dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
442dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
443dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
444dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
445dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->unregister_effect(mpAudioPolicy, id);
446dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
447dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
448dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
449dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
450dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
451dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
452dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
453dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->set_effect_enabled(mpAudioPolicy, id, enabled);
454dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
455dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
456dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
457dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
458223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
459b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return false;
460dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent    }
461dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
462b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return false;
463dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
464dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
465dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->is_stream_active(mpAudioPolicy, stream, inPastMs);
466dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
467dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
468dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
469dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
470223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
471b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return false;
472dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent    }
473dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
474b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return false;
475dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
476dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
477dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->is_stream_active_remotely(mpAudioPolicy, stream, inPastMs);
478dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
479dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
480dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isSourceActive(audio_source_t source) const
481dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
482dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
483dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return false;
484dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
485dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy->is_source_active == 0) {
486dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return false;
487dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
488dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
489dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->is_source_active(mpAudioPolicy, source);
490dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
491dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
492d848eb48c121c119e8ba7583efc75415fe102570Glenn Kastenstatus_t AudioPolicyService::queryDefaultPreProcessing(audio_session_t audioSession,
493dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                       effect_descriptor_t *descriptors,
494dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                       uint32_t *count)
495dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
496dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
497dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        *count = 0;
498dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
499dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
5008b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    sp<AudioPolicyEffects>audioPolicyEffects;
5018b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    {
5028b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        Mutex::Autolock _l(mLock);
5038b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        audioPolicyEffects = mAudioPolicyEffects;
5048b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    }
5058b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    if (audioPolicyEffects == 0) {
5068b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        *count = 0;
5078b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        return NO_INIT;
5088b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    }
5098b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
510dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
511dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
512dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
513dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
514dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
515dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        ALOGV("mpAudioPolicy == NULL");
516dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return false;
517dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
518dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
519dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy->is_offload_supported == NULL) {
520dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        ALOGV("HAL does not implement is_offload_supported");
521dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return false;
522dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
523dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
524dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->is_offload_supported(mpAudioPolicy, &info);
525dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
526dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
5278670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::listAudioPorts(audio_port_role_t role __unused,
5288670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent                                            audio_port_type_t type __unused,
5298670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent                                            unsigned int *num_ports,
5308670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent                                            struct audio_port *ports __unused,
5318670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent                                            unsigned int *generation __unused)
5328670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5338670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    *num_ports = 0;
5348670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5358670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5368670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5378670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::getAudioPort(struct audio_port *port __unused)
5388670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5398670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5408670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5418670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5428670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch __unused,
5438670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent        audio_patch_handle_t *handle __unused)
5448670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5458670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5468670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5478670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5488670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle __unused)
5498670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5508670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5518670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5528670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5538670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
5548670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent        struct audio_patch *patches __unused,
5558670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent        unsigned int *generation __unused)
5568670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5578670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    *num_patches = 0;
5588670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5598670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5608670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5618670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config __unused)
5628670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5638670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5648670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
565dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
566e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentstatus_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
567e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              audio_io_handle_t *output,
568baac183f3808d7b68f184647a97bd381620415feEric Laurent                                              audio_session_t session __unused,
569e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              audio_stream_type_t *stream,
5708c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent                                              uid_t uid __unused,
571e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              uint32_t samplingRate,
572e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              audio_format_t format,
573e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              audio_channel_mask_t channelMask,
574e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              audio_output_flags_t flags,
575466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean                                              audio_port_handle_t selectedDeviceId __unused,
576e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              const audio_offload_info_t *offloadInfo)
5777c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent{
578e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    if (attr != NULL) {
579e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        *stream = audio_attributes_to_stream_type(attr);
580e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    } else {
581e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        if (*stream == AUDIO_STREAM_DEFAULT) {
582e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            return BAD_VALUE;
583e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        }
584e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    }
585e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    *output = getOutput(*stream, samplingRate, format, channelMask,
586e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                          flags, offloadInfo);
587e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    if (*output == AUDIO_IO_HANDLE_NONE) {
588e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        return INVALID_OPERATION;
589e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    }
590e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    return NO_ERROR;
5917c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent}
5927c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent
593223fd5c9738e9665e495904d37d4632414b68c1eEric Laurentstatus_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session __unused,
594223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent                                       audio_io_handle_t *ioHandle __unused,
595223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent                                       audio_devices_t *device __unused)
596df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{
597df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    return INVALID_OPERATION;
598df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent}
599df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
600223fd5c9738e9665e495904d37d4632414b68c1eEric Laurentstatus_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session __unused)
601df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{
602df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    return INVALID_OPERATION;
603df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent}
6047c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent
605baac183f3808d7b68f184647a97bd381620415feEric Laurentstatus_t AudioPolicyService::registerPolicyMixes(Vector<AudioMix> mixes __unused,
606baac183f3808d7b68f184647a97bd381620415feEric Laurent                                                 bool registration __unused)
607baac183f3808d7b68f184647a97bd381620415feEric Laurent{
608baac183f3808d7b68f184647a97bd381620415feEric Laurent    return INVALID_OPERATION;
609baac183f3808d7b68f184647a97bd381620415feEric Laurent}
610baac183f3808d7b68f184647a97bd381620415feEric Laurent
611554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioPolicyService::startAudioSource(const struct audio_port_config *source,
612554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent                                  const audio_attributes_t *attributes,
613554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent                                  audio_io_handle_t *handle)
614554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{
615554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    return INVALID_OPERATION;
616554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent}
617554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
618554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle)
619554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{
620554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    return INVALID_OPERATION;
621554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent}
622554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
6232ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hungstatus_t AudioPolicyService::setMasterMono(bool mono)
6242ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung{
6252ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung    return INVALID_OPERATION;
6262ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung}
6272ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung
6282ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hungstatus_t AudioPolicyService::getMasterMono(bool *mono)
6292ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung{
6302ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung    return INVALID_OPERATION;
6312ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung}
6322ddee19245641e86bca436dda23a0f5089bf2ab5Andy Hung
633dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}; // namespace android
634