blob: bf8f2eec6c9f0908acec193a4abdcdc033c731ed [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;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800200 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800201}
202
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800203Status AudioPolicyService::getPhoneState(media::AudioMode* _aidl_return) {
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700204 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800205 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_mode_t_AudioMode(mPhoneState));
206 return Status::ok();
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700207}
208
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800209Status AudioPolicyService::setForceUse(media::AudioPolicyForceUse usageAidl,
210 media::AudioPolicyForcedConfig configAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800211{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800212 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
213 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
214 audio_policy_forced_cfg_t config = VALUE_OR_RETURN_BINDER_STATUS(
215 aidl2legacy_AudioPolicyForcedConfig_audio_policy_forced_cfg_t(configAidl));
216
Eric Laurentdce54a12014-03-10 12:19:46 -0700217 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800218 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800219 }
Eric Laurente17378d2018-05-09 14:43:01 -0700220
221 if (!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800222 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800223 }
Eric Laurente17378d2018-05-09 14:43:01 -0700224
Eric Laurent2d388ec2014-03-07 13:25:54 -0800225 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800226 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800227 }
228 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800229 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800230 }
231 ALOGV("setForceUse()");
232 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700233 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700234 mAudioPolicyManager->setForceUse(usage, config);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800235 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800236}
237
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800238Status AudioPolicyService::getForceUse(media::AudioPolicyForceUse usageAidl,
239 media::AudioPolicyForcedConfig* _aidl_return) {
240 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
241 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
242
Eric Laurentdce54a12014-03-10 12:19:46 -0700243 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800244 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800245 }
246 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800247 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
248 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(AUDIO_POLICY_FORCE_NONE));
249 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800250 }
Eric Laurent10b71232018-04-13 18:14:44 -0700251 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800252 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
253 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(
254 mAudioPolicyManager->getForceUse(usage)));
255 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800256}
257
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800258Status AudioPolicyService::getOutput(media::AudioStreamType streamAidl, int32_t* _aidl_return)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800259{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800260 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
261 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
262
Eric Laurent223fd5c2014-11-11 13:43:36 -0800263 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800264 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
265 legacy2aidl_audio_io_handle_t_int32_t(AUDIO_IO_HANDLE_NONE));
266 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -0700267 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700268 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800269 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800270 }
271 ALOGV("getOutput()");
272 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700273 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800274 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
275 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutput(stream)));
276 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800277}
278
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800279Status AudioPolicyService::getOutputForAttr(const media::AudioAttributesInternal& attrAidl,
280 int32_t sessionAidl,
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700281 const Identity& identity,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800282 const media::AudioConfig& configAidl,
283 int32_t flagsAidl,
Eric Laurentf99edd32021-02-01 15:57:33 +0100284 int32_t selectedDeviceIdAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800285 media::GetOutputForAttrResponse* _aidl_return)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700286{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800287 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
288 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
289 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
290 aidl2legacy_int32_t_audio_session_t(sessionAidl));
291 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800292 audio_config_t config = VALUE_OR_RETURN_BINDER_STATUS(
293 aidl2legacy_AudioConfig_audio_config_t(configAidl));
294 audio_output_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
295 aidl2legacy_int32_t_audio_output_flags_t_mask(flagsAidl));
Eric Laurentf99edd32021-02-01 15:57:33 +0100296 audio_port_handle_t selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
297 aidl2legacy_int32_t_audio_port_handle_t(selectedDeviceIdAidl));
298
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800299 audio_io_handle_t output;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800300 audio_port_handle_t portId;
301 std::vector<audio_io_handle_t> secondaryOutputs;
302
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700303 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800304 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700305 }
Hayden Gomes524159d2019-12-23 14:41:47 -0800306
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800307 RETURN_IF_BINDER_ERROR(
308 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700309 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attr.usage, identity)));
Hayden Gomes524159d2019-12-23 14:41:47 -0800310
Eric Laurent8a1095a2019-11-08 14:44:16 -0800311 ALOGV("%s()", __func__);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700312 Mutex::Autolock _l(mLock);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700313
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700314 // TODO b/182392553: refactor or remove
315 Identity adjIdentity = identity;
Marco Nelissendcb346b2015-09-09 10:47:29 -0700316 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700317 if (!isAudioServerOrMediaServerUid(callingUid) || identity.uid == -1) {
318 int32_t callingUidAidl = VALUE_OR_RETURN_BINDER_STATUS(
319 legacy2aidl_uid_t_int32_t(callingUid));
320 ALOGW_IF(identity.uid != -1 && identity.uid != callingUidAidl,
321 "%s uid %d tried to pass itself off as %d", __func__,
322 callingUidAidl, identity.uid);
323 adjIdentity.uid = callingUidAidl;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700324 }
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700325 if (!mPackageManager.allowPlaybackCapture(VALUE_OR_RETURN_BINDER_STATUS(
326 aidl2legacy_int32_t_uid_t(adjIdentity.uid)))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800327 attr.flags = static_cast<audio_flags_mask_t>(attr.flags | AUDIO_FLAG_NO_MEDIA_PROJECTION);
Eric Laurent42984412019-05-09 17:57:03 -0700328 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800329 if (((attr.flags & (AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)) != 0)
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700330 && !bypassInterruptionPolicyAllowed(identity)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800331 attr.flags = static_cast<audio_flags_mask_t>(
332 attr.flags & ~(AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE));
Kevin Rocard8be94972019-02-22 13:26:25 -0800333 }
Eric Laurent10b71232018-04-13 18:14:44 -0700334 AutoCallerClear acc;
Eric Laurent8a1095a2019-11-08 14:44:16 -0800335 AudioPolicyInterface::output_type_t outputType;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800336 status_t result = mAudioPolicyManager->getOutputForAttr(&attr, &output, session,
337 &stream,
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700338 adjIdentity,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800339 &config,
340 &flags, &selectedDeviceId, &portId,
341 &secondaryOutputs,
342 &outputType);
Nadav Bar766fb022018-01-07 12:18:03 +0200343
344 // FIXME: Introduce a way to check for the the telephony device before opening the output
Eric Laurent8a1095a2019-11-08 14:44:16 -0800345 if (result == NO_ERROR) {
346 // enforce permission (if any) required for each type of input
347 switch (outputType) {
348 case AudioPolicyInterface::API_OUTPUT_LEGACY:
349 break;
350 case AudioPolicyInterface::API_OUTPUT_TELEPHONY_TX:
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700351 if (!modifyPhoneStateAllowed(adjIdentity)) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800352 ALOGE("%s() permission denied: modify phone state not allowed for uid %d",
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700353 __func__, adjIdentity.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800354 result = PERMISSION_DENIED;
355 }
356 break;
357 case AudioPolicyInterface::API_OUT_MIX_PLAYBACK:
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700358 if (!modifyAudioRoutingAllowed(adjIdentity)) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800359 ALOGE("%s() permission denied: modify audio routing not allowed for uid %d",
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700360 __func__, adjIdentity.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800361 result = PERMISSION_DENIED;
362 }
363 break;
364 case AudioPolicyInterface::API_OUTPUT_INVALID:
365 default:
366 LOG_ALWAYS_FATAL("%s() encountered an invalid output type %d",
367 __func__, (int)outputType);
368 }
Nadav Bar766fb022018-01-07 12:18:03 +0200369 }
Eric Laurentd7fe0862018-07-14 16:48:01 -0700370
371 if (result == NO_ERROR) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800372 sp<AudioPlaybackClient> client =
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700373 new AudioPlaybackClient(attr, output, adjIdentity, session,
374 portId, selectedDeviceId, stream);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800375 mAudioPlaybackClients.add(portId, client);
376
377 _aidl_return->output = VALUE_OR_RETURN_BINDER_STATUS(
378 legacy2aidl_audio_io_handle_t_int32_t(output));
379 _aidl_return->stream = VALUE_OR_RETURN_BINDER_STATUS(
380 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
381 _aidl_return->selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
382 legacy2aidl_audio_port_handle_t_int32_t(selectedDeviceId));
383 _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
384 legacy2aidl_audio_port_handle_t_int32_t(portId));
385 _aidl_return->secondaryOutputs = VALUE_OR_RETURN_BINDER_STATUS(
386 convertContainer<std::vector<int32_t>>(secondaryOutputs,
387 legacy2aidl_audio_io_handle_t_int32_t));
Eric Laurentd7fe0862018-07-14 16:48:01 -0700388 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800389 return binderStatusFromStatusT(result);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700390}
391
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700392void AudioPolicyService::getPlaybackClientAndEffects(audio_port_handle_t portId,
393 sp<AudioPlaybackClient>& client,
394 sp<AudioPolicyEffects>& effects,
395 const char *context)
396{
397 Mutex::Autolock _l(mLock);
398 const ssize_t index = mAudioPlaybackClients.indexOfKey(portId);
399 if (index < 0) {
400 ALOGE("%s AudioTrack client not found for portId %d", context, portId);
401 return;
402 }
403 client = mAudioPlaybackClients.valueAt(index);
404 effects = mAudioPolicyEffects;
405}
406
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800407Status AudioPolicyService::startOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800408{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800409 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
410 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700411 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800412 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800413 }
414 ALOGV("startOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700415 sp<AudioPlaybackClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700416 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700417
418 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
419
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700420 if (audioPolicyEffects != 0) {
421 // create audio processors according to stream
Eric Laurentd7fe0862018-07-14 16:48:01 -0700422 status_t status = audioPolicyEffects->addOutputSessionEffects(
423 client->io, client->stream, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700424 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700425 ALOGW("Failed to add effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700426 }
427 }
428 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700429 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700430 status_t status = mAudioPolicyManager->startOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700431 if (status == NO_ERROR) {
432 client->active = true;
433 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800434 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800435}
436
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800437Status AudioPolicyService::stopOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800438{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800439 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
440 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700441 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800442 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800443 }
444 ALOGV("stopOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700445 mOutputCommandThread->stopOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800446 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800447}
448
Eric Laurentd7fe0862018-07-14 16:48:01 -0700449status_t AudioPolicyService::doStopOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800450{
Eric Laurentd7fe0862018-07-14 16:48:01 -0700451 ALOGV("doStopOutput");
452 sp<AudioPlaybackClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700453 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentd7fe0862018-07-14 16:48:01 -0700454
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700455 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
456
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700457 if (audioPolicyEffects != 0) {
458 // release audio processors from the stream
Eric Laurentd7fe0862018-07-14 16:48:01 -0700459 status_t status = audioPolicyEffects->releaseOutputSessionEffects(
460 client->io, client->stream, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700461 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700462 ALOGW("Failed to release effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700463 }
464 }
465 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700466 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700467 status_t status = mAudioPolicyManager->stopOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700468 if (status == NO_ERROR) {
469 client->active = false;
470 }
471 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800472}
473
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800474Status AudioPolicyService::releaseOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800475{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800476 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
477 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700478 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800479 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800480 }
481 ALOGV("releaseOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700482 mOutputCommandThread->releaseOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800483 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800484}
485
Eric Laurentd7fe0862018-07-14 16:48:01 -0700486void AudioPolicyService::doReleaseOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800487{
488 ALOGV("doReleaseOutput from tid %d", gettid());
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700489 sp<AudioPlaybackClient> client;
490 sp<AudioPolicyEffects> audioPolicyEffects;
491
492 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
493
494 if (audioPolicyEffects != 0 && client->active) {
495 // clean up effects if output was not stopped before being released
496 audioPolicyEffects->releaseOutputSessionEffects(
497 client->io, client->stream, client->session);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700498 }
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700499 Mutex::Autolock _l(mLock);
Eric Laurentd4007242019-03-27 12:42:16 -0700500 mAudioPlaybackClients.removeItem(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700501
Eric Laurent10b71232018-04-13 18:14:44 -0700502 // called from internal thread: no need to clear caller identity
Eric Laurent8fc147b2018-07-22 19:13:55 -0700503 mAudioPolicyManager->releaseOutput(portId);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800504}
505
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800506Status AudioPolicyService::getInputForAttr(const media::AudioAttributesInternal& attrAidl,
507 int32_t inputAidl,
508 int32_t riidAidl,
509 int32_t sessionAidl,
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700510 const Identity& identity,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800511 const media::AudioConfigBase& configAidl,
512 int32_t flagsAidl,
Eric Laurentf99edd32021-02-01 15:57:33 +0100513 int32_t selectedDeviceIdAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800514 media::GetInputForAttrResponse* _aidl_return) {
515 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
516 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
517 audio_io_handle_t input = VALUE_OR_RETURN_BINDER_STATUS(
518 aidl2legacy_int32_t_audio_io_handle_t(inputAidl));
519 audio_unique_id_t riid = VALUE_OR_RETURN_BINDER_STATUS(
520 aidl2legacy_int32_t_audio_unique_id_t(riidAidl));
521 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
522 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800523 audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
524 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl));
525 audio_input_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
526 aidl2legacy_int32_t_audio_input_flags_t_mask(flagsAidl));
Eric Laurentf99edd32021-02-01 15:57:33 +0100527 audio_port_handle_t selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
528 aidl2legacy_int32_t_audio_port_handle_t(selectedDeviceIdAidl));
529
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800530 audio_port_handle_t portId;
531
Eric Laurentdce54a12014-03-10 12:19:46 -0700532 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800533 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800534 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800535
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800536 RETURN_IF_BINDER_ERROR(
537 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Hayden Gomes524159d2019-12-23 14:41:47 -0800538
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800539 audio_source_t inputSource = attr.source;
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900540 if (inputSource == AUDIO_SOURCE_DEFAULT) {
541 inputSource = AUDIO_SOURCE_MIC;
542 }
543
Eric Laurent2d388ec2014-03-07 13:25:54 -0800544 // already checked by client, but double-check in case the client wrapper is bypassed
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900545 if ((inputSource < AUDIO_SOURCE_DEFAULT)
546 || (inputSource >= AUDIO_SOURCE_CNT
547 && inputSource != AUDIO_SOURCE_HOTWORD
548 && inputSource != AUDIO_SOURCE_FM_TUNER
549 && inputSource != AUDIO_SOURCE_ECHO_REFERENCE)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800550 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800551 }
552
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700553 // Make sure identity represents the current caller
554 Identity adjIdentity = identity;
555 // TODO b/182392553: refactor or remove
556 bool updatePid = (identity.pid == -1);
557 const uid_t callingUid =IPCThreadState::self()->getCallingUid();
558 const uid_t currentUid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(identity.uid));
Andy Hung4ef19fa2018-05-15 19:35:29 -0700559 if (!isAudioServerOrMediaServerUid(callingUid)) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700560 ALOGW_IF(currentUid != (uid_t)-1 && currentUid != callingUid,
561 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid,
562 currentUid);
563 adjIdentity.uid = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_uid_t_int32_t(callingUid));
Eric Laurentb2379ba2016-05-23 17:42:12 -0700564 updatePid = true;
565 }
566
567 if (updatePid) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700568 const int32_t callingPid = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_pid_t_int32_t(
569 IPCThreadState::self()->getCallingPid()));
570 ALOGW_IF(identity.pid != -1 && identity.pid != callingPid,
Eric Laurentb2379ba2016-05-23 17:42:12 -0700571 "%s uid %d pid %d tried to pass itself off as pid %d",
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700572 __func__, adjIdentity.uid, callingPid, identity.pid);
573 adjIdentity.pid = callingPid;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700574 }
575
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700576 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attr.usage, adjIdentity)));
577
Eric Laurent58a0dd82019-10-24 12:42:17 -0700578 // check calling permissions.
Hayden Gomesb7429922020-12-11 13:59:18 -0800579 // Capturing from FM_TUNER source is controlled by captureTunerAudioInputAllowed() and
580 // captureAudioOutputAllowed() (deprecated) as this does not affect users privacy
581 // as does capturing from an actual microphone.
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700582 if (!(recordingAllowed(adjIdentity) || attr.source == AUDIO_SOURCE_FM_TUNER)) {
583 ALOGE("%s permission denied: recording not allowed for %s",
584 __func__, adjIdentity.toString().c_str());
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800585 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800586 }
587
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700588 bool canCaptureOutput = captureAudioOutputAllowed(adjIdentity);
Ricardo Correa57a37692020-03-23 17:27:25 -0700589 if ((inputSource == AUDIO_SOURCE_VOICE_UPLINK ||
590 inputSource == AUDIO_SOURCE_VOICE_DOWNLINK ||
591 inputSource == AUDIO_SOURCE_VOICE_CALL ||
Hayden Gomesb7429922020-12-11 13:59:18 -0800592 inputSource == AUDIO_SOURCE_ECHO_REFERENCE)
593 && !canCaptureOutput) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800594 return binderStatusFromStatusT(PERMISSION_DENIED);
Hayden Gomesb7429922020-12-11 13:59:18 -0800595 }
596
597 if (inputSource == AUDIO_SOURCE_FM_TUNER
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700598 && !captureTunerAudioInputAllowed(adjIdentity)
Hayden Gomesb7429922020-12-11 13:59:18 -0800599 && !canCaptureOutput) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800600 return binderStatusFromStatusT(PERMISSION_DENIED);
Nadav Bar744be482018-05-08 13:26:21 +0300601 }
602
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700603 bool canCaptureHotword = captureHotwordAllowed(adjIdentity);
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900604 if ((inputSource == AUDIO_SOURCE_HOTWORD) && !canCaptureHotword) {
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800605 return binderStatusFromStatusT(PERMISSION_DENIED);
606 }
607
608 if (((flags & AUDIO_INPUT_FLAG_HW_HOTWORD) != 0)
609 && !canCaptureHotword) {
610 ALOGE("%s: permission denied: hotword mode not allowed"
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700611 " for uid %d pid %d", __func__, adjIdentity.uid, adjIdentity.pid);
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800612 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7504b9e2017-08-15 18:17:26 -0700613 }
614
615 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700616 {
Eric Laurent7504b9e2017-08-15 18:17:26 -0700617 status_t status;
618 AudioPolicyInterface::input_type_t inputType;
619
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700620 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700621 {
622 AutoCallerClear acc;
623 // the audio_in_acoustics_t parameter is ignored by get_input()
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700624 status = mAudioPolicyManager->getInputForAttr(&attr, &input, riid, session,
625 adjIdentity, &config,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800626 flags, &selectedDeviceId,
627 &inputType, &portId);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700628
Eric Laurent10b71232018-04-13 18:14:44 -0700629 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700630 audioPolicyEffects = mAudioPolicyEffects;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800631
632 if (status == NO_ERROR) {
633 // enforce permission (if any) required for each type of input
634 switch (inputType) {
Kevin Rocard25f9b052019-02-27 15:08:54 -0800635 case AudioPolicyInterface::API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK:
636 // this use case has been validated in audio service with a MediaProjection token,
637 // and doesn't rely on regular permissions
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800638 case AudioPolicyInterface::API_INPUT_LEGACY:
639 break;
Eric Laurent82db2692015-08-07 13:59:42 -0700640 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX:
641 // FIXME: use the same permission as for remote submix for now.
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800642 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
Eric Laurent1ff16a72019-03-14 18:35:04 -0700643 if (!canCaptureOutput) {
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800644 ALOGE("getInputForAttr() permission denied: capture not allowed");
645 status = PERMISSION_DENIED;
646 }
647 break;
648 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE:
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700649 if (!modifyAudioRoutingAllowed(adjIdentity)) {
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800650 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed");
651 status = PERMISSION_DENIED;
652 }
653 break;
654 case AudioPolicyInterface::API_INPUT_INVALID:
655 default:
656 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d",
657 (int)inputType);
658 }
659 }
660
661 if (status != NO_ERROR) {
662 if (status == PERMISSION_DENIED) {
Eric Laurent10b71232018-04-13 18:14:44 -0700663 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800664 mAudioPolicyManager->releaseInput(portId);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800665 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800666 return binderStatusFromStatusT(status);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800667 }
Eric Laurentfee19762018-01-29 18:44:13 -0800668
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700669 sp<AudioRecordClient> client = new AudioRecordClient(attr, input, session, portId,
670 selectedDeviceId, adjIdentity,
Ricardo Correa57a37692020-03-23 17:27:25 -0700671 canCaptureOutput, canCaptureHotword);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800672 mAudioRecordClients.add(portId, client);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700673 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800674
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700675 if (audioPolicyEffects != 0) {
676 // create audio pre processors according to input source
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800677 status_t status = audioPolicyEffects->addInputEffects(input, inputSource, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700678 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800679 ALOGW("Failed to add effects on input %d", input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700680 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800681 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800682
683 _aidl_return->input = VALUE_OR_RETURN_BINDER_STATUS(
684 legacy2aidl_audio_io_handle_t_int32_t(input));
685 _aidl_return->selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
686 legacy2aidl_audio_port_handle_t_int32_t(selectedDeviceId));
687 _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
688 legacy2aidl_audio_port_handle_t_int32_t(portId));
689 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800690}
691
Eric Laurent99fcae42018-05-17 16:59:18 -0700692std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) {
jiabin19cdba52020-11-24 11:28:58 -0800693 struct audio_port_v7 port = {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700694 port.id = portId;
695 status_t status = mAudioPolicyManager->getAudioPort(&port);
696 if (status == NO_ERROR && port.type == AUDIO_PORT_TYPE_DEVICE) {
Andy Hung9b181952019-02-25 14:53:36 -0800697 return toString(port.ext.device.type);
Eric Laurent99fcae42018-05-17 16:59:18 -0700698 }
Andy Hung9b181952019-02-25 14:53:36 -0800699 return {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700700}
701
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800702Status AudioPolicyService::startInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800703{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800704 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
705 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
706
Eric Laurentdce54a12014-03-10 12:19:46 -0700707 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800708 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800709 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800710 sp<AudioRecordClient> client;
711 {
712 Mutex::Autolock _l(mLock);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800713
Eric Laurent7dca8a82018-01-29 18:44:26 -0800714 ssize_t index = mAudioRecordClients.indexOfKey(portId);
715 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800716 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800717 }
718 client = mAudioRecordClients.valueAt(index);
Eric Laurentfee19762018-01-29 18:44:13 -0800719 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800720
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700721 std::stringstream msg;
722 msg << "Audio recording on session " << client->session;
723
Eric Laurent7dca8a82018-01-29 18:44:26 -0800724 // check calling permissions
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700725 if (!(startRecording(client->identity, String16(msg.str().c_str()),
726 client->attributes.source)
Eric Laurent58a0dd82019-10-24 12:42:17 -0700727 || client->attributes.source == AUDIO_SOURCE_FM_TUNER)) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700728 ALOGE("%s permission denied: recording not allowed for identity %s",
729 __func__, client->identity.toString().c_str());
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800730 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800731 }
Eric Laurentfee19762018-01-29 18:44:13 -0800732
Eric Laurentdf628922018-12-06 21:45:51 +0000733 Mutex::Autolock _l(mLock);
Eric Laurent4eb58f12018-12-07 16:41:02 -0800734
735 client->active = true;
736 client->startTimeNs = systemTime();
737 updateUidStates_l();
Eric Laurentfee19762018-01-29 18:44:13 -0800738
Eric Laurent10b71232018-04-13 18:14:44 -0700739 status_t status;
740 {
741 AutoCallerClear acc;
Eric Laurent4eb58f12018-12-07 16:41:02 -0800742 status = mAudioPolicyManager->startInput(portId);
Ray Essick84e84a52018-05-03 18:45:07 -0700743
744 }
745
Ray Essickf6a57cd2018-05-22 16:20:54 -0700746 // including successes gets very verbose
Muhammad Qureshi087b37c2020-06-16 16:37:36 -0700747 // but once we cut over to statsd, log them all.
Ray Essickf6a57cd2018-05-22 16:20:54 -0700748 if (status != NO_ERROR) {
Ray Essick84e84a52018-05-03 18:45:07 -0700749
750 static constexpr char kAudioPolicy[] = "audiopolicy";
751
Ray Essick84e84a52018-05-03 18:45:07 -0700752 static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status";
753 static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src";
754 static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg";
755 static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session";
Eric Laurent99fcae42018-05-17 16:59:18 -0700756 static constexpr char kAudioPolicyRqstDevice[] =
757 "android.media.audiopolicy.rqst.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700758 static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src";
759 static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg";
Eric Laurent99fcae42018-05-17 16:59:18 -0700760 static constexpr char kAudioPolicyActiveSession[] =
761 "android.media.audiopolicy.active.session";
762 static constexpr char kAudioPolicyActiveDevice[] =
763 "android.media.audiopolicy.active.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700764
Ray Essickf27e9872019-12-07 06:28:46 -0800765 mediametrics::Item *item = mediametrics::Item::create(kAudioPolicy);
Ray Essick84e84a52018-05-03 18:45:07 -0700766 if (item != NULL) {
767
Ray Essick84e84a52018-05-03 18:45:07 -0700768 item->setInt32(kAudioPolicyStatus, status);
769
Eric Laurent99fcae42018-05-17 16:59:18 -0700770 item->setCString(kAudioPolicyRqstSrc,
Andy Hung9b181952019-02-25 14:53:36 -0800771 toString(client->attributes.source).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700772 item->setInt32(kAudioPolicyRqstSession, client->session);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700773 if (client->identity.packageName.has_value() &&
774 client->identity.packageName.value().size() != 0) {
Ray Essick51866952018-05-30 11:22:27 -0700775 item->setCString(kAudioPolicyRqstPkg,
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700776 client->identity.packageName.value().c_str());
Ray Essick51866952018-05-30 11:22:27 -0700777 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700778 item->setCString(kAudioPolicyRqstPkg,
779 std::to_string(client->identity.uid).c_str());
Ray Essick51866952018-05-30 11:22:27 -0700780 }
Eric Laurent99fcae42018-05-17 16:59:18 -0700781 item->setCString(
782 kAudioPolicyRqstDevice, getDeviceTypeStrForPortId(client->deviceId).c_str());
783
Eric Laurent4eb58f12018-12-07 16:41:02 -0800784 int count = mAudioRecordClients.size();
785 for (int i = 0; i < count ; i++) {
786 if (portId == mAudioRecordClients.keyAt(i)) {
787 continue;
788 }
789 sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
790 if (other->active) {
791 // keeps the last of the clients marked active
792 item->setCString(kAudioPolicyActiveSrc,
Andy Hung9b181952019-02-25 14:53:36 -0800793 toString(other->attributes.source).c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -0800794 item->setInt32(kAudioPolicyActiveSession, other->session);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700795 if (other->identity.packageName.has_value() &&
796 other->identity.packageName.value().size() != 0) {
Eric Laurent4eb58f12018-12-07 16:41:02 -0800797 item->setCString(kAudioPolicyActivePkg,
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700798 other->identity.packageName.value().c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -0800799 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700800 item->setCString(kAudioPolicyRqstPkg, std::to_string(
801 other->identity.uid).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700802 }
Eric Laurent4eb58f12018-12-07 16:41:02 -0800803 item->setCString(kAudioPolicyActiveDevice,
804 getDeviceTypeStrForPortId(other->deviceId).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700805 }
806 }
807 item->selfrecord();
808 delete item;
809 item = NULL;
810 }
Ray Essick6ce27e52019-02-15 10:58:05 -0800811 }
812
813 if (status != NO_ERROR) {
Eric Laurent4eb58f12018-12-07 16:41:02 -0800814 client->active = false;
815 client->startTimeNs = 0;
816 updateUidStates_l();
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700817 finishRecording(client->identity, client->attributes.source);
Eric Laurentfb66dd92016-01-28 18:32:03 -0800818 }
819
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800820 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800821}
822
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800823Status AudioPolicyService::stopInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800824{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800825 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
826 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
827
Eric Laurentdce54a12014-03-10 12:19:46 -0700828 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800829 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800830 }
Eric Laurent4eb58f12018-12-07 16:41:02 -0800831
Eric Laurent2d388ec2014-03-07 13:25:54 -0800832 Mutex::Autolock _l(mLock);
833
Eric Laurentfee19762018-01-29 18:44:13 -0800834 ssize_t index = mAudioRecordClients.indexOfKey(portId);
835 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800836 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurentfee19762018-01-29 18:44:13 -0800837 }
838 sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
839
Ray Essick84e84a52018-05-03 18:45:07 -0700840 client->active = false;
Eric Laurent4eb58f12018-12-07 16:41:02 -0800841 client->startTimeNs = 0;
842
843 updateUidStates_l();
Ray Essick84e84a52018-05-03 18:45:07 -0700844
Svet Ganov6e641372018-03-02 09:21:30 -0800845 // finish the recording app op
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700846 finishRecording(client->identity, client->attributes.source);
Eric Laurent10b71232018-04-13 18:14:44 -0700847 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800848 return binderStatusFromStatusT(mAudioPolicyManager->stopInput(portId));
Eric Laurent2d388ec2014-03-07 13:25:54 -0800849}
850
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800851Status AudioPolicyService::releaseInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800852{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800853 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
854 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
855
Eric Laurentdce54a12014-03-10 12:19:46 -0700856 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800857 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800858 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700859 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -0800860 sp<AudioRecordClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700861 {
862 Mutex::Autolock _l(mLock);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700863 audioPolicyEffects = mAudioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -0800864 ssize_t index = mAudioRecordClients.indexOfKey(portId);
865 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800866 return Status::ok();
Eric Laurentfee19762018-01-29 18:44:13 -0800867 }
868 client = mAudioRecordClients.valueAt(index);
Eric Laurent4eb58f12018-12-07 16:41:02 -0800869
870 if (client->active) {
871 ALOGW("%s releasing active client portId %d", __FUNCTION__, portId);
872 client->active = false;
873 client->startTimeNs = 0;
874 updateUidStates_l();
875 }
876
Eric Laurentfee19762018-01-29 18:44:13 -0800877 mAudioRecordClients.removeItem(portId);
878 }
879 if (client == 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800880 return Status::ok();
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700881 }
882 if (audioPolicyEffects != 0) {
883 // release audio processors from the input
Eric Laurentd7fe0862018-07-14 16:48:01 -0700884 status_t status = audioPolicyEffects->releaseInputEffects(client->io, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700885 if(status != NO_ERROR) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700886 ALOGW("Failed to release effects on input %d", client->io);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700887 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800888 }
Eric Laurentf10c7092016-12-06 17:09:56 -0800889 {
890 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700891 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700892 mAudioPolicyManager->releaseInput(portId);
Eric Laurentf10c7092016-12-06 17:09:56 -0800893 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800894 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800895}
896
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800897Status AudioPolicyService::initStreamVolume(media::AudioStreamType streamAidl,
898 int32_t indexMinAidl,
899 int32_t indexMaxAidl) {
900 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
901 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
902 int indexMin = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMinAidl));
903 int indexMax = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMaxAidl));
904
Eric Laurentdce54a12014-03-10 12:19:46 -0700905 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800906 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800907 }
908 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800909 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800910 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800911 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800912 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800913 }
914 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700915 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700916 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800917 return binderStatusFromStatusT(NO_ERROR);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800918}
919
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800920Status AudioPolicyService::setStreamVolumeIndex(media::AudioStreamType streamAidl,
921 int32_t deviceAidl, int32_t indexAidl) {
922 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
923 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
924 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
925 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
926 aidl2legacy_int32_t_audio_devices_t(deviceAidl));
927
Eric Laurentdce54a12014-03-10 12:19:46 -0700928 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800929 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800930 }
931 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800932 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800933 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800934 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800935 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800936 }
937 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700938 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800939 return binderStatusFromStatusT(mAudioPolicyManager->setStreamVolumeIndex(stream,
940 index,
941 device));
Eric Laurent2d388ec2014-03-07 13:25:54 -0800942}
943
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800944Status AudioPolicyService::getStreamVolumeIndex(media::AudioStreamType streamAidl,
945 int32_t deviceAidl, int32_t* _aidl_return) {
946 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
947 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
948 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
949 aidl2legacy_int32_t_audio_devices_t(deviceAidl));
950 int index;
951
Eric Laurentdce54a12014-03-10 12:19:46 -0700952 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800953 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800954 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800955 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800956 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800957 }
958 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700959 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800960 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
961 mAudioPolicyManager->getStreamVolumeIndex(stream, &index, device)));
962 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
963 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800964}
965
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800966Status AudioPolicyService::setVolumeIndexForAttributes(
967 const media::AudioAttributesInternal& attrAidl, int32_t deviceAidl, int32_t indexAidl) {
968 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
969 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
970 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
971 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
972 aidl2legacy_int32_t_audio_devices_t(deviceAidl));
973 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
974 AudioValidator::validateAudioAttributes(attributes, "169572641")));
975
François Gaffiecfe17322018-11-07 13:41:29 +0100976 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800977 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +0100978 }
979 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800980 return binderStatusFromStatusT(PERMISSION_DENIED);
François Gaffiecfe17322018-11-07 13:41:29 +0100981 }
982 Mutex::Autolock _l(mLock);
983 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800984 return binderStatusFromStatusT(
985 mAudioPolicyManager->setVolumeIndexForAttributes(attributes, index, device));
François Gaffiecfe17322018-11-07 13:41:29 +0100986}
987
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800988Status AudioPolicyService::getVolumeIndexForAttributes(
989 const media::AudioAttributesInternal& attrAidl, int32_t deviceAidl, int32_t* _aidl_return) {
990 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
991 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
992 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
993 aidl2legacy_int32_t_audio_devices_t(deviceAidl));
994 int index;
995 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
996 AudioValidator::validateAudioAttributes(attributes, "169572641")));
997
François Gaffiecfe17322018-11-07 13:41:29 +0100998 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800999 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001000 }
1001 Mutex::Autolock _l(mLock);
1002 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001003 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1004 mAudioPolicyManager->getVolumeIndexForAttributes(attributes, index, device)));
1005 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1006 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001007}
1008
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001009Status AudioPolicyService::getMinVolumeIndexForAttributes(
1010 const media::AudioAttributesInternal& attrAidl, int32_t* _aidl_return) {
1011 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1012 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
1013 int index;
1014 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1015 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1016
François Gaffiecfe17322018-11-07 13:41:29 +01001017 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001018 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001019 }
1020 Mutex::Autolock _l(mLock);
1021 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001022 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1023 mAudioPolicyManager->getMinVolumeIndexForAttributes(attributes, index)));
1024 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1025 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001026}
1027
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001028Status AudioPolicyService::getMaxVolumeIndexForAttributes(
1029 const media::AudioAttributesInternal& attrAidl, int32_t* _aidl_return) {
1030 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1031 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
1032 int index;
1033 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1034 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1035
François Gaffiecfe17322018-11-07 13:41:29 +01001036 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001037 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001038 }
1039 Mutex::Autolock _l(mLock);
1040 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001041 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1042 mAudioPolicyManager->getMaxVolumeIndexForAttributes(attributes, index)));
1043 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1044 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001045}
1046
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001047Status AudioPolicyService::getStrategyForStream(media::AudioStreamType streamAidl,
1048 int32_t* _aidl_return) {
1049 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1050 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1051
Eric Laurent223fd5c2014-11-11 13:43:36 -08001052 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001053 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1054 convertReinterpret<int32_t>(PRODUCT_STRATEGY_NONE));
1055 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001056 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001057 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001058 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001059 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001060
François Gaffiec005e562018-11-06 15:04:49 +01001061 // DO NOT LOCK, may be called from AudioFlinger with lock held, reaching deadlock
Eric Laurent10b71232018-04-13 18:14:44 -07001062 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001063 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1064 legacy2aidl_product_strategy_t_int32_t(
1065 mAudioPolicyManager->getStrategyForStream(stream)));
1066 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001067}
1068
1069//audio policy: use audio_device_t appropriately
1070
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001071Status AudioPolicyService::getDevicesForStream(media::AudioStreamType streamAidl,
1072 int32_t* _aidl_return) {
1073 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1074 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1075
Eric Laurent223fd5c2014-11-11 13:43:36 -08001076 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001077 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1078 legacy2aidl_audio_devices_t_int32_t(AUDIO_DEVICE_NONE));
1079 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001080 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001081 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001082 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001083 }
Haynes Mathew Georgedfb9f3b2015-10-26 18:22:13 -07001084 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001085 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001086 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1087 legacy2aidl_audio_devices_t_int32_t(mAudioPolicyManager->getDevicesForStream(stream)));
1088 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001089}
1090
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001091Status AudioPolicyService::getDevicesForAttributes(const media::AudioAttributesEx& attrAidl,
1092 std::vector<media::AudioDevice>* _aidl_return)
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001093{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001094 AudioAttributes aa = VALUE_OR_RETURN_BINDER_STATUS(
1095 aidl2legacy_AudioAttributesEx_AudioAttributes(attrAidl));
1096 AudioDeviceTypeAddrVector devices;
1097
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001098 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001099 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001100 }
1101 Mutex::Autolock _l(mLock);
1102 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001103 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1104 mAudioPolicyManager->getDevicesForAttributes(aa.getAttributes(), &devices)));
1105 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1106 convertContainer<std::vector<media::AudioDevice>>(devices,
1107 legacy2aidl_AudioDeviceTypeAddress));
1108 return Status::ok();
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001109}
1110
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001111Status AudioPolicyService::getOutputForEffect(const media::EffectDescriptor& descAidl,
1112 int32_t* _aidl_return) {
1113 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1114 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1115 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1116 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1117
Eric Laurentdce54a12014-03-10 12:19:46 -07001118 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001119 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001120 }
1121 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001122 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001123 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1124 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutputForEffect(&desc)));
1125 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001126}
1127
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001128Status AudioPolicyService::registerEffect(const media::EffectDescriptor& descAidl, int32_t ioAidl,
1129 int32_t strategyAidl, int32_t sessionAidl,
1130 int32_t idAidl) {
1131 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1132 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1133 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1134 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1135 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
1136 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
1137 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1138 aidl2legacy_int32_t_audio_session_t(sessionAidl));
1139 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
1140 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1141 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1142
Eric Laurentdce54a12014-03-10 12:19:46 -07001143 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001144 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001145 }
Eric Laurent6c796322019-04-09 14:13:17 -07001146 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001147 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001148 return binderStatusFromStatusT(
1149 mAudioPolicyManager->registerEffect(&desc, io, strategy, session, id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001150}
1151
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001152Status AudioPolicyService::unregisterEffect(int32_t idAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001153{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001154 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001155 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001156 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001157 }
Eric Laurent6c796322019-04-09 14:13:17 -07001158 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001159 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001160 return binderStatusFromStatusT(mAudioPolicyManager->unregisterEffect(id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001161}
1162
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001163Status AudioPolicyService::setEffectEnabled(int32_t idAidl, bool enabled)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001164{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001165 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001166 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001167 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001168 }
Eric Laurent6c796322019-04-09 14:13:17 -07001169 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001170 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001171 return binderStatusFromStatusT(mAudioPolicyManager->setEffectEnabled(id, enabled));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001172}
1173
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001174Status AudioPolicyService::moveEffectsToIo(const std::vector<int32_t>& idsAidl, int32_t ioAidl)
1175
Eric Laurent6c796322019-04-09 14:13:17 -07001176{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001177 const std::vector<int>& ids = VALUE_OR_RETURN_BINDER_STATUS(
1178 convertContainer<std::vector<int>>(idsAidl, convertReinterpret<int, int32_t>));
1179 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1180 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1181 if (ids.size() > MAX_ITEMS_PER_LIST) {
1182 return binderStatusFromStatusT(BAD_VALUE);
1183 }
1184
Eric Laurent6c796322019-04-09 14:13:17 -07001185 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001186 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6c796322019-04-09 14:13:17 -07001187 }
1188 Mutex::Autolock _l(mLock);
1189 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001190 return binderStatusFromStatusT(mAudioPolicyManager->moveEffectsToIo(ids, io));
Eric Laurent6c796322019-04-09 14:13:17 -07001191}
1192
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001193Status AudioPolicyService::isStreamActive(media::AudioStreamType streamAidl, int32_t inPastMsAidl,
1194 bool* _aidl_return) {
1195 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1196 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1197 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1198
Eric Laurent223fd5c2014-11-11 13:43:36 -08001199 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001200 *_aidl_return = false;
1201 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001202 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001203 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001204 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001205 }
1206 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001207 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001208 *_aidl_return = mAudioPolicyManager->isStreamActive(stream, inPastMs);
1209 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001210}
1211
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001212Status AudioPolicyService::isStreamActiveRemotely(media::AudioStreamType streamAidl,
1213 int32_t inPastMsAidl,
1214 bool* _aidl_return) {
1215 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1216 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1217 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1218
Eric Laurent223fd5c2014-11-11 13:43:36 -08001219 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001220 *_aidl_return = false;
1221 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001222 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001223 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001224 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001225 }
1226 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001227 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001228 *_aidl_return = mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
1229 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001230}
1231
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001232Status AudioPolicyService::isSourceActive(media::AudioSourceType sourceAidl, bool* _aidl_return) {
1233 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
1234 aidl2legacy_AudioSourceType_audio_source_t(sourceAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001235 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001236 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001237 }
1238 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001239 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001240 *_aidl_return = mAudioPolicyManager->isSourceActive(source);
1241 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001242}
1243
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001244status_t AudioPolicyService::getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001245{
Eric Laurentdce54a12014-03-10 12:19:46 -07001246 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -08001247 return NO_INIT;
1248 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001249 {
1250 Mutex::Autolock _l(mLock);
1251 audioPolicyEffects = mAudioPolicyEffects;
1252 }
1253 if (audioPolicyEffects == 0) {
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001254 return NO_INIT;
1255 }
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001256
1257 return OK;
1258}
1259
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001260Status AudioPolicyService::queryDefaultPreProcessing(
1261 int32_t audioSessionAidl,
1262 media::Int* countAidl,
1263 std::vector<media::EffectDescriptor>* _aidl_return) {
1264 audio_session_t audioSession = VALUE_OR_RETURN_BINDER_STATUS(
1265 aidl2legacy_int32_t_audio_session_t(audioSessionAidl));
1266 uint32_t count = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(countAidl->value));
1267 if (count > AudioEffect::kMaxPreProcessing) {
1268 count = AudioEffect::kMaxPreProcessing;
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001269 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001270 uint32_t countReq = count;
1271 std::unique_ptr<effect_descriptor_t[]> descriptors(new effect_descriptor_t[count]);
1272
1273 sp<AudioPolicyEffects> audioPolicyEffects;
1274 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
1275 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->queryDefaultInputEffects(
1276 (audio_session_t) audioSession, descriptors.get(), &count)));
1277 countReq = std::min(count, countReq);
1278 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1279 convertRange(descriptors.get(), descriptors.get() + countReq,
1280 std::back_inserter(*_aidl_return),
1281 legacy2aidl_effect_descriptor_t_EffectDescriptor)));
1282 countAidl->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(count));
1283 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001284}
1285
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001286Status AudioPolicyService::addSourceDefaultEffect(const media::AudioUuid& typeAidl,
1287 const std::string& opPackageNameAidl,
1288 const media::AudioUuid& uuidAidl,
1289 int32_t priority,
1290 media::AudioSourceType sourceAidl,
1291 int32_t* _aidl_return) {
1292 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1293 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1294 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1295 aidl2legacy_string_view_String16(opPackageNameAidl));
1296 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1297 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1298 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
1299 aidl2legacy_AudioSourceType_audio_source_t(sourceAidl));
1300 audio_unique_id_t id;
1301
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001302 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001303 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001304 if (!modifyDefaultAudioEffectsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001305 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001306 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001307 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addSourceDefaultEffect(
1308 &type, opPackageName, &uuid, priority, source, &id)));
1309 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1310 return Status::ok();
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001311}
1312
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001313Status AudioPolicyService::addStreamDefaultEffect(const media::AudioUuid& typeAidl,
1314 const std::string& opPackageNameAidl,
1315 const media::AudioUuid& uuidAidl,
1316 int32_t priority, media::AudioUsage usageAidl,
1317 int32_t* _aidl_return) {
1318 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1319 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1320 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1321 aidl2legacy_string_view_String16(opPackageNameAidl));
1322 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1323 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1324 audio_usage_t usage = VALUE_OR_RETURN_BINDER_STATUS(
1325 aidl2legacy_AudioUsage_audio_usage_t(usageAidl));
1326 audio_unique_id_t id;
1327
1328 sp<AudioPolicyEffects> audioPolicyEffects;
1329 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001330 if (!modifyDefaultAudioEffectsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001331 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001332 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001333 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addStreamDefaultEffect(
1334 &type, opPackageName, &uuid, priority, usage, &id)));
1335 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1336 return Status::ok();
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001337}
1338
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001339Status AudioPolicyService::removeSourceDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001340{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001341 audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1342 aidl2legacy_int32_t_audio_unique_id_t(idAidl));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001343 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001344 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001345 if (!modifyDefaultAudioEffectsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001346 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001347 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001348 return binderStatusFromStatusT(audioPolicyEffects->removeSourceDefaultEffect(id));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001349}
1350
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001351Status AudioPolicyService::removeStreamDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001352{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001353 audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1354 aidl2legacy_int32_t_audio_unique_id_t(idAidl));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001355 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001356 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001357 if (!modifyDefaultAudioEffectsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001358 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001359 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001360 return binderStatusFromStatusT(audioPolicyEffects->removeStreamDefaultEffect(id));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001361}
1362
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001363Status AudioPolicyService::setSupportedSystemUsages(
1364 const std::vector<media::AudioUsage>& systemUsagesAidl) {
1365 size_t size = systemUsagesAidl.size();
1366 if (size > MAX_ITEMS_PER_LIST) {
1367 size = MAX_ITEMS_PER_LIST;
1368 }
1369 std::vector<audio_usage_t> systemUsages;
1370 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1371 convertRange(systemUsagesAidl.begin(), systemUsagesAidl.begin() + size,
1372 std::back_inserter(systemUsages), aidl2legacy_AudioUsage_audio_usage_t)));
1373
Hayden Gomes524159d2019-12-23 14:41:47 -08001374 Mutex::Autolock _l(mLock);
1375 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001376 return binderStatusFromStatusT(PERMISSION_DENIED);
Hayden Gomes524159d2019-12-23 14:41:47 -08001377 }
1378
1379 bool areAllSystemUsages = std::all_of(begin(systemUsages), end(systemUsages),
1380 [](audio_usage_t usage) { return isSystemUsage(usage); });
1381 if (!areAllSystemUsages) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001382 return binderStatusFromStatusT(BAD_VALUE);
Hayden Gomes524159d2019-12-23 14:41:47 -08001383 }
1384
1385 mSupportedSystemUsages = systemUsages;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001386 return Status::ok();
Hayden Gomes524159d2019-12-23 14:41:47 -08001387}
1388
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001389Status AudioPolicyService::setAllowedCapturePolicy(int32_t uidAidl, int32_t capturePolicyAidl) {
1390 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1391 audio_flags_mask_t capturePolicy = VALUE_OR_RETURN_BINDER_STATUS(
1392 aidl2legacy_int32_t_audio_flags_mask_t_mask(capturePolicyAidl));
1393
Kevin Rocardb99cc752019-03-21 20:52:24 -07001394 Mutex::Autolock _l(mLock);
1395 if (mAudioPolicyManager == NULL) {
1396 ALOGV("%s() mAudioPolicyManager == NULL", __func__);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001397 return binderStatusFromStatusT(NO_INIT);
Kevin Rocardb99cc752019-03-21 20:52:24 -07001398 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001399 return binderStatusFromStatusT(
1400 mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy));
Kevin Rocardb99cc752019-03-21 20:52:24 -07001401}
1402
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001403Status AudioPolicyService::getOffloadSupport(const media::AudioOffloadInfo& infoAidl,
1404 media::AudioOffloadMode* _aidl_return) {
1405 audio_offload_info_t info = VALUE_OR_RETURN_BINDER_STATUS(
1406 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(infoAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001407 if (mAudioPolicyManager == NULL) {
1408 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001409 return binderStatusFromStatusT(AUDIO_OFFLOAD_NOT_SUPPORTED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001410 }
Andy Hung2ddee192015-12-18 17:34:44 -08001411 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001412 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001413 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_offload_mode_t_AudioOffloadMode(
1414 mAudioPolicyManager->getOffloadSupport(info)));
1415 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001416}
1417
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001418Status AudioPolicyService::isDirectOutputSupported(
1419 const media::AudioConfigBase& configAidl,
1420 const media::AudioAttributesInternal& attributesAidl,
1421 bool* _aidl_return) {
1422 audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
1423 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl));
1424 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1425 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attributesAidl));
1426 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1427 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1428
Michael Chana94fbb22018-04-24 14:31:19 +10001429 if (mAudioPolicyManager == NULL) {
1430 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001431 return binderStatusFromStatusT(NO_INIT);
Michael Chana94fbb22018-04-24 14:31:19 +10001432 }
Hayden Gomes524159d2019-12-23 14:41:47 -08001433
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001434 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attributes.usage)));
Hayden Gomes524159d2019-12-23 14:41:47 -08001435
Michael Chana94fbb22018-04-24 14:31:19 +10001436 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001437 *_aidl_return = mAudioPolicyManager->isDirectOutputSupported(config, attributes);
1438 return Status::ok();
Michael Chana94fbb22018-04-24 14:31:19 +10001439}
1440
1441
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001442Status AudioPolicyService::listAudioPorts(media::AudioPortRole roleAidl,
1443 media::AudioPortType typeAidl, media::Int* count,
1444 std::vector<media::AudioPort>* portsAidl,
1445 int32_t* _aidl_return) {
1446 audio_port_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
1447 aidl2legacy_AudioPortRole_audio_port_role_t(roleAidl));
1448 audio_port_type_t type = VALUE_OR_RETURN_BINDER_STATUS(
1449 aidl2legacy_AudioPortType_audio_port_type_t(typeAidl));
1450 unsigned int num_ports = VALUE_OR_RETURN_BINDER_STATUS(
1451 convertIntegral<unsigned int>(count->value));
1452 if (num_ports > MAX_ITEMS_PER_LIST) {
1453 num_ports = MAX_ITEMS_PER_LIST;
1454 }
1455 unsigned int numPortsReq = num_ports;
1456 std::unique_ptr<audio_port_v7[]> ports(new audio_port_v7[num_ports]);
1457 unsigned int generation;
1458
Eric Laurent6a94d692014-05-20 11:18:06 -07001459 Mutex::Autolock _l(mLock);
1460 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001461 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001462 }
Eric Laurent10b71232018-04-13 18:14:44 -07001463 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001464 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1465 mAudioPolicyManager->listAudioPorts(role, type, &num_ports, ports.get(), &generation)));
1466 numPortsReq = std::min(numPortsReq, num_ports);
1467 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1468 convertRange(ports.get(), ports.get() + numPortsReq, std::back_inserter(*portsAidl),
1469 legacy2aidl_audio_port_v7_AudioPort)));
1470 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_ports));
1471 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1472 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001473}
1474
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001475Status AudioPolicyService::getAudioPort(const media::AudioPort& portAidl,
1476 media::AudioPort* _aidl_return) {
1477 audio_port_v7 port = VALUE_OR_RETURN_BINDER_STATUS(
1478 aidl2legacy_AudioPort_audio_port_v7(portAidl));
1479 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPort(port)));
1480
Eric Laurent6a94d692014-05-20 11:18:06 -07001481 Mutex::Autolock _l(mLock);
1482 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001483 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001484 }
Eric Laurent10b71232018-04-13 18:14:44 -07001485 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001486 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(mAudioPolicyManager->getAudioPort(&port)));
1487 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_v7_AudioPort(port));
1488 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001489}
1490
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001491Status AudioPolicyService::createAudioPatch(const media::AudioPatch& patchAidl, int32_t handleAidl,
1492 int32_t* _aidl_return) {
1493 audio_patch patch = VALUE_OR_RETURN_BINDER_STATUS(
1494 aidl2legacy_AudioPatch_audio_patch(patchAidl));
1495 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1496 aidl2legacy_int32_t_audio_port_handle_t(handleAidl));
1497 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPatch(patch)));
1498
Eric Laurent6a94d692014-05-20 11:18:06 -07001499 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001500 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001501 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001502 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001503 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001504 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001505 }
Eric Laurent10b71232018-04-13 18:14:44 -07001506 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001507 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1508 mAudioPolicyManager->createAudioPatch(&patch, &handle,
1509 IPCThreadState::self()->getCallingUid())));
1510 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_patch_handle_t_int32_t(handle));
1511 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001512}
1513
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001514Status AudioPolicyService::releaseAudioPatch(int32_t handleAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001515{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001516 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1517 aidl2legacy_int32_t_audio_patch_handle_t(handleAidl));
Eric Laurent6a94d692014-05-20 11:18:06 -07001518 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001519 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001520 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001521 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001522 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001523 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001524 }
Eric Laurent10b71232018-04-13 18:14:44 -07001525 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001526 return binderStatusFromStatusT(
1527 mAudioPolicyManager->releaseAudioPatch(handle,
1528 IPCThreadState::self()->getCallingUid()));
Eric Laurent203b1a12014-04-01 10:34:16 -07001529}
1530
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001531Status AudioPolicyService::listAudioPatches(media::Int* count,
1532 std::vector<media::AudioPatch>* patchesAidl,
1533 int32_t* _aidl_return) {
1534 unsigned int num_patches = VALUE_OR_RETURN_BINDER_STATUS(
1535 convertIntegral<unsigned int>(count->value));
1536 if (num_patches > MAX_ITEMS_PER_LIST) {
1537 num_patches = MAX_ITEMS_PER_LIST;
1538 }
1539 unsigned int numPatchesReq = num_patches;
1540 std::unique_ptr<audio_patch[]> patches(new audio_patch[num_patches]);
1541 unsigned int generation;
1542
Eric Laurent6a94d692014-05-20 11:18:06 -07001543 Mutex::Autolock _l(mLock);
1544 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001545 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001546 }
Eric Laurent10b71232018-04-13 18:14:44 -07001547 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001548 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1549 mAudioPolicyManager->listAudioPatches(&num_patches, patches.get(), &generation)));
1550 numPatchesReq = std::min(numPatchesReq, num_patches);
1551 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1552 convertRange(patches.get(), patches.get() + numPatchesReq,
1553 std::back_inserter(*patchesAidl), legacy2aidl_audio_patch_AudioPatch)));
1554 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_patches));
1555 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1556 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001557}
1558
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001559Status AudioPolicyService::setAudioPortConfig(const media::AudioPortConfig& configAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001560{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001561 audio_port_config config = VALUE_OR_RETURN_BINDER_STATUS(
1562 aidl2legacy_AudioPortConfig_audio_port_config(configAidl));
1563 RETURN_IF_BINDER_ERROR(
1564 binderStatusFromStatusT(AudioValidator::validateAudioPortConfig(config)));
1565
Eric Laurent6a94d692014-05-20 11:18:06 -07001566 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001567 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001568 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001569 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001570 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001571 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001572 }
Eric Laurent10b71232018-04-13 18:14:44 -07001573 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001574 return binderStatusFromStatusT(mAudioPolicyManager->setAudioPortConfig(&config));
Eric Laurent203b1a12014-04-01 10:34:16 -07001575}
Eric Laurent2d388ec2014-03-07 13:25:54 -08001576
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001577Status AudioPolicyService::acquireSoundTriggerSession(media::SoundTriggerSession* _aidl_return)
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001578{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001579 audio_session_t session;
1580 audio_io_handle_t ioHandle;
1581 audio_devices_t device;
1582
1583 {
1584 Mutex::Autolock _l(mLock);
1585 if (mAudioPolicyManager == NULL) {
1586 return binderStatusFromStatusT(NO_INIT);
1587 }
1588 AutoCallerClear acc;
1589 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1590 mAudioPolicyManager->acquireSoundTriggerSession(&session, &ioHandle, &device)));
1591 }
1592
1593 _aidl_return->session = VALUE_OR_RETURN_BINDER_STATUS(
1594 legacy2aidl_audio_session_t_int32_t(session));
1595 _aidl_return->ioHandle = VALUE_OR_RETURN_BINDER_STATUS(
1596 legacy2aidl_audio_io_handle_t_int32_t(ioHandle));
1597 _aidl_return->device = VALUE_OR_RETURN_BINDER_STATUS(
1598 legacy2aidl_audio_devices_t_int32_t(device));
1599 return Status::ok();
1600}
1601
1602Status AudioPolicyService::releaseSoundTriggerSession(int32_t sessionAidl)
1603{
1604 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1605 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Andy Hungf759b8c2017-08-15 12:48:54 -07001606 Mutex::Autolock _l(mLock);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001607 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001608 return binderStatusFromStatusT(NO_INIT);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001609 }
Eric Laurent10b71232018-04-13 18:14:44 -07001610 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001611 return binderStatusFromStatusT(mAudioPolicyManager->releaseSoundTriggerSession(session));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001612}
1613
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001614Status AudioPolicyService::registerPolicyMixes(const std::vector<media::AudioMix>& mixesAidl,
1615 bool registration) {
1616 size_t size = mixesAidl.size();
1617 if (size > MAX_MIXES_PER_POLICY) {
1618 size = MAX_MIXES_PER_POLICY;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001619 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001620 Vector<AudioMix> mixes;
1621 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1622 convertRange(mixesAidl.begin(), mixesAidl.begin() + size, std::back_inserter(mixes),
1623 aidl2legacy_AudioMix)));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001624
Eric Laurentbaac1832014-12-01 17:52:59 -08001625 Mutex::Autolock _l(mLock);
Kevin Rocardbe201852019-02-20 22:33:28 -08001626
1627 // loopback|render only need a MediaProjection (checked in caller AudioService.java)
1628 bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1629 return !is_mix_loopback_render(mix.mRouteFlags); });
1630 if (needModifyAudioRouting && !modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001631 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurentbaac1832014-12-01 17:52:59 -08001632 }
Kevin Rocardbe201852019-02-20 22:33:28 -08001633
Nadav Bar287d3302020-02-05 14:55:38 +02001634 // If one of the mixes has needCaptureVoiceCommunicationOutput set to true, then we
1635 // need to verify that the caller still has CAPTURE_VOICE_COMMUNICATION_OUTPUT
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001636 bool needCaptureVoiceCommunicationOutput =
1637 std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Nadav Bar287d3302020-02-05 14:55:38 +02001638 return mix.mVoiceCommunicationCaptureAllowed; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001639
Kevin Rocard36b17552019-03-07 18:48:07 -08001640 bool needCaptureMediaOutput = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Eric Laurent5f9a6452020-12-22 20:10:10 +01001641 return mix.mAllowPrivilegedMediaPlaybackCapture; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001642
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001643 const Identity identity = getCallingIdentity();
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001644
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001645
1646 if (needCaptureMediaOutput && !captureMediaOutputAllowed(identity)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001647 return binderStatusFromStatusT(PERMISSION_DENIED);
Kevin Rocard36b17552019-03-07 18:48:07 -08001648 }
1649
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001650 if (needCaptureVoiceCommunicationOutput &&
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001651 !captureVoiceCommunicationOutputAllowed(identity)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001652 return binderStatusFromStatusT(PERMISSION_DENIED);
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001653 }
1654
Eric Laurentbaac1832014-12-01 17:52:59 -08001655 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001656 return binderStatusFromStatusT(NO_INIT);
Eric Laurentbaac1832014-12-01 17:52:59 -08001657 }
Eric Laurent10b71232018-04-13 18:14:44 -07001658 AutoCallerClear acc;
Eric Laurentbaac1832014-12-01 17:52:59 -08001659 if (registration) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001660 return binderStatusFromStatusT(mAudioPolicyManager->registerPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08001661 } else {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001662 return binderStatusFromStatusT(mAudioPolicyManager->unregisterPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08001663 }
1664}
1665
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001666Status AudioPolicyService::setUidDeviceAffinities(
1667 int32_t uidAidl,
1668 const std::vector<media::AudioDevice>& devicesAidl) {
1669 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1670 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
1671 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
1672 aidl2legacy_AudioDeviceTypeAddress));
1673
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001674 Mutex::Autolock _l(mLock);
1675 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001676 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001677 }
1678 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001679 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001680 }
1681 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001682 return binderStatusFromStatusT(mAudioPolicyManager->setUidDeviceAffinities(uid, devices));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001683}
1684
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001685Status AudioPolicyService::removeUidDeviceAffinities(int32_t uidAidl) {
1686 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1687
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001688 Mutex::Autolock _l(mLock);
1689 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001690 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001691 }
1692 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001693 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001694 }
1695 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001696 return binderStatusFromStatusT(mAudioPolicyManager->removeUidDeviceAffinities(uid));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001697}
1698
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001699Status AudioPolicyService::setUserIdDeviceAffinities(
1700 int32_t userIdAidl,
1701 const std::vector<media::AudioDevice>& devicesAidl) {
1702 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
1703 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
1704 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
1705 aidl2legacy_AudioDeviceTypeAddress));
1706
Oscar Azucena90e77632019-11-27 17:12:28 -08001707 Mutex::Autolock _l(mLock);
1708 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001709 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08001710 }
1711 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001712 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08001713 }
1714 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001715 return binderStatusFromStatusT(mAudioPolicyManager->setUserIdDeviceAffinities(userId, devices));
Oscar Azucena90e77632019-11-27 17:12:28 -08001716}
1717
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001718Status AudioPolicyService::removeUserIdDeviceAffinities(int32_t userIdAidl) {
1719 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
1720
Oscar Azucena90e77632019-11-27 17:12:28 -08001721 Mutex::Autolock _l(mLock);
1722 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001723 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08001724 }
1725 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001726 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08001727 }
1728 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001729 return binderStatusFromStatusT(mAudioPolicyManager->removeUserIdDeviceAffinities(userId));
Oscar Azucena90e77632019-11-27 17:12:28 -08001730}
1731
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001732Status AudioPolicyService::startAudioSource(const media::AudioPortConfig& sourceAidl,
1733 const media::AudioAttributesInternal& attributesAidl,
1734 int32_t* _aidl_return) {
1735 audio_port_config source = VALUE_OR_RETURN_BINDER_STATUS(
1736 aidl2legacy_AudioPortConfig_audio_port_config(sourceAidl));
1737 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1738 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attributesAidl));
1739 audio_port_handle_t portId;
1740 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1741 AudioValidator::validateAudioPortConfig(source)));
1742 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1743 AudioValidator::validateAudioAttributes(attributes, "68953950")));
1744
Eric Laurent554a2772015-04-10 11:29:24 -07001745 Mutex::Autolock _l(mLock);
1746 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001747 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07001748 }
Hayden Gomes524159d2019-12-23 14:41:47 -08001749
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001750 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attributes.usage)));
Hayden Gomes524159d2019-12-23 14:41:47 -08001751
Hongwei Wang5cd1f1d2019-03-26 15:21:11 -07001752 // startAudioSource should be created as the calling uid
1753 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Eric Laurent10b71232018-04-13 18:14:44 -07001754 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001755 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1756 mAudioPolicyManager->startAudioSource(&source, &attributes, &portId, callingUid)));
1757 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
1758 return Status::ok();
Eric Laurent554a2772015-04-10 11:29:24 -07001759}
1760
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001761Status AudioPolicyService::stopAudioSource(int32_t portIdAidl)
Eric Laurent554a2772015-04-10 11:29:24 -07001762{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001763 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
1764 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1765
Eric Laurent554a2772015-04-10 11:29:24 -07001766 Mutex::Autolock _l(mLock);
1767 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001768 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07001769 }
Eric Laurent10b71232018-04-13 18:14:44 -07001770 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001771 return binderStatusFromStatusT(mAudioPolicyManager->stopAudioSource(portId));
Eric Laurent554a2772015-04-10 11:29:24 -07001772}
1773
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001774Status AudioPolicyService::setMasterMono(bool mono)
Andy Hung2ddee192015-12-18 17:34:44 -08001775{
1776 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001777 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08001778 }
1779 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001780 return binderStatusFromStatusT(PERMISSION_DENIED);
Andy Hung2ddee192015-12-18 17:34:44 -08001781 }
1782 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001783 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001784 return binderStatusFromStatusT(mAudioPolicyManager->setMasterMono(mono));
Andy Hung2ddee192015-12-18 17:34:44 -08001785}
1786
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001787Status AudioPolicyService::getMasterMono(bool* _aidl_return)
Andy Hung2ddee192015-12-18 17:34:44 -08001788{
1789 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001790 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08001791 }
1792 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001793 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001794 return binderStatusFromStatusT(mAudioPolicyManager->getMasterMono(_aidl_return));
Andy Hung2ddee192015-12-18 17:34:44 -08001795}
1796
Eric Laurentac9cef52017-06-09 15:46:26 -07001797
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001798Status AudioPolicyService::getStreamVolumeDB(media::AudioStreamType streamAidl, int32_t indexAidl,
1799 int32_t deviceAidl, float* _aidl_return) {
1800 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1801 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1802 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1803 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
1804 aidl2legacy_int32_t_audio_devices_t(deviceAidl));
1805
Eric Laurentac9cef52017-06-09 15:46:26 -07001806 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001807 return binderStatusFromStatusT(NO_INIT);
Eric Laurentac9cef52017-06-09 15:46:26 -07001808 }
1809 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001810 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001811 *_aidl_return = mAudioPolicyManager->getStreamVolumeDB(stream, index, device);
1812 return Status::ok();
Eric Laurentac9cef52017-06-09 15:46:26 -07001813}
1814
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001815Status AudioPolicyService::getSurroundFormats(
1816 bool reported, media::Int* count,
1817 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 Dang877b27e2021-02-02 12:10:40 +01001835 surroundFormatsEnabled.get(), reported)));
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
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001848Status AudioPolicyService::getHwOffloadEncodingFormatsSupportedForA2DP(
1849 std::vector<media::audio::common::AudioFormat>* _aidl_return) {
1850 std::vector<audio_format_t> formats;
1851
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001852 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001853 return binderStatusFromStatusT(NO_INIT);
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001854 }
1855 Mutex::Autolock _l(mLock);
1856 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001857 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1858 mAudioPolicyManager->getHwOffloadEncodingFormatsSupportedForA2DP(&formats)));
1859 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1860 convertContainer<std::vector<media::audio::common::AudioFormat>>(
1861 formats,
1862 legacy2aidl_audio_format_t_AudioFormat));
1863 return Status::ok();
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001864}
1865
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001866Status AudioPolicyService::setSurroundFormatEnabled(
1867 media::audio::common::AudioFormat audioFormatAidl, bool enabled) {
1868 audio_format_t audioFormat = VALUE_OR_RETURN_BINDER_STATUS(
1869 aidl2legacy_AudioFormat_audio_format_t(audioFormatAidl));
jiabin81772902018-04-02 17:52:27 -07001870 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001871 return binderStatusFromStatusT(NO_INIT);
jiabin81772902018-04-02 17:52:27 -07001872 }
1873 Mutex::Autolock _l(mLock);
1874 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001875 return binderStatusFromStatusT(
1876 mAudioPolicyManager->setSurroundFormatEnabled(audioFormat, enabled));
jiabin81772902018-04-02 17:52:27 -07001877}
Eric Laurentac9cef52017-06-09 15:46:26 -07001878
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001879Status AudioPolicyService::setAssistantUid(int32_t uidAidl)
Eric Laurentb78763e2018-10-17 10:08:02 -07001880{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001881 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Eric Laurentb78763e2018-10-17 10:08:02 -07001882 Mutex::Autolock _l(mLock);
1883 mUidPolicy->setAssistantUid(uid);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001884 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07001885}
1886
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001887Status AudioPolicyService::setA11yServicesUids(const std::vector<int32_t>& uidsAidl)
Eric Laurentb78763e2018-10-17 10:08:02 -07001888{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001889 size_t size = uidsAidl.size();
1890 if (size > MAX_ITEMS_PER_LIST) {
1891 size = MAX_ITEMS_PER_LIST;
1892 }
1893 std::vector<uid_t> uids;
1894 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1895 convertRange(uidsAidl.begin(),
1896 uidsAidl.begin() + size,
1897 std::back_inserter(uids),
1898 aidl2legacy_int32_t_uid_t)));
Eric Laurentb78763e2018-10-17 10:08:02 -07001899 Mutex::Autolock _l(mLock);
1900 mUidPolicy->setA11yUids(uids);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001901 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07001902}
1903
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001904Status AudioPolicyService::setCurrentImeUid(int32_t uidAidl)
Kohsuke Yatoha623a132020-03-24 20:10:26 -07001905{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001906 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Kohsuke Yatoha623a132020-03-24 20:10:26 -07001907 Mutex::Autolock _l(mLock);
1908 mUidPolicy->setCurrentImeUid(uid);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001909 return Status::ok();
Kohsuke Yatoha623a132020-03-24 20:10:26 -07001910}
1911
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001912Status AudioPolicyService::isHapticPlaybackSupported(bool* _aidl_return)
jiabin6012f912018-11-02 17:06:30 -07001913{
1914 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001915 return binderStatusFromStatusT(NO_INIT);
jiabin6012f912018-11-02 17:06:30 -07001916 }
1917 Mutex::Autolock _l(mLock);
1918 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001919 *_aidl_return = mAudioPolicyManager->isHapticPlaybackSupported();
1920 return Status::ok();
jiabin6012f912018-11-02 17:06:30 -07001921}
1922
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001923Status AudioPolicyService::listAudioProductStrategies(
1924 std::vector<media::AudioProductStrategy>* _aidl_return) {
1925 AudioProductStrategyVector strategies;
1926
François Gaffied0ba9ed2018-11-05 11:50:42 +01001927 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001928 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01001929 }
1930 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001931 RETURN_IF_BINDER_ERROR(
1932 binderStatusFromStatusT(mAudioPolicyManager->listAudioProductStrategies(strategies)));
1933 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1934 convertContainer<std::vector<media::AudioProductStrategy>>(
1935 strategies,
1936 legacy2aidl_AudioProductStrategy));
1937 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01001938}
1939
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001940Status AudioPolicyService::getProductStrategyFromAudioAttributes(
Francois Gaffie11b65922020-09-24 16:59:08 +02001941 const media::AudioAttributesEx& aaAidl, bool fallbackOnDefault, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001942 AudioAttributes aa = VALUE_OR_RETURN_BINDER_STATUS(
1943 aidl2legacy_AudioAttributesEx_AudioAttributes(aaAidl));
1944 product_strategy_t productStrategy;
1945
François Gaffied0ba9ed2018-11-05 11:50:42 +01001946 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001947 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01001948 }
1949 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001950 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02001951 mAudioPolicyManager->getProductStrategyFromAudioAttributes(
1952 aa, productStrategy, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001953 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1954 legacy2aidl_product_strategy_t_int32_t(productStrategy));
1955 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01001956}
1957
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001958Status AudioPolicyService::listAudioVolumeGroups(std::vector<media::AudioVolumeGroup>* _aidl_return)
François Gaffie4b2018b2018-11-07 11:18:59 +01001959{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001960 AudioVolumeGroupVector groups;
François Gaffie4b2018b2018-11-07 11:18:59 +01001961 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001962 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01001963 }
1964 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001965 RETURN_IF_BINDER_ERROR(
1966 binderStatusFromStatusT(mAudioPolicyManager->listAudioVolumeGroups(groups)));
1967 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1968 convertContainer<std::vector<media::AudioVolumeGroup>>(groups,
1969 legacy2aidl_AudioVolumeGroup));
1970 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01001971}
1972
Francois Gaffie11b65922020-09-24 16:59:08 +02001973Status AudioPolicyService::getVolumeGroupFromAudioAttributes(
1974 const media::AudioAttributesEx& aaAidl, bool fallbackOnDefault, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001975 AudioAttributes aa = VALUE_OR_RETURN_BINDER_STATUS(
1976 aidl2legacy_AudioAttributesEx_AudioAttributes(aaAidl));
1977 volume_group_t volumeGroup;
1978
François Gaffie4b2018b2018-11-07 11:18:59 +01001979 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001980 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01001981 }
1982 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001983 RETURN_IF_BINDER_ERROR(
1984 binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02001985 mAudioPolicyManager->getVolumeGroupFromAudioAttributes(
1986 aa, volumeGroup, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001987 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_volume_group_t_int32_t(volumeGroup));
1988 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01001989}
Eric Laurent6ede98f2019-06-11 14:50:30 -07001990
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001991Status AudioPolicyService::setRttEnabled(bool enabled)
Eric Laurent6ede98f2019-06-11 14:50:30 -07001992{
1993 Mutex::Autolock _l(mLock);
1994 mUidPolicy->setRttEnabled(enabled);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001995 return Status::ok();
Eric Laurent6ede98f2019-06-11 14:50:30 -07001996}
1997
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001998Status AudioPolicyService::isCallScreenModeSupported(bool* _aidl_return)
Eric Laurent8340e672019-11-06 11:01:08 -08001999{
2000 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002001 return binderStatusFromStatusT(NO_INIT);
Eric Laurent8340e672019-11-06 11:01:08 -08002002 }
2003 Mutex::Autolock _l(mLock);
2004 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002005 *_aidl_return = mAudioPolicyManager->isCallScreenModeSupported();
2006 return Status::ok();
Eric Laurent8340e672019-11-06 11:01:08 -08002007}
2008
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002009Status AudioPolicyService::setDevicesRoleForStrategy(
2010 int32_t strategyAidl,
2011 media::DeviceRole roleAidl,
2012 const std::vector<media::AudioDevice>& devicesAidl) {
2013 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2014 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2015 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2016 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2017 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2018 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2019 aidl2legacy_AudioDeviceTypeAddress));
2020
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002021 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002022 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002023 }
2024 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002025 return binderStatusFromStatusT(
2026 mAudioPolicyManager->setDevicesRoleForStrategy(strategy, role, devices));
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002027}
2028
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002029Status AudioPolicyService::removeDevicesRoleForStrategy(int32_t strategyAidl,
2030 media::DeviceRole roleAidl) {
2031 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2032 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2033 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2034 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2035 if (mAudioPolicyManager == NULL) {
2036 return binderStatusFromStatusT(NO_INIT);
2037 }
2038 Mutex::Autolock _l(mLock);
2039 return binderStatusFromStatusT(
2040 mAudioPolicyManager->removeDevicesRoleForStrategy(strategy, role));
2041}
2042
2043Status AudioPolicyService::getDevicesForRoleAndStrategy(
2044 int32_t strategyAidl,
2045 media::DeviceRole roleAidl,
2046 std::vector<media::AudioDevice>* _aidl_return) {
2047 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2048 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2049 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2050 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2051 AudioDeviceTypeAddrVector devices;
2052
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002053 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002054 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002055 }
2056 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002057 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2058 mAudioPolicyManager->getDevicesForRoleAndStrategy(strategy, role, devices)));
2059 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2060 convertContainer<std::vector<media::AudioDevice>>(devices,
2061 legacy2aidl_AudioDeviceTypeAddress));
2062 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002063}
2064
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002065Status AudioPolicyService::registerSoundTriggerCaptureStateListener(
2066 const sp<media::ICaptureStateListener>& listener, bool* _aidl_return) {
2067 *_aidl_return = mCaptureStateNotifier.RegisterListener(listener);
2068 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002069}
2070
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002071Status AudioPolicyService::setDevicesRoleForCapturePreset(
2072 media::AudioSourceType audioSourceAidl,
2073 media::DeviceRole roleAidl,
2074 const std::vector<media::AudioDevice>& devicesAidl) {
2075 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2076 aidl2legacy_AudioSourceType_audio_source_t(audioSourceAidl));
2077 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2078 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2079 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2080 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2081 aidl2legacy_AudioDeviceTypeAddress));
Ytai Ben-Tsvi85093d52020-03-26 09:41:15 -07002082
Jiabin Huang3b98d322020-09-03 17:54:16 +00002083 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002084 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002085 }
2086 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002087 return binderStatusFromStatusT(
2088 mAudioPolicyManager->setDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002089}
2090
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002091Status AudioPolicyService::addDevicesRoleForCapturePreset(
2092 media::AudioSourceType audioSourceAidl,
2093 media::DeviceRole roleAidl,
2094 const std::vector<media::AudioDevice>& devicesAidl) {
2095 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2096 aidl2legacy_AudioSourceType_audio_source_t(audioSourceAidl));
2097 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2098 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2099 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2100 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2101 aidl2legacy_AudioDeviceTypeAddress));
2102
Jiabin Huang3b98d322020-09-03 17:54:16 +00002103 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002104 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002105 }
2106 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002107 return binderStatusFromStatusT(
2108 mAudioPolicyManager->addDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002109}
2110
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002111Status AudioPolicyService::removeDevicesRoleForCapturePreset(
2112 media::AudioSourceType audioSourceAidl,
2113 media::DeviceRole roleAidl,
2114 const std::vector<media::AudioDevice>& devicesAidl) {
2115 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2116 aidl2legacy_AudioSourceType_audio_source_t(audioSourceAidl));
2117 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2118 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2119 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2120 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2121 aidl2legacy_AudioDeviceTypeAddress));
2122
2123 if (mAudioPolicyManager == nullptr) {
2124 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002125 }
2126 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002127 return binderStatusFromStatusT(
2128 mAudioPolicyManager->removeDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002129}
2130
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002131Status AudioPolicyService::clearDevicesRoleForCapturePreset(media::AudioSourceType audioSourceAidl,
2132 media::DeviceRole roleAidl) {
2133 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2134 aidl2legacy_AudioSourceType_audio_source_t(audioSourceAidl));
2135 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2136 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2137
Jiabin Huang3b98d322020-09-03 17:54:16 +00002138 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002139 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002140 }
2141 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002142 return binderStatusFromStatusT(
2143 mAudioPolicyManager->clearDevicesRoleForCapturePreset(audioSource, role));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002144}
2145
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002146Status AudioPolicyService::getDevicesForRoleAndCapturePreset(
2147 media::AudioSourceType audioSourceAidl,
2148 media::DeviceRole roleAidl,
2149 std::vector<media::AudioDevice>* _aidl_return) {
2150 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2151 aidl2legacy_AudioSourceType_audio_source_t(audioSourceAidl));
2152 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2153 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2154 AudioDeviceTypeAddrVector devices;
2155
Jiabin Huang3b98d322020-09-03 17:54:16 +00002156 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002157 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002158 }
2159 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002160 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2161 mAudioPolicyManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices)));
2162 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2163 convertContainer<std::vector<media::AudioDevice>>(devices,
2164 legacy2aidl_AudioDeviceTypeAddress));
2165 return Status::ok();
Jiabin Huang3b98d322020-09-03 17:54:16 +00002166}
2167
Mikhail Naganov1b2a7942017-12-08 10:18:09 -08002168} // namespace android