blob: 8d7432dcbe5a96ebaa83136b24c03cc4abc19ccd [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>
Eric Laurent528181a2024-10-30 18:32:15 +000027#include <cutils/properties.h>
Atneya Nair09859fe2024-07-15 16:38:02 -070028#include <error/expected_utils.h>
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080029#include <media/AidlConversion.h>
Kevin Rocardbe201852019-02-20 22:33:28 -080030#include <media/AudioPolicy.h>
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080031#include <media/AudioValidator.h>
32#include <media/MediaMetricsItem.h>
33#include <media/PolicyAidlConversion.h>
Eric Laurentd7fe0862018-07-14 16:48:01 -070034#include <utils/Log.h>
Eric Laurent2d388ec2014-03-07 13:25:54 -080035
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080036#define VALUE_OR_RETURN_BINDER_STATUS(x) \
37 ({ auto _tmp = (x); \
38 if (!_tmp.ok()) return aidl_utils::binderStatusFromStatusT(_tmp.error()); \
39 std::move(_tmp.value()); })
40
Mikhail Naganov932cb962021-09-16 01:05:27 +000041#define RETURN_BINDER_STATUS_IF_ERROR(x) \
42 if (status_t _tmp = (x); _tmp != OK) return aidl_utils::binderStatusFromStatusT(_tmp);
43
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080044#define RETURN_IF_BINDER_ERROR(x) \
45 { \
46 binder::Status _tmp = (x); \
47 if (!_tmp.isOk()) return _tmp; \
48 }
49
Atneya Nair09859fe2024-07-15 16:38:02 -070050#define CHECK_PERM(expr1, expr2) \
51 VALUE_OR_RETURN_STATUS(getPermissionProvider().checkPermission((expr1), (expr2)))
52
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080053#define MAX_ITEMS_PER_LIST 1024
54
Eric Laurent2d388ec2014-03-07 13:25:54 -080055namespace android {
Marvin Ramine5a122d2023-12-07 13:57:59 +010056namespace audiopolicy_flags = android::media::audiopolicy;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080057using binder::Status;
58using aidl_utils::binderStatusFromStatusT;
Atneya Nair09859fe2024-07-15 16:38:02 -070059using com::android::media::audio::audioserver_permissions;
Atneya Nair9f91a5e2024-05-09 16:25:05 -070060using com::android::media::permission::NativePermissionController;
Atneya Nair09859fe2024-07-15 16:38:02 -070061using com::android::media::permission::PermissionEnum::ACCESS_ULTRASOUND;
62using com::android::media::permission::PermissionEnum::CALL_AUDIO_INTERCEPTION;
63using com::android::media::permission::PermissionEnum::CAPTURE_AUDIO_HOTWORD;
64using com::android::media::permission::PermissionEnum::CAPTURE_VOICE_COMMUNICATION_OUTPUT;
65using com::android::media::permission::PermissionEnum::CAPTURE_AUDIO_OUTPUT;
66using com::android::media::permission::PermissionEnum::CAPTURE_MEDIA_OUTPUT;
67using com::android::media::permission::PermissionEnum::CAPTURE_TUNER_AUDIO_INPUT;
68using com::android::media::permission::PermissionEnum::MODIFY_AUDIO_ROUTING;
69using com::android::media::permission::PermissionEnum::MODIFY_AUDIO_SETTINGS;
70using com::android::media::permission::PermissionEnum::MODIFY_DEFAULT_AUDIO_EFFECTS;
71using com::android::media::permission::PermissionEnum::MODIFY_PHONE_STATE;
72using com::android::media::permission::PermissionEnum::RECORD_AUDIO;
73using com::android::media::permission::PermissionEnum::WRITE_SECURE_SETTINGS;
Svet Ganov3e5f14f2021-05-13 22:51:08 +000074using content::AttributionSourceState;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070075using media::audio::common::AudioConfig;
76using media::audio::common::AudioConfigBase;
Mikhail Naganovf4a75362021-09-16 00:02:54 +000077using media::audio::common::AudioDevice;
Mikhail Naganov932cb962021-09-16 01:05:27 +000078using media::audio::common::AudioDeviceAddress;
Mikhail Naganovf4a75362021-09-16 00:02:54 +000079using media::audio::common::AudioDeviceDescription;
Mikhail Naganov57bd06f2021-08-10 16:41:54 -070080using media::audio::common::AudioFormatDescription;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070081using media::audio::common::AudioMode;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070082using media::audio::common::AudioOffloadInfo;
François Gaffie873738c2024-08-02 17:09:21 +020083using media::audio::common::AudioPolicyForceUse;
84using media::audio::common::AudioPolicyForcedConfig;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070085using media::audio::common::AudioSource;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070086using media::audio::common::AudioStreamType;
87using media::audio::common::AudioUsage;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070088using media::audio::common::AudioUuid;
Mikhail Naganov0078ee52021-09-30 23:06:20 +000089using media::audio::common::Int;
Eric Laurent2d388ec2014-03-07 13:25:54 -080090
Marvin Ramine5a122d2023-12-07 13:57:59 +010091constexpr int kDefaultVirtualDeviceId = 0;
Atneya Nairdb6ef1e2024-09-16 20:26:30 +000092namespace {
93constexpr auto PERMISSION_HARD_DENIED = permission::PermissionChecker::PERMISSION_HARD_DENIED;
94constexpr auto PERMISSION_GRANTED = permission::PermissionChecker::PERMISSION_GRANTED;
95}
Marvin Ramine5a122d2023-12-07 13:57:59 +010096
Hayden Gomes524159d2019-12-23 14:41:47 -080097const std::vector<audio_usage_t>& SYSTEM_USAGES = {
98 AUDIO_USAGE_CALL_ASSISTANT,
99 AUDIO_USAGE_EMERGENCY,
100 AUDIO_USAGE_SAFETY,
101 AUDIO_USAGE_VEHICLE_STATUS,
102 AUDIO_USAGE_ANNOUNCEMENT
103};
104
105bool isSystemUsage(audio_usage_t usage) {
106 return std::find(std::begin(SYSTEM_USAGES), std::end(SYSTEM_USAGES), usage)
107 != std::end(SYSTEM_USAGES);
108}
109
110bool AudioPolicyService::isSupportedSystemUsage(audio_usage_t usage) {
111 return std::find(std::begin(mSupportedSystemUsages), std::end(mSupportedSystemUsages), usage)
112 != std::end(mSupportedSystemUsages);
113}
114
Atneya Nair09859fe2024-07-15 16:38:02 -0700115Status AudioPolicyService::validateUsage(const audio_attributes_t& attr) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100116 return validateUsage(attr, getCallingAttributionSource());
Hayden Gomes524159d2019-12-23 14:41:47 -0800117}
118
Atneya Nair09859fe2024-07-15 16:38:02 -0700119Status AudioPolicyService::validateUsage(const audio_attributes_t& attr,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000120 const AttributionSourceState& attributionSource) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100121 if (isSystemUsage(attr.usage)) {
122 if (isSupportedSystemUsage(attr.usage)) {
123 if (attr.usage == AUDIO_USAGE_CALL_ASSISTANT
124 && ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0)) {
Atneya Nair09859fe2024-07-15 16:38:02 -0700125 if (!(audioserver_permissions() ?
126 CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
127 : callAudioInterceptionAllowed(attributionSource))) {
Eric Laurentf8763482022-03-30 20:37:30 +0200128 ALOGE("%s: call audio interception not allowed for attribution source: %s",
129 __func__, attributionSource.toString().c_str());
Atneya Nair09859fe2024-07-15 16:38:02 -0700130 return Status::fromExceptionCode(Status::EX_SECURITY,
131 "Call audio interception not allowed");
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100132 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700133 } else if (!(audioserver_permissions() ?
134 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid)
135 : modifyAudioRoutingAllowed(attributionSource))) {
Eric Laurentf8763482022-03-30 20:37:30 +0200136 ALOGE("%s: modify audio routing not allowed for attribution source: %s",
137 __func__, attributionSource.toString().c_str());
Atneya Nair09859fe2024-07-15 16:38:02 -0700138 return Status::fromExceptionCode(Status::EX_SECURITY,
139 "Modify audio routing not allowed");
Hayden Gomes524159d2019-12-23 14:41:47 -0800140 }
141 } else {
Atneya Nair09859fe2024-07-15 16:38:02 -0700142 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT);
Hayden Gomes524159d2019-12-23 14:41:47 -0800143 }
144 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700145 return Status::ok();
Hayden Gomes524159d2019-12-23 14:41:47 -0800146}
147
148
Eric Laurent2d388ec2014-03-07 13:25:54 -0800149
150// ----------------------------------------------------------------------------
151
Mikhail Naganov88b30d22020-03-09 19:43:13 +0000152void AudioPolicyService::doOnNewAudioModulesAvailable()
153{
154 if (mAudioPolicyManager == NULL) return;
Andy Hung79eacdb2023-11-30 19:34:24 -0800155 audio_utils::lock_guard _l(mMutex);
Mikhail Naganov88b30d22020-03-09 19:43:13 +0000156 AutoCallerClear acc;
157 mAudioPolicyManager->onNewAudioModulesAvailable();
158}
159
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800160Status AudioPolicyService::setDeviceConnectionState(
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800161 media::AudioPolicyDeviceState stateAidl,
Nathalie Le Clair88fa2752021-11-23 13:03:41 +0100162 const android::media::audio::common::AudioPort& port,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700163 const AudioFormatDescription& encodedFormatAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800164 audio_policy_dev_state_t state = VALUE_OR_RETURN_BINDER_STATUS(
165 aidl2legacy_AudioPolicyDeviceState_audio_policy_dev_state_t(stateAidl));
166 audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -0700167 aidl2legacy_AudioFormatDescription_audio_format_t(encodedFormatAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800168
Eric Laurentdce54a12014-03-10 12:19:46 -0700169 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800170 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800171 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700172 if (!(audioserver_permissions() ?
173 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
174 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800175 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800176 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800177 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
178 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800179 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800180 }
181
182 ALOGV("setDeviceConnectionState()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800183 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700184 AutoCallerClear acc;
Mikhail Naganov932cb962021-09-16 01:05:27 +0000185 status_t status = mAudioPolicyManager->setDeviceConnectionState(
Nathalie Le Clair88fa2752021-11-23 13:03:41 +0100186 state, port, encodedFormat);
Eric Laurent39095982021-08-24 18:29:27 +0200187 if (status == NO_ERROR) {
188 onCheckSpatializer_l();
189 }
190 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800191}
192
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000193Status AudioPolicyService::getDeviceConnectionState(const AudioDevice& deviceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800194 media::AudioPolicyDeviceState* _aidl_return) {
Mikhail Naganov932cb962021-09-16 01:05:27 +0000195 audio_devices_t device;
196 std::string address;
197 RETURN_BINDER_STATUS_IF_ERROR(
198 aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
Eric Laurentdce54a12014-03-10 12:19:46 -0700199 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800200 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
201 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
202 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
203 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800204 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800205 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700206 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800207 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
208 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
Mikhail Naganov932cb962021-09-16 01:05:27 +0000209 mAudioPolicyManager->getDeviceConnectionState(
210 device, address.c_str())));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800211 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800212}
213
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800214Status AudioPolicyService::handleDeviceConfigChange(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000215 const AudioDevice& deviceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800216 const std::string& deviceNameAidl,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700217 const AudioFormatDescription& encodedFormatAidl) {
Mikhail Naganov932cb962021-09-16 01:05:27 +0000218 audio_devices_t device;
219 std::string address;
220 RETURN_BINDER_STATUS_IF_ERROR(
221 aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800222 audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -0700223 aidl2legacy_AudioFormatDescription_audio_format_t(encodedFormatAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800224
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800225 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800226 return binderStatusFromStatusT(NO_INIT);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800227 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700228 if (!(audioserver_permissions() ?
229 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
230 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800231 return binderStatusFromStatusT(PERMISSION_DENIED);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800232 }
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800233
234 ALOGV("handleDeviceConfigChange()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800235 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700236 AutoCallerClear acc;
Eric Laurent39095982021-08-24 18:29:27 +0200237 status_t status = mAudioPolicyManager->handleDeviceConfigChange(
Mikhail Naganov932cb962021-09-16 01:05:27 +0000238 device, address.c_str(), deviceNameAidl.c_str(), encodedFormat);
Eric Laurent39095982021-08-24 18:29:27 +0200239
240 if (status == NO_ERROR) {
241 onCheckSpatializer_l();
242 }
243 return binderStatusFromStatusT(status);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800244}
245
Mikhail Naganovddceecc2021-09-03 13:58:56 -0700246Status AudioPolicyService::setPhoneState(AudioMode stateAidl, int32_t uidAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800247{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800248 audio_mode_t state = VALUE_OR_RETURN_BINDER_STATUS(
249 aidl2legacy_AudioMode_audio_mode_t(stateAidl));
250 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700251 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800252 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800253 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700254 if (!(audioserver_permissions() ?
255 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
256 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800257 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800258 }
259 if (uint32_t(state) >= AUDIO_MODE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800260 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800261 }
262
263 ALOGV("setPhoneState()");
264
Eric Laurentbeb07fe2015-09-16 15:49:30 -0700265 // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic
266 // operation from policy manager standpoint (no other operation (e.g track start or stop)
267 // can be interleaved).
Andy Hung79eacdb2023-11-30 19:34:24 -0800268 audio_utils::lock_guard _l(mMutex);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800269 // TODO: check if it is more appropriate to do it in platform specific policy manager
Eric Laurentc8c4f1f2021-11-09 11:51:34 +0100270
271 // Audio HAL mode conversion for call redirect modes
272 audio_mode_t halMode = state;
273 if (state == AUDIO_MODE_CALL_REDIRECT) {
274 halMode = AUDIO_MODE_CALL_SCREEN;
275 } else if (state == AUDIO_MODE_COMMUNICATION_REDIRECT) {
276 halMode = AUDIO_MODE_NORMAL;
277 }
278 AudioSystem::setMode(halMode);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800279
Eric Laurent10b71232018-04-13 18:14:44 -0700280 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700281 mAudioPolicyManager->setPhoneState(state);
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700282 mPhoneState = state;
Eric Laurent00dba062020-02-11 15:52:09 -0800283 mPhoneStateOwnerUid = uid;
Mingshu Pangd07c19b2021-02-25 11:40:32 +0800284 updateUidStates_l();
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800285 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800286}
287
Mikhail Naganovddceecc2021-09-03 13:58:56 -0700288Status AudioPolicyService::getPhoneState(AudioMode* _aidl_return) {
Andy Hung79eacdb2023-11-30 19:34:24 -0800289 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800290 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_mode_t_AudioMode(mPhoneState));
291 return Status::ok();
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700292}
293
François Gaffie873738c2024-08-02 17:09:21 +0200294Status AudioPolicyService::setForceUse(AudioPolicyForceUse usageAidl,
295 AudioPolicyForcedConfig configAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800296{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800297 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
298 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
299 audio_policy_forced_cfg_t config = VALUE_OR_RETURN_BINDER_STATUS(
300 aidl2legacy_AudioPolicyForcedConfig_audio_policy_forced_cfg_t(configAidl));
301
Eric Laurentdce54a12014-03-10 12:19:46 -0700302 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800303 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800304 }
Eric Laurente17378d2018-05-09 14:43:01 -0700305
Atneya Nair09859fe2024-07-15 16:38:02 -0700306 if (!(audioserver_permissions() ?
307 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
308 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800309 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800310 }
Eric Laurente17378d2018-05-09 14:43:01 -0700311
Eric Laurent2d388ec2014-03-07 13:25:54 -0800312 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800313 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800314 }
315 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800316 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800317 }
318 ALOGV("setForceUse()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800319 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700320 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700321 mAudioPolicyManager->setForceUse(usage, config);
Eric Laurent39095982021-08-24 18:29:27 +0200322 onCheckSpatializer_l();
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800323 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800324}
325
François Gaffie873738c2024-08-02 17:09:21 +0200326Status AudioPolicyService::getForceUse(AudioPolicyForceUse usageAidl,
327 AudioPolicyForcedConfig* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800328 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
329 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
330
Eric Laurentdce54a12014-03-10 12:19:46 -0700331 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800332 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800333 }
334 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800335 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
336 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(AUDIO_POLICY_FORCE_NONE));
337 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800338 }
Eric Laurent10b71232018-04-13 18:14:44 -0700339 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800340 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
341 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(
342 mAudioPolicyManager->getForceUse(usage)));
343 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800344}
345
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700346Status AudioPolicyService::getOutput(AudioStreamType streamAidl, int32_t* _aidl_return)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800347{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800348 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
349 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
350
Eric Laurent72af8012023-03-15 17:36:22 +0100351 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT
352 && stream != AUDIO_STREAM_ASSISTANT && stream != AUDIO_STREAM_CALL_ASSISTANT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800353 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
354 legacy2aidl_audio_io_handle_t_int32_t(AUDIO_IO_HANDLE_NONE));
355 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -0700356 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700357 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800358 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800359 }
360 ALOGV("getOutput()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800361 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700362 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800363 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
364 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutput(stream)));
365 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800366}
367
Mikhail Naganov1c400902023-05-17 11:48:43 -0700368Status AudioPolicyService::getOutputForAttr(const media::audio::common::AudioAttributes& attrAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800369 int32_t sessionAidl,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000370 const AttributionSourceState& attributionSource,
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700371 const AudioConfig& configAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800372 int32_t flagsAidl,
Eric Laurentf99edd32021-02-01 15:57:33 +0100373 int32_t selectedDeviceIdAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800374 media::GetOutputForAttrResponse* _aidl_return)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700375{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800376 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -0700377 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800378 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
379 aidl2legacy_int32_t_audio_session_t(sessionAidl));
380 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800381 audio_config_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -0700382 aidl2legacy_AudioConfig_audio_config_t(configAidl, false /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800383 audio_output_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
384 aidl2legacy_int32_t_audio_output_flags_t_mask(flagsAidl));
Eric Laurentf99edd32021-02-01 15:57:33 +0100385 audio_port_handle_t selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
386 aidl2legacy_int32_t_audio_port_handle_t(selectedDeviceIdAidl));
387
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800388 audio_io_handle_t output;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800389 audio_port_handle_t portId;
390 std::vector<audio_io_handle_t> secondaryOutputs;
391
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700392 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800393 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700394 }
Hayden Gomes524159d2019-12-23 14:41:47 -0800395
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800396 RETURN_IF_BINDER_ERROR(
397 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Atneya Nair09859fe2024-07-15 16:38:02 -0700398 RETURN_IF_BINDER_ERROR(validateUsage(attr, attributionSource));
Hayden Gomes524159d2019-12-23 14:41:47 -0800399
Eric Laurent8a1095a2019-11-08 14:44:16 -0800400 ALOGV("%s()", __func__);
Andy Hung79eacdb2023-11-30 19:34:24 -0800401 audio_utils::lock_guard _l(mMutex);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700402
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700403 if (!mPackageManager.allowPlaybackCapture(VALUE_OR_RETURN_BINDER_STATUS(
Eric Laurent9ff3e532022-11-10 16:04:44 +0100404 aidl2legacy_int32_t_uid_t(attributionSource.uid)))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800405 attr.flags = static_cast<audio_flags_mask_t>(attr.flags | AUDIO_FLAG_NO_MEDIA_PROJECTION);
Eric Laurent42984412019-05-09 17:57:03 -0700406 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700407 const bool bypassInterruptionAllowed = audioserver_permissions() ? (
408 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid) ||
409 CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid) ||
410 CHECK_PERM(WRITE_SECURE_SETTINGS, attributionSource.uid))
411 : bypassInterruptionPolicyAllowed(attributionSource);
412
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800413 if (((attr.flags & (AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)) != 0)
Atneya Nair09859fe2024-07-15 16:38:02 -0700414 && !bypassInterruptionAllowed) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800415 attr.flags = static_cast<audio_flags_mask_t>(
416 attr.flags & ~(AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE));
Kevin Rocard8be94972019-02-22 13:26:25 -0800417 }
Carter Hsua3abb402021-10-26 11:11:20 +0800418
419 if (attr.content_type == AUDIO_CONTENT_TYPE_ULTRASOUND) {
Atneya Nair09859fe2024-07-15 16:38:02 -0700420 if (!(audioserver_permissions() ?
421 CHECK_PERM(ACCESS_ULTRASOUND, attributionSource.uid)
422 : accessUltrasoundAllowed(attributionSource))) {
Carter Hsua3abb402021-10-26 11:11:20 +0800423 ALOGE("%s: permission denied: ultrasound not allowed for uid %d pid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100424 __func__, attributionSource.uid, attributionSource.pid);
Carter Hsua3abb402021-10-26 11:11:20 +0800425 return binderStatusFromStatusT(PERMISSION_DENIED);
426 }
427 }
428
Jean-Michel Trivi2dbb1a92024-11-01 22:46:25 +0000429 //TODO this permission check should extend to all system usages
430 if (attr.usage == AUDIO_USAGE_SPEAKER_CLEANUP) {
431 if (!(audioserver_permissions() ?
432 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid)
433 : modifyAudioRoutingAllowed())) {
434 ALOGE("%s: permission denied: SPEAKER_CLEANUP not allowed for uid %d pid %d",
435 __func__, attributionSource.uid, attributionSource.pid);
436 return binderStatusFromStatusT(PERMISSION_DENIED);
437 }
438 }
439
Eric Laurent10b71232018-04-13 18:14:44 -0700440 AutoCallerClear acc;
Eric Laurent8a1095a2019-11-08 14:44:16 -0800441 AudioPolicyInterface::output_type_t outputType;
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200442 bool isSpatialized = false;
jiabinc658e452022-10-21 20:52:21 +0000443 bool isBitPerfect = false;
Andy Hung6b137d12024-08-27 22:35:17 +0000444 float volume;
Vlad Popa1e865e62024-08-15 19:11:42 -0700445 bool muted;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800446 status_t result = mAudioPolicyManager->getOutputForAttr(&attr, &output, session,
447 &stream,
Eric Laurent9ff3e532022-11-10 16:04:44 +0100448 attributionSource,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800449 &config,
450 &flags, &selectedDeviceId, &portId,
451 &secondaryOutputs,
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200452 &outputType,
jiabinc658e452022-10-21 20:52:21 +0000453 &isSpatialized,
Andy Hung6b137d12024-08-27 22:35:17 +0000454 &isBitPerfect,
Vlad Popa1e865e62024-08-15 19:11:42 -0700455 &volume,
456 &muted);
Nadav Bar766fb022018-01-07 12:18:03 +0200457
458 // FIXME: Introduce a way to check for the the telephony device before opening the output
Eric Laurent8a1095a2019-11-08 14:44:16 -0800459 if (result == NO_ERROR) {
460 // enforce permission (if any) required for each type of input
461 switch (outputType) {
462 case AudioPolicyInterface::API_OUTPUT_LEGACY:
463 break;
464 case AudioPolicyInterface::API_OUTPUT_TELEPHONY_TX:
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100465 if (((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0)
Atneya Nair09859fe2024-07-15 16:38:02 -0700466 && !(audioserver_permissions() ?
467 CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
468 : callAudioInterceptionAllowed(attributionSource))) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100469 ALOGE("%s() permission denied: call redirection not allowed for uid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100470 __func__, attributionSource.uid);
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100471 result = PERMISSION_DENIED;
Atneya Nair09859fe2024-07-15 16:38:02 -0700472 } else if (!(audioserver_permissions() ?
473 CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid)
474 : modifyPhoneStateAllowed(attributionSource))) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800475 ALOGE("%s() permission denied: modify phone state not allowed for uid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100476 __func__, attributionSource.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800477 result = PERMISSION_DENIED;
478 }
479 break;
480 case AudioPolicyInterface::API_OUT_MIX_PLAYBACK:
Atneya Nair09859fe2024-07-15 16:38:02 -0700481 if (!(audioserver_permissions() ?
482 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid)
483 : modifyAudioRoutingAllowed(attributionSource))) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800484 ALOGE("%s() permission denied: modify audio routing not allowed for uid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100485 __func__, attributionSource.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800486 result = PERMISSION_DENIED;
487 }
488 break;
489 case AudioPolicyInterface::API_OUTPUT_INVALID:
490 default:
491 LOG_ALWAYS_FATAL("%s() encountered an invalid output type %d",
492 __func__, (int)outputType);
493 }
Nadav Bar766fb022018-01-07 12:18:03 +0200494 }
Eric Laurentd7fe0862018-07-14 16:48:01 -0700495
496 if (result == NO_ERROR) {
Eric Laurent528181a2024-10-30 18:32:15 +0000497 // usecase validator is disabled by default
498 if (property_get_bool("ro.audio.usecase_validator_enabled", false /* default */)) {
499 attr = VALUE_OR_RETURN_BINDER_STATUS(
500 mUsecaseValidator->verifyAudioAttributes(output, attributionSource, attr));
501 }
Eric Laurent0d13fea2022-11-04 17:12:08 +0100502
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800503 sp<AudioPlaybackClient> client =
Eric Laurent9ff3e532022-11-10 16:04:44 +0100504 new AudioPlaybackClient(attr, output, attributionSource, session,
Eric Laurentb16eac52024-08-02 16:46:08 +0000505 portId, selectedDeviceId, stream, isSpatialized, config.channel_mask);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800506 mAudioPlaybackClients.add(portId, client);
507
508 _aidl_return->output = VALUE_OR_RETURN_BINDER_STATUS(
509 legacy2aidl_audio_io_handle_t_int32_t(output));
510 _aidl_return->stream = VALUE_OR_RETURN_BINDER_STATUS(
511 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
512 _aidl_return->selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
513 legacy2aidl_audio_port_handle_t_int32_t(selectedDeviceId));
514 _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
515 legacy2aidl_audio_port_handle_t_int32_t(portId));
516 _aidl_return->secondaryOutputs = VALUE_OR_RETURN_BINDER_STATUS(
517 convertContainer<std::vector<int32_t>>(secondaryOutputs,
518 legacy2aidl_audio_io_handle_t_int32_t));
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200519 _aidl_return->isSpatialized = isSpatialized;
jiabinc658e452022-10-21 20:52:21 +0000520 _aidl_return->isBitPerfect = isBitPerfect;
Eric Laurent0d13fea2022-11-04 17:12:08 +0100521 _aidl_return->attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -0700522 legacy2aidl_audio_attributes_t_AudioAttributes(attr));
Andy Hung6b137d12024-08-27 22:35:17 +0000523 _aidl_return->volume = volume;
Vlad Popa1e865e62024-08-15 19:11:42 -0700524 _aidl_return->muted = muted;
jiabinf1c73972022-04-14 16:28:52 -0700525 } else {
526 _aidl_return->configBase.format = VALUE_OR_RETURN_BINDER_STATUS(
527 legacy2aidl_audio_format_t_AudioFormatDescription(config.format));
528 _aidl_return->configBase.channelMask = VALUE_OR_RETURN_BINDER_STATUS(
529 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
530 config.channel_mask, false /*isInput*/));
531 _aidl_return->configBase.sampleRate = config.sample_rate;
Eric Laurentd7fe0862018-07-14 16:48:01 -0700532 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800533 return binderStatusFromStatusT(result);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700534}
535
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700536void AudioPolicyService::getPlaybackClientAndEffects(audio_port_handle_t portId,
537 sp<AudioPlaybackClient>& client,
538 sp<AudioPolicyEffects>& effects,
539 const char *context)
540{
Andy Hung79eacdb2023-11-30 19:34:24 -0800541 audio_utils::lock_guard _l(mMutex);
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700542 const ssize_t index = mAudioPlaybackClients.indexOfKey(portId);
543 if (index < 0) {
544 ALOGE("%s AudioTrack client not found for portId %d", context, portId);
545 return;
546 }
547 client = mAudioPlaybackClients.valueAt(index);
548 effects = mAudioPolicyEffects;
549}
550
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800551Status AudioPolicyService::startOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800552{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800553 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
554 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700555 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800556 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800557 }
558 ALOGV("startOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700559 sp<AudioPlaybackClient> client;
Shunkai Yao8d6489a2023-04-18 23:14:25 +0000560 sp<AudioPolicyEffects> audioPolicyEffects;
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700561
562 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
563
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700564 if (audioPolicyEffects != 0) {
565 // create audio processors according to stream
Shunkai Yao8d6489a2023-04-18 23:14:25 +0000566 status_t status = audioPolicyEffects->addOutputSessionEffects(client->io, client->stream,
567 client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700568 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700569 ALOGW("Failed to add effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700570 }
571 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800572 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700573 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700574 status_t status = mAudioPolicyManager->startOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700575 if (status == NO_ERROR) {
Eric Laurent0d13fea2022-11-04 17:12:08 +0100576 //TODO b/257922898: decide if/how we need to handle attributes update when playback starts
577 // or during playback
578 (void)mUsecaseValidator->startClient(client->io, client->portId, client->attributionSource,
579 client->attributes, nullptr /* callback */);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700580 client->active = true;
Eric Laurent15903592022-02-24 20:44:36 +0100581 onUpdateActiveSpatializerTracks_l();
Eric Laurentd7fe0862018-07-14 16:48:01 -0700582 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800583 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800584}
585
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800586Status AudioPolicyService::stopOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800587{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800588 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
589 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700590 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800591 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800592 }
593 ALOGV("stopOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700594 mOutputCommandThread->stopOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800595 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800596}
597
Eric Laurentd7fe0862018-07-14 16:48:01 -0700598status_t AudioPolicyService::doStopOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800599{
Eric Laurentd7fe0862018-07-14 16:48:01 -0700600 ALOGV("doStopOutput");
601 sp<AudioPlaybackClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700602 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentd7fe0862018-07-14 16:48:01 -0700603
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700604 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
605
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700606 if (audioPolicyEffects != 0) {
607 // release audio processors from the stream
Eric Laurentd7fe0862018-07-14 16:48:01 -0700608 status_t status = audioPolicyEffects->releaseOutputSessionEffects(
609 client->io, client->stream, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700610 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700611 ALOGW("Failed to release effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700612 }
613 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800614 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700615 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700616 status_t status = mAudioPolicyManager->stopOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700617 if (status == NO_ERROR) {
618 client->active = false;
Eric Laurent15903592022-02-24 20:44:36 +0100619 onUpdateActiveSpatializerTracks_l();
Eric Laurent0d13fea2022-11-04 17:12:08 +0100620 mUsecaseValidator->stopClient(client->io, client->portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700621 }
622 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800623}
624
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800625Status AudioPolicyService::releaseOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800626{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800627 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
628 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700629 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800630 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800631 }
632 ALOGV("releaseOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700633 mOutputCommandThread->releaseOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800634 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800635}
636
Eric Laurentd7fe0862018-07-14 16:48:01 -0700637void AudioPolicyService::doReleaseOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800638{
639 ALOGV("doReleaseOutput from tid %d", gettid());
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700640 sp<AudioPlaybackClient> client;
641 sp<AudioPolicyEffects> audioPolicyEffects;
642
643 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
644
645 if (audioPolicyEffects != 0 && client->active) {
646 // clean up effects if output was not stopped before being released
647 audioPolicyEffects->releaseOutputSessionEffects(
648 client->io, client->stream, client->session);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700649 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800650 audio_utils::lock_guard _l(mMutex);
Eric Laurent15903592022-02-24 20:44:36 +0100651 if (client != nullptr && client->active) {
652 onUpdateActiveSpatializerTracks_l();
653 }
Eric Laurentd4007242019-03-27 12:42:16 -0700654 mAudioPlaybackClients.removeItem(portId);
Eric Laurent10b71232018-04-13 18:14:44 -0700655 // called from internal thread: no need to clear caller identity
Eric Laurent8fc147b2018-07-22 19:13:55 -0700656 mAudioPolicyManager->releaseOutput(portId);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800657}
658
Mikhail Naganov1c400902023-05-17 11:48:43 -0700659Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttributes& attrAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800660 int32_t inputAidl,
661 int32_t riidAidl,
662 int32_t sessionAidl,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000663 const AttributionSourceState& attributionSource,
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700664 const AudioConfigBase& configAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800665 int32_t flagsAidl,
Eric Laurentf99edd32021-02-01 15:57:33 +0100666 int32_t selectedDeviceIdAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800667 media::GetInputForAttrResponse* _aidl_return) {
668 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -0700669 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800670 audio_io_handle_t input = VALUE_OR_RETURN_BINDER_STATUS(
671 aidl2legacy_int32_t_audio_io_handle_t(inputAidl));
672 audio_unique_id_t riid = VALUE_OR_RETURN_BINDER_STATUS(
673 aidl2legacy_int32_t_audio_unique_id_t(riidAidl));
674 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
675 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800676 audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -0700677 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl, true /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800678 audio_input_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
679 aidl2legacy_int32_t_audio_input_flags_t_mask(flagsAidl));
Eric Laurentf99edd32021-02-01 15:57:33 +0100680 audio_port_handle_t selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
681 aidl2legacy_int32_t_audio_port_handle_t(selectedDeviceIdAidl));
682
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800683 audio_port_handle_t portId;
684
Eric Laurentdce54a12014-03-10 12:19:46 -0700685 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800686 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800687 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800688
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800689 RETURN_IF_BINDER_ERROR(
690 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Hayden Gomes524159d2019-12-23 14:41:47 -0800691
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800692 audio_source_t inputSource = attr.source;
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900693 if (inputSource == AUDIO_SOURCE_DEFAULT) {
694 inputSource = AUDIO_SOURCE_MIC;
695 }
696
Eric Laurent2d388ec2014-03-07 13:25:54 -0800697 // already checked by client, but double-check in case the client wrapper is bypassed
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900698 if ((inputSource < AUDIO_SOURCE_DEFAULT)
699 || (inputSource >= AUDIO_SOURCE_CNT
700 && inputSource != AUDIO_SOURCE_HOTWORD
701 && inputSource != AUDIO_SOURCE_FM_TUNER
Carter Hsua3abb402021-10-26 11:11:20 +0800702 && inputSource != AUDIO_SOURCE_ECHO_REFERENCE
703 && inputSource != AUDIO_SOURCE_ULTRASOUND)) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800704 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800705 }
706
Atneya Nair09859fe2024-07-15 16:38:02 -0700707 RETURN_IF_BINDER_ERROR(validateUsage(attr, attributionSource));
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700708
Marvin Ramine5a122d2023-12-07 13:57:59 +0100709 uint32_t virtualDeviceId = kDefaultVirtualDeviceId;
710
Eric Laurent58a0dd82019-10-24 12:42:17 -0700711 // check calling permissions.
Eric Laurent637bd202021-09-22 11:17:11 +0200712 // Capturing from the following sources does not require permission RECORD_AUDIO
713 // as the captured audio does not come from a microphone:
714 // - FM_TUNER source is controlled by captureTunerAudioInputAllowed() or
715 // captureAudioOutputAllowed() (deprecated).
716 // - REMOTE_SUBMIX source is controlled by captureAudioOutputAllowed() if the input
717 // type is API_INPUT_MIX_EXT_POLICY_REROUTE and by AudioService if a media projection
718 // is used and input type is API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK
719 // - ECHO_REFERENCE source is controlled by captureAudioOutputAllowed()
Atneya Nair09859fe2024-07-15 16:38:02 -0700720 const auto isRecordingAllowed = audioserver_permissions() ?
721 CHECK_PERM(RECORD_AUDIO, attributionSource.uid) :
722 recordingAllowed(attributionSource, inputSource);
723 if (!(isRecordingAllowed
Eric Laurent637bd202021-09-22 11:17:11 +0200724 || inputSource == AUDIO_SOURCE_FM_TUNER
725 || inputSource == AUDIO_SOURCE_REMOTE_SUBMIX
726 || inputSource == AUDIO_SOURCE_ECHO_REFERENCE)) {
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700727 ALOGE("%s permission denied: recording not allowed for %s",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100728 __func__, attributionSource.toString().c_str());
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800729 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800730 }
731
Atneya Nair09859fe2024-07-15 16:38:02 -0700732 bool canCaptureOutput = audioserver_permissions() ?
733 CHECK_PERM(CAPTURE_AUDIO_OUTPUT, attributionSource.uid)
734 : captureAudioOutputAllowed(attributionSource);
735 bool canInterceptCallAudio = audioserver_permissions() ?
736 CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
737 : callAudioInterceptionAllowed(attributionSource);
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100738 bool isCallAudioSource = inputSource == AUDIO_SOURCE_VOICE_UPLINK
739 || inputSource == AUDIO_SOURCE_VOICE_DOWNLINK
740 || inputSource == AUDIO_SOURCE_VOICE_CALL;
741
742 if (isCallAudioSource && !canInterceptCallAudio && !canCaptureOutput) {
743 return binderStatusFromStatusT(PERMISSION_DENIED);
744 }
745 if (inputSource == AUDIO_SOURCE_ECHO_REFERENCE
Eric Laurent637bd202021-09-22 11:17:11 +0200746 && !canCaptureOutput) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800747 return binderStatusFromStatusT(PERMISSION_DENIED);
Hayden Gomesb7429922020-12-11 13:59:18 -0800748 }
Hayden Gomesb7429922020-12-11 13:59:18 -0800749 if (inputSource == AUDIO_SOURCE_FM_TUNER
Eric Laurent637bd202021-09-22 11:17:11 +0200750 && !canCaptureOutput
Atneya Nair09859fe2024-07-15 16:38:02 -0700751 && !(audioserver_permissions() ?
752 CHECK_PERM(CAPTURE_TUNER_AUDIO_INPUT, attributionSource.uid)
753 : captureTunerAudioInputAllowed(attributionSource))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800754 return binderStatusFromStatusT(PERMISSION_DENIED);
Nadav Bar744be482018-05-08 13:26:21 +0300755 }
756
Atneya Nair09859fe2024-07-15 16:38:02 -0700757 bool canCaptureHotword = audioserver_permissions() ?
758 CHECK_PERM(CAPTURE_AUDIO_HOTWORD, attributionSource.uid)
759 : captureHotwordAllowed(attributionSource);
Hiroaki Hayashi4de0b452019-07-18 19:50:47 +0900760 if ((inputSource == AUDIO_SOURCE_HOTWORD) && !canCaptureHotword) {
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800761 return binderStatusFromStatusT(PERMISSION_DENIED);
762 }
763
Atneya Nair0f0a8032022-12-12 16:20:12 -0800764 if (((flags & (AUDIO_INPUT_FLAG_HW_HOTWORD |
765 AUDIO_INPUT_FLAG_HOTWORD_TAP |
766 AUDIO_INPUT_FLAG_HW_LOOKBACK)) != 0)
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800767 && !canCaptureHotword) {
768 ALOGE("%s: permission denied: hotword mode not allowed"
Eric Laurent9ff3e532022-11-10 16:04:44 +0100769 " for uid %d pid %d", __func__, attributionSource.uid, attributionSource.pid);
Bhalchandra Gajaredea7f942021-01-27 17:28:30 -0800770 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7504b9e2017-08-15 18:17:26 -0700771 }
772
Carter Hsua3abb402021-10-26 11:11:20 +0800773 if (attr.source == AUDIO_SOURCE_ULTRASOUND) {
Atneya Nair09859fe2024-07-15 16:38:02 -0700774 if (!(audioserver_permissions() ?
775 CHECK_PERM(ACCESS_ULTRASOUND, attributionSource.uid)
776 : accessUltrasoundAllowed(attributionSource))) {
Carter Hsua3abb402021-10-26 11:11:20 +0800777 ALOGE("%s: permission denied: ultrasound not allowed for uid %d pid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100778 __func__, attributionSource.uid, attributionSource.pid);
Carter Hsua3abb402021-10-26 11:11:20 +0800779 return binderStatusFromStatusT(PERMISSION_DENIED);
780 }
781 }
782
Eric Laurent7504b9e2017-08-15 18:17:26 -0700783 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700784 {
Eric Laurent7504b9e2017-08-15 18:17:26 -0700785 status_t status;
786 AudioPolicyInterface::input_type_t inputType;
787
Andy Hung79eacdb2023-11-30 19:34:24 -0800788 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700789 {
790 AutoCallerClear acc;
791 // the audio_in_acoustics_t parameter is ignored by get_input()
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700792 status = mAudioPolicyManager->getInputForAttr(&attr, &input, riid, session,
Eric Laurent9ff3e532022-11-10 16:04:44 +0100793 attributionSource, &config,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800794 flags, &selectedDeviceId,
Marvin Ramine5a122d2023-12-07 13:57:59 +0100795 &inputType, &portId,
796 &virtualDeviceId);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700797
Eric Laurent10b71232018-04-13 18:14:44 -0700798 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700799 audioPolicyEffects = mAudioPolicyEffects;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800800
801 if (status == NO_ERROR) {
802 // enforce permission (if any) required for each type of input
803 switch (inputType) {
Kevin Rocard25f9b052019-02-27 15:08:54 -0800804 case AudioPolicyInterface::API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK:
805 // this use case has been validated in audio service with a MediaProjection token,
806 // and doesn't rely on regular permissions
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800807 case AudioPolicyInterface::API_INPUT_LEGACY:
808 break;
Eric Laurent82db2692015-08-07 13:59:42 -0700809 case AudioPolicyInterface::API_INPUT_TELEPHONY_RX:
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100810 if ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0
811 && canInterceptCallAudio) {
812 break;
813 }
Eric Laurent82db2692015-08-07 13:59:42 -0700814 // FIXME: use the same permission as for remote submix for now.
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100815 FALLTHROUGH_INTENDED;
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800816 case AudioPolicyInterface::API_INPUT_MIX_CAPTURE:
Eric Laurent1ff16a72019-03-14 18:35:04 -0700817 if (!canCaptureOutput) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100818 ALOGE("%s permission denied: capture not allowed", __func__);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800819 status = PERMISSION_DENIED;
820 }
821 break;
Atneya Nair09859fe2024-07-15 16:38:02 -0700822 case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE: {
823 bool modAudioRoutingAllowed;
824 if (audioserver_permissions()) {
825 auto result = getPermissionProvider().checkPermission(
826 MODIFY_AUDIO_ROUTING, attributionSource.uid);
827 if (!result.ok()) {
828 ALOGE("%s permission provider error: %s", __func__,
829 result.error().toString8().c_str());
830 status = aidl_utils::statusTFromBinderStatus(result.error());
831 break;
832 }
833 modAudioRoutingAllowed = result.value();
834 } else {
835 modAudioRoutingAllowed = modifyAudioRoutingAllowed(attributionSource);
836 }
837 if (!(modAudioRoutingAllowed
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100838 || ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0
839 && canInterceptCallAudio))) {
840 ALOGE("%s permission denied for remote submix capture", __func__);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800841 status = PERMISSION_DENIED;
842 }
843 break;
Atneya Nair09859fe2024-07-15 16:38:02 -0700844 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800845 case AudioPolicyInterface::API_INPUT_INVALID:
846 default:
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100847 LOG_ALWAYS_FATAL("%s encountered an invalid input type %d",
848 __func__, (int)inputType);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800849 }
Marvin Ramine5a122d2023-12-07 13:57:59 +0100850
851 if (audiopolicy_flags::record_audio_device_aware_permission()) {
852 // enforce device-aware RECORD_AUDIO permission
853 if (virtualDeviceId != kDefaultVirtualDeviceId &&
854 !recordingAllowed(attributionSource, virtualDeviceId, inputSource)) {
855 status = PERMISSION_DENIED;
856 }
857 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800858 }
859
860 if (status != NO_ERROR) {
861 if (status == PERMISSION_DENIED) {
Eric Laurent10b71232018-04-13 18:14:44 -0700862 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800863 mAudioPolicyManager->releaseInput(portId);
jiabinf1c73972022-04-14 16:28:52 -0700864 } else {
865 _aidl_return->config = VALUE_OR_RETURN_BINDER_STATUS(
866 legacy2aidl_audio_config_base_t_AudioConfigBase(config, true /*isInput*/));
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800867 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800868 return binderStatusFromStatusT(status);
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800869 }
Eric Laurentfee19762018-01-29 18:44:13 -0800870
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700871 sp<AudioRecordClient> client = new AudioRecordClient(attr, input, session, portId,
Eric Laurent9ff3e532022-11-10 16:04:44 +0100872 selectedDeviceId, attributionSource,
Marvin Ramine5a122d2023-12-07 13:57:59 +0100873 virtualDeviceId,
Eric Laurented726cc2021-07-01 14:26:41 +0200874 canCaptureOutput, canCaptureHotword,
Eric Laurent9925db52021-07-20 16:03:34 +0200875 mOutputCommandThread);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800876 mAudioRecordClients.add(portId, client);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700877 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800878
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700879 if (audioPolicyEffects != 0) {
880 // create audio pre processors according to input source
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800881 status_t status = audioPolicyEffects->addInputEffects(input, inputSource, session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700882 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800883 ALOGW("Failed to add effects on input %d", input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700884 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800885 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800886
887 _aidl_return->input = VALUE_OR_RETURN_BINDER_STATUS(
888 legacy2aidl_audio_io_handle_t_int32_t(input));
889 _aidl_return->selectedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
890 legacy2aidl_audio_port_handle_t_int32_t(selectedDeviceId));
891 _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
892 legacy2aidl_audio_port_handle_t_int32_t(portId));
893 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800894}
895
Eric Laurent99fcae42018-05-17 16:59:18 -0700896std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) {
jiabin19cdba52020-11-24 11:28:58 -0800897 struct audio_port_v7 port = {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700898 port.id = portId;
899 status_t status = mAudioPolicyManager->getAudioPort(&port);
900 if (status == NO_ERROR && port.type == AUDIO_PORT_TYPE_DEVICE) {
Andy Hung9b181952019-02-25 14:53:36 -0800901 return toString(port.ext.device.type);
Eric Laurent99fcae42018-05-17 16:59:18 -0700902 }
Andy Hung9b181952019-02-25 14:53:36 -0800903 return {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700904}
905
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800906Status AudioPolicyService::startInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800907{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800908 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
909 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
910
Eric Laurentdce54a12014-03-10 12:19:46 -0700911 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800912 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800913 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800914 sp<AudioRecordClient> client;
915 {
Andy Hung79eacdb2023-11-30 19:34:24 -0800916 audio_utils::lock_guard _l(mMutex);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800917
Eric Laurent7dca8a82018-01-29 18:44:26 -0800918 ssize_t index = mAudioRecordClients.indexOfKey(portId);
919 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800920 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800921 }
922 client = mAudioRecordClients.valueAt(index);
Eric Laurentfee19762018-01-29 18:44:13 -0800923 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800924
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700925 std::stringstream msg;
926 msg << "Audio recording on session " << client->session;
Atneya Nair38558e12024-10-25 17:59:36 -0700927
Atneya Nairdb6ef1e2024-09-16 20:26:30 +0000928 const auto permitted = startRecording(client->attributionSource, client->virtualDeviceId,
929 String16(msg.str().c_str()), client->attributes.source);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700930
Eric Laurent7dca8a82018-01-29 18:44:26 -0800931 // check calling permissions
Atneya Nair38558e12024-10-25 17:59:36 -0700932 if (permitted == PERMISSION_HARD_DENIED) {
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000933 ALOGE("%s permission denied: recording not allowed for attribution source %s",
934 __func__, client->attributionSource.toString().c_str());
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800935 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800936 }
Eric Laurentfee19762018-01-29 18:44:13 -0800937
Andy Hung79eacdb2023-11-30 19:34:24 -0800938 audio_utils::lock_guard _l(mMutex);
Eric Laurent4eb58f12018-12-07 16:41:02 -0800939
Atneya Naire7720b32023-05-10 17:26:30 -0700940 ALOGW_IF(client->silenced, "startInput on silenced input for port %d, uid %d. Unsilencing.",
941 portIdAidl,
942 client->attributionSource.uid);
943
944 if (client->active) {
945 ALOGE("Client should never be active before startInput. Uid %d port %d",
946 client->attributionSource.uid, portId);
Marvin Raminb03b49f2024-04-04 16:25:31 +0200947 finishRecording(client->attributionSource, client->virtualDeviceId,
948 client->attributes.source);
Atneya Naire7720b32023-05-10 17:26:30 -0700949 return binderStatusFromStatusT(INVALID_OPERATION);
950 }
951
Atneya Nairdb6ef1e2024-09-16 20:26:30 +0000952 // Force the possibly silenced client to match the state on the appops side
953 // following the call to startRecording (i.e. unsilenced iff call succeeded)
954 // At this point in time, the client is inactive, so no calls to appops are
955 // sent in setAppState_l. This ensures existing clients have the same
956 // behavior as new clients.
Atneya Naire7720b32023-05-10 17:26:30 -0700957 // TODO(b/282076713)
Atneya Nairdb6ef1e2024-09-16 20:26:30 +0000958 if (permitted == PERMISSION_GRANTED) {
959 setAppState_l(client, APP_STATE_TOP);
960 } else {
961 setAppState_l(client, APP_STATE_IDLE);
962 }
Atneya Naire7720b32023-05-10 17:26:30 -0700963
Eric Laurent4eb58f12018-12-07 16:41:02 -0800964 client->active = true;
965 client->startTimeNs = systemTime();
Atneya Naire7720b32023-05-10 17:26:30 -0700966 // This call updates the silenced state, and since we are active, appropriately notifies appops
967 // if we silence the track.
Eric Laurent4eb58f12018-12-07 16:41:02 -0800968 updateUidStates_l();
Eric Laurentfee19762018-01-29 18:44:13 -0800969
Eric Laurent10b71232018-04-13 18:14:44 -0700970 status_t status;
971 {
972 AutoCallerClear acc;
Eric Laurent4eb58f12018-12-07 16:41:02 -0800973 status = mAudioPolicyManager->startInput(portId);
Ray Essick84e84a52018-05-03 18:45:07 -0700974
975 }
976
Ray Essickf6a57cd2018-05-22 16:20:54 -0700977 // including successes gets very verbose
Muhammad Qureshi087b37c2020-06-16 16:37:36 -0700978 // but once we cut over to statsd, log them all.
Ray Essickf6a57cd2018-05-22 16:20:54 -0700979 if (status != NO_ERROR) {
Ray Essick84e84a52018-05-03 18:45:07 -0700980
981 static constexpr char kAudioPolicy[] = "audiopolicy";
982
Ray Essick84e84a52018-05-03 18:45:07 -0700983 static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status";
984 static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src";
985 static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg";
986 static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session";
Eric Laurent99fcae42018-05-17 16:59:18 -0700987 static constexpr char kAudioPolicyRqstDevice[] =
988 "android.media.audiopolicy.rqst.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700989 static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src";
990 static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg";
Eric Laurent99fcae42018-05-17 16:59:18 -0700991 static constexpr char kAudioPolicyActiveSession[] =
992 "android.media.audiopolicy.active.session";
993 static constexpr char kAudioPolicyActiveDevice[] =
994 "android.media.audiopolicy.active.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700995
Ray Essickf27e9872019-12-07 06:28:46 -0800996 mediametrics::Item *item = mediametrics::Item::create(kAudioPolicy);
Ray Essick84e84a52018-05-03 18:45:07 -0700997 if (item != NULL) {
998
Ray Essick84e84a52018-05-03 18:45:07 -0700999 item->setInt32(kAudioPolicyStatus, status);
1000
Eric Laurent99fcae42018-05-17 16:59:18 -07001001 item->setCString(kAudioPolicyRqstSrc,
Andy Hung9b181952019-02-25 14:53:36 -08001002 toString(client->attributes.source).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -07001003 item->setInt32(kAudioPolicyRqstSession, client->session);
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001004 if (client->attributionSource.packageName.has_value() &&
1005 client->attributionSource.packageName.value().size() != 0) {
Ray Essick51866952018-05-30 11:22:27 -07001006 item->setCString(kAudioPolicyRqstPkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001007 client->attributionSource.packageName.value().c_str());
Ray Essick51866952018-05-30 11:22:27 -07001008 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001009 item->setCString(kAudioPolicyRqstPkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001010 std::to_string(client->attributionSource.uid).c_str());
Ray Essick51866952018-05-30 11:22:27 -07001011 }
Eric Laurent99fcae42018-05-17 16:59:18 -07001012 item->setCString(
1013 kAudioPolicyRqstDevice, getDeviceTypeStrForPortId(client->deviceId).c_str());
1014
Eric Laurent4eb58f12018-12-07 16:41:02 -08001015 int count = mAudioRecordClients.size();
1016 for (int i = 0; i < count ; i++) {
1017 if (portId == mAudioRecordClients.keyAt(i)) {
1018 continue;
1019 }
1020 sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
1021 if (other->active) {
1022 // keeps the last of the clients marked active
1023 item->setCString(kAudioPolicyActiveSrc,
Andy Hung9b181952019-02-25 14:53:36 -08001024 toString(other->attributes.source).c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -08001025 item->setInt32(kAudioPolicyActiveSession, other->session);
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001026 if (other->attributionSource.packageName.has_value() &&
1027 other->attributionSource.packageName.value().size() != 0) {
Eric Laurent4eb58f12018-12-07 16:41:02 -08001028 item->setCString(kAudioPolicyActivePkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001029 other->attributionSource.packageName.value().c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -08001030 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001031 item->setCString(kAudioPolicyRqstPkg, std::to_string(
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001032 other->attributionSource.uid).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -07001033 }
Eric Laurent4eb58f12018-12-07 16:41:02 -08001034 item->setCString(kAudioPolicyActiveDevice,
1035 getDeviceTypeStrForPortId(other->deviceId).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -07001036 }
1037 }
1038 item->selfrecord();
1039 delete item;
1040 item = NULL;
1041 }
Ray Essick6ce27e52019-02-15 10:58:05 -08001042 }
1043
1044 if (status != NO_ERROR) {
Eric Laurent4eb58f12018-12-07 16:41:02 -08001045 client->active = false;
1046 client->startTimeNs = 0;
1047 updateUidStates_l();
Atneya Nairdb6ef1e2024-09-16 20:26:30 +00001048 if (!client->silenced) {
1049 finishRecording(client->attributionSource, client->virtualDeviceId,
1050 client->attributes.source);
1051 }
Eric Laurentfb66dd92016-01-28 18:32:03 -08001052 }
1053
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001054 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001055}
1056
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001057Status AudioPolicyService::stopInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001058{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001059 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
1060 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1061
Eric Laurentdce54a12014-03-10 12:19:46 -07001062 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001063 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001064 }
Eric Laurent4eb58f12018-12-07 16:41:02 -08001065
Andy Hung79eacdb2023-11-30 19:34:24 -08001066 audio_utils::lock_guard _l(mMutex);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001067
Eric Laurentfee19762018-01-29 18:44:13 -08001068 ssize_t index = mAudioRecordClients.indexOfKey(portId);
1069 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001070 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurentfee19762018-01-29 18:44:13 -08001071 }
1072 sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
1073
Ray Essick84e84a52018-05-03 18:45:07 -07001074 client->active = false;
Eric Laurent4eb58f12018-12-07 16:41:02 -08001075 client->startTimeNs = 0;
1076
1077 updateUidStates_l();
Ray Essick84e84a52018-05-03 18:45:07 -07001078
Svet Ganov6e641372018-03-02 09:21:30 -08001079 // finish the recording app op
Atneya Nairdb6ef1e2024-09-16 20:26:30 +00001080 if (!client->silenced) {
1081 finishRecording(client->attributionSource, client->virtualDeviceId,
1082 client->attributes.source);
1083 }
1084
Eric Laurent10b71232018-04-13 18:14:44 -07001085 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001086 return binderStatusFromStatusT(mAudioPolicyManager->stopInput(portId));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001087}
1088
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001089Status AudioPolicyService::releaseInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001090{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001091 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
1092 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1093
Eric Laurentdce54a12014-03-10 12:19:46 -07001094 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001095 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001096 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001097 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -08001098 sp<AudioRecordClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001099 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001100 audio_utils::lock_guard _l(mMutex);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001101 audioPolicyEffects = mAudioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -08001102 ssize_t index = mAudioRecordClients.indexOfKey(portId);
1103 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001104 return Status::ok();
Eric Laurentfee19762018-01-29 18:44:13 -08001105 }
1106 client = mAudioRecordClients.valueAt(index);
Eric Laurent4eb58f12018-12-07 16:41:02 -08001107
1108 if (client->active) {
1109 ALOGW("%s releasing active client portId %d", __FUNCTION__, portId);
1110 client->active = false;
1111 client->startTimeNs = 0;
1112 updateUidStates_l();
1113 }
1114
Eric Laurentfee19762018-01-29 18:44:13 -08001115 mAudioRecordClients.removeItem(portId);
1116 }
1117 if (client == 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001118 return Status::ok();
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001119 }
1120 if (audioPolicyEffects != 0) {
1121 // release audio processors from the input
Eric Laurentd7fe0862018-07-14 16:48:01 -07001122 status_t status = audioPolicyEffects->releaseInputEffects(client->io, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001123 if(status != NO_ERROR) {
Eric Laurentd7fe0862018-07-14 16:48:01 -07001124 ALOGW("Failed to release effects on input %d", client->io);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001125 }
Eric Laurent2d388ec2014-03-07 13:25:54 -08001126 }
Eric Laurentf10c7092016-12-06 17:09:56 -08001127 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001128 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001129 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -07001130 mAudioPolicyManager->releaseInput(portId);
Eric Laurentf10c7092016-12-06 17:09:56 -08001131 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001132 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001133}
1134
Vlad Popa87e0e582024-05-20 18:49:20 -07001135Status AudioPolicyService::setDeviceAbsoluteVolumeEnabled(const AudioDevice& deviceAidl,
1136 bool enabled,
1137 AudioStreamType streamToDriveAbsAidl) {
Vlad Popa08502d82024-10-22 20:17:47 -07001138 ALOGI("%s: deviceAidl %s, enabled %d, streamToDriveAbsAidl %d", __func__,
1139 deviceAidl.toString().c_str(), enabled, streamToDriveAbsAidl);
1140
Vlad Popae2c51382024-10-22 21:07:42 -07001141 audio_stream_type_t streamToDriveAbs = AUDIO_STREAM_DEFAULT;
1142 if (enabled) {
1143 streamToDriveAbs = VALUE_OR_RETURN_BINDER_STATUS(
1144 aidl2legacy_AudioStreamType_audio_stream_type_t(streamToDriveAbsAidl));
1145 }
1146
Vlad Popa87e0e582024-05-20 18:49:20 -07001147 audio_devices_t deviceType;
1148 std::string address;
1149 RETURN_BINDER_STATUS_IF_ERROR(
1150 aidl2legacy_AudioDevice_audio_device(deviceAidl, &deviceType, &address));
1151
1152 if (mAudioPolicyManager == nullptr) {
1153 return binderStatusFromStatusT(NO_INIT);
1154 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001155 if (!(audioserver_permissions() ?
1156 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1157 : settingsAllowed())) {
Vlad Popa87e0e582024-05-20 18:49:20 -07001158 return binderStatusFromStatusT(PERMISSION_DENIED);
1159 }
Vlad Popae2c51382024-10-22 21:07:42 -07001160
Vlad Popa87e0e582024-05-20 18:49:20 -07001161 audio_utils::lock_guard _l(mMutex);
1162 AutoCallerClear acc;
1163 return binderStatusFromStatusT(
1164 mAudioPolicyManager->setDeviceAbsoluteVolumeEnabled(deviceType, address.c_str(),
1165 enabled, streamToDriveAbs));
1166}
1167
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001168Status AudioPolicyService::initStreamVolume(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001169 int32_t indexMinAidl,
1170 int32_t indexMaxAidl) {
1171 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1172 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1173 int indexMin = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMinAidl));
1174 int indexMax = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMaxAidl));
1175
Eric Laurentdce54a12014-03-10 12:19:46 -07001176 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001177 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001178 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001179 if (!(audioserver_permissions() ?
1180 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1181 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001182 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001183 }
Eric Laurent223fd5c2014-11-11 13:43:36 -08001184 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001185 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001186 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001187 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001188 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -07001189 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001190 return binderStatusFromStatusT(NO_ERROR);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001191}
1192
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001193Status AudioPolicyService::setStreamVolumeIndex(AudioStreamType streamAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001194 const AudioDeviceDescription& deviceAidl,
Vlad Popa1e865e62024-08-15 19:11:42 -07001195 int32_t indexAidl, bool muted) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001196 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1197 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1198 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1199 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001200 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001201
Eric Laurentdce54a12014-03-10 12:19:46 -07001202 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001203 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001204 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001205 if (!(audioserver_permissions() ?
1206 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1207 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001208 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001209 }
Eric Laurent223fd5c2014-11-11 13:43:36 -08001210 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001211 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001212 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001213 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001214 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001215 return binderStatusFromStatusT(mAudioPolicyManager->setStreamVolumeIndex(stream,
1216 index,
Vlad Popa1e865e62024-08-15 19:11:42 -07001217 muted,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001218 device));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001219}
1220
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001221Status AudioPolicyService::getStreamVolumeIndex(AudioStreamType streamAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001222 const AudioDeviceDescription& deviceAidl,
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001223 int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001224 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1225 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1226 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001227 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001228 int index;
1229
Eric Laurentdce54a12014-03-10 12:19:46 -07001230 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001231 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001232 }
Eric Laurent223fd5c2014-11-11 13:43:36 -08001233 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001234 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001235 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001236 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001237 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001238 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1239 mAudioPolicyManager->getStreamVolumeIndex(stream, &index, device)));
1240 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1241 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001242}
1243
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001244Status AudioPolicyService::setVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001245 const media::audio::common::AudioAttributes& attrAidl,
Vlad Popa1e865e62024-08-15 19:11:42 -07001246 const AudioDeviceDescription& deviceAidl, int32_t indexAidl, bool muted) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001247 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001248 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001249 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1250 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001251 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001252 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1253 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1254
François Gaffiecfe17322018-11-07 13:41:29 +01001255 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001256 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001257 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001258 if (!(audioserver_permissions() ?
1259 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1260 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001261 return binderStatusFromStatusT(PERMISSION_DENIED);
François Gaffiecfe17322018-11-07 13:41:29 +01001262 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001263 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001264 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001265 return binderStatusFromStatusT(
Vlad Popa1e865e62024-08-15 19:11:42 -07001266 mAudioPolicyManager->setVolumeIndexForAttributes(attributes, index, muted, device));
François Gaffiecfe17322018-11-07 13:41:29 +01001267}
1268
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001269Status AudioPolicyService::getVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001270 const media::audio::common::AudioAttributes& attrAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001271 const AudioDeviceDescription& deviceAidl, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001272 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001273 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001274 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001275 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001276 int index;
1277 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1278 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1279
François Gaffiecfe17322018-11-07 13:41:29 +01001280 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001281 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001282 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001283 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001284 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001285 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1286 mAudioPolicyManager->getVolumeIndexForAttributes(attributes, index, device)));
1287 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1288 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001289}
1290
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001291Status AudioPolicyService::getMinVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001292 const media::audio::common::AudioAttributes& attrAidl, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001293 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001294 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001295 int index;
1296 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1297 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1298
François Gaffiecfe17322018-11-07 13:41:29 +01001299 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001300 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001301 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001302 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001303 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001304 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1305 mAudioPolicyManager->getMinVolumeIndexForAttributes(attributes, index)));
1306 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1307 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001308}
1309
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001310Status AudioPolicyService::getMaxVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001311 const media::audio::common::AudioAttributes& attrAidl, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001312 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001313 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001314 int index;
1315 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1316 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1317
François Gaffiecfe17322018-11-07 13:41:29 +01001318 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001319 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001320 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001321 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001322 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001323 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1324 mAudioPolicyManager->getMaxVolumeIndexForAttributes(attributes, index)));
1325 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1326 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001327}
1328
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001329Status AudioPolicyService::getStrategyForStream(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001330 int32_t* _aidl_return) {
1331 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1332 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1333
Eric Laurent223fd5c2014-11-11 13:43:36 -08001334 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001335 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1336 convertReinterpret<int32_t>(PRODUCT_STRATEGY_NONE));
1337 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001338 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001339 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001340 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001341 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001342
François Gaffiec005e562018-11-06 15:04:49 +01001343 // DO NOT LOCK, may be called from AudioFlinger with lock held, reaching deadlock
Eric Laurent10b71232018-04-13 18:14:44 -07001344 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001345 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1346 legacy2aidl_product_strategy_t_int32_t(
1347 mAudioPolicyManager->getStrategyForStream(stream)));
1348 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001349}
1350
Mikhail Naganov1c400902023-05-17 11:48:43 -07001351Status AudioPolicyService::getDevicesForAttributes(
1352 const media::audio::common::AudioAttributes& attrAidl,
1353 bool forVolume,
1354 std::vector<AudioDevice>* _aidl_return)
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001355{
François Gaffie1e2b56f2022-04-01 14:34:29 +02001356 audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001357 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001358 AudioDeviceTypeAddrVector devices;
1359
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001360 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001361 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001362 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001363 audio_utils::lock_guard _l(mMutex);
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001364 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001365 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
François Gaffie1e2b56f2022-04-01 14:34:29 +02001366 mAudioPolicyManager->getDevicesForAttributes(aa, &devices, forVolume)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001367 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001368 convertContainer<std::vector<AudioDevice>>(devices,
1369 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001370 return Status::ok();
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001371}
1372
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001373Status AudioPolicyService::getOutputForEffect(const media::EffectDescriptor& descAidl,
1374 int32_t* _aidl_return) {
1375 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1376 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1377 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1378 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1379
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 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1386 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutputForEffect(&desc)));
1387 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001388}
1389
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001390Status AudioPolicyService::registerEffect(const media::EffectDescriptor& descAidl, int32_t ioAidl,
1391 int32_t strategyAidl, int32_t sessionAidl,
1392 int32_t idAidl) {
1393 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1394 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1395 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1396 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1397 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
1398 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
1399 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1400 aidl2legacy_int32_t_audio_session_t(sessionAidl));
1401 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
1402 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1403 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1404
Eric Laurentdce54a12014-03-10 12:19:46 -07001405 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001406 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001407 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001408 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001409 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001410 return binderStatusFromStatusT(
1411 mAudioPolicyManager->registerEffect(&desc, io, strategy, session, id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001412}
1413
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001414Status AudioPolicyService::unregisterEffect(int32_t idAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001415{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001416 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001417 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001418 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001419 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001420 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001421 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001422 return binderStatusFromStatusT(mAudioPolicyManager->unregisterEffect(id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001423}
1424
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001425Status AudioPolicyService::setEffectEnabled(int32_t idAidl, bool enabled)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001426{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001427 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
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 return binderStatusFromStatusT(mAudioPolicyManager->setEffectEnabled(id, enabled));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001434}
1435
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001436Status AudioPolicyService::moveEffectsToIo(const std::vector<int32_t>& idsAidl, int32_t ioAidl)
1437
Eric Laurent6c796322019-04-09 14:13:17 -07001438{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001439 const std::vector<int>& ids = VALUE_OR_RETURN_BINDER_STATUS(
1440 convertContainer<std::vector<int>>(idsAidl, convertReinterpret<int, int32_t>));
1441 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1442 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1443 if (ids.size() > MAX_ITEMS_PER_LIST) {
1444 return binderStatusFromStatusT(BAD_VALUE);
1445 }
1446
Eric Laurent6c796322019-04-09 14:13:17 -07001447 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001448 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6c796322019-04-09 14:13:17 -07001449 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001450 audio_utils::lock_guard _l(mMutex);
Eric Laurent6c796322019-04-09 14:13:17 -07001451 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001452 return binderStatusFromStatusT(mAudioPolicyManager->moveEffectsToIo(ids, io));
Eric Laurent6c796322019-04-09 14:13:17 -07001453}
1454
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001455Status AudioPolicyService::isStreamActive(AudioStreamType streamAidl, int32_t inPastMsAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001456 bool* _aidl_return) {
1457 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1458 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1459 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1460
Eric Laurent223fd5c2014-11-11 13:43:36 -08001461 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001462 *_aidl_return = false;
1463 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001464 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001465 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001466 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001467 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001468 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001469 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001470 *_aidl_return = mAudioPolicyManager->isStreamActive(stream, inPastMs);
1471 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001472}
1473
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001474Status AudioPolicyService::isStreamActiveRemotely(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001475 int32_t inPastMsAidl,
1476 bool* _aidl_return) {
1477 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1478 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1479 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1480
Eric Laurent223fd5c2014-11-11 13:43:36 -08001481 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001482 *_aidl_return = false;
1483 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001484 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001485 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001486 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001487 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001488 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001489 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001490 *_aidl_return = mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
1491 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001492}
1493
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001494Status AudioPolicyService::isSourceActive(AudioSource sourceAidl, bool* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001495 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001496 aidl2legacy_AudioSource_audio_source_t(sourceAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001497 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001498 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001499 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001500 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001501 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001502 *_aidl_return = mAudioPolicyManager->isSourceActive(source);
1503 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001504}
1505
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001506status_t AudioPolicyService::getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001507{
Eric Laurentdce54a12014-03-10 12:19:46 -07001508 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -08001509 return NO_INIT;
1510 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001511 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001512 audio_utils::lock_guard _l(mMutex);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001513 audioPolicyEffects = mAudioPolicyEffects;
1514 }
1515 if (audioPolicyEffects == 0) {
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001516 return NO_INIT;
1517 }
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001518
1519 return OK;
1520}
1521
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001522Status AudioPolicyService::queryDefaultPreProcessing(
1523 int32_t audioSessionAidl,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001524 Int* countAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001525 std::vector<media::EffectDescriptor>* _aidl_return) {
1526 audio_session_t audioSession = VALUE_OR_RETURN_BINDER_STATUS(
1527 aidl2legacy_int32_t_audio_session_t(audioSessionAidl));
1528 uint32_t count = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(countAidl->value));
1529 if (count > AudioEffect::kMaxPreProcessing) {
1530 count = AudioEffect::kMaxPreProcessing;
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001531 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001532 uint32_t countReq = count;
1533 std::unique_ptr<effect_descriptor_t[]> descriptors(new effect_descriptor_t[count]);
1534
1535 sp<AudioPolicyEffects> audioPolicyEffects;
1536 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
1537 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->queryDefaultInputEffects(
1538 (audio_session_t) audioSession, descriptors.get(), &count)));
1539 countReq = std::min(count, countReq);
1540 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1541 convertRange(descriptors.get(), descriptors.get() + countReq,
1542 std::back_inserter(*_aidl_return),
1543 legacy2aidl_effect_descriptor_t_EffectDescriptor)));
1544 countAidl->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(count));
1545 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001546}
1547
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001548Status AudioPolicyService::addSourceDefaultEffect(const AudioUuid& typeAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001549 const std::string& opPackageNameAidl,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001550 const AudioUuid& uuidAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001551 int32_t priority,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001552 AudioSource sourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001553 int32_t* _aidl_return) {
1554 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1555 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1556 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1557 aidl2legacy_string_view_String16(opPackageNameAidl));
1558 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1559 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1560 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001561 aidl2legacy_AudioSource_audio_source_t(sourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001562 audio_unique_id_t id;
1563
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001564 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001565 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001566 if (!(audioserver_permissions() ?
1567 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1568 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001569 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001570 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001571 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addSourceDefaultEffect(
1572 &type, opPackageName, &uuid, priority, source, &id)));
1573 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1574 return Status::ok();
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001575}
1576
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001577Status AudioPolicyService::addStreamDefaultEffect(const AudioUuid& typeAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001578 const std::string& opPackageNameAidl,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001579 const AudioUuid& uuidAidl,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001580 int32_t priority, AudioUsage usageAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001581 int32_t* _aidl_return) {
1582 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1583 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1584 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1585 aidl2legacy_string_view_String16(opPackageNameAidl));
1586 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1587 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1588 audio_usage_t usage = VALUE_OR_RETURN_BINDER_STATUS(
1589 aidl2legacy_AudioUsage_audio_usage_t(usageAidl));
1590 audio_unique_id_t id;
1591
1592 sp<AudioPolicyEffects> audioPolicyEffects;
1593 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001594 if (!(audioserver_permissions() ?
1595 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1596 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001597 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001598 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001599 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addStreamDefaultEffect(
1600 &type, opPackageName, &uuid, priority, usage, &id)));
1601 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1602 return Status::ok();
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001603}
1604
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001605Status AudioPolicyService::removeSourceDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001606{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001607 audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1608 aidl2legacy_int32_t_audio_unique_id_t(idAidl));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001609 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001610 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001611 if (!(audioserver_permissions() ?
1612 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1613 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001614 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001615 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001616 return binderStatusFromStatusT(audioPolicyEffects->removeSourceDefaultEffect(id));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001617}
1618
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001619Status AudioPolicyService::removeStreamDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001620{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001621 audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1622 aidl2legacy_int32_t_audio_unique_id_t(idAidl));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001623 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001624 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001625 if (!(audioserver_permissions() ?
1626 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1627 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001628 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001629 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001630 return binderStatusFromStatusT(audioPolicyEffects->removeStreamDefaultEffect(id));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001631}
1632
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001633Status AudioPolicyService::setSupportedSystemUsages(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001634 const std::vector<AudioUsage>& systemUsagesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001635 size_t size = systemUsagesAidl.size();
1636 if (size > MAX_ITEMS_PER_LIST) {
1637 size = MAX_ITEMS_PER_LIST;
1638 }
1639 std::vector<audio_usage_t> systemUsages;
1640 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1641 convertRange(systemUsagesAidl.begin(), systemUsagesAidl.begin() + size,
1642 std::back_inserter(systemUsages), aidl2legacy_AudioUsage_audio_usage_t)));
1643
Andy Hung79eacdb2023-11-30 19:34:24 -08001644 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001645 if (!(audioserver_permissions() ?
1646 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1647 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001648 return binderStatusFromStatusT(PERMISSION_DENIED);
Hayden Gomes524159d2019-12-23 14:41:47 -08001649 }
1650
1651 bool areAllSystemUsages = std::all_of(begin(systemUsages), end(systemUsages),
1652 [](audio_usage_t usage) { return isSystemUsage(usage); });
1653 if (!areAllSystemUsages) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001654 return binderStatusFromStatusT(BAD_VALUE);
Hayden Gomes524159d2019-12-23 14:41:47 -08001655 }
1656
1657 mSupportedSystemUsages = systemUsages;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001658 return Status::ok();
Hayden Gomes524159d2019-12-23 14:41:47 -08001659}
1660
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001661Status AudioPolicyService::setAllowedCapturePolicy(int32_t uidAidl, int32_t capturePolicyAidl) {
1662 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1663 audio_flags_mask_t capturePolicy = VALUE_OR_RETURN_BINDER_STATUS(
1664 aidl2legacy_int32_t_audio_flags_mask_t_mask(capturePolicyAidl));
1665
Andy Hung79eacdb2023-11-30 19:34:24 -08001666 audio_utils::lock_guard _l(mMutex);
Kevin Rocardb99cc752019-03-21 20:52:24 -07001667 if (mAudioPolicyManager == NULL) {
1668 ALOGV("%s() mAudioPolicyManager == NULL", __func__);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001669 return binderStatusFromStatusT(NO_INIT);
Kevin Rocardb99cc752019-03-21 20:52:24 -07001670 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001671 return binderStatusFromStatusT(
1672 mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy));
Kevin Rocardb99cc752019-03-21 20:52:24 -07001673}
1674
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001675Status AudioPolicyService::getOffloadSupport(const AudioOffloadInfo& infoAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001676 media::AudioOffloadMode* _aidl_return) {
1677 audio_offload_info_t info = VALUE_OR_RETURN_BINDER_STATUS(
1678 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(infoAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001679 if (mAudioPolicyManager == NULL) {
1680 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001681 return binderStatusFromStatusT(AUDIO_OFFLOAD_NOT_SUPPORTED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001682 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001683 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001684 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001685 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_offload_mode_t_AudioOffloadMode(
1686 mAudioPolicyManager->getOffloadSupport(info)));
1687 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001688}
1689
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001690Status AudioPolicyService::isDirectOutputSupported(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001691 const AudioConfigBase& configAidl,
Mikhail Naganov1c400902023-05-17 11:48:43 -07001692 const media::audio::common::AudioAttributes& attributesAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001693 bool* _aidl_return) {
1694 audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001695 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl, false /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001696 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001697 aidl2legacy_AudioAttributes_audio_attributes_t(attributesAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001698 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1699 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1700
Michael Chana94fbb22018-04-24 14:31:19 +10001701 if (mAudioPolicyManager == NULL) {
1702 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001703 return binderStatusFromStatusT(NO_INIT);
Michael Chana94fbb22018-04-24 14:31:19 +10001704 }
Hayden Gomes524159d2019-12-23 14:41:47 -08001705
Atneya Nair09859fe2024-07-15 16:38:02 -07001706 RETURN_IF_BINDER_ERROR(validateUsage(attributes));
Hayden Gomes524159d2019-12-23 14:41:47 -08001707
Andy Hung79eacdb2023-11-30 19:34:24 -08001708 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001709 *_aidl_return = mAudioPolicyManager->isDirectOutputSupported(config, attributes);
1710 return Status::ok();
Michael Chana94fbb22018-04-24 14:31:19 +10001711}
1712
Atneya Nair23348762024-10-14 14:16:06 -07001713template <typename Port>
1714void anonymizePortBluetoothAddress(Port& port) {
1715 if (port.type != AUDIO_PORT_TYPE_DEVICE) {
1716 return;
1717 }
1718 if (!(audio_is_a2dp_device(port.ext.device.type)
1719 || audio_is_ble_device(port.ext.device.type)
1720 || audio_is_bluetooth_sco_device(port.ext.device.type)
1721 || audio_is_hearing_aid_out_device(port.ext.device.type))) {
1722 return;
1723 }
1724 anonymizeBluetoothAddress(port.ext.device.address);
1725}
Michael Chana94fbb22018-04-24 14:31:19 +10001726
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001727Status AudioPolicyService::listAudioPorts(media::AudioPortRole roleAidl,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001728 media::AudioPortType typeAidl, Int* count,
Atneya Nair638a6e42022-12-18 16:45:15 -08001729 std::vector<media::AudioPortFw>* portsAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001730 int32_t* _aidl_return) {
1731 audio_port_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
1732 aidl2legacy_AudioPortRole_audio_port_role_t(roleAidl));
1733 audio_port_type_t type = VALUE_OR_RETURN_BINDER_STATUS(
1734 aidl2legacy_AudioPortType_audio_port_type_t(typeAidl));
1735 unsigned int num_ports = VALUE_OR_RETURN_BINDER_STATUS(
1736 convertIntegral<unsigned int>(count->value));
1737 if (num_ports > MAX_ITEMS_PER_LIST) {
1738 num_ports = MAX_ITEMS_PER_LIST;
1739 }
1740 unsigned int numPortsReq = num_ports;
1741 std::unique_ptr<audio_port_v7[]> ports(new audio_port_v7[num_ports]);
1742 unsigned int generation;
1743
Atneya Nair23348762024-10-14 14:16:06 -07001744 const AttributionSourceState attributionSource = getCallingAttributionSource();
Eric Laurent10b71232018-04-13 18:14:44 -07001745 AutoCallerClear acc;
Atneya Nair23348762024-10-14 14:16:06 -07001746 {
1747 audio_utils::lock_guard _l(mMutex);
1748 if (mAudioPolicyManager == NULL) {
1749 return binderStatusFromStatusT(NO_INIT);
1750 }
1751 // AudioPolicyManager->listAudioPorts makes a deep copy of port structs into ports
1752 // so it is safe to access after releasing the mutex
1753 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1754 mAudioPolicyManager->listAudioPorts(
1755 role, type, &num_ports, ports.get(), &generation)));
1756 numPortsReq = std::min(numPortsReq, num_ports);
1757 }
1758
1759 if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__))) {
1760 for (size_t i = 0; i < numPortsReq; ++i) {
1761 anonymizePortBluetoothAddress(ports[i]);
1762 }
1763 }
1764
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001765 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1766 convertRange(ports.get(), ports.get() + numPortsReq, std::back_inserter(*portsAidl),
Mikhail Naganov87227252023-01-13 17:38:10 -08001767 legacy2aidl_audio_port_v7_AudioPortFw)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001768 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_ports));
1769 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1770 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001771}
1772
Mikhail Naganov5edc5ed2023-03-23 14:52:15 -07001773Status AudioPolicyService::listDeclaredDevicePorts(media::AudioPortRole role,
1774 std::vector<media::AudioPortFw>* _aidl_return) {
Andy Hung79eacdb2023-11-30 19:34:24 -08001775 audio_utils::lock_guard _l(mMutex);
Mikhail Naganov5edc5ed2023-03-23 14:52:15 -07001776 if (mAudioPolicyManager == NULL) {
1777 return binderStatusFromStatusT(NO_INIT);
1778 }
1779 AutoCallerClear acc;
1780 return binderStatusFromStatusT(mAudioPolicyManager->listDeclaredDevicePorts(
1781 role, _aidl_return));
1782}
1783
Mikhail Naganov17031562022-02-23 23:00:27 +00001784Status AudioPolicyService::getAudioPort(int portId,
Atneya Nair638a6e42022-12-18 16:45:15 -08001785 media::AudioPortFw* _aidl_return) {
Mikhail Naganov17031562022-02-23 23:00:27 +00001786 audio_port_v7 port{ .id = portId };
Atneya Nair23348762024-10-14 14:16:06 -07001787
1788 const AttributionSourceState attributionSource = getCallingAttributionSource();
Eric Laurent10b71232018-04-13 18:14:44 -07001789 AutoCallerClear acc;
Atneya Nair23348762024-10-14 14:16:06 -07001790
1791 {
1792 audio_utils::lock_guard _l(mMutex);
1793 if (mAudioPolicyManager == NULL) {
1794 return binderStatusFromStatusT(NO_INIT);
1795 }
1796 // AudioPolicyManager->getAudioPort makes a deep copy of the port struct into port
1797 // so it is safe to access after releasing the mutex
1798 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(mAudioPolicyManager->getAudioPort(&port)));
1799 }
1800
1801 if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__))) {
1802 anonymizePortBluetoothAddress(port);
1803 }
1804
Mikhail Naganov87227252023-01-13 17:38:10 -08001805 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_v7_AudioPortFw(port));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001806 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001807}
1808
Atneya Nair3afdbd12022-12-18 16:14:18 -08001809Status AudioPolicyService::createAudioPatch(const media::AudioPatchFw& patchAidl,
1810 int32_t handleAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001811 int32_t* _aidl_return) {
1812 audio_patch patch = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov87227252023-01-13 17:38:10 -08001813 aidl2legacy_AudioPatchFw_audio_patch(patchAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001814 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1815 aidl2legacy_int32_t_audio_port_handle_t(handleAidl));
1816 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPatch(patch)));
1817
Andy Hung79eacdb2023-11-30 19:34:24 -08001818 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001819 if (!(audioserver_permissions() ?
1820 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1821 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001822 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001823 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001824 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001825 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001826 }
Eric Laurent10b71232018-04-13 18:14:44 -07001827 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001828 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1829 mAudioPolicyManager->createAudioPatch(&patch, &handle,
1830 IPCThreadState::self()->getCallingUid())));
1831 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_patch_handle_t_int32_t(handle));
1832 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001833}
1834
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001835Status AudioPolicyService::releaseAudioPatch(int32_t handleAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001836{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001837 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1838 aidl2legacy_int32_t_audio_patch_handle_t(handleAidl));
Andy Hung79eacdb2023-11-30 19:34:24 -08001839 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001840 if (!(audioserver_permissions() ?
1841 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1842 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001843 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001844 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001845 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001846 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001847 }
Eric Laurent10b71232018-04-13 18:14:44 -07001848 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001849 return binderStatusFromStatusT(
1850 mAudioPolicyManager->releaseAudioPatch(handle,
1851 IPCThreadState::self()->getCallingUid()));
Eric Laurent203b1a12014-04-01 10:34:16 -07001852}
1853
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001854Status AudioPolicyService::listAudioPatches(Int* count,
Atneya Nair3afdbd12022-12-18 16:14:18 -08001855 std::vector<media::AudioPatchFw>* patchesAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001856 int32_t* _aidl_return) {
1857 unsigned int num_patches = VALUE_OR_RETURN_BINDER_STATUS(
1858 convertIntegral<unsigned int>(count->value));
1859 if (num_patches > MAX_ITEMS_PER_LIST) {
1860 num_patches = MAX_ITEMS_PER_LIST;
1861 }
1862 unsigned int numPatchesReq = num_patches;
1863 std::unique_ptr<audio_patch[]> patches(new audio_patch[num_patches]);
1864 unsigned int generation;
1865
Atneya Nair23348762024-10-14 14:16:06 -07001866 const AttributionSourceState attributionSource = getCallingAttributionSource();
Eric Laurent10b71232018-04-13 18:14:44 -07001867 AutoCallerClear acc;
Atneya Nair23348762024-10-14 14:16:06 -07001868
1869 {
1870 audio_utils::lock_guard _l(mMutex);
1871 if (mAudioPolicyManager == NULL) {
1872 return binderStatusFromStatusT(NO_INIT);
1873 }
1874 // AudioPolicyManager->listAudioPatches makes a deep copy of patches structs into patches
1875 // so it is safe to access after releasing the mutex
1876 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1877 mAudioPolicyManager->listAudioPatches(&num_patches, patches.get(), &generation)));
1878 numPatchesReq = std::min(numPatchesReq, num_patches);
1879 }
1880
1881 if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__))) {
1882 for (size_t i = 0; i < numPatchesReq; ++i) {
1883 for (size_t j = 0; j < patches[i].num_sources; ++j) {
1884 anonymizePortBluetoothAddress(patches[i].sources[j]);
1885 }
1886 for (size_t j = 0; j < patches[i].num_sinks; ++j) {
1887 anonymizePortBluetoothAddress(patches[i].sinks[j]);
1888 }
1889 }
1890 }
1891
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001892 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1893 convertRange(patches.get(), patches.get() + numPatchesReq,
Mikhail Naganov87227252023-01-13 17:38:10 -08001894 std::back_inserter(*patchesAidl), legacy2aidl_audio_patch_AudioPatchFw)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001895 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_patches));
1896 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1897 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001898}
1899
Atneya Nair7a9594f2022-12-18 17:26:26 -08001900Status AudioPolicyService::setAudioPortConfig(const media::AudioPortConfigFw& configAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001901{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001902 audio_port_config config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov87227252023-01-13 17:38:10 -08001903 aidl2legacy_AudioPortConfigFw_audio_port_config(configAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001904 RETURN_IF_BINDER_ERROR(
1905 binderStatusFromStatusT(AudioValidator::validateAudioPortConfig(config)));
1906
Andy Hung79eacdb2023-11-30 19:34:24 -08001907 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001908 if (!(audioserver_permissions() ?
1909 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1910 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001911 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001912 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001913 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001914 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001915 }
Eric Laurent10b71232018-04-13 18:14:44 -07001916 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001917 return binderStatusFromStatusT(mAudioPolicyManager->setAudioPortConfig(&config));
Eric Laurent203b1a12014-04-01 10:34:16 -07001918}
Eric Laurent2d388ec2014-03-07 13:25:54 -08001919
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001920Status AudioPolicyService::acquireSoundTriggerSession(media::SoundTriggerSession* _aidl_return)
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001921{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001922 audio_session_t session;
1923 audio_io_handle_t ioHandle;
1924 audio_devices_t device;
1925
1926 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001927 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001928 if (mAudioPolicyManager == NULL) {
1929 return binderStatusFromStatusT(NO_INIT);
1930 }
1931 AutoCallerClear acc;
1932 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1933 mAudioPolicyManager->acquireSoundTriggerSession(&session, &ioHandle, &device)));
1934 }
1935
1936 _aidl_return->session = VALUE_OR_RETURN_BINDER_STATUS(
1937 legacy2aidl_audio_session_t_int32_t(session));
1938 _aidl_return->ioHandle = VALUE_OR_RETURN_BINDER_STATUS(
1939 legacy2aidl_audio_io_handle_t_int32_t(ioHandle));
1940 _aidl_return->device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001941 legacy2aidl_audio_devices_t_AudioDeviceDescription(device));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001942 return Status::ok();
1943}
1944
1945Status AudioPolicyService::releaseSoundTriggerSession(int32_t sessionAidl)
1946{
1947 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1948 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Andy Hung79eacdb2023-11-30 19:34:24 -08001949 audio_utils::lock_guard _l(mMutex);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001950 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001951 return binderStatusFromStatusT(NO_INIT);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001952 }
Eric Laurent10b71232018-04-13 18:14:44 -07001953 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001954 return binderStatusFromStatusT(mAudioPolicyManager->releaseSoundTriggerSession(session));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001955}
1956
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001957Status AudioPolicyService::registerPolicyMixes(const std::vector<media::AudioMix>& mixesAidl,
1958 bool registration) {
1959 size_t size = mixesAidl.size();
1960 if (size > MAX_MIXES_PER_POLICY) {
1961 size = MAX_MIXES_PER_POLICY;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001962 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001963 Vector<AudioMix> mixes;
1964 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1965 convertRange(mixesAidl.begin(), mixesAidl.begin() + size, std::back_inserter(mixes),
1966 aidl2legacy_AudioMix)));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001967
Andy Hung79eacdb2023-11-30 19:34:24 -08001968 audio_utils::lock_guard _l(mMutex);
Kevin Rocardbe201852019-02-20 22:33:28 -08001969
1970 // loopback|render only need a MediaProjection (checked in caller AudioService.java)
1971 bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1972 return !is_mix_loopback_render(mix.mRouteFlags); });
Atneya Nair09859fe2024-07-15 16:38:02 -07001973 if (needModifyAudioRouting && !(audioserver_permissions() ?
1974 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1975 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001976 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurentbaac1832014-12-01 17:52:59 -08001977 }
Kevin Rocardbe201852019-02-20 22:33:28 -08001978
Nadav Bar287d3302020-02-05 14:55:38 +02001979 // If one of the mixes has needCaptureVoiceCommunicationOutput set to true, then we
1980 // need to verify that the caller still has CAPTURE_VOICE_COMMUNICATION_OUTPUT
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001981 bool needCaptureVoiceCommunicationOutput =
1982 std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Nadav Bar287d3302020-02-05 14:55:38 +02001983 return mix.mVoiceCommunicationCaptureAllowed; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001984
Kevin Rocard36b17552019-03-07 18:48:07 -08001985 bool needCaptureMediaOutput = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Eric Laurent5f9a6452020-12-22 20:10:10 +01001986 return mix.mAllowPrivilegedMediaPlaybackCapture; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001987
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001988 const AttributionSourceState attributionSource = getCallingAttributionSource();
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001989
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001990
Atneya Nair09859fe2024-07-15 16:38:02 -07001991 if (needCaptureMediaOutput && !(audioserver_permissions() ?
1992 CHECK_PERM(CAPTURE_MEDIA_OUTPUT, attributionSource.uid)
1993 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001994 return binderStatusFromStatusT(PERMISSION_DENIED);
Kevin Rocard36b17552019-03-07 18:48:07 -08001995 }
1996
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001997 if (needCaptureVoiceCommunicationOutput &&
Atneya Nair09859fe2024-07-15 16:38:02 -07001998 !(audioserver_permissions() ?
1999 CHECK_PERM(CAPTURE_VOICE_COMMUNICATION_OUTPUT, attributionSource.uid)
2000 : captureVoiceCommunicationOutputAllowed(attributionSource))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002001 return binderStatusFromStatusT(PERMISSION_DENIED);
Nadav Bardbf0a2e2020-01-16 23:09:25 +02002002 }
2003
Eric Laurentbaac1832014-12-01 17:52:59 -08002004 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002005 return binderStatusFromStatusT(NO_INIT);
Eric Laurentbaac1832014-12-01 17:52:59 -08002006 }
Eric Laurent10b71232018-04-13 18:14:44 -07002007 AutoCallerClear acc;
Eric Laurentbaac1832014-12-01 17:52:59 -08002008 if (registration) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002009 return binderStatusFromStatusT(mAudioPolicyManager->registerPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08002010 } else {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002011 return binderStatusFromStatusT(mAudioPolicyManager->unregisterPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08002012 }
2013}
2014
Marvin Raminbdefaf02023-11-01 09:10:32 +01002015Status
2016AudioPolicyService::getRegisteredPolicyMixes(std::vector<::android::media::AudioMix>* mixesAidl) {
2017 if (mAudioPolicyManager == nullptr) {
2018 return binderStatusFromStatusT(NO_INIT);
2019 }
2020
2021 std::vector<AudioMix> mixes;
2022 int status = mAudioPolicyManager->getRegisteredPolicyMixes(mixes);
2023
2024 for (const auto& mix : mixes) {
2025 media::AudioMix aidlMix = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_AudioMix(mix));
2026 mixesAidl->push_back(aidlMix);
2027 }
2028
2029 return binderStatusFromStatusT(status);
2030}
2031
Jan Sebechlebsky0af8e872023-08-11 14:45:08 +02002032Status AudioPolicyService::updatePolicyMixes(
2033 const ::std::vector<::android::media::AudioMixUpdate>& updates) {
Andy Hung79eacdb2023-11-30 19:34:24 -08002034 audio_utils::lock_guard _l(mMutex);
Jan Sebechlebsky0af8e872023-08-11 14:45:08 +02002035 for (const auto& update : updates) {
2036 AudioMix mix = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_AudioMix(update.audioMix));
2037 std::vector<AudioMixMatchCriterion> newCriteria =
2038 VALUE_OR_RETURN_BINDER_STATUS(convertContainer<std::vector<AudioMixMatchCriterion>>(
2039 update.newCriteria, aidl2legacy_AudioMixMatchCriterion));
2040 int status;
2041 if((status = mAudioPolicyManager->updatePolicyMix(mix, newCriteria)) != NO_ERROR) {
2042 return binderStatusFromStatusT(status);
2043 }
2044 }
2045 return binderStatusFromStatusT(NO_ERROR);
2046}
2047
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002048Status AudioPolicyService::setUidDeviceAffinities(
2049 int32_t uidAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002050 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002051 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2052 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2053 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2054 aidl2legacy_AudioDeviceTypeAddress));
2055
Andy Hung79eacdb2023-11-30 19:34:24 -08002056 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002057 if (!(audioserver_permissions() ?
2058 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2059 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002060 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002061 }
2062 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002063 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002064 }
2065 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002066 return binderStatusFromStatusT(mAudioPolicyManager->setUidDeviceAffinities(uid, devices));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002067}
2068
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002069Status AudioPolicyService::removeUidDeviceAffinities(int32_t uidAidl) {
2070 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2071
Andy Hung79eacdb2023-11-30 19:34:24 -08002072 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002073 if (!(audioserver_permissions() ?
2074 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2075 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002076 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002077 }
2078 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002079 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002080 }
2081 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002082 return binderStatusFromStatusT(mAudioPolicyManager->removeUidDeviceAffinities(uid));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002083}
2084
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002085Status AudioPolicyService::setUserIdDeviceAffinities(
2086 int32_t userIdAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002087 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002088 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
2089 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2090 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2091 aidl2legacy_AudioDeviceTypeAddress));
2092
Andy Hung79eacdb2023-11-30 19:34:24 -08002093 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002094 if (!(audioserver_permissions() ?
2095 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2096 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002097 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08002098 }
2099 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002100 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08002101 }
2102 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002103 return binderStatusFromStatusT(mAudioPolicyManager->setUserIdDeviceAffinities(userId, devices));
Oscar Azucena90e77632019-11-27 17:12:28 -08002104}
2105
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002106Status AudioPolicyService::removeUserIdDeviceAffinities(int32_t userIdAidl) {
2107 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
2108
Andy Hung79eacdb2023-11-30 19:34:24 -08002109 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002110 if (!(audioserver_permissions() ?
2111 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2112 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002113 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08002114 }
2115 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002116 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08002117 }
2118 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002119 return binderStatusFromStatusT(mAudioPolicyManager->removeUserIdDeviceAffinities(userId));
Oscar Azucena90e77632019-11-27 17:12:28 -08002120}
2121
Atneya Nair7a9594f2022-12-18 17:26:26 -08002122Status AudioPolicyService::startAudioSource(const media::AudioPortConfigFw& sourceAidl,
Mikhail Naganov1c400902023-05-17 11:48:43 -07002123 const media::audio::common::AudioAttributes& attributesAidl,
2124 int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002125 audio_port_config source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov87227252023-01-13 17:38:10 -08002126 aidl2legacy_AudioPortConfigFw_audio_port_config(sourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002127 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002128 aidl2legacy_AudioAttributes_audio_attributes_t(attributesAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002129 audio_port_handle_t portId;
2130 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2131 AudioValidator::validateAudioPortConfig(source)));
2132 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2133 AudioValidator::validateAudioAttributes(attributes, "68953950")));
2134
Andy Hung79eacdb2023-11-30 19:34:24 -08002135 audio_utils::lock_guard _l(mMutex);
Eric Laurent554a2772015-04-10 11:29:24 -07002136 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002137 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07002138 }
Hayden Gomes524159d2019-12-23 14:41:47 -08002139
Atneya Nair09859fe2024-07-15 16:38:02 -07002140 RETURN_IF_BINDER_ERROR(validateUsage(attributes));
Hayden Gomes524159d2019-12-23 14:41:47 -08002141
Hongwei Wang5cd1f1d2019-03-26 15:21:11 -07002142 // startAudioSource should be created as the calling uid
2143 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Eric Laurent10b71232018-04-13 18:14:44 -07002144 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002145 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2146 mAudioPolicyManager->startAudioSource(&source, &attributes, &portId, callingUid)));
2147 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
2148 return Status::ok();
Eric Laurent554a2772015-04-10 11:29:24 -07002149}
2150
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002151Status AudioPolicyService::stopAudioSource(int32_t portIdAidl)
Eric Laurent554a2772015-04-10 11:29:24 -07002152{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002153 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2154 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2155
Andy Hung79eacdb2023-11-30 19:34:24 -08002156 audio_utils::lock_guard _l(mMutex);
Eric Laurent554a2772015-04-10 11:29:24 -07002157 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002158 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07002159 }
Eric Laurent10b71232018-04-13 18:14:44 -07002160 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002161 return binderStatusFromStatusT(mAudioPolicyManager->stopAudioSource(portId));
Eric Laurent554a2772015-04-10 11:29:24 -07002162}
2163
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002164Status AudioPolicyService::setMasterMono(bool mono)
Andy Hung2ddee192015-12-18 17:34:44 -08002165{
2166 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002167 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08002168 }
Atneya Nair09859fe2024-07-15 16:38:02 -07002169 if (!(audioserver_permissions() ?
2170 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
2171 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002172 return binderStatusFromStatusT(PERMISSION_DENIED);
Andy Hung2ddee192015-12-18 17:34:44 -08002173 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002174 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07002175 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002176 return binderStatusFromStatusT(mAudioPolicyManager->setMasterMono(mono));
Andy Hung2ddee192015-12-18 17:34:44 -08002177}
2178
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002179Status AudioPolicyService::getMasterMono(bool* _aidl_return)
Andy Hung2ddee192015-12-18 17:34:44 -08002180{
2181 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002182 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08002183 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002184 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07002185 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002186 return binderStatusFromStatusT(mAudioPolicyManager->getMasterMono(_aidl_return));
Andy Hung2ddee192015-12-18 17:34:44 -08002187}
2188
Eric Laurentac9cef52017-06-09 15:46:26 -07002189
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07002190Status AudioPolicyService::getStreamVolumeDB(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002191 AudioStreamType streamAidl, int32_t indexAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002192 const AudioDeviceDescription& deviceAidl, float* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002193 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
2194 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
2195 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
2196 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07002197 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002198
Eric Laurentac9cef52017-06-09 15:46:26 -07002199 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002200 return binderStatusFromStatusT(NO_INIT);
Eric Laurentac9cef52017-06-09 15:46:26 -07002201 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002202 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07002203 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002204 *_aidl_return = mAudioPolicyManager->getStreamVolumeDB(stream, index, device);
2205 return Status::ok();
Eric Laurentac9cef52017-06-09 15:46:26 -07002206}
2207
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002208Status AudioPolicyService::getSurroundFormats(Int* count,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002209 std::vector<AudioFormatDescription>* formats,
Kriti Dang877b27e2021-02-02 12:10:40 +01002210 std::vector<bool>* formatsEnabled) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002211 unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
2212 convertIntegral<unsigned int>(count->value));
2213 if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
2214 numSurroundFormats = MAX_ITEMS_PER_LIST;
2215 }
2216 unsigned int numSurroundFormatsReq = numSurroundFormats;
2217 std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
Kriti Dang877b27e2021-02-02 12:10:40 +01002218 std::unique_ptr<bool[]>surroundFormatsEnabled(new bool[numSurroundFormats]);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002219
jiabin81772902018-04-02 17:52:27 -07002220 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002221 return binderStatusFromStatusT(NO_INIT);
jiabin81772902018-04-02 17:52:27 -07002222 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002223 audio_utils::lock_guard _l(mMutex);
jiabin81772902018-04-02 17:52:27 -07002224 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002225 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2226 mAudioPolicyManager->getSurroundFormats(&numSurroundFormats, surroundFormats.get(),
Kriti Dang6537def2021-03-02 13:46:59 +01002227 surroundFormatsEnabled.get())));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002228 numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
2229 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2230 convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002231 std::back_inserter(*formats),
2232 legacy2aidl_audio_format_t_AudioFormatDescription)));
Kriti Dang877b27e2021-02-02 12:10:40 +01002233 formatsEnabled->insert(
2234 formatsEnabled->begin(),
2235 surroundFormatsEnabled.get(),
2236 surroundFormatsEnabled.get() + numSurroundFormatsReq);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002237 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
2238 return Status::ok();
jiabin81772902018-04-02 17:52:27 -07002239}
2240
Kriti Dang6537def2021-03-02 13:46:59 +01002241Status AudioPolicyService::getReportedSurroundFormats(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002242 Int* count, std::vector<AudioFormatDescription>* formats) {
Kriti Dang6537def2021-03-02 13:46:59 +01002243 unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
2244 convertIntegral<unsigned int>(count->value));
2245 if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
2246 numSurroundFormats = MAX_ITEMS_PER_LIST;
2247 }
2248 unsigned int numSurroundFormatsReq = numSurroundFormats;
2249 std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
2250
2251 if (mAudioPolicyManager == NULL) {
2252 return binderStatusFromStatusT(NO_INIT);
2253 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002254 audio_utils::lock_guard _l(mMutex);
Kriti Dang6537def2021-03-02 13:46:59 +01002255 AutoCallerClear acc;
2256 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2257 mAudioPolicyManager->getReportedSurroundFormats(
2258 &numSurroundFormats, surroundFormats.get())));
2259 numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
2260 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2261 convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002262 std::back_inserter(*formats),
2263 legacy2aidl_audio_format_t_AudioFormatDescription)));
Kriti Dang6537def2021-03-02 13:46:59 +01002264 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
2265 return Status::ok();
2266}
2267
Pattydd807582021-11-04 21:01:03 +08002268Status AudioPolicyService::getHwOffloadFormatsSupportedForBluetoothMedia(
2269 const AudioDeviceDescription& deviceAidl,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002270 std::vector<AudioFormatDescription>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002271 std::vector<audio_format_t> formats;
2272
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002273 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002274 return binderStatusFromStatusT(NO_INIT);
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002275 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002276 audio_utils::lock_guard _l(mMutex);
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002277 AutoCallerClear acc;
Pattydd807582021-11-04 21:01:03 +08002278 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
2279 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002280 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
Pattydd807582021-11-04 21:01:03 +08002281 mAudioPolicyManager->getHwOffloadFormatsSupportedForBluetoothMedia(device, &formats)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002282 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002283 convertContainer<std::vector<AudioFormatDescription>>(
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002284 formats,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002285 legacy2aidl_audio_format_t_AudioFormatDescription));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002286 return Status::ok();
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002287}
2288
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002289Status AudioPolicyService::setSurroundFormatEnabled(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002290 const AudioFormatDescription& audioFormatAidl, bool enabled) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002291 audio_format_t audioFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002292 aidl2legacy_AudioFormatDescription_audio_format_t(audioFormatAidl));
jiabin81772902018-04-02 17:52:27 -07002293 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002294 return binderStatusFromStatusT(NO_INIT);
jiabin81772902018-04-02 17:52:27 -07002295 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002296 audio_utils::lock_guard _l(mMutex);
jiabin81772902018-04-02 17:52:27 -07002297 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002298 return binderStatusFromStatusT(
2299 mAudioPolicyManager->setSurroundFormatEnabled(audioFormat, enabled));
jiabin81772902018-04-02 17:52:27 -07002300}
Eric Laurentac9cef52017-06-09 15:46:26 -07002301
Oscar Azucena829d90d2022-01-28 17:17:56 -08002302Status convertInt32VectorToUidVectorWithLimit(
2303 const std::vector<int32_t>& uidsAidl, std::vector<uid_t>& uids) {
2304 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2305 convertRangeWithLimit(uidsAidl.begin(),
2306 uidsAidl.end(),
2307 std::back_inserter(uids),
2308 aidl2legacy_int32_t_uid_t,
2309 MAX_ITEMS_PER_LIST)));
2310
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002311 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07002312}
2313
Oscar Azucena829d90d2022-01-28 17:17:56 -08002314Status AudioPolicyService::setAssistantServicesUids(const std::vector<int32_t>& uidsAidl)
Ahaan Ugalef51ce002021-08-04 16:34:20 -07002315{
Oscar Azucena829d90d2022-01-28 17:17:56 -08002316 std::vector<uid_t> uids;
2317 RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(uidsAidl, uids));
2318
Andy Hung79eacdb2023-11-30 19:34:24 -08002319 audio_utils::lock_guard _l(mMutex);
Oscar Azucena829d90d2022-01-28 17:17:56 -08002320 mUidPolicy->setAssistantUids(uids);
Ahaan Ugalef51ce002021-08-04 16:34:20 -07002321 return Status::ok();
2322}
2323
Oscar Azucenac2cdda32022-01-31 19:10:39 -08002324Status AudioPolicyService::setActiveAssistantServicesUids(
2325 const std::vector<int32_t>& activeUidsAidl) {
2326 std::vector<uid_t> activeUids;
2327 RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(activeUidsAidl, activeUids));
2328
Andy Hung79eacdb2023-11-30 19:34:24 -08002329 audio_utils::lock_guard _l(mMutex);
Oscar Azucenac2cdda32022-01-31 19:10:39 -08002330 mUidPolicy->setActiveAssistantUids(activeUids);
2331 return Status::ok();
2332}
2333
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002334Status AudioPolicyService::setA11yServicesUids(const std::vector<int32_t>& uidsAidl)
Eric Laurentb78763e2018-10-17 10:08:02 -07002335{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002336 std::vector<uid_t> uids;
Oscar Azucena829d90d2022-01-28 17:17:56 -08002337 RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(uidsAidl, uids));
2338
Andy Hung79eacdb2023-11-30 19:34:24 -08002339 audio_utils::lock_guard _l(mMutex);
Eric Laurentb78763e2018-10-17 10:08:02 -07002340 mUidPolicy->setA11yUids(uids);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002341 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07002342}
2343
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002344Status AudioPolicyService::setCurrentImeUid(int32_t uidAidl)
Kohsuke Yatoha623a132020-03-24 20:10:26 -07002345{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002346 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Andy Hung79eacdb2023-11-30 19:34:24 -08002347 audio_utils::lock_guard _l(mMutex);
Kohsuke Yatoha623a132020-03-24 20:10:26 -07002348 mUidPolicy->setCurrentImeUid(uid);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002349 return Status::ok();
Kohsuke Yatoha623a132020-03-24 20:10:26 -07002350}
2351
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002352Status AudioPolicyService::isHapticPlaybackSupported(bool* _aidl_return)
jiabin6012f912018-11-02 17:06:30 -07002353{
2354 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002355 return binderStatusFromStatusT(NO_INIT);
jiabin6012f912018-11-02 17:06:30 -07002356 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002357 audio_utils::lock_guard _l(mMutex);
jiabin6012f912018-11-02 17:06:30 -07002358 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002359 *_aidl_return = mAudioPolicyManager->isHapticPlaybackSupported();
2360 return Status::ok();
jiabin6012f912018-11-02 17:06:30 -07002361}
2362
Carter Hsu325a8eb2022-01-19 19:56:51 +08002363Status AudioPolicyService::isUltrasoundSupported(bool* _aidl_return)
2364{
2365 if (mAudioPolicyManager == NULL) {
2366 return binderStatusFromStatusT(NO_INIT);
2367 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002368 audio_utils::lock_guard _l(mMutex);
Carter Hsu325a8eb2022-01-19 19:56:51 +08002369 AutoCallerClear acc;
2370 *_aidl_return = mAudioPolicyManager->isUltrasoundSupported();
2371 return Status::ok();
2372}
2373
Atneya Nair698f5ef2022-12-15 16:15:09 -08002374Status AudioPolicyService::isHotwordStreamSupported(bool lookbackAudio, bool* _aidl_return)
2375{
2376 if (mAudioPolicyManager == nullptr) {
2377 return binderStatusFromStatusT(NO_INIT);
2378 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002379 audio_utils::lock_guard _l(mMutex);
Atneya Nair698f5ef2022-12-15 16:15:09 -08002380 AutoCallerClear acc;
2381 *_aidl_return = mAudioPolicyManager->isHotwordStreamSupported(lookbackAudio);
2382 return Status::ok();
2383}
2384
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002385Status AudioPolicyService::listAudioProductStrategies(
2386 std::vector<media::AudioProductStrategy>* _aidl_return) {
2387 AudioProductStrategyVector strategies;
2388
François Gaffied0ba9ed2018-11-05 11:50:42 +01002389 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002390 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01002391 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002392 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002393 RETURN_IF_BINDER_ERROR(
2394 binderStatusFromStatusT(mAudioPolicyManager->listAudioProductStrategies(strategies)));
2395 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2396 convertContainer<std::vector<media::AudioProductStrategy>>(
2397 strategies,
2398 legacy2aidl_AudioProductStrategy));
2399 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01002400}
2401
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002402Status AudioPolicyService::getProductStrategyFromAudioAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002403 const media::audio::common::AudioAttributes& aaAidl,
François Gaffie1e2b56f2022-04-01 14:34:29 +02002404 bool fallbackOnDefault, int32_t* _aidl_return) {
2405 audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002406 aidl2legacy_AudioAttributes_audio_attributes_t(aaAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002407 product_strategy_t productStrategy;
2408
François Gaffied0ba9ed2018-11-05 11:50:42 +01002409 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002410 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01002411 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002412 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002413 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02002414 mAudioPolicyManager->getProductStrategyFromAudioAttributes(
2415 aa, productStrategy, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002416 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2417 legacy2aidl_product_strategy_t_int32_t(productStrategy));
2418 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01002419}
2420
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002421Status AudioPolicyService::listAudioVolumeGroups(std::vector<media::AudioVolumeGroup>* _aidl_return)
François Gaffie4b2018b2018-11-07 11:18:59 +01002422{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002423 AudioVolumeGroupVector groups;
François Gaffie4b2018b2018-11-07 11:18:59 +01002424 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002425 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01002426 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002427 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002428 RETURN_IF_BINDER_ERROR(
2429 binderStatusFromStatusT(mAudioPolicyManager->listAudioVolumeGroups(groups)));
2430 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2431 convertContainer<std::vector<media::AudioVolumeGroup>>(groups,
2432 legacy2aidl_AudioVolumeGroup));
2433 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01002434}
2435
Francois Gaffie11b65922020-09-24 16:59:08 +02002436Status AudioPolicyService::getVolumeGroupFromAudioAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002437 const media::audio::common::AudioAttributes& aaAidl,
François Gaffie1e2b56f2022-04-01 14:34:29 +02002438 bool fallbackOnDefault, int32_t* _aidl_return) {
2439 audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002440 aidl2legacy_AudioAttributes_audio_attributes_t(aaAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002441 volume_group_t volumeGroup;
2442
François Gaffie4b2018b2018-11-07 11:18:59 +01002443 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002444 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01002445 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002446 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002447 RETURN_IF_BINDER_ERROR(
2448 binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02002449 mAudioPolicyManager->getVolumeGroupFromAudioAttributes(
2450 aa, volumeGroup, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002451 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_volume_group_t_int32_t(volumeGroup));
2452 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01002453}
Eric Laurent6ede98f2019-06-11 14:50:30 -07002454
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002455Status AudioPolicyService::setRttEnabled(bool enabled)
Eric Laurent6ede98f2019-06-11 14:50:30 -07002456{
Andy Hung79eacdb2023-11-30 19:34:24 -08002457 audio_utils::lock_guard _l(mMutex);
Eric Laurent6ede98f2019-06-11 14:50:30 -07002458 mUidPolicy->setRttEnabled(enabled);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002459 return Status::ok();
Eric Laurent6ede98f2019-06-11 14:50:30 -07002460}
2461
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002462Status AudioPolicyService::isCallScreenModeSupported(bool* _aidl_return)
Eric Laurent8340e672019-11-06 11:01:08 -08002463{
2464 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002465 return binderStatusFromStatusT(NO_INIT);
Eric Laurent8340e672019-11-06 11:01:08 -08002466 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002467 audio_utils::lock_guard _l(mMutex);
Eric Laurent8340e672019-11-06 11:01:08 -08002468 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002469 *_aidl_return = mAudioPolicyManager->isCallScreenModeSupported();
2470 return Status::ok();
Eric Laurent8340e672019-11-06 11:01:08 -08002471}
2472
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002473Status AudioPolicyService::setDevicesRoleForStrategy(
2474 int32_t strategyAidl,
2475 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002476 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002477 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2478 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2479 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2480 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2481 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2482 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2483 aidl2legacy_AudioDeviceTypeAddress));
2484
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002485 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002486 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002487 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002488 audio_utils::lock_guard _l(mMutex);
Eric Laurent39095982021-08-24 18:29:27 +02002489 status_t status = mAudioPolicyManager->setDevicesRoleForStrategy(strategy, role, devices);
2490 if (status == NO_ERROR) {
2491 onCheckSpatializer_l();
2492 }
2493 return binderStatusFromStatusT(status);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002494}
2495
Paul Wang5d7cdb52022-11-22 09:45:06 +00002496Status AudioPolicyService::removeDevicesRoleForStrategy(
2497 int32_t strategyAidl,
2498 media::DeviceRole roleAidl,
2499 const std::vector<AudioDevice>& devicesAidl) {
2500 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2501 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2502 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2503 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2504 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2505 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2506 aidl2legacy_AudioDeviceTypeAddress));
2507
2508 if (mAudioPolicyManager == NULL) {
2509 return binderStatusFromStatusT(NO_INIT);
2510 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002511 audio_utils::lock_guard _l(mMutex);
Paul Wang5d7cdb52022-11-22 09:45:06 +00002512 status_t status = mAudioPolicyManager->removeDevicesRoleForStrategy(strategy, role, devices);
2513 if (status == NO_ERROR) {
2514 onCheckSpatializer_l();
2515 }
2516 return binderStatusFromStatusT(status);
2517}
2518
2519Status AudioPolicyService::clearDevicesRoleForStrategy(int32_t strategyAidl,
2520 media::DeviceRole roleAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002521 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2522 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2523 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2524 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2525 if (mAudioPolicyManager == NULL) {
2526 return binderStatusFromStatusT(NO_INIT);
2527 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002528 audio_utils::lock_guard _l(mMutex);
Paul Wang5d7cdb52022-11-22 09:45:06 +00002529 status_t status = mAudioPolicyManager->clearDevicesRoleForStrategy(strategy, role);
Eric Laurent39095982021-08-24 18:29:27 +02002530 if (status == NO_ERROR) {
2531 onCheckSpatializer_l();
2532 }
2533 return binderStatusFromStatusT(status);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002534}
2535
2536Status AudioPolicyService::getDevicesForRoleAndStrategy(
2537 int32_t strategyAidl,
2538 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002539 std::vector<AudioDevice>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002540 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2541 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2542 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2543 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2544 AudioDeviceTypeAddrVector devices;
2545
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002546 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002547 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002548 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002549 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002550 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2551 mAudioPolicyManager->getDevicesForRoleAndStrategy(strategy, role, devices)));
2552 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002553 convertContainer<std::vector<AudioDevice>>(devices,
2554 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002555 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002556}
2557
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002558Status AudioPolicyService::registerSoundTriggerCaptureStateListener(
2559 const sp<media::ICaptureStateListener>& listener, bool* _aidl_return) {
2560 *_aidl_return = mCaptureStateNotifier.RegisterListener(listener);
2561 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002562}
2563
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002564Status AudioPolicyService::setDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002565 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002566 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002567 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002568 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002569 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002570 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2571 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2572 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2573 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2574 aidl2legacy_AudioDeviceTypeAddress));
Ytai Ben-Tsvi85093d52020-03-26 09:41:15 -07002575
Jiabin Huang3b98d322020-09-03 17:54:16 +00002576 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002577 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002578 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002579 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002580 return binderStatusFromStatusT(
2581 mAudioPolicyManager->setDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002582}
2583
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002584Status AudioPolicyService::addDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002585 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002586 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002587 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002588 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002589 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002590 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2591 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2592 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2593 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2594 aidl2legacy_AudioDeviceTypeAddress));
2595
Jiabin Huang3b98d322020-09-03 17:54:16 +00002596 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002597 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002598 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002599 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002600 return binderStatusFromStatusT(
2601 mAudioPolicyManager->addDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002602}
2603
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002604Status AudioPolicyService::removeDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002605 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002606 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002607 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002608 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002609 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002610 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2611 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2612 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2613 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2614 aidl2legacy_AudioDeviceTypeAddress));
2615
2616 if (mAudioPolicyManager == nullptr) {
2617 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002618 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002619 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002620 return binderStatusFromStatusT(
2621 mAudioPolicyManager->removeDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002622}
2623
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002624Status AudioPolicyService::clearDevicesRoleForCapturePreset(AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002625 media::DeviceRole roleAidl) {
2626 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002627 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002628 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2629 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2630
Jiabin Huang3b98d322020-09-03 17:54:16 +00002631 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002632 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002633 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002634 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002635 return binderStatusFromStatusT(
2636 mAudioPolicyManager->clearDevicesRoleForCapturePreset(audioSource, role));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002637}
2638
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002639Status AudioPolicyService::getDevicesForRoleAndCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002640 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002641 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002642 std::vector<AudioDevice>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002643 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002644 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002645 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2646 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2647 AudioDeviceTypeAddrVector devices;
2648
Jiabin Huang3b98d322020-09-03 17:54:16 +00002649 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002650 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002651 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002652 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002653 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2654 mAudioPolicyManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices)));
2655 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002656 convertContainer<std::vector<AudioDevice>>(devices,
2657 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002658 return Status::ok();
Jiabin Huang3b98d322020-09-03 17:54:16 +00002659}
2660
Eric Laurent81dd0f52021-07-05 11:54:40 +02002661Status AudioPolicyService::getSpatializer(
2662 const sp<media::INativeSpatializerCallback>& callback,
2663 media::GetSpatializerResponse* _aidl_return) {
2664 _aidl_return->spatializer = nullptr;
Eric Laurent2be8b292021-08-23 09:44:33 -07002665 if (callback == nullptr) {
2666 return binderStatusFromStatusT(BAD_VALUE);
2667 }
Jean-Michel Trivi41628732021-09-09 12:16:21 -07002668 if (mSpatializer != nullptr) {
2669 RETURN_IF_BINDER_ERROR(
2670 binderStatusFromStatusT(mSpatializer->registerCallback(callback)));
2671 _aidl_return->spatializer = mSpatializer;
2672 }
Eric Laurent81dd0f52021-07-05 11:54:40 +02002673 return Status::ok();
2674}
2675
2676Status AudioPolicyService::canBeSpatialized(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002677 const std::optional<media::audio::common::AudioAttributes>& attrAidl,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002678 const std::optional<AudioConfig>& configAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002679 const std::vector<AudioDevice>& devicesAidl,
Eric Laurent81dd0f52021-07-05 11:54:40 +02002680 bool* _aidl_return) {
2681 if (mAudioPolicyManager == nullptr) {
2682 return binderStatusFromStatusT(NO_INIT);
2683 }
2684 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
2685 if (attrAidl.has_value()) {
2686 attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002687 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl.value()));
Eric Laurent81dd0f52021-07-05 11:54:40 +02002688 }
2689 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
2690 if (configAidl.has_value()) {
2691 config = VALUE_OR_RETURN_BINDER_STATUS(
2692 aidl2legacy_AudioConfig_audio_config_t(configAidl.value(),
2693 false /*isInput*/));
2694 }
2695 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2696 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2697 aidl2legacy_AudioDeviceTypeAddress));
2698
Andy Hung79eacdb2023-11-30 19:34:24 -08002699 audio_utils::lock_guard _l(mMutex);
Eric Laurent81dd0f52021-07-05 11:54:40 +02002700 *_aidl_return = mAudioPolicyManager->canBeSpatialized(&attr, &config, devices);
2701 return Status::ok();
2702}
2703
Mikhail Naganov1c400902023-05-17 11:48:43 -07002704Status AudioPolicyService::getDirectPlaybackSupport(
2705 const media::audio::common::AudioAttributes &attrAidl,
2706 const AudioConfig &configAidl,
2707 media::AudioDirectMode *_aidl_return) {
jiabin2b9d5a12021-12-10 01:06:29 +00002708 if (mAudioPolicyManager == nullptr) {
2709 return binderStatusFromStatusT(NO_INIT);
2710 }
2711 if (_aidl_return == nullptr) {
2712 return binderStatusFromStatusT(BAD_VALUE);
2713 }
2714 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002715 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabin2b9d5a12021-12-10 01:06:29 +00002716 audio_config_t config = VALUE_OR_RETURN_BINDER_STATUS(
2717 aidl2legacy_AudioConfig_audio_config_t(configAidl, false /*isInput*/));
Andy Hung79eacdb2023-11-30 19:34:24 -08002718 audio_utils::lock_guard _l(mMutex);
jiabin2b9d5a12021-12-10 01:06:29 +00002719 *_aidl_return = static_cast<media::AudioDirectMode>(
2720 VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_direct_mode_t_int32_t_mask(
2721 mAudioPolicyManager->getDirectPlaybackSupport(&attr, &config))));
2722 return Status::ok();
2723}
2724
Dorin Drimusf2196d82022-01-03 12:11:18 +01002725Status AudioPolicyService::getDirectProfilesForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002726 const media::audio::common::AudioAttributes& attrAidl,
Dorin Drimusf2196d82022-01-03 12:11:18 +01002727 std::vector<media::audio::common::AudioProfile>* _aidl_return) {
2728 if (mAudioPolicyManager == nullptr) {
2729 return binderStatusFromStatusT(NO_INIT);
2730 }
2731 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002732 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Dorin Drimusf2196d82022-01-03 12:11:18 +01002733 AudioProfileVector audioProfiles;
2734
Andy Hung79eacdb2023-11-30 19:34:24 -08002735 audio_utils::lock_guard _l(mMutex);
Dorin Drimusf2196d82022-01-03 12:11:18 +01002736 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2737 mAudioPolicyManager->getDirectProfilesForAttributes(&attr, audioProfiles)));
2738 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2739 convertContainer<std::vector<media::audio::common::AudioProfile>>(
2740 audioProfiles, legacy2aidl_AudioProfile_common, false /*isInput*/));
2741
2742 return Status::ok();
2743}
2744
jiabina84c3d32022-12-02 18:59:55 +00002745Status AudioPolicyService::getSupportedMixerAttributes(
2746 int32_t portIdAidl, std::vector<media::AudioMixerAttributesInternal>* _aidl_return) {
2747 if (mAudioPolicyManager == nullptr) {
2748 return binderStatusFromStatusT(NO_INIT);
2749 }
2750
2751 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2752 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2753
2754 std::vector<audio_mixer_attributes_t> mixerAttrs;
Andy Hung79eacdb2023-11-30 19:34:24 -08002755 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002756 RETURN_IF_BINDER_ERROR(
2757 binderStatusFromStatusT(mAudioPolicyManager->getSupportedMixerAttributes(
2758 portId, mixerAttrs)));
2759 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2760 convertContainer<std::vector<media::AudioMixerAttributesInternal>>(
2761 mixerAttrs,
2762 legacy2aidl_audio_mixer_attributes_t_AudioMixerAttributesInternal));
2763 return Status::ok();
2764}
2765
2766Status AudioPolicyService::setPreferredMixerAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002767 const media::audio::common::AudioAttributes& attrAidl,
jiabina84c3d32022-12-02 18:59:55 +00002768 int32_t portIdAidl,
2769 int32_t uidAidl,
2770 const media::AudioMixerAttributesInternal& mixerAttrAidl) {
2771 if (mAudioPolicyManager == nullptr) {
2772 return binderStatusFromStatusT(NO_INIT);
2773 }
2774
2775 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002776 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabina84c3d32022-12-02 18:59:55 +00002777 audio_mixer_attributes_t mixerAttr = VALUE_OR_RETURN_BINDER_STATUS(
2778 aidl2legacy_AudioMixerAttributesInternal_audio_mixer_attributes_t(mixerAttrAidl));
2779 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2780 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2781 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2782
Andy Hung79eacdb2023-11-30 19:34:24 -08002783 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002784 return binderStatusFromStatusT(
2785 mAudioPolicyManager->setPreferredMixerAttributes(&attr, portId, uid, &mixerAttr));
2786}
2787
2788Status AudioPolicyService::getPreferredMixerAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002789 const media::audio::common::AudioAttributes& attrAidl,
jiabina84c3d32022-12-02 18:59:55 +00002790 int32_t portIdAidl,
2791 std::optional<media::AudioMixerAttributesInternal>* _aidl_return) {
2792 if (mAudioPolicyManager == nullptr) {
2793 return binderStatusFromStatusT(NO_INIT);
2794 }
2795
2796 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002797 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabina84c3d32022-12-02 18:59:55 +00002798 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2799 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2800
Andy Hung79eacdb2023-11-30 19:34:24 -08002801 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002802 audio_mixer_attributes_t mixerAttr = AUDIO_MIXER_ATTRIBUTES_INITIALIZER;
2803 RETURN_IF_BINDER_ERROR(
2804 binderStatusFromStatusT(mAudioPolicyManager->getPreferredMixerAttributes(
2805 &attr, portId, &mixerAttr)));
2806 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2807 legacy2aidl_audio_mixer_attributes_t_AudioMixerAttributesInternal(mixerAttr));
2808 return Status::ok();
2809}
2810
2811Status AudioPolicyService::clearPreferredMixerAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002812 const media::audio::common::AudioAttributes& attrAidl,
jiabina84c3d32022-12-02 18:59:55 +00002813 int32_t portIdAidl,
2814 int32_t uidAidl) {
2815 if (mAudioPolicyManager == nullptr) {
2816 return binderStatusFromStatusT(NO_INIT);
2817 }
2818
2819 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002820 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabina84c3d32022-12-02 18:59:55 +00002821 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2822 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2823 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2824
Andy Hung79eacdb2023-11-30 19:34:24 -08002825 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002826 return binderStatusFromStatusT(
2827 mAudioPolicyManager->clearPreferredMixerAttributes(&attr, portId, uid));
2828}
2829
Atneya Nair9f91a5e2024-05-09 16:25:05 -07002830Status AudioPolicyService::getPermissionController(sp<INativePermissionController>* out) {
2831 *out = mPermissionController;
2832 return Status::ok();
2833}
2834
Jiabin Huangaa6e9e32024-10-21 17:19:28 +00002835Status AudioPolicyService::getMmapPolicyInfos(
2836 AudioMMapPolicyType policyType, std::vector<AudioMMapPolicyInfo> *_aidl_return) {
2837 if (mAudioPolicyManager == nullptr) {
2838 return binderStatusFromStatusT(NO_INIT);
2839 }
2840 audio_utils::lock_guard _l(mMutex);
2841 return binderStatusFromStatusT(
2842 mAudioPolicyManager->getMmapPolicyInfos(policyType, _aidl_return));
2843}
2844
2845Status AudioPolicyService::getMmapPolicyForDevice(
2846 AudioMMapPolicyType policyType, AudioMMapPolicyInfo *policyInfo) {
2847 if (mAudioPolicyManager == nullptr) {
2848 return binderStatusFromStatusT(NO_INIT);
2849 }
2850 audio_utils::lock_guard _l(mMutex);
2851 return binderStatusFromStatusT(
2852 mAudioPolicyManager->getMmapPolicyForDevice(policyType, policyInfo));
2853}
2854
Mikhail Naganov1b2a7942017-12-08 10:18:09 -08002855} // namespace android