blob: db9be47be361eef9a34825247d3084d2c95e79f4 [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>
Svet Ganov3e5f14f2021-05-13 22:51:08 +000028#include <android/content/AttributionSourceState.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
Mikhail Naganov932cb962021-09-16 01:05:27 +000035#define RETURN_BINDER_STATUS_IF_ERROR(x) \
36 if (status_t _tmp = (x); _tmp != OK) return aidl_utils::binderStatusFromStatusT(_tmp);
37
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080038#define RETURN_IF_BINDER_ERROR(x) \
39 { \
40 binder::Status _tmp = (x); \
41 if (!_tmp.isOk()) return _tmp; \
42 }
43
44#define MAX_ITEMS_PER_LIST 1024
45
Eric Laurent2d388ec2014-03-07 13:25:54 -080046namespace android {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080047using binder::Status;
48using aidl_utils::binderStatusFromStatusT;
Svet Ganov3e5f14f2021-05-13 22:51:08 +000049using content::AttributionSourceState;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070050using media::audio::common::AudioConfig;
51using media::audio::common::AudioConfigBase;
Mikhail Naganovf4a75362021-09-16 00:02:54 +000052using media::audio::common::AudioDevice;
Mikhail Naganov932cb962021-09-16 01:05:27 +000053using media::audio::common::AudioDeviceAddress;
Mikhail Naganovf4a75362021-09-16 00:02:54 +000054using media::audio::common::AudioDeviceDescription;
Mikhail Naganov57bd06f2021-08-10 16:41:54 -070055using media::audio::common::AudioFormatDescription;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070056using media::audio::common::AudioMode;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070057using media::audio::common::AudioOffloadInfo;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070058using media::audio::common::AudioSource;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070059using media::audio::common::AudioStreamType;
60using media::audio::common::AudioUsage;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070061using media::audio::common::AudioUuid;
Mikhail Naganov0078ee52021-09-30 23:06:20 +000062using media::audio::common::Int;
Eric Laurent2d388ec2014-03-07 13:25:54 -080063
Hayden Gomes524159d2019-12-23 14:41:47 -080064const std::vector<audio_usage_t>& SYSTEM_USAGES = {
65 AUDIO_USAGE_CALL_ASSISTANT,
66 AUDIO_USAGE_EMERGENCY,
67 AUDIO_USAGE_SAFETY,
68 AUDIO_USAGE_VEHICLE_STATUS,
69 AUDIO_USAGE_ANNOUNCEMENT
70};
71
72bool isSystemUsage(audio_usage_t usage) {
73 return std::find(std::begin(SYSTEM_USAGES), std::end(SYSTEM_USAGES), usage)
74 != std::end(SYSTEM_USAGES);
75}
76
77bool AudioPolicyService::isSupportedSystemUsage(audio_usage_t usage) {
78 return std::find(std::begin(mSupportedSystemUsages), std::end(mSupportedSystemUsages), usage)
79 != std::end(mSupportedSystemUsages);
80}
81
82status_t AudioPolicyService::validateUsage(audio_usage_t usage) {
Svet Ganov3e5f14f2021-05-13 22:51:08 +000083 return validateUsage(usage, getCallingAttributionSource());
Hayden Gomes524159d2019-12-23 14:41:47 -080084}
85
Svet Ganov3e5f14f2021-05-13 22:51:08 +000086status_t AudioPolicyService::validateUsage(audio_usage_t usage,
87 const AttributionSourceState& attributionSource) {
Hayden Gomes524159d2019-12-23 14:41:47 -080088 if (isSystemUsage(usage)) {
89 if (isSupportedSystemUsage(usage)) {
Svet Ganov3e5f14f2021-05-13 22:51:08 +000090 if (!modifyAudioRoutingAllowed(attributionSource)) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -070091 ALOGE(("permission denied: modify audio routing not allowed "
Svet Ganov3e5f14f2021-05-13 22:51:08 +000092 "for attributionSource %s"), attributionSource.toString().c_str());
Hayden Gomes524159d2019-12-23 14:41:47 -080093 return PERMISSION_DENIED;
94 }
95 } else {
96 return BAD_VALUE;
97 }
98 }
99 return NO_ERROR;
100}
101
102
Eric Laurent2d388ec2014-03-07 13:25:54 -0800103
104// ----------------------------------------------------------------------------
105
Mikhail Naganov88b30d22020-03-09 19:43:13 +0000106void AudioPolicyService::doOnNewAudioModulesAvailable()
107{
108 if (mAudioPolicyManager == NULL) return;
109 Mutex::Autolock _l(mLock);
110 AutoCallerClear acc;
111 mAudioPolicyManager->onNewAudioModulesAvailable();
112}
113
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800114Status AudioPolicyService::setDeviceConnectionState(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000115 const AudioDevice& deviceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800116 media::AudioPolicyDeviceState stateAidl,
117 const std::string& deviceNameAidl,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700118 const AudioFormatDescription& encodedFormatAidl) {
Mikhail Naganov932cb962021-09-16 01:05:27 +0000119 audio_devices_t device;
120 std::string address;
121 RETURN_BINDER_STATUS_IF_ERROR(
122 aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800123 audio_policy_dev_state_t state = VALUE_OR_RETURN_BINDER_STATUS(
124 aidl2legacy_AudioPolicyDeviceState_audio_policy_dev_state_t(stateAidl));
125 audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -0700126 aidl2legacy_AudioFormatDescription_audio_format_t(encodedFormatAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800127
Eric Laurentdce54a12014-03-10 12:19:46 -0700128 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800129 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800130 }
131 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800132 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800133 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800134 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
135 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800136 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800137 }
138
139 ALOGV("setDeviceConnectionState()");
140 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700141 AutoCallerClear acc;
Mikhail Naganov932cb962021-09-16 01:05:27 +0000142 status_t status = mAudioPolicyManager->setDeviceConnectionState(
143 device, state, address.c_str(), deviceNameAidl.c_str(), encodedFormat);
Eric Laurent39095982021-08-24 18:29:27 +0200144 if (status == NO_ERROR) {
145 onCheckSpatializer_l();
146 }
147 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800148}
149
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000150Status AudioPolicyService::getDeviceConnectionState(const AudioDevice& deviceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800151 media::AudioPolicyDeviceState* _aidl_return) {
Mikhail Naganov932cb962021-09-16 01:05:27 +0000152 audio_devices_t device;
153 std::string address;
154 RETURN_BINDER_STATUS_IF_ERROR(
155 aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
Eric Laurentdce54a12014-03-10 12:19:46 -0700156 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800157 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
158 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
159 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
160 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800161 }
Eric Laurent10b71232018-04-13 18:14:44 -0700162 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800163 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
164 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
Mikhail Naganov932cb962021-09-16 01:05:27 +0000165 mAudioPolicyManager->getDeviceConnectionState(
166 device, address.c_str())));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800167 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800168}
169
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800170Status AudioPolicyService::handleDeviceConfigChange(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000171 const AudioDevice& deviceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800172 const std::string& deviceNameAidl,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700173 const AudioFormatDescription& encodedFormatAidl) {
Mikhail Naganov932cb962021-09-16 01:05:27 +0000174 audio_devices_t device;
175 std::string address;
176 RETURN_BINDER_STATUS_IF_ERROR(
177 aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800178 audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -0700179 aidl2legacy_AudioFormatDescription_audio_format_t(encodedFormatAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800180
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800181 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800182 return binderStatusFromStatusT(NO_INIT);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800183 }
184 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800185 return binderStatusFromStatusT(PERMISSION_DENIED);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800186 }
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800187
188 ALOGV("handleDeviceConfigChange()");
189 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700190 AutoCallerClear acc;
Eric Laurent39095982021-08-24 18:29:27 +0200191 status_t status = mAudioPolicyManager->handleDeviceConfigChange(
Mikhail Naganov932cb962021-09-16 01:05:27 +0000192 device, address.c_str(), deviceNameAidl.c_str(), encodedFormat);
Eric Laurent39095982021-08-24 18:29:27 +0200193
194 if (status == NO_ERROR) {
195 onCheckSpatializer_l();
196 }
197 return binderStatusFromStatusT(status);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800198}
199
Mikhail Naganovddceecc2021-09-03 13:58:56 -0700200Status AudioPolicyService::setPhoneState(AudioMode stateAidl, int32_t uidAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800201{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800202 audio_mode_t state = VALUE_OR_RETURN_BINDER_STATUS(
203 aidl2legacy_AudioMode_audio_mode_t(stateAidl));
204 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700205 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800206 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800207 }
208 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800209 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800210 }
211 if (uint32_t(state) >= AUDIO_MODE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800212 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800213 }
214
215 ALOGV("setPhoneState()");
216
Eric Laurentbeb07fe2015-09-16 15:49:30 -0700217 // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic
218 // operation from policy manager standpoint (no other operation (e.g track start or stop)
219 // can be interleaved).
220 Mutex::Autolock _l(mLock);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800221 // TODO: check if it is more appropriate to do it in platform specific policy manager
222 AudioSystem::setMode(state);
223
Eric Laurent10b71232018-04-13 18:14:44 -0700224 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700225 mAudioPolicyManager->setPhoneState(state);
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700226 mPhoneState = state;
Eric Laurent00dba062020-02-11 15:52:09 -0800227 mPhoneStateOwnerUid = uid;
Mingshu Pangd07c19b2021-02-25 11:40:32 +0800228 updateUidStates_l();
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800229 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800230}
231
Mikhail Naganovddceecc2021-09-03 13:58:56 -0700232Status AudioPolicyService::getPhoneState(AudioMode* _aidl_return) {
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700233 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800234 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_mode_t_AudioMode(mPhoneState));
235 return Status::ok();
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700236}
237
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800238Status AudioPolicyService::setForceUse(media::AudioPolicyForceUse usageAidl,
239 media::AudioPolicyForcedConfig configAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800240{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800241 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
242 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
243 audio_policy_forced_cfg_t config = VALUE_OR_RETURN_BINDER_STATUS(
244 aidl2legacy_AudioPolicyForcedConfig_audio_policy_forced_cfg_t(configAidl));
245
Eric Laurentdce54a12014-03-10 12:19:46 -0700246 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800247 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800248 }
Eric Laurente17378d2018-05-09 14:43:01 -0700249
250 if (!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800251 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800252 }
Eric Laurente17378d2018-05-09 14:43:01 -0700253
Eric Laurent2d388ec2014-03-07 13:25:54 -0800254 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800255 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800256 }
257 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800258 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800259 }
260 ALOGV("setForceUse()");
261 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700262 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700263 mAudioPolicyManager->setForceUse(usage, config);
Eric Laurent39095982021-08-24 18:29:27 +0200264 onCheckSpatializer_l();
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800265 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800266}
267
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800268Status AudioPolicyService::getForceUse(media::AudioPolicyForceUse usageAidl,
269 media::AudioPolicyForcedConfig* _aidl_return) {
270 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
271 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
272
Eric Laurentdce54a12014-03-10 12:19:46 -0700273 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800274 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800275 }
276 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800277 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
278 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(AUDIO_POLICY_FORCE_NONE));
279 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800280 }
Eric Laurent10b71232018-04-13 18:14:44 -0700281 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800282 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
283 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(
284 mAudioPolicyManager->getForceUse(usage)));
285 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800286}
287
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700288Status AudioPolicyService::getOutput(AudioStreamType streamAidl, int32_t* _aidl_return)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800289{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800290 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
291 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
292
Eric Laurent223fd5c2014-11-11 13:43:36 -0800293 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800294 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
295 legacy2aidl_audio_io_handle_t_int32_t(AUDIO_IO_HANDLE_NONE));
296 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -0700297 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700298 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800299 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800300 }
301 ALOGV("getOutput()");
302 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700303 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800304 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
305 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutput(stream)));
306 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800307}
308
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800309Status AudioPolicyService::getOutputForAttr(const media::AudioAttributesInternal& attrAidl,
310 int32_t sessionAidl,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000311 const AttributionSourceState& attributionSource,
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700312 const AudioConfig& configAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800313 int32_t flagsAidl,
Eric Laurentf99edd32021-02-01 15:57:33 +0100314 int32_t selectedDeviceIdAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800315 media::GetOutputForAttrResponse* _aidl_return)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700316{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800317 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
318 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
319 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
320 aidl2legacy_int32_t_audio_session_t(sessionAidl));
321 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800322 audio_config_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -0700323 aidl2legacy_AudioConfig_audio_config_t(configAidl, false /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800324 audio_output_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
325 aidl2legacy_int32_t_audio_output_flags_t_mask(flagsAidl));
Eric Laurentf99edd32021-02-01 15:57:33 +0100326 audio_port_handle_t selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
327 aidl2legacy_int32_t_audio_port_handle_t(selectedDeviceIdAidl));
328
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800329 audio_io_handle_t output;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800330 audio_port_handle_t portId;
331 std::vector<audio_io_handle_t> secondaryOutputs;
332
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700333 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800334 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700335 }
Hayden Gomes524159d2019-12-23 14:41:47 -0800336
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800337 RETURN_IF_BINDER_ERROR(
338 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000339 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attr.usage, attributionSource)));
Hayden Gomes524159d2019-12-23 14:41:47 -0800340
Eric Laurent8a1095a2019-11-08 14:44:16 -0800341 ALOGV("%s()", __func__);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700342 Mutex::Autolock _l(mLock);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700343
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700344 // TODO b/182392553: refactor or remove
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000345 AttributionSourceState adjAttributionSource = attributionSource;
Marco Nelissendcb346b2015-09-09 10:47:29 -0700346 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000347 if (!isAudioServerOrMediaServerUid(callingUid) || attributionSource.uid == -1) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700348 int32_t callingUidAidl = VALUE_OR_RETURN_BINDER_STATUS(
349 legacy2aidl_uid_t_int32_t(callingUid));
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000350 ALOGW_IF(attributionSource.uid != -1 && attributionSource.uid != callingUidAidl,
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700351 "%s uid %d tried to pass itself off as %d", __func__,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000352 callingUidAidl, attributionSource.uid);
353 adjAttributionSource.uid = callingUidAidl;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700354 }
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700355 if (!mPackageManager.allowPlaybackCapture(VALUE_OR_RETURN_BINDER_STATUS(
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000356 aidl2legacy_int32_t_uid_t(adjAttributionSource.uid)))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800357 attr.flags = static_cast<audio_flags_mask_t>(attr.flags | AUDIO_FLAG_NO_MEDIA_PROJECTION);
Eric Laurent42984412019-05-09 17:57:03 -0700358 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800359 if (((attr.flags & (AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)) != 0)
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000360 && !bypassInterruptionPolicyAllowed(adjAttributionSource)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800361 attr.flags = static_cast<audio_flags_mask_t>(
362 attr.flags & ~(AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE));
Kevin Rocard8be94972019-02-22 13:26:25 -0800363 }
Eric Laurent10b71232018-04-13 18:14:44 -0700364 AutoCallerClear acc;
Eric Laurent8a1095a2019-11-08 14:44:16 -0800365 AudioPolicyInterface::output_type_t outputType;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800366 status_t result = mAudioPolicyManager->getOutputForAttr(&attr, &output, session,
367 &stream,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000368 adjAttributionSource,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800369 &config,
370 &flags, &selectedDeviceId, &portId,
371 &secondaryOutputs,
372 &outputType);
Nadav Bar766fb022018-01-07 12:18:03 +0200373
374 // FIXME: Introduce a way to check for the the telephony device before opening the output
Eric Laurent8a1095a2019-11-08 14:44:16 -0800375 if (result == NO_ERROR) {
376 // enforce permission (if any) required for each type of input
377 switch (outputType) {
378 case AudioPolicyInterface::API_OUTPUT_LEGACY:
379 break;
380 case AudioPolicyInterface::API_OUTPUT_TELEPHONY_TX:
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000381 if (!modifyPhoneStateAllowed(adjAttributionSource)) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800382 ALOGE("%s() permission denied: modify phone state not allowed for uid %d",
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000383 __func__, adjAttributionSource.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800384 result = PERMISSION_DENIED;
385 }
386 break;
387 case AudioPolicyInterface::API_OUT_MIX_PLAYBACK:
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000388 if (!modifyAudioRoutingAllowed(adjAttributionSource)) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800389 ALOGE("%s() permission denied: modify audio routing not allowed for uid %d",
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000390 __func__, adjAttributionSource.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800391 result = PERMISSION_DENIED;
392 }
393 break;
394 case AudioPolicyInterface::API_OUTPUT_INVALID:
395 default:
396 LOG_ALWAYS_FATAL("%s() encountered an invalid output type %d",
397 __func__, (int)outputType);
398 }
Nadav Bar766fb022018-01-07 12:18:03 +0200399 }
Eric Laurentd7fe0862018-07-14 16:48:01 -0700400
401 if (result == NO_ERROR) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800402 sp<AudioPlaybackClient> client =
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000403 new AudioPlaybackClient(attr, output, adjAttributionSource, session,
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700404 portId, selectedDeviceId, stream);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800405 mAudioPlaybackClients.add(portId, client);
406
407 _aidl_return->output = VALUE_OR_RETURN_BINDER_STATUS(
408 legacy2aidl_audio_io_handle_t_int32_t(output));
409 _aidl_return->stream = VALUE_OR_RETURN_BINDER_STATUS(
410 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
411 _aidl_return->selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
412 legacy2aidl_audio_port_handle_t_int32_t(selectedDeviceId));
413 _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
414 legacy2aidl_audio_port_handle_t_int32_t(portId));
415 _aidl_return->secondaryOutputs = VALUE_OR_RETURN_BINDER_STATUS(
416 convertContainer<std::vector<int32_t>>(secondaryOutputs,
417 legacy2aidl_audio_io_handle_t_int32_t));
Eric Laurentd7fe0862018-07-14 16:48:01 -0700418 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800419 return binderStatusFromStatusT(result);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700420}
421
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700422void AudioPolicyService::getPlaybackClientAndEffects(audio_port_handle_t portId,
423 sp<AudioPlaybackClient>& client,
424 sp<AudioPolicyEffects>& effects,
425 const char *context)
426{
427 Mutex::Autolock _l(mLock);
428 const ssize_t index = mAudioPlaybackClients.indexOfKey(portId);
429 if (index < 0) {
430 ALOGE("%s AudioTrack client not found for portId %d", context, portId);
431 return;
432 }
433 client = mAudioPlaybackClients.valueAt(index);
434 effects = mAudioPolicyEffects;
435}
436
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800437Status AudioPolicyService::startOutput(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("startOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700445 sp<AudioPlaybackClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700446 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700447
448 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
449
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700450 if (audioPolicyEffects != 0) {
451 // create audio processors according to stream
Eric Laurentd7fe0862018-07-14 16:48:01 -0700452 status_t status = audioPolicyEffects->addOutputSessionEffects(
453 client->io, client->stream, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700454 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700455 ALOGW("Failed to add effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700456 }
457 }
458 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700459 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700460 status_t status = mAudioPolicyManager->startOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700461 if (status == NO_ERROR) {
462 client->active = true;
463 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800464 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800465}
466
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800467Status AudioPolicyService::stopOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800468{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800469 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
470 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700471 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800472 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800473 }
474 ALOGV("stopOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700475 mOutputCommandThread->stopOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800476 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800477}
478
Eric Laurentd7fe0862018-07-14 16:48:01 -0700479status_t AudioPolicyService::doStopOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800480{
Eric Laurentd7fe0862018-07-14 16:48:01 -0700481 ALOGV("doStopOutput");
482 sp<AudioPlaybackClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700483 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentd7fe0862018-07-14 16:48:01 -0700484
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700485 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
486
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700487 if (audioPolicyEffects != 0) {
488 // release audio processors from the stream
Eric Laurentd7fe0862018-07-14 16:48:01 -0700489 status_t status = audioPolicyEffects->releaseOutputSessionEffects(
490 client->io, client->stream, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700491 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700492 ALOGW("Failed to release effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700493 }
494 }
495 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700496 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700497 status_t status = mAudioPolicyManager->stopOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700498 if (status == NO_ERROR) {
499 client->active = false;
500 }
501 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800502}
503
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800504Status AudioPolicyService::releaseOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800505{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800506 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
507 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700508 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800509 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800510 }
511 ALOGV("releaseOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700512 mOutputCommandThread->releaseOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800513 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800514}
515
Eric Laurentd7fe0862018-07-14 16:48:01 -0700516void AudioPolicyService::doReleaseOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800517{
518 ALOGV("doReleaseOutput from tid %d", gettid());
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700519 sp<AudioPlaybackClient> client;
520 sp<AudioPolicyEffects> audioPolicyEffects;
521
522 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
523
524 if (audioPolicyEffects != 0 && client->active) {
525 // clean up effects if output was not stopped before being released
526 audioPolicyEffects->releaseOutputSessionEffects(
527 client->io, client->stream, client->session);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700528 }
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700529 Mutex::Autolock _l(mLock);
Eric Laurentd4007242019-03-27 12:42:16 -0700530 mAudioPlaybackClients.removeItem(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700531
Eric Laurent10b71232018-04-13 18:14:44 -0700532 // called from internal thread: no need to clear caller identity
Eric Laurent8fc147b2018-07-22 19:13:55 -0700533 mAudioPolicyManager->releaseOutput(portId);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800534}
535
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800536Status AudioPolicyService::getInputForAttr(const media::AudioAttributesInternal& attrAidl,
537 int32_t inputAidl,
538 int32_t riidAidl,
539 int32_t sessionAidl,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000540 const AttributionSourceState& attributionSource,
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700541 const AudioConfigBase& configAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800542 int32_t flagsAidl,
Eric Laurentf99edd32021-02-01 15:57:33 +0100543 int32_t selectedDeviceIdAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800544 media::GetInputForAttrResponse* _aidl_return) {
545 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
546 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
547 audio_io_handle_t input = VALUE_OR_RETURN_BINDER_STATUS(
548 aidl2legacy_int32_t_audio_io_handle_t(inputAidl));
549 audio_unique_id_t riid = VALUE_OR_RETURN_BINDER_STATUS(
550 aidl2legacy_int32_t_audio_unique_id_t(riidAidl));
551 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
552 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800553 audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -0700554 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl, true /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800555 audio_input_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
556 aidl2legacy_int32_t_audio_input_flags_t_mask(flagsAidl));
Eric Laurentf99edd32021-02-01 15:57:33 +0100557 audio_port_handle_t selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
558 aidl2legacy_int32_t_audio_port_handle_t(selectedDeviceIdAidl));
559
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800560 audio_port_handle_t portId;
561
Eric Laurentdce54a12014-03-10 12:19:46 -0700562 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800563 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800564 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800565
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800566 RETURN_IF_BINDER_ERROR(
567 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Hayden Gomes524159d2019-12-23 14:41:47 -0800568
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800569 audio_source_t inputSource = attr.source;
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900570 if (inputSource == AUDIO_SOURCE_DEFAULT) {
571 inputSource = AUDIO_SOURCE_MIC;
572 }
573
Eric Laurent2d388ec2014-03-07 13:25:54 -0800574 // already checked by client, but double-check in case the client wrapper is bypassed
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900575 if ((inputSource < AUDIO_SOURCE_DEFAULT)
576 || (inputSource >= AUDIO_SOURCE_CNT
577 && inputSource != AUDIO_SOURCE_HOTWORD
578 && inputSource != AUDIO_SOURCE_FM_TUNER
579 && inputSource != AUDIO_SOURCE_ECHO_REFERENCE)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800580 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800581 }
582
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000583 // Make sure attribution source represents the current caller
584 AttributionSourceState adjAttributionSource = attributionSource;
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700585 // TODO b/182392553: refactor or remove
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000586 bool updatePid = (attributionSource.pid == -1);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700587 const uid_t callingUid =IPCThreadState::self()->getCallingUid();
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000588 const uid_t currentUid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(
589 attributionSource.uid));
Andy Hung4ef19fa2018-05-15 19:35:29 -0700590 if (!isAudioServerOrMediaServerUid(callingUid)) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700591 ALOGW_IF(currentUid != (uid_t)-1 && currentUid != callingUid,
592 "%s uid %d tried to pass itself off as %d", __FUNCTION__, callingUid,
593 currentUid);
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000594 adjAttributionSource.uid = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_uid_t_int32_t(
595 callingUid));
Eric Laurentb2379ba2016-05-23 17:42:12 -0700596 updatePid = true;
597 }
598
599 if (updatePid) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700600 const int32_t callingPid = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_pid_t_int32_t(
601 IPCThreadState::self()->getCallingPid()));
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000602 ALOGW_IF(attributionSource.pid != -1 && attributionSource.pid != callingPid,
Eric Laurentb2379ba2016-05-23 17:42:12 -0700603 "%s uid %d pid %d tried to pass itself off as pid %d",
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000604 __func__, adjAttributionSource.uid, callingPid, attributionSource.pid);
605 adjAttributionSource.pid = callingPid;
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700606 }
607
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000608 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attr.usage,
609 adjAttributionSource)));
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700610
Eric Laurent58a0dd82019-10-24 12:42:17 -0700611 // check calling permissions.
Hayden Gomesb7429922020-12-11 13:59:18 -0800612 // Capturing from FM_TUNER source is controlled by captureTunerAudioInputAllowed() and
613 // captureAudioOutputAllowed() (deprecated) as this does not affect users privacy
614 // as does capturing from an actual microphone.
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000615 if (!(recordingAllowed(adjAttributionSource, attr.source)
616 || attr.source == AUDIO_SOURCE_FM_TUNER)) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700617 ALOGE("%s permission denied: recording not allowed for %s",
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000618 __func__, adjAttributionSource.toString().c_str());
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800619 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800620 }
621
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000622 bool canCaptureOutput = captureAudioOutputAllowed(adjAttributionSource);
Ricardo Correa57a37692020-03-23 17:27:25 -0700623 if ((inputSource == AUDIO_SOURCE_VOICE_UPLINK ||
624 inputSource == AUDIO_SOURCE_VOICE_DOWNLINK ||
625 inputSource == AUDIO_SOURCE_VOICE_CALL ||
Hayden Gomesb7429922020-12-11 13:59:18 -0800626 inputSource == AUDIO_SOURCE_ECHO_REFERENCE)
627 && !canCaptureOutput) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800628 return binderStatusFromStatusT(PERMISSION_DENIED);
Hayden Gomesb7429922020-12-11 13:59:18 -0800629 }
630
631 if (inputSource == AUDIO_SOURCE_FM_TUNER
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000632 && !captureTunerAudioInputAllowed(adjAttributionSource)
Hayden Gomesb7429922020-12-11 13:59:18 -0800633 && !canCaptureOutput) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800634 return binderStatusFromStatusT(PERMISSION_DENIED);
Nadav Bar744be482018-05-08 13:26:21 +0300635 }
636
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000637 bool canCaptureHotword = captureHotwordAllowed(adjAttributionSource);
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900638 if ((inputSource == AUDIO_SOURCE_HOTWORD) && !canCaptureHotword) {
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800639 return binderStatusFromStatusT(PERMISSION_DENIED);
640 }
641
642 if (((flags & AUDIO_INPUT_FLAG_HW_HOTWORD) != 0)
643 && !canCaptureHotword) {
644 ALOGE("%s: permission denied: hotword mode not allowed"
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000645 " for uid %d pid %d", __func__, adjAttributionSource.uid, adjAttributionSource.pid);
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800646 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7504b9e2017-08-15 18:17:26 -0700647 }
648
649 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700650 {
Eric Laurent7504b9e2017-08-15 18:17:26 -0700651 status_t status;
652 AudioPolicyInterface::input_type_t inputType;
653
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700654 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700655 {
656 AutoCallerClear acc;
657 // the audio_in_acoustics_t parameter is ignored by get_input()
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700658 status = mAudioPolicyManager->getInputForAttr(&attr, &input, riid, session,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000659 adjAttributionSource, &config,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800660 flags, &selectedDeviceId,
661 &inputType, &portId);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700662
Eric Laurent10b71232018-04-13 18:14:44 -0700663 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700664 audioPolicyEffects = mAudioPolicyEffects;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800665
666 if (status == NO_ERROR) {
667 // enforce permission (if any) required for each type of input
668 switch (inputType) {
Kevin Rocard25f9b052019-02-27 15:08:54 -0800669 case AudioPolicyInterface::API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK:
670 // this use case has been validated in audio service with a MediaProjection token,
671 // and doesn't rely on regular permissions
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800672 case AudioPolicyInterface::API_INPUT_LEGACY:
673 break;
Eric Laurent82db2692015-08-07 13:59:42 -0700674 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX:
675 // FIXME: use the same permission as for remote submix for now.
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800676 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
Eric Laurent1ff16a72019-03-14 18:35:04 -0700677 if (!canCaptureOutput) {
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800678 ALOGE("getInputForAttr() permission denied: capture not allowed");
679 status = PERMISSION_DENIED;
680 }
681 break;
682 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE:
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000683 if (!modifyAudioRoutingAllowed(adjAttributionSource)) {
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800684 ALOGE("getInputForAttr() permission denied: modify audio routing not allowed");
685 status = PERMISSION_DENIED;
686 }
687 break;
688 case AudioPolicyInterface::API_INPUT_INVALID:
689 default:
690 LOG_ALWAYS_FATAL("getInputForAttr() encountered an invalid input type %d",
691 (int)inputType);
692 }
693 }
694
695 if (status != NO_ERROR) {
696 if (status == PERMISSION_DENIED) {
Eric Laurent10b71232018-04-13 18:14:44 -0700697 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800698 mAudioPolicyManager->releaseInput(portId);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800699 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800700 return binderStatusFromStatusT(status);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800701 }
Eric Laurentfee19762018-01-29 18:44:13 -0800702
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700703 sp<AudioRecordClient> client = new AudioRecordClient(attr, input, session, portId,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000704 selectedDeviceId, adjAttributionSource,
Eric Laurented726cc2021-07-01 14:26:41 +0200705 canCaptureOutput, canCaptureHotword,
Eric Laurent9925db52021-07-20 16:03:34 +0200706 mOutputCommandThread);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800707 mAudioRecordClients.add(portId, client);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700708 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800709
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700710 if (audioPolicyEffects != 0) {
711 // create audio pre processors according to input source
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800712 status_t status = audioPolicyEffects->addInputEffects(input, inputSource, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700713 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800714 ALOGW("Failed to add effects on input %d", input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700715 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800716 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800717
718 _aidl_return->input = VALUE_OR_RETURN_BINDER_STATUS(
719 legacy2aidl_audio_io_handle_t_int32_t(input));
720 _aidl_return->selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
721 legacy2aidl_audio_port_handle_t_int32_t(selectedDeviceId));
722 _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
723 legacy2aidl_audio_port_handle_t_int32_t(portId));
724 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800725}
726
Eric Laurent99fcae42018-05-17 16:59:18 -0700727std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) {
jiabin19cdba52020-11-24 11:28:58 -0800728 struct audio_port_v7 port = {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700729 port.id = portId;
730 status_t status = mAudioPolicyManager->getAudioPort(&port);
731 if (status == NO_ERROR && port.type == AUDIO_PORT_TYPE_DEVICE) {
Andy Hung9b181952019-02-25 14:53:36 -0800732 return toString(port.ext.device.type);
Eric Laurent99fcae42018-05-17 16:59:18 -0700733 }
Andy Hung9b181952019-02-25 14:53:36 -0800734 return {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700735}
736
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800737Status AudioPolicyService::startInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800738{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800739 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
740 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
741
Eric Laurentdce54a12014-03-10 12:19:46 -0700742 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800743 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800744 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800745 sp<AudioRecordClient> client;
746 {
747 Mutex::Autolock _l(mLock);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800748
Eric Laurent7dca8a82018-01-29 18:44:26 -0800749 ssize_t index = mAudioRecordClients.indexOfKey(portId);
750 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800751 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800752 }
753 client = mAudioRecordClients.valueAt(index);
Eric Laurentfee19762018-01-29 18:44:13 -0800754 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800755
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700756 std::stringstream msg;
757 msg << "Audio recording on session " << client->session;
758
Eric Laurent7dca8a82018-01-29 18:44:26 -0800759 // check calling permissions
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000760 if (!(startRecording(client->attributionSource, String16(msg.str().c_str()),
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700761 client->attributes.source)
Eric Laurent58a0dd82019-10-24 12:42:17 -0700762 || client->attributes.source == AUDIO_SOURCE_FM_TUNER)) {
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000763 ALOGE("%s permission denied: recording not allowed for attribution source %s",
764 __func__, client->attributionSource.toString().c_str());
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800765 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800766 }
Eric Laurentfee19762018-01-29 18:44:13 -0800767
Eric Laurentdf628922018-12-06 21:45:51 +0000768 Mutex::Autolock _l(mLock);
Eric Laurent4eb58f12018-12-07 16:41:02 -0800769
770 client->active = true;
771 client->startTimeNs = systemTime();
772 updateUidStates_l();
Eric Laurentfee19762018-01-29 18:44:13 -0800773
Eric Laurent10b71232018-04-13 18:14:44 -0700774 status_t status;
775 {
776 AutoCallerClear acc;
Eric Laurent4eb58f12018-12-07 16:41:02 -0800777 status = mAudioPolicyManager->startInput(portId);
Ray Essick84e84a52018-05-03 18:45:07 -0700778
779 }
780
Ray Essickf6a57cd2018-05-22 16:20:54 -0700781 // including successes gets very verbose
Muhammad Qureshi087b37c2020-06-16 16:37:36 -0700782 // but once we cut over to statsd, log them all.
Ray Essickf6a57cd2018-05-22 16:20:54 -0700783 if (status != NO_ERROR) {
Ray Essick84e84a52018-05-03 18:45:07 -0700784
785 static constexpr char kAudioPolicy[] = "audiopolicy";
786
Ray Essick84e84a52018-05-03 18:45:07 -0700787 static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status";
788 static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src";
789 static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg";
790 static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session";
Eric Laurent99fcae42018-05-17 16:59:18 -0700791 static constexpr char kAudioPolicyRqstDevice[] =
792 "android.media.audiopolicy.rqst.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700793 static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src";
794 static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg";
Eric Laurent99fcae42018-05-17 16:59:18 -0700795 static constexpr char kAudioPolicyActiveSession[] =
796 "android.media.audiopolicy.active.session";
797 static constexpr char kAudioPolicyActiveDevice[] =
798 "android.media.audiopolicy.active.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700799
Ray Essickf27e9872019-12-07 06:28:46 -0800800 mediametrics::Item *item = mediametrics::Item::create(kAudioPolicy);
Ray Essick84e84a52018-05-03 18:45:07 -0700801 if (item != NULL) {
802
Ray Essick84e84a52018-05-03 18:45:07 -0700803 item->setInt32(kAudioPolicyStatus, status);
804
Eric Laurent99fcae42018-05-17 16:59:18 -0700805 item->setCString(kAudioPolicyRqstSrc,
Andy Hung9b181952019-02-25 14:53:36 -0800806 toString(client->attributes.source).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700807 item->setInt32(kAudioPolicyRqstSession, client->session);
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000808 if (client->attributionSource.packageName.has_value() &&
809 client->attributionSource.packageName.value().size() != 0) {
Ray Essick51866952018-05-30 11:22:27 -0700810 item->setCString(kAudioPolicyRqstPkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000811 client->attributionSource.packageName.value().c_str());
Ray Essick51866952018-05-30 11:22:27 -0700812 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700813 item->setCString(kAudioPolicyRqstPkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000814 std::to_string(client->attributionSource.uid).c_str());
Ray Essick51866952018-05-30 11:22:27 -0700815 }
Eric Laurent99fcae42018-05-17 16:59:18 -0700816 item->setCString(
817 kAudioPolicyRqstDevice, getDeviceTypeStrForPortId(client->deviceId).c_str());
818
Eric Laurent4eb58f12018-12-07 16:41:02 -0800819 int count = mAudioRecordClients.size();
820 for (int i = 0; i < count ; i++) {
821 if (portId == mAudioRecordClients.keyAt(i)) {
822 continue;
823 }
824 sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
825 if (other->active) {
826 // keeps the last of the clients marked active
827 item->setCString(kAudioPolicyActiveSrc,
Andy Hung9b181952019-02-25 14:53:36 -0800828 toString(other->attributes.source).c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -0800829 item->setInt32(kAudioPolicyActiveSession, other->session);
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000830 if (other->attributionSource.packageName.has_value() &&
831 other->attributionSource.packageName.value().size() != 0) {
Eric Laurent4eb58f12018-12-07 16:41:02 -0800832 item->setCString(kAudioPolicyActivePkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000833 other->attributionSource.packageName.value().c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -0800834 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700835 item->setCString(kAudioPolicyRqstPkg, std::to_string(
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000836 other->attributionSource.uid).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700837 }
Eric Laurent4eb58f12018-12-07 16:41:02 -0800838 item->setCString(kAudioPolicyActiveDevice,
839 getDeviceTypeStrForPortId(other->deviceId).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700840 }
841 }
842 item->selfrecord();
843 delete item;
844 item = NULL;
845 }
Ray Essick6ce27e52019-02-15 10:58:05 -0800846 }
847
848 if (status != NO_ERROR) {
Eric Laurent4eb58f12018-12-07 16:41:02 -0800849 client->active = false;
850 client->startTimeNs = 0;
851 updateUidStates_l();
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000852 finishRecording(client->attributionSource, client->attributes.source);
Eric Laurentfb66dd92016-01-28 18:32:03 -0800853 }
854
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800855 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800856}
857
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800858Status AudioPolicyService::stopInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800859{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800860 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
861 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
862
Eric Laurentdce54a12014-03-10 12:19:46 -0700863 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800864 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800865 }
Eric Laurent4eb58f12018-12-07 16:41:02 -0800866
Eric Laurent2d388ec2014-03-07 13:25:54 -0800867 Mutex::Autolock _l(mLock);
868
Eric Laurentfee19762018-01-29 18:44:13 -0800869 ssize_t index = mAudioRecordClients.indexOfKey(portId);
870 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800871 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurentfee19762018-01-29 18:44:13 -0800872 }
873 sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
874
Ray Essick84e84a52018-05-03 18:45:07 -0700875 client->active = false;
Eric Laurent4eb58f12018-12-07 16:41:02 -0800876 client->startTimeNs = 0;
877
878 updateUidStates_l();
Ray Essick84e84a52018-05-03 18:45:07 -0700879
Svet Ganov6e641372018-03-02 09:21:30 -0800880 // finish the recording app op
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000881 finishRecording(client->attributionSource, client->attributes.source);
Eric Laurent10b71232018-04-13 18:14:44 -0700882 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800883 return binderStatusFromStatusT(mAudioPolicyManager->stopInput(portId));
Eric Laurent2d388ec2014-03-07 13:25:54 -0800884}
885
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800886Status AudioPolicyService::releaseInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800887{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800888 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
889 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
890
Eric Laurentdce54a12014-03-10 12:19:46 -0700891 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800892 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800893 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700894 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -0800895 sp<AudioRecordClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700896 {
897 Mutex::Autolock _l(mLock);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700898 audioPolicyEffects = mAudioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -0800899 ssize_t index = mAudioRecordClients.indexOfKey(portId);
900 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800901 return Status::ok();
Eric Laurentfee19762018-01-29 18:44:13 -0800902 }
903 client = mAudioRecordClients.valueAt(index);
Eric Laurent4eb58f12018-12-07 16:41:02 -0800904
905 if (client->active) {
906 ALOGW("%s releasing active client portId %d", __FUNCTION__, portId);
907 client->active = false;
908 client->startTimeNs = 0;
909 updateUidStates_l();
910 }
911
Eric Laurentfee19762018-01-29 18:44:13 -0800912 mAudioRecordClients.removeItem(portId);
913 }
914 if (client == 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800915 return Status::ok();
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700916 }
917 if (audioPolicyEffects != 0) {
918 // release audio processors from the input
Eric Laurentd7fe0862018-07-14 16:48:01 -0700919 status_t status = audioPolicyEffects->releaseInputEffects(client->io, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700920 if(status != NO_ERROR) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700921 ALOGW("Failed to release effects on input %d", client->io);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700922 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800923 }
Eric Laurentf10c7092016-12-06 17:09:56 -0800924 {
925 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700926 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700927 mAudioPolicyManager->releaseInput(portId);
Eric Laurentf10c7092016-12-06 17:09:56 -0800928 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800929 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800930}
931
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700932Status AudioPolicyService::initStreamVolume(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800933 int32_t indexMinAidl,
934 int32_t indexMaxAidl) {
935 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
936 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
937 int indexMin = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMinAidl));
938 int indexMax = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMaxAidl));
939
Eric Laurentdce54a12014-03-10 12:19:46 -0700940 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800941 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800942 }
943 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800944 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800945 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800946 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800947 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800948 }
949 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700950 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700951 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800952 return binderStatusFromStatusT(NO_ERROR);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800953}
954
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700955Status AudioPolicyService::setStreamVolumeIndex(AudioStreamType streamAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000956 const AudioDeviceDescription& deviceAidl,
Mikhail Naganov21a32ec2021-07-08 14:40:12 -0700957 int32_t indexAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800958 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
959 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
960 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
961 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -0700962 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800963
Eric Laurentdce54a12014-03-10 12:19:46 -0700964 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800965 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800966 }
967 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800968 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800969 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800970 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800971 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800972 }
973 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700974 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800975 return binderStatusFromStatusT(mAudioPolicyManager->setStreamVolumeIndex(stream,
976 index,
977 device));
Eric Laurent2d388ec2014-03-07 13:25:54 -0800978}
979
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700980Status AudioPolicyService::getStreamVolumeIndex(AudioStreamType streamAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000981 const AudioDeviceDescription& deviceAidl,
Mikhail Naganov21a32ec2021-07-08 14:40:12 -0700982 int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800983 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
984 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
985 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -0700986 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800987 int index;
988
Eric Laurentdce54a12014-03-10 12:19:46 -0700989 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800990 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800991 }
Eric Laurent223fd5c2014-11-11 13:43:36 -0800992 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800993 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800994 }
995 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -0700996 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800997 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
998 mAudioPolicyManager->getStreamVolumeIndex(stream, &index, device)));
999 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1000 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001001}
1002
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001003Status AudioPolicyService::setVolumeIndexForAttributes(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001004 const media::AudioAttributesInternal& attrAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001005 const AudioDeviceDescription& deviceAidl, int32_t indexAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001006 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1007 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
1008 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1009 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001010 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001011 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1012 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1013
François Gaffiecfe17322018-11-07 13:41:29 +01001014 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001015 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001016 }
1017 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001018 return binderStatusFromStatusT(PERMISSION_DENIED);
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 binderStatusFromStatusT(
1023 mAudioPolicyManager->setVolumeIndexForAttributes(attributes, index, device));
François Gaffiecfe17322018-11-07 13:41:29 +01001024}
1025
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001026Status AudioPolicyService::getVolumeIndexForAttributes(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001027 const media::AudioAttributesInternal& attrAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001028 const AudioDeviceDescription& deviceAidl, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001029 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1030 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
1031 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001032 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001033 int index;
1034 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1035 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1036
François Gaffiecfe17322018-11-07 13:41:29 +01001037 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001038 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001039 }
1040 Mutex::Autolock _l(mLock);
1041 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001042 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1043 mAudioPolicyManager->getVolumeIndexForAttributes(attributes, index, device)));
1044 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1045 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001046}
1047
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001048Status AudioPolicyService::getMinVolumeIndexForAttributes(
1049 const media::AudioAttributesInternal& attrAidl, int32_t* _aidl_return) {
1050 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1051 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
1052 int index;
1053 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1054 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1055
François Gaffiecfe17322018-11-07 13:41:29 +01001056 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001057 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001058 }
1059 Mutex::Autolock _l(mLock);
1060 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001061 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1062 mAudioPolicyManager->getMinVolumeIndexForAttributes(attributes, index)));
1063 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1064 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001065}
1066
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001067Status AudioPolicyService::getMaxVolumeIndexForAttributes(
1068 const media::AudioAttributesInternal& attrAidl, int32_t* _aidl_return) {
1069 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1070 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl));
1071 int index;
1072 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1073 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1074
François Gaffiecfe17322018-11-07 13:41:29 +01001075 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001076 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001077 }
1078 Mutex::Autolock _l(mLock);
1079 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001080 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1081 mAudioPolicyManager->getMaxVolumeIndexForAttributes(attributes, index)));
1082 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1083 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001084}
1085
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001086Status AudioPolicyService::getStrategyForStream(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001087 int32_t* _aidl_return) {
1088 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1089 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1090
Eric Laurent223fd5c2014-11-11 13:43:36 -08001091 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001092 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1093 convertReinterpret<int32_t>(PRODUCT_STRATEGY_NONE));
1094 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001095 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001096 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001097 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001098 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001099
François Gaffiec005e562018-11-06 15:04:49 +01001100 // DO NOT LOCK, may be called from AudioFlinger with lock held, reaching deadlock
Eric Laurent10b71232018-04-13 18:14:44 -07001101 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001102 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1103 legacy2aidl_product_strategy_t_int32_t(
1104 mAudioPolicyManager->getStrategyForStream(stream)));
1105 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001106}
1107
1108//audio policy: use audio_device_t appropriately
1109
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001110Status AudioPolicyService::getDevicesForStream(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001111 AudioStreamType streamAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001112 std::vector<AudioDeviceDescription>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001113 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1114 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1115
Eric Laurent223fd5c2014-11-11 13:43:36 -08001116 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001117 *_aidl_return = std::vector<AudioDeviceDescription>{};
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001118 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001119 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001120 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001121 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001122 }
Haynes Mathew Georgedfb9f3b2015-10-26 18:22:13 -07001123 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001124 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001125 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001126 convertContainer<std::vector<AudioDeviceDescription>>(
Mikhail Naganov5478fc12021-07-08 16:13:29 -07001127 mAudioPolicyManager->getDevicesForStream(stream),
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001128 legacy2aidl_audio_devices_t_AudioDeviceDescription));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001129 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001130}
1131
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001132Status AudioPolicyService::getDevicesForAttributes(const media::AudioAttributesEx& attrAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001133 std::vector<AudioDevice>* _aidl_return)
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001134{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001135 AudioAttributes aa = VALUE_OR_RETURN_BINDER_STATUS(
1136 aidl2legacy_AudioAttributesEx_AudioAttributes(attrAidl));
1137 AudioDeviceTypeAddrVector devices;
1138
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001139 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001140 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001141 }
1142 Mutex::Autolock _l(mLock);
1143 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001144 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1145 mAudioPolicyManager->getDevicesForAttributes(aa.getAttributes(), &devices)));
1146 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001147 convertContainer<std::vector<AudioDevice>>(devices,
1148 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001149 return Status::ok();
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001150}
1151
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001152Status AudioPolicyService::getOutputForEffect(const media::EffectDescriptor& descAidl,
1153 int32_t* _aidl_return) {
1154 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1155 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1156 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1157 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1158
Eric Laurentdce54a12014-03-10 12:19:46 -07001159 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001160 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001161 }
1162 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001163 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001164 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1165 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutputForEffect(&desc)));
1166 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001167}
1168
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001169Status AudioPolicyService::registerEffect(const media::EffectDescriptor& descAidl, int32_t ioAidl,
1170 int32_t strategyAidl, int32_t sessionAidl,
1171 int32_t idAidl) {
1172 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1173 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1174 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1175 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1176 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
1177 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
1178 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1179 aidl2legacy_int32_t_audio_session_t(sessionAidl));
1180 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
1181 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1182 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1183
Eric Laurentdce54a12014-03-10 12:19:46 -07001184 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001185 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001186 }
Eric Laurent6c796322019-04-09 14:13:17 -07001187 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001188 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001189 return binderStatusFromStatusT(
1190 mAudioPolicyManager->registerEffect(&desc, io, strategy, session, id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001191}
1192
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001193Status AudioPolicyService::unregisterEffect(int32_t idAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001194{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001195 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001196 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001197 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001198 }
Eric Laurent6c796322019-04-09 14:13:17 -07001199 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001200 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001201 return binderStatusFromStatusT(mAudioPolicyManager->unregisterEffect(id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001202}
1203
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001204Status AudioPolicyService::setEffectEnabled(int32_t idAidl, bool enabled)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001205{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001206 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001207 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001208 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001209 }
Eric Laurent6c796322019-04-09 14:13:17 -07001210 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001211 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001212 return binderStatusFromStatusT(mAudioPolicyManager->setEffectEnabled(id, enabled));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001213}
1214
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001215Status AudioPolicyService::moveEffectsToIo(const std::vector<int32_t>& idsAidl, int32_t ioAidl)
1216
Eric Laurent6c796322019-04-09 14:13:17 -07001217{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001218 const std::vector<int>& ids = VALUE_OR_RETURN_BINDER_STATUS(
1219 convertContainer<std::vector<int>>(idsAidl, convertReinterpret<int, int32_t>));
1220 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1221 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1222 if (ids.size() > MAX_ITEMS_PER_LIST) {
1223 return binderStatusFromStatusT(BAD_VALUE);
1224 }
1225
Eric Laurent6c796322019-04-09 14:13:17 -07001226 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001227 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6c796322019-04-09 14:13:17 -07001228 }
1229 Mutex::Autolock _l(mLock);
1230 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001231 return binderStatusFromStatusT(mAudioPolicyManager->moveEffectsToIo(ids, io));
Eric Laurent6c796322019-04-09 14:13:17 -07001232}
1233
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001234Status AudioPolicyService::isStreamActive(AudioStreamType streamAidl, int32_t inPastMsAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001235 bool* _aidl_return) {
1236 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1237 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1238 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1239
Eric Laurent223fd5c2014-11-11 13:43:36 -08001240 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001241 *_aidl_return = false;
1242 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001243 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001244 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001245 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001246 }
1247 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001248 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001249 *_aidl_return = mAudioPolicyManager->isStreamActive(stream, inPastMs);
1250 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001251}
1252
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001253Status AudioPolicyService::isStreamActiveRemotely(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001254 int32_t inPastMsAidl,
1255 bool* _aidl_return) {
1256 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1257 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1258 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1259
Eric Laurent223fd5c2014-11-11 13:43:36 -08001260 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001261 *_aidl_return = false;
1262 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001263 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001264 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001265 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001266 }
1267 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001268 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001269 *_aidl_return = mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
1270 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001271}
1272
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001273Status AudioPolicyService::isSourceActive(AudioSource sourceAidl, bool* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001274 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001275 aidl2legacy_AudioSource_audio_source_t(sourceAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001276 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001277 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001278 }
1279 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001280 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001281 *_aidl_return = mAudioPolicyManager->isSourceActive(source);
1282 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001283}
1284
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001285status_t AudioPolicyService::getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001286{
Eric Laurentdce54a12014-03-10 12:19:46 -07001287 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -08001288 return NO_INIT;
1289 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001290 {
1291 Mutex::Autolock _l(mLock);
1292 audioPolicyEffects = mAudioPolicyEffects;
1293 }
1294 if (audioPolicyEffects == 0) {
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001295 return NO_INIT;
1296 }
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001297
1298 return OK;
1299}
1300
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001301Status AudioPolicyService::queryDefaultPreProcessing(
1302 int32_t audioSessionAidl,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001303 Int* countAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001304 std::vector<media::EffectDescriptor>* _aidl_return) {
1305 audio_session_t audioSession = VALUE_OR_RETURN_BINDER_STATUS(
1306 aidl2legacy_int32_t_audio_session_t(audioSessionAidl));
1307 uint32_t count = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(countAidl->value));
1308 if (count > AudioEffect::kMaxPreProcessing) {
1309 count = AudioEffect::kMaxPreProcessing;
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001310 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001311 uint32_t countReq = count;
1312 std::unique_ptr<effect_descriptor_t[]> descriptors(new effect_descriptor_t[count]);
1313
1314 sp<AudioPolicyEffects> audioPolicyEffects;
1315 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
1316 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->queryDefaultInputEffects(
1317 (audio_session_t) audioSession, descriptors.get(), &count)));
1318 countReq = std::min(count, countReq);
1319 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1320 convertRange(descriptors.get(), descriptors.get() + countReq,
1321 std::back_inserter(*_aidl_return),
1322 legacy2aidl_effect_descriptor_t_EffectDescriptor)));
1323 countAidl->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(count));
1324 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001325}
1326
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001327Status AudioPolicyService::addSourceDefaultEffect(const AudioUuid& typeAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001328 const std::string& opPackageNameAidl,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001329 const AudioUuid& uuidAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001330 int32_t priority,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001331 AudioSource sourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001332 int32_t* _aidl_return) {
1333 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1334 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1335 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1336 aidl2legacy_string_view_String16(opPackageNameAidl));
1337 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1338 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1339 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001340 aidl2legacy_AudioSource_audio_source_t(sourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001341 audio_unique_id_t id;
1342
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-Cohen24628312018-08-13 15:01:09 -07001345 if (!modifyDefaultAudioEffectsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001346 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001347 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001348 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addSourceDefaultEffect(
1349 &type, opPackageName, &uuid, priority, source, &id)));
1350 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1351 return Status::ok();
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001352}
1353
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001354Status AudioPolicyService::addStreamDefaultEffect(const AudioUuid& typeAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001355 const std::string& opPackageNameAidl,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001356 const AudioUuid& uuidAidl,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001357 int32_t priority, AudioUsage usageAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001358 int32_t* _aidl_return) {
1359 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1360 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1361 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1362 aidl2legacy_string_view_String16(opPackageNameAidl));
1363 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1364 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1365 audio_usage_t usage = VALUE_OR_RETURN_BINDER_STATUS(
1366 aidl2legacy_AudioUsage_audio_usage_t(usageAidl));
1367 audio_unique_id_t id;
1368
1369 sp<AudioPolicyEffects> audioPolicyEffects;
1370 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001371 if (!modifyDefaultAudioEffectsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001372 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001373 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001374 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addStreamDefaultEffect(
1375 &type, opPackageName, &uuid, priority, usage, &id)));
1376 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1377 return Status::ok();
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001378}
1379
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001380Status AudioPolicyService::removeSourceDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001381{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001382 audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1383 aidl2legacy_int32_t_audio_unique_id_t(idAidl));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001384 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001385 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001386 if (!modifyDefaultAudioEffectsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001387 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001388 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001389 return binderStatusFromStatusT(audioPolicyEffects->removeSourceDefaultEffect(id));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001390}
1391
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001392Status AudioPolicyService::removeStreamDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001393{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001394 audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1395 aidl2legacy_int32_t_audio_unique_id_t(idAidl));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001396 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001397 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001398 if (!modifyDefaultAudioEffectsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001399 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001400 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001401 return binderStatusFromStatusT(audioPolicyEffects->removeStreamDefaultEffect(id));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001402}
1403
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001404Status AudioPolicyService::setSupportedSystemUsages(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001405 const std::vector<AudioUsage>& systemUsagesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001406 size_t size = systemUsagesAidl.size();
1407 if (size > MAX_ITEMS_PER_LIST) {
1408 size = MAX_ITEMS_PER_LIST;
1409 }
1410 std::vector<audio_usage_t> systemUsages;
1411 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1412 convertRange(systemUsagesAidl.begin(), systemUsagesAidl.begin() + size,
1413 std::back_inserter(systemUsages), aidl2legacy_AudioUsage_audio_usage_t)));
1414
Hayden Gomes524159d2019-12-23 14:41:47 -08001415 Mutex::Autolock _l(mLock);
1416 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001417 return binderStatusFromStatusT(PERMISSION_DENIED);
Hayden Gomes524159d2019-12-23 14:41:47 -08001418 }
1419
1420 bool areAllSystemUsages = std::all_of(begin(systemUsages), end(systemUsages),
1421 [](audio_usage_t usage) { return isSystemUsage(usage); });
1422 if (!areAllSystemUsages) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001423 return binderStatusFromStatusT(BAD_VALUE);
Hayden Gomes524159d2019-12-23 14:41:47 -08001424 }
1425
1426 mSupportedSystemUsages = systemUsages;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001427 return Status::ok();
Hayden Gomes524159d2019-12-23 14:41:47 -08001428}
1429
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001430Status AudioPolicyService::setAllowedCapturePolicy(int32_t uidAidl, int32_t capturePolicyAidl) {
1431 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1432 audio_flags_mask_t capturePolicy = VALUE_OR_RETURN_BINDER_STATUS(
1433 aidl2legacy_int32_t_audio_flags_mask_t_mask(capturePolicyAidl));
1434
Kevin Rocardb99cc752019-03-21 20:52:24 -07001435 Mutex::Autolock _l(mLock);
1436 if (mAudioPolicyManager == NULL) {
1437 ALOGV("%s() mAudioPolicyManager == NULL", __func__);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001438 return binderStatusFromStatusT(NO_INIT);
Kevin Rocardb99cc752019-03-21 20:52:24 -07001439 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001440 return binderStatusFromStatusT(
1441 mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy));
Kevin Rocardb99cc752019-03-21 20:52:24 -07001442}
1443
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001444Status AudioPolicyService::getOffloadSupport(const AudioOffloadInfo& infoAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001445 media::AudioOffloadMode* _aidl_return) {
1446 audio_offload_info_t info = VALUE_OR_RETURN_BINDER_STATUS(
1447 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(infoAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001448 if (mAudioPolicyManager == NULL) {
1449 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001450 return binderStatusFromStatusT(AUDIO_OFFLOAD_NOT_SUPPORTED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001451 }
Andy Hung2ddee192015-12-18 17:34:44 -08001452 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001453 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001454 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_offload_mode_t_AudioOffloadMode(
1455 mAudioPolicyManager->getOffloadSupport(info)));
1456 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001457}
1458
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001459Status AudioPolicyService::isDirectOutputSupported(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001460 const AudioConfigBase& configAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001461 const media::AudioAttributesInternal& attributesAidl,
1462 bool* _aidl_return) {
1463 audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001464 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl, false /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001465 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1466 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attributesAidl));
1467 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1468 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1469
Michael Chana94fbb22018-04-24 14:31:19 +10001470 if (mAudioPolicyManager == NULL) {
1471 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001472 return binderStatusFromStatusT(NO_INIT);
Michael Chana94fbb22018-04-24 14:31:19 +10001473 }
Hayden Gomes524159d2019-12-23 14:41:47 -08001474
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001475 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attributes.usage)));
Hayden Gomes524159d2019-12-23 14:41:47 -08001476
Michael Chana94fbb22018-04-24 14:31:19 +10001477 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001478 *_aidl_return = mAudioPolicyManager->isDirectOutputSupported(config, attributes);
1479 return Status::ok();
Michael Chana94fbb22018-04-24 14:31:19 +10001480}
1481
1482
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001483Status AudioPolicyService::listAudioPorts(media::AudioPortRole roleAidl,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001484 media::AudioPortType typeAidl, Int* count,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001485 std::vector<media::AudioPort>* portsAidl,
1486 int32_t* _aidl_return) {
1487 audio_port_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
1488 aidl2legacy_AudioPortRole_audio_port_role_t(roleAidl));
1489 audio_port_type_t type = VALUE_OR_RETURN_BINDER_STATUS(
1490 aidl2legacy_AudioPortType_audio_port_type_t(typeAidl));
1491 unsigned int num_ports = VALUE_OR_RETURN_BINDER_STATUS(
1492 convertIntegral<unsigned int>(count->value));
1493 if (num_ports > MAX_ITEMS_PER_LIST) {
1494 num_ports = MAX_ITEMS_PER_LIST;
1495 }
1496 unsigned int numPortsReq = num_ports;
1497 std::unique_ptr<audio_port_v7[]> ports(new audio_port_v7[num_ports]);
1498 unsigned int generation;
1499
Eric Laurent6a94d692014-05-20 11:18:06 -07001500 Mutex::Autolock _l(mLock);
1501 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001502 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001503 }
Eric Laurent10b71232018-04-13 18:14:44 -07001504 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001505 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1506 mAudioPolicyManager->listAudioPorts(role, type, &num_ports, ports.get(), &generation)));
1507 numPortsReq = std::min(numPortsReq, num_ports);
1508 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1509 convertRange(ports.get(), ports.get() + numPortsReq, std::back_inserter(*portsAidl),
1510 legacy2aidl_audio_port_v7_AudioPort)));
1511 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_ports));
1512 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1513 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001514}
1515
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001516Status AudioPolicyService::getAudioPort(const media::AudioPort& portAidl,
1517 media::AudioPort* _aidl_return) {
1518 audio_port_v7 port = VALUE_OR_RETURN_BINDER_STATUS(
1519 aidl2legacy_AudioPort_audio_port_v7(portAidl));
1520 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPort(port)));
1521
Eric Laurent6a94d692014-05-20 11:18:06 -07001522 Mutex::Autolock _l(mLock);
1523 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001524 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001525 }
Eric Laurent10b71232018-04-13 18:14:44 -07001526 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001527 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(mAudioPolicyManager->getAudioPort(&port)));
1528 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_v7_AudioPort(port));
1529 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001530}
1531
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001532Status AudioPolicyService::createAudioPatch(const media::AudioPatch& patchAidl, int32_t handleAidl,
1533 int32_t* _aidl_return) {
1534 audio_patch patch = VALUE_OR_RETURN_BINDER_STATUS(
1535 aidl2legacy_AudioPatch_audio_patch(patchAidl));
1536 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1537 aidl2legacy_int32_t_audio_port_handle_t(handleAidl));
1538 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPatch(patch)));
1539
Eric Laurent6a94d692014-05-20 11:18:06 -07001540 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001541 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001542 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001543 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001544 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->createAudioPatch(&patch, &handle,
1550 IPCThreadState::self()->getCallingUid())));
1551 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_patch_handle_t_int32_t(handle));
1552 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001553}
1554
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001555Status AudioPolicyService::releaseAudioPatch(int32_t handleAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001556{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001557 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1558 aidl2legacy_int32_t_audio_patch_handle_t(handleAidl));
Eric Laurent6a94d692014-05-20 11:18:06 -07001559 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001560 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001561 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001562 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001563 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001564 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001565 }
Eric Laurent10b71232018-04-13 18:14:44 -07001566 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001567 return binderStatusFromStatusT(
1568 mAudioPolicyManager->releaseAudioPatch(handle,
1569 IPCThreadState::self()->getCallingUid()));
Eric Laurent203b1a12014-04-01 10:34:16 -07001570}
1571
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001572Status AudioPolicyService::listAudioPatches(Int* count,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001573 std::vector<media::AudioPatch>* patchesAidl,
1574 int32_t* _aidl_return) {
1575 unsigned int num_patches = VALUE_OR_RETURN_BINDER_STATUS(
1576 convertIntegral<unsigned int>(count->value));
1577 if (num_patches > MAX_ITEMS_PER_LIST) {
1578 num_patches = MAX_ITEMS_PER_LIST;
1579 }
1580 unsigned int numPatchesReq = num_patches;
1581 std::unique_ptr<audio_patch[]> patches(new audio_patch[num_patches]);
1582 unsigned int generation;
1583
Eric Laurent6a94d692014-05-20 11:18:06 -07001584 Mutex::Autolock _l(mLock);
1585 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001586 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001587 }
Eric Laurent10b71232018-04-13 18:14:44 -07001588 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001589 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1590 mAudioPolicyManager->listAudioPatches(&num_patches, patches.get(), &generation)));
1591 numPatchesReq = std::min(numPatchesReq, num_patches);
1592 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1593 convertRange(patches.get(), patches.get() + numPatchesReq,
1594 std::back_inserter(*patchesAidl), legacy2aidl_audio_patch_AudioPatch)));
1595 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_patches));
1596 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1597 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001598}
1599
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001600Status AudioPolicyService::setAudioPortConfig(const media::AudioPortConfig& configAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001601{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001602 audio_port_config config = VALUE_OR_RETURN_BINDER_STATUS(
1603 aidl2legacy_AudioPortConfig_audio_port_config(configAidl));
1604 RETURN_IF_BINDER_ERROR(
1605 binderStatusFromStatusT(AudioValidator::validateAudioPortConfig(config)));
1606
Eric Laurent6a94d692014-05-20 11:18:06 -07001607 Mutex::Autolock _l(mLock);
Eric Laurent5284ed52014-05-29 14:37:38 -07001608 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001609 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001610 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001611 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001612 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001613 }
Eric Laurent10b71232018-04-13 18:14:44 -07001614 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001615 return binderStatusFromStatusT(mAudioPolicyManager->setAudioPortConfig(&config));
Eric Laurent203b1a12014-04-01 10:34:16 -07001616}
Eric Laurent2d388ec2014-03-07 13:25:54 -08001617
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001618Status AudioPolicyService::acquireSoundTriggerSession(media::SoundTriggerSession* _aidl_return)
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001619{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001620 audio_session_t session;
1621 audio_io_handle_t ioHandle;
1622 audio_devices_t device;
1623
1624 {
1625 Mutex::Autolock _l(mLock);
1626 if (mAudioPolicyManager == NULL) {
1627 return binderStatusFromStatusT(NO_INIT);
1628 }
1629 AutoCallerClear acc;
1630 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1631 mAudioPolicyManager->acquireSoundTriggerSession(&session, &ioHandle, &device)));
1632 }
1633
1634 _aidl_return->session = VALUE_OR_RETURN_BINDER_STATUS(
1635 legacy2aidl_audio_session_t_int32_t(session));
1636 _aidl_return->ioHandle = VALUE_OR_RETURN_BINDER_STATUS(
1637 legacy2aidl_audio_io_handle_t_int32_t(ioHandle));
1638 _aidl_return->device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001639 legacy2aidl_audio_devices_t_AudioDeviceDescription(device));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001640 return Status::ok();
1641}
1642
1643Status AudioPolicyService::releaseSoundTriggerSession(int32_t sessionAidl)
1644{
1645 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1646 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Andy Hungf759b8c2017-08-15 12:48:54 -07001647 Mutex::Autolock _l(mLock);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001648 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001649 return binderStatusFromStatusT(NO_INIT);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001650 }
Eric Laurent10b71232018-04-13 18:14:44 -07001651 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001652 return binderStatusFromStatusT(mAudioPolicyManager->releaseSoundTriggerSession(session));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001653}
1654
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001655Status AudioPolicyService::registerPolicyMixes(const std::vector<media::AudioMix>& mixesAidl,
1656 bool registration) {
1657 size_t size = mixesAidl.size();
1658 if (size > MAX_MIXES_PER_POLICY) {
1659 size = MAX_MIXES_PER_POLICY;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001660 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001661 Vector<AudioMix> mixes;
1662 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1663 convertRange(mixesAidl.begin(), mixesAidl.begin() + size, std::back_inserter(mixes),
1664 aidl2legacy_AudioMix)));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001665
Eric Laurentbaac1832014-12-01 17:52:59 -08001666 Mutex::Autolock _l(mLock);
Kevin Rocardbe201852019-02-20 22:33:28 -08001667
1668 // loopback|render only need a MediaProjection (checked in caller AudioService.java)
1669 bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1670 return !is_mix_loopback_render(mix.mRouteFlags); });
1671 if (needModifyAudioRouting && !modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001672 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurentbaac1832014-12-01 17:52:59 -08001673 }
Kevin Rocardbe201852019-02-20 22:33:28 -08001674
Nadav Bar287d3302020-02-05 14:55:38 +02001675 // If one of the mixes has needCaptureVoiceCommunicationOutput set to true, then we
1676 // need to verify that the caller still has CAPTURE_VOICE_COMMUNICATION_OUTPUT
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001677 bool needCaptureVoiceCommunicationOutput =
1678 std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Nadav Bar287d3302020-02-05 14:55:38 +02001679 return mix.mVoiceCommunicationCaptureAllowed; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001680
Kevin Rocard36b17552019-03-07 18:48:07 -08001681 bool needCaptureMediaOutput = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Eric Laurent5f9a6452020-12-22 20:10:10 +01001682 return mix.mAllowPrivilegedMediaPlaybackCapture; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001683
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001684 const AttributionSourceState attributionSource = getCallingAttributionSource();
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001685
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001686
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001687 if (needCaptureMediaOutput && !captureMediaOutputAllowed(attributionSource)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001688 return binderStatusFromStatusT(PERMISSION_DENIED);
Kevin Rocard36b17552019-03-07 18:48:07 -08001689 }
1690
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001691 if (needCaptureVoiceCommunicationOutput &&
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001692 !captureVoiceCommunicationOutputAllowed(attributionSource)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001693 return binderStatusFromStatusT(PERMISSION_DENIED);
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001694 }
1695
Eric Laurentbaac1832014-12-01 17:52:59 -08001696 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001697 return binderStatusFromStatusT(NO_INIT);
Eric Laurentbaac1832014-12-01 17:52:59 -08001698 }
Eric Laurent10b71232018-04-13 18:14:44 -07001699 AutoCallerClear acc;
Eric Laurentbaac1832014-12-01 17:52:59 -08001700 if (registration) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001701 return binderStatusFromStatusT(mAudioPolicyManager->registerPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08001702 } else {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001703 return binderStatusFromStatusT(mAudioPolicyManager->unregisterPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08001704 }
1705}
1706
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001707Status AudioPolicyService::setUidDeviceAffinities(
1708 int32_t uidAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001709 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001710 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1711 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
1712 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
1713 aidl2legacy_AudioDeviceTypeAddress));
1714
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001715 Mutex::Autolock _l(mLock);
1716 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001717 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001718 }
1719 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001720 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001721 }
1722 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001723 return binderStatusFromStatusT(mAudioPolicyManager->setUidDeviceAffinities(uid, devices));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001724}
1725
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001726Status AudioPolicyService::removeUidDeviceAffinities(int32_t uidAidl) {
1727 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1728
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001729 Mutex::Autolock _l(mLock);
1730 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001731 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001732 }
1733 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001734 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001735 }
1736 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001737 return binderStatusFromStatusT(mAudioPolicyManager->removeUidDeviceAffinities(uid));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001738}
1739
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001740Status AudioPolicyService::setUserIdDeviceAffinities(
1741 int32_t userIdAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001742 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001743 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
1744 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
1745 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
1746 aidl2legacy_AudioDeviceTypeAddress));
1747
Oscar Azucena90e77632019-11-27 17:12:28 -08001748 Mutex::Autolock _l(mLock);
1749 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001750 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08001751 }
1752 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001753 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08001754 }
1755 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001756 return binderStatusFromStatusT(mAudioPolicyManager->setUserIdDeviceAffinities(userId, devices));
Oscar Azucena90e77632019-11-27 17:12:28 -08001757}
1758
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001759Status AudioPolicyService::removeUserIdDeviceAffinities(int32_t userIdAidl) {
1760 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
1761
Oscar Azucena90e77632019-11-27 17:12:28 -08001762 Mutex::Autolock _l(mLock);
1763 if(!modifyAudioRoutingAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001764 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08001765 }
1766 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001767 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08001768 }
1769 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001770 return binderStatusFromStatusT(mAudioPolicyManager->removeUserIdDeviceAffinities(userId));
Oscar Azucena90e77632019-11-27 17:12:28 -08001771}
1772
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001773Status AudioPolicyService::startAudioSource(const media::AudioPortConfig& sourceAidl,
1774 const media::AudioAttributesInternal& attributesAidl,
1775 int32_t* _aidl_return) {
1776 audio_port_config source = VALUE_OR_RETURN_BINDER_STATUS(
1777 aidl2legacy_AudioPortConfig_audio_port_config(sourceAidl));
1778 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1779 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attributesAidl));
1780 audio_port_handle_t portId;
1781 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1782 AudioValidator::validateAudioPortConfig(source)));
1783 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1784 AudioValidator::validateAudioAttributes(attributes, "68953950")));
1785
Eric Laurent554a2772015-04-10 11:29:24 -07001786 Mutex::Autolock _l(mLock);
1787 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001788 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07001789 }
Hayden Gomes524159d2019-12-23 14:41:47 -08001790
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001791 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attributes.usage)));
Hayden Gomes524159d2019-12-23 14:41:47 -08001792
Hongwei Wang5cd1f1d2019-03-26 15:21:11 -07001793 // startAudioSource should be created as the calling uid
1794 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Eric Laurent10b71232018-04-13 18:14:44 -07001795 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001796 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1797 mAudioPolicyManager->startAudioSource(&source, &attributes, &portId, callingUid)));
1798 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
1799 return Status::ok();
Eric Laurent554a2772015-04-10 11:29:24 -07001800}
1801
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001802Status AudioPolicyService::stopAudioSource(int32_t portIdAidl)
Eric Laurent554a2772015-04-10 11:29:24 -07001803{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001804 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
1805 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1806
Eric Laurent554a2772015-04-10 11:29:24 -07001807 Mutex::Autolock _l(mLock);
1808 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001809 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07001810 }
Eric Laurent10b71232018-04-13 18:14:44 -07001811 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001812 return binderStatusFromStatusT(mAudioPolicyManager->stopAudioSource(portId));
Eric Laurent554a2772015-04-10 11:29:24 -07001813}
1814
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001815Status AudioPolicyService::setMasterMono(bool mono)
Andy Hung2ddee192015-12-18 17:34:44 -08001816{
1817 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001818 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08001819 }
1820 if (!settingsAllowed()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001821 return binderStatusFromStatusT(PERMISSION_DENIED);
Andy Hung2ddee192015-12-18 17:34:44 -08001822 }
1823 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001824 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001825 return binderStatusFromStatusT(mAudioPolicyManager->setMasterMono(mono));
Andy Hung2ddee192015-12-18 17:34:44 -08001826}
1827
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001828Status AudioPolicyService::getMasterMono(bool* _aidl_return)
Andy Hung2ddee192015-12-18 17:34:44 -08001829{
1830 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001831 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08001832 }
1833 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001834 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001835 return binderStatusFromStatusT(mAudioPolicyManager->getMasterMono(_aidl_return));
Andy Hung2ddee192015-12-18 17:34:44 -08001836}
1837
Eric Laurentac9cef52017-06-09 15:46:26 -07001838
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001839Status AudioPolicyService::getStreamVolumeDB(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001840 AudioStreamType streamAidl, int32_t indexAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001841 const AudioDeviceDescription& deviceAidl, float* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001842 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1843 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1844 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1845 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001846 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001847
Eric Laurentac9cef52017-06-09 15:46:26 -07001848 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001849 return binderStatusFromStatusT(NO_INIT);
Eric Laurentac9cef52017-06-09 15:46:26 -07001850 }
1851 Mutex::Autolock _l(mLock);
Eric Laurent10b71232018-04-13 18:14:44 -07001852 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001853 *_aidl_return = mAudioPolicyManager->getStreamVolumeDB(stream, index, device);
1854 return Status::ok();
Eric Laurentac9cef52017-06-09 15:46:26 -07001855}
1856
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001857Status AudioPolicyService::getSurroundFormats(Int* count,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001858 std::vector<AudioFormatDescription>* formats,
Kriti Dang877b27e2021-02-02 12:10:40 +01001859 std::vector<bool>* formatsEnabled) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001860 unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
1861 convertIntegral<unsigned int>(count->value));
1862 if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
1863 numSurroundFormats = MAX_ITEMS_PER_LIST;
1864 }
1865 unsigned int numSurroundFormatsReq = numSurroundFormats;
1866 std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
Kriti Dang877b27e2021-02-02 12:10:40 +01001867 std::unique_ptr<bool[]>surroundFormatsEnabled(new bool[numSurroundFormats]);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001868
jiabin81772902018-04-02 17:52:27 -07001869 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001870 return binderStatusFromStatusT(NO_INIT);
jiabin81772902018-04-02 17:52:27 -07001871 }
1872 Mutex::Autolock _l(mLock);
1873 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001874 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1875 mAudioPolicyManager->getSurroundFormats(&numSurroundFormats, surroundFormats.get(),
Kriti Dang6537def2021-03-02 13:46:59 +01001876 surroundFormatsEnabled.get())));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001877 numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
1878 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1879 convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001880 std::back_inserter(*formats),
1881 legacy2aidl_audio_format_t_AudioFormatDescription)));
Kriti Dang877b27e2021-02-02 12:10:40 +01001882 formatsEnabled->insert(
1883 formatsEnabled->begin(),
1884 surroundFormatsEnabled.get(),
1885 surroundFormatsEnabled.get() + numSurroundFormatsReq);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001886 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
1887 return Status::ok();
jiabin81772902018-04-02 17:52:27 -07001888}
1889
Kriti Dang6537def2021-03-02 13:46:59 +01001890Status AudioPolicyService::getReportedSurroundFormats(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001891 Int* count, std::vector<AudioFormatDescription>* formats) {
Kriti Dang6537def2021-03-02 13:46:59 +01001892 unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
1893 convertIntegral<unsigned int>(count->value));
1894 if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
1895 numSurroundFormats = MAX_ITEMS_PER_LIST;
1896 }
1897 unsigned int numSurroundFormatsReq = numSurroundFormats;
1898 std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
1899
1900 if (mAudioPolicyManager == NULL) {
1901 return binderStatusFromStatusT(NO_INIT);
1902 }
1903 Mutex::Autolock _l(mLock);
1904 AutoCallerClear acc;
1905 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1906 mAudioPolicyManager->getReportedSurroundFormats(
1907 &numSurroundFormats, surroundFormats.get())));
1908 numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
1909 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1910 convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001911 std::back_inserter(*formats),
1912 legacy2aidl_audio_format_t_AudioFormatDescription)));
Kriti Dang6537def2021-03-02 13:46:59 +01001913 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
1914 return Status::ok();
1915}
1916
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001917Status AudioPolicyService::getHwOffloadEncodingFormatsSupportedForA2DP(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001918 std::vector<AudioFormatDescription>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001919 std::vector<audio_format_t> formats;
1920
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001921 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001922 return binderStatusFromStatusT(NO_INIT);
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001923 }
1924 Mutex::Autolock _l(mLock);
1925 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001926 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1927 mAudioPolicyManager->getHwOffloadEncodingFormatsSupportedForA2DP(&formats)));
1928 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001929 convertContainer<std::vector<AudioFormatDescription>>(
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001930 formats,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001931 legacy2aidl_audio_format_t_AudioFormatDescription));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001932 return Status::ok();
Arun Mirpuri11029ad2018-12-19 20:45:19 -08001933}
1934
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001935Status AudioPolicyService::setSurroundFormatEnabled(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07001936 const AudioFormatDescription& audioFormatAidl, bool enabled) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001937 audio_format_t audioFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07001938 aidl2legacy_AudioFormatDescription_audio_format_t(audioFormatAidl));
jiabin81772902018-04-02 17:52:27 -07001939 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001940 return binderStatusFromStatusT(NO_INIT);
jiabin81772902018-04-02 17:52:27 -07001941 }
1942 Mutex::Autolock _l(mLock);
1943 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001944 return binderStatusFromStatusT(
1945 mAudioPolicyManager->setSurroundFormatEnabled(audioFormat, enabled));
jiabin81772902018-04-02 17:52:27 -07001946}
Eric Laurentac9cef52017-06-09 15:46:26 -07001947
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001948Status AudioPolicyService::setAssistantUid(int32_t uidAidl)
Eric Laurentb78763e2018-10-17 10:08:02 -07001949{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001950 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Eric Laurentb78763e2018-10-17 10:08:02 -07001951 Mutex::Autolock _l(mLock);
1952 mUidPolicy->setAssistantUid(uid);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001953 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07001954}
1955
Ahaan Ugalef51ce002021-08-04 16:34:20 -07001956Status AudioPolicyService::setHotwordDetectionServiceUid(int32_t uidAidl)
1957{
1958 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1959 Mutex::Autolock _l(mLock);
1960 mUidPolicy->setHotwordDetectionServiceUid(uid);
1961 return Status::ok();
1962}
1963
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001964Status AudioPolicyService::setA11yServicesUids(const std::vector<int32_t>& uidsAidl)
Eric Laurentb78763e2018-10-17 10:08:02 -07001965{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001966 size_t size = uidsAidl.size();
1967 if (size > MAX_ITEMS_PER_LIST) {
1968 size = MAX_ITEMS_PER_LIST;
1969 }
1970 std::vector<uid_t> uids;
1971 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1972 convertRange(uidsAidl.begin(),
1973 uidsAidl.begin() + size,
1974 std::back_inserter(uids),
1975 aidl2legacy_int32_t_uid_t)));
Eric Laurentb78763e2018-10-17 10:08:02 -07001976 Mutex::Autolock _l(mLock);
1977 mUidPolicy->setA11yUids(uids);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001978 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07001979}
1980
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001981Status AudioPolicyService::setCurrentImeUid(int32_t uidAidl)
Kohsuke Yatoha623a132020-03-24 20:10:26 -07001982{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001983 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Kohsuke Yatoha623a132020-03-24 20:10:26 -07001984 Mutex::Autolock _l(mLock);
1985 mUidPolicy->setCurrentImeUid(uid);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001986 return Status::ok();
Kohsuke Yatoha623a132020-03-24 20:10:26 -07001987}
1988
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001989Status AudioPolicyService::isHapticPlaybackSupported(bool* _aidl_return)
jiabin6012f912018-11-02 17:06:30 -07001990{
1991 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001992 return binderStatusFromStatusT(NO_INIT);
jiabin6012f912018-11-02 17:06:30 -07001993 }
1994 Mutex::Autolock _l(mLock);
1995 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001996 *_aidl_return = mAudioPolicyManager->isHapticPlaybackSupported();
1997 return Status::ok();
jiabin6012f912018-11-02 17:06:30 -07001998}
1999
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002000Status AudioPolicyService::listAudioProductStrategies(
2001 std::vector<media::AudioProductStrategy>* _aidl_return) {
2002 AudioProductStrategyVector strategies;
2003
François Gaffied0ba9ed2018-11-05 11:50:42 +01002004 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002005 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01002006 }
2007 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002008 RETURN_IF_BINDER_ERROR(
2009 binderStatusFromStatusT(mAudioPolicyManager->listAudioProductStrategies(strategies)));
2010 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2011 convertContainer<std::vector<media::AudioProductStrategy>>(
2012 strategies,
2013 legacy2aidl_AudioProductStrategy));
2014 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01002015}
2016
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002017Status AudioPolicyService::getProductStrategyFromAudioAttributes(
Francois Gaffie11b65922020-09-24 16:59:08 +02002018 const media::AudioAttributesEx& aaAidl, bool fallbackOnDefault, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002019 AudioAttributes aa = VALUE_OR_RETURN_BINDER_STATUS(
2020 aidl2legacy_AudioAttributesEx_AudioAttributes(aaAidl));
2021 product_strategy_t productStrategy;
2022
François Gaffied0ba9ed2018-11-05 11:50:42 +01002023 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002024 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01002025 }
2026 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002027 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02002028 mAudioPolicyManager->getProductStrategyFromAudioAttributes(
2029 aa, productStrategy, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002030 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2031 legacy2aidl_product_strategy_t_int32_t(productStrategy));
2032 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01002033}
2034
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002035Status AudioPolicyService::listAudioVolumeGroups(std::vector<media::AudioVolumeGroup>* _aidl_return)
François Gaffie4b2018b2018-11-07 11:18:59 +01002036{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002037 AudioVolumeGroupVector groups;
François Gaffie4b2018b2018-11-07 11:18:59 +01002038 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002039 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01002040 }
2041 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002042 RETURN_IF_BINDER_ERROR(
2043 binderStatusFromStatusT(mAudioPolicyManager->listAudioVolumeGroups(groups)));
2044 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2045 convertContainer<std::vector<media::AudioVolumeGroup>>(groups,
2046 legacy2aidl_AudioVolumeGroup));
2047 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01002048}
2049
Francois Gaffie11b65922020-09-24 16:59:08 +02002050Status AudioPolicyService::getVolumeGroupFromAudioAttributes(
2051 const media::AudioAttributesEx& aaAidl, bool fallbackOnDefault, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002052 AudioAttributes aa = VALUE_OR_RETURN_BINDER_STATUS(
2053 aidl2legacy_AudioAttributesEx_AudioAttributes(aaAidl));
2054 volume_group_t volumeGroup;
2055
François Gaffie4b2018b2018-11-07 11:18:59 +01002056 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002057 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01002058 }
2059 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002060 RETURN_IF_BINDER_ERROR(
2061 binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02002062 mAudioPolicyManager->getVolumeGroupFromAudioAttributes(
2063 aa, volumeGroup, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002064 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_volume_group_t_int32_t(volumeGroup));
2065 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01002066}
Eric Laurent6ede98f2019-06-11 14:50:30 -07002067
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002068Status AudioPolicyService::setRttEnabled(bool enabled)
Eric Laurent6ede98f2019-06-11 14:50:30 -07002069{
2070 Mutex::Autolock _l(mLock);
2071 mUidPolicy->setRttEnabled(enabled);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002072 return Status::ok();
Eric Laurent6ede98f2019-06-11 14:50:30 -07002073}
2074
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002075Status AudioPolicyService::isCallScreenModeSupported(bool* _aidl_return)
Eric Laurent8340e672019-11-06 11:01:08 -08002076{
2077 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002078 return binderStatusFromStatusT(NO_INIT);
Eric Laurent8340e672019-11-06 11:01:08 -08002079 }
2080 Mutex::Autolock _l(mLock);
2081 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002082 *_aidl_return = mAudioPolicyManager->isCallScreenModeSupported();
2083 return Status::ok();
Eric Laurent8340e672019-11-06 11:01:08 -08002084}
2085
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002086Status AudioPolicyService::setDevicesRoleForStrategy(
2087 int32_t strategyAidl,
2088 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002089 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002090 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2091 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2092 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2093 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2094 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2095 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2096 aidl2legacy_AudioDeviceTypeAddress));
2097
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002098 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002099 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002100 }
2101 Mutex::Autolock _l(mLock);
Eric Laurent39095982021-08-24 18:29:27 +02002102 status_t status = mAudioPolicyManager->setDevicesRoleForStrategy(strategy, role, devices);
2103 if (status == NO_ERROR) {
2104 onCheckSpatializer_l();
2105 }
2106 return binderStatusFromStatusT(status);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002107}
2108
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002109Status AudioPolicyService::removeDevicesRoleForStrategy(int32_t strategyAidl,
2110 media::DeviceRole roleAidl) {
2111 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2112 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2113 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2114 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2115 if (mAudioPolicyManager == NULL) {
2116 return binderStatusFromStatusT(NO_INIT);
2117 }
2118 Mutex::Autolock _l(mLock);
Eric Laurent39095982021-08-24 18:29:27 +02002119 status_t status = mAudioPolicyManager->removeDevicesRoleForStrategy(strategy, role);
2120 if (status == NO_ERROR) {
2121 onCheckSpatializer_l();
2122 }
2123 return binderStatusFromStatusT(status);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002124}
2125
2126Status AudioPolicyService::getDevicesForRoleAndStrategy(
2127 int32_t strategyAidl,
2128 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002129 std::vector<AudioDevice>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002130 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2131 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2132 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2133 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2134 AudioDeviceTypeAddrVector devices;
2135
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002136 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002137 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002138 }
2139 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002140 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2141 mAudioPolicyManager->getDevicesForRoleAndStrategy(strategy, role, devices)));
2142 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002143 convertContainer<std::vector<AudioDevice>>(devices,
2144 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002145 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002146}
2147
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002148Status AudioPolicyService::registerSoundTriggerCaptureStateListener(
2149 const sp<media::ICaptureStateListener>& listener, bool* _aidl_return) {
2150 *_aidl_return = mCaptureStateNotifier.RegisterListener(listener);
2151 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002152}
2153
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002154Status AudioPolicyService::setDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002155 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002156 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002157 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002158 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002159 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002160 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2161 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2162 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2163 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2164 aidl2legacy_AudioDeviceTypeAddress));
Ytai Ben-Tsvi85093d52020-03-26 09:41:15 -07002165
Jiabin Huang3b98d322020-09-03 17:54:16 +00002166 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002167 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002168 }
2169 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002170 return binderStatusFromStatusT(
2171 mAudioPolicyManager->setDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002172}
2173
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002174Status AudioPolicyService::addDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002175 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002176 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002177 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002178 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002179 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002180 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2181 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2182 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2183 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2184 aidl2legacy_AudioDeviceTypeAddress));
2185
Jiabin Huang3b98d322020-09-03 17:54:16 +00002186 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002187 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002188 }
2189 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002190 return binderStatusFromStatusT(
2191 mAudioPolicyManager->addDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002192}
2193
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002194Status AudioPolicyService::removeDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002195 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002196 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002197 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002198 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002199 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002200 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2201 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2202 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2203 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2204 aidl2legacy_AudioDeviceTypeAddress));
2205
2206 if (mAudioPolicyManager == nullptr) {
2207 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002208 }
2209 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002210 return binderStatusFromStatusT(
2211 mAudioPolicyManager->removeDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002212}
2213
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002214Status AudioPolicyService::clearDevicesRoleForCapturePreset(AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002215 media::DeviceRole roleAidl) {
2216 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002217 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002218 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2219 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2220
Jiabin Huang3b98d322020-09-03 17:54:16 +00002221 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002222 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002223 }
2224 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002225 return binderStatusFromStatusT(
2226 mAudioPolicyManager->clearDevicesRoleForCapturePreset(audioSource, role));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002227}
2228
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002229Status AudioPolicyService::getDevicesForRoleAndCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002230 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002231 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002232 std::vector<AudioDevice>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002233 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002234 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002235 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2236 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2237 AudioDeviceTypeAddrVector devices;
2238
Jiabin Huang3b98d322020-09-03 17:54:16 +00002239 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002240 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002241 }
2242 Mutex::Autolock _l(mLock);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002243 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2244 mAudioPolicyManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices)));
2245 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002246 convertContainer<std::vector<AudioDevice>>(devices,
2247 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002248 return Status::ok();
Jiabin Huang3b98d322020-09-03 17:54:16 +00002249}
2250
Eric Laurent81dd0f52021-07-05 11:54:40 +02002251Status AudioPolicyService::getSpatializer(
2252 const sp<media::INativeSpatializerCallback>& callback,
2253 media::GetSpatializerResponse* _aidl_return) {
2254 _aidl_return->spatializer = nullptr;
Eric Laurent2be8b292021-08-23 09:44:33 -07002255 if (callback == nullptr) {
2256 return binderStatusFromStatusT(BAD_VALUE);
2257 }
Jean-Michel Trivi41628732021-09-09 12:16:21 -07002258 if (mSpatializer != nullptr) {
2259 RETURN_IF_BINDER_ERROR(
2260 binderStatusFromStatusT(mSpatializer->registerCallback(callback)));
2261 _aidl_return->spatializer = mSpatializer;
2262 }
Eric Laurent81dd0f52021-07-05 11:54:40 +02002263 return Status::ok();
2264}
2265
2266Status AudioPolicyService::canBeSpatialized(
2267 const std::optional<media::AudioAttributesInternal>& attrAidl,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002268 const std::optional<AudioConfig>& configAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002269 const std::vector<AudioDevice>& devicesAidl,
Eric Laurent81dd0f52021-07-05 11:54:40 +02002270 bool* _aidl_return) {
2271 if (mAudioPolicyManager == nullptr) {
2272 return binderStatusFromStatusT(NO_INIT);
2273 }
2274 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
2275 if (attrAidl.has_value()) {
2276 attr = VALUE_OR_RETURN_BINDER_STATUS(
2277 aidl2legacy_AudioAttributesInternal_audio_attributes_t(attrAidl.value()));
2278 }
2279 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
2280 if (configAidl.has_value()) {
2281 config = VALUE_OR_RETURN_BINDER_STATUS(
2282 aidl2legacy_AudioConfig_audio_config_t(configAidl.value(),
2283 false /*isInput*/));
2284 }
2285 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2286 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2287 aidl2legacy_AudioDeviceTypeAddress));
2288
2289 Mutex::Autolock _l(mLock);
2290 *_aidl_return = mAudioPolicyManager->canBeSpatialized(&attr, &config, devices);
2291 return Status::ok();
2292}
2293
Mikhail Naganov1b2a7942017-12-08 10:18:09 -08002294} // namespace android