blob: c9eb31fd0c2d153b55a042d7c10e4cee87df9f04 [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
Eric Laurentbeb07fe2015-09-16 15:49:30 -070079 // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic
80 // operation from policy manager standpoint (no other operation (e.g track start or stop)
81 // can be interleaved).
82 Mutex::Autolock _l(mLock);
83
Eric Laurent2d388ec2014-03-07 13:25:54 -080084 // TODO: check if it is more appropriate to do it in platform specific policy manager
85 AudioSystem::setMode(state);
86
Eric Laurentdce54a12014-03-10 12:19:46 -070087 mAudioPolicyManager->setPhoneState(state);
Eric Laurentbb6c9a02014-09-25 14:11:47 -070088 mPhoneState = state;
Eric Laurent2d388ec2014-03-07 13:25:54 -080089 return NO_ERROR;
90}
91
Eric Laurentbb6c9a02014-09-25 14:11:47 -070092audio_mode_t AudioPolicyService::getPhoneState()
93{
94 Mutex::Autolock _l(mLock);
95 return mPhoneState;
96}
97
Eric Laurent2d388ec2014-03-07 13:25:54 -080098status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
99 audio_policy_forced_cfg_t config)
100{
Eric Laurentdce54a12014-03-10 12:19:46 -0700101 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800102 return NO_INIT;
103 }
104 if (!settingsAllowed()) {
105 return PERMISSION_DENIED;
106 }
107 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
108 return BAD_VALUE;
109 }
110 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
111 return BAD_VALUE;
112 }
113 ALOGV("setForceUse()");
114 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700115 mAudioPolicyManager->setForceUse(usage, config);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800116 return NO_ERROR;
117}
118
119audio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage)
120{
Eric Laurentdce54a12014-03-10 12:19:46 -0700121 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800122 return AUDIO_POLICY_FORCE_NONE;
123 }
124 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
125 return AUDIO_POLICY_FORCE_NONE;
126 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700127 return mAudioPolicyManager->getForceUse(usage);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800128}
129
130audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream,
131 uint32_t samplingRate,
132 audio_format_t format,
133 audio_channel_mask_t channelMask,
134 audio_output_flags_t flags,
135 const audio_offload_info_t *offloadInfo)
136{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800137 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700138 return AUDIO_IO_HANDLE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700139 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700140 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700141 return AUDIO_IO_HANDLE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800142 }
143 ALOGV("getOutput()");
144 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700145 return mAudioPolicyManager->getOutput(stream, samplingRate,
Eric Laurent2d388ec2014-03-07 13:25:54 -0800146 format, channelMask, flags, offloadInfo);
147}
148
Eric Laurente83b55d2014-11-14 10:06:21 -0800149status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
150 audio_io_handle_t *output,
151 audio_session_t session,
152 audio_stream_type_t *stream,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700153 uid_t uid,
Eric Laurente83b55d2014-11-14 10:06:21 -0800154 uint32_t samplingRate,
155 audio_format_t format,
156 audio_channel_mask_t channelMask,
157 audio_output_flags_t flags,
Paul McLean466dc8e2015-04-17 13:15:36 -0600158 audio_port_handle_t selectedDeviceId,
Eric Laurente83b55d2014-11-14 10:06:21 -0800159 const audio_offload_info_t *offloadInfo)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700160{
161 if (mAudioPolicyManager == NULL) {
Eric Laurente83b55d2014-11-14 10:06:21 -0800162 return NO_INIT;
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700163 }
164 ALOGV("getOutput()");
165 Mutex::Autolock _l(mLock);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700166
Marco Nelissendcb346b2015-09-09 10:47:29 -0700167 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
168 if (!isTrustedCallingUid(callingUid) || uid == (uid_t)-1) {
169 ALOGW_IF(uid != (uid_t)-1 && uid != callingUid,
170 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, uid);
171 uid = callingUid;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700172 }
173 return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, samplingRate,
Paul McLean466dc8e2015-04-17 13:15:36 -0600174 format, channelMask, flags, selectedDeviceId, offloadInfo);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700175}
176
Eric Laurent2d388ec2014-03-07 13:25:54 -0800177status_t AudioPolicyService::startOutput(audio_io_handle_t output,
178 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800179 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800180{
Eric Laurentdea15412014-10-28 15:46:45 -0700181 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
182 return BAD_VALUE;
183 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700184 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800185 return NO_INIT;
186 }
187 ALOGV("startOutput()");
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700188 sp<AudioPolicyEffects>audioPolicyEffects;
189 {
190 Mutex::Autolock _l(mLock);
191 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800192 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700193 if (audioPolicyEffects != 0) {
194 // create audio processors according to stream
195 status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
196 if (status != NO_ERROR && status != ALREADY_EXISTS) {
197 ALOGW("Failed to add effects on session %d", session);
198 }
199 }
200 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700201 return mAudioPolicyManager->startOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800202}
203
204status_t AudioPolicyService::stopOutput(audio_io_handle_t output,
205 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800206 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800207{
Eric Laurentdea15412014-10-28 15:46:45 -0700208 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
209 return BAD_VALUE;
210 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700211 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800212 return NO_INIT;
213 }
214 ALOGV("stopOutput()");
215 mOutputCommandThread->stopOutputCommand(output, stream, session);
216 return NO_ERROR;
217}
218
219status_t AudioPolicyService::doStopOutput(audio_io_handle_t output,
220 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800221 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800222{
223 ALOGV("doStopOutput from tid %d", gettid());
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700224 sp<AudioPolicyEffects>audioPolicyEffects;
225 {
226 Mutex::Autolock _l(mLock);
227 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800228 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700229 if (audioPolicyEffects != 0) {
230 // release audio processors from the stream
231 status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
232 if (status != NO_ERROR && status != ALREADY_EXISTS) {
233 ALOGW("Failed to release effects on session %d", session);
234 }
235 }
236 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700237 return mAudioPolicyManager->stopOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800238}
239
Eric Laurente83b55d2014-11-14 10:06:21 -0800240void AudioPolicyService::releaseOutput(audio_io_handle_t output,
241 audio_stream_type_t stream,
242 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800243{
Eric Laurentdce54a12014-03-10 12:19:46 -0700244 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800245 return;
246 }
247 ALOGV("releaseOutput()");
Eric Laurente83b55d2014-11-14 10:06:21 -0800248 mOutputCommandThread->releaseOutputCommand(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800249}
250
Eric Laurente83b55d2014-11-14 10:06:21 -0800251void AudioPolicyService::doReleaseOutput(audio_io_handle_t output,
252 audio_stream_type_t stream,
253 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800254{
255 ALOGV("doReleaseOutput from tid %d", gettid());
256 Mutex::Autolock _l(mLock);
Eric Laurente83b55d2014-11-14 10:06:21 -0800257 mAudioPolicyManager->releaseOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800258}
259
Eric Laurentcaf7f482014-11-25 17:50:47 -0800260status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
261 audio_io_handle_t *input,
262 audio_session_t session,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700263 uid_t uid,
Eric Laurentcaf7f482014-11-25 17:50:47 -0800264 uint32_t samplingRate,
265 audio_format_t format,
266 audio_channel_mask_t channelMask,
Paul McLean466dc8e2015-04-17 13:15:36 -0600267 audio_input_flags_t flags,
268 audio_port_handle_t selectedDeviceId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800269{
Eric Laurentdce54a12014-03-10 12:19:46 -0700270 if (mAudioPolicyManager == NULL) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800271 return NO_INIT;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800272 }
273 // already checked by client, but double-check in case the client wrapper is bypassed
Eric Laurentcaf7f482014-11-25 17:50:47 -0800274 if (attr->source >= AUDIO_SOURCE_CNT && attr->source != AUDIO_SOURCE_HOTWORD &&
275 attr->source != AUDIO_SOURCE_FM_TUNER) {
276 return BAD_VALUE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800277 }
278
Eric Laurentab300c82015-04-13 13:47:33 -0700279 if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed()) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800280 return BAD_VALUE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800281 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700282 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentcaf7f482014-11-25 17:50:47 -0800283 status_t status;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800284 AudioPolicyInterface::input_type_t inputType;
Marco Nelissendcb346b2015-09-09 10:47:29 -0700285 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
286 if (!isTrustedCallingUid(callingUid) || uid == (uid_t)-1) {
287 ALOGW_IF(uid != (uid_t)-1 && uid != callingUid,
288 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, uid);
289 uid = callingUid;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700290 }
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;
Eric Laurent82db2692015-08-07 13:59:42 -0700306 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX:
307 // FIXME: use the same permission as for remote submix for now.
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800308 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
309 if (!captureAudioOutputAllowed()) {
310 ALOGE("getInputForAttr() permission denied: capture not allowed");
311 status = PERMISSION_DENIED;
312 }
313 break;
314 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE:
315 if (!modifyAudioRoutingAllowed()) {
316 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed");
317 status = PERMISSION_DENIED;
318 }
319 break;
320 case AudioPolicyInterface::API_INPUT_INVALID:
321 default:
322 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d",
323 (int)inputType);
324 }
325 }
326
327 if (status != NO_ERROR) {
328 if (status == PERMISSION_DENIED) {
329 mAudioPolicyManager->releaseInput(*input, session);
330 }
331 return status;
332 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700333 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800334
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700335 if (audioPolicyEffects != 0) {
336 // create audio pre processors according to input source
Eric Laurentcaf7f482014-11-25 17:50:47 -0800337 status_t status = audioPolicyEffects->addInputEffects(*input, attr->source, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700338 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800339 ALOGW("Failed to add effects on input %d", *input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700340 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800341 }
Eric Laurentcaf7f482014-11-25 17:50:47 -0800342 return NO_ERROR;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800343}
344
Eric Laurent4dc68062014-07-28 17:26:49 -0700345status_t AudioPolicyService::startInput(audio_io_handle_t input,
346 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800347{
Eric Laurentdce54a12014-03-10 12:19:46 -0700348 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800349 return NO_INIT;
350 }
351 Mutex::Autolock _l(mLock);
Eric Laurentfb66dd92016-01-28 18:32:03 -0800352 AudioPolicyInterface::concurrency_type__mask_t concurrency;
353 status_t status = mAudioPolicyManager->startInput(input, session, &concurrency);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800354
Eric Laurentfb66dd92016-01-28 18:32:03 -0800355 if (status == NO_ERROR) {
Eric Laurent43423352016-02-05 11:57:57 -0800356 LOG_ALWAYS_FATAL_IF(concurrency & ~AudioPolicyInterface::API_INPUT_CONCURRENCY_ALL,
357 "startInput(): invalid concurrency type %d", (int)concurrency);
358
Eric Laurentfb66dd92016-01-28 18:32:03 -0800359 // enforce permission (if any) required for each type of concurrency
Eric Laurent43423352016-02-05 11:57:57 -0800360 if (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_CALL) {
Eric Laurentfb66dd92016-01-28 18:32:03 -0800361 //TODO: check incall capture permission
Eric Laurent43423352016-02-05 11:57:57 -0800362 }
363 if (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_CAPTURE) {
Eric Laurentfb66dd92016-01-28 18:32:03 -0800364 //TODO: check concurrent capture permission
Eric Laurentfb66dd92016-01-28 18:32:03 -0800365 }
366 }
367
368 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800369}
370
Eric Laurent4dc68062014-07-28 17:26:49 -0700371status_t AudioPolicyService::stopInput(audio_io_handle_t input,
372 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800373{
Eric Laurentdce54a12014-03-10 12:19:46 -0700374 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800375 return NO_INIT;
376 }
377 Mutex::Autolock _l(mLock);
378
Eric Laurent4dc68062014-07-28 17:26:49 -0700379 return mAudioPolicyManager->stopInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800380}
381
Eric Laurent4dc68062014-07-28 17:26:49 -0700382void AudioPolicyService::releaseInput(audio_io_handle_t input,
383 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800384{
Eric Laurentdce54a12014-03-10 12:19:46 -0700385 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800386 return;
387 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700388 sp<AudioPolicyEffects>audioPolicyEffects;
389 {
390 Mutex::Autolock _l(mLock);
391 mAudioPolicyManager->releaseInput(input, session);
392 audioPolicyEffects = mAudioPolicyEffects;
393 }
394 if (audioPolicyEffects != 0) {
395 // release audio processors from the input
Eric Laurentfb66dd92016-01-28 18:32:03 -0800396 status_t status = audioPolicyEffects->releaseInputEffects(input, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700397 if(status != NO_ERROR) {
398 ALOGW("Failed to release effects on input %d", input);
399 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800400 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800401}
402
403status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
404 int indexMin,
405 int indexMax)
406{
Eric Laurentdce54a12014-03-10 12:19:46 -0700407 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800408 return NO_INIT;
409 }
410 if (!settingsAllowed()) {
411 return PERMISSION_DENIED;
412 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800413 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800414 return BAD_VALUE;
415 }
416 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700417 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800418 return NO_ERROR;
419}
420
421status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
422 int index,
423 audio_devices_t device)
424{
Eric Laurentdce54a12014-03-10 12:19:46 -0700425 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800426 return NO_INIT;
427 }
428 if (!settingsAllowed()) {
429 return PERMISSION_DENIED;
430 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800431 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800432 return BAD_VALUE;
433 }
434 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700435 return mAudioPolicyManager->setStreamVolumeIndex(stream,
436 index,
437 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800438}
439
440status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
441 int *index,
442 audio_devices_t device)
443{
Eric Laurentdce54a12014-03-10 12:19:46 -0700444 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800445 return NO_INIT;
446 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800447 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800448 return BAD_VALUE;
449 }
450 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700451 return mAudioPolicyManager->getStreamVolumeIndex(stream,
452 index,
453 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800454}
455
456uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
457{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800458 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700459 return 0;
Eric Laurentdea15412014-10-28 15:46:45 -0700460 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700461 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800462 return 0;
463 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700464 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800465}
466
467//audio policy: use audio_device_t appropriately
468
469audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
470{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800471 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700472 return AUDIO_DEVICE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700473 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700474 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700475 return AUDIO_DEVICE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800476 }
Haynes Mathew Georgedfb9f3b2015-10-26 18:22:13 -0700477 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700478 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800479}
480
481audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
482{
483 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700484 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800485 return 0;
486 }
487 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700488 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800489}
490
491status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
492 audio_io_handle_t io,
493 uint32_t strategy,
494 int session,
495 int id)
496{
Eric Laurentdce54a12014-03-10 12:19:46 -0700497 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800498 return NO_INIT;
499 }
Haynes Mathew Georgebab7bf42015-10-30 18:02:23 -0700500 Mutex::Autolock _l(mEffectsLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700501 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800502}
503
504status_t AudioPolicyService::unregisterEffect(int id)
505{
Eric Laurentdce54a12014-03-10 12:19:46 -0700506 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800507 return NO_INIT;
508 }
Haynes Mathew Georgebab7bf42015-10-30 18:02:23 -0700509 Mutex::Autolock _l(mEffectsLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700510 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800511}
512
513status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
514{
Eric Laurentdce54a12014-03-10 12:19:46 -0700515 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800516 return NO_INIT;
517 }
Haynes Mathew Georgebab7bf42015-10-30 18:02:23 -0700518 Mutex::Autolock _l(mEffectsLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700519 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800520}
521
522bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
523{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800524 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700525 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700526 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700527 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700528 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800529 }
530 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700531 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800532}
533
534bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
535{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800536 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700537 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700538 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700539 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700540 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800541 }
542 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700543 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800544}
545
546bool AudioPolicyService::isSourceActive(audio_source_t source) const
547{
Eric Laurentdce54a12014-03-10 12:19:46 -0700548 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800549 return false;
550 }
551 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700552 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800553}
554
555status_t AudioPolicyService::queryDefaultPreProcessing(int audioSession,
556 effect_descriptor_t *descriptors,
557 uint32_t *count)
558{
Eric Laurentdce54a12014-03-10 12:19:46 -0700559 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800560 *count = 0;
561 return NO_INIT;
562 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700563 sp<AudioPolicyEffects>audioPolicyEffects;
564 {
565 Mutex::Autolock _l(mLock);
566 audioPolicyEffects = mAudioPolicyEffects;
567 }
568 if (audioPolicyEffects == 0) {
569 *count = 0;
570 return NO_INIT;
571 }
Eric Laurentfb66dd92016-01-28 18:32:03 -0800572 return audioPolicyEffects->queryDefaultInputEffects(
573 (audio_session_t)audioSession, descriptors, count);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800574}
575
576bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
577{
Eric Laurentdce54a12014-03-10 12:19:46 -0700578 if (mAudioPolicyManager == NULL) {
579 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800580 return false;
581 }
Andy Hung2ddee192015-12-18 17:34:44 -0800582 Mutex::Autolock _l(mLock);
Haynes Mathew Georgebab7bf42015-10-30 18:02:23 -0700583 Mutex::Autolock _le(mEffectsLock); // isOffloadSupported queries for
584 // non-offloadable effects
Eric Laurentdce54a12014-03-10 12:19:46 -0700585 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800586}
587
Eric Laurent6a94d692014-05-20 11:18:06 -0700588status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
589 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -0700590 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -0700591 struct audio_port *ports,
592 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700593{
Eric Laurent6a94d692014-05-20 11:18:06 -0700594 Mutex::Autolock _l(mLock);
595 if (mAudioPolicyManager == NULL) {
596 return NO_INIT;
597 }
598
599 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700600}
601
Eric Laurent6a94d692014-05-20 11:18:06 -0700602status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -0700603{
Eric Laurent6a94d692014-05-20 11:18:06 -0700604 Mutex::Autolock _l(mLock);
605 if (mAudioPolicyManager == NULL) {
606 return NO_INIT;
607 }
608
609 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -0700610}
611
Eric Laurent6a94d692014-05-20 11:18:06 -0700612status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
613 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700614{
Eric Laurent6a94d692014-05-20 11:18:06 -0700615 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700616 if(!modifyAudioRoutingAllowed()) {
617 return PERMISSION_DENIED;
618 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700619 if (mAudioPolicyManager == NULL) {
620 return NO_INIT;
621 }
622 return mAudioPolicyManager->createAudioPatch(patch, handle,
623 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700624}
625
Eric Laurent6a94d692014-05-20 11:18:06 -0700626status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700627{
Eric Laurent6a94d692014-05-20 11:18:06 -0700628 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700629 if(!modifyAudioRoutingAllowed()) {
630 return PERMISSION_DENIED;
631 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700632 if (mAudioPolicyManager == NULL) {
633 return NO_INIT;
634 }
635
636 return mAudioPolicyManager->releaseAudioPatch(handle,
637 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700638}
639
640status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -0700641 struct audio_patch *patches,
642 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700643{
Eric Laurent6a94d692014-05-20 11:18:06 -0700644 Mutex::Autolock _l(mLock);
645 if (mAudioPolicyManager == NULL) {
646 return NO_INIT;
647 }
648
649 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700650}
651
Eric Laurent6a94d692014-05-20 11:18:06 -0700652status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -0700653{
Eric Laurent6a94d692014-05-20 11:18:06 -0700654 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700655 if(!modifyAudioRoutingAllowed()) {
656 return PERMISSION_DENIED;
657 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700658 if (mAudioPolicyManager == NULL) {
659 return NO_INIT;
660 }
661
662 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -0700663}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800664
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700665status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
666 audio_io_handle_t *ioHandle,
667 audio_devices_t *device)
668{
669 if (mAudioPolicyManager == NULL) {
670 return NO_INIT;
671 }
672
673 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
674}
675
676status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
677{
678 if (mAudioPolicyManager == NULL) {
679 return NO_INIT;
680 }
681
682 return mAudioPolicyManager->releaseSoundTriggerSession(session);
683}
684
Eric Laurentbaac1832014-12-01 17:52:59 -0800685status_t AudioPolicyService::registerPolicyMixes(Vector<AudioMix> mixes, bool registration)
686{
687 Mutex::Autolock _l(mLock);
688 if(!modifyAudioRoutingAllowed()) {
689 return PERMISSION_DENIED;
690 }
691 if (mAudioPolicyManager == NULL) {
692 return NO_INIT;
693 }
694 if (registration) {
695 return mAudioPolicyManager->registerPolicyMixes(mixes);
696 } else {
697 return mAudioPolicyManager->unregisterPolicyMixes(mixes);
698 }
699}
700
Eric Laurent554a2772015-04-10 11:29:24 -0700701status_t AudioPolicyService::startAudioSource(const struct audio_port_config *source,
702 const audio_attributes_t *attributes,
703 audio_io_handle_t *handle)
704{
705 Mutex::Autolock _l(mLock);
706 if (mAudioPolicyManager == NULL) {
707 return NO_INIT;
708 }
709
Eric Laurentd60560a2015-04-10 11:31:20 -0700710 return mAudioPolicyManager->startAudioSource(source, attributes, handle,
711 IPCThreadState::self()->getCallingUid());
Eric Laurent554a2772015-04-10 11:29:24 -0700712}
713
714status_t AudioPolicyService::stopAudioSource(audio_io_handle_t handle)
715{
716 Mutex::Autolock _l(mLock);
717 if (mAudioPolicyManager == NULL) {
718 return NO_INIT;
719 }
720
721 return mAudioPolicyManager->stopAudioSource(handle);
722}
723
Andy Hung2ddee192015-12-18 17:34:44 -0800724status_t AudioPolicyService::setMasterMono(bool mono)
725{
726 if (mAudioPolicyManager == NULL) {
727 return NO_INIT;
728 }
729 if (!settingsAllowed()) {
730 return PERMISSION_DENIED;
731 }
732 Mutex::Autolock _l(mLock);
733 return mAudioPolicyManager->setMasterMono(mono);
734}
735
736status_t AudioPolicyService::getMasterMono(bool *mono)
737{
738 if (mAudioPolicyManager == NULL) {
739 return NO_INIT;
740 }
741 Mutex::Autolock _l(mLock);
742 return mAudioPolicyManager->getMasterMono(mono);
743}
744
Eric Laurent2d388ec2014-03-07 13:25:54 -0800745}; // namespace android