blob: dc676d0d369c10c80a464b53bd4b51a9c0563088 [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 }
Eric Laurent2d388ec2014-03-07 13:25:54 -080040 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
41 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
42 return BAD_VALUE;
43 }
44
45 ALOGV("setDeviceConnectionState()");
46 Mutex::Autolock _l(mLock);
Paul McLeane743a472015-01-28 11:07:31 -080047 return mAudioPolicyManager->setDeviceConnectionState(device, state,
48 device_address, device_name);
Eric Laurent2d388ec2014-03-07 13:25:54 -080049}
50
51audio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState(
52 audio_devices_t device,
53 const char *device_address)
54{
Eric Laurentdce54a12014-03-10 12:19:46 -070055 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080056 return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
57 }
Eric Laurentdce54a12014-03-10 12:19:46 -070058 return mAudioPolicyManager->getDeviceConnectionState(device,
Eric Laurent2d388ec2014-03-07 13:25:54 -080059 device_address);
60}
61
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -080062status_t AudioPolicyService::handleDeviceConfigChange(audio_devices_t device,
63 const char *device_address,
64 const char *device_name)
65{
66 if (mAudioPolicyManager == NULL) {
67 return NO_INIT;
68 }
69 if (!settingsAllowed()) {
70 return PERMISSION_DENIED;
71 }
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -080072
73 ALOGV("handleDeviceConfigChange()");
74 Mutex::Autolock _l(mLock);
75 return mAudioPolicyManager->handleDeviceConfigChange(device, device_address,
76 device_name);
77}
78
Eric Laurent2d388ec2014-03-07 13:25:54 -080079status_t AudioPolicyService::setPhoneState(audio_mode_t state)
80{
Eric Laurentdce54a12014-03-10 12:19:46 -070081 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080082 return NO_INIT;
83 }
84 if (!settingsAllowed()) {
85 return PERMISSION_DENIED;
86 }
87 if (uint32_t(state) >= AUDIO_MODE_CNT) {
88 return BAD_VALUE;
89 }
90
91 ALOGV("setPhoneState()");
92
Eric Laurentbeb07fe2015-09-16 15:49:30 -070093 // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic
94 // operation from policy manager standpoint (no other operation (e.g track start or stop)
95 // can be interleaved).
96 Mutex::Autolock _l(mLock);
97
Eric Laurent2d388ec2014-03-07 13:25:54 -080098 // TODO: check if it is more appropriate to do it in platform specific policy manager
99 AudioSystem::setMode(state);
100
Eric Laurentdce54a12014-03-10 12:19:46 -0700101 mAudioPolicyManager->setPhoneState(state);
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700102 mPhoneState = state;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800103 return NO_ERROR;
104}
105
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700106audio_mode_t AudioPolicyService::getPhoneState()
107{
108 Mutex::Autolock _l(mLock);
109 return mPhoneState;
110}
111
Eric Laurent2d388ec2014-03-07 13:25:54 -0800112status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
113 audio_policy_forced_cfg_t config)
114{
Eric Laurentdce54a12014-03-10 12:19:46 -0700115 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800116 return NO_INIT;
117 }
118 if (!settingsAllowed()) {
119 return PERMISSION_DENIED;
120 }
121 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
122 return BAD_VALUE;
123 }
124 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
125 return BAD_VALUE;
126 }
127 ALOGV("setForceUse()");
128 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700129 mAudioPolicyManager->setForceUse(usage, config);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800130 return NO_ERROR;
131}
132
133audio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage)
134{
Eric Laurentdce54a12014-03-10 12:19:46 -0700135 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800136 return AUDIO_POLICY_FORCE_NONE;
137 }
138 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
139 return AUDIO_POLICY_FORCE_NONE;
140 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700141 return mAudioPolicyManager->getForceUse(usage);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800142}
143
Eric Laurentf4e63452017-11-06 19:31:46 +0000144audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800145{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800146 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700147 return AUDIO_IO_HANDLE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700148 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700149 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700150 return AUDIO_IO_HANDLE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800151 }
152 ALOGV("getOutput()");
153 Mutex::Autolock _l(mLock);
Eric Laurentf4e63452017-11-06 19:31:46 +0000154 return mAudioPolicyManager->getOutput(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800155}
156
Eric Laurente83b55d2014-11-14 10:06:21 -0800157status_t AudioPolicyService::getOutputForAttr(const audio_attributes_t *attr,
158 audio_io_handle_t *output,
159 audio_session_t session,
160 audio_stream_type_t *stream,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700161 uid_t uid,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800162 const audio_config_t *config,
Eric Laurente83b55d2014-11-14 10:06:21 -0800163 audio_output_flags_t flags,
Eric Laurent9ae8c592017-06-22 17:17:09 -0700164 audio_port_handle_t *selectedDeviceId,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800165 audio_port_handle_t *portId)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700166{
167 if (mAudioPolicyManager == NULL) {
Eric Laurente83b55d2014-11-14 10:06:21 -0800168 return NO_INIT;
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700169 }
Eric Laurentf4e63452017-11-06 19:31:46 +0000170 ALOGV("getOutputForAttr()");
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700171 Mutex::Autolock _l(mLock);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700172
Marco Nelissendcb346b2015-09-09 10:47:29 -0700173 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
174 if (!isTrustedCallingUid(callingUid) || uid == (uid_t)-1) {
175 ALOGW_IF(uid != (uid_t)-1 && uid != callingUid,
176 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, uid);
177 uid = callingUid;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700178 }
Eric Laurent20b9ef02016-12-05 11:03:16 -0800179 return mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid,
180 config,
181 flags, selectedDeviceId, portId);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700182}
183
Eric Laurent2d388ec2014-03-07 13:25:54 -0800184status_t AudioPolicyService::startOutput(audio_io_handle_t output,
185 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800186 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800187{
Eric Laurentdea15412014-10-28 15:46:45 -0700188 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
189 return BAD_VALUE;
190 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700191 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800192 return NO_INIT;
193 }
194 ALOGV("startOutput()");
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700195 sp<AudioPolicyEffects>audioPolicyEffects;
196 {
197 Mutex::Autolock _l(mLock);
198 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800199 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700200 if (audioPolicyEffects != 0) {
201 // create audio processors according to stream
202 status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
203 if (status != NO_ERROR && status != ALREADY_EXISTS) {
204 ALOGW("Failed to add effects on session %d", session);
205 }
206 }
207 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700208 return mAudioPolicyManager->startOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800209}
210
211status_t AudioPolicyService::stopOutput(audio_io_handle_t output,
212 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800213 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800214{
Eric Laurentdea15412014-10-28 15:46:45 -0700215 if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
216 return BAD_VALUE;
217 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700218 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800219 return NO_INIT;
220 }
221 ALOGV("stopOutput()");
222 mOutputCommandThread->stopOutputCommand(output, stream, session);
223 return NO_ERROR;
224}
225
226status_t AudioPolicyService::doStopOutput(audio_io_handle_t output,
227 audio_stream_type_t stream,
Eric Laurente83b55d2014-11-14 10:06:21 -0800228 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800229{
230 ALOGV("doStopOutput from tid %d", gettid());
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700231 sp<AudioPolicyEffects>audioPolicyEffects;
232 {
233 Mutex::Autolock _l(mLock);
234 audioPolicyEffects = mAudioPolicyEffects;
bryant_liuba2b4392014-06-11 16:49:30 +0800235 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700236 if (audioPolicyEffects != 0) {
237 // release audio processors from the stream
238 status_t status = audioPolicyEffects->releaseOutputSessionEffects(output, stream, session);
239 if (status != NO_ERROR && status != ALREADY_EXISTS) {
240 ALOGW("Failed to release effects on session %d", session);
241 }
242 }
243 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700244 return mAudioPolicyManager->stopOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800245}
246
Eric Laurente83b55d2014-11-14 10:06:21 -0800247void AudioPolicyService::releaseOutput(audio_io_handle_t output,
248 audio_stream_type_t stream,
249 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800250{
Eric Laurentdce54a12014-03-10 12:19:46 -0700251 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800252 return;
253 }
254 ALOGV("releaseOutput()");
Eric Laurente83b55d2014-11-14 10:06:21 -0800255 mOutputCommandThread->releaseOutputCommand(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800256}
257
Eric Laurente83b55d2014-11-14 10:06:21 -0800258void AudioPolicyService::doReleaseOutput(audio_io_handle_t output,
259 audio_stream_type_t stream,
260 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800261{
262 ALOGV("doReleaseOutput from tid %d", gettid());
263 Mutex::Autolock _l(mLock);
Eric Laurente83b55d2014-11-14 10:06:21 -0800264 mAudioPolicyManager->releaseOutput(output, stream, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800265}
266
Eric Laurentcaf7f482014-11-25 17:50:47 -0800267status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
268 audio_io_handle_t *input,
269 audio_session_t session,
Eric Laurentb2379ba2016-05-23 17:42:12 -0700270 pid_t pid,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700271 uid_t uid,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800272 const audio_config_base_t *config,
Paul McLean466dc8e2015-04-17 13:15:36 -0600273 audio_input_flags_t flags,
Eric Laurent9ae8c592017-06-22 17:17:09 -0700274 audio_port_handle_t *selectedDeviceId,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800275 audio_port_handle_t *portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800276{
Eric Laurentdce54a12014-03-10 12:19:46 -0700277 if (mAudioPolicyManager == NULL) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800278 return NO_INIT;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800279 }
280 // already checked by client, but double-check in case the client wrapper is bypassed
Eric Laurentfe231122017-11-17 17:48:06 -0800281 if (attr->source < AUDIO_SOURCE_DEFAULT && attr->source >= AUDIO_SOURCE_CNT &&
282 attr->source != AUDIO_SOURCE_HOTWORD && attr->source != AUDIO_SOURCE_FM_TUNER) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800283 return BAD_VALUE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800284 }
285
Eric Laurentb2379ba2016-05-23 17:42:12 -0700286 bool updatePid = (pid == -1);
Marco Nelissendcb346b2015-09-09 10:47:29 -0700287 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Eric Laurentb2379ba2016-05-23 17:42:12 -0700288 if (!isTrustedCallingUid(callingUid)) {
Eric Laurent9f39f8d2016-05-25 12:34:48 -0700289 ALOGW_IF(uid != (uid_t)-1 && uid != callingUid,
Marco Nelissendcb346b2015-09-09 10:47:29 -0700290 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, uid);
291 uid = callingUid;
Eric Laurentb2379ba2016-05-23 17:42:12 -0700292 updatePid = true;
293 }
294
295 if (updatePid) {
296 const pid_t callingPid = IPCThreadState::self()->getCallingPid();
Eric Laurent9f39f8d2016-05-25 12:34:48 -0700297 ALOGW_IF(pid != (pid_t)-1 && pid != callingPid,
Eric Laurentb2379ba2016-05-23 17:42:12 -0700298 "%s uid %d pid %d tried to pass itself off as pid %d",
299 __func__, callingUid, callingPid, pid);
300 pid = callingPid;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700301 }
302
Eric Laurent7504b9e2017-08-15 18:17:26 -0700303 if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed(pid, uid)) {
304 return BAD_VALUE;
305 }
306
307 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700308 {
Eric Laurent7504b9e2017-08-15 18:17:26 -0700309 status_t status;
310 AudioPolicyInterface::input_type_t inputType;
311
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700312 Mutex::Autolock _l(mLock);
313 // the audio_in_acoustics_t parameter is ignored by get_input()
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700314 status = mAudioPolicyManager->getInputForAttr(attr, input, session, uid,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800315 config,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700316 flags, selectedDeviceId,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800317 &inputType, portId);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700318 audioPolicyEffects = mAudioPolicyEffects;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800319
320 if (status == NO_ERROR) {
321 // enforce permission (if any) required for each type of input
322 switch (inputType) {
323 case AudioPolicyInterface::API_INPUT_LEGACY:
324 break;
Eric Laurent82db2692015-08-07 13:59:42 -0700325 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX:
326 // FIXME: use the same permission as for remote submix for now.
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800327 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
Eric Laurentb2379ba2016-05-23 17:42:12 -0700328 if (!captureAudioOutputAllowed(pid, uid)) {
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800329 ALOGE("getInputForAttr() permission denied: capture not allowed");
330 status = PERMISSION_DENIED;
331 }
332 break;
333 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE:
334 if (!modifyAudioRoutingAllowed()) {
335 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed");
336 status = PERMISSION_DENIED;
337 }
338 break;
339 case AudioPolicyInterface::API_INPUT_INVALID:
340 default:
341 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d",
342 (int)inputType);
343 }
344 }
345
346 if (status != NO_ERROR) {
347 if (status == PERMISSION_DENIED) {
348 mAudioPolicyManager->releaseInput(*input, session);
349 }
350 return status;
351 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700352 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800353
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700354 if (audioPolicyEffects != 0) {
355 // create audio pre processors according to input source
Eric Laurentcaf7f482014-11-25 17:50:47 -0800356 status_t status = audioPolicyEffects->addInputEffects(*input, attr->source, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700357 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800358 ALOGW("Failed to add effects on input %d", *input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700359 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800360 }
Eric Laurentcaf7f482014-11-25 17:50:47 -0800361 return NO_ERROR;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800362}
363
Eric Laurent4dc68062014-07-28 17:26:49 -0700364status_t AudioPolicyService::startInput(audio_io_handle_t input,
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800365 audio_session_t session,
366 audio_devices_t device,
367 uid_t uid,
368 bool *silenced)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800369{
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800370 // If UID inactive it records silence until becoming active
371 *silenced = !mUidPolicy->isUidActive(uid) && !is_virtual_input_device(device);
372
Eric Laurentdce54a12014-03-10 12:19:46 -0700373 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800374 return NO_INIT;
375 }
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800376
Eric Laurent2d388ec2014-03-07 13:25:54 -0800377 Mutex::Autolock _l(mLock);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800378 AudioPolicyInterface::concurrency_type__mask_t concurrency =
379 AudioPolicyInterface::API_INPUT_CONCURRENCY_NONE;
380 status_t status = mAudioPolicyManager->startInput(input, session, silenced, &concurrency);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800381
Eric Laurentfb66dd92016-01-28 18:32:03 -0800382 if (status == NO_ERROR) {
Eric Laurent43423352016-02-05 11:57:57 -0800383 LOG_ALWAYS_FATAL_IF(concurrency & ~AudioPolicyInterface::API_INPUT_CONCURRENCY_ALL,
384 "startInput(): invalid concurrency type %d", (int)concurrency);
385
Eric Laurentfb66dd92016-01-28 18:32:03 -0800386 // enforce permission (if any) required for each type of concurrency
Eric Laurent43423352016-02-05 11:57:57 -0800387 if (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_CALL) {
Eric Laurentfb66dd92016-01-28 18:32:03 -0800388 //TODO: check incall capture permission
Eric Laurent43423352016-02-05 11:57:57 -0800389 }
390 if (concurrency & AudioPolicyInterface::API_INPUT_CONCURRENCY_CAPTURE) {
Eric Laurentfb66dd92016-01-28 18:32:03 -0800391 //TODO: check concurrent capture permission
Eric Laurentfb66dd92016-01-28 18:32:03 -0800392 }
393 }
394
395 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800396}
397
Eric Laurent4dc68062014-07-28 17:26:49 -0700398status_t AudioPolicyService::stopInput(audio_io_handle_t input,
399 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800400{
Eric Laurentdce54a12014-03-10 12:19:46 -0700401 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800402 return NO_INIT;
403 }
404 Mutex::Autolock _l(mLock);
405
Eric Laurent4dc68062014-07-28 17:26:49 -0700406 return mAudioPolicyManager->stopInput(input, session);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800407}
408
Eric Laurent4dc68062014-07-28 17:26:49 -0700409void AudioPolicyService::releaseInput(audio_io_handle_t input,
410 audio_session_t session)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800411{
Eric Laurentdce54a12014-03-10 12:19:46 -0700412 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800413 return;
414 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700415 sp<AudioPolicyEffects>audioPolicyEffects;
416 {
417 Mutex::Autolock _l(mLock);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700418 audioPolicyEffects = mAudioPolicyEffects;
419 }
420 if (audioPolicyEffects != 0) {
421 // release audio processors from the input
Eric Laurentfb66dd92016-01-28 18:32:03 -0800422 status_t status = audioPolicyEffects->releaseInputEffects(input, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700423 if(status != NO_ERROR) {
424 ALOGW("Failed to release effects on input %d", input);
425 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800426 }
Eric Laurentf10c7092016-12-06 17:09:56 -0800427 {
428 Mutex::Autolock _l(mLock);
429 mAudioPolicyManager->releaseInput(input, session);
430 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800431}
432
433status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
434 int indexMin,
435 int indexMax)
436{
Eric Laurentdce54a12014-03-10 12:19:46 -0700437 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800438 return NO_INIT;
439 }
440 if (!settingsAllowed()) {
441 return PERMISSION_DENIED;
442 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800443 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800444 return BAD_VALUE;
445 }
446 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700447 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800448 return NO_ERROR;
449}
450
451status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
452 int index,
453 audio_devices_t device)
454{
Eric Laurentdce54a12014-03-10 12:19:46 -0700455 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800456 return NO_INIT;
457 }
458 if (!settingsAllowed()) {
459 return PERMISSION_DENIED;
460 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800461 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800462 return BAD_VALUE;
463 }
464 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700465 return mAudioPolicyManager->setStreamVolumeIndex(stream,
466 index,
467 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800468}
469
470status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
471 int *index,
472 audio_devices_t device)
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 Laurent223fd5c2014-11-11 13:43:36 -0800477 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800478 return BAD_VALUE;
479 }
480 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700481 return mAudioPolicyManager->getStreamVolumeIndex(stream,
482 index,
483 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800484}
485
486uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
487{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800488 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700489 return 0;
Eric Laurentdea15412014-10-28 15:46:45 -0700490 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700491 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800492 return 0;
493 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700494 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800495}
496
497//audio policy: use audio_device_t appropriately
498
499audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
500{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800501 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700502 return AUDIO_DEVICE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700503 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700504 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700505 return AUDIO_DEVICE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800506 }
Haynes Mathew Georgedfb9f3b2015-10-26 18:22:13 -0700507 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700508 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800509}
510
511audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
512{
513 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700514 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800515 return 0;
516 }
517 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700518 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800519}
520
521status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
522 audio_io_handle_t io,
523 uint32_t strategy,
Glenn Kastend848eb42016-03-08 13:42:11 -0800524 audio_session_t session,
Eric Laurent2d388ec2014-03-07 13:25:54 -0800525 int id)
526{
Eric Laurentdce54a12014-03-10 12:19:46 -0700527 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800528 return NO_INIT;
529 }
Haynes Mathew Georgebab7bf42015-10-30 18:02:23 -0700530 Mutex::Autolock _l(mEffectsLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700531 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800532}
533
534status_t AudioPolicyService::unregisterEffect(int id)
535{
Eric Laurentdce54a12014-03-10 12:19:46 -0700536 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800537 return NO_INIT;
538 }
Haynes Mathew Georgebab7bf42015-10-30 18:02:23 -0700539 Mutex::Autolock _l(mEffectsLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700540 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800541}
542
543status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
544{
Eric Laurentdce54a12014-03-10 12:19:46 -0700545 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800546 return NO_INIT;
547 }
Haynes Mathew Georgebab7bf42015-10-30 18:02:23 -0700548 Mutex::Autolock _l(mEffectsLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700549 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800550}
551
552bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
553{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800554 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700555 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700556 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700557 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700558 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800559 }
560 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700561 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800562}
563
564bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
565{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800566 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700567 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700568 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700569 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700570 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800571 }
572 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700573 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800574}
575
576bool AudioPolicyService::isSourceActive(audio_source_t source) const
577{
Eric Laurentdce54a12014-03-10 12:19:46 -0700578 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800579 return false;
580 }
581 Mutex::Autolock _l(mLock);
Eric Laurentdce54a12014-03-10 12:19:46 -0700582 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800583}
584
Glenn Kastend848eb42016-03-08 13:42:11 -0800585status_t AudioPolicyService::queryDefaultPreProcessing(audio_session_t audioSession,
Eric Laurent2d388ec2014-03-07 13:25:54 -0800586 effect_descriptor_t *descriptors,
587 uint32_t *count)
588{
Eric Laurentdce54a12014-03-10 12:19:46 -0700589 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800590 *count = 0;
591 return NO_INIT;
592 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700593 sp<AudioPolicyEffects>audioPolicyEffects;
594 {
595 Mutex::Autolock _l(mLock);
596 audioPolicyEffects = mAudioPolicyEffects;
597 }
598 if (audioPolicyEffects == 0) {
599 *count = 0;
600 return NO_INIT;
601 }
Eric Laurentfb66dd92016-01-28 18:32:03 -0800602 return audioPolicyEffects->queryDefaultInputEffects(
603 (audio_session_t)audioSession, descriptors, count);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800604}
605
606bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
607{
Eric Laurentdce54a12014-03-10 12:19:46 -0700608 if (mAudioPolicyManager == NULL) {
609 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800610 return false;
611 }
Andy Hung2ddee192015-12-18 17:34:44 -0800612 Mutex::Autolock _l(mLock);
Haynes Mathew Georgebab7bf42015-10-30 18:02:23 -0700613 Mutex::Autolock _le(mEffectsLock); // isOffloadSupported queries for
614 // non-offloadable effects
Eric Laurentdce54a12014-03-10 12:19:46 -0700615 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800616}
617
Eric Laurent6a94d692014-05-20 11:18:06 -0700618status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
619 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -0700620 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -0700621 struct audio_port *ports,
622 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700623{
Eric Laurent6a94d692014-05-20 11:18:06 -0700624 Mutex::Autolock _l(mLock);
625 if (mAudioPolicyManager == NULL) {
626 return NO_INIT;
627 }
628
629 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700630}
631
Eric Laurent6a94d692014-05-20 11:18:06 -0700632status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -0700633{
Eric Laurent6a94d692014-05-20 11:18:06 -0700634 Mutex::Autolock _l(mLock);
635 if (mAudioPolicyManager == NULL) {
636 return NO_INIT;
637 }
638
639 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -0700640}
641
Eric Laurent6a94d692014-05-20 11:18:06 -0700642status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
643 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700644{
Eric Laurent6a94d692014-05-20 11:18:06 -0700645 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700646 if(!modifyAudioRoutingAllowed()) {
647 return PERMISSION_DENIED;
648 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700649 if (mAudioPolicyManager == NULL) {
650 return NO_INIT;
651 }
652 return mAudioPolicyManager->createAudioPatch(patch, handle,
653 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700654}
655
Eric Laurent6a94d692014-05-20 11:18:06 -0700656status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -0700657{
Eric Laurent6a94d692014-05-20 11:18:06 -0700658 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700659 if(!modifyAudioRoutingAllowed()) {
660 return PERMISSION_DENIED;
661 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700662 if (mAudioPolicyManager == NULL) {
663 return NO_INIT;
664 }
665
666 return mAudioPolicyManager->releaseAudioPatch(handle,
667 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -0700668}
669
670status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -0700671 struct audio_patch *patches,
672 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -0700673{
Eric Laurent6a94d692014-05-20 11:18:06 -0700674 Mutex::Autolock _l(mLock);
675 if (mAudioPolicyManager == NULL) {
676 return NO_INIT;
677 }
678
679 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -0700680}
681
Eric Laurent6a94d692014-05-20 11:18:06 -0700682status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -0700683{
Eric Laurent6a94d692014-05-20 11:18:06 -0700684 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -0700685 if(!modifyAudioRoutingAllowed()) {
686 return PERMISSION_DENIED;
687 }
Eric Laurent6a94d692014-05-20 11:18:06 -0700688 if (mAudioPolicyManager == NULL) {
689 return NO_INIT;
690 }
691
692 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -0700693}
Eric Laurent2d388ec2014-03-07 13:25:54 -0800694
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700695status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
696 audio_io_handle_t *ioHandle,
697 audio_devices_t *device)
698{
Andy Hungf759b8c2017-08-15 12:48:54 -0700699 Mutex::Autolock _l(mLock);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700700 if (mAudioPolicyManager == NULL) {
701 return NO_INIT;
702 }
703
704 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
705}
706
707status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
708{
Andy Hungf759b8c2017-08-15 12:48:54 -0700709 Mutex::Autolock _l(mLock);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -0700710 if (mAudioPolicyManager == NULL) {
711 return NO_INIT;
712 }
713
714 return mAudioPolicyManager->releaseSoundTriggerSession(session);
715}
716
Chih-Hung Hsiehe964d4e2016-08-09 14:31:32 -0700717status_t AudioPolicyService::registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration)
Eric Laurentbaac1832014-12-01 17:52:59 -0800718{
719 Mutex::Autolock _l(mLock);
720 if(!modifyAudioRoutingAllowed()) {
721 return PERMISSION_DENIED;
722 }
723 if (mAudioPolicyManager == NULL) {
724 return NO_INIT;
725 }
726 if (registration) {
727 return mAudioPolicyManager->registerPolicyMixes(mixes);
728 } else {
729 return mAudioPolicyManager->unregisterPolicyMixes(mixes);
730 }
731}
732
Eric Laurent554a2772015-04-10 11:29:24 -0700733status_t AudioPolicyService::startAudioSource(const struct audio_port_config *source,
734 const audio_attributes_t *attributes,
Glenn Kasten559d4392016-03-29 13:42:57 -0700735 audio_patch_handle_t *handle)
Eric Laurent554a2772015-04-10 11:29:24 -0700736{
737 Mutex::Autolock _l(mLock);
738 if (mAudioPolicyManager == NULL) {
739 return NO_INIT;
740 }
741
Eric Laurentd60560a2015-04-10 11:31:20 -0700742 return mAudioPolicyManager->startAudioSource(source, attributes, handle,
743 IPCThreadState::self()->getCallingUid());
Eric Laurent554a2772015-04-10 11:29:24 -0700744}
745
Glenn Kasten559d4392016-03-29 13:42:57 -0700746status_t AudioPolicyService::stopAudioSource(audio_patch_handle_t handle)
Eric Laurent554a2772015-04-10 11:29:24 -0700747{
748 Mutex::Autolock _l(mLock);
749 if (mAudioPolicyManager == NULL) {
750 return NO_INIT;
751 }
752
753 return mAudioPolicyManager->stopAudioSource(handle);
754}
755
Andy Hung2ddee192015-12-18 17:34:44 -0800756status_t AudioPolicyService::setMasterMono(bool mono)
757{
758 if (mAudioPolicyManager == NULL) {
759 return NO_INIT;
760 }
761 if (!settingsAllowed()) {
762 return PERMISSION_DENIED;
763 }
764 Mutex::Autolock _l(mLock);
765 return mAudioPolicyManager->setMasterMono(mono);
766}
767
768status_t AudioPolicyService::getMasterMono(bool *mono)
769{
770 if (mAudioPolicyManager == NULL) {
771 return NO_INIT;
772 }
773 Mutex::Autolock _l(mLock);
774 return mAudioPolicyManager->getMasterMono(mono);
775}
776
Eric Laurentac9cef52017-06-09 15:46:26 -0700777
778float AudioPolicyService::getStreamVolumeDB(
779 audio_stream_type_t stream, int index, audio_devices_t device)
780{
781 if (mAudioPolicyManager == NULL) {
782 return NAN;
783 }
784 Mutex::Autolock _l(mLock);
785 return mAudioPolicyManager->getStreamVolumeDB(stream, index, device);
786}
787
788
Mikhail Naganov1b2a7942017-12-08 10:18:09 -0800789} // namespace android