blob: 091ef070de41cb272f1fb402783fbbbe0e6628bd [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
Eric Laurente83b55d2014-11-14 10:06:21 -0800144status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
145 audio_io_handle_t *output,
146 audio_session_t session,
147 audio_stream_type_t *stream,
148 uint32_t samplingRate,
149 audio_format_t format,
150 audio_channel_mask_t channelMask,
151 audio_output_flags_t flags,
152 const audio_offload_info_t *offloadInfo)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700153{
154 if (mAudioPolicyManager == NULL) {
Eric Laurente83b55d2014-11-14 10:06:21 -0800155 return NO_INIT;
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700156 }
157 ALOGV("getOutput()");
158 Mutex::Autolock _l(mLock);
Eric Laurente83b55d2014-11-14 10:06:21 -0800159 return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, samplingRate,
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700160 format, channelMask, flags, offloadInfo);
161}
162
Eric Laurent2d388ec2014-03-07 13:25:54 -0800163status_t AudioPolicyService::startOutput(audio_io_handle_t output,
164 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800165 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800166{
Eric Laurentdea15412014-10-28 15:46:45 -0700167 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
168 return BAD_VALUE;
169 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700170 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800171 return NO_INIT;
172 }
173 ALOGV("startOutput()");
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700174 sp<AudioPolicyEffects>audioPolicyEffects;
175 {
176 Mutex::Autolock _l(mLock);
177 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800178 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700179 if (audioPolicyEffects != 0) {
180 // create audio processors according to stream
181 status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
182 if (status != NO_ERROR && status != ALREADY_EXISTS) {
183 ALOGW("Failed to add effects on session %d", session);
184 }
185 }
186 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700187 return mAudioPolicyManager->startOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800188}
189
190status_t AudioPolicyService::stopOutput(audio_io_handle_t output,
191 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800192 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800193{
Eric Laurentdea15412014-10-28 15:46:45 -0700194 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
195 return BAD_VALUE;
196 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700197 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800198 return NO_INIT;
199 }
200 ALOGV("stopOutput()");
201 mOutputCommandThread->stopOutputCommand(output, stream, session);
202 return NO_ERROR;
203}
204
205status_t AudioPolicyService::doStopOutput(audio_io_handle_t output,
206 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800207 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800208{
209 ALOGV("doStopOutput from tid %d", gettid());
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700210 sp<AudioPolicyEffects>audioPolicyEffects;
211 {
212 Mutex::Autolock _l(mLock);
213 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800214 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700215 if (audioPolicyEffects != 0) {
216 // release audio processors from the stream
217 status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
218 if (status != NO_ERROR && status != ALREADY_EXISTS) {
219 ALOGW("Failed to release effects on session %d", session);
220 }
221 }
222 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700223 return mAudioPolicyManager->stopOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800224}
225
Eric Laurente83b55d2014-11-14 10:06:21 -0800226void AudioPolicyService::releaseOutput(audio_io_handle_t output,
227 audio_stream_type_t stream,
228 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800229{
Eric Laurentdce54a12014-03-10 12:19:46 -0700230 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800231 return;
232 }
233 ALOGV("releaseOutput()");
Eric Laurente83b55d2014-11-14 10:06:21 -0800234 mOutputCommandThread->releaseOutputCommand(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800235}
236
Eric Laurente83b55d2014-11-14 10:06:21 -0800237void AudioPolicyService::doReleaseOutput(audio_io_handle_t output,
238 audio_stream_type_t stream,
239 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800240{
241 ALOGV("doReleaseOutput from tid %d", gettid());
242 Mutex::Autolock _l(mLock);
Eric Laurente83b55d2014-11-14 10:06:21 -0800243 mAudioPolicyManager->releaseOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800244}
245
Eric Laurentcaf7f482014-11-25 17:50:47 -0800246status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
247 audio_io_handle_t *input,
248 audio_session_t session,
249 uint32_t samplingRate,
250 audio_format_t format,
251 audio_channel_mask_t channelMask,
252 audio_input_flags_t flags)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800253{
Eric Laurentdce54a12014-03-10 12:19:46 -0700254 if (mAudioPolicyManager == NULL) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800255 return NO_INIT;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800256 }
257 // already checked by client, but double-check in case the client wrapper is bypassed
Eric Laurentcaf7f482014-11-25 17:50:47 -0800258 if (attr->source >= AUDIO_SOURCE_CNT && attr->source != AUDIO_SOURCE_HOTWORD &&
259 attr->source != AUDIO_SOURCE_FM_TUNER) {
260 return BAD_VALUE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800261 }
262
Eric Laurentcaf7f482014-11-25 17:50:47 -0800263 if (((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) ||
264 ((attr->source == AUDIO_SOURCE_FM_TUNER) && !captureFmTunerAllowed())) {
265 return BAD_VALUE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800266 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700267 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentcaf7f482014-11-25 17:50:47 -0800268 status_t status;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800269 AudioPolicyInterface::input_type_t inputType;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700270 {
271 Mutex::Autolock _l(mLock);
272 // the audio_in_acoustics_t parameter is ignored by get_input()
Eric Laurentcaf7f482014-11-25 17:50:47 -0800273 status = mAudioPolicyManager->getInputForAttr(attr, input, session,
274 samplingRate, format, channelMask,
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800275 flags, &inputType);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700276 audioPolicyEffects = mAudioPolicyEffects;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800277
278 if (status == NO_ERROR) {
279 // enforce permission (if any) required for each type of input
280 switch (inputType) {
281 case AudioPolicyInterface::API_INPUT_LEGACY:
282 break;
283 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
284 if (!captureAudioOutputAllowed()) {
285 ALOGE("getInputForAttr() permission denied: capture not allowed");
286 status = PERMISSION_DENIED;
287 }
288 break;
289 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE:
290 if (!modifyAudioRoutingAllowed()) {
291 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed");
292 status = PERMISSION_DENIED;
293 }
294 break;
295 case AudioPolicyInterface::API_INPUT_INVALID:
296 default:
297 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d",
298 (int)inputType);
299 }
300 }
301
302 if (status != NO_ERROR) {
303 if (status == PERMISSION_DENIED) {
304 mAudioPolicyManager->releaseInput(*input, session);
305 }
306 return status;
307 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700308 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800309
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700310 if (audioPolicyEffects != 0) {
311 // create audio pre processors according to input source
Eric Laurentcaf7f482014-11-25 17:50:47 -0800312 status_t status = audioPolicyEffects->addInputEffects(*input, attr->source, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700313 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800314 ALOGW("Failed to add effects on input %d", *input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700315 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800316 }
Eric Laurentcaf7f482014-11-25 17:50:47 -0800317 return NO_ERROR;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800318}
319
Eric Laurent4dc68062014-07-28 17:26:49 -0700320status_t AudioPolicyService::startInput(audio_io_handle_t input,
321 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800322{
Eric Laurentdce54a12014-03-10 12:19:46 -0700323 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800324 return NO_INIT;
325 }
326 Mutex::Autolock _l(mLock);
327
Eric Laurent4dc68062014-07-28 17:26:49 -0700328 return mAudioPolicyManager->startInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800329}
330
Eric Laurent4dc68062014-07-28 17:26:49 -0700331status_t AudioPolicyService::stopInput(audio_io_handle_t input,
332 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800333{
Eric Laurentdce54a12014-03-10 12:19:46 -0700334 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800335 return NO_INIT;
336 }
337 Mutex::Autolock _l(mLock);
338
Eric Laurent4dc68062014-07-28 17:26:49 -0700339 return mAudioPolicyManager->stopInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800340}
341
Eric Laurent4dc68062014-07-28 17:26:49 -0700342void AudioPolicyService::releaseInput(audio_io_handle_t input,
343 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800344{
Eric Laurentdce54a12014-03-10 12:19:46 -0700345 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800346 return;
347 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700348 sp<AudioPolicyEffects>audioPolicyEffects;
349 {
350 Mutex::Autolock _l(mLock);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700351 audioPolicyEffects = mAudioPolicyEffects;
352 }
353 if (audioPolicyEffects != 0) {
354 // release audio processors from the input
355 status_t status = audioPolicyEffects->releaseInputEffects(input);
356 if(status != NO_ERROR) {
357 ALOGW("Failed to release effects on input %d", input);
358 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800359 }
Eric Laurent7da83aa2016-12-01 15:28:29 -0800360 {
361 Mutex::Autolock _l(mLock);
362 mAudioPolicyManager->releaseInput(input, session);
363 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800364}
365
366status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
367 int indexMin,
368 int indexMax)
369{
Eric Laurentdce54a12014-03-10 12:19:46 -0700370 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800371 return NO_INIT;
372 }
373 if (!settingsAllowed()) {
374 return PERMISSION_DENIED;
375 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800376 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800377 return BAD_VALUE;
378 }
379 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700380 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800381 return NO_ERROR;
382}
383
384status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
385 int index,
386 audio_devices_t device)
387{
Eric Laurentdce54a12014-03-10 12:19:46 -0700388 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800389 return NO_INIT;
390 }
391 if (!settingsAllowed()) {
392 return PERMISSION_DENIED;
393 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800394 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800395 return BAD_VALUE;
396 }
397 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700398 return mAudioPolicyManager->setStreamVolumeIndex(stream,
399 index,
400 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800401}
402
403status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
404 int *index,
405 audio_devices_t device)
406{
Eric Laurentdce54a12014-03-10 12:19:46 -0700407 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800408 return NO_INIT;
409 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800410 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800411 return BAD_VALUE;
412 }
413 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700414 return mAudioPolicyManager->getStreamVolumeIndex(stream,
415 index,
416 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800417}
418
419uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
420{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800421 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700422 return 0;
Eric Laurentdea15412014-10-28 15:46:45 -0700423 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700424 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800425 return 0;
426 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700427 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800428}
429
430//audio policy: use audio_device_t appropriately
431
432audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
433{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800434 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700435 return AUDIO_DEVICE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700436 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700437 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700438 return AUDIO_DEVICE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800439 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700440 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800441}
442
443audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
444{
445 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700446 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800447 return 0;
448 }
449 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700450 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800451}
452
453status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
454 audio_io_handle_t io,
455 uint32_t strategy,
456 int session,
457 int id)
458{
Eric Laurentdce54a12014-03-10 12:19:46 -0700459 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800460 return NO_INIT;
461 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700462 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800463}
464
465status_t AudioPolicyService::unregisterEffect(int id)
466{
Eric Laurentdce54a12014-03-10 12:19:46 -0700467 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800468 return NO_INIT;
469 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700470 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800471}
472
473status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
474{
Eric Laurentdce54a12014-03-10 12:19:46 -0700475 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800476 return NO_INIT;
477 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700478 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800479}
480
481bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
482{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800483 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700484 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700485 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700486 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700487 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800488 }
489 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700490 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800491}
492
493bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
494{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800495 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700496 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700497 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700498 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700499 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800500 }
501 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700502 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800503}
504
505bool AudioPolicyService::isSourceActive(audio_source_t source) const
506{
Eric Laurentdce54a12014-03-10 12:19:46 -0700507 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800508 return false;
509 }
510 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700511 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800512}
513
514status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
515 effect_descriptor_t *descriptors,
516 uint32_t *count)
517{
Eric Laurentdce54a12014-03-10 12:19:46 -0700518 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800519 *count = 0;
520 return NO_INIT;
521 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700522 sp<AudioPolicyEffects>audioPolicyEffects;
523 {
524 Mutex::Autolock _l(mLock);
525 audioPolicyEffects = mAudioPolicyEffects;
526 }
527 if (audioPolicyEffects == 0) {
528 *count = 0;
529 return NO_INIT;
530 }
531 return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800532}
533
534bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
535{
Eric Laurentdce54a12014-03-10 12:19:46 -0700536 if (mAudioPolicyManager == NULL) {
537 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800538 return false;
539 }
540
Eric Laurentdce54a12014-03-10 12:19:46 -0700541 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800542}
543
Eric Laurent6a94d692014-05-20 11:18:06 -0700544status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
545 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -0700546 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -0700547 struct audio_port *ports,
548 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700549{
Eric Laurent6a94d692014-05-20 11:18:06 -0700550 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700551 if(!modifyAudioRoutingAllowed()) {
552 return PERMISSION_DENIED;
553 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700554 if (mAudioPolicyManager == NULL) {
555 return NO_INIT;
556 }
557
558 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700559}
560
Eric Laurent6a94d692014-05-20 11:18:06 -0700561status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -0700562{
Eric Laurent6a94d692014-05-20 11:18:06 -0700563 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700564 if(!modifyAudioRoutingAllowed()) {
565 return PERMISSION_DENIED;
566 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700567 if (mAudioPolicyManager == NULL) {
568 return NO_INIT;
569 }
570
571 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -0700572}
573
Eric Laurent6a94d692014-05-20 11:18:06 -0700574status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
575 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700576{
Eric Laurent6a94d692014-05-20 11:18:06 -0700577 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700578 if(!modifyAudioRoutingAllowed()) {
579 return PERMISSION_DENIED;
580 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700581 if (mAudioPolicyManager == NULL) {
582 return NO_INIT;
583 }
584 return mAudioPolicyManager->createAudioPatch(patch, handle,
585 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700586}
587
Eric Laurent6a94d692014-05-20 11:18:06 -0700588status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700589{
Eric Laurent6a94d692014-05-20 11:18:06 -0700590 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700591 if(!modifyAudioRoutingAllowed()) {
592 return PERMISSION_DENIED;
593 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700594 if (mAudioPolicyManager == NULL) {
595 return NO_INIT;
596 }
597
598 return mAudioPolicyManager->releaseAudioPatch(handle,
599 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700600}
601
602status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -0700603 struct audio_patch *patches,
604 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700605{
Eric Laurent6a94d692014-05-20 11:18:06 -0700606 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700607 if(!modifyAudioRoutingAllowed()) {
608 return PERMISSION_DENIED;
609 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700610 if (mAudioPolicyManager == NULL) {
611 return NO_INIT;
612 }
613
614 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700615}
616
Eric Laurent6a94d692014-05-20 11:18:06 -0700617status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -0700618{
Eric Laurent6a94d692014-05-20 11:18:06 -0700619 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700620 if(!modifyAudioRoutingAllowed()) {
621 return PERMISSION_DENIED;
622 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700623 if (mAudioPolicyManager == NULL) {
624 return NO_INIT;
625 }
626
627 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -0700628}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800629
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700630status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
631 audio_io_handle_t *ioHandle,
632 audio_devices_t *device)
633{
634 if (mAudioPolicyManager == NULL) {
635 return NO_INIT;
636 }
637
638 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
639}
640
641status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
642{
643 if (mAudioPolicyManager == NULL) {
644 return NO_INIT;
645 }
646
647 return mAudioPolicyManager->releaseSoundTriggerSession(session);
648}
649
Eric Laurentbaac1832014-12-01 17:52:59 -0800650status_t AudioPolicyService::registerPolicyMixes(Vector<AudioMix> mixes, bool registration)
651{
652 Mutex::Autolock _l(mLock);
653 if(!modifyAudioRoutingAllowed()) {
654 return PERMISSION_DENIED;
655 }
656 if (mAudioPolicyManager == NULL) {
657 return NO_INIT;
658 }
659 if (registration) {
660 return mAudioPolicyManager->registerPolicyMixes(mixes);
661 } else {
662 return mAudioPolicyManager->unregisterPolicyMixes(mixes);
663 }
664}
665
Eric Laurent2d388ec2014-03-07 13:25:54 -0800666}; // namespace android