blob: 2f7d722c4909d92f5207de564711fd806ac5f427 [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;
91
Hayden Gomes524159d2019-12-23 14:41:47 -080092const std::vector<audio_usage_t>& SYSTEM_USAGES = {
93 AUDIO_USAGE_CALL_ASSISTANT,
94 AUDIO_USAGE_EMERGENCY,
95 AUDIO_USAGE_SAFETY,
96 AUDIO_USAGE_VEHICLE_STATUS,
97 AUDIO_USAGE_ANNOUNCEMENT
98};
99
100bool isSystemUsage(audio_usage_t usage) {
101 return std::find(std::begin(SYSTEM_USAGES), std::end(SYSTEM_USAGES), usage)
102 != std::end(SYSTEM_USAGES);
103}
104
105bool AudioPolicyService::isSupportedSystemUsage(audio_usage_t usage) {
106 return std::find(std::begin(mSupportedSystemUsages), std::end(mSupportedSystemUsages), usage)
107 != std::end(mSupportedSystemUsages);
108}
109
Atneya Nair09859fe2024-07-15 16:38:02 -0700110Status AudioPolicyService::validateUsage(const audio_attributes_t& attr) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100111 return validateUsage(attr, getCallingAttributionSource());
Hayden Gomes524159d2019-12-23 14:41:47 -0800112}
113
Atneya Nair09859fe2024-07-15 16:38:02 -0700114Status AudioPolicyService::validateUsage(const audio_attributes_t& attr,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000115 const AttributionSourceState& attributionSource) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100116 if (isSystemUsage(attr.usage)) {
117 if (isSupportedSystemUsage(attr.usage)) {
118 if (attr.usage == AUDIO_USAGE_CALL_ASSISTANT
119 && ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0)) {
Atneya Nair09859fe2024-07-15 16:38:02 -0700120 if (!(audioserver_permissions() ?
121 CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
122 : callAudioInterceptionAllowed(attributionSource))) {
Eric Laurentf8763482022-03-30 20:37:30 +0200123 ALOGE("%s: call audio interception not allowed for attribution source: %s",
124 __func__, attributionSource.toString().c_str());
Atneya Nair09859fe2024-07-15 16:38:02 -0700125 return Status::fromExceptionCode(Status::EX_SECURITY,
126 "Call audio interception not allowed");
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100127 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700128 } else if (!(audioserver_permissions() ?
129 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid)
130 : modifyAudioRoutingAllowed(attributionSource))) {
Eric Laurentf8763482022-03-30 20:37:30 +0200131 ALOGE("%s: modify audio routing not allowed for attribution source: %s",
132 __func__, attributionSource.toString().c_str());
Atneya Nair09859fe2024-07-15 16:38:02 -0700133 return Status::fromExceptionCode(Status::EX_SECURITY,
134 "Modify audio routing not allowed");
Hayden Gomes524159d2019-12-23 14:41:47 -0800135 }
136 } else {
Atneya Nair09859fe2024-07-15 16:38:02 -0700137 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT);
Hayden Gomes524159d2019-12-23 14:41:47 -0800138 }
139 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700140 return Status::ok();
Hayden Gomes524159d2019-12-23 14:41:47 -0800141}
142
143
Eric Laurent2d388ec2014-03-07 13:25:54 -0800144
145// ----------------------------------------------------------------------------
146
Mikhail Naganov88b30d22020-03-09 19:43:13 +0000147void AudioPolicyService::doOnNewAudioModulesAvailable()
148{
149 if (mAudioPolicyManager == NULL) return;
Andy Hung79eacdb2023-11-30 19:34:24 -0800150 audio_utils::lock_guard _l(mMutex);
Mikhail Naganov88b30d22020-03-09 19:43:13 +0000151 AutoCallerClear acc;
152 mAudioPolicyManager->onNewAudioModulesAvailable();
153}
154
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800155Status AudioPolicyService::setDeviceConnectionState(
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800156 media::AudioPolicyDeviceState stateAidl,
Nathalie Le Clair88fa2752021-11-23 13:03:41 +0100157 const android::media::audio::common::AudioPort& port,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700158 const AudioFormatDescription& encodedFormatAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800159 audio_policy_dev_state_t state = VALUE_OR_RETURN_BINDER_STATUS(
160 aidl2legacy_AudioPolicyDeviceState_audio_policy_dev_state_t(stateAidl));
161 audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -0700162 aidl2legacy_AudioFormatDescription_audio_format_t(encodedFormatAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800163
Eric Laurentdce54a12014-03-10 12:19:46 -0700164 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800165 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800166 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700167 if (!(audioserver_permissions() ?
168 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
169 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800170 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800171 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800172 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
173 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800174 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800175 }
176
177 ALOGV("setDeviceConnectionState()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800178 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700179 AutoCallerClear acc;
Mikhail Naganov932cb962021-09-16 01:05:27 +0000180 status_t status = mAudioPolicyManager->setDeviceConnectionState(
Nathalie Le Clair88fa2752021-11-23 13:03:41 +0100181 state, port, encodedFormat);
Eric Laurent39095982021-08-24 18:29:27 +0200182 if (status == NO_ERROR) {
183 onCheckSpatializer_l();
184 }
185 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800186}
187
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000188Status AudioPolicyService::getDeviceConnectionState(const AudioDevice& deviceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800189 media::AudioPolicyDeviceState* _aidl_return) {
Mikhail Naganov932cb962021-09-16 01:05:27 +0000190 audio_devices_t device;
191 std::string address;
192 RETURN_BINDER_STATUS_IF_ERROR(
193 aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
Eric Laurentdce54a12014-03-10 12:19:46 -0700194 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800195 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
196 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
197 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
198 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800199 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800200 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700201 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800202 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
203 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
Mikhail Naganov932cb962021-09-16 01:05:27 +0000204 mAudioPolicyManager->getDeviceConnectionState(
205 device, address.c_str())));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800206 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800207}
208
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800209Status AudioPolicyService::handleDeviceConfigChange(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000210 const AudioDevice& deviceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800211 const std::string& deviceNameAidl,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700212 const AudioFormatDescription& encodedFormatAidl) {
Mikhail Naganov932cb962021-09-16 01:05:27 +0000213 audio_devices_t device;
214 std::string address;
215 RETURN_BINDER_STATUS_IF_ERROR(
216 aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800217 audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -0700218 aidl2legacy_AudioFormatDescription_audio_format_t(encodedFormatAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800219
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800220 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800221 return binderStatusFromStatusT(NO_INIT);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800222 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700223 if (!(audioserver_permissions() ?
224 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
225 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800226 return binderStatusFromStatusT(PERMISSION_DENIED);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800227 }
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800228
229 ALOGV("handleDeviceConfigChange()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800230 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700231 AutoCallerClear acc;
Eric Laurent39095982021-08-24 18:29:27 +0200232 status_t status = mAudioPolicyManager->handleDeviceConfigChange(
Mikhail Naganov932cb962021-09-16 01:05:27 +0000233 device, address.c_str(), deviceNameAidl.c_str(), encodedFormat);
Eric Laurent39095982021-08-24 18:29:27 +0200234
235 if (status == NO_ERROR) {
236 onCheckSpatializer_l();
237 }
238 return binderStatusFromStatusT(status);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800239}
240
Mikhail Naganovddceecc2021-09-03 13:58:56 -0700241Status AudioPolicyService::setPhoneState(AudioMode stateAidl, int32_t uidAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800242{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800243 audio_mode_t state = VALUE_OR_RETURN_BINDER_STATUS(
244 aidl2legacy_AudioMode_audio_mode_t(stateAidl));
245 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700246 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800247 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800248 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700249 if (!(audioserver_permissions() ?
250 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
251 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800252 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800253 }
254 if (uint32_t(state) >= AUDIO_MODE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800255 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800256 }
257
258 ALOGV("setPhoneState()");
259
Eric Laurentbeb07fe2015-09-16 15:49:30 -0700260 // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic
261 // operation from policy manager standpoint (no other operation (e.g track start or stop)
262 // can be interleaved).
Andy Hung79eacdb2023-11-30 19:34:24 -0800263 audio_utils::lock_guard _l(mMutex);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800264 // TODO: check if it is more appropriate to do it in platform specific policy manager
Eric Laurentc8c4f1f2021-11-09 11:51:34 +0100265
266 // Audio HAL mode conversion for call redirect modes
267 audio_mode_t halMode = state;
268 if (state == AUDIO_MODE_CALL_REDIRECT) {
269 halMode = AUDIO_MODE_CALL_SCREEN;
270 } else if (state == AUDIO_MODE_COMMUNICATION_REDIRECT) {
271 halMode = AUDIO_MODE_NORMAL;
272 }
273 AudioSystem::setMode(halMode);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800274
Eric Laurent10b71232018-04-13 18:14:44 -0700275 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700276 mAudioPolicyManager->setPhoneState(state);
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700277 mPhoneState = state;
Eric Laurent00dba062020-02-11 15:52:09 -0800278 mPhoneStateOwnerUid = uid;
Mingshu Pangd07c19b2021-02-25 11:40:32 +0800279 updateUidStates_l();
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800280 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800281}
282
Mikhail Naganovddceecc2021-09-03 13:58:56 -0700283Status AudioPolicyService::getPhoneState(AudioMode* _aidl_return) {
Andy Hung79eacdb2023-11-30 19:34:24 -0800284 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800285 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_mode_t_AudioMode(mPhoneState));
286 return Status::ok();
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700287}
288
François Gaffie873738c2024-08-02 17:09:21 +0200289Status AudioPolicyService::setForceUse(AudioPolicyForceUse usageAidl,
290 AudioPolicyForcedConfig configAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800291{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800292 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
293 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
294 audio_policy_forced_cfg_t config = VALUE_OR_RETURN_BINDER_STATUS(
295 aidl2legacy_AudioPolicyForcedConfig_audio_policy_forced_cfg_t(configAidl));
296
Eric Laurentdce54a12014-03-10 12:19:46 -0700297 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800298 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800299 }
Eric Laurente17378d2018-05-09 14:43:01 -0700300
Atneya Nair09859fe2024-07-15 16:38:02 -0700301 if (!(audioserver_permissions() ?
302 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
303 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800304 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800305 }
Eric Laurente17378d2018-05-09 14:43:01 -0700306
Eric Laurent2d388ec2014-03-07 13:25:54 -0800307 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800308 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800309 }
310 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800311 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800312 }
313 ALOGV("setForceUse()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800314 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700315 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700316 mAudioPolicyManager->setForceUse(usage, config);
Eric Laurent39095982021-08-24 18:29:27 +0200317 onCheckSpatializer_l();
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800318 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800319}
320
François Gaffie873738c2024-08-02 17:09:21 +0200321Status AudioPolicyService::getForceUse(AudioPolicyForceUse usageAidl,
322 AudioPolicyForcedConfig* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800323 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
324 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
325
Eric Laurentdce54a12014-03-10 12:19:46 -0700326 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800327 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800328 }
329 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800330 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
331 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(AUDIO_POLICY_FORCE_NONE));
332 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800333 }
Eric Laurent10b71232018-04-13 18:14:44 -0700334 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800335 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
336 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(
337 mAudioPolicyManager->getForceUse(usage)));
338 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800339}
340
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700341Status AudioPolicyService::getOutput(AudioStreamType streamAidl, int32_t* _aidl_return)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800342{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800343 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
344 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
345
Eric Laurent72af8012023-03-15 17:36:22 +0100346 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT
347 && stream != AUDIO_STREAM_ASSISTANT && stream != AUDIO_STREAM_CALL_ASSISTANT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800348 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
349 legacy2aidl_audio_io_handle_t_int32_t(AUDIO_IO_HANDLE_NONE));
350 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -0700351 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700352 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800353 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800354 }
355 ALOGV("getOutput()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800356 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700357 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800358 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
359 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutput(stream)));
360 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800361}
362
Mikhail Naganov1c400902023-05-17 11:48:43 -0700363Status AudioPolicyService::getOutputForAttr(const media::audio::common::AudioAttributes& attrAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800364 int32_t sessionAidl,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000365 const AttributionSourceState& attributionSource,
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700366 const AudioConfig& configAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800367 int32_t flagsAidl,
Eric Laurentf99edd32021-02-01 15:57:33 +0100368 int32_t selectedDeviceIdAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800369 media::GetOutputForAttrResponse* _aidl_return)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700370{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800371 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -0700372 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800373 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
374 aidl2legacy_int32_t_audio_session_t(sessionAidl));
375 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800376 audio_config_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -0700377 aidl2legacy_AudioConfig_audio_config_t(configAidl, false /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800378 audio_output_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
379 aidl2legacy_int32_t_audio_output_flags_t_mask(flagsAidl));
Eric Laurentf99edd32021-02-01 15:57:33 +0100380 audio_port_handle_t selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
381 aidl2legacy_int32_t_audio_port_handle_t(selectedDeviceIdAidl));
382
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800383 audio_io_handle_t output;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800384 audio_port_handle_t portId;
385 std::vector<audio_io_handle_t> secondaryOutputs;
386
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700387 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800388 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700389 }
Hayden Gomes524159d2019-12-23 14:41:47 -0800390
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800391 RETURN_IF_BINDER_ERROR(
392 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Atneya Nair09859fe2024-07-15 16:38:02 -0700393 RETURN_IF_BINDER_ERROR(validateUsage(attr, attributionSource));
Hayden Gomes524159d2019-12-23 14:41:47 -0800394
Eric Laurent8a1095a2019-11-08 14:44:16 -0800395 ALOGV("%s()", __func__);
Andy Hung79eacdb2023-11-30 19:34:24 -0800396 audio_utils::lock_guard _l(mMutex);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700397
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700398 if (!mPackageManager.allowPlaybackCapture(VALUE_OR_RETURN_BINDER_STATUS(
Eric Laurent9ff3e532022-11-10 16:04:44 +0100399 aidl2legacy_int32_t_uid_t(attributionSource.uid)))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800400 attr.flags = static_cast<audio_flags_mask_t>(attr.flags | AUDIO_FLAG_NO_MEDIA_PROJECTION);
Eric Laurent42984412019-05-09 17:57:03 -0700401 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700402 const bool bypassInterruptionAllowed = audioserver_permissions() ? (
403 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid) ||
404 CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid) ||
405 CHECK_PERM(WRITE_SECURE_SETTINGS, attributionSource.uid))
406 : bypassInterruptionPolicyAllowed(attributionSource);
407
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800408 if (((attr.flags & (AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)) != 0)
Atneya Nair09859fe2024-07-15 16:38:02 -0700409 && !bypassInterruptionAllowed) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800410 attr.flags = static_cast<audio_flags_mask_t>(
411 attr.flags & ~(AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE));
Kevin Rocard8be94972019-02-22 13:26:25 -0800412 }
Carter Hsua3abb402021-10-26 11:11:20 +0800413
414 if (attr.content_type == AUDIO_CONTENT_TYPE_ULTRASOUND) {
Atneya Nair09859fe2024-07-15 16:38:02 -0700415 if (!(audioserver_permissions() ?
416 CHECK_PERM(ACCESS_ULTRASOUND, attributionSource.uid)
417 : accessUltrasoundAllowed(attributionSource))) {
Carter Hsua3abb402021-10-26 11:11:20 +0800418 ALOGE("%s: permission denied: ultrasound not allowed for uid %d pid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100419 __func__, attributionSource.uid, attributionSource.pid);
Carter Hsua3abb402021-10-26 11:11:20 +0800420 return binderStatusFromStatusT(PERMISSION_DENIED);
421 }
422 }
423
Eric Laurent10b71232018-04-13 18:14:44 -0700424 AutoCallerClear acc;
Eric Laurent8a1095a2019-11-08 14:44:16 -0800425 AudioPolicyInterface::output_type_t outputType;
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200426 bool isSpatialized = false;
jiabinc658e452022-10-21 20:52:21 +0000427 bool isBitPerfect = false;
Andy Hung6b137d12024-08-27 22:35:17 +0000428 float volume;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800429 status_t result = mAudioPolicyManager->getOutputForAttr(&attr, &output, session,
430 &stream,
Eric Laurent9ff3e532022-11-10 16:04:44 +0100431 attributionSource,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800432 &config,
433 &flags, &selectedDeviceId, &portId,
434 &secondaryOutputs,
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200435 &outputType,
jiabinc658e452022-10-21 20:52:21 +0000436 &isSpatialized,
Andy Hung6b137d12024-08-27 22:35:17 +0000437 &isBitPerfect,
438 &volume);
Nadav Bar766fb022018-01-07 12:18:03 +0200439
440 // FIXME: Introduce a way to check for the the telephony device before opening the output
Eric Laurent8a1095a2019-11-08 14:44:16 -0800441 if (result == NO_ERROR) {
442 // enforce permission (if any) required for each type of input
443 switch (outputType) {
444 case AudioPolicyInterface::API_OUTPUT_LEGACY:
445 break;
446 case AudioPolicyInterface::API_OUTPUT_TELEPHONY_TX:
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100447 if (((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0)
Atneya Nair09859fe2024-07-15 16:38:02 -0700448 && !(audioserver_permissions() ?
449 CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
450 : callAudioInterceptionAllowed(attributionSource))) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100451 ALOGE("%s() permission denied: call redirection not allowed for uid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100452 __func__, attributionSource.uid);
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100453 result = PERMISSION_DENIED;
Atneya Nair09859fe2024-07-15 16:38:02 -0700454 } else if (!(audioserver_permissions() ?
455 CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid)
456 : modifyPhoneStateAllowed(attributionSource))) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800457 ALOGE("%s() permission denied: modify phone state not allowed for uid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100458 __func__, attributionSource.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800459 result = PERMISSION_DENIED;
460 }
461 break;
462 case AudioPolicyInterface::API_OUT_MIX_PLAYBACK:
Atneya Nair09859fe2024-07-15 16:38:02 -0700463 if (!(audioserver_permissions() ?
464 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid)
465 : modifyAudioRoutingAllowed(attributionSource))) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800466 ALOGE("%s() permission denied: modify audio routing not allowed for uid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100467 __func__, attributionSource.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800468 result = PERMISSION_DENIED;
469 }
470 break;
471 case AudioPolicyInterface::API_OUTPUT_INVALID:
472 default:
473 LOG_ALWAYS_FATAL("%s() encountered an invalid output type %d",
474 __func__, (int)outputType);
475 }
Nadav Bar766fb022018-01-07 12:18:03 +0200476 }
Eric Laurentd7fe0862018-07-14 16:48:01 -0700477
478 if (result == NO_ERROR) {
Eric Laurent0d13fea2022-11-04 17:12:08 +0100479 attr = VALUE_OR_RETURN_BINDER_STATUS(
480 mUsecaseValidator->verifyAudioAttributes(output, attributionSource, attr));
481
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800482 sp<AudioPlaybackClient> client =
Eric Laurent9ff3e532022-11-10 16:04:44 +0100483 new AudioPlaybackClient(attr, output, attributionSource, session,
Eric Laurentb16eac52024-08-02 16:46:08 +0000484 portId, selectedDeviceId, stream, isSpatialized, config.channel_mask);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800485 mAudioPlaybackClients.add(portId, client);
486
487 _aidl_return->output = VALUE_OR_RETURN_BINDER_STATUS(
488 legacy2aidl_audio_io_handle_t_int32_t(output));
489 _aidl_return->stream = VALUE_OR_RETURN_BINDER_STATUS(
490 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
491 _aidl_return->selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
492 legacy2aidl_audio_port_handle_t_int32_t(selectedDeviceId));
493 _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
494 legacy2aidl_audio_port_handle_t_int32_t(portId));
495 _aidl_return->secondaryOutputs = VALUE_OR_RETURN_BINDER_STATUS(
496 convertContainer<std::vector<int32_t>>(secondaryOutputs,
497 legacy2aidl_audio_io_handle_t_int32_t));
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200498 _aidl_return->isSpatialized = isSpatialized;
jiabinc658e452022-10-21 20:52:21 +0000499 _aidl_return->isBitPerfect = isBitPerfect;
Eric Laurent0d13fea2022-11-04 17:12:08 +0100500 _aidl_return->attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -0700501 legacy2aidl_audio_attributes_t_AudioAttributes(attr));
Andy Hung6b137d12024-08-27 22:35:17 +0000502 _aidl_return->volume = volume;
jiabinf1c73972022-04-14 16:28:52 -0700503 } else {
504 _aidl_return->configBase.format = VALUE_OR_RETURN_BINDER_STATUS(
505 legacy2aidl_audio_format_t_AudioFormatDescription(config.format));
506 _aidl_return->configBase.channelMask = VALUE_OR_RETURN_BINDER_STATUS(
507 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
508 config.channel_mask, false /*isInput*/));
509 _aidl_return->configBase.sampleRate = config.sample_rate;
Eric Laurentd7fe0862018-07-14 16:48:01 -0700510 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800511 return binderStatusFromStatusT(result);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700512}
513
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700514void AudioPolicyService::getPlaybackClientAndEffects(audio_port_handle_t portId,
515 sp<AudioPlaybackClient>& client,
516 sp<AudioPolicyEffects>& effects,
517 const char *context)
518{
Andy Hung79eacdb2023-11-30 19:34:24 -0800519 audio_utils::lock_guard _l(mMutex);
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700520 const ssize_t index = mAudioPlaybackClients.indexOfKey(portId);
521 if (index < 0) {
522 ALOGE("%s AudioTrack client not found for portId %d", context, portId);
523 return;
524 }
525 client = mAudioPlaybackClients.valueAt(index);
526 effects = mAudioPolicyEffects;
527}
528
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800529Status AudioPolicyService::startOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800530{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800531 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
532 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700533 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800534 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800535 }
536 ALOGV("startOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700537 sp<AudioPlaybackClient> client;
Shunkai Yao8d6489a2023-04-18 23:14:25 +0000538 sp<AudioPolicyEffects> audioPolicyEffects;
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700539
540 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
541
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700542 if (audioPolicyEffects != 0) {
543 // create audio processors according to stream
Shunkai Yao8d6489a2023-04-18 23:14:25 +0000544 status_t status = audioPolicyEffects->addOutputSessionEffects(client->io, client->stream,
545 client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700546 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700547 ALOGW("Failed to add effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700548 }
549 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800550 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700551 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700552 status_t status = mAudioPolicyManager->startOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700553 if (status == NO_ERROR) {
Eric Laurent0d13fea2022-11-04 17:12:08 +0100554 //TODO b/257922898: decide if/how we need to handle attributes update when playback starts
555 // or during playback
556 (void)mUsecaseValidator->startClient(client->io, client->portId, client->attributionSource,
557 client->attributes, nullptr /* callback */);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700558 client->active = true;
Eric Laurent15903592022-02-24 20:44:36 +0100559 onUpdateActiveSpatializerTracks_l();
Eric Laurentd7fe0862018-07-14 16:48:01 -0700560 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800561 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800562}
563
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800564Status AudioPolicyService::stopOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800565{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800566 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
567 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700568 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800569 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800570 }
571 ALOGV("stopOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700572 mOutputCommandThread->stopOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800573 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800574}
575
Eric Laurentd7fe0862018-07-14 16:48:01 -0700576status_t AudioPolicyService::doStopOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800577{
Eric Laurentd7fe0862018-07-14 16:48:01 -0700578 ALOGV("doStopOutput");
579 sp<AudioPlaybackClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700580 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentd7fe0862018-07-14 16:48:01 -0700581
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700582 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
583
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700584 if (audioPolicyEffects != 0) {
585 // release audio processors from the stream
Eric Laurentd7fe0862018-07-14 16:48:01 -0700586 status_t status = audioPolicyEffects->releaseOutputSessionEffects(
587 client->io, client->stream, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700588 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700589 ALOGW("Failed to release effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700590 }
591 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800592 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700593 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700594 status_t status = mAudioPolicyManager->stopOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700595 if (status == NO_ERROR) {
596 client->active = false;
Eric Laurent15903592022-02-24 20:44:36 +0100597 onUpdateActiveSpatializerTracks_l();
Eric Laurent0d13fea2022-11-04 17:12:08 +0100598 mUsecaseValidator->stopClient(client->io, client->portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700599 }
600 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800601}
602
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800603Status AudioPolicyService::releaseOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800604{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800605 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
606 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700607 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800608 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800609 }
610 ALOGV("releaseOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700611 mOutputCommandThread->releaseOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800612 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800613}
614
Eric Laurentd7fe0862018-07-14 16:48:01 -0700615void AudioPolicyService::doReleaseOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800616{
617 ALOGV("doReleaseOutput from tid %d", gettid());
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700618 sp<AudioPlaybackClient> client;
619 sp<AudioPolicyEffects> audioPolicyEffects;
620
621 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
622
623 if (audioPolicyEffects != 0 && client->active) {
624 // clean up effects if output was not stopped before being released
625 audioPolicyEffects->releaseOutputSessionEffects(
626 client->io, client->stream, client->session);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700627 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800628 audio_utils::lock_guard _l(mMutex);
Eric Laurent15903592022-02-24 20:44:36 +0100629 if (client != nullptr && client->active) {
630 onUpdateActiveSpatializerTracks_l();
631 }
Eric Laurentd4007242019-03-27 12:42:16 -0700632 mAudioPlaybackClients.removeItem(portId);
Eric Laurent10b71232018-04-13 18:14:44 -0700633 // called from internal thread: no need to clear caller identity
Eric Laurent8fc147b2018-07-22 19:13:55 -0700634 mAudioPolicyManager->releaseOutput(portId);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800635}
636
Mikhail Naganov1c400902023-05-17 11:48:43 -0700637Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttributes& attrAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800638 int32_t inputAidl,
639 int32_t riidAidl,
640 int32_t sessionAidl,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000641 const AttributionSourceState& attributionSource,
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700642 const AudioConfigBase& configAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800643 int32_t flagsAidl,
Eric Laurentf99edd32021-02-01 15:57:33 +0100644 int32_t selectedDeviceIdAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800645 media::GetInputForAttrResponse* _aidl_return) {
646 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -0700647 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800648 audio_io_handle_t input = VALUE_OR_RETURN_BINDER_STATUS(
649 aidl2legacy_int32_t_audio_io_handle_t(inputAidl));
650 audio_unique_id_t riid = VALUE_OR_RETURN_BINDER_STATUS(
651 aidl2legacy_int32_t_audio_unique_id_t(riidAidl));
652 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
653 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800654 audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -0700655 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl, true /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800656 audio_input_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
657 aidl2legacy_int32_t_audio_input_flags_t_mask(flagsAidl));
Eric Laurentf99edd32021-02-01 15:57:33 +0100658 audio_port_handle_t selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
659 aidl2legacy_int32_t_audio_port_handle_t(selectedDeviceIdAidl));
660
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800661 audio_port_handle_t portId;
662
Eric Laurentdce54a12014-03-10 12:19:46 -0700663 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800664 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800665 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800666
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800667 RETURN_IF_BINDER_ERROR(
668 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Hayden Gomes524159d2019-12-23 14:41:47 -0800669
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800670 audio_source_t inputSource = attr.source;
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900671 if (inputSource == AUDIO_SOURCE_DEFAULT) {
672 inputSource = AUDIO_SOURCE_MIC;
673 }
674
Eric Laurent2d388ec2014-03-07 13:25:54 -0800675 // already checked by client, but double-check in case the client wrapper is bypassed
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900676 if ((inputSource < AUDIO_SOURCE_DEFAULT)
677 || (inputSource >= AUDIO_SOURCE_CNT
678 && inputSource != AUDIO_SOURCE_HOTWORD
679 && inputSource != AUDIO_SOURCE_FM_TUNER
Carter Hsua3abb402021-10-26 11:11:20 +0800680 && inputSource != AUDIO_SOURCE_ECHO_REFERENCE
681 && inputSource != AUDIO_SOURCE_ULTRASOUND)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800682 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800683 }
684
Atneya Nair09859fe2024-07-15 16:38:02 -0700685 RETURN_IF_BINDER_ERROR(validateUsage(attr, attributionSource));
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700686
Marvin Ramine5a122d2023-12-07 13:57:59 +0100687 uint32_t virtualDeviceId = kDefaultVirtualDeviceId;
688
Eric Laurent58a0dd82019-10-24 12:42:17 -0700689 // check calling permissions.
Eric Laurent637bd202021-09-22 11:17:11 +0200690 // Capturing from the following sources does not require permission RECORD_AUDIO
691 // as the captured audio does not come from a microphone:
692 // - FM_TUNER source is controlled by captureTunerAudioInputAllowed() or
693 // captureAudioOutputAllowed() (deprecated).
694 // - REMOTE_SUBMIX source is controlled by captureAudioOutputAllowed() if the input
695 // type is API_INPUT_MIX_EXT_POLICY_REROUTE and by AudioService if a media projection
696 // is used and input type is API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK
697 // - ECHO_REFERENCE source is controlled by captureAudioOutputAllowed()
Atneya Nair09859fe2024-07-15 16:38:02 -0700698 const auto isRecordingAllowed = audioserver_permissions() ?
699 CHECK_PERM(RECORD_AUDIO, attributionSource.uid) :
700 recordingAllowed(attributionSource, inputSource);
701 if (!(isRecordingAllowed
Eric Laurent637bd202021-09-22 11:17:11 +0200702 || inputSource == AUDIO_SOURCE_FM_TUNER
703 || inputSource == AUDIO_SOURCE_REMOTE_SUBMIX
704 || inputSource == AUDIO_SOURCE_ECHO_REFERENCE)) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700705 ALOGE("%s permission denied: recording not allowed for %s",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100706 __func__, attributionSource.toString().c_str());
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800707 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800708 }
709
Atneya Nair09859fe2024-07-15 16:38:02 -0700710 bool canCaptureOutput = audioserver_permissions() ?
711 CHECK_PERM(CAPTURE_AUDIO_OUTPUT, attributionSource.uid)
712 : captureAudioOutputAllowed(attributionSource);
713 bool canInterceptCallAudio = audioserver_permissions() ?
714 CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
715 : callAudioInterceptionAllowed(attributionSource);
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100716 bool isCallAudioSource = inputSource == AUDIO_SOURCE_VOICE_UPLINK
717 || inputSource == AUDIO_SOURCE_VOICE_DOWNLINK
718 || inputSource == AUDIO_SOURCE_VOICE_CALL;
719
720 if (isCallAudioSource && !canInterceptCallAudio && !canCaptureOutput) {
721 return binderStatusFromStatusT(PERMISSION_DENIED);
722 }
723 if (inputSource == AUDIO_SOURCE_ECHO_REFERENCE
Eric Laurent637bd202021-09-22 11:17:11 +0200724 && !canCaptureOutput) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800725 return binderStatusFromStatusT(PERMISSION_DENIED);
Hayden Gomesb7429922020-12-11 13:59:18 -0800726 }
Hayden Gomesb7429922020-12-11 13:59:18 -0800727 if (inputSource == AUDIO_SOURCE_FM_TUNER
Eric Laurent637bd202021-09-22 11:17:11 +0200728 && !canCaptureOutput
Atneya Nair09859fe2024-07-15 16:38:02 -0700729 && !(audioserver_permissions() ?
730 CHECK_PERM(CAPTURE_TUNER_AUDIO_INPUT, attributionSource.uid)
731 : captureTunerAudioInputAllowed(attributionSource))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800732 return binderStatusFromStatusT(PERMISSION_DENIED);
Nadav Bar744be482018-05-08 13:26:21 +0300733 }
734
Atneya Nair09859fe2024-07-15 16:38:02 -0700735 bool canCaptureHotword = audioserver_permissions() ?
736 CHECK_PERM(CAPTURE_AUDIO_HOTWORD, attributionSource.uid)
737 : captureHotwordAllowed(attributionSource);
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900738 if ((inputSource == AUDIO_SOURCE_HOTWORD) && !canCaptureHotword) {
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800739 return binderStatusFromStatusT(PERMISSION_DENIED);
740 }
741
Atneya Nair0f0a8032022-12-12 16:20:12 -0800742 if (((flags & (AUDIO_INPUT_FLAG_HW_HOTWORD |
743 AUDIO_INPUT_FLAG_HOTWORD_TAP |
744 AUDIO_INPUT_FLAG_HW_LOOKBACK)) != 0)
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800745 && !canCaptureHotword) {
746 ALOGE("%s: permission denied: hotword mode not allowed"
Eric Laurent9ff3e532022-11-10 16:04:44 +0100747 " for uid %d pid %d", __func__, attributionSource.uid, attributionSource.pid);
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800748 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7504b9e2017-08-15 18:17:26 -0700749 }
750
Carter Hsua3abb402021-10-26 11:11:20 +0800751 if (attr.source == AUDIO_SOURCE_ULTRASOUND) {
Atneya Nair09859fe2024-07-15 16:38:02 -0700752 if (!(audioserver_permissions() ?
753 CHECK_PERM(ACCESS_ULTRASOUND, attributionSource.uid)
754 : accessUltrasoundAllowed(attributionSource))) {
Carter Hsua3abb402021-10-26 11:11:20 +0800755 ALOGE("%s: permission denied: ultrasound not allowed for uid %d pid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100756 __func__, attributionSource.uid, attributionSource.pid);
Carter Hsua3abb402021-10-26 11:11:20 +0800757 return binderStatusFromStatusT(PERMISSION_DENIED);
758 }
759 }
760
Eric Laurent7504b9e2017-08-15 18:17:26 -0700761 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700762 {
Eric Laurent7504b9e2017-08-15 18:17:26 -0700763 status_t status;
764 AudioPolicyInterface::input_type_t inputType;
765
Andy Hung79eacdb2023-11-30 19:34:24 -0800766 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700767 {
768 AutoCallerClear acc;
769 // the audio_in_acoustics_t parameter is ignored by get_input()
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700770 status = mAudioPolicyManager->getInputForAttr(&attr, &input, riid, session,
Eric Laurent9ff3e532022-11-10 16:04:44 +0100771 attributionSource, &config,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800772 flags, &selectedDeviceId,
Marvin Ramine5a122d2023-12-07 13:57:59 +0100773 &inputType, &portId,
774 &virtualDeviceId);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700775
Eric Laurent10b71232018-04-13 18:14:44 -0700776 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700777 audioPolicyEffects = mAudioPolicyEffects;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800778
779 if (status == NO_ERROR) {
780 // enforce permission (if any) required for each type of input
781 switch (inputType) {
Kevin Rocard25f9b052019-02-27 15:08:54 -0800782 case AudioPolicyInterface::API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK:
783 // this use case has been validated in audio service with a MediaProjection token,
784 // and doesn't rely on regular permissions
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800785 case AudioPolicyInterface::API_INPUT_LEGACY:
786 break;
Eric Laurent82db2692015-08-07 13:59:42 -0700787 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX:
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100788 if ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0
789 && canInterceptCallAudio) {
790 break;
791 }
Eric Laurent82db2692015-08-07 13:59:42 -0700792 // FIXME: use the same permission as for remote submix for now.
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100793 FALLTHROUGH_INTENDED;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800794 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
Eric Laurent1ff16a72019-03-14 18:35:04 -0700795 if (!canCaptureOutput) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100796 ALOGE("%s permission denied: capture not allowed", __func__);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800797 status = PERMISSION_DENIED;
798 }
799 break;
Atneya Nair09859fe2024-07-15 16:38:02 -0700800 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE: {
801 bool modAudioRoutingAllowed;
802 if (audioserver_permissions()) {
803 auto result = getPermissionProvider().checkPermission(
804 MODIFY_AUDIO_ROUTING, attributionSource.uid);
805 if (!result.ok()) {
806 ALOGE("%s permission provider error: %s", __func__,
807 result.error().toString8().c_str());
808 status = aidl_utils::statusTFromBinderStatus(result.error());
809 break;
810 }
811 modAudioRoutingAllowed = result.value();
812 } else {
813 modAudioRoutingAllowed = modifyAudioRoutingAllowed(attributionSource);
814 }
815 if (!(modAudioRoutingAllowed
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100816 || ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0
817 && canInterceptCallAudio))) {
818 ALOGE("%s permission denied for remote submix capture", __func__);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800819 status = PERMISSION_DENIED;
820 }
821 break;
Atneya Nair09859fe2024-07-15 16:38:02 -0700822 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800823 case AudioPolicyInterface::API_INPUT_INVALID:
824 default:
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100825 LOG_ALWAYS_FATAL("%s encountered an invalid input type %d",
826 __func__, (int)inputType);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800827 }
Marvin Ramine5a122d2023-12-07 13:57:59 +0100828
829 if (audiopolicy_flags::record_audio_device_aware_permission()) {
830 // enforce device-aware RECORD_AUDIO permission
831 if (virtualDeviceId != kDefaultVirtualDeviceId &&
832 !recordingAllowed(attributionSource, virtualDeviceId, inputSource)) {
833 status = PERMISSION_DENIED;
834 }
835 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800836 }
837
838 if (status != NO_ERROR) {
839 if (status == PERMISSION_DENIED) {
Eric Laurent10b71232018-04-13 18:14:44 -0700840 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800841 mAudioPolicyManager->releaseInput(portId);
jiabinf1c73972022-04-14 16:28:52 -0700842 } else {
843 _aidl_return->config = VALUE_OR_RETURN_BINDER_STATUS(
844 legacy2aidl_audio_config_base_t_AudioConfigBase(config, true /*isInput*/));
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800845 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800846 return binderStatusFromStatusT(status);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800847 }
Eric Laurentfee19762018-01-29 18:44:13 -0800848
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700849 sp<AudioRecordClient> client = new AudioRecordClient(attr, input, session, portId,
Eric Laurent9ff3e532022-11-10 16:04:44 +0100850 selectedDeviceId, attributionSource,
Marvin Ramine5a122d2023-12-07 13:57:59 +0100851 virtualDeviceId,
Eric Laurented726cc2021-07-01 14:26:41 +0200852 canCaptureOutput, canCaptureHotword,
Eric Laurent9925db52021-07-20 16:03:34 +0200853 mOutputCommandThread);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800854 mAudioRecordClients.add(portId, client);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700855 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800856
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700857 if (audioPolicyEffects != 0) {
858 // create audio pre processors according to input source
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800859 status_t status = audioPolicyEffects->addInputEffects(input, inputSource, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700860 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800861 ALOGW("Failed to add effects on input %d", input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700862 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800863 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800864
865 _aidl_return->input = VALUE_OR_RETURN_BINDER_STATUS(
866 legacy2aidl_audio_io_handle_t_int32_t(input));
867 _aidl_return->selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
868 legacy2aidl_audio_port_handle_t_int32_t(selectedDeviceId));
869 _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
870 legacy2aidl_audio_port_handle_t_int32_t(portId));
871 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800872}
873
Eric Laurent99fcae42018-05-17 16:59:18 -0700874std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) {
jiabin19cdba52020-11-24 11:28:58 -0800875 struct audio_port_v7 port = {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700876 port.id = portId;
877 status_t status = mAudioPolicyManager->getAudioPort(&port);
878 if (status == NO_ERROR && port.type == AUDIO_PORT_TYPE_DEVICE) {
Andy Hung9b181952019-02-25 14:53:36 -0800879 return toString(port.ext.device.type);
Eric Laurent99fcae42018-05-17 16:59:18 -0700880 }
Andy Hung9b181952019-02-25 14:53:36 -0800881 return {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700882}
883
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800884Status AudioPolicyService::startInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800885{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800886 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
887 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
888
Eric Laurentdce54a12014-03-10 12:19:46 -0700889 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800890 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800891 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800892 sp<AudioRecordClient> client;
893 {
Andy Hung79eacdb2023-11-30 19:34:24 -0800894 audio_utils::lock_guard _l(mMutex);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800895
Eric Laurent7dca8a82018-01-29 18:44:26 -0800896 ssize_t index = mAudioRecordClients.indexOfKey(portId);
897 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800898 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800899 }
900 client = mAudioRecordClients.valueAt(index);
Eric Laurentfee19762018-01-29 18:44:13 -0800901 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800902
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700903 std::stringstream msg;
904 msg << "Audio recording on session " << client->session;
905
Eric Laurent7dca8a82018-01-29 18:44:26 -0800906 // check calling permissions
Marvin Raminb03b49f2024-04-04 16:25:31 +0200907 if (!(startRecording(client->attributionSource, client->virtualDeviceId,
908 String16(msg.str().c_str()), client->attributes.source)
Eric Laurent637bd202021-09-22 11:17:11 +0200909 || client->attributes.source == AUDIO_SOURCE_FM_TUNER
910 || client->attributes.source == AUDIO_SOURCE_REMOTE_SUBMIX
911 || client->attributes.source == AUDIO_SOURCE_ECHO_REFERENCE)) {
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000912 ALOGE("%s permission denied: recording not allowed for attribution source %s",
913 __func__, client->attributionSource.toString().c_str());
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800914 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800915 }
Eric Laurentfee19762018-01-29 18:44:13 -0800916
Andy Hung79eacdb2023-11-30 19:34:24 -0800917 audio_utils::lock_guard _l(mMutex);
Eric Laurent4eb58f12018-12-07 16:41:02 -0800918
Atneya Naire7720b32023-05-10 17:26:30 -0700919 ALOGW_IF(client->silenced, "startInput on silenced input for port %d, uid %d. Unsilencing.",
920 portIdAidl,
921 client->attributionSource.uid);
922
923 if (client->active) {
924 ALOGE("Client should never be active before startInput. Uid %d port %d",
925 client->attributionSource.uid, portId);
Marvin Raminb03b49f2024-04-04 16:25:31 +0200926 finishRecording(client->attributionSource, client->virtualDeviceId,
927 client->attributes.source);
Atneya Naire7720b32023-05-10 17:26:30 -0700928 return binderStatusFromStatusT(INVALID_OPERATION);
929 }
930
931 // Force the possibly silenced client to be unsilenced since we just called
932 // startRecording (i.e. we have assumed it is unsilenced).
933 // At this point in time, the client is inactive, so no calls to appops are sent in
934 // setAppState_l.
935 // This ensures existing clients have the same behavior as new clients (starting unsilenced).
936 // TODO(b/282076713)
937 setAppState_l(client, APP_STATE_TOP);
938
Eric Laurent4eb58f12018-12-07 16:41:02 -0800939 client->active = true;
940 client->startTimeNs = systemTime();
Atneya Naire7720b32023-05-10 17:26:30 -0700941 // This call updates the silenced state, and since we are active, appropriately notifies appops
942 // if we silence the track.
Eric Laurent4eb58f12018-12-07 16:41:02 -0800943 updateUidStates_l();
Eric Laurentfee19762018-01-29 18:44:13 -0800944
Eric Laurent10b71232018-04-13 18:14:44 -0700945 status_t status;
946 {
947 AutoCallerClear acc;
Eric Laurent4eb58f12018-12-07 16:41:02 -0800948 status = mAudioPolicyManager->startInput(portId);
Ray Essick84e84a52018-05-03 18:45:07 -0700949
950 }
951
Ray Essickf6a57cd2018-05-22 16:20:54 -0700952 // including successes gets very verbose
Muhammad Qureshi087b37c2020-06-16 16:37:36 -0700953 // but once we cut over to statsd, log them all.
Ray Essickf6a57cd2018-05-22 16:20:54 -0700954 if (status != NO_ERROR) {
Ray Essick84e84a52018-05-03 18:45:07 -0700955
956 static constexpr char kAudioPolicy[] = "audiopolicy";
957
Ray Essick84e84a52018-05-03 18:45:07 -0700958 static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status";
959 static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src";
960 static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg";
961 static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session";
Eric Laurent99fcae42018-05-17 16:59:18 -0700962 static constexpr char kAudioPolicyRqstDevice[] =
963 "android.media.audiopolicy.rqst.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700964 static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src";
965 static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg";
Eric Laurent99fcae42018-05-17 16:59:18 -0700966 static constexpr char kAudioPolicyActiveSession[] =
967 "android.media.audiopolicy.active.session";
968 static constexpr char kAudioPolicyActiveDevice[] =
969 "android.media.audiopolicy.active.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700970
Ray Essickf27e9872019-12-07 06:28:46 -0800971 mediametrics::Item *item = mediametrics::Item::create(kAudioPolicy);
Ray Essick84e84a52018-05-03 18:45:07 -0700972 if (item != NULL) {
973
Ray Essick84e84a52018-05-03 18:45:07 -0700974 item->setInt32(kAudioPolicyStatus, status);
975
Eric Laurent99fcae42018-05-17 16:59:18 -0700976 item->setCString(kAudioPolicyRqstSrc,
Andy Hung9b181952019-02-25 14:53:36 -0800977 toString(client->attributes.source).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -0700978 item->setInt32(kAudioPolicyRqstSession, client->session);
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000979 if (client->attributionSource.packageName.has_value() &&
980 client->attributionSource.packageName.value().size() != 0) {
Ray Essick51866952018-05-30 11:22:27 -0700981 item->setCString(kAudioPolicyRqstPkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000982 client->attributionSource.packageName.value().c_str());
Ray Essick51866952018-05-30 11:22:27 -0700983 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700984 item->setCString(kAudioPolicyRqstPkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000985 std::to_string(client->attributionSource.uid).c_str());
Ray Essick51866952018-05-30 11:22:27 -0700986 }
Eric Laurent99fcae42018-05-17 16:59:18 -0700987 item->setCString(
988 kAudioPolicyRqstDevice, getDeviceTypeStrForPortId(client->deviceId).c_str());
989
Eric Laurent4eb58f12018-12-07 16:41:02 -0800990 int count = mAudioRecordClients.size();
991 for (int i = 0; i < count ; i++) {
992 if (portId == mAudioRecordClients.keyAt(i)) {
993 continue;
994 }
995 sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
996 if (other->active) {
997 // keeps the last of the clients marked active
998 item->setCString(kAudioPolicyActiveSrc,
Andy Hung9b181952019-02-25 14:53:36 -0800999 toString(other->attributes.source).c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -08001000 item->setInt32(kAudioPolicyActiveSession, other->session);
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001001 if (other->attributionSource.packageName.has_value() &&
1002 other->attributionSource.packageName.value().size() != 0) {
Eric Laurent4eb58f12018-12-07 16:41:02 -08001003 item->setCString(kAudioPolicyActivePkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001004 other->attributionSource.packageName.value().c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -08001005 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001006 item->setCString(kAudioPolicyRqstPkg, std::to_string(
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001007 other->attributionSource.uid).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -07001008 }
Eric Laurent4eb58f12018-12-07 16:41:02 -08001009 item->setCString(kAudioPolicyActiveDevice,
1010 getDeviceTypeStrForPortId(other->deviceId).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -07001011 }
1012 }
1013 item->selfrecord();
1014 delete item;
1015 item = NULL;
1016 }
Ray Essick6ce27e52019-02-15 10:58:05 -08001017 }
1018
1019 if (status != NO_ERROR) {
Eric Laurent4eb58f12018-12-07 16:41:02 -08001020 client->active = false;
1021 client->startTimeNs = 0;
1022 updateUidStates_l();
Marvin Raminb03b49f2024-04-04 16:25:31 +02001023 finishRecording(client->attributionSource, client->virtualDeviceId,
1024 client->attributes.source);
Eric Laurentfb66dd92016-01-28 18:32:03 -08001025 }
1026
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001027 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001028}
1029
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001030Status AudioPolicyService::stopInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001031{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001032 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
1033 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1034
Eric Laurentdce54a12014-03-10 12:19:46 -07001035 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001036 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001037 }
Eric Laurent4eb58f12018-12-07 16:41:02 -08001038
Andy Hung79eacdb2023-11-30 19:34:24 -08001039 audio_utils::lock_guard _l(mMutex);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001040
Eric Laurentfee19762018-01-29 18:44:13 -08001041 ssize_t index = mAudioRecordClients.indexOfKey(portId);
1042 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001043 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurentfee19762018-01-29 18:44:13 -08001044 }
1045 sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
1046
Ray Essick84e84a52018-05-03 18:45:07 -07001047 client->active = false;
Eric Laurent4eb58f12018-12-07 16:41:02 -08001048 client->startTimeNs = 0;
1049
1050 updateUidStates_l();
Ray Essick84e84a52018-05-03 18:45:07 -07001051
Svet Ganov6e641372018-03-02 09:21:30 -08001052 // finish the recording app op
Marvin Raminb03b49f2024-04-04 16:25:31 +02001053 finishRecording(client->attributionSource, client->virtualDeviceId, client->attributes.source);
Eric Laurent10b71232018-04-13 18:14:44 -07001054 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001055 return binderStatusFromStatusT(mAudioPolicyManager->stopInput(portId));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001056}
1057
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001058Status AudioPolicyService::releaseInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001059{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001060 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
1061 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1062
Eric Laurentdce54a12014-03-10 12:19:46 -07001063 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001064 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001065 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001066 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -08001067 sp<AudioRecordClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001068 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001069 audio_utils::lock_guard _l(mMutex);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001070 audioPolicyEffects = mAudioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -08001071 ssize_t index = mAudioRecordClients.indexOfKey(portId);
1072 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001073 return Status::ok();
Eric Laurentfee19762018-01-29 18:44:13 -08001074 }
1075 client = mAudioRecordClients.valueAt(index);
Eric Laurent4eb58f12018-12-07 16:41:02 -08001076
1077 if (client->active) {
1078 ALOGW("%s releasing active client portId %d", __FUNCTION__, portId);
1079 client->active = false;
1080 client->startTimeNs = 0;
1081 updateUidStates_l();
1082 }
1083
Eric Laurentfee19762018-01-29 18:44:13 -08001084 mAudioRecordClients.removeItem(portId);
1085 }
1086 if (client == 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001087 return Status::ok();
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001088 }
1089 if (audioPolicyEffects != 0) {
1090 // release audio processors from the input
Eric Laurentd7fe0862018-07-14 16:48:01 -07001091 status_t status = audioPolicyEffects->releaseInputEffects(client->io, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001092 if(status != NO_ERROR) {
Eric Laurentd7fe0862018-07-14 16:48:01 -07001093 ALOGW("Failed to release effects on input %d", client->io);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001094 }
Eric Laurent2d388ec2014-03-07 13:25:54 -08001095 }
Eric Laurentf10c7092016-12-06 17:09:56 -08001096 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001097 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001098 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -07001099 mAudioPolicyManager->releaseInput(portId);
Eric Laurentf10c7092016-12-06 17:09:56 -08001100 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001101 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001102}
1103
Vlad Popa87e0e582024-05-20 18:49:20 -07001104Status AudioPolicyService::setDeviceAbsoluteVolumeEnabled(const AudioDevice& deviceAidl,
1105 bool enabled,
1106 AudioStreamType streamToDriveAbsAidl) {
1107 audio_stream_type_t streamToDriveAbs = VALUE_OR_RETURN_BINDER_STATUS(
1108 aidl2legacy_AudioStreamType_audio_stream_type_t(streamToDriveAbsAidl));
1109 audio_devices_t deviceType;
1110 std::string address;
1111 RETURN_BINDER_STATUS_IF_ERROR(
1112 aidl2legacy_AudioDevice_audio_device(deviceAidl, &deviceType, &address));
1113
1114 if (mAudioPolicyManager == nullptr) {
1115 return binderStatusFromStatusT(NO_INIT);
1116 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001117 if (!(audioserver_permissions() ?
1118 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1119 : settingsAllowed())) {
Vlad Popa87e0e582024-05-20 18:49:20 -07001120 return binderStatusFromStatusT(PERMISSION_DENIED);
1121 }
1122 if (uint32_t(streamToDriveAbs) >= AUDIO_STREAM_PUBLIC_CNT) {
1123 return binderStatusFromStatusT(BAD_VALUE);
1124 }
1125 audio_utils::lock_guard _l(mMutex);
1126 AutoCallerClear acc;
1127 return binderStatusFromStatusT(
1128 mAudioPolicyManager->setDeviceAbsoluteVolumeEnabled(deviceType, address.c_str(),
1129 enabled, streamToDriveAbs));
1130}
1131
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001132Status AudioPolicyService::initStreamVolume(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001133 int32_t indexMinAidl,
1134 int32_t indexMaxAidl) {
1135 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1136 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1137 int indexMin = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMinAidl));
1138 int indexMax = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMaxAidl));
1139
Eric Laurentdce54a12014-03-10 12:19:46 -07001140 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001141 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001142 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001143 if (!(audioserver_permissions() ?
1144 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1145 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001146 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001147 }
Eric Laurent223fd5c2014-11-11 13:43:36 -08001148 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001149 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001150 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001151 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001152 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -07001153 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001154 return binderStatusFromStatusT(NO_ERROR);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001155}
1156
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001157Status AudioPolicyService::setStreamVolumeIndex(AudioStreamType streamAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001158 const AudioDeviceDescription& deviceAidl,
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001159 int32_t indexAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001160 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1161 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1162 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1163 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001164 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001165
Eric Laurentdce54a12014-03-10 12:19:46 -07001166 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001167 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001168 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001169 if (!(audioserver_permissions() ?
1170 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1171 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001172 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001173 }
Eric Laurent223fd5c2014-11-11 13:43:36 -08001174 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001175 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001176 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001177 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001178 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001179 return binderStatusFromStatusT(mAudioPolicyManager->setStreamVolumeIndex(stream,
1180 index,
1181 device));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001182}
1183
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001184Status AudioPolicyService::getStreamVolumeIndex(AudioStreamType streamAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001185 const AudioDeviceDescription& deviceAidl,
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001186 int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001187 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1188 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1189 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001190 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001191 int index;
1192
Eric Laurentdce54a12014-03-10 12:19:46 -07001193 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001194 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001195 }
Eric Laurent223fd5c2014-11-11 13:43:36 -08001196 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001197 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001198 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001199 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001200 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001201 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1202 mAudioPolicyManager->getStreamVolumeIndex(stream, &index, device)));
1203 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1204 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001205}
1206
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001207Status AudioPolicyService::setVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001208 const media::audio::common::AudioAttributes& attrAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001209 const AudioDeviceDescription& deviceAidl, int32_t indexAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001210 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001211 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001212 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1213 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001214 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001215 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1216 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1217
François Gaffiecfe17322018-11-07 13:41:29 +01001218 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001219 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001220 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001221 if (!(audioserver_permissions() ?
1222 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1223 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001224 return binderStatusFromStatusT(PERMISSION_DENIED);
François Gaffiecfe17322018-11-07 13:41:29 +01001225 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001226 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001227 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001228 return binderStatusFromStatusT(
1229 mAudioPolicyManager->setVolumeIndexForAttributes(attributes, index, device));
François Gaffiecfe17322018-11-07 13:41:29 +01001230}
1231
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001232Status AudioPolicyService::getVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001233 const media::audio::common::AudioAttributes& attrAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001234 const AudioDeviceDescription& deviceAidl, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001235 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001236 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001237 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001238 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001239 int index;
1240 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1241 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1242
François Gaffiecfe17322018-11-07 13:41:29 +01001243 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001244 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001245 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001246 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001247 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001248 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1249 mAudioPolicyManager->getVolumeIndexForAttributes(attributes, index, device)));
1250 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1251 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001252}
1253
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001254Status AudioPolicyService::getMinVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001255 const media::audio::common::AudioAttributes& attrAidl, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001256 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001257 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001258 int index;
1259 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1260 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1261
François Gaffiecfe17322018-11-07 13:41:29 +01001262 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001263 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001264 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001265 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001266 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001267 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1268 mAudioPolicyManager->getMinVolumeIndexForAttributes(attributes, index)));
1269 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1270 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001271}
1272
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001273Status AudioPolicyService::getMaxVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001274 const media::audio::common::AudioAttributes& attrAidl, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001275 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001276 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001277 int index;
1278 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1279 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1280
François Gaffiecfe17322018-11-07 13:41:29 +01001281 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001282 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001283 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001284 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001285 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001286 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1287 mAudioPolicyManager->getMaxVolumeIndexForAttributes(attributes, index)));
1288 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1289 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001290}
1291
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001292Status AudioPolicyService::getStrategyForStream(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001293 int32_t* _aidl_return) {
1294 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1295 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1296
Eric Laurent223fd5c2014-11-11 13:43:36 -08001297 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001298 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1299 convertReinterpret<int32_t>(PRODUCT_STRATEGY_NONE));
1300 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001301 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001302 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001303 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001304 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001305
François Gaffiec005e562018-11-06 15:04:49 +01001306 // DO NOT LOCK, may be called from AudioFlinger with lock held, reaching deadlock
Eric Laurent10b71232018-04-13 18:14:44 -07001307 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001308 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1309 legacy2aidl_product_strategy_t_int32_t(
1310 mAudioPolicyManager->getStrategyForStream(stream)));
1311 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001312}
1313
Mikhail Naganov1c400902023-05-17 11:48:43 -07001314Status AudioPolicyService::getDevicesForAttributes(
1315 const media::audio::common::AudioAttributes& attrAidl,
1316 bool forVolume,
1317 std::vector<AudioDevice>* _aidl_return)
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001318{
François Gaffie1e2b56f2022-04-01 14:34:29 +02001319 audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001320 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001321 AudioDeviceTypeAddrVector devices;
1322
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001323 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001324 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001325 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001326 audio_utils::lock_guard _l(mMutex);
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001327 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001328 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
François Gaffie1e2b56f2022-04-01 14:34:29 +02001329 mAudioPolicyManager->getDevicesForAttributes(aa, &devices, forVolume)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001330 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001331 convertContainer<std::vector<AudioDevice>>(devices,
1332 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001333 return Status::ok();
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001334}
1335
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001336Status AudioPolicyService::getOutputForEffect(const media::EffectDescriptor& descAidl,
1337 int32_t* _aidl_return) {
1338 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1339 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1340 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1341 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1342
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 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001346 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001347 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001348 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1349 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutputForEffect(&desc)));
1350 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001351}
1352
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001353Status AudioPolicyService::registerEffect(const media::EffectDescriptor& descAidl, int32_t ioAidl,
1354 int32_t strategyAidl, int32_t sessionAidl,
1355 int32_t idAidl) {
1356 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1357 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1358 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1359 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1360 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
1361 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
1362 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1363 aidl2legacy_int32_t_audio_session_t(sessionAidl));
1364 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
1365 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1366 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1367
Eric Laurentdce54a12014-03-10 12:19:46 -07001368 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001369 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001370 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001371 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001372 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001373 return binderStatusFromStatusT(
1374 mAudioPolicyManager->registerEffect(&desc, io, strategy, session, id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001375}
1376
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001377Status AudioPolicyService::unregisterEffect(int32_t idAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001378{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001379 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001380 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001381 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001382 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001383 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001384 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001385 return binderStatusFromStatusT(mAudioPolicyManager->unregisterEffect(id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001386}
1387
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001388Status AudioPolicyService::setEffectEnabled(int32_t idAidl, bool enabled)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001389{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001390 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001391 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001392 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001393 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001394 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001395 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001396 return binderStatusFromStatusT(mAudioPolicyManager->setEffectEnabled(id, enabled));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001397}
1398
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001399Status AudioPolicyService::moveEffectsToIo(const std::vector<int32_t>& idsAidl, int32_t ioAidl)
1400
Eric Laurent6c796322019-04-09 14:13:17 -07001401{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001402 const std::vector<int>& ids = VALUE_OR_RETURN_BINDER_STATUS(
1403 convertContainer<std::vector<int>>(idsAidl, convertReinterpret<int, int32_t>));
1404 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1405 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1406 if (ids.size() > MAX_ITEMS_PER_LIST) {
1407 return binderStatusFromStatusT(BAD_VALUE);
1408 }
1409
Eric Laurent6c796322019-04-09 14:13:17 -07001410 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001411 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6c796322019-04-09 14:13:17 -07001412 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001413 audio_utils::lock_guard _l(mMutex);
Eric Laurent6c796322019-04-09 14:13:17 -07001414 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001415 return binderStatusFromStatusT(mAudioPolicyManager->moveEffectsToIo(ids, io));
Eric Laurent6c796322019-04-09 14:13:17 -07001416}
1417
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001418Status AudioPolicyService::isStreamActive(AudioStreamType streamAidl, int32_t inPastMsAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001419 bool* _aidl_return) {
1420 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1421 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1422 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1423
Eric Laurent223fd5c2014-11-11 13:43:36 -08001424 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001425 *_aidl_return = false;
1426 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001427 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001428 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001429 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001430 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001431 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001432 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001433 *_aidl_return = mAudioPolicyManager->isStreamActive(stream, inPastMs);
1434 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001435}
1436
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001437Status AudioPolicyService::isStreamActiveRemotely(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001438 int32_t inPastMsAidl,
1439 bool* _aidl_return) {
1440 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1441 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1442 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1443
Eric Laurent223fd5c2014-11-11 13:43:36 -08001444 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001445 *_aidl_return = false;
1446 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001447 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001448 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001449 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001450 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001451 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001452 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001453 *_aidl_return = mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
1454 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001455}
1456
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001457Status AudioPolicyService::isSourceActive(AudioSource sourceAidl, bool* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001458 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001459 aidl2legacy_AudioSource_audio_source_t(sourceAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001460 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001461 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001462 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001463 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001464 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001465 *_aidl_return = mAudioPolicyManager->isSourceActive(source);
1466 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001467}
1468
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001469status_t AudioPolicyService::getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001470{
Eric Laurentdce54a12014-03-10 12:19:46 -07001471 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -08001472 return NO_INIT;
1473 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001474 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001475 audio_utils::lock_guard _l(mMutex);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001476 audioPolicyEffects = mAudioPolicyEffects;
1477 }
1478 if (audioPolicyEffects == 0) {
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001479 return NO_INIT;
1480 }
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001481
1482 return OK;
1483}
1484
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001485Status AudioPolicyService::queryDefaultPreProcessing(
1486 int32_t audioSessionAidl,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001487 Int* countAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001488 std::vector<media::EffectDescriptor>* _aidl_return) {
1489 audio_session_t audioSession = VALUE_OR_RETURN_BINDER_STATUS(
1490 aidl2legacy_int32_t_audio_session_t(audioSessionAidl));
1491 uint32_t count = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(countAidl->value));
1492 if (count > AudioEffect::kMaxPreProcessing) {
1493 count = AudioEffect::kMaxPreProcessing;
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001494 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001495 uint32_t countReq = count;
1496 std::unique_ptr<effect_descriptor_t[]> descriptors(new effect_descriptor_t[count]);
1497
1498 sp<AudioPolicyEffects> audioPolicyEffects;
1499 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
1500 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->queryDefaultInputEffects(
1501 (audio_session_t) audioSession, descriptors.get(), &count)));
1502 countReq = std::min(count, countReq);
1503 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1504 convertRange(descriptors.get(), descriptors.get() + countReq,
1505 std::back_inserter(*_aidl_return),
1506 legacy2aidl_effect_descriptor_t_EffectDescriptor)));
1507 countAidl->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(count));
1508 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001509}
1510
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001511Status AudioPolicyService::addSourceDefaultEffect(const AudioUuid& typeAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001512 const std::string& opPackageNameAidl,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001513 const AudioUuid& uuidAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001514 int32_t priority,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001515 AudioSource sourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001516 int32_t* _aidl_return) {
1517 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1518 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1519 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1520 aidl2legacy_string_view_String16(opPackageNameAidl));
1521 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1522 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1523 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001524 aidl2legacy_AudioSource_audio_source_t(sourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001525 audio_unique_id_t id;
1526
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001527 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001528 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001529 if (!(audioserver_permissions() ?
1530 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1531 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001532 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001533 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001534 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addSourceDefaultEffect(
1535 &type, opPackageName, &uuid, priority, source, &id)));
1536 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1537 return Status::ok();
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001538}
1539
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001540Status AudioPolicyService::addStreamDefaultEffect(const AudioUuid& typeAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001541 const std::string& opPackageNameAidl,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001542 const AudioUuid& uuidAidl,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001543 int32_t priority, AudioUsage usageAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001544 int32_t* _aidl_return) {
1545 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1546 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1547 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1548 aidl2legacy_string_view_String16(opPackageNameAidl));
1549 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1550 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1551 audio_usage_t usage = VALUE_OR_RETURN_BINDER_STATUS(
1552 aidl2legacy_AudioUsage_audio_usage_t(usageAidl));
1553 audio_unique_id_t id;
1554
1555 sp<AudioPolicyEffects> audioPolicyEffects;
1556 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001557 if (!(audioserver_permissions() ?
1558 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1559 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001560 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001561 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001562 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addStreamDefaultEffect(
1563 &type, opPackageName, &uuid, priority, usage, &id)));
1564 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1565 return Status::ok();
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001566}
1567
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001568Status AudioPolicyService::removeSourceDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001569{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001570 audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1571 aidl2legacy_int32_t_audio_unique_id_t(idAidl));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001572 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001573 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001574 if (!(audioserver_permissions() ?
1575 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1576 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001577 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001578 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001579 return binderStatusFromStatusT(audioPolicyEffects->removeSourceDefaultEffect(id));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001580}
1581
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001582Status AudioPolicyService::removeStreamDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001583{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001584 audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1585 aidl2legacy_int32_t_audio_unique_id_t(idAidl));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001586 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001587 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001588 if (!(audioserver_permissions() ?
1589 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1590 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001591 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001592 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001593 return binderStatusFromStatusT(audioPolicyEffects->removeStreamDefaultEffect(id));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001594}
1595
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001596Status AudioPolicyService::setSupportedSystemUsages(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001597 const std::vector<AudioUsage>& systemUsagesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001598 size_t size = systemUsagesAidl.size();
1599 if (size > MAX_ITEMS_PER_LIST) {
1600 size = MAX_ITEMS_PER_LIST;
1601 }
1602 std::vector<audio_usage_t> systemUsages;
1603 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1604 convertRange(systemUsagesAidl.begin(), systemUsagesAidl.begin() + size,
1605 std::back_inserter(systemUsages), aidl2legacy_AudioUsage_audio_usage_t)));
1606
Andy Hung79eacdb2023-11-30 19:34:24 -08001607 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001608 if (!(audioserver_permissions() ?
1609 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1610 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001611 return binderStatusFromStatusT(PERMISSION_DENIED);
Hayden Gomes524159d2019-12-23 14:41:47 -08001612 }
1613
1614 bool areAllSystemUsages = std::all_of(begin(systemUsages), end(systemUsages),
1615 [](audio_usage_t usage) { return isSystemUsage(usage); });
1616 if (!areAllSystemUsages) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001617 return binderStatusFromStatusT(BAD_VALUE);
Hayden Gomes524159d2019-12-23 14:41:47 -08001618 }
1619
1620 mSupportedSystemUsages = systemUsages;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001621 return Status::ok();
Hayden Gomes524159d2019-12-23 14:41:47 -08001622}
1623
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001624Status AudioPolicyService::setAllowedCapturePolicy(int32_t uidAidl, int32_t capturePolicyAidl) {
1625 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1626 audio_flags_mask_t capturePolicy = VALUE_OR_RETURN_BINDER_STATUS(
1627 aidl2legacy_int32_t_audio_flags_mask_t_mask(capturePolicyAidl));
1628
Andy Hung79eacdb2023-11-30 19:34:24 -08001629 audio_utils::lock_guard _l(mMutex);
Kevin Rocardb99cc752019-03-21 20:52:24 -07001630 if (mAudioPolicyManager == NULL) {
1631 ALOGV("%s() mAudioPolicyManager == NULL", __func__);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001632 return binderStatusFromStatusT(NO_INIT);
Kevin Rocardb99cc752019-03-21 20:52:24 -07001633 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001634 return binderStatusFromStatusT(
1635 mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy));
Kevin Rocardb99cc752019-03-21 20:52:24 -07001636}
1637
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001638Status AudioPolicyService::getOffloadSupport(const AudioOffloadInfo& infoAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001639 media::AudioOffloadMode* _aidl_return) {
1640 audio_offload_info_t info = VALUE_OR_RETURN_BINDER_STATUS(
1641 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(infoAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001642 if (mAudioPolicyManager == NULL) {
1643 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001644 return binderStatusFromStatusT(AUDIO_OFFLOAD_NOT_SUPPORTED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001645 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001646 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001647 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001648 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_offload_mode_t_AudioOffloadMode(
1649 mAudioPolicyManager->getOffloadSupport(info)));
1650 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001651}
1652
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001653Status AudioPolicyService::isDirectOutputSupported(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001654 const AudioConfigBase& configAidl,
Mikhail Naganov1c400902023-05-17 11:48:43 -07001655 const media::audio::common::AudioAttributes& attributesAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001656 bool* _aidl_return) {
1657 audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001658 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl, false /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001659 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001660 aidl2legacy_AudioAttributes_audio_attributes_t(attributesAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001661 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1662 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1663
Michael Chana94fbb22018-04-24 14:31:19 +10001664 if (mAudioPolicyManager == NULL) {
1665 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001666 return binderStatusFromStatusT(NO_INIT);
Michael Chana94fbb22018-04-24 14:31:19 +10001667 }
Hayden Gomes524159d2019-12-23 14:41:47 -08001668
Atneya Nair09859fe2024-07-15 16:38:02 -07001669 RETURN_IF_BINDER_ERROR(validateUsage(attributes));
Hayden Gomes524159d2019-12-23 14:41:47 -08001670
Andy Hung79eacdb2023-11-30 19:34:24 -08001671 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001672 *_aidl_return = mAudioPolicyManager->isDirectOutputSupported(config, attributes);
1673 return Status::ok();
Michael Chana94fbb22018-04-24 14:31:19 +10001674}
1675
1676
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001677Status AudioPolicyService::listAudioPorts(media::AudioPortRole roleAidl,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001678 media::AudioPortType typeAidl, Int* count,
Atneya Nair638a6e42022-12-18 16:45:15 -08001679 std::vector<media::AudioPortFw>* portsAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001680 int32_t* _aidl_return) {
1681 audio_port_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
1682 aidl2legacy_AudioPortRole_audio_port_role_t(roleAidl));
1683 audio_port_type_t type = VALUE_OR_RETURN_BINDER_STATUS(
1684 aidl2legacy_AudioPortType_audio_port_type_t(typeAidl));
1685 unsigned int num_ports = VALUE_OR_RETURN_BINDER_STATUS(
1686 convertIntegral<unsigned int>(count->value));
1687 if (num_ports > MAX_ITEMS_PER_LIST) {
1688 num_ports = MAX_ITEMS_PER_LIST;
1689 }
1690 unsigned int numPortsReq = num_ports;
1691 std::unique_ptr<audio_port_v7[]> ports(new audio_port_v7[num_ports]);
1692 unsigned int generation;
1693
Eric Laurent07258622024-06-10 16:56:41 +00001694 audio_utils::lock_guard _l(mMutex);
1695 if (mAudioPolicyManager == NULL) {
1696 return binderStatusFromStatusT(NO_INIT);
1697 }
Eric Laurent10b71232018-04-13 18:14:44 -07001698 AutoCallerClear acc;
Eric Laurent07258622024-06-10 16:56:41 +00001699 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1700 mAudioPolicyManager->listAudioPorts(role, type, &num_ports, ports.get(), &generation)));
1701 numPortsReq = std::min(numPortsReq, num_ports);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001702 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1703 convertRange(ports.get(), ports.get() + numPortsReq, std::back_inserter(*portsAidl),
Mikhail Naganov87227252023-01-13 17:38:10 -08001704 legacy2aidl_audio_port_v7_AudioPortFw)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001705 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_ports));
1706 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1707 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001708}
1709
Mikhail Naganov5edc5ed2023-03-23 14:52:15 -07001710Status AudioPolicyService::listDeclaredDevicePorts(media::AudioPortRole role,
1711 std::vector<media::AudioPortFw>* _aidl_return) {
Andy Hung79eacdb2023-11-30 19:34:24 -08001712 audio_utils::lock_guard _l(mMutex);
Mikhail Naganov5edc5ed2023-03-23 14:52:15 -07001713 if (mAudioPolicyManager == NULL) {
1714 return binderStatusFromStatusT(NO_INIT);
1715 }
1716 AutoCallerClear acc;
1717 return binderStatusFromStatusT(mAudioPolicyManager->listDeclaredDevicePorts(
1718 role, _aidl_return));
1719}
1720
Mikhail Naganov17031562022-02-23 23:00:27 +00001721Status AudioPolicyService::getAudioPort(int portId,
Atneya Nair638a6e42022-12-18 16:45:15 -08001722 media::AudioPortFw* _aidl_return) {
Mikhail Naganov17031562022-02-23 23:00:27 +00001723 audio_port_v7 port{ .id = portId };
Eric Laurent07258622024-06-10 16:56:41 +00001724 audio_utils::lock_guard _l(mMutex);
1725 if (mAudioPolicyManager == NULL) {
1726 return binderStatusFromStatusT(NO_INIT);
1727 }
Eric Laurent10b71232018-04-13 18:14:44 -07001728 AutoCallerClear acc;
Eric Laurent07258622024-06-10 16:56:41 +00001729 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(mAudioPolicyManager->getAudioPort(&port)));
Mikhail Naganov87227252023-01-13 17:38:10 -08001730 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_v7_AudioPortFw(port));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001731 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001732}
1733
Atneya Nair3afdbd12022-12-18 16:14:18 -08001734Status AudioPolicyService::createAudioPatch(const media::AudioPatchFw& patchAidl,
1735 int32_t handleAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001736 int32_t* _aidl_return) {
1737 audio_patch patch = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov87227252023-01-13 17:38:10 -08001738 aidl2legacy_AudioPatchFw_audio_patch(patchAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001739 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1740 aidl2legacy_int32_t_audio_port_handle_t(handleAidl));
1741 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPatch(patch)));
1742
Andy Hung79eacdb2023-11-30 19:34:24 -08001743 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001744 if (!(audioserver_permissions() ?
1745 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1746 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001747 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001748 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001749 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001750 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001751 }
Eric Laurent10b71232018-04-13 18:14:44 -07001752 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001753 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1754 mAudioPolicyManager->createAudioPatch(&patch, &handle,
1755 IPCThreadState::self()->getCallingUid())));
1756 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_patch_handle_t_int32_t(handle));
1757 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001758}
1759
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001760Status AudioPolicyService::releaseAudioPatch(int32_t handleAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001761{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001762 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1763 aidl2legacy_int32_t_audio_patch_handle_t(handleAidl));
Andy Hung79eacdb2023-11-30 19:34:24 -08001764 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001765 if (!(audioserver_permissions() ?
1766 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1767 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001768 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001769 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001770 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001771 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001772 }
Eric Laurent10b71232018-04-13 18:14:44 -07001773 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001774 return binderStatusFromStatusT(
1775 mAudioPolicyManager->releaseAudioPatch(handle,
1776 IPCThreadState::self()->getCallingUid()));
Eric Laurent203b1a12014-04-01 10:34:16 -07001777}
1778
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001779Status AudioPolicyService::listAudioPatches(Int* count,
Atneya Nair3afdbd12022-12-18 16:14:18 -08001780 std::vector<media::AudioPatchFw>* patchesAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001781 int32_t* _aidl_return) {
1782 unsigned int num_patches = VALUE_OR_RETURN_BINDER_STATUS(
1783 convertIntegral<unsigned int>(count->value));
1784 if (num_patches > MAX_ITEMS_PER_LIST) {
1785 num_patches = MAX_ITEMS_PER_LIST;
1786 }
1787 unsigned int numPatchesReq = num_patches;
1788 std::unique_ptr<audio_patch[]> patches(new audio_patch[num_patches]);
1789 unsigned int generation;
1790
Eric Laurent07258622024-06-10 16:56:41 +00001791 audio_utils::lock_guard _l(mMutex);
1792 if (mAudioPolicyManager == NULL) {
1793 return binderStatusFromStatusT(NO_INIT);
1794 }
Eric Laurent10b71232018-04-13 18:14:44 -07001795 AutoCallerClear acc;
Eric Laurent07258622024-06-10 16:56:41 +00001796 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1797 mAudioPolicyManager->listAudioPatches(&num_patches, patches.get(), &generation)));
1798 numPatchesReq = std::min(numPatchesReq, num_patches);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001799 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1800 convertRange(patches.get(), patches.get() + numPatchesReq,
Mikhail Naganov87227252023-01-13 17:38:10 -08001801 std::back_inserter(*patchesAidl), legacy2aidl_audio_patch_AudioPatchFw)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001802 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_patches));
1803 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1804 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001805}
1806
Atneya Nair7a9594f2022-12-18 17:26:26 -08001807Status AudioPolicyService::setAudioPortConfig(const media::AudioPortConfigFw& configAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001808{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001809 audio_port_config config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov87227252023-01-13 17:38:10 -08001810 aidl2legacy_AudioPortConfigFw_audio_port_config(configAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001811 RETURN_IF_BINDER_ERROR(
1812 binderStatusFromStatusT(AudioValidator::validateAudioPortConfig(config)));
1813
Andy Hung79eacdb2023-11-30 19:34:24 -08001814 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001815 if (!(audioserver_permissions() ?
1816 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1817 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001818 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001819 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001820 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001821 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001822 }
Eric Laurent10b71232018-04-13 18:14:44 -07001823 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001824 return binderStatusFromStatusT(mAudioPolicyManager->setAudioPortConfig(&config));
Eric Laurent203b1a12014-04-01 10:34:16 -07001825}
Eric Laurent2d388ec2014-03-07 13:25:54 -08001826
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001827Status AudioPolicyService::acquireSoundTriggerSession(media::SoundTriggerSession* _aidl_return)
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001828{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001829 audio_session_t session;
1830 audio_io_handle_t ioHandle;
1831 audio_devices_t device;
1832
1833 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001834 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001835 if (mAudioPolicyManager == NULL) {
1836 return binderStatusFromStatusT(NO_INIT);
1837 }
1838 AutoCallerClear acc;
1839 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1840 mAudioPolicyManager->acquireSoundTriggerSession(&session, &ioHandle, &device)));
1841 }
1842
1843 _aidl_return->session = VALUE_OR_RETURN_BINDER_STATUS(
1844 legacy2aidl_audio_session_t_int32_t(session));
1845 _aidl_return->ioHandle = VALUE_OR_RETURN_BINDER_STATUS(
1846 legacy2aidl_audio_io_handle_t_int32_t(ioHandle));
1847 _aidl_return->device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001848 legacy2aidl_audio_devices_t_AudioDeviceDescription(device));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001849 return Status::ok();
1850}
1851
1852Status AudioPolicyService::releaseSoundTriggerSession(int32_t sessionAidl)
1853{
1854 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1855 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Andy Hung79eacdb2023-11-30 19:34:24 -08001856 audio_utils::lock_guard _l(mMutex);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001857 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001858 return binderStatusFromStatusT(NO_INIT);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001859 }
Eric Laurent10b71232018-04-13 18:14:44 -07001860 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001861 return binderStatusFromStatusT(mAudioPolicyManager->releaseSoundTriggerSession(session));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001862}
1863
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001864Status AudioPolicyService::registerPolicyMixes(const std::vector<media::AudioMix>& mixesAidl,
1865 bool registration) {
1866 size_t size = mixesAidl.size();
1867 if (size > MAX_MIXES_PER_POLICY) {
1868 size = MAX_MIXES_PER_POLICY;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001869 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001870 Vector<AudioMix> mixes;
1871 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1872 convertRange(mixesAidl.begin(), mixesAidl.begin() + size, std::back_inserter(mixes),
1873 aidl2legacy_AudioMix)));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001874
Andy Hung79eacdb2023-11-30 19:34:24 -08001875 audio_utils::lock_guard _l(mMutex);
Kevin Rocardbe201852019-02-20 22:33:28 -08001876
1877 // loopback|render only need a MediaProjection (checked in caller AudioService.java)
1878 bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1879 return !is_mix_loopback_render(mix.mRouteFlags); });
Atneya Nair09859fe2024-07-15 16:38:02 -07001880 if (needModifyAudioRouting && !(audioserver_permissions() ?
1881 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1882 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001883 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurentbaac1832014-12-01 17:52:59 -08001884 }
Kevin Rocardbe201852019-02-20 22:33:28 -08001885
Nadav Bar287d3302020-02-05 14:55:38 +02001886 // If one of the mixes has needCaptureVoiceCommunicationOutput set to true, then we
1887 // need to verify that the caller still has CAPTURE_VOICE_COMMUNICATION_OUTPUT
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001888 bool needCaptureVoiceCommunicationOutput =
1889 std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Nadav Bar287d3302020-02-05 14:55:38 +02001890 return mix.mVoiceCommunicationCaptureAllowed; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001891
Kevin Rocard36b17552019-03-07 18:48:07 -08001892 bool needCaptureMediaOutput = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Eric Laurent5f9a6452020-12-22 20:10:10 +01001893 return mix.mAllowPrivilegedMediaPlaybackCapture; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001894
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001895 const AttributionSourceState attributionSource = getCallingAttributionSource();
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001896
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001897
Atneya Nair09859fe2024-07-15 16:38:02 -07001898 if (needCaptureMediaOutput && !(audioserver_permissions() ?
1899 CHECK_PERM(CAPTURE_MEDIA_OUTPUT, attributionSource.uid)
1900 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001901 return binderStatusFromStatusT(PERMISSION_DENIED);
Kevin Rocard36b17552019-03-07 18:48:07 -08001902 }
1903
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001904 if (needCaptureVoiceCommunicationOutput &&
Atneya Nair09859fe2024-07-15 16:38:02 -07001905 !(audioserver_permissions() ?
1906 CHECK_PERM(CAPTURE_VOICE_COMMUNICATION_OUTPUT, attributionSource.uid)
1907 : captureVoiceCommunicationOutputAllowed(attributionSource))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001908 return binderStatusFromStatusT(PERMISSION_DENIED);
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001909 }
1910
Eric Laurentbaac1832014-12-01 17:52:59 -08001911 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001912 return binderStatusFromStatusT(NO_INIT);
Eric Laurentbaac1832014-12-01 17:52:59 -08001913 }
Eric Laurent10b71232018-04-13 18:14:44 -07001914 AutoCallerClear acc;
Eric Laurentbaac1832014-12-01 17:52:59 -08001915 if (registration) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001916 return binderStatusFromStatusT(mAudioPolicyManager->registerPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08001917 } else {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001918 return binderStatusFromStatusT(mAudioPolicyManager->unregisterPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08001919 }
1920}
1921
Marvin Raminbdefaf02023-11-01 09:10:32 +01001922Status
1923AudioPolicyService::getRegisteredPolicyMixes(std::vector<::android::media::AudioMix>* mixesAidl) {
1924 if (mAudioPolicyManager == nullptr) {
1925 return binderStatusFromStatusT(NO_INIT);
1926 }
1927
1928 std::vector<AudioMix> mixes;
1929 int status = mAudioPolicyManager->getRegisteredPolicyMixes(mixes);
1930
1931 for (const auto& mix : mixes) {
1932 media::AudioMix aidlMix = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_AudioMix(mix));
1933 mixesAidl->push_back(aidlMix);
1934 }
1935
1936 return binderStatusFromStatusT(status);
1937}
1938
Jan Sebechlebsky0af8e872023-08-11 14:45:08 +02001939Status AudioPolicyService::updatePolicyMixes(
1940 const ::std::vector<::android::media::AudioMixUpdate>& updates) {
Andy Hung79eacdb2023-11-30 19:34:24 -08001941 audio_utils::lock_guard _l(mMutex);
Jan Sebechlebsky0af8e872023-08-11 14:45:08 +02001942 for (const auto& update : updates) {
1943 AudioMix mix = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_AudioMix(update.audioMix));
1944 std::vector<AudioMixMatchCriterion> newCriteria =
1945 VALUE_OR_RETURN_BINDER_STATUS(convertContainer<std::vector<AudioMixMatchCriterion>>(
1946 update.newCriteria, aidl2legacy_AudioMixMatchCriterion));
1947 int status;
1948 if((status = mAudioPolicyManager->updatePolicyMix(mix, newCriteria)) != NO_ERROR) {
1949 return binderStatusFromStatusT(status);
1950 }
1951 }
1952 return binderStatusFromStatusT(NO_ERROR);
1953}
1954
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001955Status AudioPolicyService::setUidDeviceAffinities(
1956 int32_t uidAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001957 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001958 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1959 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
1960 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
1961 aidl2legacy_AudioDeviceTypeAddress));
1962
Andy Hung79eacdb2023-11-30 19:34:24 -08001963 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001964 if (!(audioserver_permissions() ?
1965 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1966 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001967 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001968 }
1969 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001970 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001971 }
1972 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001973 return binderStatusFromStatusT(mAudioPolicyManager->setUidDeviceAffinities(uid, devices));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001974}
1975
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001976Status AudioPolicyService::removeUidDeviceAffinities(int32_t uidAidl) {
1977 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1978
Andy Hung79eacdb2023-11-30 19:34:24 -08001979 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001980 if (!(audioserver_permissions() ?
1981 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1982 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001983 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001984 }
1985 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001986 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001987 }
1988 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001989 return binderStatusFromStatusT(mAudioPolicyManager->removeUidDeviceAffinities(uid));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08001990}
1991
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001992Status AudioPolicyService::setUserIdDeviceAffinities(
1993 int32_t userIdAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001994 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001995 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
1996 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
1997 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
1998 aidl2legacy_AudioDeviceTypeAddress));
1999
Andy Hung79eacdb2023-11-30 19:34:24 -08002000 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002001 if (!(audioserver_permissions() ?
2002 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2003 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002004 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08002005 }
2006 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002007 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08002008 }
2009 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002010 return binderStatusFromStatusT(mAudioPolicyManager->setUserIdDeviceAffinities(userId, devices));
Oscar Azucena90e77632019-11-27 17:12:28 -08002011}
2012
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002013Status AudioPolicyService::removeUserIdDeviceAffinities(int32_t userIdAidl) {
2014 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
2015
Andy Hung79eacdb2023-11-30 19:34:24 -08002016 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002017 if (!(audioserver_permissions() ?
2018 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2019 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002020 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08002021 }
2022 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002023 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08002024 }
2025 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002026 return binderStatusFromStatusT(mAudioPolicyManager->removeUserIdDeviceAffinities(userId));
Oscar Azucena90e77632019-11-27 17:12:28 -08002027}
2028
Atneya Nair7a9594f2022-12-18 17:26:26 -08002029Status AudioPolicyService::startAudioSource(const media::AudioPortConfigFw& sourceAidl,
Mikhail Naganov1c400902023-05-17 11:48:43 -07002030 const media::audio::common::AudioAttributes& attributesAidl,
2031 int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002032 audio_port_config source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov87227252023-01-13 17:38:10 -08002033 aidl2legacy_AudioPortConfigFw_audio_port_config(sourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002034 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002035 aidl2legacy_AudioAttributes_audio_attributes_t(attributesAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002036 audio_port_handle_t portId;
2037 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2038 AudioValidator::validateAudioPortConfig(source)));
2039 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2040 AudioValidator::validateAudioAttributes(attributes, "68953950")));
2041
Andy Hung79eacdb2023-11-30 19:34:24 -08002042 audio_utils::lock_guard _l(mMutex);
Eric Laurent554a2772015-04-10 11:29:24 -07002043 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002044 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07002045 }
Hayden Gomes524159d2019-12-23 14:41:47 -08002046
Atneya Nair09859fe2024-07-15 16:38:02 -07002047 RETURN_IF_BINDER_ERROR(validateUsage(attributes));
Hayden Gomes524159d2019-12-23 14:41:47 -08002048
Hongwei Wang5cd1f1d2019-03-26 15:21:11 -07002049 // startAudioSource should be created as the calling uid
2050 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Eric Laurent10b71232018-04-13 18:14:44 -07002051 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002052 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2053 mAudioPolicyManager->startAudioSource(&source, &attributes, &portId, callingUid)));
2054 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
2055 return Status::ok();
Eric Laurent554a2772015-04-10 11:29:24 -07002056}
2057
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002058Status AudioPolicyService::stopAudioSource(int32_t portIdAidl)
Eric Laurent554a2772015-04-10 11:29:24 -07002059{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002060 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2061 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2062
Andy Hung79eacdb2023-11-30 19:34:24 -08002063 audio_utils::lock_guard _l(mMutex);
Eric Laurent554a2772015-04-10 11:29:24 -07002064 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002065 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07002066 }
Eric Laurent10b71232018-04-13 18:14:44 -07002067 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002068 return binderStatusFromStatusT(mAudioPolicyManager->stopAudioSource(portId));
Eric Laurent554a2772015-04-10 11:29:24 -07002069}
2070
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002071Status AudioPolicyService::setMasterMono(bool mono)
Andy Hung2ddee192015-12-18 17:34:44 -08002072{
2073 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002074 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08002075 }
Atneya Nair09859fe2024-07-15 16:38:02 -07002076 if (!(audioserver_permissions() ?
2077 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
2078 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002079 return binderStatusFromStatusT(PERMISSION_DENIED);
Andy Hung2ddee192015-12-18 17:34:44 -08002080 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002081 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07002082 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002083 return binderStatusFromStatusT(mAudioPolicyManager->setMasterMono(mono));
Andy Hung2ddee192015-12-18 17:34:44 -08002084}
2085
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002086Status AudioPolicyService::getMasterMono(bool* _aidl_return)
Andy Hung2ddee192015-12-18 17:34:44 -08002087{
2088 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002089 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08002090 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002091 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07002092 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002093 return binderStatusFromStatusT(mAudioPolicyManager->getMasterMono(_aidl_return));
Andy Hung2ddee192015-12-18 17:34:44 -08002094}
2095
Eric Laurentac9cef52017-06-09 15:46:26 -07002096
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07002097Status AudioPolicyService::getStreamVolumeDB(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002098 AudioStreamType streamAidl, int32_t indexAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002099 const AudioDeviceDescription& deviceAidl, float* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002100 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
2101 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
2102 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
2103 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07002104 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002105
Eric Laurentac9cef52017-06-09 15:46:26 -07002106 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002107 return binderStatusFromStatusT(NO_INIT);
Eric Laurentac9cef52017-06-09 15:46:26 -07002108 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002109 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07002110 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002111 *_aidl_return = mAudioPolicyManager->getStreamVolumeDB(stream, index, device);
2112 return Status::ok();
Eric Laurentac9cef52017-06-09 15:46:26 -07002113}
2114
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002115Status AudioPolicyService::getSurroundFormats(Int* count,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002116 std::vector<AudioFormatDescription>* formats,
Kriti Dang877b27e2021-02-02 12:10:40 +01002117 std::vector<bool>* formatsEnabled) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002118 unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
2119 convertIntegral<unsigned int>(count->value));
2120 if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
2121 numSurroundFormats = MAX_ITEMS_PER_LIST;
2122 }
2123 unsigned int numSurroundFormatsReq = numSurroundFormats;
2124 std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
Kriti Dang877b27e2021-02-02 12:10:40 +01002125 std::unique_ptr<bool[]>surroundFormatsEnabled(new bool[numSurroundFormats]);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002126
jiabin81772902018-04-02 17:52:27 -07002127 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002128 return binderStatusFromStatusT(NO_INIT);
jiabin81772902018-04-02 17:52:27 -07002129 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002130 audio_utils::lock_guard _l(mMutex);
jiabin81772902018-04-02 17:52:27 -07002131 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002132 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2133 mAudioPolicyManager->getSurroundFormats(&numSurroundFormats, surroundFormats.get(),
Kriti Dang6537def2021-03-02 13:46:59 +01002134 surroundFormatsEnabled.get())));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002135 numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
2136 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2137 convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002138 std::back_inserter(*formats),
2139 legacy2aidl_audio_format_t_AudioFormatDescription)));
Kriti Dang877b27e2021-02-02 12:10:40 +01002140 formatsEnabled->insert(
2141 formatsEnabled->begin(),
2142 surroundFormatsEnabled.get(),
2143 surroundFormatsEnabled.get() + numSurroundFormatsReq);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002144 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
2145 return Status::ok();
jiabin81772902018-04-02 17:52:27 -07002146}
2147
Kriti Dang6537def2021-03-02 13:46:59 +01002148Status AudioPolicyService::getReportedSurroundFormats(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002149 Int* count, std::vector<AudioFormatDescription>* formats) {
Kriti Dang6537def2021-03-02 13:46:59 +01002150 unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
2151 convertIntegral<unsigned int>(count->value));
2152 if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
2153 numSurroundFormats = MAX_ITEMS_PER_LIST;
2154 }
2155 unsigned int numSurroundFormatsReq = numSurroundFormats;
2156 std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
2157
2158 if (mAudioPolicyManager == NULL) {
2159 return binderStatusFromStatusT(NO_INIT);
2160 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002161 audio_utils::lock_guard _l(mMutex);
Kriti Dang6537def2021-03-02 13:46:59 +01002162 AutoCallerClear acc;
2163 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2164 mAudioPolicyManager->getReportedSurroundFormats(
2165 &numSurroundFormats, surroundFormats.get())));
2166 numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
2167 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2168 convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002169 std::back_inserter(*formats),
2170 legacy2aidl_audio_format_t_AudioFormatDescription)));
Kriti Dang6537def2021-03-02 13:46:59 +01002171 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
2172 return Status::ok();
2173}
2174
Pattydd807582021-11-04 21:01:03 +08002175Status AudioPolicyService::getHwOffloadFormatsSupportedForBluetoothMedia(
2176 const AudioDeviceDescription& deviceAidl,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002177 std::vector<AudioFormatDescription>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002178 std::vector<audio_format_t> formats;
2179
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002180 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002181 return binderStatusFromStatusT(NO_INIT);
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002182 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002183 audio_utils::lock_guard _l(mMutex);
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002184 AutoCallerClear acc;
Pattydd807582021-11-04 21:01:03 +08002185 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
2186 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002187 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
Pattydd807582021-11-04 21:01:03 +08002188 mAudioPolicyManager->getHwOffloadFormatsSupportedForBluetoothMedia(device, &formats)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002189 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002190 convertContainer<std::vector<AudioFormatDescription>>(
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002191 formats,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002192 legacy2aidl_audio_format_t_AudioFormatDescription));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002193 return Status::ok();
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002194}
2195
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002196Status AudioPolicyService::setSurroundFormatEnabled(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002197 const AudioFormatDescription& audioFormatAidl, bool enabled) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002198 audio_format_t audioFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002199 aidl2legacy_AudioFormatDescription_audio_format_t(audioFormatAidl));
jiabin81772902018-04-02 17:52:27 -07002200 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002201 return binderStatusFromStatusT(NO_INIT);
jiabin81772902018-04-02 17:52:27 -07002202 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002203 audio_utils::lock_guard _l(mMutex);
jiabin81772902018-04-02 17:52:27 -07002204 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002205 return binderStatusFromStatusT(
2206 mAudioPolicyManager->setSurroundFormatEnabled(audioFormat, enabled));
jiabin81772902018-04-02 17:52:27 -07002207}
Eric Laurentac9cef52017-06-09 15:46:26 -07002208
Oscar Azucena829d90d2022-01-28 17:17:56 -08002209Status convertInt32VectorToUidVectorWithLimit(
2210 const std::vector<int32_t>& uidsAidl, std::vector<uid_t>& uids) {
2211 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2212 convertRangeWithLimit(uidsAidl.begin(),
2213 uidsAidl.end(),
2214 std::back_inserter(uids),
2215 aidl2legacy_int32_t_uid_t,
2216 MAX_ITEMS_PER_LIST)));
2217
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002218 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07002219}
2220
Oscar Azucena829d90d2022-01-28 17:17:56 -08002221Status AudioPolicyService::setAssistantServicesUids(const std::vector<int32_t>& uidsAidl)
Ahaan Ugalef51ce002021-08-04 16:34:20 -07002222{
Oscar Azucena829d90d2022-01-28 17:17:56 -08002223 std::vector<uid_t> uids;
2224 RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(uidsAidl, uids));
2225
Andy Hung79eacdb2023-11-30 19:34:24 -08002226 audio_utils::lock_guard _l(mMutex);
Oscar Azucena829d90d2022-01-28 17:17:56 -08002227 mUidPolicy->setAssistantUids(uids);
Ahaan Ugalef51ce002021-08-04 16:34:20 -07002228 return Status::ok();
2229}
2230
Oscar Azucenac2cdda32022-01-31 19:10:39 -08002231Status AudioPolicyService::setActiveAssistantServicesUids(
2232 const std::vector<int32_t>& activeUidsAidl) {
2233 std::vector<uid_t> activeUids;
2234 RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(activeUidsAidl, activeUids));
2235
Andy Hung79eacdb2023-11-30 19:34:24 -08002236 audio_utils::lock_guard _l(mMutex);
Oscar Azucenac2cdda32022-01-31 19:10:39 -08002237 mUidPolicy->setActiveAssistantUids(activeUids);
2238 return Status::ok();
2239}
2240
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002241Status AudioPolicyService::setA11yServicesUids(const std::vector<int32_t>& uidsAidl)
Eric Laurentb78763e2018-10-17 10:08:02 -07002242{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002243 std::vector<uid_t> uids;
Oscar Azucena829d90d2022-01-28 17:17:56 -08002244 RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(uidsAidl, uids));
2245
Andy Hung79eacdb2023-11-30 19:34:24 -08002246 audio_utils::lock_guard _l(mMutex);
Eric Laurentb78763e2018-10-17 10:08:02 -07002247 mUidPolicy->setA11yUids(uids);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002248 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07002249}
2250
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002251Status AudioPolicyService::setCurrentImeUid(int32_t uidAidl)
Kohsuke Yatoha623a132020-03-24 20:10:26 -07002252{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002253 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Andy Hung79eacdb2023-11-30 19:34:24 -08002254 audio_utils::lock_guard _l(mMutex);
Kohsuke Yatoha623a132020-03-24 20:10:26 -07002255 mUidPolicy->setCurrentImeUid(uid);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002256 return Status::ok();
Kohsuke Yatoha623a132020-03-24 20:10:26 -07002257}
2258
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002259Status AudioPolicyService::isHapticPlaybackSupported(bool* _aidl_return)
jiabin6012f912018-11-02 17:06:30 -07002260{
2261 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002262 return binderStatusFromStatusT(NO_INIT);
jiabin6012f912018-11-02 17:06:30 -07002263 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002264 audio_utils::lock_guard _l(mMutex);
jiabin6012f912018-11-02 17:06:30 -07002265 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002266 *_aidl_return = mAudioPolicyManager->isHapticPlaybackSupported();
2267 return Status::ok();
jiabin6012f912018-11-02 17:06:30 -07002268}
2269
Carter Hsu325a8eb2022-01-19 19:56:51 +08002270Status AudioPolicyService::isUltrasoundSupported(bool* _aidl_return)
2271{
2272 if (mAudioPolicyManager == NULL) {
2273 return binderStatusFromStatusT(NO_INIT);
2274 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002275 audio_utils::lock_guard _l(mMutex);
Carter Hsu325a8eb2022-01-19 19:56:51 +08002276 AutoCallerClear acc;
2277 *_aidl_return = mAudioPolicyManager->isUltrasoundSupported();
2278 return Status::ok();
2279}
2280
Atneya Nair698f5ef2022-12-15 16:15:09 -08002281Status AudioPolicyService::isHotwordStreamSupported(bool lookbackAudio, bool* _aidl_return)
2282{
2283 if (mAudioPolicyManager == nullptr) {
2284 return binderStatusFromStatusT(NO_INIT);
2285 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002286 audio_utils::lock_guard _l(mMutex);
Atneya Nair698f5ef2022-12-15 16:15:09 -08002287 AutoCallerClear acc;
2288 *_aidl_return = mAudioPolicyManager->isHotwordStreamSupported(lookbackAudio);
2289 return Status::ok();
2290}
2291
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002292Status AudioPolicyService::listAudioProductStrategies(
2293 std::vector<media::AudioProductStrategy>* _aidl_return) {
2294 AudioProductStrategyVector strategies;
2295
François Gaffied0ba9ed2018-11-05 11:50:42 +01002296 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002297 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01002298 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002299 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002300 RETURN_IF_BINDER_ERROR(
2301 binderStatusFromStatusT(mAudioPolicyManager->listAudioProductStrategies(strategies)));
2302 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2303 convertContainer<std::vector<media::AudioProductStrategy>>(
2304 strategies,
2305 legacy2aidl_AudioProductStrategy));
2306 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01002307}
2308
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002309Status AudioPolicyService::getProductStrategyFromAudioAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002310 const media::audio::common::AudioAttributes& aaAidl,
François Gaffie1e2b56f2022-04-01 14:34:29 +02002311 bool fallbackOnDefault, int32_t* _aidl_return) {
2312 audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002313 aidl2legacy_AudioAttributes_audio_attributes_t(aaAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002314 product_strategy_t productStrategy;
2315
François Gaffied0ba9ed2018-11-05 11:50:42 +01002316 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002317 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01002318 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002319 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002320 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02002321 mAudioPolicyManager->getProductStrategyFromAudioAttributes(
2322 aa, productStrategy, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002323 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2324 legacy2aidl_product_strategy_t_int32_t(productStrategy));
2325 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01002326}
2327
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002328Status AudioPolicyService::listAudioVolumeGroups(std::vector<media::AudioVolumeGroup>* _aidl_return)
François Gaffie4b2018b2018-11-07 11:18:59 +01002329{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002330 AudioVolumeGroupVector groups;
François Gaffie4b2018b2018-11-07 11:18:59 +01002331 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002332 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01002333 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002334 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002335 RETURN_IF_BINDER_ERROR(
2336 binderStatusFromStatusT(mAudioPolicyManager->listAudioVolumeGroups(groups)));
2337 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2338 convertContainer<std::vector<media::AudioVolumeGroup>>(groups,
2339 legacy2aidl_AudioVolumeGroup));
2340 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01002341}
2342
Francois Gaffie11b65922020-09-24 16:59:08 +02002343Status AudioPolicyService::getVolumeGroupFromAudioAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002344 const media::audio::common::AudioAttributes& aaAidl,
François Gaffie1e2b56f2022-04-01 14:34:29 +02002345 bool fallbackOnDefault, int32_t* _aidl_return) {
2346 audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002347 aidl2legacy_AudioAttributes_audio_attributes_t(aaAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002348 volume_group_t volumeGroup;
2349
François Gaffie4b2018b2018-11-07 11:18:59 +01002350 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002351 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01002352 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002353 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002354 RETURN_IF_BINDER_ERROR(
2355 binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02002356 mAudioPolicyManager->getVolumeGroupFromAudioAttributes(
2357 aa, volumeGroup, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002358 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_volume_group_t_int32_t(volumeGroup));
2359 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01002360}
Eric Laurent6ede98f2019-06-11 14:50:30 -07002361
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002362Status AudioPolicyService::setRttEnabled(bool enabled)
Eric Laurent6ede98f2019-06-11 14:50:30 -07002363{
Andy Hung79eacdb2023-11-30 19:34:24 -08002364 audio_utils::lock_guard _l(mMutex);
Eric Laurent6ede98f2019-06-11 14:50:30 -07002365 mUidPolicy->setRttEnabled(enabled);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002366 return Status::ok();
Eric Laurent6ede98f2019-06-11 14:50:30 -07002367}
2368
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002369Status AudioPolicyService::isCallScreenModeSupported(bool* _aidl_return)
Eric Laurent8340e672019-11-06 11:01:08 -08002370{
2371 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002372 return binderStatusFromStatusT(NO_INIT);
Eric Laurent8340e672019-11-06 11:01:08 -08002373 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002374 audio_utils::lock_guard _l(mMutex);
Eric Laurent8340e672019-11-06 11:01:08 -08002375 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002376 *_aidl_return = mAudioPolicyManager->isCallScreenModeSupported();
2377 return Status::ok();
Eric Laurent8340e672019-11-06 11:01:08 -08002378}
2379
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002380Status AudioPolicyService::setDevicesRoleForStrategy(
2381 int32_t strategyAidl,
2382 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002383 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002384 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2385 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2386 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2387 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2388 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2389 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2390 aidl2legacy_AudioDeviceTypeAddress));
2391
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002392 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002393 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002394 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002395 audio_utils::lock_guard _l(mMutex);
Eric Laurent39095982021-08-24 18:29:27 +02002396 status_t status = mAudioPolicyManager->setDevicesRoleForStrategy(strategy, role, devices);
2397 if (status == NO_ERROR) {
2398 onCheckSpatializer_l();
2399 }
2400 return binderStatusFromStatusT(status);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002401}
2402
Paul Wang5d7cdb52022-11-22 09:45:06 +00002403Status AudioPolicyService::removeDevicesRoleForStrategy(
2404 int32_t strategyAidl,
2405 media::DeviceRole roleAidl,
2406 const std::vector<AudioDevice>& devicesAidl) {
2407 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2408 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2409 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2410 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2411 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2412 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2413 aidl2legacy_AudioDeviceTypeAddress));
2414
2415 if (mAudioPolicyManager == NULL) {
2416 return binderStatusFromStatusT(NO_INIT);
2417 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002418 audio_utils::lock_guard _l(mMutex);
Paul Wang5d7cdb52022-11-22 09:45:06 +00002419 status_t status = mAudioPolicyManager->removeDevicesRoleForStrategy(strategy, role, devices);
2420 if (status == NO_ERROR) {
2421 onCheckSpatializer_l();
2422 }
2423 return binderStatusFromStatusT(status);
2424}
2425
2426Status AudioPolicyService::clearDevicesRoleForStrategy(int32_t strategyAidl,
2427 media::DeviceRole roleAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002428 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2429 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2430 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2431 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2432 if (mAudioPolicyManager == NULL) {
2433 return binderStatusFromStatusT(NO_INIT);
2434 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002435 audio_utils::lock_guard _l(mMutex);
Paul Wang5d7cdb52022-11-22 09:45:06 +00002436 status_t status = mAudioPolicyManager->clearDevicesRoleForStrategy(strategy, role);
Eric Laurent39095982021-08-24 18:29:27 +02002437 if (status == NO_ERROR) {
2438 onCheckSpatializer_l();
2439 }
2440 return binderStatusFromStatusT(status);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002441}
2442
2443Status AudioPolicyService::getDevicesForRoleAndStrategy(
2444 int32_t strategyAidl,
2445 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002446 std::vector<AudioDevice>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002447 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2448 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2449 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2450 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2451 AudioDeviceTypeAddrVector devices;
2452
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002453 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002454 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002455 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002456 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002457 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2458 mAudioPolicyManager->getDevicesForRoleAndStrategy(strategy, role, devices)));
2459 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002460 convertContainer<std::vector<AudioDevice>>(devices,
2461 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002462 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002463}
2464
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002465Status AudioPolicyService::registerSoundTriggerCaptureStateListener(
2466 const sp<media::ICaptureStateListener>& listener, bool* _aidl_return) {
2467 *_aidl_return = mCaptureStateNotifier.RegisterListener(listener);
2468 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002469}
2470
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002471Status AudioPolicyService::setDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002472 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002473 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002474 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002475 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002476 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002477 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2478 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2479 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2480 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2481 aidl2legacy_AudioDeviceTypeAddress));
Ytai Ben-Tsvi85093d52020-03-26 09:41:15 -07002482
Jiabin Huang3b98d322020-09-03 17:54:16 +00002483 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002484 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002485 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002486 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002487 return binderStatusFromStatusT(
2488 mAudioPolicyManager->setDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002489}
2490
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002491Status AudioPolicyService::addDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002492 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002493 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002494 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002495 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002496 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002497 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2498 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2499 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2500 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2501 aidl2legacy_AudioDeviceTypeAddress));
2502
Jiabin Huang3b98d322020-09-03 17:54:16 +00002503 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002504 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002505 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002506 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002507 return binderStatusFromStatusT(
2508 mAudioPolicyManager->addDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002509}
2510
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002511Status AudioPolicyService::removeDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002512 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002513 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002514 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002515 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002516 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002517 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2518 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2519 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2520 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2521 aidl2legacy_AudioDeviceTypeAddress));
2522
2523 if (mAudioPolicyManager == nullptr) {
2524 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002525 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002526 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002527 return binderStatusFromStatusT(
2528 mAudioPolicyManager->removeDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002529}
2530
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002531Status AudioPolicyService::clearDevicesRoleForCapturePreset(AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002532 media::DeviceRole roleAidl) {
2533 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002534 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002535 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2536 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2537
Jiabin Huang3b98d322020-09-03 17:54:16 +00002538 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002539 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002540 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002541 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002542 return binderStatusFromStatusT(
2543 mAudioPolicyManager->clearDevicesRoleForCapturePreset(audioSource, role));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002544}
2545
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002546Status AudioPolicyService::getDevicesForRoleAndCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002547 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002548 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002549 std::vector<AudioDevice>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002550 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002551 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002552 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2553 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2554 AudioDeviceTypeAddrVector devices;
2555
Jiabin Huang3b98d322020-09-03 17:54:16 +00002556 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002557 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002558 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002559 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002560 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2561 mAudioPolicyManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices)));
2562 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002563 convertContainer<std::vector<AudioDevice>>(devices,
2564 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002565 return Status::ok();
Jiabin Huang3b98d322020-09-03 17:54:16 +00002566}
2567
Eric Laurent81dd0f52021-07-05 11:54:40 +02002568Status AudioPolicyService::getSpatializer(
2569 const sp<media::INativeSpatializerCallback>& callback,
2570 media::GetSpatializerResponse* _aidl_return) {
2571 _aidl_return->spatializer = nullptr;
Eric Laurent2be8b292021-08-23 09:44:33 -07002572 if (callback == nullptr) {
2573 return binderStatusFromStatusT(BAD_VALUE);
2574 }
Jean-Michel Trivi41628732021-09-09 12:16:21 -07002575 if (mSpatializer != nullptr) {
2576 RETURN_IF_BINDER_ERROR(
2577 binderStatusFromStatusT(mSpatializer->registerCallback(callback)));
2578 _aidl_return->spatializer = mSpatializer;
2579 }
Eric Laurent81dd0f52021-07-05 11:54:40 +02002580 return Status::ok();
2581}
2582
2583Status AudioPolicyService::canBeSpatialized(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002584 const std::optional<media::audio::common::AudioAttributes>& attrAidl,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002585 const std::optional<AudioConfig>& configAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002586 const std::vector<AudioDevice>& devicesAidl,
Eric Laurent81dd0f52021-07-05 11:54:40 +02002587 bool* _aidl_return) {
2588 if (mAudioPolicyManager == nullptr) {
2589 return binderStatusFromStatusT(NO_INIT);
2590 }
2591 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
2592 if (attrAidl.has_value()) {
2593 attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002594 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl.value()));
Eric Laurent81dd0f52021-07-05 11:54:40 +02002595 }
2596 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
2597 if (configAidl.has_value()) {
2598 config = VALUE_OR_RETURN_BINDER_STATUS(
2599 aidl2legacy_AudioConfig_audio_config_t(configAidl.value(),
2600 false /*isInput*/));
2601 }
2602 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2603 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2604 aidl2legacy_AudioDeviceTypeAddress));
2605
Andy Hung79eacdb2023-11-30 19:34:24 -08002606 audio_utils::lock_guard _l(mMutex);
Eric Laurent81dd0f52021-07-05 11:54:40 +02002607 *_aidl_return = mAudioPolicyManager->canBeSpatialized(&attr, &config, devices);
2608 return Status::ok();
2609}
2610
Mikhail Naganov1c400902023-05-17 11:48:43 -07002611Status AudioPolicyService::getDirectPlaybackSupport(
2612 const media::audio::common::AudioAttributes &attrAidl,
2613 const AudioConfig &configAidl,
2614 media::AudioDirectMode *_aidl_return) {
jiabin2b9d5a12021-12-10 01:06:29 +00002615 if (mAudioPolicyManager == nullptr) {
2616 return binderStatusFromStatusT(NO_INIT);
2617 }
2618 if (_aidl_return == nullptr) {
2619 return binderStatusFromStatusT(BAD_VALUE);
2620 }
2621 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002622 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabin2b9d5a12021-12-10 01:06:29 +00002623 audio_config_t config = VALUE_OR_RETURN_BINDER_STATUS(
2624 aidl2legacy_AudioConfig_audio_config_t(configAidl, false /*isInput*/));
Andy Hung79eacdb2023-11-30 19:34:24 -08002625 audio_utils::lock_guard _l(mMutex);
jiabin2b9d5a12021-12-10 01:06:29 +00002626 *_aidl_return = static_cast<media::AudioDirectMode>(
2627 VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_direct_mode_t_int32_t_mask(
2628 mAudioPolicyManager->getDirectPlaybackSupport(&attr, &config))));
2629 return Status::ok();
2630}
2631
Dorin Drimusf2196d82022-01-03 12:11:18 +01002632Status AudioPolicyService::getDirectProfilesForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002633 const media::audio::common::AudioAttributes& attrAidl,
Dorin Drimusf2196d82022-01-03 12:11:18 +01002634 std::vector<media::audio::common::AudioProfile>* _aidl_return) {
2635 if (mAudioPolicyManager == nullptr) {
2636 return binderStatusFromStatusT(NO_INIT);
2637 }
2638 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002639 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Dorin Drimusf2196d82022-01-03 12:11:18 +01002640 AudioProfileVector audioProfiles;
2641
Andy Hung79eacdb2023-11-30 19:34:24 -08002642 audio_utils::lock_guard _l(mMutex);
Dorin Drimusf2196d82022-01-03 12:11:18 +01002643 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2644 mAudioPolicyManager->getDirectProfilesForAttributes(&attr, audioProfiles)));
2645 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2646 convertContainer<std::vector<media::audio::common::AudioProfile>>(
2647 audioProfiles, legacy2aidl_AudioProfile_common, false /*isInput*/));
2648
2649 return Status::ok();
2650}
2651
jiabina84c3d32022-12-02 18:59:55 +00002652Status AudioPolicyService::getSupportedMixerAttributes(
2653 int32_t portIdAidl, std::vector<media::AudioMixerAttributesInternal>* _aidl_return) {
2654 if (mAudioPolicyManager == nullptr) {
2655 return binderStatusFromStatusT(NO_INIT);
2656 }
2657
2658 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2659 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2660
2661 std::vector<audio_mixer_attributes_t> mixerAttrs;
Andy Hung79eacdb2023-11-30 19:34:24 -08002662 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002663 RETURN_IF_BINDER_ERROR(
2664 binderStatusFromStatusT(mAudioPolicyManager->getSupportedMixerAttributes(
2665 portId, mixerAttrs)));
2666 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2667 convertContainer<std::vector<media::AudioMixerAttributesInternal>>(
2668 mixerAttrs,
2669 legacy2aidl_audio_mixer_attributes_t_AudioMixerAttributesInternal));
2670 return Status::ok();
2671}
2672
2673Status AudioPolicyService::setPreferredMixerAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002674 const media::audio::common::AudioAttributes& attrAidl,
jiabina84c3d32022-12-02 18:59:55 +00002675 int32_t portIdAidl,
2676 int32_t uidAidl,
2677 const media::AudioMixerAttributesInternal& mixerAttrAidl) {
2678 if (mAudioPolicyManager == nullptr) {
2679 return binderStatusFromStatusT(NO_INIT);
2680 }
2681
2682 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002683 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabina84c3d32022-12-02 18:59:55 +00002684 audio_mixer_attributes_t mixerAttr = VALUE_OR_RETURN_BINDER_STATUS(
2685 aidl2legacy_AudioMixerAttributesInternal_audio_mixer_attributes_t(mixerAttrAidl));
2686 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2687 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2688 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2689
Andy Hung79eacdb2023-11-30 19:34:24 -08002690 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002691 return binderStatusFromStatusT(
2692 mAudioPolicyManager->setPreferredMixerAttributes(&attr, portId, uid, &mixerAttr));
2693}
2694
2695Status AudioPolicyService::getPreferredMixerAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002696 const media::audio::common::AudioAttributes& attrAidl,
jiabina84c3d32022-12-02 18:59:55 +00002697 int32_t portIdAidl,
2698 std::optional<media::AudioMixerAttributesInternal>* _aidl_return) {
2699 if (mAudioPolicyManager == nullptr) {
2700 return binderStatusFromStatusT(NO_INIT);
2701 }
2702
2703 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002704 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabina84c3d32022-12-02 18:59:55 +00002705 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2706 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2707
Andy Hung79eacdb2023-11-30 19:34:24 -08002708 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002709 audio_mixer_attributes_t mixerAttr = AUDIO_MIXER_ATTRIBUTES_INITIALIZER;
2710 RETURN_IF_BINDER_ERROR(
2711 binderStatusFromStatusT(mAudioPolicyManager->getPreferredMixerAttributes(
2712 &attr, portId, &mixerAttr)));
2713 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2714 legacy2aidl_audio_mixer_attributes_t_AudioMixerAttributesInternal(mixerAttr));
2715 return Status::ok();
2716}
2717
2718Status AudioPolicyService::clearPreferredMixerAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002719 const media::audio::common::AudioAttributes& attrAidl,
jiabina84c3d32022-12-02 18:59:55 +00002720 int32_t portIdAidl,
2721 int32_t uidAidl) {
2722 if (mAudioPolicyManager == nullptr) {
2723 return binderStatusFromStatusT(NO_INIT);
2724 }
2725
2726 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002727 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabina84c3d32022-12-02 18:59:55 +00002728 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2729 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2730 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2731
Andy Hung79eacdb2023-11-30 19:34:24 -08002732 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002733 return binderStatusFromStatusT(
2734 mAudioPolicyManager->clearPreferredMixerAttributes(&attr, portId, uid));
2735}
2736
Atneya Nair9f91a5e2024-05-09 16:25:05 -07002737Status AudioPolicyService::getPermissionController(sp<INativePermissionController>* out) {
2738 *out = mPermissionController;
2739 return Status::ok();
2740}
2741
Mikhail Naganov1b2a7942017-12-08 10:18:09 -08002742} // namespace android