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,
2378c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent                                             uid_t uid __unused,
238caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                             uint32_t samplingRate,
239caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                             audio_format_t format,
240caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent                                             audio_channel_mask_t channelMask,
241466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean                                             audio_input_flags_t flags __unused,
242466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean                                             audio_port_handle_t selectedDeviceId __unused)
243dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
244dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
245caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        return NO_INIT;
246dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
247c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent
248c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent    audio_source_t inputSource = attr->source;
249c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent
250dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    // already checked by client, but double-check in case the client wrapper is bypassed
251c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent    if (inputSource >= AUDIO_SOURCE_CNT && inputSource != AUDIO_SOURCE_HOTWORD &&
252c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent        inputSource != AUDIO_SOURCE_FM_TUNER) {
253caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        return BAD_VALUE;
254dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
255dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
256c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent    if (inputSource == AUDIO_SOURCE_DEFAULT) {
257c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent        inputSource = AUDIO_SOURCE_MIC;
258c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent    }
259c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent
260ab300c8cbf5df98fddca39e8d1698b0307432152Eric Laurent    if ((inputSource == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
261caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        return BAD_VALUE;
262dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
263dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
2648b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    sp<AudioPolicyEffects>audioPolicyEffects;
2658b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    {
2668b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        Mutex::Autolock _l(mLock);
2678b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        // the audio_in_acoustics_t parameter is ignored by get_input()
268c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent        *input = mpAudioPolicy->get_input(mpAudioPolicy, inputSource, samplingRate,
2698b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent                                             format, channelMask, (audio_in_acoustics_t) 0);
2708b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        audioPolicyEffects = mAudioPolicyEffects;
2718b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    }
272caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent    if (*input == AUDIO_IO_HANDLE_NONE) {
273caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent        return INVALID_OPERATION;
274dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
275dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
2768b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    if (audioPolicyEffects != 0) {
2778b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        // create audio pre processors according to input source
278c447ded04f11169e9b96b31cd196b2c4ffa9f31cEric Laurent        status_t status = audioPolicyEffects->addInputEffects(*input, inputSource, session);
2798b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        if (status != NO_ERROR && status != ALREADY_EXISTS) {
2808b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent            ALOGW("Failed to add effects on input %d", input);
2818b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        }
282dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
283caf7f48a0ef558689d39aafd187c1571ff4128b4Eric Laurent    return NO_ERROR;
284dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
285dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
2864dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioPolicyService::startInput(audio_io_handle_t input,
2874dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                                        audio_session_t session __unused)
288dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
289dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
290dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
291dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
292dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
293dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
294dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->start_input(mpAudioPolicy, input);
295dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
296dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
2974dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentstatus_t AudioPolicyService::stopInput(audio_io_handle_t input,
2984dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                                       audio_session_t session __unused)
299dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
300dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
301dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
302dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
303dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
304dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
305dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->stop_input(mpAudioPolicy, input);
306dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
307dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
3084dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurentvoid AudioPolicyService::releaseInput(audio_io_handle_t input,
3094dc680607181e6a76f4e91a39366c4f5dfb7b03eEric Laurent                                      audio_session_t session __unused)
310dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
311dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
312dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return;
313dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
314dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
3158b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    sp<AudioPolicyEffects>audioPolicyEffects;
3168b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    {
3178b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        Mutex::Autolock _l(mLock);
3188b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        mpAudioPolicy->release_input(mpAudioPolicy, input);
3198b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        audioPolicyEffects = mAudioPolicyEffects;
3208b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    }
3218b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    if (audioPolicyEffects != 0) {
3228b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        // release audio processors from the input
3238b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        status_t status = audioPolicyEffects->releaseInputEffects(input);
3248b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        if(status != NO_ERROR) {
3258b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent            ALOGW("Failed to release effects on input %d", input);
3268b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        }
327dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
328dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
329dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
330dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
331dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                            int indexMin,
332dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                            int indexMax)
333dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
334dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
335dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
336dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
337dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!settingsAllowed()) {
338dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
339dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
340223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
341dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
342dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
343dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
344dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    mpAudioPolicy->init_stream_volume(mpAudioPolicy, stream, indexMin, indexMax);
345dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return NO_ERROR;
346dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
347dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
348dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
349dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  int index,
350dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  audio_devices_t device)
351dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
352dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
353dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
354dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
355dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (!settingsAllowed()) {
356dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return PERMISSION_DENIED;
357dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
358223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
359dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
360dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
361dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
362dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy->set_stream_volume_index_for_device) {
363dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return mpAudioPolicy->set_stream_volume_index_for_device(mpAudioPolicy,
364dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                stream,
365dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                index,
366dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                device);
367dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    } else {
368dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return mpAudioPolicy->set_stream_volume_index(mpAudioPolicy, stream, index);
369dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
370dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
371dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
372dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
373dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  int *index,
374dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                  audio_devices_t device)
375dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
376dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
377dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
378dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
379223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
380dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return BAD_VALUE;
381dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
382dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
383dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy->get_stream_volume_index_for_device) {
384dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return mpAudioPolicy->get_stream_volume_index_for_device(mpAudioPolicy,
385dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                stream,
386dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                index,
387dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                                device);
388dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    } else {
389dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return mpAudioPolicy->get_stream_volume_index(mpAudioPolicy, stream, index);
390dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
391dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
392dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
393dce54a1492c410ad0d93253b341fb33305337505Eric Laurentuint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
394dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
395223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
396b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return 0;
397dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent    }
398dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
399dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
400dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
401dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_strategy_for_stream(mpAudioPolicy, stream);
402dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
403dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
404dce54a1492c410ad0d93253b341fb33305337505Eric Laurent//audio policy: use audio_device_t appropriately
405dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
406dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
407dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
408223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
409b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return AUDIO_DEVICE_NONE;
410dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent    }
411dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
412b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return AUDIO_DEVICE_NONE;
413dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
414dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_devices_for_stream(mpAudioPolicy, stream);
415dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
416dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
417dce54a1492c410ad0d93253b341fb33305337505Eric Laurentaudio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
418dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
419dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    // FIXME change return type to status_t, and return NO_INIT here
420dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
421dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return 0;
422dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
423dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
424dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->get_output_for_effect(mpAudioPolicy, desc);
425dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
426dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
427dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
428dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                audio_io_handle_t io,
429dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                uint32_t strategy,
430dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                int session,
431dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                int id)
432dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
433dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
434dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
435dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
436dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->register_effect(mpAudioPolicy, desc, io, strategy, session, id);
437dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
438dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
439dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::unregisterEffect(int id)
440dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
441dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
442dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
443dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
444dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->unregister_effect(mpAudioPolicy, id);
445dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
446dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
447dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
448dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
449dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
450dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
451dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
452dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->set_effect_enabled(mpAudioPolicy, id, enabled);
453dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
454dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
455dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
456dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
457223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
458b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return false;
459dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent    }
460dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
461b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return false;
462dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
463dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
464dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->is_stream_active(mpAudioPolicy, stream, inPastMs);
465dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
466dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
467dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
468dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
469223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
470b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return false;
471dea1541fc0042abf05674b19c2f94ca086945dfdEric Laurent    }
472dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
473b1322c78b035c9f47ebe57a39799d7a0e13bf57fEric Laurent        return false;
474dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
475dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
476dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->is_stream_active_remotely(mpAudioPolicy, stream, inPastMs);
477dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
478dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
479dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isSourceActive(audio_source_t source) const
480dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
481dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
482dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return false;
483dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
484dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy->is_source_active == 0) {
485dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return false;
486dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
487dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    Mutex::Autolock _l(mLock);
488dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->is_source_active(mpAudioPolicy, source);
489dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
490dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
491dce54a1492c410ad0d93253b341fb33305337505Eric Laurentstatus_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
492dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                       effect_descriptor_t *descriptors,
493dce54a1492c410ad0d93253b341fb33305337505Eric Laurent                                                       uint32_t *count)
494dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
495dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
496dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        *count = 0;
497dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return NO_INIT;
498dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
4998b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    sp<AudioPolicyEffects>audioPolicyEffects;
5008b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    {
5018b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        Mutex::Autolock _l(mLock);
5028b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        audioPolicyEffects = mAudioPolicyEffects;
5038b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    }
5048b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    if (audioPolicyEffects == 0) {
5058b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        *count = 0;
5068b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent        return NO_INIT;
5078b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    }
5088b1e80bf1e9f214feea219cfe981ba533b806003Eric Laurent    return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
509dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
510dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
511dce54a1492c410ad0d93253b341fb33305337505Eric Laurentbool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
512dce54a1492c410ad0d93253b341fb33305337505Eric Laurent{
513dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy == NULL) {
514dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        ALOGV("mpAudioPolicy == NULL");
515dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return false;
516dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
517dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
518dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    if (mpAudioPolicy->is_offload_supported == NULL) {
519dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        ALOGV("HAL does not implement is_offload_supported");
520dce54a1492c410ad0d93253b341fb33305337505Eric Laurent        return false;
521dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    }
522dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
523dce54a1492c410ad0d93253b341fb33305337505Eric Laurent    return mpAudioPolicy->is_offload_supported(mpAudioPolicy, &info);
524dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}
525dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
5268670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::listAudioPorts(audio_port_role_t role __unused,
5278670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent                                            audio_port_type_t type __unused,
5288670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent                                            unsigned int *num_ports,
5298670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent                                            struct audio_port *ports __unused,
5308670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent                                            unsigned int *generation __unused)
5318670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5328670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    *num_ports = 0;
5338670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5348670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5358670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5368670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::getAudioPort(struct audio_port *port __unused)
5378670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5388670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5398670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5408670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5418670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch __unused,
5428670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent        audio_patch_handle_t *handle __unused)
5438670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5448670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5458670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5468670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5478670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle __unused)
5488670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5498670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5508670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5518670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5528670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
5538670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent        struct audio_patch *patches __unused,
5548670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent        unsigned int *generation __unused)
5558670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5568670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    *num_patches = 0;
5578670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5588670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
5598670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent
5608670c31fddbeadcf9627aa970c69a823f13939ffEric Laurentstatus_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config __unused)
5618670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent{
5628670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent    return INVALID_OPERATION;
5638670c31fddbeadcf9627aa970c69a823f13939ffEric Laurent}
564dce54a1492c410ad0d93253b341fb33305337505Eric Laurent
565e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurentstatus_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
566e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              audio_io_handle_t *output,
567baac183f3808d7b68f184647a97bd381620415feEric Laurent                                              audio_session_t session __unused,
568e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              audio_stream_type_t *stream,
5698c7e6dac6f5eb38cef627dab92eac8b38513450cEric Laurent                                              uid_t uid __unused,
570e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              uint32_t samplingRate,
571e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              audio_format_t format,
572e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              audio_channel_mask_t channelMask,
573e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              audio_output_flags_t flags,
574466dc8ed6ca6b7f585104806c48613dd34e608c9Paul McLean                                              audio_port_handle_t selectedDeviceId __unused,
575e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                              const audio_offload_info_t *offloadInfo)
5767c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent{
577e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    if (attr != NULL) {
578e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        *stream = audio_attributes_to_stream_type(attr);
579e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    } else {
580e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        if (*stream == AUDIO_STREAM_DEFAULT) {
581e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent            return BAD_VALUE;
582e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        }
583e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    }
584e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    *output = getOutput(*stream, samplingRate, format, channelMask,
585e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent                                          flags, offloadInfo);
586e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    if (*output == AUDIO_IO_HANDLE_NONE) {
587e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent        return INVALID_OPERATION;
588e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    }
589e83b55dc29ca16092ba02f36f55fa6e0e37fd78cEric Laurent    return NO_ERROR;
5907c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent}
5917c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent
592223fd5c9738e9665e495904d37d4632414b68c1eEric Laurentstatus_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session __unused,
593223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent                                       audio_io_handle_t *ioHandle __unused,
594223fd5c9738e9665e495904d37d4632414b68c1eEric Laurent                                       audio_devices_t *device __unused)
595df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{
596df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    return INVALID_OPERATION;
597df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent}
598df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
599223fd5c9738e9665e495904d37d4632414b68c1eEric Laurentstatus_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session __unused)
600df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent{
601df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent    return INVALID_OPERATION;
602df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent}
6037c5b60ae8b8793b2d601ecf459807c974120331bEric Laurent
604baac183f3808d7b68f184647a97bd381620415feEric Laurentstatus_t AudioPolicyService::registerPolicyMixes(Vector<AudioMix> mixes __unused,
605baac183f3808d7b68f184647a97bd381620415feEric Laurent                                                 bool registration __unused)
606baac183f3808d7b68f184647a97bd381620415feEric Laurent{
607baac183f3808d7b68f184647a97bd381620415feEric Laurent    return INVALID_OPERATION;
608baac183f3808d7b68f184647a97bd381620415feEric Laurent}
609baac183f3808d7b68f184647a97bd381620415feEric Laurent
610554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioPolicyService::startAudioSource(const struct audio_port_config *source,
611554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent                                  const audio_attributes_t *attributes,
612554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent                                  audio_io_handle_t *handle)
613554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{
614554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    return INVALID_OPERATION;
615554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent}
616554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
617554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurentstatus_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle)
618554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent{
619554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent    return INVALID_OPERATION;
620554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent}
621554a277d4e42a3d3df3d90ba0e7dfa2d31690e32Eric Laurent
622dce54a1492c410ad0d93253b341fb33305337505Eric Laurent}; // namespace android
623