blob: a763151ecfc21584b318c798a9333ecbe651be70 [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,
Paul McLeane743a472015-01-28 11:07:31 -080031 const char *device_address,
32 const char *device_name)
Eric Laurent2d388ec2014-03-07 13:25:54 -080033{
Eric Laurentdce54a12014-03-10 12:19:46 -070034 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080035 return NO_INIT;
36 }
37 if (!settingsAllowed()) {
38 return PERMISSION_DENIED;
39 }
40 if (!audio_is_output_device(device) && !audio_is_input_device(device)) {
41 return BAD_VALUE;
42 }
43 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
44 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
45 return BAD_VALUE;
46 }
47
48 ALOGV("setDeviceConnectionState()");
49 Mutex::Autolock _l(mLock);
Paul McLeane743a472015-01-28 11:07:31 -080050 return mAudioPolicyManager->setDeviceConnectionState(device, state,
51 device_address, device_name);
Eric Laurent2d388ec2014-03-07 13:25:54 -080052}
53
54audio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState(
55 audio_devices_t device,
56 const char *device_address)
57{
Eric Laurentdce54a12014-03-10 12:19:46 -070058 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080059 return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
60 }
Eric Laurentdce54a12014-03-10 12:19:46 -070061 return mAudioPolicyManager->getDeviceConnectionState(device,
Eric Laurent2d388ec2014-03-07 13:25:54 -080062 device_address);
63}
64
65status_t AudioPolicyService::setPhoneState(audio_mode_t state)
66{
Eric Laurentdce54a12014-03-10 12:19:46 -070067 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080068 return NO_INIT;
69 }
70 if (!settingsAllowed()) {
71 return PERMISSION_DENIED;
72 }
73 if (uint32_t(state) >= AUDIO_MODE_CNT) {
74 return BAD_VALUE;
75 }
76
77 ALOGV("setPhoneState()");
78
79 // TODO: check if it is more appropriate to do it in platform specific policy manager
80 AudioSystem::setMode(state);
81
82 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -070083 mAudioPolicyManager->setPhoneState(state);
Eric Laurentbb6c9a02014-09-25 14:11:47 -070084 mPhoneState = state;
Eric Laurent2d388ec2014-03-07 13:25:54 -080085 return NO_ERROR;
86}
87
Eric Laurentbb6c9a02014-09-25 14:11:47 -070088audio_mode_t AudioPolicyService::getPhoneState()
89{
90 Mutex::Autolock _l(mLock);
91 return mPhoneState;
92}
93
Eric Laurent2d388ec2014-03-07 13:25:54 -080094status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
95 audio_policy_forced_cfg_t config)
96{
Eric Laurentdce54a12014-03-10 12:19:46 -070097 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080098 return NO_INIT;
99 }
100 if (!settingsAllowed()) {
101 return PERMISSION_DENIED;
102 }
103 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
104 return BAD_VALUE;
105 }
106 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
107 return BAD_VALUE;
108 }
109 ALOGV("setForceUse()");
110 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700111 mAudioPolicyManager->setForceUse(usage, config);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800112 return NO_ERROR;
113}
114
115audio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage)
116{
Eric Laurentdce54a12014-03-10 12:19:46 -0700117 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800118 return AUDIO_POLICY_FORCE_NONE;
119 }
120 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
121 return AUDIO_POLICY_FORCE_NONE;
122 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700123 return mAudioPolicyManager->getForceUse(usage);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800124}
125
126audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream,
127 uint32_t samplingRate,
128 audio_format_t format,
129 audio_channel_mask_t channelMask,
130 audio_output_flags_t flags,
131 const audio_offload_info_t *offloadInfo)
132{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800133 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700134 return AUDIO_IO_HANDLE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700135 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700136 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700137 return AUDIO_IO_HANDLE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800138 }
139 ALOGV("getOutput()");
140 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700141 return mAudioPolicyManager->getOutput(stream, samplingRate,
Eric Laurent2d388ec2014-03-07 13:25:54 -0800142 format, channelMask, flags, offloadInfo);
143}
144
Eric Laurente83b55d2014-11-14 10:06:21 -0800145status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
146 audio_io_handle_t *output,
147 audio_session_t session,
148 audio_stream_type_t *stream,
149 uint32_t samplingRate,
150 audio_format_t format,
151 audio_channel_mask_t channelMask,
152 audio_output_flags_t flags,
Paul McLeanaa981192015-03-21 09:55:15 -0700153 int mSelectedDeviceId,
Eric Laurente83b55d2014-11-14 10:06:21 -0800154 const audio_offload_info_t *offloadInfo)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700155{
156 if (mAudioPolicyManager == NULL) {
Eric Laurente83b55d2014-11-14 10:06:21 -0800157 return NO_INIT;
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700158 }
159 ALOGV("getOutput()");
160 Mutex::Autolock _l(mLock);
Eric Laurente83b55d2014-11-14 10:06:21 -0800161 return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, samplingRate,
Paul McLeanaa981192015-03-21 09:55:15 -0700162 format, channelMask, flags, mSelectedDeviceId, offloadInfo);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700163}
164
Eric Laurent2d388ec2014-03-07 13:25:54 -0800165status_t AudioPolicyService::startOutput(audio_io_handle_t output,
166 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800167 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800168{
Eric Laurentdea15412014-10-28 15:46:45 -0700169 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
170 return BAD_VALUE;
171 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700172 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800173 return NO_INIT;
174 }
175 ALOGV("startOutput()");
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700176 sp<AudioPolicyEffects>audioPolicyEffects;
177 {
178 Mutex::Autolock _l(mLock);
179 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800180 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700181 if (audioPolicyEffects != 0) {
182 // create audio processors according to stream
183 status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
184 if (status != NO_ERROR && status != ALREADY_EXISTS) {
185 ALOGW("Failed to add effects on session %d", session);
186 }
187 }
188 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700189 return mAudioPolicyManager->startOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800190}
191
192status_t AudioPolicyService::stopOutput(audio_io_handle_t output,
193 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800194 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800195{
Eric Laurentdea15412014-10-28 15:46:45 -0700196 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
197 return BAD_VALUE;
198 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700199 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800200 return NO_INIT;
201 }
202 ALOGV("stopOutput()");
203 mOutputCommandThread->stopOutputCommand(output, stream, session);
204 return NO_ERROR;
205}
206
207status_t AudioPolicyService::doStopOutput(audio_io_handle_t output,
208 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800209 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800210{
211 ALOGV("doStopOutput from tid %d", gettid());
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700212 sp<AudioPolicyEffects>audioPolicyEffects;
213 {
214 Mutex::Autolock _l(mLock);
215 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800216 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700217 if (audioPolicyEffects != 0) {
218 // release audio processors from the stream
219 status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
220 if (status != NO_ERROR && status != ALREADY_EXISTS) {
221 ALOGW("Failed to release effects on session %d", session);
222 }
223 }
224 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700225 return mAudioPolicyManager->stopOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800226}
227
Eric Laurente83b55d2014-11-14 10:06:21 -0800228void AudioPolicyService::releaseOutput(audio_io_handle_t output,
229 audio_stream_type_t stream,
230 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800231{
Eric Laurentdce54a12014-03-10 12:19:46 -0700232 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800233 return;
234 }
235 ALOGV("releaseOutput()");
Eric Laurente83b55d2014-11-14 10:06:21 -0800236 mOutputCommandThread->releaseOutputCommand(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800237}
238
Eric Laurente83b55d2014-11-14 10:06:21 -0800239void AudioPolicyService::doReleaseOutput(audio_io_handle_t output,
240 audio_stream_type_t stream,
241 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800242{
243 ALOGV("doReleaseOutput from tid %d", gettid());
244 Mutex::Autolock _l(mLock);
Eric Laurente83b55d2014-11-14 10:06:21 -0800245 mAudioPolicyManager->releaseOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800246}
247
Eric Laurentcaf7f482014-11-25 17:50:47 -0800248status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
249 audio_io_handle_t *input,
250 audio_session_t session,
251 uint32_t samplingRate,
252 audio_format_t format,
253 audio_channel_mask_t channelMask,
254 audio_input_flags_t flags)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800255{
Eric Laurentdce54a12014-03-10 12:19:46 -0700256 if (mAudioPolicyManager == NULL) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800257 return NO_INIT;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800258 }
259 // already checked by client, but double-check in case the client wrapper is bypassed
Eric Laurentcaf7f482014-11-25 17:50:47 -0800260 if (attr->source >= AUDIO_SOURCE_CNT && attr->source != AUDIO_SOURCE_HOTWORD &&
261 attr->source != AUDIO_SOURCE_FM_TUNER) {
262 return BAD_VALUE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800263 }
264
Eric Laurentcaf7f482014-11-25 17:50:47 -0800265 if (((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) ||
266 ((attr->source == AUDIO_SOURCE_FM_TUNER) && !captureFmTunerAllowed())) {
267 return BAD_VALUE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800268 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700269 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentcaf7f482014-11-25 17:50:47 -0800270 status_t status;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800271 AudioPolicyInterface::input_type_t inputType;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700272 {
273 Mutex::Autolock _l(mLock);
274 // the audio_in_acoustics_t parameter is ignored by get_input()
Eric Laurentcaf7f482014-11-25 17:50:47 -0800275 status = mAudioPolicyManager->getInputForAttr(attr, input, session,
276 samplingRate, format, channelMask,
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800277 flags, &inputType);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700278 audioPolicyEffects = mAudioPolicyEffects;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800279
280 if (status == NO_ERROR) {
281 // enforce permission (if any) required for each type of input
282 switch (inputType) {
283 case AudioPolicyInterface::API_INPUT_LEGACY:
284 break;
285 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
286 if (!captureAudioOutputAllowed()) {
287 ALOGE("getInputForAttr() permission denied: capture not allowed");
288 status = PERMISSION_DENIED;
289 }
290 break;
291 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE:
292 if (!modifyAudioRoutingAllowed()) {
293 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed");
294 status = PERMISSION_DENIED;
295 }
296 break;
297 case AudioPolicyInterface::API_INPUT_INVALID:
298 default:
299 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d",
300 (int)inputType);
301 }
302 }
303
304 if (status != NO_ERROR) {
305 if (status == PERMISSION_DENIED) {
306 mAudioPolicyManager->releaseInput(*input, session);
307 }
308 return status;
309 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700310 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800311
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700312 if (audioPolicyEffects != 0) {
313 // create audio pre processors according to input source
Eric Laurentcaf7f482014-11-25 17:50:47 -0800314 status_t status = audioPolicyEffects->addInputEffects(*input, attr->source, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700315 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800316 ALOGW("Failed to add effects on input %d", *input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700317 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800318 }
Eric Laurentcaf7f482014-11-25 17:50:47 -0800319 return NO_ERROR;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800320}
321
Eric Laurent4dc68062014-07-28 17:26:49 -0700322status_t AudioPolicyService::startInput(audio_io_handle_t input,
323 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800324{
Eric Laurentdce54a12014-03-10 12:19:46 -0700325 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800326 return NO_INIT;
327 }
328 Mutex::Autolock _l(mLock);
329
Eric Laurent4dc68062014-07-28 17:26:49 -0700330 return mAudioPolicyManager->startInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800331}
332
Eric Laurent4dc68062014-07-28 17:26:49 -0700333status_t AudioPolicyService::stopInput(audio_io_handle_t input,
334 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800335{
Eric Laurentdce54a12014-03-10 12:19:46 -0700336 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800337 return NO_INIT;
338 }
339 Mutex::Autolock _l(mLock);
340
Eric Laurent4dc68062014-07-28 17:26:49 -0700341 return mAudioPolicyManager->stopInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800342}
343
Eric Laurent4dc68062014-07-28 17:26:49 -0700344void AudioPolicyService::releaseInput(audio_io_handle_t input,
345 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800346{
Eric Laurentdce54a12014-03-10 12:19:46 -0700347 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800348 return;
349 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700350 sp<AudioPolicyEffects>audioPolicyEffects;
351 {
352 Mutex::Autolock _l(mLock);
353 mAudioPolicyManager->releaseInput(input, session);
354 audioPolicyEffects = mAudioPolicyEffects;
355 }
356 if (audioPolicyEffects != 0) {
357 // release audio processors from the input
358 status_t status = audioPolicyEffects->releaseInputEffects(input);
359 if(status != NO_ERROR) {
360 ALOGW("Failed to release effects on input %d", input);
361 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800362 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800363}
364
365status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
366 int indexMin,
367 int indexMax)
368{
Eric Laurentdce54a12014-03-10 12:19:46 -0700369 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800370 return NO_INIT;
371 }
372 if (!settingsAllowed()) {
373 return PERMISSION_DENIED;
374 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800375 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800376 return BAD_VALUE;
377 }
378 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700379 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800380 return NO_ERROR;
381}
382
383status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
384 int index,
385 audio_devices_t device)
386{
Eric Laurentdce54a12014-03-10 12:19:46 -0700387 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800388 return NO_INIT;
389 }
390 if (!settingsAllowed()) {
391 return PERMISSION_DENIED;
392 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800393 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800394 return BAD_VALUE;
395 }
396 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700397 return mAudioPolicyManager->setStreamVolumeIndex(stream,
398 index,
399 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800400}
401
402status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
403 int *index,
404 audio_devices_t device)
405{
Eric Laurentdce54a12014-03-10 12:19:46 -0700406 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800407 return NO_INIT;
408 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800409 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800410 return BAD_VALUE;
411 }
412 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700413 return mAudioPolicyManager->getStreamVolumeIndex(stream,
414 index,
415 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800416}
417
418uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
419{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800420 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700421 return 0;
Eric Laurentdea15412014-10-28 15:46:45 -0700422 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700423 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800424 return 0;
425 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700426 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800427}
428
429//audio policy: use audio_device_t appropriately
430
431audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
432{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800433 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700434 return AUDIO_DEVICE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700435 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700436 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700437 return AUDIO_DEVICE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800438 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700439 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800440}
441
442audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
443{
444 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700445 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800446 return 0;
447 }
448 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700449 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800450}
451
452status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
453 audio_io_handle_t io,
454 uint32_t strategy,
455 int session,
456 int id)
457{
Eric Laurentdce54a12014-03-10 12:19:46 -0700458 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800459 return NO_INIT;
460 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700461 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800462}
463
464status_t AudioPolicyService::unregisterEffect(int id)
465{
Eric Laurentdce54a12014-03-10 12:19:46 -0700466 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800467 return NO_INIT;
468 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700469 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800470}
471
472status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
473{
Eric Laurentdce54a12014-03-10 12:19:46 -0700474 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800475 return NO_INIT;
476 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700477 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800478}
479
480bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
481{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800482 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700483 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700484 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700485 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700486 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800487 }
488 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700489 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800490}
491
492bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
493{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800494 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700495 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700496 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700497 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700498 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800499 }
500 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700501 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800502}
503
504bool AudioPolicyService::isSourceActive(audio_source_t source) const
505{
Eric Laurentdce54a12014-03-10 12:19:46 -0700506 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800507 return false;
508 }
509 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700510 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800511}
512
513status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
514 effect_descriptor_t *descriptors,
515 uint32_t *count)
516{
Eric Laurentdce54a12014-03-10 12:19:46 -0700517 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800518 *count = 0;
519 return NO_INIT;
520 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700521 sp<AudioPolicyEffects>audioPolicyEffects;
522 {
523 Mutex::Autolock _l(mLock);
524 audioPolicyEffects = mAudioPolicyEffects;
525 }
526 if (audioPolicyEffects == 0) {
527 *count = 0;
528 return NO_INIT;
529 }
530 return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800531}
532
533bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
534{
Eric Laurentdce54a12014-03-10 12:19:46 -0700535 if (mAudioPolicyManager == NULL) {
536 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800537 return false;
538 }
539
Eric Laurentdce54a12014-03-10 12:19:46 -0700540 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800541}
542
Eric Laurent6a94d692014-05-20 11:18:06 -0700543status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
544 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -0700545 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -0700546 struct audio_port *ports,
547 unsigned int *generation)
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->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700558}
559
Eric Laurent6a94d692014-05-20 11:18:06 -0700560status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -0700561{
Eric Laurent6a94d692014-05-20 11:18:06 -0700562 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700563 if(!modifyAudioRoutingAllowed()) {
564 return PERMISSION_DENIED;
565 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700566 if (mAudioPolicyManager == NULL) {
567 return NO_INIT;
568 }
569
570 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -0700571}
572
Eric Laurent6a94d692014-05-20 11:18:06 -0700573status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
574 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700575{
Eric Laurent6a94d692014-05-20 11:18:06 -0700576 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700577 if(!modifyAudioRoutingAllowed()) {
578 return PERMISSION_DENIED;
579 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700580 if (mAudioPolicyManager == NULL) {
581 return NO_INIT;
582 }
583 return mAudioPolicyManager->createAudioPatch(patch, handle,
584 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700585}
586
Eric Laurent6a94d692014-05-20 11:18:06 -0700587status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700588{
Eric Laurent6a94d692014-05-20 11:18:06 -0700589 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700590 if(!modifyAudioRoutingAllowed()) {
591 return PERMISSION_DENIED;
592 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700593 if (mAudioPolicyManager == NULL) {
594 return NO_INIT;
595 }
596
597 return mAudioPolicyManager->releaseAudioPatch(handle,
598 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700599}
600
601status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -0700602 struct audio_patch *patches,
603 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700604{
Eric Laurent6a94d692014-05-20 11:18:06 -0700605 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700606 if(!modifyAudioRoutingAllowed()) {
607 return PERMISSION_DENIED;
608 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700609 if (mAudioPolicyManager == NULL) {
610 return NO_INIT;
611 }
612
613 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700614}
615
Eric Laurent6a94d692014-05-20 11:18:06 -0700616status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -0700617{
Eric Laurent6a94d692014-05-20 11:18:06 -0700618 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700619 if(!modifyAudioRoutingAllowed()) {
620 return PERMISSION_DENIED;
621 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700622 if (mAudioPolicyManager == NULL) {
623 return NO_INIT;
624 }
625
626 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -0700627}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800628
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700629status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
630 audio_io_handle_t *ioHandle,
631 audio_devices_t *device)
632{
633 if (mAudioPolicyManager == NULL) {
634 return NO_INIT;
635 }
636
637 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
638}
639
640status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
641{
642 if (mAudioPolicyManager == NULL) {
643 return NO_INIT;
644 }
645
646 return mAudioPolicyManager->releaseSoundTriggerSession(session);
647}
648
Eric Laurentbaac1832014-12-01 17:52:59 -0800649status_t AudioPolicyService::registerPolicyMixes(Vector<AudioMix> mixes, bool registration)
650{
651 Mutex::Autolock _l(mLock);
652 if(!modifyAudioRoutingAllowed()) {
653 return PERMISSION_DENIED;
654 }
655 if (mAudioPolicyManager == NULL) {
656 return NO_INIT;
657 }
658 if (registration) {
659 return mAudioPolicyManager->registerPolicyMixes(mixes);
660 } else {
661 return mAudioPolicyManager->unregisterPolicyMixes(mixes);
662 }
663}
664
Eric Laurent2d388ec2014-03-07 13:25:54 -0800665}; // namespace android