blob: 4b2f48db399fdebd299226285c486762903a420d [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
Eric Laurent2d388ec2014-03-07 13:25:54 -080020#include "AudioPolicyService.h"
Ray Essick84e84a52018-05-03 18:45:07 -070021#include "TypeConverter.h"
Eric Laurentd7fe0862018-07-14 16:48:01 -070022#include <media/MediaAnalyticsItem.h>
Kevin Rocardbe201852019-02-20 22:33:28 -080023#include <media/AudioPolicy.h>
Eric Laurentd7fe0862018-07-14 16:48:01 -070024#include <utils/Log.h>
Eric Laurent2d388ec2014-03-07 13:25:54 -080025
Eric Laurent2d388ec2014-03-07 13:25:54 -080026namespace android {
27
28
29// ----------------------------------------------------------------------------
30
31status_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device,
32 audio_policy_dev_state_t state,
Paul McLeane743a472015-01-28 11:07:31 -080033 const char *device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -080034 const char *device_name,
35 audio_format_t encodedFormat)
Eric Laurent2d388ec2014-03-07 13:25:54 -080036{
Eric Laurentdce54a12014-03-10 12:19:46 -070037 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080038 return NO_INIT;
39 }
40 if (!settingsAllowed()) {
41 return PERMISSION_DENIED;
42 }
Eric Laurent2d388ec2014-03-07 13:25:54 -080043 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);
Eric Laurent10b71232018-04-13 18:14:44 -070050 AutoCallerClear acc;
Paul McLeane743a472015-01-28 11:07:31 -080051 return mAudioPolicyManager->setDeviceConnectionState(device, state,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -080052 device_address, device_name, encodedFormat);
Eric Laurent2d388ec2014-03-07 13:25:54 -080053}
54
55audio_policy_dev_state_t AudioPolicyService::getDeviceConnectionState(
56 audio_devices_t device,
57 const char *device_address)
58{
Eric Laurentdce54a12014-03-10 12:19:46 -070059 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080060 return AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE;
61 }
Eric Laurent10b71232018-04-13 18:14:44 -070062 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -070063 return mAudioPolicyManager->getDeviceConnectionState(device,
Eric Laurent2d388ec2014-03-07 13:25:54 -080064 device_address);
65}
66
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -080067status_t AudioPolicyService::handleDeviceConfigChange(audio_devices_t device,
68 const char *device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -080069 const char *device_name,
70 audio_format_t encodedFormat)
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -080071{
72 if (mAudioPolicyManager == NULL) {
73 return NO_INIT;
74 }
75 if (!settingsAllowed()) {
76 return PERMISSION_DENIED;
77 }
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -080078
79 ALOGV("handleDeviceConfigChange()");
80 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -070081 AutoCallerClear acc;
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -080082 return mAudioPolicyManager->handleDeviceConfigChange(device, device_address,
Aniket Kumar Lata4e464702019-01-10 23:38:46 -080083 device_name, encodedFormat);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -080084}
85
Eric Laurent2d388ec2014-03-07 13:25:54 -080086status_t AudioPolicyService::setPhoneState(audio_mode_t state)
87{
Eric Laurentdce54a12014-03-10 12:19:46 -070088 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -080089 return NO_INIT;
90 }
91 if (!settingsAllowed()) {
92 return PERMISSION_DENIED;
93 }
94 if (uint32_t(state) >= AUDIO_MODE_CNT) {
95 return BAD_VALUE;
96 }
97
98 ALOGV("setPhoneState()");
99
Eric Laurentbeb07fe2015-09-16 15:49:30 -0700100 // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic
101 // operation from policy manager standpoint (no other operation (e.g track start or stop)
102 // can be interleaved).
103 Mutex::Autolock _l(mLock);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800104 // TODO: check if it is more appropriate to do it in platform specific policy manager
105 AudioSystem::setMode(state);
106
Eric Laurent10b71232018-04-13 18:14:44 -0700107 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700108 mAudioPolicyManager->setPhoneState(state);
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700109 mPhoneState = state;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800110 return NO_ERROR;
111}
112
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700113audio_mode_t AudioPolicyService::getPhoneState()
114{
115 Mutex::Autolock _l(mLock);
116 return mPhoneState;
117}
118
Eric Laurent2d388ec2014-03-07 13:25:54 -0800119status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
120 audio_policy_forced_cfg_t config)
121{
Eric Laurentdce54a12014-03-10 12:19:46 -0700122 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800123 return NO_INIT;
124 }
Eric Laurente17378d2018-05-09 14:43:01 -0700125
126 if (!modifyAudioRoutingAllowed()) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800127 return PERMISSION_DENIED;
128 }
Eric Laurente17378d2018-05-09 14:43:01 -0700129
Eric Laurent2d388ec2014-03-07 13:25:54 -0800130 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
131 return BAD_VALUE;
132 }
133 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
134 return BAD_VALUE;
135 }
136 ALOGV("setForceUse()");
137 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700138 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700139 mAudioPolicyManager->setForceUse(usage, config);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800140 return NO_ERROR;
141}
142
143audio_policy_forced_cfg_t AudioPolicyService::getForceUse(audio_policy_force_use_t usage)
144{
Eric Laurentdce54a12014-03-10 12:19:46 -0700145 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800146 return AUDIO_POLICY_FORCE_NONE;
147 }
148 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
149 return AUDIO_POLICY_FORCE_NONE;
150 }
Eric Laurent10b71232018-04-13 18:14:44 -0700151 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700152 return mAudioPolicyManager->getForceUse(usage);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800153}
154
Eric Laurentf4e63452017-11-06 19:31:46 +0000155audio_io_handle_t AudioPolicyService::getOutput(audio_stream_type_t stream)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800156{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800157 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700158 return AUDIO_IO_HANDLE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700159 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700160 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700161 return AUDIO_IO_HANDLE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800162 }
163 ALOGV("getOutput()");
164 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700165 AutoCallerClear acc;
Eric Laurentf4e63452017-11-06 19:31:46 +0000166 return mAudioPolicyManager->getOutput(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800167}
168
Eric Laurent42984412019-05-09 17:57:03 -0700169status_t AudioPolicyService::getOutputForAttr(audio_attributes_t *attr,
Eric Laurente83b55d2014-11-14 10:06:21 -0800170 audio_io_handle_t *output,
171 audio_session_t session,
172 audio_stream_type_t *stream,
Nadav Bar766fb022018-01-07 12:18:03 +0200173 pid_t pid,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700174 uid_t uid,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800175 const audio_config_t *config,
Eric Laurente83b55d2014-11-14 10:06:21 -0800176 audio_output_flags_t flags,
Eric Laurent9ae8c592017-06-22 17:17:09 -0700177 audio_port_handle_t *selectedDeviceId,
Kevin Rocard153f92d2018-12-18 18:33:28 -0800178 audio_port_handle_t *portId,
179 std::vector<audio_io_handle_t> *secondaryOutputs)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700180{
181 if (mAudioPolicyManager == NULL) {
Eric Laurente83b55d2014-11-14 10:06:21 -0800182 return NO_INIT;
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700183 }
Eric Laurentf4e63452017-11-06 19:31:46 +0000184 ALOGV("getOutputForAttr()");
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700185 Mutex::Autolock _l(mLock);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700186
Marco Nelissendcb346b2015-09-09 10:47:29 -0700187 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Andy Hung4ef19fa2018-05-15 19:35:29 -0700188 if (!isAudioServerOrMediaServerUid(callingUid) || uid == (uid_t)-1) {
Marco Nelissendcb346b2015-09-09 10:47:29 -0700189 ALOGW_IF(uid != (uid_t)-1 && uid != callingUid,
190 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, uid);
191 uid = callingUid;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700192 }
Kevin Rocard8be94972019-02-22 13:26:25 -0800193 if (!mPackageManager.allowPlaybackCapture(uid)) {
Eric Laurent42984412019-05-09 17:57:03 -0700194 attr->flags |= AUDIO_FLAG_NO_MEDIA_PROJECTION;
195 }
196 if (!bypassInterruptionPolicyAllowed(pid, uid)) {
197 attr->flags &= ~(AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE);
Kevin Rocard8be94972019-02-22 13:26:25 -0800198 }
Nadav Bar766fb022018-01-07 12:18:03 +0200199 audio_output_flags_t originalFlags = flags;
Eric Laurent10b71232018-04-13 18:14:44 -0700200 AutoCallerClear acc;
Eric Laurent42984412019-05-09 17:57:03 -0700201 status_t result = mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800202 config,
Kevin Rocard153f92d2018-12-18 18:33:28 -0800203 &flags, selectedDeviceId, portId,
204 secondaryOutputs);
Nadav Bar766fb022018-01-07 12:18:03 +0200205
206 // FIXME: Introduce a way to check for the the telephony device before opening the output
207 if ((result == NO_ERROR) &&
208 (flags & AUDIO_OUTPUT_FLAG_INCALL_MUSIC) &&
209 !modifyPhoneStateAllowed(pid, uid)) {
210 // If the app tries to play music through the telephony device and doesn't have permission
211 // the fallback to the default output device.
Eric Laurent8fc147b2018-07-22 19:13:55 -0700212 mAudioPolicyManager->releaseOutput(*portId);
Nadav Bar766fb022018-01-07 12:18:03 +0200213 flags = originalFlags;
214 *selectedDeviceId = AUDIO_PORT_HANDLE_NONE;
215 *portId = AUDIO_PORT_HANDLE_NONE;
Kevin Rocard153f92d2018-12-18 18:33:28 -0800216 secondaryOutputs->clear();
Eric Laurent42984412019-05-09 17:57:03 -0700217 result = mAudioPolicyManager->getOutputForAttr(attr, output, session, stream, uid, config,
Kevin Rocard153f92d2018-12-18 18:33:28 -0800218 &flags, selectedDeviceId, portId,
219 secondaryOutputs);
Nadav Bar766fb022018-01-07 12:18:03 +0200220 }
Eric Laurentd7fe0862018-07-14 16:48:01 -0700221
222 if (result == NO_ERROR) {
223 sp <AudioPlaybackClient> client =
Eric Laurent42984412019-05-09 17:57:03 -0700224 new AudioPlaybackClient(*attr, *output, uid, pid, session, *selectedDeviceId, *stream);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700225 mAudioPlaybackClients.add(*portId, client);
226 }
Nadav Bar766fb022018-01-07 12:18:03 +0200227 return result;
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700228}
229
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700230void AudioPolicyService::getPlaybackClientAndEffects(audio_port_handle_t portId,
231 sp<AudioPlaybackClient>& client,
232 sp<AudioPolicyEffects>& effects,
233 const char *context)
234{
235 Mutex::Autolock _l(mLock);
236 const ssize_t index = mAudioPlaybackClients.indexOfKey(portId);
237 if (index < 0) {
238 ALOGE("%s AudioTrack client not found for portId %d", context, portId);
239 return;
240 }
241 client = mAudioPlaybackClients.valueAt(index);
242 effects = mAudioPolicyEffects;
243}
244
Eric Laurentd7fe0862018-07-14 16:48:01 -0700245status_t AudioPolicyService::startOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800246{
Eric Laurentdce54a12014-03-10 12:19:46 -0700247 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800248 return NO_INIT;
249 }
250 ALOGV("startOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700251 sp<AudioPlaybackClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700252 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700253
254 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
255
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700256 if (audioPolicyEffects != 0) {
257 // create audio processors according to stream
Eric Laurentd7fe0862018-07-14 16:48:01 -0700258 status_t status = audioPolicyEffects->addOutputSessionEffects(
259 client->io, client->stream, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700260 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700261 ALOGW("Failed to add effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700262 }
263 }
264 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700265 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700266 status_t status = mAudioPolicyManager->startOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700267 if (status == NO_ERROR) {
268 client->active = true;
269 }
270 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800271}
272
Eric Laurentd7fe0862018-07-14 16:48:01 -0700273status_t AudioPolicyService::stopOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800274{
Eric Laurentdce54a12014-03-10 12:19:46 -0700275 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800276 return NO_INIT;
277 }
278 ALOGV("stopOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700279 mOutputCommandThread->stopOutputCommand(portId);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800280 return NO_ERROR;
281}
282
Eric Laurentd7fe0862018-07-14 16:48:01 -0700283status_t AudioPolicyService::doStopOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800284{
Eric Laurentd7fe0862018-07-14 16:48:01 -0700285 ALOGV("doStopOutput");
286 sp<AudioPlaybackClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700287 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentd7fe0862018-07-14 16:48:01 -0700288
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700289 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
290
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700291 if (audioPolicyEffects != 0) {
292 // release audio processors from the stream
Eric Laurentd7fe0862018-07-14 16:48:01 -0700293 status_t status = audioPolicyEffects->releaseOutputSessionEffects(
294 client->io, client->stream, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700295 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700296 ALOGW("Failed to release effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700297 }
298 }
299 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700300 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700301 status_t status = mAudioPolicyManager->stopOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700302 if (status == NO_ERROR) {
303 client->active = false;
304 }
305 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800306}
307
Eric Laurentd7fe0862018-07-14 16:48:01 -0700308void AudioPolicyService::releaseOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800309{
Eric Laurentdce54a12014-03-10 12:19:46 -0700310 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800311 return;
312 }
313 ALOGV("releaseOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700314 mOutputCommandThread->releaseOutputCommand(portId);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800315}
316
Eric Laurentd7fe0862018-07-14 16:48:01 -0700317void AudioPolicyService::doReleaseOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800318{
319 ALOGV("doReleaseOutput from tid %d", gettid());
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700320 sp<AudioPlaybackClient> client;
321 sp<AudioPolicyEffects> audioPolicyEffects;
322
323 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
324
325 if (audioPolicyEffects != 0 && client->active) {
326 // clean up effects if output was not stopped before being released
327 audioPolicyEffects->releaseOutputSessionEffects(
328 client->io, client->stream, client->session);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700329 }
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700330 Mutex::Autolock _l(mLock);
Eric Laurentd4007242019-03-27 12:42:16 -0700331 mAudioPlaybackClients.removeItem(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700332
Eric Laurent10b71232018-04-13 18:14:44 -0700333 // called from internal thread: no need to clear caller identity
Eric Laurent8fc147b2018-07-22 19:13:55 -0700334 mAudioPolicyManager->releaseOutput(portId);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800335}
336
Eric Laurentcaf7f482014-11-25 17:50:47 -0800337status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
338 audio_io_handle_t *input,
Mikhail Naganov2996f672019-04-18 12:29:59 -0700339 audio_unique_id_t riid,
Eric Laurentcaf7f482014-11-25 17:50:47 -0800340 audio_session_t session,
Eric Laurentb2379ba2016-05-23 17:42:12 -0700341 pid_t pid,
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700342 uid_t uid,
Eric Laurentfee19762018-01-29 18:44:13 -0800343 const String16& opPackageName,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800344 const audio_config_base_t *config,
Paul McLean466dc8e2015-04-17 13:15:36 -0600345 audio_input_flags_t flags,
Eric Laurent9ae8c592017-06-22 17:17:09 -0700346 audio_port_handle_t *selectedDeviceId,
Eric Laurent20b9ef02016-12-05 11:03:16 -0800347 audio_port_handle_t *portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800348{
Eric Laurentdce54a12014-03-10 12:19:46 -0700349 if (mAudioPolicyManager == NULL) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800350 return NO_INIT;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800351 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800352
Eric Laurent2d388ec2014-03-07 13:25:54 -0800353 // already checked by client, but double-check in case the client wrapper is bypassed
Eric Laurentae4b6ec2019-01-15 18:34:38 -0800354 if ((attr->source < AUDIO_SOURCE_DEFAULT)
355 || (attr->source >= AUDIO_SOURCE_CNT
356 && attr->source != AUDIO_SOURCE_HOTWORD
357 && attr->source != AUDIO_SOURCE_FM_TUNER
358 && attr->source != AUDIO_SOURCE_ECHO_REFERENCE)) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800359 return BAD_VALUE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800360 }
361
Eric Laurentb2379ba2016-05-23 17:42:12 -0700362 bool updatePid = (pid == -1);
Marco Nelissendcb346b2015-09-09 10:47:29 -0700363 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Andy Hung4ef19fa2018-05-15 19:35:29 -0700364 if (!isAudioServerOrMediaServerUid(callingUid)) {
Eric Laurent9f39f8d2016-05-25 12:34:48 -0700365 ALOGW_IF(uid != (uid_t)-1 && uid != callingUid,
Marco Nelissendcb346b2015-09-09 10:47:29 -0700366 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid, uid);
367 uid = callingUid;
Eric Laurentb2379ba2016-05-23 17:42:12 -0700368 updatePid = true;
369 }
370
371 if (updatePid) {
372 const pid_t callingPid = IPCThreadState::self()->getCallingPid();
Eric Laurent9f39f8d2016-05-25 12:34:48 -0700373 ALOGW_IF(pid != (pid_t)-1 && pid != callingPid,
Eric Laurentb2379ba2016-05-23 17:42:12 -0700374 "%s uid %d pid %d tried to pass itself off as pid %d",
375 __func__, callingUid, callingPid, pid);
376 pid = callingPid;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700377 }
378
Eric Laurent7dca8a82018-01-29 18:44:26 -0800379 // check calling permissions
380 if (!recordingAllowed(opPackageName, pid, uid)) {
381 ALOGE("%s permission denied: recording not allowed for uid %d pid %d",
382 __func__, uid, pid);
383 return PERMISSION_DENIED;
384 }
385
Eric Laurent1ff16a72019-03-14 18:35:04 -0700386 bool canCaptureOutput = captureAudioOutputAllowed(pid, uid);
Nadav Bar744be482018-05-08 13:26:21 +0300387 if ((attr->source == AUDIO_SOURCE_VOICE_UPLINK ||
388 attr->source == AUDIO_SOURCE_VOICE_DOWNLINK ||
Eric Laurentae4b6ec2019-01-15 18:34:38 -0800389 attr->source == AUDIO_SOURCE_VOICE_CALL ||
390 attr->source == AUDIO_SOURCE_ECHO_REFERENCE) &&
Eric Laurent1ff16a72019-03-14 18:35:04 -0700391 !canCaptureOutput) {
Nadav Bar744be482018-05-08 13:26:21 +0300392 return PERMISSION_DENIED;
393 }
394
jiabin68e0df72019-03-18 17:55:35 -0700395 bool canCaptureHotword = captureHotwordAllowed(opPackageName, pid, uid);
Eric Laurent1ff16a72019-03-14 18:35:04 -0700396 if ((attr->source == AUDIO_SOURCE_HOTWORD) && !canCaptureHotword) {
Eric Laurent7504b9e2017-08-15 18:17:26 -0700397 return BAD_VALUE;
398 }
399
400 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700401 {
Eric Laurent7504b9e2017-08-15 18:17:26 -0700402 status_t status;
403 AudioPolicyInterface::input_type_t inputType;
404
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700405 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700406 {
407 AutoCallerClear acc;
408 // the audio_in_acoustics_t parameter is ignored by get_input()
Mikhail Naganov2996f672019-04-18 12:29:59 -0700409 status = mAudioPolicyManager->getInputForAttr(attr, input, riid, session, uid,
Eric Laurent10b71232018-04-13 18:14:44 -0700410 config,
411 flags, selectedDeviceId,
412 &inputType, portId);
413 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700414 audioPolicyEffects = mAudioPolicyEffects;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800415
416 if (status == NO_ERROR) {
417 // enforce permission (if any) required for each type of input
418 switch (inputType) {
Kevin Rocard25f9b052019-02-27 15:08:54 -0800419 case AudioPolicyInterface::API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK:
420 // this use case has been validated in audio service with a MediaProjection token,
421 // and doesn't rely on regular permissions
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800422 case AudioPolicyInterface::API_INPUT_LEGACY:
423 break;
Eric Laurent82db2692015-08-07 13:59:42 -0700424 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX:
425 // FIXME: use the same permission as for remote submix for now.
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800426 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
Eric Laurent1ff16a72019-03-14 18:35:04 -0700427 if (!canCaptureOutput) {
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800428 ALOGE("getInputForAttr() permission denied: capture not allowed");
429 status = PERMISSION_DENIED;
430 }
431 break;
432 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE:
433 if (!modifyAudioRoutingAllowed()) {
434 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed");
435 status = PERMISSION_DENIED;
436 }
437 break;
438 case AudioPolicyInterface::API_INPUT_INVALID:
439 default:
440 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d",
441 (int)inputType);
442 }
443 }
444
445 if (status != NO_ERROR) {
446 if (status == PERMISSION_DENIED) {
Eric Laurent10b71232018-04-13 18:14:44 -0700447 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700448 mAudioPolicyManager->releaseInput(*portId);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800449 }
450 return status;
451 }
Eric Laurentfee19762018-01-29 18:44:13 -0800452
Eric Laurentd7fe0862018-07-14 16:48:01 -0700453 sp<AudioRecordClient> client = new AudioRecordClient(*attr, *input, uid, pid, session,
Eric Laurent1ff16a72019-03-14 18:35:04 -0700454 *selectedDeviceId, opPackageName,
455 canCaptureOutput, canCaptureHotword);
Eric Laurentfee19762018-01-29 18:44:13 -0800456 mAudioRecordClients.add(*portId, client);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700457 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800458
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700459 if (audioPolicyEffects != 0) {
460 // create audio pre processors according to input source
Eric Laurentcaf7f482014-11-25 17:50:47 -0800461 status_t status = audioPolicyEffects->addInputEffects(*input, attr->source, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700462 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentcaf7f482014-11-25 17:50:47 -0800463 ALOGW("Failed to add effects on input %d", *input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700464 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800465 }
Eric Laurentcaf7f482014-11-25 17:50:47 -0800466 return NO_ERROR;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800467}
468
Eric Laurent99fcae42018-05-17 16:59:18 -0700469std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) {
Eric Laurent99fcae42018-05-17 16:59:18 -0700470 struct audio_port port = {};
471 port.id = portId;
472 status_t status = mAudioPolicyManager->getAudioPort(&port);
473 if (status == NO_ERROR && port.type == AUDIO_PORT_TYPE_DEVICE) {
Andy Hung9b181952019-02-25 14:53:36 -0800474 return toString(port.ext.device.type);
Eric Laurent99fcae42018-05-17 16:59:18 -0700475 }
Andy Hung9b181952019-02-25 14:53:36 -0800476 return {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700477}
478
Eric Laurent4eb58f12018-12-07 16:41:02 -0800479status_t AudioPolicyService::startInput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800480{
Eric Laurentdce54a12014-03-10 12:19:46 -0700481 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800482 return NO_INIT;
483 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800484 sp<AudioRecordClient> client;
485 {
486 Mutex::Autolock _l(mLock);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800487
Eric Laurent7dca8a82018-01-29 18:44:26 -0800488 ssize_t index = mAudioRecordClients.indexOfKey(portId);
489 if (index < 0) {
490 return INVALID_OPERATION;
491 }
492 client = mAudioRecordClients.valueAt(index);
Eric Laurentfee19762018-01-29 18:44:13 -0800493 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800494
495 // check calling permissions
Svet Ganov6e641372018-03-02 09:21:30 -0800496 if (!startRecording(client->opPackageName, client->pid, client->uid)) {
Eric Laurent7dca8a82018-01-29 18:44:26 -0800497 ALOGE("%s permission denied: recording not allowed for uid %d pid %d",
498 __func__, client->uid, client->pid);
499 return PERMISSION_DENIED;
500 }
Eric Laurentfee19762018-01-29 18:44:13 -0800501
Eric Laurentdf628922018-12-06 21:45:51 +0000502 Mutex::Autolock _l(mLock);
Eric Laurent4eb58f12018-12-07 16:41:02 -0800503
504 client->active = true;
505 client->startTimeNs = systemTime();
506 updateUidStates_l();
Eric Laurentfee19762018-01-29 18:44:13 -0800507
Eric Laurent10b71232018-04-13 18:14:44 -0700508 status_t status;
509 {
510 AutoCallerClear acc;
Eric Laurent4eb58f12018-12-07 16:41:02 -0800511 status = mAudioPolicyManager->startInput(portId);
Ray Essick84e84a52018-05-03 18:45:07 -0700512
513 }
514
Ray Essickf6a57cd2018-05-22 16:20:54 -0700515 // including successes gets very verbose
516 if (status != NO_ERROR) {
Ray Essick84e84a52018-05-03 18:45:07 -0700517
518 static constexpr char kAudioPolicy[] = "audiopolicy";
519
Ray Essick84e84a52018-05-03 18:45:07 -0700520 static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status";
521 static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src";
522 static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg";
523 static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session";
Eric Laurent99fcae42018-05-17 16:59:18 -0700524 static constexpr char kAudioPolicyRqstDevice[] =
525 "android.media.audiopolicy.rqst.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700526 static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src";
527 static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg";
Eric Laurent99fcae42018-05-17 16:59:18 -0700528 static constexpr char kAudioPolicyActiveSession[] =
529 "android.media.audiopolicy.active.session";
530 static constexpr char kAudioPolicyActiveDevice[] =
531 "android.media.audiopolicy.active.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700532
Ray Essick6a305222019-01-28 20:33:18 -0800533 MediaAnalyticsItem *item = MediaAnalyticsItem::create(kAudioPolicy);
Ray Essick84e84a52018-05-03 18:45:07 -0700534 if (item != NULL) {
535
Ray Essick84e84a52018-05-03 18:45:07 -0700536 item->setInt32(kAudioPolicyStatus, status);
537
Eric Laurent99fcae42018-05-17 16:59:18 -0700538 item->setCString(kAudioPolicyRqstSrc,
Andy Hung9b181952019-02-25 14:53:36 -0800539 toString(client->attributes.source).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700540 item->setInt32(kAudioPolicyRqstSession, client->session);
Ray Essick51866952018-05-30 11:22:27 -0700541 if (client->opPackageName.size() != 0) {
542 item->setCString(kAudioPolicyRqstPkg,
543 std::string(String8(client->opPackageName).string()).c_str());
544 } else {
Kevin Rocardfbdfebe2018-06-18 12:30:40 -0700545 item->setCString(kAudioPolicyRqstPkg, std::to_string(client->uid).c_str());
Ray Essick51866952018-05-30 11:22:27 -0700546 }
Eric Laurent99fcae42018-05-17 16:59:18 -0700547 item->setCString(
548 kAudioPolicyRqstDevice, getDeviceTypeStrForPortId(client->deviceId).c_str());
549
Eric Laurent4eb58f12018-12-07 16:41:02 -0800550 int count = mAudioRecordClients.size();
551 for (int i = 0; i < count ; i++) {
552 if (portId == mAudioRecordClients.keyAt(i)) {
553 continue;
554 }
555 sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
556 if (other->active) {
557 // keeps the last of the clients marked active
558 item->setCString(kAudioPolicyActiveSrc,
Andy Hung9b181952019-02-25 14:53:36 -0800559 toString(other->attributes.source).c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -0800560 item->setInt32(kAudioPolicyActiveSession, other->session);
561 if (other->opPackageName.size() != 0) {
562 item->setCString(kAudioPolicyActivePkg,
563 std::string(String8(other->opPackageName).string()).c_str());
564 } else {
565 item->setCString(kAudioPolicyRqstPkg,
566 std::to_string(other->uid).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700567 }
Eric Laurent4eb58f12018-12-07 16:41:02 -0800568 item->setCString(kAudioPolicyActiveDevice,
569 getDeviceTypeStrForPortId(other->deviceId).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700570 }
571 }
572 item->selfrecord();
573 delete item;
574 item = NULL;
575 }
Eric Laurent4eb58f12018-12-07 16:41:02 -0800576 client->active = false;
577 client->startTimeNs = 0;
578 updateUidStates_l();
Svet Ganov6e641372018-03-02 09:21:30 -0800579 finishRecording(client->opPackageName, client->uid);
Eric Laurentfb66dd92016-01-28 18:32:03 -0800580 }
581
582 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800583}
584
Eric Laurentfee19762018-01-29 18:44:13 -0800585status_t AudioPolicyService::stopInput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800586{
Eric Laurentdce54a12014-03-10 12:19:46 -0700587 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800588 return NO_INIT;
589 }
Eric Laurent4eb58f12018-12-07 16:41:02 -0800590
Eric Laurent2d388ec2014-03-07 13:25:54 -0800591 Mutex::Autolock _l(mLock);
592
Eric Laurentfee19762018-01-29 18:44:13 -0800593 ssize_t index = mAudioRecordClients.indexOfKey(portId);
594 if (index < 0) {
595 return INVALID_OPERATION;
596 }
597 sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
598
Ray Essick84e84a52018-05-03 18:45:07 -0700599 client->active = false;
Eric Laurent4eb58f12018-12-07 16:41:02 -0800600 client->startTimeNs = 0;
601
602 updateUidStates_l();
Ray Essick84e84a52018-05-03 18:45:07 -0700603
Svet Ganov6e641372018-03-02 09:21:30 -0800604 // finish the recording app op
605 finishRecording(client->opPackageName, client->uid);
Eric Laurent10b71232018-04-13 18:14:44 -0700606 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700607 return mAudioPolicyManager->stopInput(portId);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800608}
609
Eric Laurentfee19762018-01-29 18:44:13 -0800610void AudioPolicyService::releaseInput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800611{
Eric Laurentdce54a12014-03-10 12:19:46 -0700612 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800613 return;
614 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700615 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -0800616 sp<AudioRecordClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700617 {
618 Mutex::Autolock _l(mLock);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700619 audioPolicyEffects = mAudioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -0800620 ssize_t index = mAudioRecordClients.indexOfKey(portId);
621 if (index < 0) {
622 return;
623 }
624 client = mAudioRecordClients.valueAt(index);
Eric Laurent4eb58f12018-12-07 16:41:02 -0800625
626 if (client->active) {
627 ALOGW("%s releasing active client portId %d", __FUNCTION__, portId);
628 client->active = false;
629 client->startTimeNs = 0;
630 updateUidStates_l();
631 }
632
Eric Laurentfee19762018-01-29 18:44:13 -0800633 mAudioRecordClients.removeItem(portId);
634 }
635 if (client == 0) {
636 return;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700637 }
638 if (audioPolicyEffects != 0) {
639 // release audio processors from the input
Eric Laurentd7fe0862018-07-14 16:48:01 -0700640 status_t status = audioPolicyEffects->releaseInputEffects(client->io, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700641 if(status != NO_ERROR) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700642 ALOGW("Failed to release effects on input %d", client->io);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700643 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800644 }
Eric Laurentf10c7092016-12-06 17:09:56 -0800645 {
646 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700647 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700648 mAudioPolicyManager->releaseInput(portId);
Eric Laurentf10c7092016-12-06 17:09:56 -0800649 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800650}
651
652status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
653 int indexMin,
654 int indexMax)
655{
Eric Laurentdce54a12014-03-10 12:19:46 -0700656 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800657 return NO_INIT;
658 }
659 if (!settingsAllowed()) {
660 return PERMISSION_DENIED;
661 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800662 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800663 return BAD_VALUE;
664 }
665 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700666 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700667 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800668 return NO_ERROR;
669}
670
671status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
672 int index,
673 audio_devices_t device)
674{
Eric Laurentdce54a12014-03-10 12:19:46 -0700675 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800676 return NO_INIT;
677 }
678 if (!settingsAllowed()) {
679 return PERMISSION_DENIED;
680 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800681 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800682 return BAD_VALUE;
683 }
684 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700685 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700686 return mAudioPolicyManager->setStreamVolumeIndex(stream,
687 index,
688 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800689}
690
691status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
692 int *index,
693 audio_devices_t device)
694{
Eric Laurentdce54a12014-03-10 12:19:46 -0700695 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800696 return NO_INIT;
697 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800698 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800699 return BAD_VALUE;
700 }
701 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700702 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700703 return mAudioPolicyManager->getStreamVolumeIndex(stream,
704 index,
705 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800706}
707
François Gaffiecfe17322018-11-07 13:41:29 +0100708status_t AudioPolicyService::setVolumeIndexForAttributes(const audio_attributes_t &attributes,
709 int index, audio_devices_t device)
710{
711 if (mAudioPolicyManager == NULL) {
712 return NO_INIT;
713 }
714 if (!settingsAllowed()) {
715 return PERMISSION_DENIED;
716 }
717 Mutex::Autolock _l(mLock);
718 AutoCallerClear acc;
719 return mAudioPolicyManager->setVolumeIndexForAttributes(attributes, index, device);
720}
721
722status_t AudioPolicyService::getVolumeIndexForAttributes(const audio_attributes_t &attributes,
723 int &index, audio_devices_t device)
724{
725 if (mAudioPolicyManager == NULL) {
726 return NO_INIT;
727 }
728 Mutex::Autolock _l(mLock);
729 AutoCallerClear acc;
730 return mAudioPolicyManager->getVolumeIndexForAttributes(attributes, index, device);
731}
732
733status_t AudioPolicyService::getMinVolumeIndexForAttributes(const audio_attributes_t &attributes,
734 int &index)
735{
736 if (mAudioPolicyManager == NULL) {
737 return NO_INIT;
738 }
739 Mutex::Autolock _l(mLock);
740 AutoCallerClear acc;
741 return mAudioPolicyManager->getMinVolumeIndexForAttributes(attributes, index);
742}
743
744status_t AudioPolicyService::getMaxVolumeIndexForAttributes(const audio_attributes_t &attributes,
745 int &index)
746{
747 if (mAudioPolicyManager == NULL) {
748 return NO_INIT;
749 }
750 Mutex::Autolock _l(mLock);
751 AutoCallerClear acc;
752 return mAudioPolicyManager->getMaxVolumeIndexForAttributes(attributes, index);
753}
754
Eric Laurent2d388ec2014-03-07 13:25:54 -0800755uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
756{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800757 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
François Gaffiec005e562018-11-06 15:04:49 +0100758 return PRODUCT_STRATEGY_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700759 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700760 if (mAudioPolicyManager == NULL) {
François Gaffiec005e562018-11-06 15:04:49 +0100761 return PRODUCT_STRATEGY_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800762 }
François Gaffiec005e562018-11-06 15:04:49 +0100763 // DO NOT LOCK, may be called from AudioFlinger with lock held, reaching deadlock
Eric Laurent10b71232018-04-13 18:14:44 -0700764 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700765 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800766}
767
768//audio policy: use audio_device_t appropriately
769
770audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
771{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800772 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700773 return AUDIO_DEVICE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700774 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700775 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700776 return AUDIO_DEVICE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800777 }
Haynes Mathew Georgedfb9f3b2015-10-26 18:22:13 -0700778 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700779 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700780 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800781}
782
783audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
784{
785 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700786 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800787 return 0;
788 }
789 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700790 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700791 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800792}
793
794status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
795 audio_io_handle_t io,
796 uint32_t strategy,
Glenn Kastend848eb42016-03-08 13:42:11 -0800797 audio_session_t session,
Eric Laurent2d388ec2014-03-07 13:25:54 -0800798 int id)
799{
Eric Laurentdce54a12014-03-10 12:19:46 -0700800 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800801 return NO_INIT;
802 }
Eric Laurent6c796322019-04-09 14:13:17 -0700803 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700804 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700805 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800806}
807
808status_t AudioPolicyService::unregisterEffect(int id)
809{
Eric Laurentdce54a12014-03-10 12:19:46 -0700810 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800811 return NO_INIT;
812 }
Eric Laurent6c796322019-04-09 14:13:17 -0700813 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700814 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700815 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800816}
817
818status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
819{
Eric Laurentdce54a12014-03-10 12:19:46 -0700820 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800821 return NO_INIT;
822 }
Eric Laurent6c796322019-04-09 14:13:17 -0700823 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700824 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700825 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800826}
827
Eric Laurent6c796322019-04-09 14:13:17 -0700828status_t AudioPolicyService::moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io)
829{
830 if (mAudioPolicyManager == NULL) {
831 return NO_INIT;
832 }
833 Mutex::Autolock _l(mLock);
834 AutoCallerClear acc;
835 return mAudioPolicyManager->moveEffectsToIo(ids, io);
836}
837
Eric Laurent2d388ec2014-03-07 13:25:54 -0800838bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
839{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800840 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700841 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700842 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700843 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700844 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800845 }
846 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700847 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700848 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800849}
850
851bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
852{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800853 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700854 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700855 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700856 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700857 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800858 }
859 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700860 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700861 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800862}
863
864bool AudioPolicyService::isSourceActive(audio_source_t source) const
865{
Eric Laurentdce54a12014-03-10 12:19:46 -0700866 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800867 return false;
868 }
869 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700870 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700871 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800872}
873
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700874status_t AudioPolicyService::getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800875{
Eric Laurentdce54a12014-03-10 12:19:46 -0700876 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800877 return NO_INIT;
878 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700879 {
880 Mutex::Autolock _l(mLock);
881 audioPolicyEffects = mAudioPolicyEffects;
882 }
883 if (audioPolicyEffects == 0) {
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700884 return NO_INIT;
885 }
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700886
887 return OK;
888}
889
890status_t AudioPolicyService::queryDefaultPreProcessing(audio_session_t audioSession,
891 effect_descriptor_t *descriptors,
892 uint32_t *count)
893{
894 sp<AudioPolicyEffects>audioPolicyEffects;
895 status_t status = getAudioPolicyEffects(audioPolicyEffects);
896 if (status != OK) {
897 *count = 0;
898 return status;
899 }
Eric Laurentfb66dd92016-01-28 18:32:03 -0800900 return audioPolicyEffects->queryDefaultInputEffects(
901 (audio_session_t)audioSession, descriptors, count);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800902}
903
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700904status_t AudioPolicyService::addSourceDefaultEffect(const effect_uuid_t *type,
905 const String16& opPackageName,
906 const effect_uuid_t *uuid,
907 int32_t priority,
908 audio_source_t source,
909 audio_unique_id_t* id)
910{
911 sp<AudioPolicyEffects>audioPolicyEffects;
912 status_t status = getAudioPolicyEffects(audioPolicyEffects);
913 if (status != OK) {
914 return status;
915 }
916 if (!modifyDefaultAudioEffectsAllowed()) {
917 return PERMISSION_DENIED;
918 }
919 return audioPolicyEffects->addSourceDefaultEffect(
920 type, opPackageName, uuid, priority, source, id);
921}
922
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700923status_t AudioPolicyService::addStreamDefaultEffect(const effect_uuid_t *type,
924 const String16& opPackageName,
925 const effect_uuid_t *uuid,
926 int32_t priority,
927 audio_usage_t usage,
928 audio_unique_id_t* id)
929{
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700930 sp<AudioPolicyEffects>audioPolicyEffects;
931 status_t status = getAudioPolicyEffects(audioPolicyEffects);
932 if (status != OK) {
933 return status;
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700934 }
935 if (!modifyDefaultAudioEffectsAllowed()) {
936 return PERMISSION_DENIED;
937 }
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700938 return audioPolicyEffects->addStreamDefaultEffect(
939 type, opPackageName, uuid, priority, usage, id);
940}
941
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700942status_t AudioPolicyService::removeSourceDefaultEffect(audio_unique_id_t id)
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700943{
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700944 sp<AudioPolicyEffects>audioPolicyEffects;
945 status_t status = getAudioPolicyEffects(audioPolicyEffects);
946 if (status != OK) {
947 return status;
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700948 }
949 if (!modifyDefaultAudioEffectsAllowed()) {
950 return PERMISSION_DENIED;
951 }
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700952 return audioPolicyEffects->removeSourceDefaultEffect(id);
953}
954
955status_t AudioPolicyService::removeStreamDefaultEffect(audio_unique_id_t id)
956{
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700957 sp<AudioPolicyEffects>audioPolicyEffects;
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700958 status_t status = getAudioPolicyEffects(audioPolicyEffects);
959 if (status != OK) {
960 return status;
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700961 }
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700962 if (!modifyDefaultAudioEffectsAllowed()) {
963 return PERMISSION_DENIED;
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700964 }
965 return audioPolicyEffects->removeStreamDefaultEffect(id);
966}
967
Kevin Rocardb99cc752019-03-21 20:52:24 -0700968status_t AudioPolicyService::setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t capturePolicy) {
969 Mutex::Autolock _l(mLock);
970 if (mAudioPolicyManager == NULL) {
971 ALOGV("%s() mAudioPolicyManager == NULL", __func__);
972 return NO_INIT;
973 }
974 uint_t callingUid = IPCThreadState::self()->getCallingUid();
975 if (uid != callingUid) {
976 ALOGD("%s() uid invalid %d != %d", __func__, uid, callingUid);
977 return PERMISSION_DENIED;
978 }
979 return mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy);
980}
981
Eric Laurent2d388ec2014-03-07 13:25:54 -0800982bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
983{
Eric Laurentdce54a12014-03-10 12:19:46 -0700984 if (mAudioPolicyManager == NULL) {
985 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800986 return false;
987 }
Andy Hung2ddee192015-12-18 17:34:44 -0800988 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700989 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700990 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800991}
992
Michael Chana94fbb22018-04-24 14:31:19 +1000993bool AudioPolicyService::isDirectOutputSupported(const audio_config_base_t& config,
994 const audio_attributes_t& attributes) {
995 if (mAudioPolicyManager == NULL) {
996 ALOGV("mAudioPolicyManager == NULL");
997 return false;
998 }
999 Mutex::Autolock _l(mLock);
1000 return mAudioPolicyManager->isDirectOutputSupported(config, attributes);
1001}
1002
1003
Eric Laurent6a94d692014-05-20 11:18:06 -07001004status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
1005 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -07001006 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -07001007 struct audio_port *ports,
1008 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -07001009{
Eric Laurent6a94d692014-05-20 11:18:06 -07001010 Mutex::Autolock _l(mLock);
1011 if (mAudioPolicyManager == NULL) {
1012 return NO_INIT;
1013 }
Eric Laurent10b71232018-04-13 18:14:44 -07001014 AutoCallerClear acc;
Eric Laurent6a94d692014-05-20 11:18:06 -07001015 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -07001016}
1017
Eric Laurent6a94d692014-05-20 11:18:06 -07001018status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -07001019{
Eric Laurent6a94d692014-05-20 11:18:06 -07001020 Mutex::Autolock _l(mLock);
1021 if (mAudioPolicyManager == NULL) {
1022 return NO_INIT;
1023 }
Eric Laurent10b71232018-04-13 18:14:44 -07001024 AutoCallerClear acc;
Eric Laurent6a94d692014-05-20 11:18:06 -07001025 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -07001026}
1027
Eric Laurent6a94d692014-05-20 11:18:06 -07001028status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
1029 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -07001030{
Eric Laurent6a94d692014-05-20 11:18:06 -07001031 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001032 if(!modifyAudioRoutingAllowed()) {
1033 return PERMISSION_DENIED;
1034 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001035 if (mAudioPolicyManager == NULL) {
1036 return NO_INIT;
1037 }
Eric Laurent10b71232018-04-13 18:14:44 -07001038 AutoCallerClear acc;
Eric Laurent6a94d692014-05-20 11:18:06 -07001039 return mAudioPolicyManager->createAudioPatch(patch, handle,
1040 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -07001041}
1042
Eric Laurent6a94d692014-05-20 11:18:06 -07001043status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -07001044{
Eric Laurent6a94d692014-05-20 11:18:06 -07001045 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001046 if(!modifyAudioRoutingAllowed()) {
1047 return PERMISSION_DENIED;
1048 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001049 if (mAudioPolicyManager == NULL) {
1050 return NO_INIT;
1051 }
Eric Laurent10b71232018-04-13 18:14:44 -07001052 AutoCallerClear acc;
Eric Laurent6a94d692014-05-20 11:18:06 -07001053 return mAudioPolicyManager->releaseAudioPatch(handle,
1054 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -07001055}
1056
1057status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -07001058 struct audio_patch *patches,
1059 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -07001060{
Eric Laurent6a94d692014-05-20 11:18:06 -07001061 Mutex::Autolock _l(mLock);
1062 if (mAudioPolicyManager == NULL) {
1063 return NO_INIT;
1064 }
Eric Laurent10b71232018-04-13 18:14:44 -07001065 AutoCallerClear acc;
Eric Laurent6a94d692014-05-20 11:18:06 -07001066 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -07001067}
1068
Eric Laurent6a94d692014-05-20 11:18:06 -07001069status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -07001070{
Eric Laurent6a94d692014-05-20 11:18:06 -07001071 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001072 if(!modifyAudioRoutingAllowed()) {
1073 return PERMISSION_DENIED;
1074 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001075 if (mAudioPolicyManager == NULL) {
1076 return NO_INIT;
1077 }
Eric Laurent10b71232018-04-13 18:14:44 -07001078 AutoCallerClear acc;
Eric Laurent6a94d692014-05-20 11:18:06 -07001079 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -07001080}
Eric Laurent2d388ec2014-03-07 13:25:54 -08001081
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001082status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
1083 audio_io_handle_t *ioHandle,
1084 audio_devices_t *device)
1085{
Andy Hungf759b8c2017-08-15 12:48:54 -07001086 Mutex::Autolock _l(mLock);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001087 if (mAudioPolicyManager == NULL) {
1088 return NO_INIT;
1089 }
Eric Laurent10b71232018-04-13 18:14:44 -07001090 AutoCallerClear acc;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001091 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
1092}
1093
1094status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
1095{
Andy Hungf759b8c2017-08-15 12:48:54 -07001096 Mutex::Autolock _l(mLock);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001097 if (mAudioPolicyManager == NULL) {
1098 return NO_INIT;
1099 }
Eric Laurent10b71232018-04-13 18:14:44 -07001100 AutoCallerClear acc;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001101 return mAudioPolicyManager->releaseSoundTriggerSession(session);
1102}
1103
Chih-Hung Hsiehe964d4e2016-08-09 14:31:32 -07001104status_t AudioPolicyService::registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration)
Eric Laurentbaac1832014-12-01 17:52:59 -08001105{
1106 Mutex::Autolock _l(mLock);
Kevin Rocardbe201852019-02-20 22:33:28 -08001107
1108 // loopback|render only need a MediaProjection (checked in caller AudioService.java)
1109 bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1110 return !is_mix_loopback_render(mix.mRouteFlags); });
1111 if (needModifyAudioRouting && !modifyAudioRoutingAllowed()) {
Eric Laurentbaac1832014-12-01 17:52:59 -08001112 return PERMISSION_DENIED;
1113 }
Kevin Rocardbe201852019-02-20 22:33:28 -08001114
Kevin Rocard36b17552019-03-07 18:48:07 -08001115 bool needCaptureMediaOutput = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1116 return mix.mAllowPrivilegedPlaybackCapture; });
1117 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
1118 const pid_t callingPid = IPCThreadState::self()->getCallingPid();
1119 if (needCaptureMediaOutput && !captureMediaOutputAllowed(callingPid, callingUid)) {
1120 return PERMISSION_DENIED;
1121 }
1122
Eric Laurentbaac1832014-12-01 17:52:59 -08001123 if (mAudioPolicyManager == NULL) {
1124 return NO_INIT;
1125 }
Eric Laurent10b71232018-04-13 18:14:44 -07001126 AutoCallerClear acc;
Eric Laurentbaac1832014-12-01 17:52:59 -08001127 if (registration) {
1128 return mAudioPolicyManager->registerPolicyMixes(mixes);
1129 } else {
1130 return mAudioPolicyManager->unregisterPolicyMixes(mixes);
1131 }
1132}
1133
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001134status_t AudioPolicyService::setUidDeviceAffinities(uid_t uid,
1135 const Vector<AudioDeviceTypeAddr>& devices) {
1136 Mutex::Autolock _l(mLock);
1137 if(!modifyAudioRoutingAllowed()) {
1138 return PERMISSION_DENIED;
1139 }
1140 if (mAudioPolicyManager == NULL) {
1141 return NO_INIT;
1142 }
1143 AutoCallerClear acc;
1144 return mAudioPolicyManager->setUidDeviceAffinities(uid, devices);
1145}
1146
1147status_t AudioPolicyService::removeUidDeviceAffinities(uid_t uid) {
1148 Mutex::Autolock _l(mLock);
1149 if(!modifyAudioRoutingAllowed()) {
1150 return PERMISSION_DENIED;
1151 }
1152 if (mAudioPolicyManager == NULL) {
1153 return NO_INIT;
1154 }
1155 AutoCallerClear acc;
1156 return mAudioPolicyManager->removeUidDeviceAffinities(uid);
1157}
1158
Eric Laurent554a2772015-04-10 11:29:24 -07001159status_t AudioPolicyService::startAudioSource(const struct audio_port_config *source,
Eric Laurent3e6c7e12018-07-27 17:09:23 -07001160 const audio_attributes_t *attributes,
1161 audio_port_handle_t *portId)
Eric Laurent554a2772015-04-10 11:29:24 -07001162{
1163 Mutex::Autolock _l(mLock);
1164 if (mAudioPolicyManager == NULL) {
1165 return NO_INIT;
1166 }
Hongwei Wang5cd1f1d2019-03-26 15:21:11 -07001167 // startAudioSource should be created as the calling uid
1168 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Eric Laurent10b71232018-04-13 18:14:44 -07001169 AutoCallerClear acc;
Hongwei Wang5cd1f1d2019-03-26 15:21:11 -07001170 return mAudioPolicyManager->startAudioSource(source, attributes, portId, callingUid);
Eric Laurent554a2772015-04-10 11:29:24 -07001171}
1172
Eric Laurent3e6c7e12018-07-27 17:09:23 -07001173status_t AudioPolicyService::stopAudioSource(audio_port_handle_t portId)
Eric Laurent554a2772015-04-10 11:29:24 -07001174{
1175 Mutex::Autolock _l(mLock);
1176 if (mAudioPolicyManager == NULL) {
1177 return NO_INIT;
1178 }
Eric Laurent10b71232018-04-13 18:14:44 -07001179 AutoCallerClear acc;
Eric Laurent3e6c7e12018-07-27 17:09:23 -07001180 return mAudioPolicyManager->stopAudioSource(portId);
Eric Laurent554a2772015-04-10 11:29:24 -07001181}
1182
Andy Hung2ddee192015-12-18 17:34:44 -08001183status_t AudioPolicyService::setMasterMono(bool mono)
1184{
1185 if (mAudioPolicyManager == NULL) {
1186 return NO_INIT;
1187 }
1188 if (!settingsAllowed()) {
1189 return PERMISSION_DENIED;
1190 }
1191 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001192 AutoCallerClear acc;
Andy Hung2ddee192015-12-18 17:34:44 -08001193 return mAudioPolicyManager->setMasterMono(mono);
1194}
1195
1196status_t AudioPolicyService::getMasterMono(bool *mono)
1197{
1198 if (mAudioPolicyManager == NULL) {
1199 return NO_INIT;
1200 }
1201 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001202 AutoCallerClear acc;
Andy Hung2ddee192015-12-18 17:34:44 -08001203 return mAudioPolicyManager->getMasterMono(mono);
1204}
1205
Eric Laurentac9cef52017-06-09 15:46:26 -07001206
1207float AudioPolicyService::getStreamVolumeDB(
1208 audio_stream_type_t stream, int index, audio_devices_t device)
1209{
1210 if (mAudioPolicyManager == NULL) {
1211 return NAN;
1212 }
1213 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001214 AutoCallerClear acc;
Eric Laurentac9cef52017-06-09 15:46:26 -07001215 return mAudioPolicyManager->getStreamVolumeDB(stream, index, device);
1216}
1217
jiabin81772902018-04-02 17:52:27 -07001218status_t AudioPolicyService::getSurroundFormats(unsigned int *numSurroundFormats,
1219 audio_format_t *surroundFormats,
1220 bool *surroundFormatsEnabled,
1221 bool reported)
1222{
1223 if (mAudioPolicyManager == NULL) {
1224 return NO_INIT;
1225 }
1226 Mutex::Autolock _l(mLock);
1227 AutoCallerClear acc;
1228 return mAudioPolicyManager->getSurroundFormats(numSurroundFormats, surroundFormats,
1229 surroundFormatsEnabled, reported);
1230}
1231
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001232status_t AudioPolicyService::getHwOffloadEncodingFormatsSupportedForA2DP(
1233 std::vector<audio_format_t> *formats)
1234{
1235 if (mAudioPolicyManager == NULL) {
1236 return NO_INIT;
1237 }
1238 Mutex::Autolock _l(mLock);
1239 AutoCallerClear acc;
1240 return mAudioPolicyManager->getHwOffloadEncodingFormatsSupportedForA2DP(formats);
1241}
1242
jiabin81772902018-04-02 17:52:27 -07001243status_t AudioPolicyService::setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled)
1244{
1245 if (mAudioPolicyManager == NULL) {
1246 return NO_INIT;
1247 }
1248 Mutex::Autolock _l(mLock);
1249 AutoCallerClear acc;
1250 return mAudioPolicyManager->setSurroundFormatEnabled(audioFormat, enabled);
1251}
Eric Laurentac9cef52017-06-09 15:46:26 -07001252
Eric Laurentb78763e2018-10-17 10:08:02 -07001253status_t AudioPolicyService::setAssistantUid(uid_t uid)
1254{
1255 Mutex::Autolock _l(mLock);
1256 mUidPolicy->setAssistantUid(uid);
1257 return NO_ERROR;
1258}
1259
1260status_t AudioPolicyService::setA11yServicesUids(const std::vector<uid_t>& uids)
1261{
1262 Mutex::Autolock _l(mLock);
1263 mUidPolicy->setA11yUids(uids);
1264 return NO_ERROR;
1265}
1266
jiabin6012f912018-11-02 17:06:30 -07001267bool AudioPolicyService::isHapticPlaybackSupported()
1268{
1269 if (mAudioPolicyManager == NULL) {
1270 ALOGW("%s, mAudioPolicyManager == NULL", __func__);
1271 return false;
1272 }
1273 Mutex::Autolock _l(mLock);
1274 AutoCallerClear acc;
1275 return mAudioPolicyManager->isHapticPlaybackSupported();
1276}
1277
François Gaffied0ba9ed2018-11-05 11:50:42 +01001278status_t AudioPolicyService::listAudioProductStrategies(AudioProductStrategyVector &strategies)
1279{
1280 if (mAudioPolicyManager == NULL) {
1281 return NO_INIT;
1282 }
1283 Mutex::Autolock _l(mLock);
1284 return mAudioPolicyManager->listAudioProductStrategies(strategies);
1285}
1286
François Gaffie4b2018b2018-11-07 11:18:59 +01001287status_t AudioPolicyService::getProductStrategyFromAudioAttributes(
1288 const AudioAttributes &aa, product_strategy_t &productStrategy)
François Gaffied0ba9ed2018-11-05 11:50:42 +01001289{
1290 if (mAudioPolicyManager == NULL) {
François Gaffie4b2018b2018-11-07 11:18:59 +01001291 return NO_INIT;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001292 }
1293 Mutex::Autolock _l(mLock);
François Gaffie4b2018b2018-11-07 11:18:59 +01001294 return mAudioPolicyManager->getProductStrategyFromAudioAttributes(aa, productStrategy);
1295}
1296
1297status_t AudioPolicyService::listAudioVolumeGroups(AudioVolumeGroupVector &groups)
1298{
1299 if (mAudioPolicyManager == NULL) {
1300 return NO_INIT;
1301 }
1302 Mutex::Autolock _l(mLock);
1303 return mAudioPolicyManager->listAudioVolumeGroups(groups);
1304}
1305
1306status_t AudioPolicyService::getVolumeGroupFromAudioAttributes(const AudioAttributes &aa,
1307 volume_group_t &volumeGroup)
1308{
1309 if (mAudioPolicyManager == NULL) {
1310 return NO_INIT;
1311 }
1312 Mutex::Autolock _l(mLock);
1313 return mAudioPolicyManager->getVolumeGroupFromAudioAttributes(aa, volumeGroup);
François Gaffied0ba9ed2018-11-05 11:50:42 +01001314}
Mikhail Naganov1b2a7942017-12-08 10:18:09 -08001315} // namespace android