blob: babc80e8f2e67052f5add7e1e5fa75dba2704ab2 [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
Atneya Nair9f91a5e2024-05-09 16:25:05 -070017#define LOG_TAG "AudioPolicyInterfaceImpl"
Eric Laurent2d388ec2014-03-07 13:25:54 -080018//#define LOG_NDEBUG 0
19
Eric Laurent2d388ec2014-03-07 13:25:54 -080020#include "AudioPolicyService.h"
Atneya Nair5b1ed642023-06-23 14:43:37 -070021#include "AudioRecordClient.h"
Ray Essick84e84a52018-05-03 18:45:07 -070022#include "TypeConverter.h"
Atneya Nair9f91a5e2024-05-09 16:25:05 -070023
24#include <android/content/AttributionSourceState.h>
Marvin Ramine5a122d2023-12-07 13:57:59 +010025#include <android_media_audiopolicy.h>
Atneya Nair09859fe2024-07-15 16:38:02 -070026#include <com_android_media_audio.h>
27#include <error/expected_utils.h>
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080028#include <media/AidlConversion.h>
Kevin Rocardbe201852019-02-20 22:33:28 -080029#include <media/AudioPolicy.h>
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080030#include <media/AudioValidator.h>
31#include <media/MediaMetricsItem.h>
32#include <media/PolicyAidlConversion.h>
Eric Laurentd7fe0862018-07-14 16:48:01 -070033#include <utils/Log.h>
Eric Laurent2d388ec2014-03-07 13:25:54 -080034
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080035#define VALUE_OR_RETURN_BINDER_STATUS(x) \
36 ({ auto _tmp = (x); \
37 if (!_tmp.ok()) return aidl_utils::binderStatusFromStatusT(_tmp.error()); \
38 std::move(_tmp.value()); })
39
Mikhail Naganov932cb962021-09-16 01:05:27 +000040#define RETURN_BINDER_STATUS_IF_ERROR(x) \
41 if (status_t _tmp = (x); _tmp != OK) return aidl_utils::binderStatusFromStatusT(_tmp);
42
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080043#define RETURN_IF_BINDER_ERROR(x) \
44 { \
45 binder::Status _tmp = (x); \
46 if (!_tmp.isOk()) return _tmp; \
47 }
48
Atneya Nair09859fe2024-07-15 16:38:02 -070049#define CHECK_PERM(expr1, expr2) \
50 VALUE_OR_RETURN_STATUS(getPermissionProvider().checkPermission((expr1), (expr2)))
51
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080052#define MAX_ITEMS_PER_LIST 1024
53
Eric Laurent2d388ec2014-03-07 13:25:54 -080054namespace android {
Marvin Ramine5a122d2023-12-07 13:57:59 +010055namespace audiopolicy_flags = android::media::audiopolicy;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080056using binder::Status;
57using aidl_utils::binderStatusFromStatusT;
Atneya Nair09859fe2024-07-15 16:38:02 -070058using com::android::media::audio::audioserver_permissions;
Atneya Nair9f91a5e2024-05-09 16:25:05 -070059using com::android::media::permission::NativePermissionController;
Atneya Nair09859fe2024-07-15 16:38:02 -070060using com::android::media::permission::PermissionEnum::ACCESS_ULTRASOUND;
61using com::android::media::permission::PermissionEnum::CALL_AUDIO_INTERCEPTION;
62using com::android::media::permission::PermissionEnum::CAPTURE_AUDIO_HOTWORD;
63using com::android::media::permission::PermissionEnum::CAPTURE_VOICE_COMMUNICATION_OUTPUT;
64using com::android::media::permission::PermissionEnum::CAPTURE_AUDIO_OUTPUT;
65using com::android::media::permission::PermissionEnum::CAPTURE_MEDIA_OUTPUT;
66using com::android::media::permission::PermissionEnum::CAPTURE_TUNER_AUDIO_INPUT;
67using com::android::media::permission::PermissionEnum::MODIFY_AUDIO_ROUTING;
68using com::android::media::permission::PermissionEnum::MODIFY_AUDIO_SETTINGS;
69using com::android::media::permission::PermissionEnum::MODIFY_DEFAULT_AUDIO_EFFECTS;
70using com::android::media::permission::PermissionEnum::MODIFY_PHONE_STATE;
71using com::android::media::permission::PermissionEnum::RECORD_AUDIO;
72using com::android::media::permission::PermissionEnum::WRITE_SECURE_SETTINGS;
Svet Ganov3e5f14f2021-05-13 22:51:08 +000073using content::AttributionSourceState;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070074using media::audio::common::AudioConfig;
75using media::audio::common::AudioConfigBase;
Mikhail Naganovf4a75362021-09-16 00:02:54 +000076using media::audio::common::AudioDevice;
Mikhail Naganov932cb962021-09-16 01:05:27 +000077using media::audio::common::AudioDeviceAddress;
Mikhail Naganovf4a75362021-09-16 00:02:54 +000078using media::audio::common::AudioDeviceDescription;
Mikhail Naganov57bd06f2021-08-10 16:41:54 -070079using media::audio::common::AudioFormatDescription;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070080using media::audio::common::AudioMode;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070081using media::audio::common::AudioOffloadInfo;
François Gaffie873738c2024-08-02 17:09:21 +020082using media::audio::common::AudioPolicyForceUse;
83using media::audio::common::AudioPolicyForcedConfig;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070084using media::audio::common::AudioSource;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070085using media::audio::common::AudioStreamType;
86using media::audio::common::AudioUsage;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070087using media::audio::common::AudioUuid;
Mikhail Naganov0078ee52021-09-30 23:06:20 +000088using media::audio::common::Int;
Eric Laurent2d388ec2014-03-07 13:25:54 -080089
Marvin Ramine5a122d2023-12-07 13:57:59 +010090constexpr int kDefaultVirtualDeviceId = 0;
Atneya Nairdb6ef1e2024-09-16 20:26:30 +000091namespace {
92constexpr auto PERMISSION_HARD_DENIED = permission::PermissionChecker::PERMISSION_HARD_DENIED;
93constexpr auto PERMISSION_GRANTED = permission::PermissionChecker::PERMISSION_GRANTED;
94}
Marvin Ramine5a122d2023-12-07 13:57:59 +010095
Hayden Gomes524159d2019-12-23 14:41:47 -080096const std::vector<audio_usage_t>& SYSTEM_USAGES = {
97 AUDIO_USAGE_CALL_ASSISTANT,
98 AUDIO_USAGE_EMERGENCY,
99 AUDIO_USAGE_SAFETY,
100 AUDIO_USAGE_VEHICLE_STATUS,
101 AUDIO_USAGE_ANNOUNCEMENT
102};
103
104bool isSystemUsage(audio_usage_t usage) {
105 return std::find(std::begin(SYSTEM_USAGES), std::end(SYSTEM_USAGES), usage)
106 != std::end(SYSTEM_USAGES);
107}
108
109bool AudioPolicyService::isSupportedSystemUsage(audio_usage_t usage) {
110 return std::find(std::begin(mSupportedSystemUsages), std::end(mSupportedSystemUsages), usage)
111 != std::end(mSupportedSystemUsages);
112}
113
Atneya Nair09859fe2024-07-15 16:38:02 -0700114Status AudioPolicyService::validateUsage(const audio_attributes_t& attr) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100115 return validateUsage(attr, getCallingAttributionSource());
Hayden Gomes524159d2019-12-23 14:41:47 -0800116}
117
Atneya Nair09859fe2024-07-15 16:38:02 -0700118Status AudioPolicyService::validateUsage(const audio_attributes_t& attr,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000119 const AttributionSourceState& attributionSource) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100120 if (isSystemUsage(attr.usage)) {
121 if (isSupportedSystemUsage(attr.usage)) {
122 if (attr.usage == AUDIO_USAGE_CALL_ASSISTANT
123 && ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0)) {
Atneya Nair09859fe2024-07-15 16:38:02 -0700124 if (!(audioserver_permissions() ?
125 CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
126 : callAudioInterceptionAllowed(attributionSource))) {
Eric Laurentf8763482022-03-30 20:37:30 +0200127 ALOGE("%s: call audio interception not allowed for attribution source: %s",
128 __func__, attributionSource.toString().c_str());
Atneya Nair09859fe2024-07-15 16:38:02 -0700129 return Status::fromExceptionCode(Status::EX_SECURITY,
130 "Call audio interception not allowed");
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100131 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700132 } else if (!(audioserver_permissions() ?
133 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid)
134 : modifyAudioRoutingAllowed(attributionSource))) {
Eric Laurentf8763482022-03-30 20:37:30 +0200135 ALOGE("%s: modify audio routing not allowed for attribution source: %s",
136 __func__, attributionSource.toString().c_str());
Atneya Nair09859fe2024-07-15 16:38:02 -0700137 return Status::fromExceptionCode(Status::EX_SECURITY,
138 "Modify audio routing not allowed");
Hayden Gomes524159d2019-12-23 14:41:47 -0800139 }
140 } else {
Atneya Nair09859fe2024-07-15 16:38:02 -0700141 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT);
Hayden Gomes524159d2019-12-23 14:41:47 -0800142 }
143 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700144 return Status::ok();
Hayden Gomes524159d2019-12-23 14:41:47 -0800145}
146
147
Eric Laurent2d388ec2014-03-07 13:25:54 -0800148
149// ----------------------------------------------------------------------------
150
Mikhail Naganov88b30d22020-03-09 19:43:13 +0000151void AudioPolicyService::doOnNewAudioModulesAvailable()
152{
153 if (mAudioPolicyManager == NULL) return;
Andy Hung79eacdb2023-11-30 19:34:24 -0800154 audio_utils::lock_guard _l(mMutex);
Mikhail Naganov88b30d22020-03-09 19:43:13 +0000155 AutoCallerClear acc;
156 mAudioPolicyManager->onNewAudioModulesAvailable();
157}
158
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800159Status AudioPolicyService::setDeviceConnectionState(
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800160 media::AudioPolicyDeviceState stateAidl,
Nathalie Le Clair88fa2752021-11-23 13:03:41 +0100161 const android::media::audio::common::AudioPort& port,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700162 const AudioFormatDescription& encodedFormatAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800163 audio_policy_dev_state_t state = VALUE_OR_RETURN_BINDER_STATUS(
164 aidl2legacy_AudioPolicyDeviceState_audio_policy_dev_state_t(stateAidl));
165 audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -0700166 aidl2legacy_AudioFormatDescription_audio_format_t(encodedFormatAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800167
Eric Laurentdce54a12014-03-10 12:19:46 -0700168 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800169 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800170 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700171 if (!(audioserver_permissions() ?
172 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
173 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800174 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800175 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800176 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
177 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800178 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800179 }
180
181 ALOGV("setDeviceConnectionState()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800182 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700183 AutoCallerClear acc;
Mikhail Naganov932cb962021-09-16 01:05:27 +0000184 status_t status = mAudioPolicyManager->setDeviceConnectionState(
Nathalie Le Clair88fa2752021-11-23 13:03:41 +0100185 state, port, encodedFormat);
Eric Laurent39095982021-08-24 18:29:27 +0200186 if (status == NO_ERROR) {
187 onCheckSpatializer_l();
188 }
189 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800190}
191
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000192Status AudioPolicyService::getDeviceConnectionState(const AudioDevice& deviceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800193 media::AudioPolicyDeviceState* _aidl_return) {
Mikhail Naganov932cb962021-09-16 01:05:27 +0000194 audio_devices_t device;
195 std::string address;
196 RETURN_BINDER_STATUS_IF_ERROR(
197 aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
Eric Laurentdce54a12014-03-10 12:19:46 -0700198 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800199 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
200 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
201 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
202 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800203 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800204 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700205 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800206 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
207 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
Mikhail Naganov932cb962021-09-16 01:05:27 +0000208 mAudioPolicyManager->getDeviceConnectionState(
209 device, address.c_str())));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800210 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800211}
212
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800213Status AudioPolicyService::handleDeviceConfigChange(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000214 const AudioDevice& deviceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800215 const std::string& deviceNameAidl,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700216 const AudioFormatDescription& encodedFormatAidl) {
Mikhail Naganov932cb962021-09-16 01:05:27 +0000217 audio_devices_t device;
218 std::string address;
219 RETURN_BINDER_STATUS_IF_ERROR(
220 aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800221 audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -0700222 aidl2legacy_AudioFormatDescription_audio_format_t(encodedFormatAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800223
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800224 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800225 return binderStatusFromStatusT(NO_INIT);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800226 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700227 if (!(audioserver_permissions() ?
228 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
229 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800230 return binderStatusFromStatusT(PERMISSION_DENIED);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800231 }
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800232
233 ALOGV("handleDeviceConfigChange()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800234 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700235 AutoCallerClear acc;
Eric Laurent39095982021-08-24 18:29:27 +0200236 status_t status = mAudioPolicyManager->handleDeviceConfigChange(
Mikhail Naganov932cb962021-09-16 01:05:27 +0000237 device, address.c_str(), deviceNameAidl.c_str(), encodedFormat);
Eric Laurent39095982021-08-24 18:29:27 +0200238
239 if (status == NO_ERROR) {
240 onCheckSpatializer_l();
241 }
242 return binderStatusFromStatusT(status);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800243}
244
Mikhail Naganovddceecc2021-09-03 13:58:56 -0700245Status AudioPolicyService::setPhoneState(AudioMode stateAidl, int32_t uidAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800246{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800247 audio_mode_t state = VALUE_OR_RETURN_BINDER_STATUS(
248 aidl2legacy_AudioMode_audio_mode_t(stateAidl));
249 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700250 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800251 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800252 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700253 if (!(audioserver_permissions() ?
254 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
255 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800256 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800257 }
258 if (uint32_t(state) >= AUDIO_MODE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800259 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800260 }
261
262 ALOGV("setPhoneState()");
263
Eric Laurentbeb07fe2015-09-16 15:49:30 -0700264 // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic
265 // operation from policy manager standpoint (no other operation (e.g track start or stop)
266 // can be interleaved).
Andy Hung79eacdb2023-11-30 19:34:24 -0800267 audio_utils::lock_guard _l(mMutex);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800268 // TODO: check if it is more appropriate to do it in platform specific policy manager
Eric Laurentc8c4f1f2021-11-09 11:51:34 +0100269
270 // Audio HAL mode conversion for call redirect modes
271 audio_mode_t halMode = state;
272 if (state == AUDIO_MODE_CALL_REDIRECT) {
273 halMode = AUDIO_MODE_CALL_SCREEN;
274 } else if (state == AUDIO_MODE_COMMUNICATION_REDIRECT) {
275 halMode = AUDIO_MODE_NORMAL;
276 }
277 AudioSystem::setMode(halMode);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800278
Eric Laurent10b71232018-04-13 18:14:44 -0700279 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700280 mAudioPolicyManager->setPhoneState(state);
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700281 mPhoneState = state;
Eric Laurent00dba062020-02-11 15:52:09 -0800282 mPhoneStateOwnerUid = uid;
Mingshu Pangd07c19b2021-02-25 11:40:32 +0800283 updateUidStates_l();
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800284 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800285}
286
Mikhail Naganovddceecc2021-09-03 13:58:56 -0700287Status AudioPolicyService::getPhoneState(AudioMode* _aidl_return) {
Andy Hung79eacdb2023-11-30 19:34:24 -0800288 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800289 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_mode_t_AudioMode(mPhoneState));
290 return Status::ok();
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700291}
292
François Gaffie873738c2024-08-02 17:09:21 +0200293Status AudioPolicyService::setForceUse(AudioPolicyForceUse usageAidl,
294 AudioPolicyForcedConfig configAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800295{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800296 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
297 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
298 audio_policy_forced_cfg_t config = VALUE_OR_RETURN_BINDER_STATUS(
299 aidl2legacy_AudioPolicyForcedConfig_audio_policy_forced_cfg_t(configAidl));
300
Eric Laurentdce54a12014-03-10 12:19:46 -0700301 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800302 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800303 }
Eric Laurente17378d2018-05-09 14:43:01 -0700304
Atneya Nair09859fe2024-07-15 16:38:02 -0700305 if (!(audioserver_permissions() ?
306 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
307 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800308 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800309 }
Eric Laurente17378d2018-05-09 14:43:01 -0700310
Eric Laurent2d388ec2014-03-07 13:25:54 -0800311 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800312 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800313 }
314 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800315 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800316 }
317 ALOGV("setForceUse()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800318 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700319 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700320 mAudioPolicyManager->setForceUse(usage, config);
Eric Laurent39095982021-08-24 18:29:27 +0200321 onCheckSpatializer_l();
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800322 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800323}
324
François Gaffie873738c2024-08-02 17:09:21 +0200325Status AudioPolicyService::getForceUse(AudioPolicyForceUse usageAidl,
326 AudioPolicyForcedConfig* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800327 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
328 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
329
Eric Laurentdce54a12014-03-10 12:19:46 -0700330 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800331 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800332 }
333 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800334 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
335 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(AUDIO_POLICY_FORCE_NONE));
336 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800337 }
Eric Laurent10b71232018-04-13 18:14:44 -0700338 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800339 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
340 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(
341 mAudioPolicyManager->getForceUse(usage)));
342 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800343}
344
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700345Status AudioPolicyService::getOutput(AudioStreamType streamAidl, int32_t* _aidl_return)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800346{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800347 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
348 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
349
Eric Laurent72af8012023-03-15 17:36:22 +0100350 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT
351 && stream != AUDIO_STREAM_ASSISTANT && stream != AUDIO_STREAM_CALL_ASSISTANT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800352 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
353 legacy2aidl_audio_io_handle_t_int32_t(AUDIO_IO_HANDLE_NONE));
354 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -0700355 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700356 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800357 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800358 }
359 ALOGV("getOutput()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800360 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700361 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800362 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
363 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutput(stream)));
364 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800365}
366
Mikhail Naganov1c400902023-05-17 11:48:43 -0700367Status AudioPolicyService::getOutputForAttr(const media::audio::common::AudioAttributes& attrAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800368 int32_t sessionAidl,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000369 const AttributionSourceState& attributionSource,
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700370 const AudioConfig& configAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800371 int32_t flagsAidl,
Robert Wufb971192024-10-30 21:54:35 +0000372 const std::vector<int32_t>& selectedDeviceIdsAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800373 media::GetOutputForAttrResponse* _aidl_return)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700374{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800375 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -0700376 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800377 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
378 aidl2legacy_int32_t_audio_session_t(sessionAidl));
379 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800380 audio_config_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -0700381 aidl2legacy_AudioConfig_audio_config_t(configAidl, false /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800382 audio_output_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
383 aidl2legacy_int32_t_audio_output_flags_t_mask(flagsAidl));
Robert Wufb971192024-10-30 21:54:35 +0000384 DeviceIdVector selectedDeviceIds = VALUE_OR_RETURN_BINDER_STATUS(
385 convertContainer<DeviceIdVector>(selectedDeviceIdsAidl,
386 aidl2legacy_int32_t_audio_port_handle_t));
Eric Laurentf99edd32021-02-01 15:57:33 +0100387
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800388 audio_io_handle_t output;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800389 audio_port_handle_t portId;
390 std::vector<audio_io_handle_t> secondaryOutputs;
391
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700392 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800393 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700394 }
Hayden Gomes524159d2019-12-23 14:41:47 -0800395
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800396 RETURN_IF_BINDER_ERROR(
397 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Atneya Nair09859fe2024-07-15 16:38:02 -0700398 RETURN_IF_BINDER_ERROR(validateUsage(attr, attributionSource));
Hayden Gomes524159d2019-12-23 14:41:47 -0800399
Eric Laurent8a1095a2019-11-08 14:44:16 -0800400 ALOGV("%s()", __func__);
Andy Hung79eacdb2023-11-30 19:34:24 -0800401 audio_utils::lock_guard _l(mMutex);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700402
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700403 if (!mPackageManager.allowPlaybackCapture(VALUE_OR_RETURN_BINDER_STATUS(
Eric Laurent9ff3e532022-11-10 16:04:44 +0100404 aidl2legacy_int32_t_uid_t(attributionSource.uid)))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800405 attr.flags = static_cast<audio_flags_mask_t>(attr.flags | AUDIO_FLAG_NO_MEDIA_PROJECTION);
Eric Laurent42984412019-05-09 17:57:03 -0700406 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700407 const bool bypassInterruptionAllowed = audioserver_permissions() ? (
408 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid) ||
409 CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid) ||
410 CHECK_PERM(WRITE_SECURE_SETTINGS, attributionSource.uid))
411 : bypassInterruptionPolicyAllowed(attributionSource);
412
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800413 if (((attr.flags & (AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)) != 0)
Atneya Nair09859fe2024-07-15 16:38:02 -0700414 && !bypassInterruptionAllowed) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800415 attr.flags = static_cast<audio_flags_mask_t>(
416 attr.flags & ~(AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE));
Kevin Rocard8be94972019-02-22 13:26:25 -0800417 }
Carter Hsua3abb402021-10-26 11:11:20 +0800418
419 if (attr.content_type == AUDIO_CONTENT_TYPE_ULTRASOUND) {
Atneya Nair09859fe2024-07-15 16:38:02 -0700420 if (!(audioserver_permissions() ?
421 CHECK_PERM(ACCESS_ULTRASOUND, attributionSource.uid)
422 : accessUltrasoundAllowed(attributionSource))) {
Carter Hsua3abb402021-10-26 11:11:20 +0800423 ALOGE("%s: permission denied: ultrasound not allowed for uid %d pid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100424 __func__, attributionSource.uid, attributionSource.pid);
Carter Hsua3abb402021-10-26 11:11:20 +0800425 return binderStatusFromStatusT(PERMISSION_DENIED);
426 }
427 }
428
Eric Laurent10b71232018-04-13 18:14:44 -0700429 AutoCallerClear acc;
Eric Laurent8a1095a2019-11-08 14:44:16 -0800430 AudioPolicyInterface::output_type_t outputType;
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200431 bool isSpatialized = false;
jiabinc658e452022-10-21 20:52:21 +0000432 bool isBitPerfect = false;
Andy Hung6b137d12024-08-27 22:35:17 +0000433 float volume;
Vlad Popa1e865e62024-08-15 19:11:42 -0700434 bool muted;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800435 status_t result = mAudioPolicyManager->getOutputForAttr(&attr, &output, session,
436 &stream,
Eric Laurent9ff3e532022-11-10 16:04:44 +0100437 attributionSource,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800438 &config,
Robert Wufb971192024-10-30 21:54:35 +0000439 &flags, &selectedDeviceIds, &portId,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800440 &secondaryOutputs,
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200441 &outputType,
jiabinc658e452022-10-21 20:52:21 +0000442 &isSpatialized,
Andy Hung6b137d12024-08-27 22:35:17 +0000443 &isBitPerfect,
Vlad Popa1e865e62024-08-15 19:11:42 -0700444 &volume,
445 &muted);
Nadav Bar766fb022018-01-07 12:18:03 +0200446
447 // FIXME: Introduce a way to check for the the telephony device before opening the output
Eric Laurent8a1095a2019-11-08 14:44:16 -0800448 if (result == NO_ERROR) {
449 // enforce permission (if any) required for each type of input
450 switch (outputType) {
451 case AudioPolicyInterface::API_OUTPUT_LEGACY:
452 break;
453 case AudioPolicyInterface::API_OUTPUT_TELEPHONY_TX:
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100454 if (((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0)
Atneya Nair09859fe2024-07-15 16:38:02 -0700455 && !(audioserver_permissions() ?
456 CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
457 : callAudioInterceptionAllowed(attributionSource))) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100458 ALOGE("%s() permission denied: call redirection not allowed for uid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100459 __func__, attributionSource.uid);
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100460 result = PERMISSION_DENIED;
Atneya Nair09859fe2024-07-15 16:38:02 -0700461 } else if (!(audioserver_permissions() ?
462 CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid)
463 : modifyPhoneStateAllowed(attributionSource))) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800464 ALOGE("%s() permission denied: modify phone state not allowed for uid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100465 __func__, attributionSource.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800466 result = PERMISSION_DENIED;
467 }
468 break;
469 case AudioPolicyInterface::API_OUT_MIX_PLAYBACK:
Atneya Nair09859fe2024-07-15 16:38:02 -0700470 if (!(audioserver_permissions() ?
471 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid)
472 : modifyAudioRoutingAllowed(attributionSource))) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800473 ALOGE("%s() permission denied: modify audio routing not allowed for uid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100474 __func__, attributionSource.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800475 result = PERMISSION_DENIED;
476 }
477 break;
478 case AudioPolicyInterface::API_OUTPUT_INVALID:
479 default:
480 LOG_ALWAYS_FATAL("%s() encountered an invalid output type %d",
481 __func__, (int)outputType);
482 }
Nadav Bar766fb022018-01-07 12:18:03 +0200483 }
Eric Laurentd7fe0862018-07-14 16:48:01 -0700484
485 if (result == NO_ERROR) {
Eric Laurent0d13fea2022-11-04 17:12:08 +0100486 attr = VALUE_OR_RETURN_BINDER_STATUS(
487 mUsecaseValidator->verifyAudioAttributes(output, attributionSource, attr));
488
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800489 sp<AudioPlaybackClient> client =
Eric Laurent9ff3e532022-11-10 16:04:44 +0100490 new AudioPlaybackClient(attr, output, attributionSource, session,
Robert Wufb971192024-10-30 21:54:35 +0000491 portId, selectedDeviceIds, stream, isSpatialized, config.channel_mask);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800492 mAudioPlaybackClients.add(portId, client);
493
494 _aidl_return->output = VALUE_OR_RETURN_BINDER_STATUS(
495 legacy2aidl_audio_io_handle_t_int32_t(output));
496 _aidl_return->stream = VALUE_OR_RETURN_BINDER_STATUS(
497 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
Robert Wufb971192024-10-30 21:54:35 +0000498 _aidl_return->selectedDeviceIds = VALUE_OR_RETURN_BINDER_STATUS(
499 convertContainer<std::vector<int32_t>>(selectedDeviceIds,
500 legacy2aidl_audio_port_handle_t_int32_t));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800501 _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
502 legacy2aidl_audio_port_handle_t_int32_t(portId));
503 _aidl_return->secondaryOutputs = VALUE_OR_RETURN_BINDER_STATUS(
504 convertContainer<std::vector<int32_t>>(secondaryOutputs,
505 legacy2aidl_audio_io_handle_t_int32_t));
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200506 _aidl_return->isSpatialized = isSpatialized;
jiabinc658e452022-10-21 20:52:21 +0000507 _aidl_return->isBitPerfect = isBitPerfect;
Eric Laurent0d13fea2022-11-04 17:12:08 +0100508 _aidl_return->attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -0700509 legacy2aidl_audio_attributes_t_AudioAttributes(attr));
Andy Hung6b137d12024-08-27 22:35:17 +0000510 _aidl_return->volume = volume;
Vlad Popa1e865e62024-08-15 19:11:42 -0700511 _aidl_return->muted = muted;
jiabinf1c73972022-04-14 16:28:52 -0700512 } else {
513 _aidl_return->configBase.format = VALUE_OR_RETURN_BINDER_STATUS(
514 legacy2aidl_audio_format_t_AudioFormatDescription(config.format));
515 _aidl_return->configBase.channelMask = VALUE_OR_RETURN_BINDER_STATUS(
516 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
517 config.channel_mask, false /*isInput*/));
518 _aidl_return->configBase.sampleRate = config.sample_rate;
Eric Laurentd7fe0862018-07-14 16:48:01 -0700519 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800520 return binderStatusFromStatusT(result);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700521}
522
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700523void AudioPolicyService::getPlaybackClientAndEffects(audio_port_handle_t portId,
524 sp<AudioPlaybackClient>& client,
525 sp<AudioPolicyEffects>& effects,
526 const char *context)
527{
Andy Hung79eacdb2023-11-30 19:34:24 -0800528 audio_utils::lock_guard _l(mMutex);
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700529 const ssize_t index = mAudioPlaybackClients.indexOfKey(portId);
530 if (index < 0) {
531 ALOGE("%s AudioTrack client not found for portId %d", context, portId);
532 return;
533 }
534 client = mAudioPlaybackClients.valueAt(index);
535 effects = mAudioPolicyEffects;
536}
537
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800538Status AudioPolicyService::startOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800539{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800540 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
541 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700542 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800543 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800544 }
545 ALOGV("startOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700546 sp<AudioPlaybackClient> client;
Shunkai Yao8d6489a2023-04-18 23:14:25 +0000547 sp<AudioPolicyEffects> audioPolicyEffects;
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700548
549 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
550
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700551 if (audioPolicyEffects != 0) {
552 // create audio processors according to stream
Shunkai Yao8d6489a2023-04-18 23:14:25 +0000553 status_t status = audioPolicyEffects->addOutputSessionEffects(client->io, client->stream,
554 client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700555 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700556 ALOGW("Failed to add effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700557 }
558 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800559 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700560 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700561 status_t status = mAudioPolicyManager->startOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700562 if (status == NO_ERROR) {
Eric Laurent0d13fea2022-11-04 17:12:08 +0100563 //TODO b/257922898: decide if/how we need to handle attributes update when playback starts
564 // or during playback
565 (void)mUsecaseValidator->startClient(client->io, client->portId, client->attributionSource,
566 client->attributes, nullptr /* callback */);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700567 client->active = true;
Eric Laurent15903592022-02-24 20:44:36 +0100568 onUpdateActiveSpatializerTracks_l();
Eric Laurentd7fe0862018-07-14 16:48:01 -0700569 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800570 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800571}
572
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800573Status AudioPolicyService::stopOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800574{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800575 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
576 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700577 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800578 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800579 }
580 ALOGV("stopOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700581 mOutputCommandThread->stopOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800582 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800583}
584
Eric Laurentd7fe0862018-07-14 16:48:01 -0700585status_t AudioPolicyService::doStopOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800586{
Eric Laurentd7fe0862018-07-14 16:48:01 -0700587 ALOGV("doStopOutput");
588 sp<AudioPlaybackClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700589 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentd7fe0862018-07-14 16:48:01 -0700590
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700591 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
592
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700593 if (audioPolicyEffects != 0) {
594 // release audio processors from the stream
Eric Laurentd7fe0862018-07-14 16:48:01 -0700595 status_t status = audioPolicyEffects->releaseOutputSessionEffects(
596 client->io, client->stream, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700597 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700598 ALOGW("Failed to release effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700599 }
600 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800601 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700602 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700603 status_t status = mAudioPolicyManager->stopOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700604 if (status == NO_ERROR) {
605 client->active = false;
Eric Laurent15903592022-02-24 20:44:36 +0100606 onUpdateActiveSpatializerTracks_l();
Eric Laurent0d13fea2022-11-04 17:12:08 +0100607 mUsecaseValidator->stopClient(client->io, client->portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700608 }
609 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800610}
611
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800612Status AudioPolicyService::releaseOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800613{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800614 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
615 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700616 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800617 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800618 }
619 ALOGV("releaseOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700620 mOutputCommandThread->releaseOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800621 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800622}
623
Eric Laurentd7fe0862018-07-14 16:48:01 -0700624void AudioPolicyService::doReleaseOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800625{
626 ALOGV("doReleaseOutput from tid %d", gettid());
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700627 sp<AudioPlaybackClient> client;
628 sp<AudioPolicyEffects> audioPolicyEffects;
629
630 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
631
632 if (audioPolicyEffects != 0 && client->active) {
633 // clean up effects if output was not stopped before being released
634 audioPolicyEffects->releaseOutputSessionEffects(
635 client->io, client->stream, client->session);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700636 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800637 audio_utils::lock_guard _l(mMutex);
Eric Laurent15903592022-02-24 20:44:36 +0100638 if (client != nullptr && client->active) {
639 onUpdateActiveSpatializerTracks_l();
640 }
Eric Laurentd4007242019-03-27 12:42:16 -0700641 mAudioPlaybackClients.removeItem(portId);
Eric Laurent10b71232018-04-13 18:14:44 -0700642 // called from internal thread: no need to clear caller identity
Eric Laurent8fc147b2018-07-22 19:13:55 -0700643 mAudioPolicyManager->releaseOutput(portId);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800644}
645
Mikhail Naganov1c400902023-05-17 11:48:43 -0700646Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttributes& attrAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800647 int32_t inputAidl,
648 int32_t riidAidl,
649 int32_t sessionAidl,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000650 const AttributionSourceState& attributionSource,
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700651 const AudioConfigBase& configAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800652 int32_t flagsAidl,
Eric Laurentf99edd32021-02-01 15:57:33 +0100653 int32_t selectedDeviceIdAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800654 media::GetInputForAttrResponse* _aidl_return) {
655 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -0700656 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800657 audio_io_handle_t input = VALUE_OR_RETURN_BINDER_STATUS(
658 aidl2legacy_int32_t_audio_io_handle_t(inputAidl));
659 audio_unique_id_t riid = VALUE_OR_RETURN_BINDER_STATUS(
660 aidl2legacy_int32_t_audio_unique_id_t(riidAidl));
661 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
662 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800663 audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -0700664 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl, true /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800665 audio_input_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
666 aidl2legacy_int32_t_audio_input_flags_t_mask(flagsAidl));
Eric Laurentf99edd32021-02-01 15:57:33 +0100667 audio_port_handle_t selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
668 aidl2legacy_int32_t_audio_port_handle_t(selectedDeviceIdAidl));
669
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800670 audio_port_handle_t portId;
671
Eric Laurentdce54a12014-03-10 12:19:46 -0700672 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800673 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800674 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800675
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800676 RETURN_IF_BINDER_ERROR(
677 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Hayden Gomes524159d2019-12-23 14:41:47 -0800678
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800679 audio_source_t inputSource = attr.source;
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900680 if (inputSource == AUDIO_SOURCE_DEFAULT) {
681 inputSource = AUDIO_SOURCE_MIC;
682 }
683
Eric Laurent2d388ec2014-03-07 13:25:54 -0800684 // already checked by client, but double-check in case the client wrapper is bypassed
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900685 if ((inputSource < AUDIO_SOURCE_DEFAULT)
686 || (inputSource >= AUDIO_SOURCE_CNT
687 && inputSource != AUDIO_SOURCE_HOTWORD
688 && inputSource != AUDIO_SOURCE_FM_TUNER
Carter Hsua3abb402021-10-26 11:11:20 +0800689 && inputSource != AUDIO_SOURCE_ECHO_REFERENCE
690 && inputSource != AUDIO_SOURCE_ULTRASOUND)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800691 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800692 }
693
Atneya Nair09859fe2024-07-15 16:38:02 -0700694 RETURN_IF_BINDER_ERROR(validateUsage(attr, attributionSource));
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700695
Marvin Ramine5a122d2023-12-07 13:57:59 +0100696 uint32_t virtualDeviceId = kDefaultVirtualDeviceId;
697
Eric Laurent58a0dd82019-10-24 12:42:17 -0700698 // check calling permissions.
Eric Laurent637bd202021-09-22 11:17:11 +0200699 // Capturing from the following sources does not require permission RECORD_AUDIO
700 // as the captured audio does not come from a microphone:
701 // - FM_TUNER source is controlled by captureTunerAudioInputAllowed() or
702 // captureAudioOutputAllowed() (deprecated).
703 // - REMOTE_SUBMIX source is controlled by captureAudioOutputAllowed() if the input
704 // type is API_INPUT_MIX_EXT_POLICY_REROUTE and by AudioService if a media projection
705 // is used and input type is API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK
706 // - ECHO_REFERENCE source is controlled by captureAudioOutputAllowed()
Atneya Nair09859fe2024-07-15 16:38:02 -0700707 const auto isRecordingAllowed = audioserver_permissions() ?
708 CHECK_PERM(RECORD_AUDIO, attributionSource.uid) :
709 recordingAllowed(attributionSource, inputSource);
710 if (!(isRecordingAllowed
Eric Laurent637bd202021-09-22 11:17:11 +0200711 || inputSource == AUDIO_SOURCE_FM_TUNER
712 || inputSource == AUDIO_SOURCE_REMOTE_SUBMIX
713 || inputSource == AUDIO_SOURCE_ECHO_REFERENCE)) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700714 ALOGE("%s permission denied: recording not allowed for %s",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100715 __func__, attributionSource.toString().c_str());
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800716 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800717 }
718
Atneya Nair09859fe2024-07-15 16:38:02 -0700719 bool canCaptureOutput = audioserver_permissions() ?
720 CHECK_PERM(CAPTURE_AUDIO_OUTPUT, attributionSource.uid)
721 : captureAudioOutputAllowed(attributionSource);
722 bool canInterceptCallAudio = audioserver_permissions() ?
723 CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
724 : callAudioInterceptionAllowed(attributionSource);
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100725 bool isCallAudioSource = inputSource == AUDIO_SOURCE_VOICE_UPLINK
726 || inputSource == AUDIO_SOURCE_VOICE_DOWNLINK
727 || inputSource == AUDIO_SOURCE_VOICE_CALL;
728
729 if (isCallAudioSource && !canInterceptCallAudio && !canCaptureOutput) {
730 return binderStatusFromStatusT(PERMISSION_DENIED);
731 }
732 if (inputSource == AUDIO_SOURCE_ECHO_REFERENCE
Eric Laurent637bd202021-09-22 11:17:11 +0200733 && !canCaptureOutput) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800734 return binderStatusFromStatusT(PERMISSION_DENIED);
Hayden Gomesb7429922020-12-11 13:59:18 -0800735 }
Hayden Gomesb7429922020-12-11 13:59:18 -0800736 if (inputSource == AUDIO_SOURCE_FM_TUNER
Eric Laurent637bd202021-09-22 11:17:11 +0200737 && !canCaptureOutput
Atneya Nair09859fe2024-07-15 16:38:02 -0700738 && !(audioserver_permissions() ?
739 CHECK_PERM(CAPTURE_TUNER_AUDIO_INPUT, attributionSource.uid)
740 : captureTunerAudioInputAllowed(attributionSource))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800741 return binderStatusFromStatusT(PERMISSION_DENIED);
Nadav Bar744be482018-05-08 13:26:21 +0300742 }
743
Atneya Nair09859fe2024-07-15 16:38:02 -0700744 bool canCaptureHotword = audioserver_permissions() ?
745 CHECK_PERM(CAPTURE_AUDIO_HOTWORD, attributionSource.uid)
746 : captureHotwordAllowed(attributionSource);
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900747 if ((inputSource == AUDIO_SOURCE_HOTWORD) && !canCaptureHotword) {
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800748 return binderStatusFromStatusT(PERMISSION_DENIED);
749 }
750
Atneya Nair0f0a8032022-12-12 16:20:12 -0800751 if (((flags & (AUDIO_INPUT_FLAG_HW_HOTWORD |
752 AUDIO_INPUT_FLAG_HOTWORD_TAP |
753 AUDIO_INPUT_FLAG_HW_LOOKBACK)) != 0)
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800754 && !canCaptureHotword) {
755 ALOGE("%s: permission denied: hotword mode not allowed"
Eric Laurent9ff3e532022-11-10 16:04:44 +0100756 " for uid %d pid %d", __func__, attributionSource.uid, attributionSource.pid);
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800757 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7504b9e2017-08-15 18:17:26 -0700758 }
759
Carter Hsua3abb402021-10-26 11:11:20 +0800760 if (attr.source == AUDIO_SOURCE_ULTRASOUND) {
Atneya Nair09859fe2024-07-15 16:38:02 -0700761 if (!(audioserver_permissions() ?
762 CHECK_PERM(ACCESS_ULTRASOUND, attributionSource.uid)
763 : accessUltrasoundAllowed(attributionSource))) {
Carter Hsua3abb402021-10-26 11:11:20 +0800764 ALOGE("%s: permission denied: ultrasound not allowed for uid %d pid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100765 __func__, attributionSource.uid, attributionSource.pid);
Carter Hsua3abb402021-10-26 11:11:20 +0800766 return binderStatusFromStatusT(PERMISSION_DENIED);
767 }
768 }
769
Eric Laurent7504b9e2017-08-15 18:17:26 -0700770 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700771 {
Eric Laurent7504b9e2017-08-15 18:17:26 -0700772 status_t status;
773 AudioPolicyInterface::input_type_t inputType;
774
Andy Hung79eacdb2023-11-30 19:34:24 -0800775 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700776 {
777 AutoCallerClear acc;
778 // the audio_in_acoustics_t parameter is ignored by get_input()
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700779 status = mAudioPolicyManager->getInputForAttr(&attr, &input, riid, session,
Eric Laurent9ff3e532022-11-10 16:04:44 +0100780 attributionSource, &config,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800781 flags, &selectedDeviceId,
Marvin Ramine5a122d2023-12-07 13:57:59 +0100782 &inputType, &portId,
783 &virtualDeviceId);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700784
Eric Laurent10b71232018-04-13 18:14:44 -0700785 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700786 audioPolicyEffects = mAudioPolicyEffects;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800787
788 if (status == NO_ERROR) {
789 // enforce permission (if any) required for each type of input
790 switch (inputType) {
Kevin Rocard25f9b052019-02-27 15:08:54 -0800791 case AudioPolicyInterface::API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK:
792 // this use case has been validated in audio service with a MediaProjection token,
793 // and doesn't rely on regular permissions
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800794 case AudioPolicyInterface::API_INPUT_LEGACY:
795 break;
Eric Laurent82db2692015-08-07 13:59:42 -0700796 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX:
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100797 if ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0
798 && canInterceptCallAudio) {
799 break;
800 }
Eric Laurent82db2692015-08-07 13:59:42 -0700801 // FIXME: use the same permission as for remote submix for now.
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100802 FALLTHROUGH_INTENDED;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800803 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
Eric Laurent1ff16a72019-03-14 18:35:04 -0700804 if (!canCaptureOutput) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100805 ALOGE("%s permission denied: capture not allowed", __func__);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800806 status = PERMISSION_DENIED;
807 }
808 break;
Atneya Nair09859fe2024-07-15 16:38:02 -0700809 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE: {
810 bool modAudioRoutingAllowed;
811 if (audioserver_permissions()) {
812 auto result = getPermissionProvider().checkPermission(
813 MODIFY_AUDIO_ROUTING, attributionSource.uid);
814 if (!result.ok()) {
815 ALOGE("%s permission provider error: %s", __func__,
816 result.error().toString8().c_str());
817 status = aidl_utils::statusTFromBinderStatus(result.error());
818 break;
819 }
820 modAudioRoutingAllowed = result.value();
821 } else {
822 modAudioRoutingAllowed = modifyAudioRoutingAllowed(attributionSource);
823 }
824 if (!(modAudioRoutingAllowed
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100825 || ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0
826 && canInterceptCallAudio))) {
827 ALOGE("%s permission denied for remote submix capture", __func__);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800828 status = PERMISSION_DENIED;
829 }
830 break;
Atneya Nair09859fe2024-07-15 16:38:02 -0700831 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800832 case AudioPolicyInterface::API_INPUT_INVALID:
833 default:
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100834 LOG_ALWAYS_FATAL("%s encountered an invalid input type %d",
835 __func__, (int)inputType);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800836 }
Marvin Ramine5a122d2023-12-07 13:57:59 +0100837
838 if (audiopolicy_flags::record_audio_device_aware_permission()) {
839 // enforce device-aware RECORD_AUDIO permission
840 if (virtualDeviceId != kDefaultVirtualDeviceId &&
841 !recordingAllowed(attributionSource, virtualDeviceId, inputSource)) {
842 status = PERMISSION_DENIED;
843 }
844 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800845 }
846
847 if (status != NO_ERROR) {
848 if (status == PERMISSION_DENIED) {
Eric Laurent10b71232018-04-13 18:14:44 -0700849 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800850 mAudioPolicyManager->releaseInput(portId);
jiabinf1c73972022-04-14 16:28:52 -0700851 } else {
852 _aidl_return->config = VALUE_OR_RETURN_BINDER_STATUS(
853 legacy2aidl_audio_config_base_t_AudioConfigBase(config, true /*isInput*/));
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800854 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800855 return binderStatusFromStatusT(status);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800856 }
Eric Laurentfee19762018-01-29 18:44:13 -0800857
Robert Wufb971192024-10-30 21:54:35 +0000858 DeviceIdVector selectedDeviceIds = { selectedDeviceId };
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700859 sp<AudioRecordClient> client = new AudioRecordClient(attr, input, session, portId,
Robert Wufb971192024-10-30 21:54:35 +0000860 selectedDeviceIds, attributionSource,
Marvin Ramine5a122d2023-12-07 13:57:59 +0100861 virtualDeviceId,
Eric Laurented726cc2021-07-01 14:26:41 +0200862 canCaptureOutput, canCaptureHotword,
Eric Laurent9925db52021-07-20 16:03:34 +0200863 mOutputCommandThread);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800864 mAudioRecordClients.add(portId, client);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700865 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800866
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700867 if (audioPolicyEffects != 0) {
868 // create audio pre processors according to input source
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800869 status_t status = audioPolicyEffects->addInputEffects(input, inputSource, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700870 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800871 ALOGW("Failed to add effects on input %d", input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700872 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800873 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800874
875 _aidl_return->input = VALUE_OR_RETURN_BINDER_STATUS(
876 legacy2aidl_audio_io_handle_t_int32_t(input));
877 _aidl_return->selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
878 legacy2aidl_audio_port_handle_t_int32_t(selectedDeviceId));
879 _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
880 legacy2aidl_audio_port_handle_t_int32_t(portId));
881 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800882}
883
Eric Laurent99fcae42018-05-17 16:59:18 -0700884std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) {
jiabin19cdba52020-11-24 11:28:58 -0800885 struct audio_port_v7 port = {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700886 port.id = portId;
887 status_t status = mAudioPolicyManager->getAudioPort(&port);
888 if (status == NO_ERROR && port.type == AUDIO_PORT_TYPE_DEVICE) {
Andy Hung9b181952019-02-25 14:53:36 -0800889 return toString(port.ext.device.type);
Eric Laurent99fcae42018-05-17 16:59:18 -0700890 }
Andy Hung9b181952019-02-25 14:53:36 -0800891 return {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700892}
893
Robert Wufb971192024-10-30 21:54:35 +0000894std::string AudioPolicyService::getDeviceTypeStrForPortIds(DeviceIdVector portIds) {
895 std::string output = {};
896 for (auto it = portIds.begin(); it != portIds.end(); ++it) {
897 if (it != portIds.begin()) {
898 output += ", ";
899 }
900 output += getDeviceTypeStrForPortId(*it);
901 }
902 return output;
903}
904
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800905Status AudioPolicyService::startInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800906{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800907 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
908 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
909
Eric Laurentdce54a12014-03-10 12:19:46 -0700910 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800911 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800912 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800913 sp<AudioRecordClient> client;
914 {
Andy Hung79eacdb2023-11-30 19:34:24 -0800915 audio_utils::lock_guard _l(mMutex);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800916
Eric Laurent7dca8a82018-01-29 18:44:26 -0800917 ssize_t index = mAudioRecordClients.indexOfKey(portId);
918 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800919 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800920 }
921 client = mAudioRecordClients.valueAt(index);
Eric Laurentfee19762018-01-29 18:44:13 -0800922 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800923
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700924 std::stringstream msg;
925 msg << "Audio recording on session " << client->session;
Atneya Nairdb6ef1e2024-09-16 20:26:30 +0000926 const auto permitted = startRecording(client->attributionSource, client->virtualDeviceId,
927 String16(msg.str().c_str()), client->attributes.source);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700928
Eric Laurent7dca8a82018-01-29 18:44:26 -0800929 // check calling permissions
Atneya Nairdb6ef1e2024-09-16 20:26:30 +0000930 if (permitted == PERMISSION_HARD_DENIED && client->attributes.source != AUDIO_SOURCE_FM_TUNER
931 && client->attributes.source != AUDIO_SOURCE_REMOTE_SUBMIX
932 && client->attributes.source != AUDIO_SOURCE_ECHO_REFERENCE) {
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000933 ALOGE("%s permission denied: recording not allowed for attribution source %s",
934 __func__, client->attributionSource.toString().c_str());
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800935 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800936 }
Eric Laurentfee19762018-01-29 18:44:13 -0800937
Andy Hung79eacdb2023-11-30 19:34:24 -0800938 audio_utils::lock_guard _l(mMutex);
Eric Laurent4eb58f12018-12-07 16:41:02 -0800939
Atneya Naire7720b32023-05-10 17:26:30 -0700940 ALOGW_IF(client->silenced, "startInput on silenced input for port %d, uid %d. Unsilencing.",
941 portIdAidl,
942 client->attributionSource.uid);
943
944 if (client->active) {
945 ALOGE("Client should never be active before startInput. Uid %d port %d",
946 client->attributionSource.uid, portId);
Marvin Raminb03b49f2024-04-04 16:25:31 +0200947 finishRecording(client->attributionSource, client->virtualDeviceId,
948 client->attributes.source);
Atneya Naire7720b32023-05-10 17:26:30 -0700949 return binderStatusFromStatusT(INVALID_OPERATION);
950 }
951
Atneya Nairdb6ef1e2024-09-16 20:26:30 +0000952 // Force the possibly silenced client to match the state on the appops side
953 // following the call to startRecording (i.e. unsilenced iff call succeeded)
954 // At this point in time, the client is inactive, so no calls to appops are
955 // sent in setAppState_l. This ensures existing clients have the same
956 // behavior as new clients.
Atneya Naire7720b32023-05-10 17:26:30 -0700957 // TODO(b/282076713)
Atneya Nairdb6ef1e2024-09-16 20:26:30 +0000958 if (permitted == PERMISSION_GRANTED) {
959 setAppState_l(client, APP_STATE_TOP);
960 } else {
961 setAppState_l(client, APP_STATE_IDLE);
962 }
Atneya Naire7720b32023-05-10 17:26:30 -0700963
Eric Laurent4eb58f12018-12-07 16:41:02 -0800964 client->active = true;
965 client->startTimeNs = systemTime();
Atneya Naire7720b32023-05-10 17:26:30 -0700966 // This call updates the silenced state, and since we are active, appropriately notifies appops
967 // if we silence the track.
Eric Laurent4eb58f12018-12-07 16:41:02 -0800968 updateUidStates_l();
Eric Laurentfee19762018-01-29 18:44:13 -0800969
Eric Laurent10b71232018-04-13 18:14:44 -0700970 status_t status;
971 {
972 AutoCallerClear acc;
Eric Laurent4eb58f12018-12-07 16:41:02 -0800973 status = mAudioPolicyManager->startInput(portId);
Ray Essick84e84a52018-05-03 18:45:07 -0700974
975 }
976
Ray Essickf6a57cd2018-05-22 16:20:54 -0700977 // including successes gets very verbose
Muhammad Qureshi087b37c2020-06-16 16:37:36 -0700978 // but once we cut over to statsd, log them all.
Ray Essickf6a57cd2018-05-22 16:20:54 -0700979 if (status != NO_ERROR) {
Ray Essick84e84a52018-05-03 18:45:07 -0700980
981 static constexpr char kAudioPolicy[] = "audiopolicy";
982
Ray Essick84e84a52018-05-03 18:45:07 -0700983 static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status";
984 static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src";
985 static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg";
986 static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session";
Eric Laurent99fcae42018-05-17 16:59:18 -0700987 static constexpr char kAudioPolicyRqstDevice[] =
988 "android.media.audiopolicy.rqst.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700989 static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src";
990 static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg";
Eric Laurent99fcae42018-05-17 16:59:18 -0700991 static constexpr char kAudioPolicyActiveSession[] =
992 "android.media.audiopolicy.active.session";
993 static constexpr char kAudioPolicyActiveDevice[] =
994 "android.media.audiopolicy.active.device";
Robert Wufb971192024-10-30 21:54:35 +0000995 static constexpr char kAudioPolicyActiveDevices[] =
996 "android.media.audiopolicy.active.devices";
Ray Essick84e84a52018-05-03 18:45:07 -0700997
Ray Essickf27e9872019-12-07 06:28:46 -0800998 mediametrics::Item *item = mediametrics::Item::create(kAudioPolicy);
Ray Essick84e84a52018-05-03 18:45:07 -0700999 if (item != NULL) {
1000
Ray Essick84e84a52018-05-03 18:45:07 -07001001 item->setInt32(kAudioPolicyStatus, status);
1002
Eric Laurent99fcae42018-05-17 16:59:18 -07001003 item->setCString(kAudioPolicyRqstSrc,
Andy Hung9b181952019-02-25 14:53:36 -08001004 toString(client->attributes.source).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -07001005 item->setInt32(kAudioPolicyRqstSession, client->session);
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001006 if (client->attributionSource.packageName.has_value() &&
1007 client->attributionSource.packageName.value().size() != 0) {
Ray Essick51866952018-05-30 11:22:27 -07001008 item->setCString(kAudioPolicyRqstPkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001009 client->attributionSource.packageName.value().c_str());
Ray Essick51866952018-05-30 11:22:27 -07001010 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001011 item->setCString(kAudioPolicyRqstPkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001012 std::to_string(client->attributionSource.uid).c_str());
Ray Essick51866952018-05-30 11:22:27 -07001013 }
Robert Wufb971192024-10-30 21:54:35 +00001014 item->setCString(kAudioPolicyRqstDevice,
1015 getDeviceTypeStrForPortId(getFirstDeviceId(client->deviceIds)).c_str());
Eric Laurent99fcae42018-05-17 16:59:18 -07001016
Eric Laurent4eb58f12018-12-07 16:41:02 -08001017 int count = mAudioRecordClients.size();
1018 for (int i = 0; i < count ; i++) {
1019 if (portId == mAudioRecordClients.keyAt(i)) {
1020 continue;
1021 }
1022 sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
1023 if (other->active) {
1024 // keeps the last of the clients marked active
1025 item->setCString(kAudioPolicyActiveSrc,
Andy Hung9b181952019-02-25 14:53:36 -08001026 toString(other->attributes.source).c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -08001027 item->setInt32(kAudioPolicyActiveSession, other->session);
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001028 if (other->attributionSource.packageName.has_value() &&
1029 other->attributionSource.packageName.value().size() != 0) {
Eric Laurent4eb58f12018-12-07 16:41:02 -08001030 item->setCString(kAudioPolicyActivePkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001031 other->attributionSource.packageName.value().c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -08001032 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001033 item->setCString(kAudioPolicyRqstPkg, std::to_string(
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001034 other->attributionSource.uid).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -07001035 }
Eric Laurent4eb58f12018-12-07 16:41:02 -08001036 item->setCString(kAudioPolicyActiveDevice,
Robert Wufb971192024-10-30 21:54:35 +00001037 getDeviceTypeStrForPortId(getFirstDeviceId(other->deviceIds)).c_str());
1038 item->setCString(kAudioPolicyActiveDevices,
1039 getDeviceTypeStrForPortIds(other->deviceIds).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -07001040 }
1041 }
1042 item->selfrecord();
1043 delete item;
1044 item = NULL;
1045 }
Ray Essick6ce27e52019-02-15 10:58:05 -08001046 }
1047
1048 if (status != NO_ERROR) {
Eric Laurent4eb58f12018-12-07 16:41:02 -08001049 client->active = false;
1050 client->startTimeNs = 0;
1051 updateUidStates_l();
Atneya Nairdb6ef1e2024-09-16 20:26:30 +00001052 if (!client->silenced) {
1053 finishRecording(client->attributionSource, client->virtualDeviceId,
1054 client->attributes.source);
1055 }
Eric Laurentfb66dd92016-01-28 18:32:03 -08001056 }
1057
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001058 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001059}
1060
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001061Status AudioPolicyService::stopInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001062{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001063 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
1064 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1065
Eric Laurentdce54a12014-03-10 12:19:46 -07001066 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001067 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001068 }
Eric Laurent4eb58f12018-12-07 16:41:02 -08001069
Andy Hung79eacdb2023-11-30 19:34:24 -08001070 audio_utils::lock_guard _l(mMutex);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001071
Eric Laurentfee19762018-01-29 18:44:13 -08001072 ssize_t index = mAudioRecordClients.indexOfKey(portId);
1073 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001074 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurentfee19762018-01-29 18:44:13 -08001075 }
1076 sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
1077
Ray Essick84e84a52018-05-03 18:45:07 -07001078 client->active = false;
Eric Laurent4eb58f12018-12-07 16:41:02 -08001079 client->startTimeNs = 0;
1080
1081 updateUidStates_l();
Ray Essick84e84a52018-05-03 18:45:07 -07001082
Svet Ganov6e641372018-03-02 09:21:30 -08001083 // finish the recording app op
Atneya Nairdb6ef1e2024-09-16 20:26:30 +00001084 if (!client->silenced) {
1085 finishRecording(client->attributionSource, client->virtualDeviceId,
1086 client->attributes.source);
1087 }
1088
Eric Laurent10b71232018-04-13 18:14:44 -07001089 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001090 return binderStatusFromStatusT(mAudioPolicyManager->stopInput(portId));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001091}
1092
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001093Status AudioPolicyService::releaseInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001094{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001095 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
1096 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1097
Eric Laurentdce54a12014-03-10 12:19:46 -07001098 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001099 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001100 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001101 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -08001102 sp<AudioRecordClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001103 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001104 audio_utils::lock_guard _l(mMutex);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001105 audioPolicyEffects = mAudioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -08001106 ssize_t index = mAudioRecordClients.indexOfKey(portId);
1107 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001108 return Status::ok();
Eric Laurentfee19762018-01-29 18:44:13 -08001109 }
1110 client = mAudioRecordClients.valueAt(index);
Eric Laurent4eb58f12018-12-07 16:41:02 -08001111
1112 if (client->active) {
1113 ALOGW("%s releasing active client portId %d", __FUNCTION__, portId);
1114 client->active = false;
1115 client->startTimeNs = 0;
1116 updateUidStates_l();
1117 }
1118
Eric Laurentfee19762018-01-29 18:44:13 -08001119 mAudioRecordClients.removeItem(portId);
1120 }
1121 if (client == 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001122 return Status::ok();
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001123 }
1124 if (audioPolicyEffects != 0) {
1125 // release audio processors from the input
Eric Laurentd7fe0862018-07-14 16:48:01 -07001126 status_t status = audioPolicyEffects->releaseInputEffects(client->io, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001127 if(status != NO_ERROR) {
Eric Laurentd7fe0862018-07-14 16:48:01 -07001128 ALOGW("Failed to release effects on input %d", client->io);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001129 }
Eric Laurent2d388ec2014-03-07 13:25:54 -08001130 }
Eric Laurentf10c7092016-12-06 17:09:56 -08001131 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001132 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001133 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -07001134 mAudioPolicyManager->releaseInput(portId);
Eric Laurentf10c7092016-12-06 17:09:56 -08001135 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001136 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001137}
1138
Vlad Popa87e0e582024-05-20 18:49:20 -07001139Status AudioPolicyService::setDeviceAbsoluteVolumeEnabled(const AudioDevice& deviceAidl,
1140 bool enabled,
1141 AudioStreamType streamToDriveAbsAidl) {
Vlad Popa08502d82024-10-22 20:17:47 -07001142 ALOGI("%s: deviceAidl %s, enabled %d, streamToDriveAbsAidl %d", __func__,
1143 deviceAidl.toString().c_str(), enabled, streamToDriveAbsAidl);
1144
Vlad Popae2c51382024-10-22 21:07:42 -07001145 audio_stream_type_t streamToDriveAbs = AUDIO_STREAM_DEFAULT;
1146 if (enabled) {
1147 streamToDriveAbs = VALUE_OR_RETURN_BINDER_STATUS(
1148 aidl2legacy_AudioStreamType_audio_stream_type_t(streamToDriveAbsAidl));
1149 }
1150
Vlad Popa87e0e582024-05-20 18:49:20 -07001151 audio_devices_t deviceType;
1152 std::string address;
1153 RETURN_BINDER_STATUS_IF_ERROR(
1154 aidl2legacy_AudioDevice_audio_device(deviceAidl, &deviceType, &address));
1155
1156 if (mAudioPolicyManager == nullptr) {
1157 return binderStatusFromStatusT(NO_INIT);
1158 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001159 if (!(audioserver_permissions() ?
1160 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1161 : settingsAllowed())) {
Vlad Popa87e0e582024-05-20 18:49:20 -07001162 return binderStatusFromStatusT(PERMISSION_DENIED);
1163 }
Vlad Popae2c51382024-10-22 21:07:42 -07001164
Vlad Popa87e0e582024-05-20 18:49:20 -07001165 audio_utils::lock_guard _l(mMutex);
1166 AutoCallerClear acc;
1167 return binderStatusFromStatusT(
1168 mAudioPolicyManager->setDeviceAbsoluteVolumeEnabled(deviceType, address.c_str(),
1169 enabled, streamToDriveAbs));
1170}
1171
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001172Status AudioPolicyService::initStreamVolume(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001173 int32_t indexMinAidl,
1174 int32_t indexMaxAidl) {
1175 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1176 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1177 int indexMin = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMinAidl));
1178 int indexMax = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMaxAidl));
1179
Eric Laurentdce54a12014-03-10 12:19:46 -07001180 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001181 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001182 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001183 if (!(audioserver_permissions() ?
1184 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1185 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001186 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001187 }
Eric Laurent223fd5c2014-11-11 13:43:36 -08001188 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001189 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001190 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001191 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001192 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -07001193 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001194 return binderStatusFromStatusT(NO_ERROR);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001195}
1196
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001197Status AudioPolicyService::setStreamVolumeIndex(AudioStreamType streamAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001198 const AudioDeviceDescription& deviceAidl,
Vlad Popa1e865e62024-08-15 19:11:42 -07001199 int32_t indexAidl, bool muted) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001200 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1201 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1202 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1203 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001204 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001205
Eric Laurentdce54a12014-03-10 12:19:46 -07001206 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001207 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001208 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001209 if (!(audioserver_permissions() ?
1210 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1211 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001212 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001213 }
Eric Laurent223fd5c2014-11-11 13:43:36 -08001214 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001215 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001216 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001217 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001218 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001219 return binderStatusFromStatusT(mAudioPolicyManager->setStreamVolumeIndex(stream,
1220 index,
Vlad Popa1e865e62024-08-15 19:11:42 -07001221 muted,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001222 device));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001223}
1224
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001225Status AudioPolicyService::getStreamVolumeIndex(AudioStreamType streamAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001226 const AudioDeviceDescription& deviceAidl,
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001227 int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001228 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1229 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1230 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001231 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001232 int index;
1233
Eric Laurentdce54a12014-03-10 12:19:46 -07001234 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001235 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001236 }
Eric Laurent223fd5c2014-11-11 13:43:36 -08001237 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001238 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001239 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001240 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001241 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001242 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1243 mAudioPolicyManager->getStreamVolumeIndex(stream, &index, device)));
1244 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1245 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001246}
1247
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001248Status AudioPolicyService::setVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001249 const media::audio::common::AudioAttributes& attrAidl,
Vlad Popa1e865e62024-08-15 19:11:42 -07001250 const AudioDeviceDescription& deviceAidl, int32_t indexAidl, bool muted) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001251 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001252 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001253 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1254 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001255 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001256 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1257 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1258
François Gaffiecfe17322018-11-07 13:41:29 +01001259 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001260 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001261 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001262 if (!(audioserver_permissions() ?
1263 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1264 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001265 return binderStatusFromStatusT(PERMISSION_DENIED);
François Gaffiecfe17322018-11-07 13:41:29 +01001266 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001267 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001268 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001269 return binderStatusFromStatusT(
Vlad Popa1e865e62024-08-15 19:11:42 -07001270 mAudioPolicyManager->setVolumeIndexForAttributes(attributes, index, muted, device));
François Gaffiecfe17322018-11-07 13:41:29 +01001271}
1272
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001273Status AudioPolicyService::getVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001274 const media::audio::common::AudioAttributes& attrAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001275 const AudioDeviceDescription& deviceAidl, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001276 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001277 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001278 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001279 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001280 int index;
1281 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1282 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1283
François Gaffiecfe17322018-11-07 13:41:29 +01001284 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001285 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001286 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001287 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001288 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001289 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1290 mAudioPolicyManager->getVolumeIndexForAttributes(attributes, index, device)));
1291 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1292 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001293}
1294
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001295Status AudioPolicyService::getMinVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001296 const media::audio::common::AudioAttributes& attrAidl, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001297 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001298 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001299 int index;
1300 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1301 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1302
François Gaffiecfe17322018-11-07 13:41:29 +01001303 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001304 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001305 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001306 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001307 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001308 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1309 mAudioPolicyManager->getMinVolumeIndexForAttributes(attributes, index)));
1310 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1311 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001312}
1313
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001314Status AudioPolicyService::getMaxVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001315 const media::audio::common::AudioAttributes& attrAidl, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001316 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001317 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001318 int index;
1319 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1320 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1321
François Gaffiecfe17322018-11-07 13:41:29 +01001322 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001323 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001324 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001325 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001326 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001327 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1328 mAudioPolicyManager->getMaxVolumeIndexForAttributes(attributes, index)));
1329 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1330 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001331}
1332
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001333Status AudioPolicyService::getStrategyForStream(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001334 int32_t* _aidl_return) {
1335 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1336 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1337
Eric Laurent223fd5c2014-11-11 13:43:36 -08001338 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001339 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1340 convertReinterpret<int32_t>(PRODUCT_STRATEGY_NONE));
1341 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001342 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001343 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001344 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001345 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001346
François Gaffiec005e562018-11-06 15:04:49 +01001347 // DO NOT LOCK, may be called from AudioFlinger with lock held, reaching deadlock
Eric Laurent10b71232018-04-13 18:14:44 -07001348 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001349 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1350 legacy2aidl_product_strategy_t_int32_t(
1351 mAudioPolicyManager->getStrategyForStream(stream)));
1352 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001353}
1354
Mikhail Naganov1c400902023-05-17 11:48:43 -07001355Status AudioPolicyService::getDevicesForAttributes(
1356 const media::audio::common::AudioAttributes& attrAidl,
1357 bool forVolume,
1358 std::vector<AudioDevice>* _aidl_return)
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001359{
François Gaffie1e2b56f2022-04-01 14:34:29 +02001360 audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001361 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001362 AudioDeviceTypeAddrVector devices;
1363
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001364 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001365 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001366 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001367 audio_utils::lock_guard _l(mMutex);
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001368 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001369 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
François Gaffie1e2b56f2022-04-01 14:34:29 +02001370 mAudioPolicyManager->getDevicesForAttributes(aa, &devices, forVolume)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001371 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001372 convertContainer<std::vector<AudioDevice>>(devices,
1373 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001374 return Status::ok();
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001375}
1376
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001377Status AudioPolicyService::getOutputForEffect(const media::EffectDescriptor& descAidl,
1378 int32_t* _aidl_return) {
1379 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1380 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1381 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1382 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1383
Eric Laurentdce54a12014-03-10 12:19:46 -07001384 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001385 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001386 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001387 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001388 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001389 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1390 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutputForEffect(&desc)));
1391 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001392}
1393
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001394Status AudioPolicyService::registerEffect(const media::EffectDescriptor& descAidl, int32_t ioAidl,
1395 int32_t strategyAidl, int32_t sessionAidl,
1396 int32_t idAidl) {
1397 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1398 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1399 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1400 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1401 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
1402 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
1403 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1404 aidl2legacy_int32_t_audio_session_t(sessionAidl));
1405 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
1406 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1407 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1408
Eric Laurentdce54a12014-03-10 12:19:46 -07001409 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001410 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001411 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001412 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001413 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001414 return binderStatusFromStatusT(
1415 mAudioPolicyManager->registerEffect(&desc, io, strategy, session, id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001416}
1417
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001418Status AudioPolicyService::unregisterEffect(int32_t idAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001419{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001420 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001421 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001422 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001423 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001424 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001425 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001426 return binderStatusFromStatusT(mAudioPolicyManager->unregisterEffect(id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001427}
1428
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001429Status AudioPolicyService::setEffectEnabled(int32_t idAidl, bool enabled)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001430{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001431 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001432 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001433 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001434 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001435 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001436 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001437 return binderStatusFromStatusT(mAudioPolicyManager->setEffectEnabled(id, enabled));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001438}
1439
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001440Status AudioPolicyService::moveEffectsToIo(const std::vector<int32_t>& idsAidl, int32_t ioAidl)
1441
Eric Laurent6c796322019-04-09 14:13:17 -07001442{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001443 const std::vector<int>& ids = VALUE_OR_RETURN_BINDER_STATUS(
1444 convertContainer<std::vector<int>>(idsAidl, convertReinterpret<int, int32_t>));
1445 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1446 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1447 if (ids.size() > MAX_ITEMS_PER_LIST) {
1448 return binderStatusFromStatusT(BAD_VALUE);
1449 }
1450
Eric Laurent6c796322019-04-09 14:13:17 -07001451 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001452 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6c796322019-04-09 14:13:17 -07001453 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001454 audio_utils::lock_guard _l(mMutex);
Eric Laurent6c796322019-04-09 14:13:17 -07001455 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001456 return binderStatusFromStatusT(mAudioPolicyManager->moveEffectsToIo(ids, io));
Eric Laurent6c796322019-04-09 14:13:17 -07001457}
1458
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001459Status AudioPolicyService::isStreamActive(AudioStreamType streamAidl, int32_t inPastMsAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001460 bool* _aidl_return) {
1461 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1462 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1463 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1464
Eric Laurent223fd5c2014-11-11 13:43:36 -08001465 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001466 *_aidl_return = false;
1467 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001468 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001469 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001470 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001471 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001472 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001473 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001474 *_aidl_return = mAudioPolicyManager->isStreamActive(stream, inPastMs);
1475 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001476}
1477
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001478Status AudioPolicyService::isStreamActiveRemotely(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001479 int32_t inPastMsAidl,
1480 bool* _aidl_return) {
1481 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1482 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1483 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1484
Eric Laurent223fd5c2014-11-11 13:43:36 -08001485 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001486 *_aidl_return = false;
1487 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001488 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001489 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001490 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001491 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001492 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001493 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001494 *_aidl_return = mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
1495 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001496}
1497
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001498Status AudioPolicyService::isSourceActive(AudioSource sourceAidl, bool* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001499 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001500 aidl2legacy_AudioSource_audio_source_t(sourceAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001501 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001502 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001503 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001504 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001505 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001506 *_aidl_return = mAudioPolicyManager->isSourceActive(source);
1507 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001508}
1509
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001510status_t AudioPolicyService::getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001511{
Eric Laurentdce54a12014-03-10 12:19:46 -07001512 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -08001513 return NO_INIT;
1514 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001515 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001516 audio_utils::lock_guard _l(mMutex);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001517 audioPolicyEffects = mAudioPolicyEffects;
1518 }
1519 if (audioPolicyEffects == 0) {
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001520 return NO_INIT;
1521 }
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001522
1523 return OK;
1524}
1525
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001526Status AudioPolicyService::queryDefaultPreProcessing(
1527 int32_t audioSessionAidl,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001528 Int* countAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001529 std::vector<media::EffectDescriptor>* _aidl_return) {
1530 audio_session_t audioSession = VALUE_OR_RETURN_BINDER_STATUS(
1531 aidl2legacy_int32_t_audio_session_t(audioSessionAidl));
1532 uint32_t count = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(countAidl->value));
1533 if (count > AudioEffect::kMaxPreProcessing) {
1534 count = AudioEffect::kMaxPreProcessing;
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001535 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001536 uint32_t countReq = count;
1537 std::unique_ptr<effect_descriptor_t[]> descriptors(new effect_descriptor_t[count]);
1538
1539 sp<AudioPolicyEffects> audioPolicyEffects;
1540 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
1541 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->queryDefaultInputEffects(
1542 (audio_session_t) audioSession, descriptors.get(), &count)));
1543 countReq = std::min(count, countReq);
1544 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1545 convertRange(descriptors.get(), descriptors.get() + countReq,
1546 std::back_inserter(*_aidl_return),
1547 legacy2aidl_effect_descriptor_t_EffectDescriptor)));
1548 countAidl->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(count));
1549 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001550}
1551
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001552Status AudioPolicyService::addSourceDefaultEffect(const AudioUuid& typeAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001553 const std::string& opPackageNameAidl,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001554 const AudioUuid& uuidAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001555 int32_t priority,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001556 AudioSource sourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001557 int32_t* _aidl_return) {
1558 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1559 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1560 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1561 aidl2legacy_string_view_String16(opPackageNameAidl));
1562 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1563 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1564 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001565 aidl2legacy_AudioSource_audio_source_t(sourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001566 audio_unique_id_t id;
1567
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001568 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001569 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001570 if (!(audioserver_permissions() ?
1571 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1572 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001573 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001574 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001575 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addSourceDefaultEffect(
1576 &type, opPackageName, &uuid, priority, source, &id)));
1577 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1578 return Status::ok();
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001579}
1580
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001581Status AudioPolicyService::addStreamDefaultEffect(const AudioUuid& typeAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001582 const std::string& opPackageNameAidl,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001583 const AudioUuid& uuidAidl,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001584 int32_t priority, AudioUsage usageAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001585 int32_t* _aidl_return) {
1586 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1587 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1588 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1589 aidl2legacy_string_view_String16(opPackageNameAidl));
1590 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1591 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1592 audio_usage_t usage = VALUE_OR_RETURN_BINDER_STATUS(
1593 aidl2legacy_AudioUsage_audio_usage_t(usageAidl));
1594 audio_unique_id_t id;
1595
1596 sp<AudioPolicyEffects> audioPolicyEffects;
1597 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001598 if (!(audioserver_permissions() ?
1599 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1600 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001601 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001602 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001603 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addStreamDefaultEffect(
1604 &type, opPackageName, &uuid, priority, usage, &id)));
1605 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1606 return Status::ok();
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001607}
1608
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001609Status AudioPolicyService::removeSourceDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001610{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001611 audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1612 aidl2legacy_int32_t_audio_unique_id_t(idAidl));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001613 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001614 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001615 if (!(audioserver_permissions() ?
1616 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1617 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001618 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001619 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001620 return binderStatusFromStatusT(audioPolicyEffects->removeSourceDefaultEffect(id));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001621}
1622
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001623Status AudioPolicyService::removeStreamDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001624{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001625 audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1626 aidl2legacy_int32_t_audio_unique_id_t(idAidl));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001627 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001628 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001629 if (!(audioserver_permissions() ?
1630 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1631 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001632 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001633 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001634 return binderStatusFromStatusT(audioPolicyEffects->removeStreamDefaultEffect(id));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001635}
1636
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001637Status AudioPolicyService::setSupportedSystemUsages(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001638 const std::vector<AudioUsage>& systemUsagesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001639 size_t size = systemUsagesAidl.size();
1640 if (size > MAX_ITEMS_PER_LIST) {
1641 size = MAX_ITEMS_PER_LIST;
1642 }
1643 std::vector<audio_usage_t> systemUsages;
1644 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1645 convertRange(systemUsagesAidl.begin(), systemUsagesAidl.begin() + size,
1646 std::back_inserter(systemUsages), aidl2legacy_AudioUsage_audio_usage_t)));
1647
Andy Hung79eacdb2023-11-30 19:34:24 -08001648 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001649 if (!(audioserver_permissions() ?
1650 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1651 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001652 return binderStatusFromStatusT(PERMISSION_DENIED);
Hayden Gomes524159d2019-12-23 14:41:47 -08001653 }
1654
1655 bool areAllSystemUsages = std::all_of(begin(systemUsages), end(systemUsages),
1656 [](audio_usage_t usage) { return isSystemUsage(usage); });
1657 if (!areAllSystemUsages) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001658 return binderStatusFromStatusT(BAD_VALUE);
Hayden Gomes524159d2019-12-23 14:41:47 -08001659 }
1660
1661 mSupportedSystemUsages = systemUsages;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001662 return Status::ok();
Hayden Gomes524159d2019-12-23 14:41:47 -08001663}
1664
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001665Status AudioPolicyService::setAllowedCapturePolicy(int32_t uidAidl, int32_t capturePolicyAidl) {
1666 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1667 audio_flags_mask_t capturePolicy = VALUE_OR_RETURN_BINDER_STATUS(
1668 aidl2legacy_int32_t_audio_flags_mask_t_mask(capturePolicyAidl));
1669
Andy Hung79eacdb2023-11-30 19:34:24 -08001670 audio_utils::lock_guard _l(mMutex);
Kevin Rocardb99cc752019-03-21 20:52:24 -07001671 if (mAudioPolicyManager == NULL) {
1672 ALOGV("%s() mAudioPolicyManager == NULL", __func__);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001673 return binderStatusFromStatusT(NO_INIT);
Kevin Rocardb99cc752019-03-21 20:52:24 -07001674 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001675 return binderStatusFromStatusT(
1676 mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy));
Kevin Rocardb99cc752019-03-21 20:52:24 -07001677}
1678
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001679Status AudioPolicyService::getOffloadSupport(const AudioOffloadInfo& infoAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001680 media::AudioOffloadMode* _aidl_return) {
1681 audio_offload_info_t info = VALUE_OR_RETURN_BINDER_STATUS(
1682 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(infoAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001683 if (mAudioPolicyManager == NULL) {
1684 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001685 return binderStatusFromStatusT(AUDIO_OFFLOAD_NOT_SUPPORTED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001686 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001687 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001688 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001689 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_offload_mode_t_AudioOffloadMode(
1690 mAudioPolicyManager->getOffloadSupport(info)));
1691 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001692}
1693
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001694Status AudioPolicyService::isDirectOutputSupported(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001695 const AudioConfigBase& configAidl,
Mikhail Naganov1c400902023-05-17 11:48:43 -07001696 const media::audio::common::AudioAttributes& attributesAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001697 bool* _aidl_return) {
1698 audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001699 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl, false /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001700 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001701 aidl2legacy_AudioAttributes_audio_attributes_t(attributesAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001702 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1703 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1704
Michael Chana94fbb22018-04-24 14:31:19 +10001705 if (mAudioPolicyManager == NULL) {
1706 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001707 return binderStatusFromStatusT(NO_INIT);
Michael Chana94fbb22018-04-24 14:31:19 +10001708 }
Hayden Gomes524159d2019-12-23 14:41:47 -08001709
Atneya Nair09859fe2024-07-15 16:38:02 -07001710 RETURN_IF_BINDER_ERROR(validateUsage(attributes));
Hayden Gomes524159d2019-12-23 14:41:47 -08001711
Andy Hung79eacdb2023-11-30 19:34:24 -08001712 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001713 *_aidl_return = mAudioPolicyManager->isDirectOutputSupported(config, attributes);
1714 return Status::ok();
Michael Chana94fbb22018-04-24 14:31:19 +10001715}
1716
Atneya Nair23348762024-10-14 14:16:06 -07001717template <typename Port>
1718void anonymizePortBluetoothAddress(Port& port) {
1719 if (port.type != AUDIO_PORT_TYPE_DEVICE) {
1720 return;
1721 }
1722 if (!(audio_is_a2dp_device(port.ext.device.type)
1723 || audio_is_ble_device(port.ext.device.type)
1724 || audio_is_bluetooth_sco_device(port.ext.device.type)
1725 || audio_is_hearing_aid_out_device(port.ext.device.type))) {
1726 return;
1727 }
1728 anonymizeBluetoothAddress(port.ext.device.address);
1729}
Michael Chana94fbb22018-04-24 14:31:19 +10001730
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001731Status AudioPolicyService::listAudioPorts(media::AudioPortRole roleAidl,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001732 media::AudioPortType typeAidl, Int* count,
Atneya Nair638a6e42022-12-18 16:45:15 -08001733 std::vector<media::AudioPortFw>* portsAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001734 int32_t* _aidl_return) {
1735 audio_port_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
1736 aidl2legacy_AudioPortRole_audio_port_role_t(roleAidl));
1737 audio_port_type_t type = VALUE_OR_RETURN_BINDER_STATUS(
1738 aidl2legacy_AudioPortType_audio_port_type_t(typeAidl));
1739 unsigned int num_ports = VALUE_OR_RETURN_BINDER_STATUS(
1740 convertIntegral<unsigned int>(count->value));
1741 if (num_ports > MAX_ITEMS_PER_LIST) {
1742 num_ports = MAX_ITEMS_PER_LIST;
1743 }
1744 unsigned int numPortsReq = num_ports;
1745 std::unique_ptr<audio_port_v7[]> ports(new audio_port_v7[num_ports]);
1746 unsigned int generation;
1747
Atneya Nair23348762024-10-14 14:16:06 -07001748 const AttributionSourceState attributionSource = getCallingAttributionSource();
Eric Laurent10b71232018-04-13 18:14:44 -07001749 AutoCallerClear acc;
Atneya Nair23348762024-10-14 14:16:06 -07001750 {
1751 audio_utils::lock_guard _l(mMutex);
1752 if (mAudioPolicyManager == NULL) {
1753 return binderStatusFromStatusT(NO_INIT);
1754 }
1755 // AudioPolicyManager->listAudioPorts makes a deep copy of port structs into ports
1756 // so it is safe to access after releasing the mutex
1757 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1758 mAudioPolicyManager->listAudioPorts(
1759 role, type, &num_ports, ports.get(), &generation)));
1760 numPortsReq = std::min(numPortsReq, num_ports);
1761 }
1762
1763 if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__))) {
1764 for (size_t i = 0; i < numPortsReq; ++i) {
1765 anonymizePortBluetoothAddress(ports[i]);
1766 }
1767 }
1768
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001769 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1770 convertRange(ports.get(), ports.get() + numPortsReq, std::back_inserter(*portsAidl),
Mikhail Naganov87227252023-01-13 17:38:10 -08001771 legacy2aidl_audio_port_v7_AudioPortFw)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001772 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_ports));
1773 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1774 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001775}
1776
Mikhail Naganov5edc5ed2023-03-23 14:52:15 -07001777Status AudioPolicyService::listDeclaredDevicePorts(media::AudioPortRole role,
1778 std::vector<media::AudioPortFw>* _aidl_return) {
Andy Hung79eacdb2023-11-30 19:34:24 -08001779 audio_utils::lock_guard _l(mMutex);
Mikhail Naganov5edc5ed2023-03-23 14:52:15 -07001780 if (mAudioPolicyManager == NULL) {
1781 return binderStatusFromStatusT(NO_INIT);
1782 }
1783 AutoCallerClear acc;
1784 return binderStatusFromStatusT(mAudioPolicyManager->listDeclaredDevicePorts(
1785 role, _aidl_return));
1786}
1787
Mikhail Naganov17031562022-02-23 23:00:27 +00001788Status AudioPolicyService::getAudioPort(int portId,
Atneya Nair638a6e42022-12-18 16:45:15 -08001789 media::AudioPortFw* _aidl_return) {
Mikhail Naganov17031562022-02-23 23:00:27 +00001790 audio_port_v7 port{ .id = portId };
Atneya Nair23348762024-10-14 14:16:06 -07001791
1792 const AttributionSourceState attributionSource = getCallingAttributionSource();
Eric Laurent10b71232018-04-13 18:14:44 -07001793 AutoCallerClear acc;
Atneya Nair23348762024-10-14 14:16:06 -07001794
1795 {
1796 audio_utils::lock_guard _l(mMutex);
1797 if (mAudioPolicyManager == NULL) {
1798 return binderStatusFromStatusT(NO_INIT);
1799 }
1800 // AudioPolicyManager->getAudioPort makes a deep copy of the port struct into port
1801 // so it is safe to access after releasing the mutex
1802 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(mAudioPolicyManager->getAudioPort(&port)));
1803 }
1804
1805 if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__))) {
1806 anonymizePortBluetoothAddress(port);
1807 }
1808
Mikhail Naganov87227252023-01-13 17:38:10 -08001809 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_v7_AudioPortFw(port));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001810 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001811}
1812
Atneya Nair3afdbd12022-12-18 16:14:18 -08001813Status AudioPolicyService::createAudioPatch(const media::AudioPatchFw& patchAidl,
1814 int32_t handleAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001815 int32_t* _aidl_return) {
1816 audio_patch patch = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov87227252023-01-13 17:38:10 -08001817 aidl2legacy_AudioPatchFw_audio_patch(patchAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001818 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1819 aidl2legacy_int32_t_audio_port_handle_t(handleAidl));
1820 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPatch(patch)));
1821
Andy Hung79eacdb2023-11-30 19:34:24 -08001822 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001823 if (!(audioserver_permissions() ?
1824 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1825 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001826 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001827 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001828 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001829 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001830 }
Eric Laurent10b71232018-04-13 18:14:44 -07001831 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001832 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1833 mAudioPolicyManager->createAudioPatch(&patch, &handle,
1834 IPCThreadState::self()->getCallingUid())));
1835 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_patch_handle_t_int32_t(handle));
1836 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001837}
1838
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001839Status AudioPolicyService::releaseAudioPatch(int32_t handleAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001840{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001841 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1842 aidl2legacy_int32_t_audio_patch_handle_t(handleAidl));
Andy Hung79eacdb2023-11-30 19:34:24 -08001843 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001844 if (!(audioserver_permissions() ?
1845 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1846 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001847 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001848 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001849 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001850 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001851 }
Eric Laurent10b71232018-04-13 18:14:44 -07001852 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001853 return binderStatusFromStatusT(
1854 mAudioPolicyManager->releaseAudioPatch(handle,
1855 IPCThreadState::self()->getCallingUid()));
Eric Laurent203b1a12014-04-01 10:34:16 -07001856}
1857
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001858Status AudioPolicyService::listAudioPatches(Int* count,
Atneya Nair3afdbd12022-12-18 16:14:18 -08001859 std::vector<media::AudioPatchFw>* patchesAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001860 int32_t* _aidl_return) {
1861 unsigned int num_patches = VALUE_OR_RETURN_BINDER_STATUS(
1862 convertIntegral<unsigned int>(count->value));
1863 if (num_patches > MAX_ITEMS_PER_LIST) {
1864 num_patches = MAX_ITEMS_PER_LIST;
1865 }
1866 unsigned int numPatchesReq = num_patches;
1867 std::unique_ptr<audio_patch[]> patches(new audio_patch[num_patches]);
1868 unsigned int generation;
1869
Atneya Nair23348762024-10-14 14:16:06 -07001870 const AttributionSourceState attributionSource = getCallingAttributionSource();
Eric Laurent10b71232018-04-13 18:14:44 -07001871 AutoCallerClear acc;
Atneya Nair23348762024-10-14 14:16:06 -07001872
1873 {
1874 audio_utils::lock_guard _l(mMutex);
1875 if (mAudioPolicyManager == NULL) {
1876 return binderStatusFromStatusT(NO_INIT);
1877 }
1878 // AudioPolicyManager->listAudioPatches makes a deep copy of patches structs into patches
1879 // so it is safe to access after releasing the mutex
1880 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1881 mAudioPolicyManager->listAudioPatches(&num_patches, patches.get(), &generation)));
1882 numPatchesReq = std::min(numPatchesReq, num_patches);
1883 }
1884
1885 if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__))) {
1886 for (size_t i = 0; i < numPatchesReq; ++i) {
1887 for (size_t j = 0; j < patches[i].num_sources; ++j) {
1888 anonymizePortBluetoothAddress(patches[i].sources[j]);
1889 }
1890 for (size_t j = 0; j < patches[i].num_sinks; ++j) {
1891 anonymizePortBluetoothAddress(patches[i].sinks[j]);
1892 }
1893 }
1894 }
1895
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001896 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1897 convertRange(patches.get(), patches.get() + numPatchesReq,
Mikhail Naganov87227252023-01-13 17:38:10 -08001898 std::back_inserter(*patchesAidl), legacy2aidl_audio_patch_AudioPatchFw)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001899 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_patches));
1900 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1901 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001902}
1903
Atneya Nair7a9594f2022-12-18 17:26:26 -08001904Status AudioPolicyService::setAudioPortConfig(const media::AudioPortConfigFw& configAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001905{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001906 audio_port_config config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov87227252023-01-13 17:38:10 -08001907 aidl2legacy_AudioPortConfigFw_audio_port_config(configAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001908 RETURN_IF_BINDER_ERROR(
1909 binderStatusFromStatusT(AudioValidator::validateAudioPortConfig(config)));
1910
Andy Hung79eacdb2023-11-30 19:34:24 -08001911 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001912 if (!(audioserver_permissions() ?
1913 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1914 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001915 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001916 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001917 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001918 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001919 }
Eric Laurent10b71232018-04-13 18:14:44 -07001920 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001921 return binderStatusFromStatusT(mAudioPolicyManager->setAudioPortConfig(&config));
Eric Laurent203b1a12014-04-01 10:34:16 -07001922}
Eric Laurent2d388ec2014-03-07 13:25:54 -08001923
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001924Status AudioPolicyService::acquireSoundTriggerSession(media::SoundTriggerSession* _aidl_return)
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001925{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001926 audio_session_t session;
1927 audio_io_handle_t ioHandle;
1928 audio_devices_t device;
1929
1930 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001931 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001932 if (mAudioPolicyManager == NULL) {
1933 return binderStatusFromStatusT(NO_INIT);
1934 }
1935 AutoCallerClear acc;
1936 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1937 mAudioPolicyManager->acquireSoundTriggerSession(&session, &ioHandle, &device)));
1938 }
1939
1940 _aidl_return->session = VALUE_OR_RETURN_BINDER_STATUS(
1941 legacy2aidl_audio_session_t_int32_t(session));
1942 _aidl_return->ioHandle = VALUE_OR_RETURN_BINDER_STATUS(
1943 legacy2aidl_audio_io_handle_t_int32_t(ioHandle));
1944 _aidl_return->device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001945 legacy2aidl_audio_devices_t_AudioDeviceDescription(device));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001946 return Status::ok();
1947}
1948
1949Status AudioPolicyService::releaseSoundTriggerSession(int32_t sessionAidl)
1950{
1951 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1952 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Andy Hung79eacdb2023-11-30 19:34:24 -08001953 audio_utils::lock_guard _l(mMutex);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001954 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001955 return binderStatusFromStatusT(NO_INIT);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001956 }
Eric Laurent10b71232018-04-13 18:14:44 -07001957 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001958 return binderStatusFromStatusT(mAudioPolicyManager->releaseSoundTriggerSession(session));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001959}
1960
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001961Status AudioPolicyService::registerPolicyMixes(const std::vector<media::AudioMix>& mixesAidl,
1962 bool registration) {
1963 size_t size = mixesAidl.size();
1964 if (size > MAX_MIXES_PER_POLICY) {
1965 size = MAX_MIXES_PER_POLICY;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001966 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001967 Vector<AudioMix> mixes;
1968 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1969 convertRange(mixesAidl.begin(), mixesAidl.begin() + size, std::back_inserter(mixes),
1970 aidl2legacy_AudioMix)));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001971
Andy Hung79eacdb2023-11-30 19:34:24 -08001972 audio_utils::lock_guard _l(mMutex);
Kevin Rocardbe201852019-02-20 22:33:28 -08001973
1974 // loopback|render only need a MediaProjection (checked in caller AudioService.java)
1975 bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1976 return !is_mix_loopback_render(mix.mRouteFlags); });
Atneya Nair09859fe2024-07-15 16:38:02 -07001977 if (needModifyAudioRouting && !(audioserver_permissions() ?
1978 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1979 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001980 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurentbaac1832014-12-01 17:52:59 -08001981 }
Kevin Rocardbe201852019-02-20 22:33:28 -08001982
Nadav Bar287d3302020-02-05 14:55:38 +02001983 // If one of the mixes has needCaptureVoiceCommunicationOutput set to true, then we
1984 // need to verify that the caller still has CAPTURE_VOICE_COMMUNICATION_OUTPUT
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001985 bool needCaptureVoiceCommunicationOutput =
1986 std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Nadav Bar287d3302020-02-05 14:55:38 +02001987 return mix.mVoiceCommunicationCaptureAllowed; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001988
Kevin Rocard36b17552019-03-07 18:48:07 -08001989 bool needCaptureMediaOutput = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Eric Laurent5f9a6452020-12-22 20:10:10 +01001990 return mix.mAllowPrivilegedMediaPlaybackCapture; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001991
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001992 const AttributionSourceState attributionSource = getCallingAttributionSource();
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001993
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001994
Atneya Nair09859fe2024-07-15 16:38:02 -07001995 if (needCaptureMediaOutput && !(audioserver_permissions() ?
1996 CHECK_PERM(CAPTURE_MEDIA_OUTPUT, attributionSource.uid)
1997 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001998 return binderStatusFromStatusT(PERMISSION_DENIED);
Kevin Rocard36b17552019-03-07 18:48:07 -08001999 }
2000
Nadav Bardbf0a2e2020-01-16 23:09:25 +02002001 if (needCaptureVoiceCommunicationOutput &&
Atneya Nair09859fe2024-07-15 16:38:02 -07002002 !(audioserver_permissions() ?
2003 CHECK_PERM(CAPTURE_VOICE_COMMUNICATION_OUTPUT, attributionSource.uid)
2004 : captureVoiceCommunicationOutputAllowed(attributionSource))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002005 return binderStatusFromStatusT(PERMISSION_DENIED);
Nadav Bardbf0a2e2020-01-16 23:09:25 +02002006 }
2007
Eric Laurentbaac1832014-12-01 17:52:59 -08002008 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002009 return binderStatusFromStatusT(NO_INIT);
Eric Laurentbaac1832014-12-01 17:52:59 -08002010 }
Eric Laurent10b71232018-04-13 18:14:44 -07002011 AutoCallerClear acc;
Eric Laurentbaac1832014-12-01 17:52:59 -08002012 if (registration) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002013 return binderStatusFromStatusT(mAudioPolicyManager->registerPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08002014 } else {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002015 return binderStatusFromStatusT(mAudioPolicyManager->unregisterPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08002016 }
2017}
2018
Marvin Raminbdefaf02023-11-01 09:10:32 +01002019Status
2020AudioPolicyService::getRegisteredPolicyMixes(std::vector<::android::media::AudioMix>* mixesAidl) {
2021 if (mAudioPolicyManager == nullptr) {
2022 return binderStatusFromStatusT(NO_INIT);
2023 }
2024
2025 std::vector<AudioMix> mixes;
2026 int status = mAudioPolicyManager->getRegisteredPolicyMixes(mixes);
2027
2028 for (const auto& mix : mixes) {
2029 media::AudioMix aidlMix = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_AudioMix(mix));
2030 mixesAidl->push_back(aidlMix);
2031 }
2032
2033 return binderStatusFromStatusT(status);
2034}
2035
Jan Sebechlebsky0af8e872023-08-11 14:45:08 +02002036Status AudioPolicyService::updatePolicyMixes(
2037 const ::std::vector<::android::media::AudioMixUpdate>& updates) {
Andy Hung79eacdb2023-11-30 19:34:24 -08002038 audio_utils::lock_guard _l(mMutex);
Jan Sebechlebsky0af8e872023-08-11 14:45:08 +02002039 for (const auto& update : updates) {
2040 AudioMix mix = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_AudioMix(update.audioMix));
2041 std::vector<AudioMixMatchCriterion> newCriteria =
2042 VALUE_OR_RETURN_BINDER_STATUS(convertContainer<std::vector<AudioMixMatchCriterion>>(
2043 update.newCriteria, aidl2legacy_AudioMixMatchCriterion));
2044 int status;
2045 if((status = mAudioPolicyManager->updatePolicyMix(mix, newCriteria)) != NO_ERROR) {
2046 return binderStatusFromStatusT(status);
2047 }
2048 }
2049 return binderStatusFromStatusT(NO_ERROR);
2050}
2051
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002052Status AudioPolicyService::setUidDeviceAffinities(
2053 int32_t uidAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002054 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002055 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2056 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2057 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2058 aidl2legacy_AudioDeviceTypeAddress));
2059
Andy Hung79eacdb2023-11-30 19:34:24 -08002060 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002061 if (!(audioserver_permissions() ?
2062 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2063 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002064 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002065 }
2066 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002067 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002068 }
2069 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002070 return binderStatusFromStatusT(mAudioPolicyManager->setUidDeviceAffinities(uid, devices));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002071}
2072
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002073Status AudioPolicyService::removeUidDeviceAffinities(int32_t uidAidl) {
2074 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2075
Andy Hung79eacdb2023-11-30 19:34:24 -08002076 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002077 if (!(audioserver_permissions() ?
2078 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2079 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002080 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002081 }
2082 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002083 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002084 }
2085 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002086 return binderStatusFromStatusT(mAudioPolicyManager->removeUidDeviceAffinities(uid));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002087}
2088
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002089Status AudioPolicyService::setUserIdDeviceAffinities(
2090 int32_t userIdAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002091 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002092 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
2093 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2094 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2095 aidl2legacy_AudioDeviceTypeAddress));
2096
Andy Hung79eacdb2023-11-30 19:34:24 -08002097 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002098 if (!(audioserver_permissions() ?
2099 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2100 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002101 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08002102 }
2103 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002104 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08002105 }
2106 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002107 return binderStatusFromStatusT(mAudioPolicyManager->setUserIdDeviceAffinities(userId, devices));
Oscar Azucena90e77632019-11-27 17:12:28 -08002108}
2109
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002110Status AudioPolicyService::removeUserIdDeviceAffinities(int32_t userIdAidl) {
2111 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
2112
Andy Hung79eacdb2023-11-30 19:34:24 -08002113 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002114 if (!(audioserver_permissions() ?
2115 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2116 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002117 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08002118 }
2119 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002120 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08002121 }
2122 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002123 return binderStatusFromStatusT(mAudioPolicyManager->removeUserIdDeviceAffinities(userId));
Oscar Azucena90e77632019-11-27 17:12:28 -08002124}
2125
Atneya Nair7a9594f2022-12-18 17:26:26 -08002126Status AudioPolicyService::startAudioSource(const media::AudioPortConfigFw& sourceAidl,
Mikhail Naganov1c400902023-05-17 11:48:43 -07002127 const media::audio::common::AudioAttributes& attributesAidl,
2128 int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002129 audio_port_config source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov87227252023-01-13 17:38:10 -08002130 aidl2legacy_AudioPortConfigFw_audio_port_config(sourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002131 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002132 aidl2legacy_AudioAttributes_audio_attributes_t(attributesAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002133 audio_port_handle_t portId;
2134 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2135 AudioValidator::validateAudioPortConfig(source)));
2136 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2137 AudioValidator::validateAudioAttributes(attributes, "68953950")));
2138
Andy Hung79eacdb2023-11-30 19:34:24 -08002139 audio_utils::lock_guard _l(mMutex);
Eric Laurent554a2772015-04-10 11:29:24 -07002140 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002141 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07002142 }
Hayden Gomes524159d2019-12-23 14:41:47 -08002143
Atneya Nair09859fe2024-07-15 16:38:02 -07002144 RETURN_IF_BINDER_ERROR(validateUsage(attributes));
Hayden Gomes524159d2019-12-23 14:41:47 -08002145
Hongwei Wang5cd1f1d2019-03-26 15:21:11 -07002146 // startAudioSource should be created as the calling uid
2147 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Eric Laurent10b71232018-04-13 18:14:44 -07002148 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002149 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2150 mAudioPolicyManager->startAudioSource(&source, &attributes, &portId, callingUid)));
2151 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
2152 return Status::ok();
Eric Laurent554a2772015-04-10 11:29:24 -07002153}
2154
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002155Status AudioPolicyService::stopAudioSource(int32_t portIdAidl)
Eric Laurent554a2772015-04-10 11:29:24 -07002156{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002157 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2158 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2159
Andy Hung79eacdb2023-11-30 19:34:24 -08002160 audio_utils::lock_guard _l(mMutex);
Eric Laurent554a2772015-04-10 11:29:24 -07002161 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002162 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07002163 }
Eric Laurent10b71232018-04-13 18:14:44 -07002164 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002165 return binderStatusFromStatusT(mAudioPolicyManager->stopAudioSource(portId));
Eric Laurent554a2772015-04-10 11:29:24 -07002166}
2167
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002168Status AudioPolicyService::setMasterMono(bool mono)
Andy Hung2ddee192015-12-18 17:34:44 -08002169{
2170 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002171 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08002172 }
Atneya Nair09859fe2024-07-15 16:38:02 -07002173 if (!(audioserver_permissions() ?
2174 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
2175 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002176 return binderStatusFromStatusT(PERMISSION_DENIED);
Andy Hung2ddee192015-12-18 17:34:44 -08002177 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002178 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07002179 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002180 return binderStatusFromStatusT(mAudioPolicyManager->setMasterMono(mono));
Andy Hung2ddee192015-12-18 17:34:44 -08002181}
2182
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002183Status AudioPolicyService::getMasterMono(bool* _aidl_return)
Andy Hung2ddee192015-12-18 17:34:44 -08002184{
2185 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002186 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08002187 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002188 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07002189 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002190 return binderStatusFromStatusT(mAudioPolicyManager->getMasterMono(_aidl_return));
Andy Hung2ddee192015-12-18 17:34:44 -08002191}
2192
Eric Laurentac9cef52017-06-09 15:46:26 -07002193
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07002194Status AudioPolicyService::getStreamVolumeDB(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002195 AudioStreamType streamAidl, int32_t indexAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002196 const AudioDeviceDescription& deviceAidl, float* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002197 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
2198 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
2199 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
2200 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07002201 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002202
Eric Laurentac9cef52017-06-09 15:46:26 -07002203 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002204 return binderStatusFromStatusT(NO_INIT);
Eric Laurentac9cef52017-06-09 15:46:26 -07002205 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002206 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07002207 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002208 *_aidl_return = mAudioPolicyManager->getStreamVolumeDB(stream, index, device);
2209 return Status::ok();
Eric Laurentac9cef52017-06-09 15:46:26 -07002210}
2211
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002212Status AudioPolicyService::getSurroundFormats(Int* count,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002213 std::vector<AudioFormatDescription>* formats,
Kriti Dang877b27e2021-02-02 12:10:40 +01002214 std::vector<bool>* formatsEnabled) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002215 unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
2216 convertIntegral<unsigned int>(count->value));
2217 if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
2218 numSurroundFormats = MAX_ITEMS_PER_LIST;
2219 }
2220 unsigned int numSurroundFormatsReq = numSurroundFormats;
2221 std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
Kriti Dang877b27e2021-02-02 12:10:40 +01002222 std::unique_ptr<bool[]>surroundFormatsEnabled(new bool[numSurroundFormats]);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002223
jiabin81772902018-04-02 17:52:27 -07002224 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002225 return binderStatusFromStatusT(NO_INIT);
jiabin81772902018-04-02 17:52:27 -07002226 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002227 audio_utils::lock_guard _l(mMutex);
jiabin81772902018-04-02 17:52:27 -07002228 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002229 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2230 mAudioPolicyManager->getSurroundFormats(&numSurroundFormats, surroundFormats.get(),
Kriti Dang6537def2021-03-02 13:46:59 +01002231 surroundFormatsEnabled.get())));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002232 numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
2233 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2234 convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002235 std::back_inserter(*formats),
2236 legacy2aidl_audio_format_t_AudioFormatDescription)));
Kriti Dang877b27e2021-02-02 12:10:40 +01002237 formatsEnabled->insert(
2238 formatsEnabled->begin(),
2239 surroundFormatsEnabled.get(),
2240 surroundFormatsEnabled.get() + numSurroundFormatsReq);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002241 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
2242 return Status::ok();
jiabin81772902018-04-02 17:52:27 -07002243}
2244
Kriti Dang6537def2021-03-02 13:46:59 +01002245Status AudioPolicyService::getReportedSurroundFormats(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002246 Int* count, std::vector<AudioFormatDescription>* formats) {
Kriti Dang6537def2021-03-02 13:46:59 +01002247 unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
2248 convertIntegral<unsigned int>(count->value));
2249 if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
2250 numSurroundFormats = MAX_ITEMS_PER_LIST;
2251 }
2252 unsigned int numSurroundFormatsReq = numSurroundFormats;
2253 std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
2254
2255 if (mAudioPolicyManager == NULL) {
2256 return binderStatusFromStatusT(NO_INIT);
2257 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002258 audio_utils::lock_guard _l(mMutex);
Kriti Dang6537def2021-03-02 13:46:59 +01002259 AutoCallerClear acc;
2260 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2261 mAudioPolicyManager->getReportedSurroundFormats(
2262 &numSurroundFormats, surroundFormats.get())));
2263 numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
2264 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2265 convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002266 std::back_inserter(*formats),
2267 legacy2aidl_audio_format_t_AudioFormatDescription)));
Kriti Dang6537def2021-03-02 13:46:59 +01002268 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
2269 return Status::ok();
2270}
2271
Pattydd807582021-11-04 21:01:03 +08002272Status AudioPolicyService::getHwOffloadFormatsSupportedForBluetoothMedia(
2273 const AudioDeviceDescription& deviceAidl,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002274 std::vector<AudioFormatDescription>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002275 std::vector<audio_format_t> formats;
2276
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002277 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002278 return binderStatusFromStatusT(NO_INIT);
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002279 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002280 audio_utils::lock_guard _l(mMutex);
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002281 AutoCallerClear acc;
Pattydd807582021-11-04 21:01:03 +08002282 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
2283 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002284 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
Pattydd807582021-11-04 21:01:03 +08002285 mAudioPolicyManager->getHwOffloadFormatsSupportedForBluetoothMedia(device, &formats)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002286 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002287 convertContainer<std::vector<AudioFormatDescription>>(
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002288 formats,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002289 legacy2aidl_audio_format_t_AudioFormatDescription));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002290 return Status::ok();
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002291}
2292
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002293Status AudioPolicyService::setSurroundFormatEnabled(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002294 const AudioFormatDescription& audioFormatAidl, bool enabled) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002295 audio_format_t audioFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002296 aidl2legacy_AudioFormatDescription_audio_format_t(audioFormatAidl));
jiabin81772902018-04-02 17:52:27 -07002297 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002298 return binderStatusFromStatusT(NO_INIT);
jiabin81772902018-04-02 17:52:27 -07002299 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002300 audio_utils::lock_guard _l(mMutex);
jiabin81772902018-04-02 17:52:27 -07002301 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002302 return binderStatusFromStatusT(
2303 mAudioPolicyManager->setSurroundFormatEnabled(audioFormat, enabled));
jiabin81772902018-04-02 17:52:27 -07002304}
Eric Laurentac9cef52017-06-09 15:46:26 -07002305
Oscar Azucena829d90d2022-01-28 17:17:56 -08002306Status convertInt32VectorToUidVectorWithLimit(
2307 const std::vector<int32_t>& uidsAidl, std::vector<uid_t>& uids) {
2308 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2309 convertRangeWithLimit(uidsAidl.begin(),
2310 uidsAidl.end(),
2311 std::back_inserter(uids),
2312 aidl2legacy_int32_t_uid_t,
2313 MAX_ITEMS_PER_LIST)));
2314
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002315 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07002316}
2317
Oscar Azucena829d90d2022-01-28 17:17:56 -08002318Status AudioPolicyService::setAssistantServicesUids(const std::vector<int32_t>& uidsAidl)
Ahaan Ugalef51ce002021-08-04 16:34:20 -07002319{
Oscar Azucena829d90d2022-01-28 17:17:56 -08002320 std::vector<uid_t> uids;
2321 RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(uidsAidl, uids));
2322
Andy Hung79eacdb2023-11-30 19:34:24 -08002323 audio_utils::lock_guard _l(mMutex);
Oscar Azucena829d90d2022-01-28 17:17:56 -08002324 mUidPolicy->setAssistantUids(uids);
Ahaan Ugalef51ce002021-08-04 16:34:20 -07002325 return Status::ok();
2326}
2327
Oscar Azucenac2cdda32022-01-31 19:10:39 -08002328Status AudioPolicyService::setActiveAssistantServicesUids(
2329 const std::vector<int32_t>& activeUidsAidl) {
2330 std::vector<uid_t> activeUids;
2331 RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(activeUidsAidl, activeUids));
2332
Andy Hung79eacdb2023-11-30 19:34:24 -08002333 audio_utils::lock_guard _l(mMutex);
Oscar Azucenac2cdda32022-01-31 19:10:39 -08002334 mUidPolicy->setActiveAssistantUids(activeUids);
2335 return Status::ok();
2336}
2337
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002338Status AudioPolicyService::setA11yServicesUids(const std::vector<int32_t>& uidsAidl)
Eric Laurentb78763e2018-10-17 10:08:02 -07002339{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002340 std::vector<uid_t> uids;
Oscar Azucena829d90d2022-01-28 17:17:56 -08002341 RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(uidsAidl, uids));
2342
Andy Hung79eacdb2023-11-30 19:34:24 -08002343 audio_utils::lock_guard _l(mMutex);
Eric Laurentb78763e2018-10-17 10:08:02 -07002344 mUidPolicy->setA11yUids(uids);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002345 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07002346}
2347
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002348Status AudioPolicyService::setCurrentImeUid(int32_t uidAidl)
Kohsuke Yatoha623a132020-03-24 20:10:26 -07002349{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002350 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Andy Hung79eacdb2023-11-30 19:34:24 -08002351 audio_utils::lock_guard _l(mMutex);
Kohsuke Yatoha623a132020-03-24 20:10:26 -07002352 mUidPolicy->setCurrentImeUid(uid);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002353 return Status::ok();
Kohsuke Yatoha623a132020-03-24 20:10:26 -07002354}
2355
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002356Status AudioPolicyService::isHapticPlaybackSupported(bool* _aidl_return)
jiabin6012f912018-11-02 17:06:30 -07002357{
2358 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002359 return binderStatusFromStatusT(NO_INIT);
jiabin6012f912018-11-02 17:06:30 -07002360 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002361 audio_utils::lock_guard _l(mMutex);
jiabin6012f912018-11-02 17:06:30 -07002362 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002363 *_aidl_return = mAudioPolicyManager->isHapticPlaybackSupported();
2364 return Status::ok();
jiabin6012f912018-11-02 17:06:30 -07002365}
2366
Carter Hsu325a8eb2022-01-19 19:56:51 +08002367Status AudioPolicyService::isUltrasoundSupported(bool* _aidl_return)
2368{
2369 if (mAudioPolicyManager == NULL) {
2370 return binderStatusFromStatusT(NO_INIT);
2371 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002372 audio_utils::lock_guard _l(mMutex);
Carter Hsu325a8eb2022-01-19 19:56:51 +08002373 AutoCallerClear acc;
2374 *_aidl_return = mAudioPolicyManager->isUltrasoundSupported();
2375 return Status::ok();
2376}
2377
Atneya Nair698f5ef2022-12-15 16:15:09 -08002378Status AudioPolicyService::isHotwordStreamSupported(bool lookbackAudio, bool* _aidl_return)
2379{
2380 if (mAudioPolicyManager == nullptr) {
2381 return binderStatusFromStatusT(NO_INIT);
2382 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002383 audio_utils::lock_guard _l(mMutex);
Atneya Nair698f5ef2022-12-15 16:15:09 -08002384 AutoCallerClear acc;
2385 *_aidl_return = mAudioPolicyManager->isHotwordStreamSupported(lookbackAudio);
2386 return Status::ok();
2387}
2388
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002389Status AudioPolicyService::listAudioProductStrategies(
2390 std::vector<media::AudioProductStrategy>* _aidl_return) {
2391 AudioProductStrategyVector strategies;
2392
François Gaffied0ba9ed2018-11-05 11:50:42 +01002393 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002394 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01002395 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002396 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002397 RETURN_IF_BINDER_ERROR(
2398 binderStatusFromStatusT(mAudioPolicyManager->listAudioProductStrategies(strategies)));
2399 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2400 convertContainer<std::vector<media::AudioProductStrategy>>(
2401 strategies,
2402 legacy2aidl_AudioProductStrategy));
2403 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01002404}
2405
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002406Status AudioPolicyService::getProductStrategyFromAudioAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002407 const media::audio::common::AudioAttributes& aaAidl,
François Gaffie1e2b56f2022-04-01 14:34:29 +02002408 bool fallbackOnDefault, int32_t* _aidl_return) {
2409 audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002410 aidl2legacy_AudioAttributes_audio_attributes_t(aaAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002411 product_strategy_t productStrategy;
2412
François Gaffied0ba9ed2018-11-05 11:50:42 +01002413 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002414 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01002415 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002416 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002417 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02002418 mAudioPolicyManager->getProductStrategyFromAudioAttributes(
2419 aa, productStrategy, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002420 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2421 legacy2aidl_product_strategy_t_int32_t(productStrategy));
2422 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01002423}
2424
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002425Status AudioPolicyService::listAudioVolumeGroups(std::vector<media::AudioVolumeGroup>* _aidl_return)
François Gaffie4b2018b2018-11-07 11:18:59 +01002426{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002427 AudioVolumeGroupVector groups;
François Gaffie4b2018b2018-11-07 11:18:59 +01002428 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002429 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01002430 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002431 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002432 RETURN_IF_BINDER_ERROR(
2433 binderStatusFromStatusT(mAudioPolicyManager->listAudioVolumeGroups(groups)));
2434 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2435 convertContainer<std::vector<media::AudioVolumeGroup>>(groups,
2436 legacy2aidl_AudioVolumeGroup));
2437 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01002438}
2439
Francois Gaffie11b65922020-09-24 16:59:08 +02002440Status AudioPolicyService::getVolumeGroupFromAudioAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002441 const media::audio::common::AudioAttributes& aaAidl,
François Gaffie1e2b56f2022-04-01 14:34:29 +02002442 bool fallbackOnDefault, int32_t* _aidl_return) {
2443 audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002444 aidl2legacy_AudioAttributes_audio_attributes_t(aaAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002445 volume_group_t volumeGroup;
2446
François Gaffie4b2018b2018-11-07 11:18:59 +01002447 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002448 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01002449 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002450 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002451 RETURN_IF_BINDER_ERROR(
2452 binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02002453 mAudioPolicyManager->getVolumeGroupFromAudioAttributes(
2454 aa, volumeGroup, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002455 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_volume_group_t_int32_t(volumeGroup));
2456 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01002457}
Eric Laurent6ede98f2019-06-11 14:50:30 -07002458
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002459Status AudioPolicyService::setRttEnabled(bool enabled)
Eric Laurent6ede98f2019-06-11 14:50:30 -07002460{
Andy Hung79eacdb2023-11-30 19:34:24 -08002461 audio_utils::lock_guard _l(mMutex);
Eric Laurent6ede98f2019-06-11 14:50:30 -07002462 mUidPolicy->setRttEnabled(enabled);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002463 return Status::ok();
Eric Laurent6ede98f2019-06-11 14:50:30 -07002464}
2465
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002466Status AudioPolicyService::isCallScreenModeSupported(bool* _aidl_return)
Eric Laurent8340e672019-11-06 11:01:08 -08002467{
2468 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002469 return binderStatusFromStatusT(NO_INIT);
Eric Laurent8340e672019-11-06 11:01:08 -08002470 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002471 audio_utils::lock_guard _l(mMutex);
Eric Laurent8340e672019-11-06 11:01:08 -08002472 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002473 *_aidl_return = mAudioPolicyManager->isCallScreenModeSupported();
2474 return Status::ok();
Eric Laurent8340e672019-11-06 11:01:08 -08002475}
2476
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002477Status AudioPolicyService::setDevicesRoleForStrategy(
2478 int32_t strategyAidl,
2479 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002480 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002481 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2482 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2483 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2484 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2485 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2486 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2487 aidl2legacy_AudioDeviceTypeAddress));
2488
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002489 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002490 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002491 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002492 audio_utils::lock_guard _l(mMutex);
Eric Laurent39095982021-08-24 18:29:27 +02002493 status_t status = mAudioPolicyManager->setDevicesRoleForStrategy(strategy, role, devices);
2494 if (status == NO_ERROR) {
2495 onCheckSpatializer_l();
2496 }
2497 return binderStatusFromStatusT(status);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002498}
2499
Paul Wang5d7cdb52022-11-22 09:45:06 +00002500Status AudioPolicyService::removeDevicesRoleForStrategy(
2501 int32_t strategyAidl,
2502 media::DeviceRole roleAidl,
2503 const std::vector<AudioDevice>& devicesAidl) {
2504 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2505 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2506 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2507 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2508 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2509 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2510 aidl2legacy_AudioDeviceTypeAddress));
2511
2512 if (mAudioPolicyManager == NULL) {
2513 return binderStatusFromStatusT(NO_INIT);
2514 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002515 audio_utils::lock_guard _l(mMutex);
Paul Wang5d7cdb52022-11-22 09:45:06 +00002516 status_t status = mAudioPolicyManager->removeDevicesRoleForStrategy(strategy, role, devices);
2517 if (status == NO_ERROR) {
2518 onCheckSpatializer_l();
2519 }
2520 return binderStatusFromStatusT(status);
2521}
2522
2523Status AudioPolicyService::clearDevicesRoleForStrategy(int32_t strategyAidl,
2524 media::DeviceRole roleAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002525 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2526 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2527 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2528 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2529 if (mAudioPolicyManager == NULL) {
2530 return binderStatusFromStatusT(NO_INIT);
2531 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002532 audio_utils::lock_guard _l(mMutex);
Paul Wang5d7cdb52022-11-22 09:45:06 +00002533 status_t status = mAudioPolicyManager->clearDevicesRoleForStrategy(strategy, role);
Eric Laurent39095982021-08-24 18:29:27 +02002534 if (status == NO_ERROR) {
2535 onCheckSpatializer_l();
2536 }
2537 return binderStatusFromStatusT(status);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002538}
2539
2540Status AudioPolicyService::getDevicesForRoleAndStrategy(
2541 int32_t strategyAidl,
2542 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002543 std::vector<AudioDevice>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002544 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2545 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2546 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2547 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2548 AudioDeviceTypeAddrVector devices;
2549
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002550 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002551 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002552 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002553 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002554 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2555 mAudioPolicyManager->getDevicesForRoleAndStrategy(strategy, role, devices)));
2556 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002557 convertContainer<std::vector<AudioDevice>>(devices,
2558 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002559 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002560}
2561
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002562Status AudioPolicyService::registerSoundTriggerCaptureStateListener(
2563 const sp<media::ICaptureStateListener>& listener, bool* _aidl_return) {
2564 *_aidl_return = mCaptureStateNotifier.RegisterListener(listener);
2565 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002566}
2567
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002568Status AudioPolicyService::setDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002569 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002570 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002571 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002572 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002573 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002574 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2575 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2576 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2577 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2578 aidl2legacy_AudioDeviceTypeAddress));
Ytai Ben-Tsvi85093d52020-03-26 09:41:15 -07002579
Jiabin Huang3b98d322020-09-03 17:54:16 +00002580 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002581 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002582 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002583 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002584 return binderStatusFromStatusT(
2585 mAudioPolicyManager->setDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002586}
2587
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002588Status AudioPolicyService::addDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002589 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002590 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002591 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002592 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002593 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002594 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2595 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2596 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2597 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2598 aidl2legacy_AudioDeviceTypeAddress));
2599
Jiabin Huang3b98d322020-09-03 17:54:16 +00002600 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002601 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002602 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002603 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002604 return binderStatusFromStatusT(
2605 mAudioPolicyManager->addDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002606}
2607
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002608Status AudioPolicyService::removeDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002609 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002610 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002611 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002612 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002613 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002614 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2615 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2616 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2617 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2618 aidl2legacy_AudioDeviceTypeAddress));
2619
2620 if (mAudioPolicyManager == nullptr) {
2621 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002622 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002623 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002624 return binderStatusFromStatusT(
2625 mAudioPolicyManager->removeDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002626}
2627
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002628Status AudioPolicyService::clearDevicesRoleForCapturePreset(AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002629 media::DeviceRole roleAidl) {
2630 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002631 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002632 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2633 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2634
Jiabin Huang3b98d322020-09-03 17:54:16 +00002635 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002636 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002637 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002638 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002639 return binderStatusFromStatusT(
2640 mAudioPolicyManager->clearDevicesRoleForCapturePreset(audioSource, role));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002641}
2642
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002643Status AudioPolicyService::getDevicesForRoleAndCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002644 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002645 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002646 std::vector<AudioDevice>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002647 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002648 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002649 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2650 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2651 AudioDeviceTypeAddrVector devices;
2652
Jiabin Huang3b98d322020-09-03 17:54:16 +00002653 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002654 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002655 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002656 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002657 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2658 mAudioPolicyManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices)));
2659 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002660 convertContainer<std::vector<AudioDevice>>(devices,
2661 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002662 return Status::ok();
Jiabin Huang3b98d322020-09-03 17:54:16 +00002663}
2664
Eric Laurent81dd0f52021-07-05 11:54:40 +02002665Status AudioPolicyService::getSpatializer(
2666 const sp<media::INativeSpatializerCallback>& callback,
2667 media::GetSpatializerResponse* _aidl_return) {
2668 _aidl_return->spatializer = nullptr;
Eric Laurent2be8b292021-08-23 09:44:33 -07002669 if (callback == nullptr) {
2670 return binderStatusFromStatusT(BAD_VALUE);
2671 }
Jean-Michel Trivi41628732021-09-09 12:16:21 -07002672 if (mSpatializer != nullptr) {
2673 RETURN_IF_BINDER_ERROR(
2674 binderStatusFromStatusT(mSpatializer->registerCallback(callback)));
2675 _aidl_return->spatializer = mSpatializer;
2676 }
Eric Laurent81dd0f52021-07-05 11:54:40 +02002677 return Status::ok();
2678}
2679
2680Status AudioPolicyService::canBeSpatialized(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002681 const std::optional<media::audio::common::AudioAttributes>& attrAidl,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002682 const std::optional<AudioConfig>& configAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002683 const std::vector<AudioDevice>& devicesAidl,
Eric Laurent81dd0f52021-07-05 11:54:40 +02002684 bool* _aidl_return) {
2685 if (mAudioPolicyManager == nullptr) {
2686 return binderStatusFromStatusT(NO_INIT);
2687 }
2688 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
2689 if (attrAidl.has_value()) {
2690 attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002691 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl.value()));
Eric Laurent81dd0f52021-07-05 11:54:40 +02002692 }
2693 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
2694 if (configAidl.has_value()) {
2695 config = VALUE_OR_RETURN_BINDER_STATUS(
2696 aidl2legacy_AudioConfig_audio_config_t(configAidl.value(),
2697 false /*isInput*/));
2698 }
2699 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2700 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2701 aidl2legacy_AudioDeviceTypeAddress));
2702
Andy Hung79eacdb2023-11-30 19:34:24 -08002703 audio_utils::lock_guard _l(mMutex);
Eric Laurent81dd0f52021-07-05 11:54:40 +02002704 *_aidl_return = mAudioPolicyManager->canBeSpatialized(&attr, &config, devices);
2705 return Status::ok();
2706}
2707
Mikhail Naganov1c400902023-05-17 11:48:43 -07002708Status AudioPolicyService::getDirectPlaybackSupport(
2709 const media::audio::common::AudioAttributes &attrAidl,
2710 const AudioConfig &configAidl,
2711 media::AudioDirectMode *_aidl_return) {
jiabin2b9d5a12021-12-10 01:06:29 +00002712 if (mAudioPolicyManager == nullptr) {
2713 return binderStatusFromStatusT(NO_INIT);
2714 }
2715 if (_aidl_return == nullptr) {
2716 return binderStatusFromStatusT(BAD_VALUE);
2717 }
2718 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002719 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabin2b9d5a12021-12-10 01:06:29 +00002720 audio_config_t config = VALUE_OR_RETURN_BINDER_STATUS(
2721 aidl2legacy_AudioConfig_audio_config_t(configAidl, false /*isInput*/));
Andy Hung79eacdb2023-11-30 19:34:24 -08002722 audio_utils::lock_guard _l(mMutex);
jiabin2b9d5a12021-12-10 01:06:29 +00002723 *_aidl_return = static_cast<media::AudioDirectMode>(
2724 VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_direct_mode_t_int32_t_mask(
2725 mAudioPolicyManager->getDirectPlaybackSupport(&attr, &config))));
2726 return Status::ok();
2727}
2728
Dorin Drimusf2196d82022-01-03 12:11:18 +01002729Status AudioPolicyService::getDirectProfilesForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002730 const media::audio::common::AudioAttributes& attrAidl,
Dorin Drimusf2196d82022-01-03 12:11:18 +01002731 std::vector<media::audio::common::AudioProfile>* _aidl_return) {
2732 if (mAudioPolicyManager == nullptr) {
2733 return binderStatusFromStatusT(NO_INIT);
2734 }
2735 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002736 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Dorin Drimusf2196d82022-01-03 12:11:18 +01002737 AudioProfileVector audioProfiles;
2738
Andy Hung79eacdb2023-11-30 19:34:24 -08002739 audio_utils::lock_guard _l(mMutex);
Dorin Drimusf2196d82022-01-03 12:11:18 +01002740 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2741 mAudioPolicyManager->getDirectProfilesForAttributes(&attr, audioProfiles)));
2742 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2743 convertContainer<std::vector<media::audio::common::AudioProfile>>(
2744 audioProfiles, legacy2aidl_AudioProfile_common, false /*isInput*/));
2745
2746 return Status::ok();
2747}
2748
jiabina84c3d32022-12-02 18:59:55 +00002749Status AudioPolicyService::getSupportedMixerAttributes(
2750 int32_t portIdAidl, std::vector<media::AudioMixerAttributesInternal>* _aidl_return) {
2751 if (mAudioPolicyManager == nullptr) {
2752 return binderStatusFromStatusT(NO_INIT);
2753 }
2754
2755 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2756 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2757
2758 std::vector<audio_mixer_attributes_t> mixerAttrs;
Andy Hung79eacdb2023-11-30 19:34:24 -08002759 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002760 RETURN_IF_BINDER_ERROR(
2761 binderStatusFromStatusT(mAudioPolicyManager->getSupportedMixerAttributes(
2762 portId, mixerAttrs)));
2763 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2764 convertContainer<std::vector<media::AudioMixerAttributesInternal>>(
2765 mixerAttrs,
2766 legacy2aidl_audio_mixer_attributes_t_AudioMixerAttributesInternal));
2767 return Status::ok();
2768}
2769
2770Status AudioPolicyService::setPreferredMixerAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002771 const media::audio::common::AudioAttributes& attrAidl,
jiabina84c3d32022-12-02 18:59:55 +00002772 int32_t portIdAidl,
2773 int32_t uidAidl,
2774 const media::AudioMixerAttributesInternal& mixerAttrAidl) {
2775 if (mAudioPolicyManager == nullptr) {
2776 return binderStatusFromStatusT(NO_INIT);
2777 }
2778
2779 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002780 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabina84c3d32022-12-02 18:59:55 +00002781 audio_mixer_attributes_t mixerAttr = VALUE_OR_RETURN_BINDER_STATUS(
2782 aidl2legacy_AudioMixerAttributesInternal_audio_mixer_attributes_t(mixerAttrAidl));
2783 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2784 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2785 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2786
Andy Hung79eacdb2023-11-30 19:34:24 -08002787 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002788 return binderStatusFromStatusT(
2789 mAudioPolicyManager->setPreferredMixerAttributes(&attr, portId, uid, &mixerAttr));
2790}
2791
2792Status AudioPolicyService::getPreferredMixerAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002793 const media::audio::common::AudioAttributes& attrAidl,
jiabina84c3d32022-12-02 18:59:55 +00002794 int32_t portIdAidl,
2795 std::optional<media::AudioMixerAttributesInternal>* _aidl_return) {
2796 if (mAudioPolicyManager == nullptr) {
2797 return binderStatusFromStatusT(NO_INIT);
2798 }
2799
2800 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002801 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabina84c3d32022-12-02 18:59:55 +00002802 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2803 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2804
Andy Hung79eacdb2023-11-30 19:34:24 -08002805 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002806 audio_mixer_attributes_t mixerAttr = AUDIO_MIXER_ATTRIBUTES_INITIALIZER;
2807 RETURN_IF_BINDER_ERROR(
2808 binderStatusFromStatusT(mAudioPolicyManager->getPreferredMixerAttributes(
2809 &attr, portId, &mixerAttr)));
2810 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2811 legacy2aidl_audio_mixer_attributes_t_AudioMixerAttributesInternal(mixerAttr));
2812 return Status::ok();
2813}
2814
2815Status AudioPolicyService::clearPreferredMixerAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002816 const media::audio::common::AudioAttributes& attrAidl,
jiabina84c3d32022-12-02 18:59:55 +00002817 int32_t portIdAidl,
2818 int32_t uidAidl) {
2819 if (mAudioPolicyManager == nullptr) {
2820 return binderStatusFromStatusT(NO_INIT);
2821 }
2822
2823 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002824 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabina84c3d32022-12-02 18:59:55 +00002825 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2826 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2827 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2828
Andy Hung79eacdb2023-11-30 19:34:24 -08002829 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002830 return binderStatusFromStatusT(
2831 mAudioPolicyManager->clearPreferredMixerAttributes(&attr, portId, uid));
2832}
2833
Atneya Nair9f91a5e2024-05-09 16:25:05 -07002834Status AudioPolicyService::getPermissionController(sp<INativePermissionController>* out) {
2835 *out = mPermissionController;
2836 return Status::ok();
2837}
2838
Jiabin Huangaa6e9e32024-10-21 17:19:28 +00002839Status AudioPolicyService::getMmapPolicyInfos(
2840 AudioMMapPolicyType policyType, std::vector<AudioMMapPolicyInfo> *_aidl_return) {
2841 if (mAudioPolicyManager == nullptr) {
2842 return binderStatusFromStatusT(NO_INIT);
2843 }
2844 audio_utils::lock_guard _l(mMutex);
2845 return binderStatusFromStatusT(
2846 mAudioPolicyManager->getMmapPolicyInfos(policyType, _aidl_return));
2847}
2848
2849Status AudioPolicyService::getMmapPolicyForDevice(
2850 AudioMMapPolicyType policyType, AudioMMapPolicyInfo *policyInfo) {
2851 if (mAudioPolicyManager == nullptr) {
2852 return binderStatusFromStatusT(NO_INIT);
2853 }
2854 audio_utils::lock_guard _l(mMutex);
2855 return binderStatusFromStatusT(
2856 mAudioPolicyManager->getMmapPolicyForDevice(policyType, policyInfo));
2857}
2858
Mikhail Naganov1b2a7942017-12-08 10:18:09 -08002859} // namespace android