blob: 710a905397a592ec4fede9717ce25f5ff9850321 [file] [log] [blame]
Eric Laurent2d388ec2014-03-07 13:25:54 -08001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Eric Laurentdce54a12014-03-10 12:19:46 -070017#define LOG_TAG "AudioPolicyIntefaceImpl"
Eric Laurent2d388ec2014-03-07 13:25:54 -080018//#define LOG_NDEBUG 0
19
20#include <utils/Log.h>
21#include "AudioPolicyService.h"
22#include "ServiceUtilities.h"
23
Eric Laurent2d388ec2014-03-07 13:25:54 -080024namespace android {
25
26
27// ----------------------------------------------------------------------------
28
29status_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device,
30 audio_policy_dev_state_t state,
31 const char *device_address)
32{
Eric Laurentdce54a12014-03-10 12:19:46 -070033 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080034 return NO_INIT;
35 }
36 if (!settingsAllowed()) {
37 return PERMISSION_DENIED;
38 }
39 if (!audio_is_output_device(device) && !audio_is_input_device(device)) {
40 return BAD_VALUE;
41 }
42 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
43 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
44 return BAD_VALUE;
45 }
46
47 ALOGV("setDeviceConnectionState()");
48 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -070049 return mAudioPolicyManager->setDeviceConnectionState(device,
Eric Laurent2d388ec2014-03-07 13:25:54 -080050 state, device_address);
51}
52
53audio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState(
54 audio_devices_t device,
55 const char *device_address)
56{
Eric Laurentdce54a12014-03-10 12:19:46 -070057 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080058 return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
59 }
Eric Laurentdce54a12014-03-10 12:19:46 -070060 return mAudioPolicyManager->getDeviceConnectionState(device,
Eric Laurent2d388ec2014-03-07 13:25:54 -080061 device_address);
62}
63
64status_t AudioPolicyService::setPhoneState(audio_mode_t state)
65{
Eric Laurentdce54a12014-03-10 12:19:46 -070066 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080067 return NO_INIT;
68 }
69 if (!settingsAllowed()) {
70 return PERMISSION_DENIED;
71 }
72 if (uint32_t(state) >= AUDIO_MODE_CNT) {
73 return BAD_VALUE;
74 }
75
76 ALOGV("setPhoneState()");
77
78 // TODO: check if it is more appropriate to do it in platform specific policy manager
79 AudioSystem::setMode(state);
80
81 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -070082 mAudioPolicyManager->setPhoneState(state);
Eric Laurentbb6c9a02014-09-25 14:11:47 -070083 mPhoneState = state;
Eric Laurent2d388ec2014-03-07 13:25:54 -080084 return NO_ERROR;
85}
86
Eric Laurentbb6c9a02014-09-25 14:11:47 -070087audio_mode_t AudioPolicyService::getPhoneState()
88{
89 Mutex::Autolock _l(mLock);
90 return mPhoneState;
91}
92
Eric Laurent2d388ec2014-03-07 13:25:54 -080093status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
94 audio_policy_forced_cfg_t config)
95{
Eric Laurentdce54a12014-03-10 12:19:46 -070096 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080097 return NO_INIT;
98 }
99 if (!settingsAllowed()) {
100 return PERMISSION_DENIED;
101 }
102 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
103 return BAD_VALUE;
104 }
105 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
106 return BAD_VALUE;
107 }
108 ALOGV("setForceUse()");
109 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700110 mAudioPolicyManager->setForceUse(usage, config);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800111 return NO_ERROR;
112}
113
114audio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage)
115{
Eric Laurentdce54a12014-03-10 12:19:46 -0700116 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800117 return AUDIO_POLICY_FORCE_NONE;
118 }
119 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
120 return AUDIO_POLICY_FORCE_NONE;
121 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700122 return mAudioPolicyManager->getForceUse(usage);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800123}
124
125audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream,
126 uint32_t samplingRate,
127 audio_format_t format,
128 audio_channel_mask_t channelMask,
129 audio_output_flags_t flags,
130 const audio_offload_info_t *offloadInfo)
131{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800132 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700133 return AUDIO_IO_HANDLE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700134 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700135 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700136 return AUDIO_IO_HANDLE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800137 }
138 ALOGV("getOutput()");
139 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700140 return mAudioPolicyManager->getOutput(stream, samplingRate,
Eric Laurent2d388ec2014-03-07 13:25:54 -0800141 format, channelMask, flags, offloadInfo);
142}
143
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700144audio_io_handle_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
145 uint32_t samplingRate,
146 audio_format_t format,
147 audio_channel_mask_t channelMask,
148 audio_output_flags_t flags,
149 const audio_offload_info_t *offloadInfo)
150{
151 if (mAudioPolicyManager == NULL) {
152 return 0;
153 }
154 ALOGV("getOutput()");
155 Mutex::Autolock _l(mLock);
156 return mAudioPolicyManager->getOutputForAttr(attr, samplingRate,
157 format, channelMask, flags, offloadInfo);
158}
159
Eric Laurent2d388ec2014-03-07 13:25:54 -0800160status_t AudioPolicyService::startOutput(audio_io_handle_t output,
161 audio_stream_type_t stream,
162 int session)
163{
Eric Laurentdea15412014-10-28 15:46:45 -0700164 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
165 return BAD_VALUE;
166 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700167 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800168 return NO_INIT;
169 }
170 ALOGV("startOutput()");
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700171 sp<AudioPolicyEffects>audioPolicyEffects;
172 {
173 Mutex::Autolock _l(mLock);
174 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800175 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700176 if (audioPolicyEffects != 0) {
177 // create audio processors according to stream
178 status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
179 if (status != NO_ERROR && status != ALREADY_EXISTS) {
180 ALOGW("Failed to add effects on session %d", session);
181 }
182 }
183 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700184 return mAudioPolicyManager->startOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800185}
186
187status_t AudioPolicyService::stopOutput(audio_io_handle_t output,
188 audio_stream_type_t stream,
189 int session)
190{
Eric Laurentdea15412014-10-28 15:46:45 -0700191 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
192 return BAD_VALUE;
193 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700194 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800195 return NO_INIT;
196 }
197 ALOGV("stopOutput()");
198 mOutputCommandThread->stopOutputCommand(output, stream, session);
199 return NO_ERROR;
200}
201
202status_t AudioPolicyService::doStopOutput(audio_io_handle_t output,
203 audio_stream_type_t stream,
204 int session)
205{
206 ALOGV("doStopOutput from tid %d", gettid());
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700207 sp<AudioPolicyEffects>audioPolicyEffects;
208 {
209 Mutex::Autolock _l(mLock);
210 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800211 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700212 if (audioPolicyEffects != 0) {
213 // release audio processors from the stream
214 status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
215 if (status != NO_ERROR && status != ALREADY_EXISTS) {
216 ALOGW("Failed to release effects on session %d", session);
217 }
218 }
219 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700220 return mAudioPolicyManager->stopOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800221}
222
223void AudioPolicyService::releaseOutput(audio_io_handle_t output)
224{
Eric Laurentdce54a12014-03-10 12:19:46 -0700225 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800226 return;
227 }
228 ALOGV("releaseOutput()");
229 mOutputCommandThread->releaseOutputCommand(output);
230}
231
232void AudioPolicyService::doReleaseOutput(audio_io_handle_t output)
233{
234 ALOGV("doReleaseOutput from tid %d", gettid());
235 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700236 mAudioPolicyManager->releaseOutput(output);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800237}
238
239audio_io_handle_t AudioPolicyService::getInput(audio_source_t inputSource,
240 uint32_t samplingRate,
241 audio_format_t format,
242 audio_channel_mask_t channelMask,
Glenn Kastenb3b16602014-07-16 08:36:31 -0700243 int audioSession,
Glenn Kasten6a8ab052014-07-24 14:08:35 -0700244 audio_input_flags_t flags)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800245{
Eric Laurentdce54a12014-03-10 12:19:46 -0700246 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800247 return 0;
248 }
249 // already checked by client, but double-check in case the client wrapper is bypassed
Hochi Huangf53eaf42014-10-09 11:36:22 +0800250 if (inputSource >= AUDIO_SOURCE_CNT && inputSource != AUDIO_SOURCE_HOTWORD &&
251 inputSource != AUDIO_SOURCE_FM_TUNER) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800252 return 0;
253 }
254
Hochi Huangf53eaf42014-10-09 11:36:22 +0800255 if (((inputSource == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) ||
256 ((inputSource == AUDIO_SOURCE_FM_TUNER) && !captureFmTunerAllowed())) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800257 return 0;
258 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700259 audio_io_handle_t input;
260 sp<AudioPolicyEffects>audioPolicyEffects;
261 {
262 Mutex::Autolock _l(mLock);
263 // the audio_in_acoustics_t parameter is ignored by get_input()
264 input = mAudioPolicyManager->getInput(inputSource, samplingRate,
265 format, channelMask,
266 (audio_session_t)audioSession, flags);
267 audioPolicyEffects = mAudioPolicyEffects;
268 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800269 if (input == 0) {
270 return input;
271 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700272 if (audioPolicyEffects != 0) {
273 // create audio pre processors according to input source
274 status_t status = audioPolicyEffects->addInputEffects(input, inputSource, audioSession);
275 if (status != NO_ERROR && status != ALREADY_EXISTS) {
276 ALOGW("Failed to add effects on input %d", input);
277 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800278 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800279 return input;
280}
281
Eric Laurent4dc68062014-07-28 17:26:49 -0700282status_t AudioPolicyService::startInput(audio_io_handle_t input,
283 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800284{
Eric Laurentdce54a12014-03-10 12:19:46 -0700285 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800286 return NO_INIT;
287 }
288 Mutex::Autolock _l(mLock);
289
Eric Laurent4dc68062014-07-28 17:26:49 -0700290 return mAudioPolicyManager->startInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800291}
292
Eric Laurent4dc68062014-07-28 17:26:49 -0700293status_t AudioPolicyService::stopInput(audio_io_handle_t input,
294 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800295{
Eric Laurentdce54a12014-03-10 12:19:46 -0700296 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800297 return NO_INIT;
298 }
299 Mutex::Autolock _l(mLock);
300
Eric Laurent4dc68062014-07-28 17:26:49 -0700301 return mAudioPolicyManager->stopInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800302}
303
Eric Laurent4dc68062014-07-28 17:26:49 -0700304void AudioPolicyService::releaseInput(audio_io_handle_t input,
305 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800306{
Eric Laurentdce54a12014-03-10 12:19:46 -0700307 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800308 return;
309 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700310 sp<AudioPolicyEffects>audioPolicyEffects;
311 {
312 Mutex::Autolock _l(mLock);
313 mAudioPolicyManager->releaseInput(input, session);
314 audioPolicyEffects = mAudioPolicyEffects;
315 }
316 if (audioPolicyEffects != 0) {
317 // release audio processors from the input
318 status_t status = audioPolicyEffects->releaseInputEffects(input);
319 if(status != NO_ERROR) {
320 ALOGW("Failed to release effects on input %d", input);
321 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800322 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800323}
324
325status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
326 int indexMin,
327 int indexMax)
328{
Eric Laurentdce54a12014-03-10 12:19:46 -0700329 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800330 return NO_INIT;
331 }
332 if (!settingsAllowed()) {
333 return PERMISSION_DENIED;
334 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800335 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800336 return BAD_VALUE;
337 }
338 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700339 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800340 return NO_ERROR;
341}
342
343status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
344 int index,
345 audio_devices_t device)
346{
Eric Laurentdce54a12014-03-10 12:19:46 -0700347 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800348 return NO_INIT;
349 }
350 if (!settingsAllowed()) {
351 return PERMISSION_DENIED;
352 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800353 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800354 return BAD_VALUE;
355 }
356 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700357 return mAudioPolicyManager->setStreamVolumeIndex(stream,
358 index,
359 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800360}
361
362status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
363 int *index,
364 audio_devices_t device)
365{
Eric Laurentdce54a12014-03-10 12:19:46 -0700366 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800367 return NO_INIT;
368 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800369 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800370 return BAD_VALUE;
371 }
372 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700373 return mAudioPolicyManager->getStreamVolumeIndex(stream,
374 index,
375 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800376}
377
378uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
379{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800380 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700381 return 0;
Eric Laurentdea15412014-10-28 15:46:45 -0700382 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700383 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800384 return 0;
385 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700386 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800387}
388
389//audio policy: use audio_device_t appropriately
390
391audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
392{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800393 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700394 return AUDIO_DEVICE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700395 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700396 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700397 return AUDIO_DEVICE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800398 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700399 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800400}
401
402audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
403{
404 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700405 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800406 return 0;
407 }
408 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700409 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800410}
411
412status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
413 audio_io_handle_t io,
414 uint32_t strategy,
415 int session,
416 int id)
417{
Eric Laurentdce54a12014-03-10 12:19:46 -0700418 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800419 return NO_INIT;
420 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700421 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800422}
423
424status_t AudioPolicyService::unregisterEffect(int id)
425{
Eric Laurentdce54a12014-03-10 12:19:46 -0700426 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800427 return NO_INIT;
428 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700429 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800430}
431
432status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
433{
Eric Laurentdce54a12014-03-10 12:19:46 -0700434 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800435 return NO_INIT;
436 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700437 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800438}
439
440bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
441{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800442 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700443 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700444 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700445 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700446 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800447 }
448 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700449 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800450}
451
452bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
453{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800454 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700455 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700456 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700457 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700458 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800459 }
460 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700461 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800462}
463
464bool AudioPolicyService::isSourceActive(audio_source_t source) const
465{
Eric Laurentdce54a12014-03-10 12:19:46 -0700466 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800467 return false;
468 }
469 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700470 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800471}
472
473status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
474 effect_descriptor_t *descriptors,
475 uint32_t *count)
476{
Eric Laurentdce54a12014-03-10 12:19:46 -0700477 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800478 *count = 0;
479 return NO_INIT;
480 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700481 sp<AudioPolicyEffects>audioPolicyEffects;
482 {
483 Mutex::Autolock _l(mLock);
484 audioPolicyEffects = mAudioPolicyEffects;
485 }
486 if (audioPolicyEffects == 0) {
487 *count = 0;
488 return NO_INIT;
489 }
490 return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800491}
492
493bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
494{
Eric Laurentdce54a12014-03-10 12:19:46 -0700495 if (mAudioPolicyManager == NULL) {
496 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800497 return false;
498 }
499
Eric Laurentdce54a12014-03-10 12:19:46 -0700500 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800501}
502
Eric Laurent6a94d692014-05-20 11:18:06 -0700503status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
504 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -0700505 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -0700506 struct audio_port *ports,
507 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700508{
Eric Laurent6a94d692014-05-20 11:18:06 -0700509 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700510 if(!modifyAudioRoutingAllowed()) {
511 return PERMISSION_DENIED;
512 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700513 if (mAudioPolicyManager == NULL) {
514 return NO_INIT;
515 }
516
517 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700518}
519
Eric Laurent6a94d692014-05-20 11:18:06 -0700520status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -0700521{
Eric Laurent6a94d692014-05-20 11:18:06 -0700522 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700523 if(!modifyAudioRoutingAllowed()) {
524 return PERMISSION_DENIED;
525 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700526 if (mAudioPolicyManager == NULL) {
527 return NO_INIT;
528 }
529
530 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -0700531}
532
Eric Laurent6a94d692014-05-20 11:18:06 -0700533status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
534 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700535{
Eric Laurent6a94d692014-05-20 11:18:06 -0700536 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700537 if(!modifyAudioRoutingAllowed()) {
538 return PERMISSION_DENIED;
539 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700540 if (mAudioPolicyManager == NULL) {
541 return NO_INIT;
542 }
543 return mAudioPolicyManager->createAudioPatch(patch, handle,
544 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700545}
546
Eric Laurent6a94d692014-05-20 11:18:06 -0700547status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700548{
Eric Laurent6a94d692014-05-20 11:18:06 -0700549 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700550 if(!modifyAudioRoutingAllowed()) {
551 return PERMISSION_DENIED;
552 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700553 if (mAudioPolicyManager == NULL) {
554 return NO_INIT;
555 }
556
557 return mAudioPolicyManager->releaseAudioPatch(handle,
558 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700559}
560
561status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -0700562 struct audio_patch *patches,
563 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700564{
Eric Laurent6a94d692014-05-20 11:18:06 -0700565 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700566 if(!modifyAudioRoutingAllowed()) {
567 return PERMISSION_DENIED;
568 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700569 if (mAudioPolicyManager == NULL) {
570 return NO_INIT;
571 }
572
573 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700574}
575
Eric Laurent6a94d692014-05-20 11:18:06 -0700576status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -0700577{
Eric Laurent6a94d692014-05-20 11:18:06 -0700578 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700579 if(!modifyAudioRoutingAllowed()) {
580 return PERMISSION_DENIED;
581 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700582 if (mAudioPolicyManager == NULL) {
583 return NO_INIT;
584 }
585
586 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -0700587}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800588
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700589status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
590 audio_io_handle_t *ioHandle,
591 audio_devices_t *device)
592{
593 if (mAudioPolicyManager == NULL) {
594 return NO_INIT;
595 }
596
597 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
598}
599
600status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
601{
602 if (mAudioPolicyManager == NULL) {
603 return NO_INIT;
604 }
605
606 return mAudioPolicyManager->releaseSoundTriggerSession(session);
607}
608
Eric Laurent2d388ec2014-03-07 13:25:54 -0800609}; // namespace android