blob: 65639c3e59408a4a11505a892d73e560d70a20c8 [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,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700149 uid_t uid,
Eric Laurente83b55d2014-11-14 10:06:21 -0800150 uint32_t samplingRate,
151 audio_format_t format,
152 audio_channel_mask_t channelMask,
153 audio_output_flags_t flags,
Paul McLean466dc8e2015-04-17 13:15:36 -0600154 audio_port_handle_t selectedDeviceId,
Eric Laurente83b55d2014-11-14 10:06:21 -0800155 const audio_offload_info_t *offloadInfo)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700156{
157 if (mAudioPolicyManager == NULL) {
Eric Laurente83b55d2014-11-14 10:06:21 -0800158 return NO_INIT;
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700159 }
160 ALOGV("getOutput()");
161 Mutex::Autolock _l(mLock);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700162
163 // if the caller is us, trust the specified uid
164 if (IPCThreadState::self()->getCallingPid() != getpid_cached || uid == (uid_t)-1) {
165 uid_t newclientUid = IPCThreadState::self()->getCallingUid();
166 if (uid != (uid_t)-1 && uid != newclientUid) {
167 ALOGW("%s uid %d tried to pass itself off as %d", __FUNCTION__, newclientUid, uid);
168 }
169 uid = newclientUid;
170 }
171 return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, samplingRate,
Paul McLean466dc8e2015-04-17 13:15:36 -0600172 format, channelMask, flags, selectedDeviceId, offloadInfo);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700173}
174
Eric Laurent2d388ec2014-03-07 13:25:54 -0800175status_t AudioPolicyService::startOutput(audio_io_handle_t output,
176 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800177 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800178{
Eric Laurentdea15412014-10-28 15:46:45 -0700179 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
180 return BAD_VALUE;
181 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700182 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800183 return NO_INIT;
184 }
185 ALOGV("startOutput()");
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700186 sp<AudioPolicyEffects>audioPolicyEffects;
187 {
188 Mutex::Autolock _l(mLock);
189 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800190 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700191 if (audioPolicyEffects != 0) {
192 // create audio processors according to stream
193 status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
194 if (status != NO_ERROR && status != ALREADY_EXISTS) {
195 ALOGW("Failed to add effects on session %d", session);
196 }
197 }
198 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700199 return mAudioPolicyManager->startOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800200}
201
202status_t AudioPolicyService::stopOutput(audio_io_handle_t output,
203 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800204 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800205{
Eric Laurentdea15412014-10-28 15:46:45 -0700206 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
207 return BAD_VALUE;
208 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700209 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800210 return NO_INIT;
211 }
212 ALOGV("stopOutput()");
213 mOutputCommandThread->stopOutputCommand(output, stream, session);
214 return NO_ERROR;
215}
216
217status_t AudioPolicyService::doStopOutput(audio_io_handle_t output,
218 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800219 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800220{
221 ALOGV("doStopOutput from tid %d", gettid());
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700222 sp<AudioPolicyEffects>audioPolicyEffects;
223 {
224 Mutex::Autolock _l(mLock);
225 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800226 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700227 if (audioPolicyEffects != 0) {
228 // release audio processors from the stream
229 status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
230 if (status != NO_ERROR && status != ALREADY_EXISTS) {
231 ALOGW("Failed to release effects on session %d", session);
232 }
233 }
234 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700235 return mAudioPolicyManager->stopOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800236}
237
Eric Laurente83b55d2014-11-14 10:06:21 -0800238void AudioPolicyService::releaseOutput(audio_io_handle_t output,
239 audio_stream_type_t stream,
240 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800241{
Eric Laurentdce54a12014-03-10 12:19:46 -0700242 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800243 return;
244 }
245 ALOGV("releaseOutput()");
Eric Laurente83b55d2014-11-14 10:06:21 -0800246 mOutputCommandThread->releaseOutputCommand(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800247}
248
Eric Laurente83b55d2014-11-14 10:06:21 -0800249void AudioPolicyService::doReleaseOutput(audio_io_handle_t output,
250 audio_stream_type_t stream,
251 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800252{
253 ALOGV("doReleaseOutput from tid %d", gettid());
254 Mutex::Autolock _l(mLock);
Eric Laurente83b55d2014-11-14 10:06:21 -0800255 mAudioPolicyManager->releaseOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800256}
257
Eric Laurentcaf7f482014-11-25 17:50:47 -0800258status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
259 audio_io_handle_t *input,
260 audio_session_t session,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700261 uid_t uid,
Eric Laurentcaf7f482014-11-25 17:50:47 -0800262 uint32_t samplingRate,
263 audio_format_t format,
264 audio_channel_mask_t channelMask,
Paul McLean466dc8e2015-04-17 13:15:36 -0600265 audio_input_flags_t flags,
266 audio_port_handle_t selectedDeviceId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800267{
Eric Laurentdce54a12014-03-10 12:19:46 -0700268 if (mAudioPolicyManager == NULL) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800269 return NO_INIT;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800270 }
271 // already checked by client, but double-check in case the client wrapper is bypassed
Eric Laurentcaf7f482014-11-25 17:50:47 -0800272 if (attr->source >= AUDIO_SOURCE_CNT && attr->source != AUDIO_SOURCE_HOTWORD &&
273 attr->source != AUDIO_SOURCE_FM_TUNER) {
274 return BAD_VALUE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800275 }
276
Eric Laurentab300c82015-04-13 13:47:33 -0700277 if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800278 return BAD_VALUE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800279 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700280 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentcaf7f482014-11-25 17:50:47 -0800281 status_t status;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800282 AudioPolicyInterface::input_type_t inputType;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700283 // if the caller is us, trust the specified uid
284 if (IPCThreadState::self()->getCallingPid() != getpid_cached || uid == (uid_t)-1) {
285 uid_t newclientUid = IPCThreadState::self()->getCallingUid();
286 if (uid != (uid_t)-1 && uid != newclientUid) {
287 ALOGW("%s uid %d tried to pass itself off as %d", __FUNCTION__, newclientUid, uid);
288 }
289 uid = newclientUid;
290 }
291
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700292 {
293 Mutex::Autolock _l(mLock);
294 // the audio_in_acoustics_t parameter is ignored by get_input()
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700295 status = mAudioPolicyManager->getInputForAttr(attr, input, session, uid,
Eric Laurentcaf7f482014-11-25 17:50:47 -0800296 samplingRate, format, channelMask,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700297 flags, selectedDeviceId,
298 &inputType);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700299 audioPolicyEffects = mAudioPolicyEffects;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800300
301 if (status == NO_ERROR) {
302 // enforce permission (if any) required for each type of input
303 switch (inputType) {
304 case AudioPolicyInterface::API_INPUT_LEGACY:
305 break;
306 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
307 if (!captureAudioOutputAllowed()) {
308 ALOGE("getInputForAttr() permission denied: capture not allowed");
309 status = PERMISSION_DENIED;
310 }
311 break;
312 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE:
313 if (!modifyAudioRoutingAllowed()) {
314 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed");
315 status = PERMISSION_DENIED;
316 }
317 break;
318 case AudioPolicyInterface::API_INPUT_INVALID:
319 default:
320 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d",
321 (int)inputType);
322 }
323 }
324
325 if (status != NO_ERROR) {
326 if (status == PERMISSION_DENIED) {
327 mAudioPolicyManager->releaseInput(*input, session);
328 }
329 return status;
330 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700331 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800332
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700333 if (audioPolicyEffects != 0) {
334 // create audio pre processors according to input source
Eric Laurentcaf7f482014-11-25 17:50:47 -0800335 status_t status = audioPolicyEffects->addInputEffects(*input, attr->source, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700336 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800337 ALOGW("Failed to add effects on input %d", *input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700338 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800339 }
Eric Laurentcaf7f482014-11-25 17:50:47 -0800340 return NO_ERROR;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800341}
342
Eric Laurent4dc68062014-07-28 17:26:49 -0700343status_t AudioPolicyService::startInput(audio_io_handle_t input,
344 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800345{
Eric Laurentdce54a12014-03-10 12:19:46 -0700346 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800347 return NO_INIT;
348 }
349 Mutex::Autolock _l(mLock);
350
Eric Laurent4dc68062014-07-28 17:26:49 -0700351 return mAudioPolicyManager->startInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800352}
353
Eric Laurent4dc68062014-07-28 17:26:49 -0700354status_t AudioPolicyService::stopInput(audio_io_handle_t input,
355 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800356{
Eric Laurentdce54a12014-03-10 12:19:46 -0700357 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800358 return NO_INIT;
359 }
360 Mutex::Autolock _l(mLock);
361
Eric Laurent4dc68062014-07-28 17:26:49 -0700362 return mAudioPolicyManager->stopInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800363}
364
Eric Laurent4dc68062014-07-28 17:26:49 -0700365void AudioPolicyService::releaseInput(audio_io_handle_t input,
366 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800367{
Eric Laurentdce54a12014-03-10 12:19:46 -0700368 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800369 return;
370 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700371 sp<AudioPolicyEffects>audioPolicyEffects;
372 {
373 Mutex::Autolock _l(mLock);
374 mAudioPolicyManager->releaseInput(input, session);
375 audioPolicyEffects = mAudioPolicyEffects;
376 }
377 if (audioPolicyEffects != 0) {
378 // release audio processors from the input
379 status_t status = audioPolicyEffects->releaseInputEffects(input);
380 if(status != NO_ERROR) {
381 ALOGW("Failed to release effects on input %d", input);
382 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800383 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800384}
385
386status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
387 int indexMin,
388 int indexMax)
389{
Eric Laurentdce54a12014-03-10 12:19:46 -0700390 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800391 return NO_INIT;
392 }
393 if (!settingsAllowed()) {
394 return PERMISSION_DENIED;
395 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800396 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800397 return BAD_VALUE;
398 }
399 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700400 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800401 return NO_ERROR;
402}
403
404status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
405 int index,
406 audio_devices_t device)
407{
Eric Laurentdce54a12014-03-10 12:19:46 -0700408 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800409 return NO_INIT;
410 }
411 if (!settingsAllowed()) {
412 return PERMISSION_DENIED;
413 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800414 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800415 return BAD_VALUE;
416 }
417 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700418 return mAudioPolicyManager->setStreamVolumeIndex(stream,
419 index,
420 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800421}
422
423status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
424 int *index,
425 audio_devices_t device)
426{
Eric Laurentdce54a12014-03-10 12:19:46 -0700427 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800428 return NO_INIT;
429 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800430 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800431 return BAD_VALUE;
432 }
433 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700434 return mAudioPolicyManager->getStreamVolumeIndex(stream,
435 index,
436 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800437}
438
439uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
440{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800441 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700442 return 0;
Eric Laurentdea15412014-10-28 15:46:45 -0700443 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700444 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800445 return 0;
446 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700447 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800448}
449
450//audio policy: use audio_device_t appropriately
451
452audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
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 AUDIO_DEVICE_NONE;
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 AUDIO_DEVICE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800459 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700460 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800461}
462
463audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
464{
465 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700466 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800467 return 0;
468 }
469 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700470 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800471}
472
473status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
474 audio_io_handle_t io,
475 uint32_t strategy,
476 int session,
477 int id)
478{
Eric Laurentdce54a12014-03-10 12:19:46 -0700479 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800480 return NO_INIT;
481 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700482 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800483}
484
485status_t AudioPolicyService::unregisterEffect(int id)
486{
Eric Laurentdce54a12014-03-10 12:19:46 -0700487 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800488 return NO_INIT;
489 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700490 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800491}
492
493status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
494{
Eric Laurentdce54a12014-03-10 12:19:46 -0700495 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800496 return NO_INIT;
497 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700498 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800499}
500
501bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
502{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800503 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700504 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700505 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700506 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700507 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800508 }
509 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700510 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800511}
512
513bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
514{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800515 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700516 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700517 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700518 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700519 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800520 }
521 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700522 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800523}
524
525bool AudioPolicyService::isSourceActive(audio_source_t source) const
526{
Eric Laurentdce54a12014-03-10 12:19:46 -0700527 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800528 return false;
529 }
530 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700531 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800532}
533
534status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
535 effect_descriptor_t *descriptors,
536 uint32_t *count)
537{
Eric Laurentdce54a12014-03-10 12:19:46 -0700538 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800539 *count = 0;
540 return NO_INIT;
541 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700542 sp<AudioPolicyEffects>audioPolicyEffects;
543 {
544 Mutex::Autolock _l(mLock);
545 audioPolicyEffects = mAudioPolicyEffects;
546 }
547 if (audioPolicyEffects == 0) {
548 *count = 0;
549 return NO_INIT;
550 }
551 return audioPolicyEffects->queryDefaultInputEffects(audioSession, descriptors, count);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800552}
553
554bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
555{
Eric Laurentdce54a12014-03-10 12:19:46 -0700556 if (mAudioPolicyManager == NULL) {
557 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800558 return false;
559 }
560
Eric Laurentdce54a12014-03-10 12:19:46 -0700561 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800562}
563
Eric Laurent6a94d692014-05-20 11:18:06 -0700564status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
565 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -0700566 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -0700567 struct audio_port *ports,
568 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700569{
Eric Laurent6a94d692014-05-20 11:18:06 -0700570 Mutex::Autolock _l(mLock);
571 if (mAudioPolicyManager == NULL) {
572 return NO_INIT;
573 }
574
575 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700576}
577
Eric Laurent6a94d692014-05-20 11:18:06 -0700578status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -0700579{
Eric Laurent6a94d692014-05-20 11:18:06 -0700580 Mutex::Autolock _l(mLock);
581 if (mAudioPolicyManager == NULL) {
582 return NO_INIT;
583 }
584
585 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -0700586}
587
Eric Laurent6a94d692014-05-20 11:18:06 -0700588status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
589 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700590{
Eric Laurent6a94d692014-05-20 11:18:06 -0700591 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700592 if(!modifyAudioRoutingAllowed()) {
593 return PERMISSION_DENIED;
594 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700595 if (mAudioPolicyManager == NULL) {
596 return NO_INIT;
597 }
598 return mAudioPolicyManager->createAudioPatch(patch, handle,
599 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700600}
601
Eric Laurent6a94d692014-05-20 11:18:06 -0700602status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700603{
Eric Laurent6a94d692014-05-20 11:18:06 -0700604 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700605 if(!modifyAudioRoutingAllowed()) {
606 return PERMISSION_DENIED;
607 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700608 if (mAudioPolicyManager == NULL) {
609 return NO_INIT;
610 }
611
612 return mAudioPolicyManager->releaseAudioPatch(handle,
613 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700614}
615
616status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -0700617 struct audio_patch *patches,
618 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700619{
Eric Laurent6a94d692014-05-20 11:18:06 -0700620 Mutex::Autolock _l(mLock);
621 if (mAudioPolicyManager == NULL) {
622 return NO_INIT;
623 }
624
625 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700626}
627
Eric Laurent6a94d692014-05-20 11:18:06 -0700628status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -0700629{
Eric Laurent6a94d692014-05-20 11:18:06 -0700630 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700631 if(!modifyAudioRoutingAllowed()) {
632 return PERMISSION_DENIED;
633 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700634 if (mAudioPolicyManager == NULL) {
635 return NO_INIT;
636 }
637
638 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -0700639}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800640
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700641status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
642 audio_io_handle_t *ioHandle,
643 audio_devices_t *device)
644{
645 if (mAudioPolicyManager == NULL) {
646 return NO_INIT;
647 }
648
649 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
650}
651
652status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
653{
654 if (mAudioPolicyManager == NULL) {
655 return NO_INIT;
656 }
657
658 return mAudioPolicyManager->releaseSoundTriggerSession(session);
659}
660
Eric Laurentbaac1832014-12-01 17:52:59 -0800661status_t AudioPolicyService::registerPolicyMixes(Vector<AudioMix> mixes, bool registration)
662{
663 Mutex::Autolock _l(mLock);
664 if(!modifyAudioRoutingAllowed()) {
665 return PERMISSION_DENIED;
666 }
667 if (mAudioPolicyManager == NULL) {
668 return NO_INIT;
669 }
670 if (registration) {
671 return mAudioPolicyManager->registerPolicyMixes(mixes);
672 } else {
673 return mAudioPolicyManager->unregisterPolicyMixes(mixes);
674 }
675}
676
Eric Laurent554a2772015-04-10 11:29:24 -0700677status_t AudioPolicyService::startAudioSource(const struct audio_port_config *source,
678 const audio_attributes_t *attributes,
679 audio_io_handle_t *handle)
680{
681 Mutex::Autolock _l(mLock);
682 if (mAudioPolicyManager == NULL) {
683 return NO_INIT;
684 }
685
686 return mAudioPolicyManager->startAudioSource(source, attributes, handle);
687}
688
689status_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle)
690{
691 Mutex::Autolock _l(mLock);
692 if (mAudioPolicyManager == NULL) {
693 return NO_INIT;
694 }
695
696 return mAudioPolicyManager->stopAudioSource(handle);
697}
698
Eric Laurent2d388ec2014-03-07 13:25:54 -0800699}; // namespace android