blob: b9c715ea406e6809f25dbaa6808e83a94e2165f0 [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"
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080022#include <media/AidlConversion.h>
Kevin Rocardbe201852019-02-20 22:33:28 -080023#include <media/AudioPolicy.h>
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080024#include <media/AudioValidator.h>
25#include <media/MediaMetricsItem.h>
26#include <media/PolicyAidlConversion.h>
Eric Laurentd7fe0862018-07-14 16:48:01 -070027#include <utils/Log.h>
Philip P. Moltmannbda45752020-07-17 16:41:18 -070028#include <android/media/permission/Identity.h>
Eric Laurent2d388ec2014-03-07 13:25:54 -080029
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080030#define VALUE_OR_RETURN_BINDER_STATUS(x) \
31 ({ auto _tmp = (x); \
32 if (!_tmp.ok()) return aidl_utils::binderStatusFromStatusT(_tmp.error()); \
33 std::move(_tmp.value()); })
34
35#define RETURN_IF_BINDER_ERROR(x) \
36 { \
37 binder::Status _tmp = (x); \
38 if (!_tmp.isOk()) return _tmp; \
39 }
40
41#define MAX_ITEMS_PER_LIST 1024
42
Eric Laurent2d388ec2014-03-07 13:25:54 -080043namespace android {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080044using binder::Status;
45using aidl_utils::binderStatusFromStatusT;
Philip P. Moltmannbda45752020-07-17 16:41:18 -070046using media::permission::Identity;
Eric Laurent2d388ec2014-03-07 13:25:54 -080047
Hayden Gomes524159d2019-12-23 14:41:47 -080048const std::vector<audio_usage_t>& SYSTEM_USAGES = {
49 AUDIO_USAGE_CALL_ASSISTANT,
50 AUDIO_USAGE_EMERGENCY,
51 AUDIO_USAGE_SAFETY,
52 AUDIO_USAGE_VEHICLE_STATUS,
53 AUDIO_USAGE_ANNOUNCEMENT
54};
55
56bool isSystemUsage(audio_usage_t usage) {
57 return std::find(std::begin(SYSTEM_USAGES), std::end(SYSTEM_USAGES), usage)
58 != std::end(SYSTEM_USAGES);
59}
60
61bool AudioPolicyService::isSupportedSystemUsage(audio_usage_t usage) {
62 return std::find(std::begin(mSupportedSystemUsages), std::end(mSupportedSystemUsages), usage)
63 != std::end(mSupportedSystemUsages);
64}
65
66status_t AudioPolicyService::validateUsage(audio_usage_t usage) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -070067 return validateUsage(usage, getCallingIdentity());
Hayden Gomes524159d2019-12-23 14:41:47 -080068}
69
Philip P. Moltmannbda45752020-07-17 16:41:18 -070070status_t AudioPolicyService::validateUsage(audio_usage_t usage, const Identity& identity) {
Hayden Gomes524159d2019-12-23 14:41:47 -080071 if (isSystemUsage(usage)) {
72 if (isSupportedSystemUsage(usage)) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -070073 if (!modifyAudioRoutingAllowed(identity)) {
74 ALOGE(("permission denied: modify audio routing not allowed "
75 "for identity %s"), identity.toString().c_str());
Hayden Gomes524159d2019-12-23 14:41:47 -080076 return PERMISSION_DENIED;
77 }
78 } else {
79 return BAD_VALUE;
80 }
81 }
82 return NO_ERROR;
83}
84
85
Eric Laurent2d388ec2014-03-07 13:25:54 -080086
87// ----------------------------------------------------------------------------
88
Mikhail Naganov88b30d22020-03-09 19:43:13 +000089void AudioPolicyService::doOnNewAudioModulesAvailable()
90{
91 if (mAudioPolicyManager == NULL) return;
92 Mutex::Autolock _l(mLock);
93 AutoCallerClear acc;
94 mAudioPolicyManager->onNewAudioModulesAvailable();
95}
96
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080097Status AudioPolicyService::setDeviceConnectionState(
98 const media::AudioDevice& deviceAidl,
99 media::AudioPolicyDeviceState stateAidl,
100 const std::string& deviceNameAidl,
101 media::audio::common::AudioFormat encodedFormatAidl) {
102 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
103 aidl2legacy_int32_t_audio_devices_t(deviceAidl.type));
104 audio_policy_dev_state_t state = VALUE_OR_RETURN_BINDER_STATUS(
105 aidl2legacy_AudioPolicyDeviceState_audio_policy_dev_state_t(stateAidl));
106 audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
107 aidl2legacy_AudioFormat_audio_format_t(encodedFormatAidl));
108
Eric Laurentdce54a12014-03-10 12:19:46 -0700109 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800110 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800111 }
112 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800113 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800114 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800115 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
116 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800117 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800118 }
119
120 ALOGV("setDeviceConnectionState()");
121 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700122 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800123 return binderStatusFromStatusT(
124 mAudioPolicyManager->setDeviceConnectionState(device, state,
125 deviceAidl.address.c_str(),
126 deviceNameAidl.c_str(),
127 encodedFormat));
Eric Laurent2d388ec2014-03-07 13:25:54 -0800128}
129
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800130Status AudioPolicyService::getDeviceConnectionState(const media::AudioDevice& deviceAidl,
131 media::AudioPolicyDeviceState* _aidl_return) {
132 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
133 aidl2legacy_int32_t_audio_devices_t(deviceAidl.type));
Eric Laurentdce54a12014-03-10 12:19:46 -0700134 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800135 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
136 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
137 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
138 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800139 }
Eric Laurent10b71232018-04-13 18:14:44 -0700140 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800141 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
142 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
143 mAudioPolicyManager->getDeviceConnectionState(device,
144 deviceAidl.address.c_str())));
145 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800146}
147
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800148Status AudioPolicyService::handleDeviceConfigChange(
149 const media::AudioDevice& deviceAidl,
150 const std::string& deviceNameAidl,
151 media::audio::common::AudioFormat encodedFormatAidl) {
152 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
153 aidl2legacy_int32_t_audio_devices_t(deviceAidl.type));
154 audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
155 aidl2legacy_AudioFormat_audio_format_t(encodedFormatAidl));
156
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800157 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800158 return binderStatusFromStatusT(NO_INIT);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800159 }
160 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800161 return binderStatusFromStatusT(PERMISSION_DENIED);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800162 }
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800163
164 ALOGV("handleDeviceConfigChange()");
165 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700166 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800167 return binderStatusFromStatusT(
168 mAudioPolicyManager->handleDeviceConfigChange(device, deviceAidl.address.c_str(),
169 deviceNameAidl.c_str(), encodedFormat));
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800170}
171
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800172Status AudioPolicyService::setPhoneState(media::AudioMode stateAidl, int32_t uidAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800173{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800174 audio_mode_t state = VALUE_OR_RETURN_BINDER_STATUS(
175 aidl2legacy_AudioMode_audio_mode_t(stateAidl));
176 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700177 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800178 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800179 }
180 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800181 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800182 }
183 if (uint32_t(state) >= AUDIO_MODE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800184 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800185 }
186
187 ALOGV("setPhoneState()");
188
Eric Laurentbeb07fe2015-09-16 15:49:30 -0700189 // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic
190 // operation from policy manager standpoint (no other operation (e.g track start or stop)
191 // can be interleaved).
192 Mutex::Autolock _l(mLock);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800193 // TODO: check if it is more appropriate to do it in platform specific policy manager
194 AudioSystem::setMode(state);
195
Eric Laurent10b71232018-04-13 18:14:44 -0700196 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700197 mAudioPolicyManager->setPhoneState(state);
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700198 mPhoneState = state;
Eric Laurent00dba062020-02-11 15:52:09 -0800199 mPhoneStateOwnerUid = uid;
Mingshu Pangd07c19b2021-02-25 11:40:32 +0800200 updateUidStates_l();
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800201 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800202}
203
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800204Status AudioPolicyService::getPhoneState(media::AudioMode* _aidl_return) {
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700205 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800206 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_mode_t_AudioMode(mPhoneState));
207 return Status::ok();
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700208}
209
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800210Status AudioPolicyService::setForceUse(media::AudioPolicyForceUse usageAidl,
211 media::AudioPolicyForcedConfig configAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800212{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800213 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
214 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
215 audio_policy_forced_cfg_t config = VALUE_OR_RETURN_BINDER_STATUS(
216 aidl2legacy_AudioPolicyForcedConfig_audio_policy_forced_cfg_t(configAidl));
217
Eric Laurentdce54a12014-03-10 12:19:46 -0700218 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800219 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800220 }
Eric Laurente17378d2018-05-09 14:43:01 -0700221
222 if (!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800223 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800224 }
Eric Laurente17378d2018-05-09 14:43:01 -0700225
Eric Laurent2d388ec2014-03-07 13:25:54 -0800226 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800227 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800228 }
229 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800230 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800231 }
232 ALOGV("setForceUse()");
233 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700234 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700235 mAudioPolicyManager->setForceUse(usage, config);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800236 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800237}
238
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800239Status AudioPolicyService::getForceUse(media::AudioPolicyForceUse usageAidl,
240 media::AudioPolicyForcedConfig* _aidl_return) {
241 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
242 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
243
Eric Laurentdce54a12014-03-10 12:19:46 -0700244 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800245 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800246 }
247 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800248 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
249 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(AUDIO_POLICY_FORCE_NONE));
250 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800251 }
Eric Laurent10b71232018-04-13 18:14:44 -0700252 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800253 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
254 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(
255 mAudioPolicyManager->getForceUse(usage)));
256 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800257}
258
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800259Status AudioPolicyService::getOutput(media::AudioStreamType streamAidl, int32_t* _aidl_return)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800260{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800261 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
262 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
263
Eric Laurent223fd5c2014-11-11 13:43:36 -0800264 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800265 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
266 legacy2aidl_audio_io_handle_t_int32_t(AUDIO_IO_HANDLE_NONE));
267 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -0700268 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700269 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800270 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800271 }
272 ALOGV("getOutput()");
273 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700274 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800275 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
276 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutput(stream)));
277 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800278}
279
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800280Status AudioPolicyService::getOutputForAttr(const media::AudioAttributesInternal& attrAidl,
281 int32_t sessionAidl,
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700282 const Identity& identity,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800283 const media::AudioConfig& configAidl,
284 int32_t flagsAidl,
Eric Laurentf99edd32021-02-01 15:57:33 +0100285 int32_t selectedDeviceIdAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800286 media::GetOutputForAttrResponse* _aidl_return)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700287{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800288 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
289 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
290 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
291 aidl2legacy_int32_t_audio_session_t(sessionAidl));
292 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800293 audio_config_t config = VALUE_OR_RETURN_BINDER_STATUS(
294 aidl2legacy_AudioConfig_audio_config_t(configAidl));
295 audio_output_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
296 aidl2legacy_int32_t_audio_output_flags_t_mask(flagsAidl));
Eric Laurentf99edd32021-02-01 15:57:33 +0100297 audio_port_handle_t selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
298 aidl2legacy_int32_t_audio_port_handle_t(selectedDeviceIdAidl));
299
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800300 audio_io_handle_t output;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800301 audio_port_handle_t portId;
302 std::vector<audio_io_handle_t> secondaryOutputs;
303
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700304 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800305 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700306 }
Hayden Gomes524159d2019-12-23 14:41:47 -0800307
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800308 RETURN_IF_BINDER_ERROR(
309 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700310 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attr.usage, identity)));
Hayden Gomes524159d2019-12-23 14:41:47 -0800311
Eric Laurent8a1095a2019-11-08 14:44:16 -0800312 ALOGV("%s()", __func__);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700313 Mutex::Autolock _l(mLock);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700314
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700315 // TODO b/182392553: refactor or remove
316 Identity adjIdentity = identity;
Marco Nelissendcb346b2015-09-09 10:47:29 -0700317 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700318 if (!isAudioServerOrMediaServerUid(callingUid) || identity.uid == -1) {
319 int32_t callingUidAidl = VALUE_OR_RETURN_BINDER_STATUS(
320 legacy2aidl_uid_t_int32_t(callingUid));
321 ALOGW_IF(identity.uid != -1 && identity.uid != callingUidAidl,
322 "%s uid %d tried to pass itself off as %d", __func__,
323 callingUidAidl, identity.uid);
324 adjIdentity.uid = callingUidAidl;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700325 }
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700326 if (!mPackageManager.allowPlaybackCapture(VALUE_OR_RETURN_BINDER_STATUS(
327 aidl2legacy_int32_t_uid_t(adjIdentity.uid)))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800328 attr.flags = static_cast<audio_flags_mask_t>(attr.flags | AUDIO_FLAG_NO_MEDIA_PROJECTION);
Eric Laurent42984412019-05-09 17:57:03 -0700329 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800330 if (((attr.flags & (AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)) != 0)
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700331 && !bypassInterruptionPolicyAllowed(identity)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800332 attr.flags = static_cast<audio_flags_mask_t>(
333 attr.flags & ~(AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE));
Kevin Rocard8be94972019-02-22 13:26:25 -0800334 }
Eric Laurent10b71232018-04-13 18:14:44 -0700335 AutoCallerClear acc;
Eric Laurent8a1095a2019-11-08 14:44:16 -0800336 AudioPolicyInterface::output_type_t outputType;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800337 status_t result = mAudioPolicyManager->getOutputForAttr(&attr, &output, session,
338 &stream,
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700339 adjIdentity,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800340 &config,
341 &flags, &selectedDeviceId, &portId,
342 &secondaryOutputs,
343 &outputType);
Nadav Bar766fb022018-01-07 12:18:03 +0200344
345 // FIXME: Introduce a way to check for the the telephony device before opening the output
Eric Laurent8a1095a2019-11-08 14:44:16 -0800346 if (result == NO_ERROR) {
347 // enforce permission (if any) required for each type of input
348 switch (outputType) {
349 case AudioPolicyInterface::API_OUTPUT_LEGACY:
350 break;
351 case AudioPolicyInterface::API_OUTPUT_TELEPHONY_TX:
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700352 if (!modifyPhoneStateAllowed(adjIdentity)) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800353 ALOGE("%s() permission denied: modify phone state not allowed for uid %d",
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700354 __func__, adjIdentity.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800355 result = PERMISSION_DENIED;
356 }
357 break;
358 case AudioPolicyInterface::API_OUT_MIX_PLAYBACK:
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700359 if (!modifyAudioRoutingAllowed(adjIdentity)) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800360 ALOGE("%s() permission denied: modify audio routing not allowed for uid %d",
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700361 __func__, adjIdentity.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800362 result = PERMISSION_DENIED;
363 }
364 break;
365 case AudioPolicyInterface::API_OUTPUT_INVALID:
366 default:
367 LOG_ALWAYS_FATAL("%s() encountered an invalid output type %d",
368 __func__, (int)outputType);
369 }
Nadav Bar766fb022018-01-07 12:18:03 +0200370 }
Eric Laurentd7fe0862018-07-14 16:48:01 -0700371
372 if (result == NO_ERROR) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800373 sp<AudioPlaybackClient> client =
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700374 new AudioPlaybackClient(attr, output, adjIdentity, session,
375 portId, selectedDeviceId, stream);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800376 mAudioPlaybackClients.add(portId, client);
377
378 _aidl_return->output = VALUE_OR_RETURN_BINDER_STATUS(
379 legacy2aidl_audio_io_handle_t_int32_t(output));
380 _aidl_return->stream = VALUE_OR_RETURN_BINDER_STATUS(
381 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
382 _aidl_return->selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
383 legacy2aidl_audio_port_handle_t_int32_t(selectedDeviceId));
384 _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
385 legacy2aidl_audio_port_handle_t_int32_t(portId));
386 _aidl_return->secondaryOutputs = VALUE_OR_RETURN_BINDER_STATUS(
387 convertContainer<std::vector<int32_t>>(secondaryOutputs,
388 legacy2aidl_audio_io_handle_t_int32_t));
Eric Laurentd7fe0862018-07-14 16:48:01 -0700389 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800390 return binderStatusFromStatusT(result);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700391}
392
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700393void AudioPolicyService::getPlaybackClientAndEffects(audio_port_handle_t portId,
394 sp<AudioPlaybackClient>& client,
395 sp<AudioPolicyEffects>& effects,
396 const char *context)
397{
398 Mutex::Autolock _l(mLock);
399 const ssize_t index = mAudioPlaybackClients.indexOfKey(portId);
400 if (index < 0) {
401 ALOGE("%s AudioTrack client not found for portId %d", context, portId);
402 return;
403 }
404 client = mAudioPlaybackClients.valueAt(index);
405 effects = mAudioPolicyEffects;
406}
407
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800408Status AudioPolicyService::startOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800409{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800410 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
411 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700412 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800413 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800414 }
415 ALOGV("startOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700416 sp<AudioPlaybackClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700417 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700418
419 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
420
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700421 if (audioPolicyEffects != 0) {
422 // create audio processors according to stream
Eric Laurentd7fe0862018-07-14 16:48:01 -0700423 status_t status = audioPolicyEffects->addOutputSessionEffects(
424 client->io, client->stream, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700425 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700426 ALOGW("Failed to add effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700427 }
428 }
429 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700430 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700431 status_t status = mAudioPolicyManager->startOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700432 if (status == NO_ERROR) {
433 client->active = true;
434 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800435 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800436}
437
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800438Status AudioPolicyService::stopOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800439{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800440 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
441 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700442 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800443 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800444 }
445 ALOGV("stopOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700446 mOutputCommandThread->stopOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800447 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800448}
449
Eric Laurentd7fe0862018-07-14 16:48:01 -0700450status_t AudioPolicyService::doStopOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800451{
Eric Laurentd7fe0862018-07-14 16:48:01 -0700452 ALOGV("doStopOutput");
453 sp<AudioPlaybackClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700454 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentd7fe0862018-07-14 16:48:01 -0700455
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700456 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
457
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700458 if (audioPolicyEffects != 0) {
459 // release audio processors from the stream
Eric Laurentd7fe0862018-07-14 16:48:01 -0700460 status_t status = audioPolicyEffects->releaseOutputSessionEffects(
461 client->io, client->stream, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700462 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700463 ALOGW("Failed to release effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700464 }
465 }
466 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700467 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700468 status_t status = mAudioPolicyManager->stopOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700469 if (status == NO_ERROR) {
470 client->active = false;
471 }
472 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800473}
474
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800475Status AudioPolicyService::releaseOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800476{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800477 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
478 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700479 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800480 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800481 }
482 ALOGV("releaseOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700483 mOutputCommandThread->releaseOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800484 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800485}
486
Eric Laurentd7fe0862018-07-14 16:48:01 -0700487void AudioPolicyService::doReleaseOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800488{
489 ALOGV("doReleaseOutput from tid %d", gettid());
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700490 sp<AudioPlaybackClient> client;
491 sp<AudioPolicyEffects> audioPolicyEffects;
492
493 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
494
495 if (audioPolicyEffects != 0 && client->active) {
496 // clean up effects if output was not stopped before being released
497 audioPolicyEffects->releaseOutputSessionEffects(
498 client->io, client->stream, client->session);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700499 }
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700500 Mutex::Autolock _l(mLock);
Eric Laurentd4007242019-03-27 12:42:16 -0700501 mAudioPlaybackClients.removeItem(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700502
Eric Laurent10b71232018-04-13 18:14:44 -0700503 // called from internal thread: no need to clear caller identity
Eric Laurent8fc147b2018-07-22 19:13:55 -0700504 mAudioPolicyManager->releaseOutput(portId);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800505}
506
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800507Status AudioPolicyService::getInputForAttr(const media::AudioAttributesInternal& attrAidl,
508 int32_t inputAidl,
509 int32_t riidAidl,
510 int32_t sessionAidl,
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700511 const Identity& identity,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800512 const media::AudioConfigBase& configAidl,
513 int32_t flagsAidl,
Eric Laurentf99edd32021-02-01 15:57:33 +0100514 int32_t selectedDeviceIdAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800515 media::GetInputForAttrResponse* _aidl_return) {
516 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
517 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
518 audio_io_handle_t input = VALUE_OR_RETURN_BINDER_STATUS(
519 aidl2legacy_int32_t_audio_io_handle_t(inputAidl));
520 audio_unique_id_t riid = VALUE_OR_RETURN_BINDER_STATUS(
521 aidl2legacy_int32_t_audio_unique_id_t(riidAidl));
522 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
523 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800524 audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
525 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl));
526 audio_input_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
527 aidl2legacy_int32_t_audio_input_flags_t_mask(flagsAidl));
Eric Laurentf99edd32021-02-01 15:57:33 +0100528 audio_port_handle_t selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
529 aidl2legacy_int32_t_audio_port_handle_t(selectedDeviceIdAidl));
530
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800531 audio_port_handle_t portId;
532
Eric Laurentdce54a12014-03-10 12:19:46 -0700533 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800534 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800535 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800536
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800537 RETURN_IF_BINDER_ERROR(
538 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Hayden Gomes524159d2019-12-23 14:41:47 -0800539
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800540 audio_source_t inputSource = attr.source;
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900541 if (inputSource == AUDIO_SOURCE_DEFAULT) {
542 inputSource = AUDIO_SOURCE_MIC;
543 }
544
Eric Laurent2d388ec2014-03-07 13:25:54 -0800545 // already checked by client, but double-check in case the client wrapper is bypassed
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900546 if ((inputSource < AUDIO_SOURCE_DEFAULT)
547 || (inputSource >= AUDIO_SOURCE_CNT
548 && inputSource != AUDIO_SOURCE_HOTWORD
549 && inputSource != AUDIO_SOURCE_FM_TUNER
550 && inputSource != AUDIO_SOURCE_ECHO_REFERENCE)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800551 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800552 }
553
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700554 // Make sure identity represents the current caller
555 Identity adjIdentity = identity;
556 // TODO b/182392553: refactor or remove
557 bool updatePid = (identity.pid == -1);
558 const uid_t callingUid =IPCThreadState::self()->getCallingUid();
559 const uid_t currentUid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(identity.uid));
Andy Hung4ef19fa2018-05-15 19:35:29 -0700560 if (!isAudioServerOrMediaServerUid(callingUid)) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700561 ALOGW_IF(currentUid != (uid_t)-1 && currentUid != callingUid,
562 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid,
563 currentUid);
564 adjIdentity.uid = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_uid_t_int32_t(callingUid));
Eric Laurentb2379ba2016-05-23 17:42:12 -0700565 updatePid = true;
566 }
567
568 if (updatePid) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700569 const int32_t callingPid = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_pid_t_int32_t(
570 IPCThreadState::self()->getCallingPid()));
571 ALOGW_IF(identity.pid != -1 && identity.pid != callingPid,
Eric Laurentb2379ba2016-05-23 17:42:12 -0700572 "%s uid %d pid %d tried to pass itself off as pid %d",
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700573 __func__, adjIdentity.uid, callingPid, identity.pid);
574 adjIdentity.pid = callingPid;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700575 }
576
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700577 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attr.usage, adjIdentity)));
578
Eric Laurent58a0dd82019-10-24 12:42:17 -0700579 // check calling permissions.
Hayden Gomesb7429922020-12-11 13:59:18 -0800580 // Capturing from FM_TUNER source is controlled by captureTunerAudioInputAllowed() and
581 // captureAudioOutputAllowed() (deprecated) as this does not affect users privacy
582 // as does capturing from an actual microphone.
Eric Laurent45e16b92021-05-20 11:10:47 +0200583 if (!(recordingAllowed(adjIdentity, attr.source) || attr.source == AUDIO_SOURCE_FM_TUNER)) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700584 ALOGE("%s permission denied: recording not allowed for %s",
585 __func__, adjIdentity.toString().c_str());
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800586 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800587 }
588
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700589 bool canCaptureOutput = captureAudioOutputAllowed(adjIdentity);
Ricardo Correa57a37692020-03-23 17:27:25 -0700590 if ((inputSource == AUDIO_SOURCE_VOICE_UPLINK ||
591 inputSource == AUDIO_SOURCE_VOICE_DOWNLINK ||
592 inputSource == AUDIO_SOURCE_VOICE_CALL ||
Hayden Gomesb7429922020-12-11 13:59:18 -0800593 inputSource == AUDIO_SOURCE_ECHO_REFERENCE)
594 && !canCaptureOutput) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800595 return binderStatusFromStatusT(PERMISSION_DENIED);
Hayden Gomesb7429922020-12-11 13:59:18 -0800596 }
597
598 if (inputSource == AUDIO_SOURCE_FM_TUNER
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700599 && !captureTunerAudioInputAllowed(adjIdentity)
Hayden Gomesb7429922020-12-11 13:59:18 -0800600 && !canCaptureOutput) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800601 return binderStatusFromStatusT(PERMISSION_DENIED);
Nadav Bar744be482018-05-08 13:26:21 +0300602 }
603
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700604 bool canCaptureHotword = captureHotwordAllowed(adjIdentity);
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900605 if ((inputSource == AUDIO_SOURCE_HOTWORD) && !canCaptureHotword) {
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800606 return binderStatusFromStatusT(PERMISSION_DENIED);
607 }
608
609 if (((flags & AUDIO_INPUT_FLAG_HW_HOTWORD) != 0)
610 && !canCaptureHotword) {
611 ALOGE("%s: permission denied: hotword mode not allowed"
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700612 " for uid %d pid %d", __func__, adjIdentity.uid, adjIdentity.pid);
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800613 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7504b9e2017-08-15 18:17:26 -0700614 }
615
616 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700617 {
Eric Laurent7504b9e2017-08-15 18:17:26 -0700618 status_t status;
619 AudioPolicyInterface::input_type_t inputType;
620
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700621 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700622 {
623 AutoCallerClear acc;
624 // the audio_in_acoustics_t parameter is ignored by get_input()
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700625 status = mAudioPolicyManager->getInputForAttr(&attr, &input, riid, session,
626 adjIdentity, &config,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800627 flags, &selectedDeviceId,
628 &inputType, &portId);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700629
Eric Laurent10b71232018-04-13 18:14:44 -0700630 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700631 audioPolicyEffects = mAudioPolicyEffects;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800632
633 if (status == NO_ERROR) {
634 // enforce permission (if any) required for each type of input
635 switch (inputType) {
Kevin Rocard25f9b052019-02-27 15:08:54 -0800636 case AudioPolicyInterface::API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK:
637 // this use case has been validated in audio service with a MediaProjection token,
638 // and doesn't rely on regular permissions
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800639 case AudioPolicyInterface::API_INPUT_LEGACY:
640 break;
Eric Laurent82db2692015-08-07 13:59:42 -0700641 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX:
642 // FIXME: use the same permission as for remote submix for now.
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800643 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
Eric Laurent1ff16a72019-03-14 18:35:04 -0700644 if (!canCaptureOutput) {
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800645 ALOGE("getInputForAttr() permission denied: capture not allowed");
646 status = PERMISSION_DENIED;
647 }
648 break;
649 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE:
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700650 if (!modifyAudioRoutingAllowed(adjIdentity)) {
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800651 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed");
652 status = PERMISSION_DENIED;
653 }
654 break;
655 case AudioPolicyInterface::API_INPUT_INVALID:
656 default:
657 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d",
658 (int)inputType);
659 }
660 }
661
662 if (status != NO_ERROR) {
663 if (status == PERMISSION_DENIED) {
Eric Laurent10b71232018-04-13 18:14:44 -0700664 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800665 mAudioPolicyManager->releaseInput(portId);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800666 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800667 return binderStatusFromStatusT(status);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800668 }
Eric Laurentfee19762018-01-29 18:44:13 -0800669
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700670 sp<AudioRecordClient> client = new AudioRecordClient(attr, input, session, portId,
671 selectedDeviceId, adjIdentity,
Ricardo Correa57a37692020-03-23 17:27:25 -0700672 canCaptureOutput, canCaptureHotword);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800673 mAudioRecordClients.add(portId, client);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700674 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800675
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700676 if (audioPolicyEffects != 0) {
677 // create audio pre processors according to input source
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800678 status_t status = audioPolicyEffects->addInputEffects(input, inputSource, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700679 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800680 ALOGW("Failed to add effects on input %d", input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700681 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800682 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800683
684 _aidl_return->input = VALUE_OR_RETURN_BINDER_STATUS(
685 legacy2aidl_audio_io_handle_t_int32_t(input));
686 _aidl_return->selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
687 legacy2aidl_audio_port_handle_t_int32_t(selectedDeviceId));
688 _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
689 legacy2aidl_audio_port_handle_t_int32_t(portId));
690 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800691}
692
Eric Laurent99fcae42018-05-17 16:59:18 -0700693std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) {
jiabin19cdba52020-11-24 11:28:58 -0800694 struct audio_port_v7 port = {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700695 port.id = portId;
696 status_t status = mAudioPolicyManager->getAudioPort(&port);
697 if (status == NO_ERROR && port.type == AUDIO_PORT_TYPE_DEVICE) {
Andy Hung9b181952019-02-25 14:53:36 -0800698 return toString(port.ext.device.type);
Eric Laurent99fcae42018-05-17 16:59:18 -0700699 }
Andy Hung9b181952019-02-25 14:53:36 -0800700 return {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700701}
702
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800703Status AudioPolicyService::startInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800704{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800705 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
706 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
707
Eric Laurentdce54a12014-03-10 12:19:46 -0700708 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800709 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800710 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800711 sp<AudioRecordClient> client;
712 {
713 Mutex::Autolock _l(mLock);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800714
Eric Laurent7dca8a82018-01-29 18:44:26 -0800715 ssize_t index = mAudioRecordClients.indexOfKey(portId);
716 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800717 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800718 }
719 client = mAudioRecordClients.valueAt(index);
Eric Laurentfee19762018-01-29 18:44:13 -0800720 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800721
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700722 std::stringstream msg;
723 msg << "Audio recording on session " << client->session;
724
Eric Laurent7dca8a82018-01-29 18:44:26 -0800725 // check calling permissions
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700726 if (!(startRecording(client->identity, String16(msg.str().c_str()),
727 client->attributes.source)
Eric Laurent58a0dd82019-10-24 12:42:17 -0700728 || client->attributes.source == AUDIO_SOURCE_FM_TUNER)) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700729 ALOGE("%s permission denied: recording not allowed for identity %s",
730 __func__, client->identity.toString().c_str());
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800731 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800732 }
Eric Laurentfee19762018-01-29 18:44:13 -0800733
Eric Laurentdf628922018-12-06 21:45:51 +0000734 Mutex::Autolock _l(mLock);
Eric Laurent4eb58f12018-12-07 16:41:02 -0800735
736 client->active = true;
737 client->startTimeNs = systemTime();
738 updateUidStates_l();
Eric Laurentfee19762018-01-29 18:44:13 -0800739
Eric Laurent10b71232018-04-13 18:14:44 -0700740 status_t status;
741 {
742 AutoCallerClear acc;
Eric Laurent4eb58f12018-12-07 16:41:02 -0800743 status = mAudioPolicyManager->startInput(portId);
Ray Essick84e84a52018-05-03 18:45:07 -0700744
745 }
746
Ray Essickf6a57cd2018-05-22 16:20:54 -0700747 // including successes gets very verbose
Muhammad Qureshi087b37c2020-06-16 16:37:36 -0700748 // but once we cut over to statsd, log them all.
Ray Essickf6a57cd2018-05-22 16:20:54 -0700749 if (status != NO_ERROR) {
Ray Essick84e84a52018-05-03 18:45:07 -0700750
751 static constexpr char kAudioPolicy[] = "audiopolicy";
752
Ray Essick84e84a52018-05-03 18:45:07 -0700753 static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status";
754 static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src";
755 static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg";
756 static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session";
Eric Laurent99fcae42018-05-17 16:59:18 -0700757 static constexpr char kAudioPolicyRqstDevice[] =
758 "android.media.audiopolicy.rqst.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700759 static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src";
760 static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg";
Eric Laurent99fcae42018-05-17 16:59:18 -0700761 static constexpr char kAudioPolicyActiveSession[] =
762 "android.media.audiopolicy.active.session";
763 static constexpr char kAudioPolicyActiveDevice[] =
764 "android.media.audiopolicy.active.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700765
Ray Essickf27e9872019-12-07 06:28:46 -0800766 mediametrics::Item *item = mediametrics::Item::create(kAudioPolicy);
Ray Essick84e84a52018-05-03 18:45:07 -0700767 if (item != NULL) {
768
Ray Essick84e84a52018-05-03 18:45:07 -0700769 item->setInt32(kAudioPolicyStatus, status);
770
Eric Laurent99fcae42018-05-17 16:59:18 -0700771 item->setCString(kAudioPolicyRqstSrc,
Andy Hung9b181952019-02-25 14:53:36 -0800772 toString(client->attributes.source).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700773 item->setInt32(kAudioPolicyRqstSession, client->session);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700774 if (client->identity.packageName.has_value() &&
775 client->identity.packageName.value().size() != 0) {
Ray Essick51866952018-05-30 11:22:27 -0700776 item->setCString(kAudioPolicyRqstPkg,
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700777 client->identity.packageName.value().c_str());
Ray Essick51866952018-05-30 11:22:27 -0700778 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700779 item->setCString(kAudioPolicyRqstPkg,
780 std::to_string(client->identity.uid).c_str());
Ray Essick51866952018-05-30 11:22:27 -0700781 }
Eric Laurent99fcae42018-05-17 16:59:18 -0700782 item->setCString(
783 kAudioPolicyRqstDevice, getDeviceTypeStrForPortId(client->deviceId).c_str());
784
Eric Laurent4eb58f12018-12-07 16:41:02 -0800785 int count = mAudioRecordClients.size();
786 for (int i = 0; i < count ; i++) {
787 if (portId == mAudioRecordClients.keyAt(i)) {
788 continue;
789 }
790 sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
791 if (other->active) {
792 // keeps the last of the clients marked active
793 item->setCString(kAudioPolicyActiveSrc,
Andy Hung9b181952019-02-25 14:53:36 -0800794 toString(other->attributes.source).c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -0800795 item->setInt32(kAudioPolicyActiveSession, other->session);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700796 if (other->identity.packageName.has_value() &&
797 other->identity.packageName.value().size() != 0) {
Eric Laurent4eb58f12018-12-07 16:41:02 -0800798 item->setCString(kAudioPolicyActivePkg,
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700799 other->identity.packageName.value().c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -0800800 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700801 item->setCString(kAudioPolicyRqstPkg, std::to_string(
802 other->identity.uid).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700803 }
Eric Laurent4eb58f12018-12-07 16:41:02 -0800804 item->setCString(kAudioPolicyActiveDevice,
805 getDeviceTypeStrForPortId(other->deviceId).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700806 }
807 }
808 item->selfrecord();
809 delete item;
810 item = NULL;
811 }
Ray Essick6ce27e52019-02-15 10:58:05 -0800812 }
813
814 if (status != NO_ERROR) {
Eric Laurent4eb58f12018-12-07 16:41:02 -0800815 client->active = false;
816 client->startTimeNs = 0;
817 updateUidStates_l();
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700818 finishRecording(client->identity, client->attributes.source);
Eric Laurentfb66dd92016-01-28 18:32:03 -0800819 }
820
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800821 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800822}
823
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800824Status AudioPolicyService::stopInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800825{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800826 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
827 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
828
Eric Laurentdce54a12014-03-10 12:19:46 -0700829 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800830 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800831 }
Eric Laurent4eb58f12018-12-07 16:41:02 -0800832
Eric Laurent2d388ec2014-03-07 13:25:54 -0800833 Mutex::Autolock _l(mLock);
834
Eric Laurentfee19762018-01-29 18:44:13 -0800835 ssize_t index = mAudioRecordClients.indexOfKey(portId);
836 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800837 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurentfee19762018-01-29 18:44:13 -0800838 }
839 sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
840
Ray Essick84e84a52018-05-03 18:45:07 -0700841 client->active = false;
Eric Laurent4eb58f12018-12-07 16:41:02 -0800842 client->startTimeNs = 0;
843
844 updateUidStates_l();
Ray Essick84e84a52018-05-03 18:45:07 -0700845
Svet Ganov6e641372018-03-02 09:21:30 -0800846 // finish the recording app op
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700847 finishRecording(client->identity, client->attributes.source);
Eric Laurent10b71232018-04-13 18:14:44 -0700848 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800849 return binderStatusFromStatusT(mAudioPolicyManager->stopInput(portId));
Eric Laurent2d388ec2014-03-07 13:25:54 -0800850}
851
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800852Status AudioPolicyService::releaseInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800853{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800854 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
855 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
856
Eric Laurentdce54a12014-03-10 12:19:46 -0700857 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800858 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800859 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700860 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -0800861 sp<AudioRecordClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700862 {
863 Mutex::Autolock _l(mLock);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700864 audioPolicyEffects = mAudioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -0800865 ssize_t index = mAudioRecordClients.indexOfKey(portId);
866 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800867 return Status::ok();
Eric Laurentfee19762018-01-29 18:44:13 -0800868 }
869 client = mAudioRecordClients.valueAt(index);
Eric Laurent4eb58f12018-12-07 16:41:02 -0800870
871 if (client->active) {
872 ALOGW("%s releasing active client portId %d", __FUNCTION__, portId);
873 client->active = false;
874 client->startTimeNs = 0;
875 updateUidStates_l();
876 }
877
Eric Laurentfee19762018-01-29 18:44:13 -0800878 mAudioRecordClients.removeItem(portId);
879 }
880 if (client == 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800881 return Status::ok();
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700882 }
883 if (audioPolicyEffects != 0) {
884 // release audio processors from the input
Eric Laurentd7fe0862018-07-14 16:48:01 -0700885 status_t status = audioPolicyEffects->releaseInputEffects(client->io, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700886 if(status != NO_ERROR) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700887 ALOGW("Failed to release effects on input %d", client->io);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700888 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800889 }
Eric Laurentf10c7092016-12-06 17:09:56 -0800890 {
891 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700892 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700893 mAudioPolicyManager->releaseInput(portId);
Eric Laurentf10c7092016-12-06 17:09:56 -0800894 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800895 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800896}
897
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800898Status AudioPolicyService::initStreamVolume(media::AudioStreamType streamAidl,
899 int32_t indexMinAidl,
900 int32_t indexMaxAidl) {
901 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
902 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
903 int indexMin = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMinAidl));
904 int indexMax = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMaxAidl));
905
Eric Laurentdce54a12014-03-10 12:19:46 -0700906 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800907 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800908 }
909 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800910 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800911 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800912 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800913 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800914 }
915 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700916 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700917 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800918 return binderStatusFromStatusT(NO_ERROR);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800919}
920
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800921Status AudioPolicyService::setStreamVolumeIndex(media::AudioStreamType streamAidl,
922 int32_t deviceAidl, int32_t indexAidl) {
923 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
924 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
925 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
926 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
927 aidl2legacy_int32_t_audio_devices_t(deviceAidl));
928
Eric Laurentdce54a12014-03-10 12:19:46 -0700929 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800930 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800931 }
932 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800933 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800934 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800935 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800936 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800937 }
938 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700939 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800940 return binderStatusFromStatusT(mAudioPolicyManager->setStreamVolumeIndex(stream,
941 index,
942 device));
Eric Laurent2d388ec2014-03-07 13:25:54 -0800943}
944
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800945Status AudioPolicyService::getStreamVolumeIndex(media::AudioStreamType streamAidl,
946 int32_t deviceAidl, int32_t* _aidl_return) {
947 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
948 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
949 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
950 aidl2legacy_int32_t_audio_devices_t(deviceAidl));
951 int index;
952
Eric Laurentdce54a12014-03-10 12:19:46 -0700953 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800954 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800955 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800956 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800957 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800958 }
959 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700960 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800961 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
962 mAudioPolicyManager->getStreamVolumeIndex(stream, &index, device)));
963 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
964 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800965}
966
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800967Status AudioPolicyService::setVolumeIndexForAttributes(
968 const media::AudioAttributesInternal& attrAidl, int32_t deviceAidl, int32_t indexAidl) {
969 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
970 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
971 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
972 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
973 aidl2legacy_int32_t_audio_devices_t(deviceAidl));
974 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
975 AudioValidator::validateAudioAttributes(attributes, "169572641")));
976
François Gaffiecfe17322018-11-07 13:41:29 +0100977 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800978 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +0100979 }
980 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800981 return binderStatusFromStatusT(PERMISSION_DENIED);
François Gaffiecfe17322018-11-07 13:41:29 +0100982 }
983 Mutex::Autolock _l(mLock);
984 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800985 return binderStatusFromStatusT(
986 mAudioPolicyManager->setVolumeIndexForAttributes(attributes, index, device));
François Gaffiecfe17322018-11-07 13:41:29 +0100987}
988
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800989Status AudioPolicyService::getVolumeIndexForAttributes(
990 const media::AudioAttributesInternal& attrAidl, int32_t deviceAidl, int32_t* _aidl_return) {
991 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
992 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
993 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
994 aidl2legacy_int32_t_audio_devices_t(deviceAidl));
995 int index;
996 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
997 AudioValidator::validateAudioAttributes(attributes, "169572641")));
998
François Gaffiecfe17322018-11-07 13:41:29 +0100999 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001000 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001001 }
1002 Mutex::Autolock _l(mLock);
1003 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001004 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1005 mAudioPolicyManager->getVolumeIndexForAttributes(attributes, index, device)));
1006 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1007 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001008}
1009
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001010Status AudioPolicyService::getMinVolumeIndexForAttributes(
1011 const media::AudioAttributesInternal& attrAidl, int32_t* _aidl_return) {
1012 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1013 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
1014 int index;
1015 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1016 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1017
François Gaffiecfe17322018-11-07 13:41:29 +01001018 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001019 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001020 }
1021 Mutex::Autolock _l(mLock);
1022 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001023 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1024 mAudioPolicyManager->getMinVolumeIndexForAttributes(attributes, index)));
1025 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1026 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001027}
1028
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001029Status AudioPolicyService::getMaxVolumeIndexForAttributes(
1030 const media::AudioAttributesInternal& attrAidl, int32_t* _aidl_return) {
1031 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1032 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
1033 int index;
1034 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1035 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1036
François Gaffiecfe17322018-11-07 13:41:29 +01001037 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001038 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001039 }
1040 Mutex::Autolock _l(mLock);
1041 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001042 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1043 mAudioPolicyManager->getMaxVolumeIndexForAttributes(attributes, index)));
1044 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1045 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001046}
1047
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001048Status AudioPolicyService::getStrategyForStream(media::AudioStreamType streamAidl,
1049 int32_t* _aidl_return) {
1050 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1051 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1052
Eric Laurent223fd5c2014-11-11 13:43:36 -08001053 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001054 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1055 convertReinterpret<int32_t>(PRODUCT_STRATEGY_NONE));
1056 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001057 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001058 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001059 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001060 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001061
François Gaffiec005e562018-11-06 15:04:49 +01001062 // DO NOT LOCK, may be called from AudioFlinger with lock held, reaching deadlock
Eric Laurent10b71232018-04-13 18:14:44 -07001063 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001064 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1065 legacy2aidl_product_strategy_t_int32_t(
1066 mAudioPolicyManager->getStrategyForStream(stream)));
1067 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001068}
1069
1070//audio policy: use audio_device_t appropriately
1071
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001072Status AudioPolicyService::getDevicesForStream(media::AudioStreamType streamAidl,
1073 int32_t* _aidl_return) {
1074 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1075 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1076
Eric Laurent223fd5c2014-11-11 13:43:36 -08001077 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001078 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1079 legacy2aidl_audio_devices_t_int32_t(AUDIO_DEVICE_NONE));
1080 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001081 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001082 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001083 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001084 }
Haynes Mathew Georgedfb9f3b2015-10-26 18:22:13 -07001085 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001086 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001087 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1088 legacy2aidl_audio_devices_t_int32_t(mAudioPolicyManager->getDevicesForStream(stream)));
1089 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001090}
1091
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001092Status AudioPolicyService::getDevicesForAttributes(const media::AudioAttributesEx& attrAidl,
1093 std::vector<media::AudioDevice>* _aidl_return)
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001094{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001095 AudioAttributes aa = VALUE_OR_RETURN_BINDER_STATUS(
1096 aidl2legacy_AudioAttributesEx_AudioAttributes(attrAidl));
1097 AudioDeviceTypeAddrVector devices;
1098
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001099 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001100 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001101 }
1102 Mutex::Autolock _l(mLock);
1103 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001104 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1105 mAudioPolicyManager->getDevicesForAttributes(aa.getAttributes(), &devices)));
1106 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1107 convertContainer<std::vector<media::AudioDevice>>(devices,
1108 legacy2aidl_AudioDeviceTypeAddress));
1109 return Status::ok();
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001110}
1111
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001112Status AudioPolicyService::getOutputForEffect(const media::EffectDescriptor& descAidl,
1113 int32_t* _aidl_return) {
1114 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1115 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1116 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1117 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1118
Eric Laurentdce54a12014-03-10 12:19:46 -07001119 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001120 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001121 }
1122 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001123 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001124 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1125 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutputForEffect(&desc)));
1126 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001127}
1128
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001129Status AudioPolicyService::registerEffect(const media::EffectDescriptor& descAidl, int32_t ioAidl,
1130 int32_t strategyAidl, int32_t sessionAidl,
1131 int32_t idAidl) {
1132 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1133 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1134 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1135 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1136 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
1137 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
1138 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1139 aidl2legacy_int32_t_audio_session_t(sessionAidl));
1140 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
1141 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1142 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1143
Eric Laurentdce54a12014-03-10 12:19:46 -07001144 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001145 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001146 }
Eric Laurent6c796322019-04-09 14:13:17 -07001147 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001148 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001149 return binderStatusFromStatusT(
1150 mAudioPolicyManager->registerEffect(&desc, io, strategy, session, id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001151}
1152
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001153Status AudioPolicyService::unregisterEffect(int32_t idAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001154{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001155 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001156 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001157 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001158 }
Eric Laurent6c796322019-04-09 14:13:17 -07001159 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001160 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001161 return binderStatusFromStatusT(mAudioPolicyManager->unregisterEffect(id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001162}
1163
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001164Status AudioPolicyService::setEffectEnabled(int32_t idAidl, bool enabled)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001165{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001166 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001167 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001168 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001169 }
Eric Laurent6c796322019-04-09 14:13:17 -07001170 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001171 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001172 return binderStatusFromStatusT(mAudioPolicyManager->setEffectEnabled(id, enabled));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001173}
1174
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001175Status AudioPolicyService::moveEffectsToIo(const std::vector<int32_t>& idsAidl, int32_t ioAidl)
1176
Eric Laurent6c796322019-04-09 14:13:17 -07001177{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001178 const std::vector<int>& ids = VALUE_OR_RETURN_BINDER_STATUS(
1179 convertContainer<std::vector<int>>(idsAidl, convertReinterpret<int, int32_t>));
1180 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1181 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1182 if (ids.size() > MAX_ITEMS_PER_LIST) {
1183 return binderStatusFromStatusT(BAD_VALUE);
1184 }
1185
Eric Laurent6c796322019-04-09 14:13:17 -07001186 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001187 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6c796322019-04-09 14:13:17 -07001188 }
1189 Mutex::Autolock _l(mLock);
1190 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001191 return binderStatusFromStatusT(mAudioPolicyManager->moveEffectsToIo(ids, io));
Eric Laurent6c796322019-04-09 14:13:17 -07001192}
1193
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001194Status AudioPolicyService::isStreamActive(media::AudioStreamType streamAidl, int32_t inPastMsAidl,
1195 bool* _aidl_return) {
1196 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1197 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1198 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1199
Eric Laurent223fd5c2014-11-11 13:43:36 -08001200 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001201 *_aidl_return = false;
1202 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001203 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001204 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001205 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001206 }
1207 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001208 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001209 *_aidl_return = mAudioPolicyManager->isStreamActive(stream, inPastMs);
1210 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001211}
1212
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001213Status AudioPolicyService::isStreamActiveRemotely(media::AudioStreamType streamAidl,
1214 int32_t inPastMsAidl,
1215 bool* _aidl_return) {
1216 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1217 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1218 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1219
Eric Laurent223fd5c2014-11-11 13:43:36 -08001220 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001221 *_aidl_return = false;
1222 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001223 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001224 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001225 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001226 }
1227 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001228 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001229 *_aidl_return = mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
1230 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001231}
1232
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001233Status AudioPolicyService::isSourceActive(media::AudioSourceType sourceAidl, bool* _aidl_return) {
1234 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
1235 aidl2legacy_AudioSourceType_audio_source_t(sourceAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001236 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001237 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001238 }
1239 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001240 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001241 *_aidl_return = mAudioPolicyManager->isSourceActive(source);
1242 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001243}
1244
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001245status_t AudioPolicyService::getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001246{
Eric Laurentdce54a12014-03-10 12:19:46 -07001247 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -08001248 return NO_INIT;
1249 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001250 {
1251 Mutex::Autolock _l(mLock);
1252 audioPolicyEffects = mAudioPolicyEffects;
1253 }
1254 if (audioPolicyEffects == 0) {
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001255 return NO_INIT;
1256 }
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001257
1258 return OK;
1259}
1260
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001261Status AudioPolicyService::queryDefaultPreProcessing(
1262 int32_t audioSessionAidl,
1263 media::Int* countAidl,
1264 std::vector<media::EffectDescriptor>* _aidl_return) {
1265 audio_session_t audioSession = VALUE_OR_RETURN_BINDER_STATUS(
1266 aidl2legacy_int32_t_audio_session_t(audioSessionAidl));
1267 uint32_t count = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(countAidl->value));
1268 if (count > AudioEffect::kMaxPreProcessing) {
1269 count = AudioEffect::kMaxPreProcessing;
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001270 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001271 uint32_t countReq = count;
1272 std::unique_ptr<effect_descriptor_t[]> descriptors(new effect_descriptor_t[count]);
1273
1274 sp<AudioPolicyEffects> audioPolicyEffects;
1275 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
1276 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->queryDefaultInputEffects(
1277 (audio_session_t) audioSession, descriptors.get(), &count)));
1278 countReq = std::min(count, countReq);
1279 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1280 convertRange(descriptors.get(), descriptors.get() + countReq,
1281 std::back_inserter(*_aidl_return),
1282 legacy2aidl_effect_descriptor_t_EffectDescriptor)));
1283 countAidl->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(count));
1284 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001285}
1286
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001287Status AudioPolicyService::addSourceDefaultEffect(const media::AudioUuid& typeAidl,
1288 const std::string& opPackageNameAidl,
1289 const media::AudioUuid& uuidAidl,
1290 int32_t priority,
1291 media::AudioSourceType sourceAidl,
1292 int32_t* _aidl_return) {
1293 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1294 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1295 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1296 aidl2legacy_string_view_String16(opPackageNameAidl));
1297 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1298 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1299 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
1300 aidl2legacy_AudioSourceType_audio_source_t(sourceAidl));
1301 audio_unique_id_t id;
1302
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001303 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001304 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001305 if (!modifyDefaultAudioEffectsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001306 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001307 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001308 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addSourceDefaultEffect(
1309 &type, opPackageName, &uuid, priority, source, &id)));
1310 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1311 return Status::ok();
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001312}
1313
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001314Status AudioPolicyService::addStreamDefaultEffect(const media::AudioUuid& typeAidl,
1315 const std::string& opPackageNameAidl,
1316 const media::AudioUuid& uuidAidl,
1317 int32_t priority, media::AudioUsage usageAidl,
1318 int32_t* _aidl_return) {
1319 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1320 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1321 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1322 aidl2legacy_string_view_String16(opPackageNameAidl));
1323 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1324 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1325 audio_usage_t usage = VALUE_OR_RETURN_BINDER_STATUS(
1326 aidl2legacy_AudioUsage_audio_usage_t(usageAidl));
1327 audio_unique_id_t id;
1328
1329 sp<AudioPolicyEffects> audioPolicyEffects;
1330 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001331 if (!modifyDefaultAudioEffectsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001332 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001333 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001334 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addStreamDefaultEffect(
1335 &type, opPackageName, &uuid, priority, usage, &id)));
1336 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1337 return Status::ok();
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001338}
1339
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001340Status AudioPolicyService::removeSourceDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001341{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001342 audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1343 aidl2legacy_int32_t_audio_unique_id_t(idAidl));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001344 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001345 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001346 if (!modifyDefaultAudioEffectsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001347 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001348 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001349 return binderStatusFromStatusT(audioPolicyEffects->removeSourceDefaultEffect(id));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001350}
1351
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001352Status AudioPolicyService::removeStreamDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001353{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001354 audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1355 aidl2legacy_int32_t_audio_unique_id_t(idAidl));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001356 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001357 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001358 if (!modifyDefaultAudioEffectsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001359 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001360 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001361 return binderStatusFromStatusT(audioPolicyEffects->removeStreamDefaultEffect(id));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001362}
1363
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001364Status AudioPolicyService::setSupportedSystemUsages(
1365 const std::vector<media::AudioUsage>& systemUsagesAidl) {
1366 size_t size = systemUsagesAidl.size();
1367 if (size > MAX_ITEMS_PER_LIST) {
1368 size = MAX_ITEMS_PER_LIST;
1369 }
1370 std::vector<audio_usage_t> systemUsages;
1371 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1372 convertRange(systemUsagesAidl.begin(), systemUsagesAidl.begin() + size,
1373 std::back_inserter(systemUsages), aidl2legacy_AudioUsage_audio_usage_t)));
1374
Hayden Gomes524159d2019-12-23 14:41:47 -08001375 Mutex::Autolock _l(mLock);
1376 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001377 return binderStatusFromStatusT(PERMISSION_DENIED);
Hayden Gomes524159d2019-12-23 14:41:47 -08001378 }
1379
1380 bool areAllSystemUsages = std::all_of(begin(systemUsages), end(systemUsages),
1381 [](audio_usage_t usage) { return isSystemUsage(usage); });
1382 if (!areAllSystemUsages) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001383 return binderStatusFromStatusT(BAD_VALUE);
Hayden Gomes524159d2019-12-23 14:41:47 -08001384 }
1385
1386 mSupportedSystemUsages = systemUsages;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001387 return Status::ok();
Hayden Gomes524159d2019-12-23 14:41:47 -08001388}
1389
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001390Status AudioPolicyService::setAllowedCapturePolicy(int32_t uidAidl, int32_t capturePolicyAidl) {
1391 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1392 audio_flags_mask_t capturePolicy = VALUE_OR_RETURN_BINDER_STATUS(
1393 aidl2legacy_int32_t_audio_flags_mask_t_mask(capturePolicyAidl));
1394
Kevin Rocardb99cc752019-03-21 20:52:24 -07001395 Mutex::Autolock _l(mLock);
1396 if (mAudioPolicyManager == NULL) {
1397 ALOGV("%s() mAudioPolicyManager == NULL", __func__);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001398 return binderStatusFromStatusT(NO_INIT);
Kevin Rocardb99cc752019-03-21 20:52:24 -07001399 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001400 return binderStatusFromStatusT(
1401 mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy));
Kevin Rocardb99cc752019-03-21 20:52:24 -07001402}
1403
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001404Status AudioPolicyService::getOffloadSupport(const media::AudioOffloadInfo& infoAidl,
1405 media::AudioOffloadMode* _aidl_return) {
1406 audio_offload_info_t info = VALUE_OR_RETURN_BINDER_STATUS(
1407 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(infoAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001408 if (mAudioPolicyManager == NULL) {
1409 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001410 return binderStatusFromStatusT(AUDIO_OFFLOAD_NOT_SUPPORTED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001411 }
Andy Hung2ddee192015-12-18 17:34:44 -08001412 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001413 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001414 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_offload_mode_t_AudioOffloadMode(
1415 mAudioPolicyManager->getOffloadSupport(info)));
1416 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001417}
1418
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001419Status AudioPolicyService::isDirectOutputSupported(
1420 const media::AudioConfigBase& configAidl,
1421 const media::AudioAttributesInternal& attributesAidl,
1422 bool* _aidl_return) {
1423 audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
1424 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl));
1425 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1426 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attributesAidl));
1427 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1428 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1429
Michael Chana94fbb22018-04-24 14:31:19 +10001430 if (mAudioPolicyManager == NULL) {
1431 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001432 return binderStatusFromStatusT(NO_INIT);
Michael Chana94fbb22018-04-24 14:31:19 +10001433 }
Hayden Gomes524159d2019-12-23 14:41:47 -08001434
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001435 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attributes.usage)));
Hayden Gomes524159d2019-12-23 14:41:47 -08001436
Michael Chana94fbb22018-04-24 14:31:19 +10001437 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001438 *_aidl_return = mAudioPolicyManager->isDirectOutputSupported(config, attributes);
1439 return Status::ok();
Michael Chana94fbb22018-04-24 14:31:19 +10001440}
1441
1442
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001443Status AudioPolicyService::listAudioPorts(media::AudioPortRole roleAidl,
1444 media::AudioPortType typeAidl, media::Int* count,
1445 std::vector<media::AudioPort>* portsAidl,
1446 int32_t* _aidl_return) {
1447 audio_port_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
1448 aidl2legacy_AudioPortRole_audio_port_role_t(roleAidl));
1449 audio_port_type_t type = VALUE_OR_RETURN_BINDER_STATUS(
1450 aidl2legacy_AudioPortType_audio_port_type_t(typeAidl));
1451 unsigned int num_ports = VALUE_OR_RETURN_BINDER_STATUS(
1452 convertIntegral<unsigned int>(count->value));
1453 if (num_ports > MAX_ITEMS_PER_LIST) {
1454 num_ports = MAX_ITEMS_PER_LIST;
1455 }
1456 unsigned int numPortsReq = num_ports;
1457 std::unique_ptr<audio_port_v7[]> ports(new audio_port_v7[num_ports]);
1458 unsigned int generation;
1459
Eric Laurent6a94d692014-05-20 11:18:06 -07001460 Mutex::Autolock _l(mLock);
1461 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001462 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001463 }
Eric Laurent10b71232018-04-13 18:14:44 -07001464 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001465 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1466 mAudioPolicyManager->listAudioPorts(role, type, &num_ports, ports.get(), &generation)));
1467 numPortsReq = std::min(numPortsReq, num_ports);
1468 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1469 convertRange(ports.get(), ports.get() + numPortsReq, std::back_inserter(*portsAidl),
1470 legacy2aidl_audio_port_v7_AudioPort)));
1471 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_ports));
1472 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1473 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001474}
1475
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001476Status AudioPolicyService::getAudioPort(const media::AudioPort& portAidl,
1477 media::AudioPort* _aidl_return) {
1478 audio_port_v7 port = VALUE_OR_RETURN_BINDER_STATUS(
1479 aidl2legacy_AudioPort_audio_port_v7(portAidl));
1480 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPort(port)));
1481
Eric Laurent6a94d692014-05-20 11:18:06 -07001482 Mutex::Autolock _l(mLock);
1483 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001484 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001485 }
Eric Laurent10b71232018-04-13 18:14:44 -07001486 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001487 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(mAudioPolicyManager->getAudioPort(&port)));
1488 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_v7_AudioPort(port));
1489 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001490}
1491
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001492Status AudioPolicyService::createAudioPatch(const media::AudioPatch& patchAidl, int32_t handleAidl,
1493 int32_t* _aidl_return) {
1494 audio_patch patch = VALUE_OR_RETURN_BINDER_STATUS(
1495 aidl2legacy_AudioPatch_audio_patch(patchAidl));
1496 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1497 aidl2legacy_int32_t_audio_port_handle_t(handleAidl));
1498 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPatch(patch)));
1499
Eric Laurent6a94d692014-05-20 11:18:06 -07001500 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001501 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001502 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001503 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001504 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001505 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001506 }
Eric Laurent10b71232018-04-13 18:14:44 -07001507 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001508 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1509 mAudioPolicyManager->createAudioPatch(&patch, &handle,
1510 IPCThreadState::self()->getCallingUid())));
1511 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_patch_handle_t_int32_t(handle));
1512 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001513}
1514
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001515Status AudioPolicyService::releaseAudioPatch(int32_t handleAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001516{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001517 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1518 aidl2legacy_int32_t_audio_patch_handle_t(handleAidl));
Eric Laurent6a94d692014-05-20 11:18:06 -07001519 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001520 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001521 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001522 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001523 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001524 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001525 }
Eric Laurent10b71232018-04-13 18:14:44 -07001526 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001527 return binderStatusFromStatusT(
1528 mAudioPolicyManager->releaseAudioPatch(handle,
1529 IPCThreadState::self()->getCallingUid()));
Eric Laurent203b1a12014-04-01 10:34:16 -07001530}
1531
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001532Status AudioPolicyService::listAudioPatches(media::Int* count,
1533 std::vector<media::AudioPatch>* patchesAidl,
1534 int32_t* _aidl_return) {
1535 unsigned int num_patches = VALUE_OR_RETURN_BINDER_STATUS(
1536 convertIntegral<unsigned int>(count->value));
1537 if (num_patches > MAX_ITEMS_PER_LIST) {
1538 num_patches = MAX_ITEMS_PER_LIST;
1539 }
1540 unsigned int numPatchesReq = num_patches;
1541 std::unique_ptr<audio_patch[]> patches(new audio_patch[num_patches]);
1542 unsigned int generation;
1543
Eric Laurent6a94d692014-05-20 11:18:06 -07001544 Mutex::Autolock _l(mLock);
1545 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001546 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001547 }
Eric Laurent10b71232018-04-13 18:14:44 -07001548 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001549 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1550 mAudioPolicyManager->listAudioPatches(&num_patches, patches.get(), &generation)));
1551 numPatchesReq = std::min(numPatchesReq, num_patches);
1552 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1553 convertRange(patches.get(), patches.get() + numPatchesReq,
1554 std::back_inserter(*patchesAidl), legacy2aidl_audio_patch_AudioPatch)));
1555 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_patches));
1556 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1557 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001558}
1559
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001560Status AudioPolicyService::setAudioPortConfig(const media::AudioPortConfig& configAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001561{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001562 audio_port_config config = VALUE_OR_RETURN_BINDER_STATUS(
1563 aidl2legacy_AudioPortConfig_audio_port_config(configAidl));
1564 RETURN_IF_BINDER_ERROR(
1565 binderStatusFromStatusT(AudioValidator::validateAudioPortConfig(config)));
1566
Eric Laurent6a94d692014-05-20 11:18:06 -07001567 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001568 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001569 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001570 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001571 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001572 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001573 }
Eric Laurent10b71232018-04-13 18:14:44 -07001574 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001575 return binderStatusFromStatusT(mAudioPolicyManager->setAudioPortConfig(&config));
Eric Laurent203b1a12014-04-01 10:34:16 -07001576}
Eric Laurent2d388ec2014-03-07 13:25:54 -08001577
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001578Status AudioPolicyService::acquireSoundTriggerSession(media::SoundTriggerSession* _aidl_return)
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001579{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001580 audio_session_t session;
1581 audio_io_handle_t ioHandle;
1582 audio_devices_t device;
1583
1584 {
1585 Mutex::Autolock _l(mLock);
1586 if (mAudioPolicyManager == NULL) {
1587 return binderStatusFromStatusT(NO_INIT);
1588 }
1589 AutoCallerClear acc;
1590 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1591 mAudioPolicyManager->acquireSoundTriggerSession(&session, &ioHandle, &device)));
1592 }
1593
1594 _aidl_return->session = VALUE_OR_RETURN_BINDER_STATUS(
1595 legacy2aidl_audio_session_t_int32_t(session));
1596 _aidl_return->ioHandle = VALUE_OR_RETURN_BINDER_STATUS(
1597 legacy2aidl_audio_io_handle_t_int32_t(ioHandle));
1598 _aidl_return->device = VALUE_OR_RETURN_BINDER_STATUS(
1599 legacy2aidl_audio_devices_t_int32_t(device));
1600 return Status::ok();
1601}
1602
1603Status AudioPolicyService::releaseSoundTriggerSession(int32_t sessionAidl)
1604{
1605 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1606 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Andy Hungf759b8c2017-08-15 12:48:54 -07001607 Mutex::Autolock _l(mLock);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001608 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001609 return binderStatusFromStatusT(NO_INIT);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001610 }
Eric Laurent10b71232018-04-13 18:14:44 -07001611 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001612 return binderStatusFromStatusT(mAudioPolicyManager->releaseSoundTriggerSession(session));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001613}
1614
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001615Status AudioPolicyService::registerPolicyMixes(const std::vector<media::AudioMix>& mixesAidl,
1616 bool registration) {
1617 size_t size = mixesAidl.size();
1618 if (size > MAX_MIXES_PER_POLICY) {
1619 size = MAX_MIXES_PER_POLICY;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001620 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001621 Vector<AudioMix> mixes;
1622 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1623 convertRange(mixesAidl.begin(), mixesAidl.begin() + size, std::back_inserter(mixes),
1624 aidl2legacy_AudioMix)));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001625
Eric Laurentbaac1832014-12-01 17:52:59 -08001626 Mutex::Autolock _l(mLock);
Kevin Rocardbe201852019-02-20 22:33:28 -08001627
1628 // loopback|render only need a MediaProjection (checked in caller AudioService.java)
1629 bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1630 return !is_mix_loopback_render(mix.mRouteFlags); });
1631 if (needModifyAudioRouting && !modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001632 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurentbaac1832014-12-01 17:52:59 -08001633 }
Kevin Rocardbe201852019-02-20 22:33:28 -08001634
Nadav Bar287d3302020-02-05 14:55:38 +02001635 // If one of the mixes has needCaptureVoiceCommunicationOutput set to true, then we
1636 // need to verify that the caller still has CAPTURE_VOICE_COMMUNICATION_OUTPUT
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001637 bool needCaptureVoiceCommunicationOutput =
1638 std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Nadav Bar287d3302020-02-05 14:55:38 +02001639 return mix.mVoiceCommunicationCaptureAllowed; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001640
Kevin Rocard36b17552019-03-07 18:48:07 -08001641 bool needCaptureMediaOutput = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Eric Laurent5f9a6452020-12-22 20:10:10 +01001642 return mix.mAllowPrivilegedMediaPlaybackCapture; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001643
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001644 const Identity identity = getCallingIdentity();
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001645
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001646
1647 if (needCaptureMediaOutput && !captureMediaOutputAllowed(identity)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001648 return binderStatusFromStatusT(PERMISSION_DENIED);
Kevin Rocard36b17552019-03-07 18:48:07 -08001649 }
1650
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001651 if (needCaptureVoiceCommunicationOutput &&
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001652 !captureVoiceCommunicationOutputAllowed(identity)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001653 return binderStatusFromStatusT(PERMISSION_DENIED);
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001654 }
1655
Eric Laurentbaac1832014-12-01 17:52:59 -08001656 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001657 return binderStatusFromStatusT(NO_INIT);
Eric Laurentbaac1832014-12-01 17:52:59 -08001658 }
Eric Laurent10b71232018-04-13 18:14:44 -07001659 AutoCallerClear acc;
Eric Laurentbaac1832014-12-01 17:52:59 -08001660 if (registration) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001661 return binderStatusFromStatusT(mAudioPolicyManager->registerPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08001662 } else {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001663 return binderStatusFromStatusT(mAudioPolicyManager->unregisterPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08001664 }
1665}
1666
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001667Status AudioPolicyService::setUidDeviceAffinities(
1668 int32_t uidAidl,
1669 const std::vector<media::AudioDevice>& devicesAidl) {
1670 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1671 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
1672 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
1673 aidl2legacy_AudioDeviceTypeAddress));
1674
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001675 Mutex::Autolock _l(mLock);
1676 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001677 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001678 }
1679 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001680 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001681 }
1682 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001683 return binderStatusFromStatusT(mAudioPolicyManager->setUidDeviceAffinities(uid, devices));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001684}
1685
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001686Status AudioPolicyService::removeUidDeviceAffinities(int32_t uidAidl) {
1687 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1688
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001689 Mutex::Autolock _l(mLock);
1690 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001691 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001692 }
1693 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001694 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001695 }
1696 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001697 return binderStatusFromStatusT(mAudioPolicyManager->removeUidDeviceAffinities(uid));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001698}
1699
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001700Status AudioPolicyService::setUserIdDeviceAffinities(
1701 int32_t userIdAidl,
1702 const std::vector<media::AudioDevice>& devicesAidl) {
1703 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
1704 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
1705 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
1706 aidl2legacy_AudioDeviceTypeAddress));
1707
Oscar Azucena90e77632019-11-27 17:12:28 -08001708 Mutex::Autolock _l(mLock);
1709 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001710 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08001711 }
1712 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001713 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08001714 }
1715 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001716 return binderStatusFromStatusT(mAudioPolicyManager->setUserIdDeviceAffinities(userId, devices));
Oscar Azucena90e77632019-11-27 17:12:28 -08001717}
1718
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001719Status AudioPolicyService::removeUserIdDeviceAffinities(int32_t userIdAidl) {
1720 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
1721
Oscar Azucena90e77632019-11-27 17:12:28 -08001722 Mutex::Autolock _l(mLock);
1723 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001724 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08001725 }
1726 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001727 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08001728 }
1729 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001730 return binderStatusFromStatusT(mAudioPolicyManager->removeUserIdDeviceAffinities(userId));
Oscar Azucena90e77632019-11-27 17:12:28 -08001731}
1732
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001733Status AudioPolicyService::startAudioSource(const media::AudioPortConfig& sourceAidl,
1734 const media::AudioAttributesInternal& attributesAidl,
1735 int32_t* _aidl_return) {
1736 audio_port_config source = VALUE_OR_RETURN_BINDER_STATUS(
1737 aidl2legacy_AudioPortConfig_audio_port_config(sourceAidl));
1738 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1739 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attributesAidl));
1740 audio_port_handle_t portId;
1741 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1742 AudioValidator::validateAudioPortConfig(source)));
1743 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1744 AudioValidator::validateAudioAttributes(attributes, "68953950")));
1745
Eric Laurent554a2772015-04-10 11:29:24 -07001746 Mutex::Autolock _l(mLock);
1747 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001748 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07001749 }
Hayden Gomes524159d2019-12-23 14:41:47 -08001750
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001751 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attributes.usage)));
Hayden Gomes524159d2019-12-23 14:41:47 -08001752
Hongwei Wang5cd1f1d2019-03-26 15:21:11 -07001753 // startAudioSource should be created as the calling uid
1754 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Eric Laurent10b71232018-04-13 18:14:44 -07001755 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001756 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1757 mAudioPolicyManager->startAudioSource(&source, &attributes, &portId, callingUid)));
1758 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
1759 return Status::ok();
Eric Laurent554a2772015-04-10 11:29:24 -07001760}
1761
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001762Status AudioPolicyService::stopAudioSource(int32_t portIdAidl)
Eric Laurent554a2772015-04-10 11:29:24 -07001763{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001764 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
1765 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1766
Eric Laurent554a2772015-04-10 11:29:24 -07001767 Mutex::Autolock _l(mLock);
1768 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001769 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07001770 }
Eric Laurent10b71232018-04-13 18:14:44 -07001771 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001772 return binderStatusFromStatusT(mAudioPolicyManager->stopAudioSource(portId));
Eric Laurent554a2772015-04-10 11:29:24 -07001773}
1774
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001775Status AudioPolicyService::setMasterMono(bool mono)
Andy Hung2ddee192015-12-18 17:34:44 -08001776{
1777 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001778 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08001779 }
1780 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001781 return binderStatusFromStatusT(PERMISSION_DENIED);
Andy Hung2ddee192015-12-18 17:34:44 -08001782 }
1783 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001784 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001785 return binderStatusFromStatusT(mAudioPolicyManager->setMasterMono(mono));
Andy Hung2ddee192015-12-18 17:34:44 -08001786}
1787
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001788Status AudioPolicyService::getMasterMono(bool* _aidl_return)
Andy Hung2ddee192015-12-18 17:34:44 -08001789{
1790 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001791 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08001792 }
1793 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001794 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001795 return binderStatusFromStatusT(mAudioPolicyManager->getMasterMono(_aidl_return));
Andy Hung2ddee192015-12-18 17:34:44 -08001796}
1797
Eric Laurentac9cef52017-06-09 15:46:26 -07001798
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001799Status AudioPolicyService::getStreamVolumeDB(media::AudioStreamType streamAidl, int32_t indexAidl,
1800 int32_t deviceAidl, float* _aidl_return) {
1801 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1802 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1803 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1804 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
1805 aidl2legacy_int32_t_audio_devices_t(deviceAidl));
1806
Eric Laurentac9cef52017-06-09 15:46:26 -07001807 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001808 return binderStatusFromStatusT(NO_INIT);
Eric Laurentac9cef52017-06-09 15:46:26 -07001809 }
1810 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001811 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001812 *_aidl_return = mAudioPolicyManager->getStreamVolumeDB(stream, index, device);
1813 return Status::ok();
Eric Laurentac9cef52017-06-09 15:46:26 -07001814}
1815
Kriti Dang6537def2021-03-02 13:46:59 +01001816Status AudioPolicyService::getSurroundFormats(media::Int* count,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001817 std::vector<media::audio::common::AudioFormat>* formats,
Kriti Dang877b27e2021-02-02 12:10:40 +01001818 std::vector<bool>* formatsEnabled) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001819 unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
1820 convertIntegral<unsigned int>(count->value));
1821 if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
1822 numSurroundFormats = MAX_ITEMS_PER_LIST;
1823 }
1824 unsigned int numSurroundFormatsReq = numSurroundFormats;
1825 std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
Kriti Dang877b27e2021-02-02 12:10:40 +01001826 std::unique_ptr<bool[]>surroundFormatsEnabled(new bool[numSurroundFormats]);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001827
jiabin81772902018-04-02 17:52:27 -07001828 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001829 return binderStatusFromStatusT(NO_INIT);
jiabin81772902018-04-02 17:52:27 -07001830 }
1831 Mutex::Autolock _l(mLock);
1832 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001833 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1834 mAudioPolicyManager->getSurroundFormats(&numSurroundFormats, surroundFormats.get(),
Kriti Dang6537def2021-03-02 13:46:59 +01001835 surroundFormatsEnabled.get())));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001836 numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
1837 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1838 convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
1839 std::back_inserter(*formats), legacy2aidl_audio_format_t_AudioFormat)));
Kriti Dang877b27e2021-02-02 12:10:40 +01001840 formatsEnabled->insert(
1841 formatsEnabled->begin(),
1842 surroundFormatsEnabled.get(),
1843 surroundFormatsEnabled.get() + numSurroundFormatsReq);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001844 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
1845 return Status::ok();
jiabin81772902018-04-02 17:52:27 -07001846}
1847
Kriti Dang6537def2021-03-02 13:46:59 +01001848Status AudioPolicyService::getReportedSurroundFormats(
1849 media::Int* count, std::vector<media::audio::common::AudioFormat>* formats) {
1850 unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
1851 convertIntegral<unsigned int>(count->value));
1852 if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
1853 numSurroundFormats = MAX_ITEMS_PER_LIST;
1854 }
1855 unsigned int numSurroundFormatsReq = numSurroundFormats;
1856 std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
1857
1858 if (mAudioPolicyManager == NULL) {
1859 return binderStatusFromStatusT(NO_INIT);
1860 }
1861 Mutex::Autolock _l(mLock);
1862 AutoCallerClear acc;
1863 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1864 mAudioPolicyManager->getReportedSurroundFormats(
1865 &numSurroundFormats, surroundFormats.get())));
1866 numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
1867 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1868 convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
1869 std::back_inserter(*formats), legacy2aidl_audio_format_t_AudioFormat)));
1870 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
1871 return Status::ok();
1872}
1873
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001874Status AudioPolicyService::getHwOffloadEncodingFormatsSupportedForA2DP(
1875 std::vector<media::audio::common::AudioFormat>* _aidl_return) {
1876 std::vector<audio_format_t> formats;
1877
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001878 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001879 return binderStatusFromStatusT(NO_INIT);
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001880 }
1881 Mutex::Autolock _l(mLock);
1882 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001883 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1884 mAudioPolicyManager->getHwOffloadEncodingFormatsSupportedForA2DP(&formats)));
1885 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1886 convertContainer<std::vector<media::audio::common::AudioFormat>>(
1887 formats,
1888 legacy2aidl_audio_format_t_AudioFormat));
1889 return Status::ok();
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001890}
1891
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001892Status AudioPolicyService::setSurroundFormatEnabled(
1893 media::audio::common::AudioFormat audioFormatAidl, bool enabled) {
1894 audio_format_t audioFormat = VALUE_OR_RETURN_BINDER_STATUS(
1895 aidl2legacy_AudioFormat_audio_format_t(audioFormatAidl));
jiabin81772902018-04-02 17:52:27 -07001896 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001897 return binderStatusFromStatusT(NO_INIT);
jiabin81772902018-04-02 17:52:27 -07001898 }
1899 Mutex::Autolock _l(mLock);
1900 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001901 return binderStatusFromStatusT(
1902 mAudioPolicyManager->setSurroundFormatEnabled(audioFormat, enabled));
jiabin81772902018-04-02 17:52:27 -07001903}
Eric Laurentac9cef52017-06-09 15:46:26 -07001904
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001905Status AudioPolicyService::setAssistantUid(int32_t uidAidl)
Eric Laurentb78763e2018-10-17 10:08:02 -07001906{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001907 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Eric Laurentb78763e2018-10-17 10:08:02 -07001908 Mutex::Autolock _l(mLock);
1909 mUidPolicy->setAssistantUid(uid);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001910 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07001911}
1912
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001913Status AudioPolicyService::setA11yServicesUids(const std::vector<int32_t>& uidsAidl)
Eric Laurentb78763e2018-10-17 10:08:02 -07001914{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001915 size_t size = uidsAidl.size();
1916 if (size > MAX_ITEMS_PER_LIST) {
1917 size = MAX_ITEMS_PER_LIST;
1918 }
1919 std::vector<uid_t> uids;
1920 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1921 convertRange(uidsAidl.begin(),
1922 uidsAidl.begin() + size,
1923 std::back_inserter(uids),
1924 aidl2legacy_int32_t_uid_t)));
Eric Laurentb78763e2018-10-17 10:08:02 -07001925 Mutex::Autolock _l(mLock);
1926 mUidPolicy->setA11yUids(uids);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001927 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07001928}
1929
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001930Status AudioPolicyService::setCurrentImeUid(int32_t uidAidl)
Kohsuke Yatoha623a132020-03-24 20:10:26 -07001931{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001932 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Kohsuke Yatoha623a132020-03-24 20:10:26 -07001933 Mutex::Autolock _l(mLock);
1934 mUidPolicy->setCurrentImeUid(uid);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001935 return Status::ok();
Kohsuke Yatoha623a132020-03-24 20:10:26 -07001936}
1937
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001938Status AudioPolicyService::isHapticPlaybackSupported(bool* _aidl_return)
jiabin6012f912018-11-02 17:06:30 -07001939{
1940 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001941 return binderStatusFromStatusT(NO_INIT);
jiabin6012f912018-11-02 17:06:30 -07001942 }
1943 Mutex::Autolock _l(mLock);
1944 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001945 *_aidl_return = mAudioPolicyManager->isHapticPlaybackSupported();
1946 return Status::ok();
jiabin6012f912018-11-02 17:06:30 -07001947}
1948
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001949Status AudioPolicyService::listAudioProductStrategies(
1950 std::vector<media::AudioProductStrategy>* _aidl_return) {
1951 AudioProductStrategyVector strategies;
1952
François Gaffied0ba9ed2018-11-05 11:50:42 +01001953 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001954 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01001955 }
1956 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001957 RETURN_IF_BINDER_ERROR(
1958 binderStatusFromStatusT(mAudioPolicyManager->listAudioProductStrategies(strategies)));
1959 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1960 convertContainer<std::vector<media::AudioProductStrategy>>(
1961 strategies,
1962 legacy2aidl_AudioProductStrategy));
1963 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01001964}
1965
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001966Status AudioPolicyService::getProductStrategyFromAudioAttributes(
Francois Gaffie11b65922020-09-24 16:59:08 +02001967 const media::AudioAttributesEx& aaAidl, bool fallbackOnDefault, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001968 AudioAttributes aa = VALUE_OR_RETURN_BINDER_STATUS(
1969 aidl2legacy_AudioAttributesEx_AudioAttributes(aaAidl));
1970 product_strategy_t productStrategy;
1971
François Gaffied0ba9ed2018-11-05 11:50:42 +01001972 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001973 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01001974 }
1975 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001976 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02001977 mAudioPolicyManager->getProductStrategyFromAudioAttributes(
1978 aa, productStrategy, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001979 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1980 legacy2aidl_product_strategy_t_int32_t(productStrategy));
1981 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01001982}
1983
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001984Status AudioPolicyService::listAudioVolumeGroups(std::vector<media::AudioVolumeGroup>* _aidl_return)
François Gaffie4b2018b2018-11-07 11:18:59 +01001985{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001986 AudioVolumeGroupVector groups;
François Gaffie4b2018b2018-11-07 11:18:59 +01001987 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001988 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01001989 }
1990 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001991 RETURN_IF_BINDER_ERROR(
1992 binderStatusFromStatusT(mAudioPolicyManager->listAudioVolumeGroups(groups)));
1993 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1994 convertContainer<std::vector<media::AudioVolumeGroup>>(groups,
1995 legacy2aidl_AudioVolumeGroup));
1996 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01001997}
1998
Francois Gaffie11b65922020-09-24 16:59:08 +02001999Status AudioPolicyService::getVolumeGroupFromAudioAttributes(
2000 const media::AudioAttributesEx& aaAidl, bool fallbackOnDefault, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002001 AudioAttributes aa = VALUE_OR_RETURN_BINDER_STATUS(
2002 aidl2legacy_AudioAttributesEx_AudioAttributes(aaAidl));
2003 volume_group_t volumeGroup;
2004
François Gaffie4b2018b2018-11-07 11:18:59 +01002005 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002006 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01002007 }
2008 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002009 RETURN_IF_BINDER_ERROR(
2010 binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02002011 mAudioPolicyManager->getVolumeGroupFromAudioAttributes(
2012 aa, volumeGroup, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002013 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_volume_group_t_int32_t(volumeGroup));
2014 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01002015}
Eric Laurent6ede98f2019-06-11 14:50:30 -07002016
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002017Status AudioPolicyService::setRttEnabled(bool enabled)
Eric Laurent6ede98f2019-06-11 14:50:30 -07002018{
2019 Mutex::Autolock _l(mLock);
2020 mUidPolicy->setRttEnabled(enabled);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002021 return Status::ok();
Eric Laurent6ede98f2019-06-11 14:50:30 -07002022}
2023
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002024Status AudioPolicyService::isCallScreenModeSupported(bool* _aidl_return)
Eric Laurent8340e672019-11-06 11:01:08 -08002025{
2026 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002027 return binderStatusFromStatusT(NO_INIT);
Eric Laurent8340e672019-11-06 11:01:08 -08002028 }
2029 Mutex::Autolock _l(mLock);
2030 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002031 *_aidl_return = mAudioPolicyManager->isCallScreenModeSupported();
2032 return Status::ok();
Eric Laurent8340e672019-11-06 11:01:08 -08002033}
2034
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002035Status AudioPolicyService::setDevicesRoleForStrategy(
2036 int32_t strategyAidl,
2037 media::DeviceRole roleAidl,
2038 const std::vector<media::AudioDevice>& devicesAidl) {
2039 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2040 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2041 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2042 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2043 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2044 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2045 aidl2legacy_AudioDeviceTypeAddress));
2046
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002047 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002048 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002049 }
2050 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002051 return binderStatusFromStatusT(
2052 mAudioPolicyManager->setDevicesRoleForStrategy(strategy, role, devices));
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002053}
2054
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002055Status AudioPolicyService::removeDevicesRoleForStrategy(int32_t strategyAidl,
2056 media::DeviceRole roleAidl) {
2057 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2058 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2059 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2060 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2061 if (mAudioPolicyManager == NULL) {
2062 return binderStatusFromStatusT(NO_INIT);
2063 }
2064 Mutex::Autolock _l(mLock);
2065 return binderStatusFromStatusT(
2066 mAudioPolicyManager->removeDevicesRoleForStrategy(strategy, role));
2067}
2068
2069Status AudioPolicyService::getDevicesForRoleAndStrategy(
2070 int32_t strategyAidl,
2071 media::DeviceRole roleAidl,
2072 std::vector<media::AudioDevice>* _aidl_return) {
2073 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2074 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2075 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2076 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2077 AudioDeviceTypeAddrVector devices;
2078
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002079 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002080 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002081 }
2082 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002083 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2084 mAudioPolicyManager->getDevicesForRoleAndStrategy(strategy, role, devices)));
2085 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2086 convertContainer<std::vector<media::AudioDevice>>(devices,
2087 legacy2aidl_AudioDeviceTypeAddress));
2088 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002089}
2090
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002091Status AudioPolicyService::registerSoundTriggerCaptureStateListener(
2092 const sp<media::ICaptureStateListener>& listener, bool* _aidl_return) {
2093 *_aidl_return = mCaptureStateNotifier.RegisterListener(listener);
2094 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002095}
2096
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002097Status AudioPolicyService::setDevicesRoleForCapturePreset(
2098 media::AudioSourceType audioSourceAidl,
2099 media::DeviceRole roleAidl,
2100 const std::vector<media::AudioDevice>& devicesAidl) {
2101 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2102 aidl2legacy_AudioSourceType_audio_source_t(audioSourceAidl));
2103 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2104 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2105 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2106 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2107 aidl2legacy_AudioDeviceTypeAddress));
Ytai Ben-Tsvi85093d52020-03-26 09:41:15 -07002108
Jiabin Huang3b98d322020-09-03 17:54:16 +00002109 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002110 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002111 }
2112 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002113 return binderStatusFromStatusT(
2114 mAudioPolicyManager->setDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002115}
2116
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002117Status AudioPolicyService::addDevicesRoleForCapturePreset(
2118 media::AudioSourceType audioSourceAidl,
2119 media::DeviceRole roleAidl,
2120 const std::vector<media::AudioDevice>& devicesAidl) {
2121 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2122 aidl2legacy_AudioSourceType_audio_source_t(audioSourceAidl));
2123 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2124 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2125 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2126 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2127 aidl2legacy_AudioDeviceTypeAddress));
2128
Jiabin Huang3b98d322020-09-03 17:54:16 +00002129 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002130 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002131 }
2132 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002133 return binderStatusFromStatusT(
2134 mAudioPolicyManager->addDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002135}
2136
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002137Status AudioPolicyService::removeDevicesRoleForCapturePreset(
2138 media::AudioSourceType audioSourceAidl,
2139 media::DeviceRole roleAidl,
2140 const std::vector<media::AudioDevice>& devicesAidl) {
2141 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2142 aidl2legacy_AudioSourceType_audio_source_t(audioSourceAidl));
2143 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2144 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2145 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2146 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2147 aidl2legacy_AudioDeviceTypeAddress));
2148
2149 if (mAudioPolicyManager == nullptr) {
2150 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002151 }
2152 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002153 return binderStatusFromStatusT(
2154 mAudioPolicyManager->removeDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002155}
2156
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002157Status AudioPolicyService::clearDevicesRoleForCapturePreset(media::AudioSourceType audioSourceAidl,
2158 media::DeviceRole roleAidl) {
2159 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2160 aidl2legacy_AudioSourceType_audio_source_t(audioSourceAidl));
2161 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2162 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2163
Jiabin Huang3b98d322020-09-03 17:54:16 +00002164 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002165 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002166 }
2167 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002168 return binderStatusFromStatusT(
2169 mAudioPolicyManager->clearDevicesRoleForCapturePreset(audioSource, role));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002170}
2171
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002172Status AudioPolicyService::getDevicesForRoleAndCapturePreset(
2173 media::AudioSourceType audioSourceAidl,
2174 media::DeviceRole roleAidl,
2175 std::vector<media::AudioDevice>* _aidl_return) {
2176 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2177 aidl2legacy_AudioSourceType_audio_source_t(audioSourceAidl));
2178 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2179 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2180 AudioDeviceTypeAddrVector devices;
2181
Jiabin Huang3b98d322020-09-03 17:54:16 +00002182 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002183 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002184 }
2185 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002186 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2187 mAudioPolicyManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices)));
2188 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2189 convertContainer<std::vector<media::AudioDevice>>(devices,
2190 legacy2aidl_AudioDeviceTypeAddress));
2191 return Status::ok();
Jiabin Huang3b98d322020-09-03 17:54:16 +00002192}
2193
Mikhail Naganov1b2a7942017-12-08 10:18:09 -08002194} // namespace android