blob: b0a85415af57c28598ceb4922788bd33ff0439a6 [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
Ray Essick6ce27e52019-02-15 10:58:05 -0800516 // but once we cut over to westworld, log them all.
Ray Essickf6a57cd2018-05-22 16:20:54 -0700517 if (status != NO_ERROR) {
Ray Essick84e84a52018-05-03 18:45:07 -0700518
519 static constexpr char kAudioPolicy[] = "audiopolicy";
520
Ray Essick84e84a52018-05-03 18:45:07 -0700521 static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status";
522 static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src";
523 static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg";
524 static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session";
Eric Laurent99fcae42018-05-17 16:59:18 -0700525 static constexpr char kAudioPolicyRqstDevice[] =
526 "android.media.audiopolicy.rqst.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700527 static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src";
528 static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg";
Eric Laurent99fcae42018-05-17 16:59:18 -0700529 static constexpr char kAudioPolicyActiveSession[] =
530 "android.media.audiopolicy.active.session";
531 static constexpr char kAudioPolicyActiveDevice[] =
532 "android.media.audiopolicy.active.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700533
Ray Essick6a305222019-01-28 20:33:18 -0800534 MediaAnalyticsItem *item = MediaAnalyticsItem::create(kAudioPolicy);
Ray Essick84e84a52018-05-03 18:45:07 -0700535 if (item != NULL) {
536
Ray Essick84e84a52018-05-03 18:45:07 -0700537 item->setInt32(kAudioPolicyStatus, status);
538
Eric Laurent99fcae42018-05-17 16:59:18 -0700539 item->setCString(kAudioPolicyRqstSrc,
Andy Hung9b181952019-02-25 14:53:36 -0800540 toString(client->attributes.source).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700541 item->setInt32(kAudioPolicyRqstSession, client->session);
Ray Essick51866952018-05-30 11:22:27 -0700542 if (client->opPackageName.size() != 0) {
543 item->setCString(kAudioPolicyRqstPkg,
544 std::string(String8(client->opPackageName).string()).c_str());
545 } else {
Kevin Rocardfbdfebe2018-06-18 12:30:40 -0700546 item->setCString(kAudioPolicyRqstPkg, std::to_string(client->uid).c_str());
Ray Essick51866952018-05-30 11:22:27 -0700547 }
Eric Laurent99fcae42018-05-17 16:59:18 -0700548 item->setCString(
549 kAudioPolicyRqstDevice, getDeviceTypeStrForPortId(client->deviceId).c_str());
550
Eric Laurent4eb58f12018-12-07 16:41:02 -0800551 int count = mAudioRecordClients.size();
552 for (int i = 0; i < count ; i++) {
553 if (portId == mAudioRecordClients.keyAt(i)) {
554 continue;
555 }
556 sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
557 if (other->active) {
558 // keeps the last of the clients marked active
559 item->setCString(kAudioPolicyActiveSrc,
Andy Hung9b181952019-02-25 14:53:36 -0800560 toString(other->attributes.source).c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -0800561 item->setInt32(kAudioPolicyActiveSession, other->session);
562 if (other->opPackageName.size() != 0) {
563 item->setCString(kAudioPolicyActivePkg,
564 std::string(String8(other->opPackageName).string()).c_str());
565 } else {
566 item->setCString(kAudioPolicyRqstPkg,
567 std::to_string(other->uid).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700568 }
Eric Laurent4eb58f12018-12-07 16:41:02 -0800569 item->setCString(kAudioPolicyActiveDevice,
570 getDeviceTypeStrForPortId(other->deviceId).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700571 }
572 }
573 item->selfrecord();
574 delete item;
575 item = NULL;
576 }
Ray Essick6ce27e52019-02-15 10:58:05 -0800577 }
578
579 if (status != NO_ERROR) {
Eric Laurent4eb58f12018-12-07 16:41:02 -0800580 client->active = false;
581 client->startTimeNs = 0;
582 updateUidStates_l();
Svet Ganov6e641372018-03-02 09:21:30 -0800583 finishRecording(client->opPackageName, client->uid);
Eric Laurentfb66dd92016-01-28 18:32:03 -0800584 }
585
586 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800587}
588
Eric Laurentfee19762018-01-29 18:44:13 -0800589status_t AudioPolicyService::stopInput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800590{
Eric Laurentdce54a12014-03-10 12:19:46 -0700591 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800592 return NO_INIT;
593 }
Eric Laurent4eb58f12018-12-07 16:41:02 -0800594
Eric Laurent2d388ec2014-03-07 13:25:54 -0800595 Mutex::Autolock _l(mLock);
596
Eric Laurentfee19762018-01-29 18:44:13 -0800597 ssize_t index = mAudioRecordClients.indexOfKey(portId);
598 if (index < 0) {
599 return INVALID_OPERATION;
600 }
601 sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
602
Ray Essick84e84a52018-05-03 18:45:07 -0700603 client->active = false;
Eric Laurent4eb58f12018-12-07 16:41:02 -0800604 client->startTimeNs = 0;
605
606 updateUidStates_l();
Ray Essick84e84a52018-05-03 18:45:07 -0700607
Svet Ganov6e641372018-03-02 09:21:30 -0800608 // finish the recording app op
609 finishRecording(client->opPackageName, client->uid);
Eric Laurent10b71232018-04-13 18:14:44 -0700610 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700611 return mAudioPolicyManager->stopInput(portId);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800612}
613
Eric Laurentfee19762018-01-29 18:44:13 -0800614void AudioPolicyService::releaseInput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800615{
Eric Laurentdce54a12014-03-10 12:19:46 -0700616 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800617 return;
618 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700619 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -0800620 sp<AudioRecordClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700621 {
622 Mutex::Autolock _l(mLock);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700623 audioPolicyEffects = mAudioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -0800624 ssize_t index = mAudioRecordClients.indexOfKey(portId);
625 if (index < 0) {
626 return;
627 }
628 client = mAudioRecordClients.valueAt(index);
Eric Laurent4eb58f12018-12-07 16:41:02 -0800629
630 if (client->active) {
631 ALOGW("%s releasing active client portId %d", __FUNCTION__, portId);
632 client->active = false;
633 client->startTimeNs = 0;
634 updateUidStates_l();
635 }
636
Eric Laurentfee19762018-01-29 18:44:13 -0800637 mAudioRecordClients.removeItem(portId);
638 }
639 if (client == 0) {
640 return;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700641 }
642 if (audioPolicyEffects != 0) {
643 // release audio processors from the input
Eric Laurentd7fe0862018-07-14 16:48:01 -0700644 status_t status = audioPolicyEffects->releaseInputEffects(client->io, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700645 if(status != NO_ERROR) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700646 ALOGW("Failed to release effects on input %d", client->io);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700647 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800648 }
Eric Laurentf10c7092016-12-06 17:09:56 -0800649 {
650 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700651 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700652 mAudioPolicyManager->releaseInput(portId);
Eric Laurentf10c7092016-12-06 17:09:56 -0800653 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800654}
655
656status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
657 int indexMin,
658 int indexMax)
659{
Eric Laurentdce54a12014-03-10 12:19:46 -0700660 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800661 return NO_INIT;
662 }
663 if (!settingsAllowed()) {
664 return PERMISSION_DENIED;
665 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800666 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800667 return BAD_VALUE;
668 }
669 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700670 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700671 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800672 return NO_ERROR;
673}
674
675status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
676 int index,
677 audio_devices_t device)
678{
Eric Laurentdce54a12014-03-10 12:19:46 -0700679 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800680 return NO_INIT;
681 }
682 if (!settingsAllowed()) {
683 return PERMISSION_DENIED;
684 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800685 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800686 return BAD_VALUE;
687 }
688 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700689 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700690 return mAudioPolicyManager->setStreamVolumeIndex(stream,
691 index,
692 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800693}
694
695status_t AudioPolicyService::getStreamVolumeIndex(audio_stream_type_t stream,
696 int *index,
697 audio_devices_t device)
698{
Eric Laurentdce54a12014-03-10 12:19:46 -0700699 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800700 return NO_INIT;
701 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800702 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800703 return BAD_VALUE;
704 }
705 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700706 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700707 return mAudioPolicyManager->getStreamVolumeIndex(stream,
708 index,
709 device);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800710}
711
François Gaffiecfe17322018-11-07 13:41:29 +0100712status_t AudioPolicyService::setVolumeIndexForAttributes(const audio_attributes_t &attributes,
713 int index, audio_devices_t device)
714{
715 if (mAudioPolicyManager == NULL) {
716 return NO_INIT;
717 }
718 if (!settingsAllowed()) {
719 return PERMISSION_DENIED;
720 }
721 Mutex::Autolock _l(mLock);
722 AutoCallerClear acc;
723 return mAudioPolicyManager->setVolumeIndexForAttributes(attributes, index, device);
724}
725
726status_t AudioPolicyService::getVolumeIndexForAttributes(const audio_attributes_t &attributes,
727 int &index, audio_devices_t device)
728{
729 if (mAudioPolicyManager == NULL) {
730 return NO_INIT;
731 }
732 Mutex::Autolock _l(mLock);
733 AutoCallerClear acc;
734 return mAudioPolicyManager->getVolumeIndexForAttributes(attributes, index, device);
735}
736
737status_t AudioPolicyService::getMinVolumeIndexForAttributes(const audio_attributes_t &attributes,
738 int &index)
739{
740 if (mAudioPolicyManager == NULL) {
741 return NO_INIT;
742 }
743 Mutex::Autolock _l(mLock);
744 AutoCallerClear acc;
745 return mAudioPolicyManager->getMinVolumeIndexForAttributes(attributes, index);
746}
747
748status_t AudioPolicyService::getMaxVolumeIndexForAttributes(const audio_attributes_t &attributes,
749 int &index)
750{
751 if (mAudioPolicyManager == NULL) {
752 return NO_INIT;
753 }
754 Mutex::Autolock _l(mLock);
755 AutoCallerClear acc;
756 return mAudioPolicyManager->getMaxVolumeIndexForAttributes(attributes, index);
757}
758
Eric Laurent2d388ec2014-03-07 13:25:54 -0800759uint32_t AudioPolicyService::getStrategyForStream(audio_stream_type_t stream)
760{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800761 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
François Gaffiec005e562018-11-06 15:04:49 +0100762 return PRODUCT_STRATEGY_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700763 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700764 if (mAudioPolicyManager == NULL) {
François Gaffiec005e562018-11-06 15:04:49 +0100765 return PRODUCT_STRATEGY_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800766 }
François Gaffiec005e562018-11-06 15:04:49 +0100767 // DO NOT LOCK, may be called from AudioFlinger with lock held, reaching deadlock
Eric Laurent10b71232018-04-13 18:14:44 -0700768 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700769 return mAudioPolicyManager->getStrategyForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800770}
771
772//audio policy: use audio_device_t appropriately
773
774audio_devices_t AudioPolicyService::getDevicesForStream(audio_stream_type_t stream)
775{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800776 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700777 return AUDIO_DEVICE_NONE;
Eric Laurentdea15412014-10-28 15:46:45 -0700778 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700779 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700780 return AUDIO_DEVICE_NONE;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800781 }
Haynes Mathew Georgedfb9f3b2015-10-26 18:22:13 -0700782 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700783 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700784 return mAudioPolicyManager->getDevicesForStream(stream);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800785}
786
787audio_io_handle_t AudioPolicyService::getOutputForEffect(const effect_descriptor_t *desc)
788{
789 // FIXME change return type to status_t, and return NO_INIT here
Eric Laurentdce54a12014-03-10 12:19:46 -0700790 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800791 return 0;
792 }
793 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700794 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700795 return mAudioPolicyManager->getOutputForEffect(desc);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800796}
797
798status_t AudioPolicyService::registerEffect(const effect_descriptor_t *desc,
799 audio_io_handle_t io,
800 uint32_t strategy,
Glenn Kastend848eb42016-03-08 13:42:11 -0800801 audio_session_t session,
Eric Laurent2d388ec2014-03-07 13:25:54 -0800802 int id)
803{
Eric Laurentdce54a12014-03-10 12:19:46 -0700804 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800805 return NO_INIT;
806 }
Eric Laurent6c796322019-04-09 14:13:17 -0700807 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700808 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700809 return mAudioPolicyManager->registerEffect(desc, io, strategy, session, id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800810}
811
812status_t AudioPolicyService::unregisterEffect(int id)
813{
Eric Laurentdce54a12014-03-10 12:19:46 -0700814 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800815 return NO_INIT;
816 }
Eric Laurent6c796322019-04-09 14:13:17 -0700817 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700818 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700819 return mAudioPolicyManager->unregisterEffect(id);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800820}
821
822status_t AudioPolicyService::setEffectEnabled(int id, bool enabled)
823{
Eric Laurentdce54a12014-03-10 12:19:46 -0700824 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800825 return NO_INIT;
826 }
Eric Laurent6c796322019-04-09 14:13:17 -0700827 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700828 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700829 return mAudioPolicyManager->setEffectEnabled(id, enabled);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800830}
831
Eric Laurent6c796322019-04-09 14:13:17 -0700832status_t AudioPolicyService::moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io)
833{
834 if (mAudioPolicyManager == NULL) {
835 return NO_INIT;
836 }
837 Mutex::Autolock _l(mLock);
838 AutoCallerClear acc;
839 return mAudioPolicyManager->moveEffectsToIo(ids, io);
840}
841
Eric Laurent2d388ec2014-03-07 13:25:54 -0800842bool AudioPolicyService::isStreamActive(audio_stream_type_t stream, uint32_t inPastMs) const
843{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800844 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700845 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700846 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700847 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700848 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800849 }
850 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700851 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700852 return mAudioPolicyManager->isStreamActive(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800853}
854
855bool AudioPolicyService::isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs) const
856{
Eric Laurent223fd5c2014-11-11 13:43:36 -0800857 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700858 return false;
Eric Laurentdea15412014-10-28 15:46:45 -0700859 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700860 if (mAudioPolicyManager == NULL) {
Eric Laurentb1322c72014-10-30 14:59:13 -0700861 return false;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800862 }
863 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700864 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700865 return mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800866}
867
868bool AudioPolicyService::isSourceActive(audio_source_t source) const
869{
Eric Laurentdce54a12014-03-10 12:19:46 -0700870 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800871 return false;
872 }
873 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700874 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700875 return mAudioPolicyManager->isSourceActive(source);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800876}
877
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700878status_t AudioPolicyService::getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800879{
Eric Laurentdce54a12014-03-10 12:19:46 -0700880 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -0800881 return NO_INIT;
882 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700883 {
884 Mutex::Autolock _l(mLock);
885 audioPolicyEffects = mAudioPolicyEffects;
886 }
887 if (audioPolicyEffects == 0) {
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700888 return NO_INIT;
889 }
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700890
891 return OK;
892}
893
894status_t AudioPolicyService::queryDefaultPreProcessing(audio_session_t audioSession,
895 effect_descriptor_t *descriptors,
896 uint32_t *count)
897{
898 sp<AudioPolicyEffects>audioPolicyEffects;
899 status_t status = getAudioPolicyEffects(audioPolicyEffects);
900 if (status != OK) {
901 *count = 0;
902 return status;
903 }
Eric Laurentfb66dd92016-01-28 18:32:03 -0800904 return audioPolicyEffects->queryDefaultInputEffects(
905 (audio_session_t)audioSession, descriptors, count);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800906}
907
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700908status_t AudioPolicyService::addSourceDefaultEffect(const effect_uuid_t *type,
909 const String16& opPackageName,
910 const effect_uuid_t *uuid,
911 int32_t priority,
912 audio_source_t source,
913 audio_unique_id_t* id)
914{
915 sp<AudioPolicyEffects>audioPolicyEffects;
916 status_t status = getAudioPolicyEffects(audioPolicyEffects);
917 if (status != OK) {
918 return status;
919 }
920 if (!modifyDefaultAudioEffectsAllowed()) {
921 return PERMISSION_DENIED;
922 }
923 return audioPolicyEffects->addSourceDefaultEffect(
924 type, opPackageName, uuid, priority, source, id);
925}
926
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700927status_t AudioPolicyService::addStreamDefaultEffect(const effect_uuid_t *type,
928 const String16& opPackageName,
929 const effect_uuid_t *uuid,
930 int32_t priority,
931 audio_usage_t usage,
932 audio_unique_id_t* id)
933{
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700934 sp<AudioPolicyEffects>audioPolicyEffects;
935 status_t status = getAudioPolicyEffects(audioPolicyEffects);
936 if (status != OK) {
937 return status;
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700938 }
939 if (!modifyDefaultAudioEffectsAllowed()) {
940 return PERMISSION_DENIED;
941 }
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700942 return audioPolicyEffects->addStreamDefaultEffect(
943 type, opPackageName, uuid, priority, usage, id);
944}
945
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700946status_t AudioPolicyService::removeSourceDefaultEffect(audio_unique_id_t id)
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700947{
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700948 sp<AudioPolicyEffects>audioPolicyEffects;
949 status_t status = getAudioPolicyEffects(audioPolicyEffects);
950 if (status != OK) {
951 return status;
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700952 }
953 if (!modifyDefaultAudioEffectsAllowed()) {
954 return PERMISSION_DENIED;
955 }
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700956 return audioPolicyEffects->removeSourceDefaultEffect(id);
957}
958
959status_t AudioPolicyService::removeStreamDefaultEffect(audio_unique_id_t id)
960{
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700961 sp<AudioPolicyEffects>audioPolicyEffects;
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700962 status_t status = getAudioPolicyEffects(audioPolicyEffects);
963 if (status != OK) {
964 return status;
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700965 }
Ari Hausman-Cohen24628312018-08-13 15:01:09 -0700966 if (!modifyDefaultAudioEffectsAllowed()) {
967 return PERMISSION_DENIED;
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -0700968 }
969 return audioPolicyEffects->removeStreamDefaultEffect(id);
970}
971
Kevin Rocardb99cc752019-03-21 20:52:24 -0700972status_t AudioPolicyService::setAllowedCapturePolicy(uid_t uid, audio_flags_mask_t capturePolicy) {
973 Mutex::Autolock _l(mLock);
974 if (mAudioPolicyManager == NULL) {
975 ALOGV("%s() mAudioPolicyManager == NULL", __func__);
976 return NO_INIT;
977 }
978 uint_t callingUid = IPCThreadState::self()->getCallingUid();
979 if (uid != callingUid) {
980 ALOGD("%s() uid invalid %d != %d", __func__, uid, callingUid);
981 return PERMISSION_DENIED;
982 }
983 return mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy);
984}
985
Eric Laurent2d388ec2014-03-07 13:25:54 -0800986bool AudioPolicyService::isOffloadSupported(const audio_offload_info_t& info)
987{
Eric Laurentdce54a12014-03-10 12:19:46 -0700988 if (mAudioPolicyManager == NULL) {
989 ALOGV("mAudioPolicyManager == NULL");
Eric Laurent2d388ec2014-03-07 13:25:54 -0800990 return false;
991 }
Andy Hung2ddee192015-12-18 17:34:44 -0800992 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700993 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700994 return mAudioPolicyManager->isOffloadSupported(info);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800995}
996
Michael Chana94fbb22018-04-24 14:31:19 +1000997bool AudioPolicyService::isDirectOutputSupported(const audio_config_base_t& config,
998 const audio_attributes_t& attributes) {
999 if (mAudioPolicyManager == NULL) {
1000 ALOGV("mAudioPolicyManager == NULL");
1001 return false;
1002 }
1003 Mutex::Autolock _l(mLock);
1004 return mAudioPolicyManager->isDirectOutputSupported(config, attributes);
1005}
1006
1007
Eric Laurent6a94d692014-05-20 11:18:06 -07001008status_t AudioPolicyService::listAudioPorts(audio_port_role_t role,
1009 audio_port_type_t type,
Eric Laurent203b1a12014-04-01 10:34:16 -07001010 unsigned int *num_ports,
Eric Laurent6a94d692014-05-20 11:18:06 -07001011 struct audio_port *ports,
1012 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -07001013{
Eric Laurent6a94d692014-05-20 11:18:06 -07001014 Mutex::Autolock _l(mLock);
1015 if (mAudioPolicyManager == NULL) {
1016 return NO_INIT;
1017 }
Eric Laurent10b71232018-04-13 18:14:44 -07001018 AutoCallerClear acc;
Eric Laurent6a94d692014-05-20 11:18:06 -07001019 return mAudioPolicyManager->listAudioPorts(role, type, num_ports, ports, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -07001020}
1021
Eric Laurent6a94d692014-05-20 11:18:06 -07001022status_t AudioPolicyService::getAudioPort(struct audio_port *port)
Eric Laurent203b1a12014-04-01 10:34:16 -07001023{
Eric Laurent6a94d692014-05-20 11:18:06 -07001024 Mutex::Autolock _l(mLock);
1025 if (mAudioPolicyManager == NULL) {
1026 return NO_INIT;
1027 }
Eric Laurent10b71232018-04-13 18:14:44 -07001028 AutoCallerClear acc;
Eric Laurent6a94d692014-05-20 11:18:06 -07001029 return mAudioPolicyManager->getAudioPort(port);
Eric Laurent203b1a12014-04-01 10:34:16 -07001030}
1031
Eric Laurent6a94d692014-05-20 11:18:06 -07001032status_t AudioPolicyService::createAudioPatch(const struct audio_patch *patch,
1033 audio_patch_handle_t *handle)
Eric Laurent203b1a12014-04-01 10:34:16 -07001034{
Eric Laurent6a94d692014-05-20 11:18:06 -07001035 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001036 if(!modifyAudioRoutingAllowed()) {
1037 return PERMISSION_DENIED;
1038 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001039 if (mAudioPolicyManager == NULL) {
1040 return NO_INIT;
1041 }
Eric Laurent10b71232018-04-13 18:14:44 -07001042 AutoCallerClear acc;
Eric Laurent6a94d692014-05-20 11:18:06 -07001043 return mAudioPolicyManager->createAudioPatch(patch, handle,
1044 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -07001045}
1046
Eric Laurent6a94d692014-05-20 11:18:06 -07001047status_t AudioPolicyService::releaseAudioPatch(audio_patch_handle_t handle)
Eric Laurent203b1a12014-04-01 10:34:16 -07001048{
Eric Laurent6a94d692014-05-20 11:18:06 -07001049 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001050 if(!modifyAudioRoutingAllowed()) {
1051 return PERMISSION_DENIED;
1052 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001053 if (mAudioPolicyManager == NULL) {
1054 return NO_INIT;
1055 }
Eric Laurent10b71232018-04-13 18:14:44 -07001056 AutoCallerClear acc;
Eric Laurent6a94d692014-05-20 11:18:06 -07001057 return mAudioPolicyManager->releaseAudioPatch(handle,
1058 IPCThreadState::self()->getCallingUid());
Eric Laurent203b1a12014-04-01 10:34:16 -07001059}
1060
1061status_t AudioPolicyService::listAudioPatches(unsigned int *num_patches,
Eric Laurent6a94d692014-05-20 11:18:06 -07001062 struct audio_patch *patches,
1063 unsigned int *generation)
Eric Laurent203b1a12014-04-01 10:34:16 -07001064{
Eric Laurent6a94d692014-05-20 11:18:06 -07001065 Mutex::Autolock _l(mLock);
1066 if (mAudioPolicyManager == NULL) {
1067 return NO_INIT;
1068 }
Eric Laurent10b71232018-04-13 18:14:44 -07001069 AutoCallerClear acc;
Eric Laurent6a94d692014-05-20 11:18:06 -07001070 return mAudioPolicyManager->listAudioPatches(num_patches, patches, generation);
Eric Laurent203b1a12014-04-01 10:34:16 -07001071}
1072
Eric Laurent6a94d692014-05-20 11:18:06 -07001073status_t AudioPolicyService::setAudioPortConfig(const struct audio_port_config *config)
Eric Laurent203b1a12014-04-01 10:34:16 -07001074{
Eric Laurent6a94d692014-05-20 11:18:06 -07001075 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001076 if(!modifyAudioRoutingAllowed()) {
1077 return PERMISSION_DENIED;
1078 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001079 if (mAudioPolicyManager == NULL) {
1080 return NO_INIT;
1081 }
Eric Laurent10b71232018-04-13 18:14:44 -07001082 AutoCallerClear acc;
Eric Laurent6a94d692014-05-20 11:18:06 -07001083 return mAudioPolicyManager->setAudioPortConfig(config);
Eric Laurent203b1a12014-04-01 10:34:16 -07001084}
Eric Laurent2d388ec2014-03-07 13:25:54 -08001085
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001086status_t AudioPolicyService::acquireSoundTriggerSession(audio_session_t *session,
1087 audio_io_handle_t *ioHandle,
1088 audio_devices_t *device)
1089{
Andy Hungf759b8c2017-08-15 12:48:54 -07001090 Mutex::Autolock _l(mLock);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001091 if (mAudioPolicyManager == NULL) {
1092 return NO_INIT;
1093 }
Eric Laurent10b71232018-04-13 18:14:44 -07001094 AutoCallerClear acc;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001095 return mAudioPolicyManager->acquireSoundTriggerSession(session, ioHandle, device);
1096}
1097
1098status_t AudioPolicyService::releaseSoundTriggerSession(audio_session_t session)
1099{
Andy Hungf759b8c2017-08-15 12:48:54 -07001100 Mutex::Autolock _l(mLock);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001101 if (mAudioPolicyManager == NULL) {
1102 return NO_INIT;
1103 }
Eric Laurent10b71232018-04-13 18:14:44 -07001104 AutoCallerClear acc;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001105 return mAudioPolicyManager->releaseSoundTriggerSession(session);
1106}
1107
Chih-Hung Hsiehe964d4e2016-08-09 14:31:32 -07001108status_t AudioPolicyService::registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration)
Eric Laurentbaac1832014-12-01 17:52:59 -08001109{
1110 Mutex::Autolock _l(mLock);
Kevin Rocardbe201852019-02-20 22:33:28 -08001111
1112 // loopback|render only need a MediaProjection (checked in caller AudioService.java)
1113 bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1114 return !is_mix_loopback_render(mix.mRouteFlags); });
1115 if (needModifyAudioRouting && !modifyAudioRoutingAllowed()) {
Eric Laurentbaac1832014-12-01 17:52:59 -08001116 return PERMISSION_DENIED;
1117 }
Kevin Rocardbe201852019-02-20 22:33:28 -08001118
Kevin Rocard36b17552019-03-07 18:48:07 -08001119 bool needCaptureMediaOutput = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1120 return mix.mAllowPrivilegedPlaybackCapture; });
1121 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
1122 const pid_t callingPid = IPCThreadState::self()->getCallingPid();
1123 if (needCaptureMediaOutput && !captureMediaOutputAllowed(callingPid, callingUid)) {
1124 return PERMISSION_DENIED;
1125 }
1126
Eric Laurentbaac1832014-12-01 17:52:59 -08001127 if (mAudioPolicyManager == NULL) {
1128 return NO_INIT;
1129 }
Eric Laurent10b71232018-04-13 18:14:44 -07001130 AutoCallerClear acc;
Eric Laurentbaac1832014-12-01 17:52:59 -08001131 if (registration) {
1132 return mAudioPolicyManager->registerPolicyMixes(mixes);
1133 } else {
1134 return mAudioPolicyManager->unregisterPolicyMixes(mixes);
1135 }
1136}
1137
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001138status_t AudioPolicyService::setUidDeviceAffinities(uid_t uid,
1139 const Vector<AudioDeviceTypeAddr>& devices) {
1140 Mutex::Autolock _l(mLock);
1141 if(!modifyAudioRoutingAllowed()) {
1142 return PERMISSION_DENIED;
1143 }
1144 if (mAudioPolicyManager == NULL) {
1145 return NO_INIT;
1146 }
1147 AutoCallerClear acc;
1148 return mAudioPolicyManager->setUidDeviceAffinities(uid, devices);
1149}
1150
1151status_t AudioPolicyService::removeUidDeviceAffinities(uid_t uid) {
1152 Mutex::Autolock _l(mLock);
1153 if(!modifyAudioRoutingAllowed()) {
1154 return PERMISSION_DENIED;
1155 }
1156 if (mAudioPolicyManager == NULL) {
1157 return NO_INIT;
1158 }
1159 AutoCallerClear acc;
1160 return mAudioPolicyManager->removeUidDeviceAffinities(uid);
1161}
1162
Eric Laurent554a2772015-04-10 11:29:24 -07001163status_t AudioPolicyService::startAudioSource(const struct audio_port_config *source,
Eric Laurent3e6c7e12018-07-27 17:09:23 -07001164 const audio_attributes_t *attributes,
1165 audio_port_handle_t *portId)
Eric Laurent554a2772015-04-10 11:29:24 -07001166{
1167 Mutex::Autolock _l(mLock);
1168 if (mAudioPolicyManager == NULL) {
1169 return NO_INIT;
1170 }
Hongwei Wang5cd1f1d2019-03-26 15:21:11 -07001171 // startAudioSource should be created as the calling uid
1172 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Eric Laurent10b71232018-04-13 18:14:44 -07001173 AutoCallerClear acc;
Hongwei Wang5cd1f1d2019-03-26 15:21:11 -07001174 return mAudioPolicyManager->startAudioSource(source, attributes, portId, callingUid);
Eric Laurent554a2772015-04-10 11:29:24 -07001175}
1176
Eric Laurent3e6c7e12018-07-27 17:09:23 -07001177status_t AudioPolicyService::stopAudioSource(audio_port_handle_t portId)
Eric Laurent554a2772015-04-10 11:29:24 -07001178{
1179 Mutex::Autolock _l(mLock);
1180 if (mAudioPolicyManager == NULL) {
1181 return NO_INIT;
1182 }
Eric Laurent10b71232018-04-13 18:14:44 -07001183 AutoCallerClear acc;
Eric Laurent3e6c7e12018-07-27 17:09:23 -07001184 return mAudioPolicyManager->stopAudioSource(portId);
Eric Laurent554a2772015-04-10 11:29:24 -07001185}
1186
Andy Hung2ddee192015-12-18 17:34:44 -08001187status_t AudioPolicyService::setMasterMono(bool mono)
1188{
1189 if (mAudioPolicyManager == NULL) {
1190 return NO_INIT;
1191 }
1192 if (!settingsAllowed()) {
1193 return PERMISSION_DENIED;
1194 }
1195 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001196 AutoCallerClear acc;
Andy Hung2ddee192015-12-18 17:34:44 -08001197 return mAudioPolicyManager->setMasterMono(mono);
1198}
1199
1200status_t AudioPolicyService::getMasterMono(bool *mono)
1201{
1202 if (mAudioPolicyManager == NULL) {
1203 return NO_INIT;
1204 }
1205 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001206 AutoCallerClear acc;
Andy Hung2ddee192015-12-18 17:34:44 -08001207 return mAudioPolicyManager->getMasterMono(mono);
1208}
1209
Eric Laurentac9cef52017-06-09 15:46:26 -07001210
1211float AudioPolicyService::getStreamVolumeDB(
1212 audio_stream_type_t stream, int index, audio_devices_t device)
1213{
1214 if (mAudioPolicyManager == NULL) {
1215 return NAN;
1216 }
1217 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001218 AutoCallerClear acc;
Eric Laurentac9cef52017-06-09 15:46:26 -07001219 return mAudioPolicyManager->getStreamVolumeDB(stream, index, device);
1220}
1221
jiabin81772902018-04-02 17:52:27 -07001222status_t AudioPolicyService::getSurroundFormats(unsigned int *numSurroundFormats,
1223 audio_format_t *surroundFormats,
1224 bool *surroundFormatsEnabled,
1225 bool reported)
1226{
1227 if (mAudioPolicyManager == NULL) {
1228 return NO_INIT;
1229 }
1230 Mutex::Autolock _l(mLock);
1231 AutoCallerClear acc;
1232 return mAudioPolicyManager->getSurroundFormats(numSurroundFormats, surroundFormats,
1233 surroundFormatsEnabled, reported);
1234}
1235
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001236status_t AudioPolicyService::getHwOffloadEncodingFormatsSupportedForA2DP(
1237 std::vector<audio_format_t> *formats)
1238{
1239 if (mAudioPolicyManager == NULL) {
1240 return NO_INIT;
1241 }
1242 Mutex::Autolock _l(mLock);
1243 AutoCallerClear acc;
1244 return mAudioPolicyManager->getHwOffloadEncodingFormatsSupportedForA2DP(formats);
1245}
1246
jiabin81772902018-04-02 17:52:27 -07001247status_t AudioPolicyService::setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled)
1248{
1249 if (mAudioPolicyManager == NULL) {
1250 return NO_INIT;
1251 }
1252 Mutex::Autolock _l(mLock);
1253 AutoCallerClear acc;
1254 return mAudioPolicyManager->setSurroundFormatEnabled(audioFormat, enabled);
1255}
Eric Laurentac9cef52017-06-09 15:46:26 -07001256
Eric Laurentb78763e2018-10-17 10:08:02 -07001257status_t AudioPolicyService::setAssistantUid(uid_t uid)
1258{
1259 Mutex::Autolock _l(mLock);
1260 mUidPolicy->setAssistantUid(uid);
1261 return NO_ERROR;
1262}
1263
1264status_t AudioPolicyService::setA11yServicesUids(const std::vector<uid_t>& uids)
1265{
1266 Mutex::Autolock _l(mLock);
1267 mUidPolicy->setA11yUids(uids);
1268 return NO_ERROR;
1269}
1270
jiabin6012f912018-11-02 17:06:30 -07001271bool AudioPolicyService::isHapticPlaybackSupported()
1272{
1273 if (mAudioPolicyManager == NULL) {
1274 ALOGW("%s, mAudioPolicyManager == NULL", __func__);
1275 return false;
1276 }
1277 Mutex::Autolock _l(mLock);
1278 AutoCallerClear acc;
1279 return mAudioPolicyManager->isHapticPlaybackSupported();
1280}
1281
François Gaffied0ba9ed2018-11-05 11:50:42 +01001282status_t AudioPolicyService::listAudioProductStrategies(AudioProductStrategyVector &strategies)
1283{
1284 if (mAudioPolicyManager == NULL) {
1285 return NO_INIT;
1286 }
1287 Mutex::Autolock _l(mLock);
1288 return mAudioPolicyManager->listAudioProductStrategies(strategies);
1289}
1290
François Gaffie4b2018b2018-11-07 11:18:59 +01001291status_t AudioPolicyService::getProductStrategyFromAudioAttributes(
1292 const AudioAttributes &aa, product_strategy_t &productStrategy)
François Gaffied0ba9ed2018-11-05 11:50:42 +01001293{
1294 if (mAudioPolicyManager == NULL) {
François Gaffie4b2018b2018-11-07 11:18:59 +01001295 return NO_INIT;
François Gaffied0ba9ed2018-11-05 11:50:42 +01001296 }
1297 Mutex::Autolock _l(mLock);
François Gaffie4b2018b2018-11-07 11:18:59 +01001298 return mAudioPolicyManager->getProductStrategyFromAudioAttributes(aa, productStrategy);
1299}
1300
1301status_t AudioPolicyService::listAudioVolumeGroups(AudioVolumeGroupVector &groups)
1302{
1303 if (mAudioPolicyManager == NULL) {
1304 return NO_INIT;
1305 }
1306 Mutex::Autolock _l(mLock);
1307 return mAudioPolicyManager->listAudioVolumeGroups(groups);
1308}
1309
1310status_t AudioPolicyService::getVolumeGroupFromAudioAttributes(const AudioAttributes &aa,
1311 volume_group_t &volumeGroup)
1312{
1313 if (mAudioPolicyManager == NULL) {
1314 return NO_INIT;
1315 }
1316 Mutex::Autolock _l(mLock);
1317 return mAudioPolicyManager->getVolumeGroupFromAudioAttributes(aa, volumeGroup);
François Gaffied0ba9ed2018-11-05 11:50:42 +01001318}
Mikhail Naganov1b2a7942017-12-08 10:18:09 -08001319} // namespace android