blob: 12320b74724d0b8a1d09ac94d8ef40439d4446a0 [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>
Eric Laurentdbb80322024-11-18 16:09:51 -080026#include <android_media_audio.h>
Atneya Nair89ff0432024-11-19 12:47:28 -080027#include <binder/Enums.h>
Atneya Nair09859fe2024-07-15 16:38:02 -070028#include <com_android_media_audio.h>
Eric Laurent528181a2024-10-30 18:32:15 +000029#include <cutils/properties.h>
Atneya Nair09859fe2024-07-15 16:38:02 -070030#include <error/expected_utils.h>
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080031#include <media/AidlConversion.h>
Kevin Rocardbe201852019-02-20 22:33:28 -080032#include <media/AudioPolicy.h>
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080033#include <media/AudioValidator.h>
34#include <media/MediaMetricsItem.h>
35#include <media/PolicyAidlConversion.h>
Eric Laurentd7fe0862018-07-14 16:48:01 -070036#include <utils/Log.h>
Eric Laurent2d388ec2014-03-07 13:25:54 -080037
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080038#define VALUE_OR_RETURN_BINDER_STATUS(x) \
39 ({ auto _tmp = (x); \
40 if (!_tmp.ok()) return aidl_utils::binderStatusFromStatusT(_tmp.error()); \
41 std::move(_tmp.value()); })
42
Mikhail Naganov932cb962021-09-16 01:05:27 +000043#define RETURN_BINDER_STATUS_IF_ERROR(x) \
44 if (status_t _tmp = (x); _tmp != OK) return aidl_utils::binderStatusFromStatusT(_tmp);
45
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080046#define RETURN_IF_BINDER_ERROR(x) \
47 { \
48 binder::Status _tmp = (x); \
49 if (!_tmp.isOk()) return _tmp; \
50 }
51
Atneya Nair09859fe2024-07-15 16:38:02 -070052#define CHECK_PERM(expr1, expr2) \
53 VALUE_OR_RETURN_STATUS(getPermissionProvider().checkPermission((expr1), (expr2)))
54
Atneya Nair89ff0432024-11-19 12:47:28 -080055#define PROPAGATE_FALSEY(val) do { if (!val.has_value() || !val.value()) return val; } while (0)
56
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080057#define MAX_ITEMS_PER_LIST 1024
58
Eric Laurent2d388ec2014-03-07 13:25:54 -080059namespace android {
Marvin Ramine5a122d2023-12-07 13:57:59 +010060namespace audiopolicy_flags = android::media::audiopolicy;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -080061using binder::Status;
62using aidl_utils::binderStatusFromStatusT;
Eric Laurentdbb80322024-11-18 16:09:51 -080063using android::media::audio::concurrent_audio_record_bypass_permission;
Atneya Nair09859fe2024-07-15 16:38:02 -070064using com::android::media::audio::audioserver_permissions;
Atneya Nair9f91a5e2024-05-09 16:25:05 -070065using com::android::media::permission::NativePermissionController;
Atneya Nair89ff0432024-11-19 12:47:28 -080066using com::android::media::permission::PermissionEnum;
Atneya Nair09859fe2024-07-15 16:38:02 -070067using com::android::media::permission::PermissionEnum::ACCESS_ULTRASOUND;
68using com::android::media::permission::PermissionEnum::CALL_AUDIO_INTERCEPTION;
69using com::android::media::permission::PermissionEnum::CAPTURE_AUDIO_HOTWORD;
70using com::android::media::permission::PermissionEnum::CAPTURE_VOICE_COMMUNICATION_OUTPUT;
71using com::android::media::permission::PermissionEnum::CAPTURE_AUDIO_OUTPUT;
72using com::android::media::permission::PermissionEnum::CAPTURE_MEDIA_OUTPUT;
73using com::android::media::permission::PermissionEnum::CAPTURE_TUNER_AUDIO_INPUT;
74using com::android::media::permission::PermissionEnum::MODIFY_AUDIO_ROUTING;
75using com::android::media::permission::PermissionEnum::MODIFY_AUDIO_SETTINGS;
76using com::android::media::permission::PermissionEnum::MODIFY_DEFAULT_AUDIO_EFFECTS;
77using com::android::media::permission::PermissionEnum::MODIFY_PHONE_STATE;
78using com::android::media::permission::PermissionEnum::RECORD_AUDIO;
79using com::android::media::permission::PermissionEnum::WRITE_SECURE_SETTINGS;
Eric Laurentdbb80322024-11-18 16:09:51 -080080using com::android::media::permission::PermissionEnum::BYPASS_CONCURRENT_RECORD_AUDIO_RESTRICTION;
Svet Ganov3e5f14f2021-05-13 22:51:08 +000081using content::AttributionSourceState;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070082using media::audio::common::AudioConfig;
83using media::audio::common::AudioConfigBase;
Mikhail Naganovf4a75362021-09-16 00:02:54 +000084using media::audio::common::AudioDevice;
Mikhail Naganov932cb962021-09-16 01:05:27 +000085using media::audio::common::AudioDeviceAddress;
Mikhail Naganovf4a75362021-09-16 00:02:54 +000086using media::audio::common::AudioDeviceDescription;
Mikhail Naganov57bd06f2021-08-10 16:41:54 -070087using media::audio::common::AudioFormatDescription;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070088using media::audio::common::AudioMode;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070089using media::audio::common::AudioOffloadInfo;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070090using media::audio::common::AudioSource;
Mikhail Naganovdbf03642021-08-25 18:15:32 -070091using media::audio::common::AudioStreamType;
92using media::audio::common::AudioUsage;
Mikhail Naganovddceecc2021-09-03 13:58:56 -070093using media::audio::common::AudioUuid;
Mikhail Naganov0078ee52021-09-30 23:06:20 +000094using media::audio::common::Int;
Eric Laurent2d388ec2014-03-07 13:25:54 -080095
Marvin Ramine5a122d2023-12-07 13:57:59 +010096constexpr int kDefaultVirtualDeviceId = 0;
Atneya Nairdb6ef1e2024-09-16 20:26:30 +000097namespace {
98constexpr auto PERMISSION_HARD_DENIED = permission::PermissionChecker::PERMISSION_HARD_DENIED;
99constexpr auto PERMISSION_GRANTED = permission::PermissionChecker::PERMISSION_GRANTED;
100}
Marvin Ramine5a122d2023-12-07 13:57:59 +0100101
Hayden Gomes524159d2019-12-23 14:41:47 -0800102const std::vector<audio_usage_t>& SYSTEM_USAGES = {
103 AUDIO_USAGE_CALL_ASSISTANT,
104 AUDIO_USAGE_EMERGENCY,
105 AUDIO_USAGE_SAFETY,
106 AUDIO_USAGE_VEHICLE_STATUS,
107 AUDIO_USAGE_ANNOUNCEMENT
108};
109
110bool isSystemUsage(audio_usage_t usage) {
111 return std::find(std::begin(SYSTEM_USAGES), std::end(SYSTEM_USAGES), usage)
112 != std::end(SYSTEM_USAGES);
113}
114
115bool AudioPolicyService::isSupportedSystemUsage(audio_usage_t usage) {
116 return std::find(std::begin(mSupportedSystemUsages), std::end(mSupportedSystemUsages), usage)
117 != std::end(mSupportedSystemUsages);
118}
119
Atneya Nair09859fe2024-07-15 16:38:02 -0700120Status AudioPolicyService::validateUsage(const audio_attributes_t& attr) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100121 return validateUsage(attr, getCallingAttributionSource());
Hayden Gomes524159d2019-12-23 14:41:47 -0800122}
123
Atneya Nair09859fe2024-07-15 16:38:02 -0700124Status AudioPolicyService::validateUsage(const audio_attributes_t& attr,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000125 const AttributionSourceState& attributionSource) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100126 if (isSystemUsage(attr.usage)) {
127 if (isSupportedSystemUsage(attr.usage)) {
128 if (attr.usage == AUDIO_USAGE_CALL_ASSISTANT
129 && ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0)) {
Atneya Nair09859fe2024-07-15 16:38:02 -0700130 if (!(audioserver_permissions() ?
131 CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
132 : callAudioInterceptionAllowed(attributionSource))) {
Eric Laurentf8763482022-03-30 20:37:30 +0200133 ALOGE("%s: call audio interception not allowed for attribution source: %s",
134 __func__, attributionSource.toString().c_str());
Atneya Nair09859fe2024-07-15 16:38:02 -0700135 return Status::fromExceptionCode(Status::EX_SECURITY,
136 "Call audio interception not allowed");
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100137 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700138 } else if (!(audioserver_permissions() ?
139 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid)
140 : modifyAudioRoutingAllowed(attributionSource))) {
Eric Laurentf8763482022-03-30 20:37:30 +0200141 ALOGE("%s: modify audio routing not allowed for attribution source: %s",
142 __func__, attributionSource.toString().c_str());
Atneya Nair09859fe2024-07-15 16:38:02 -0700143 return Status::fromExceptionCode(Status::EX_SECURITY,
144 "Modify audio routing not allowed");
Hayden Gomes524159d2019-12-23 14:41:47 -0800145 }
146 } else {
Atneya Nair09859fe2024-07-15 16:38:02 -0700147 return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT);
Hayden Gomes524159d2019-12-23 14:41:47 -0800148 }
149 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700150 return Status::ok();
Hayden Gomes524159d2019-12-23 14:41:47 -0800151}
152
153
Eric Laurent2d388ec2014-03-07 13:25:54 -0800154
155// ----------------------------------------------------------------------------
156
Mikhail Naganov88b30d22020-03-09 19:43:13 +0000157void AudioPolicyService::doOnNewAudioModulesAvailable()
158{
159 if (mAudioPolicyManager == NULL) return;
Andy Hung79eacdb2023-11-30 19:34:24 -0800160 audio_utils::lock_guard _l(mMutex);
Mikhail Naganov88b30d22020-03-09 19:43:13 +0000161 AutoCallerClear acc;
162 mAudioPolicyManager->onNewAudioModulesAvailable();
163}
164
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800165Status AudioPolicyService::setDeviceConnectionState(
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800166 media::AudioPolicyDeviceState stateAidl,
Nathalie Le Clair88fa2752021-11-23 13:03:41 +0100167 const android::media::audio::common::AudioPort& port,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700168 const AudioFormatDescription& encodedFormatAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800169 audio_policy_dev_state_t state = VALUE_OR_RETURN_BINDER_STATUS(
170 aidl2legacy_AudioPolicyDeviceState_audio_policy_dev_state_t(stateAidl));
171 audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -0700172 aidl2legacy_AudioFormatDescription_audio_format_t(encodedFormatAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800173
Eric Laurentdce54a12014-03-10 12:19:46 -0700174 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800175 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800176 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700177 if (!(audioserver_permissions() ?
178 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
179 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800180 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800181 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800182 if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
183 state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800184 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800185 }
186
187 ALOGV("setDeviceConnectionState()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800188 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700189 AutoCallerClear acc;
Mikhail Naganov932cb962021-09-16 01:05:27 +0000190 status_t status = mAudioPolicyManager->setDeviceConnectionState(
Nathalie Le Clair88fa2752021-11-23 13:03:41 +0100191 state, port, encodedFormat);
Eric Laurent39095982021-08-24 18:29:27 +0200192 if (status == NO_ERROR) {
193 onCheckSpatializer_l();
194 }
195 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800196}
197
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000198Status AudioPolicyService::getDeviceConnectionState(const AudioDevice& deviceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800199 media::AudioPolicyDeviceState* _aidl_return) {
Mikhail Naganov932cb962021-09-16 01:05:27 +0000200 audio_devices_t device;
201 std::string address;
202 RETURN_BINDER_STATUS_IF_ERROR(
203 aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
Eric Laurentdce54a12014-03-10 12:19:46 -0700204 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800205 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
206 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
207 AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
208 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800209 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800210 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700211 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800212 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
213 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
Mikhail Naganov932cb962021-09-16 01:05:27 +0000214 mAudioPolicyManager->getDeviceConnectionState(
215 device, address.c_str())));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800216 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800217}
218
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800219Status AudioPolicyService::handleDeviceConfigChange(
Mikhail Naganovf4a75362021-09-16 00:02:54 +0000220 const AudioDevice& deviceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800221 const std::string& deviceNameAidl,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -0700222 const AudioFormatDescription& encodedFormatAidl) {
Mikhail Naganov932cb962021-09-16 01:05:27 +0000223 audio_devices_t device;
224 std::string address;
225 RETURN_BINDER_STATUS_IF_ERROR(
226 aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800227 audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -0700228 aidl2legacy_AudioFormatDescription_audio_format_t(encodedFormatAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800229
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800230 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800231 return binderStatusFromStatusT(NO_INIT);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800232 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700233 if (!(audioserver_permissions() ?
234 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
235 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800236 return binderStatusFromStatusT(PERMISSION_DENIED);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800237 }
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800238
239 ALOGV("handleDeviceConfigChange()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800240 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700241 AutoCallerClear acc;
Eric Laurent39095982021-08-24 18:29:27 +0200242 status_t status = mAudioPolicyManager->handleDeviceConfigChange(
Mikhail Naganov932cb962021-09-16 01:05:27 +0000243 device, address.c_str(), deviceNameAidl.c_str(), encodedFormat);
Eric Laurent39095982021-08-24 18:29:27 +0200244
245 if (status == NO_ERROR) {
246 onCheckSpatializer_l();
247 }
248 return binderStatusFromStatusT(status);
Pavlin Radoslavovf862bc62016-12-26 18:57:22 -0800249}
250
Mikhail Naganovddceecc2021-09-03 13:58:56 -0700251Status AudioPolicyService::setPhoneState(AudioMode stateAidl, int32_t uidAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800252{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800253 audio_mode_t state = VALUE_OR_RETURN_BINDER_STATUS(
254 aidl2legacy_AudioMode_audio_mode_t(stateAidl));
255 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700256 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800257 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800258 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700259 if (!(audioserver_permissions() ?
260 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
261 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800262 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800263 }
264 if (uint32_t(state) >= AUDIO_MODE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800265 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800266 }
267
268 ALOGV("setPhoneState()");
269
Eric Laurentbeb07fe2015-09-16 15:49:30 -0700270 // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic
271 // operation from policy manager standpoint (no other operation (e.g track start or stop)
272 // can be interleaved).
Andy Hung79eacdb2023-11-30 19:34:24 -0800273 audio_utils::lock_guard _l(mMutex);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800274 // TODO: check if it is more appropriate to do it in platform specific policy manager
Eric Laurentc8c4f1f2021-11-09 11:51:34 +0100275
276 // Audio HAL mode conversion for call redirect modes
277 audio_mode_t halMode = state;
278 if (state == AUDIO_MODE_CALL_REDIRECT) {
279 halMode = AUDIO_MODE_CALL_SCREEN;
280 } else if (state == AUDIO_MODE_COMMUNICATION_REDIRECT) {
281 halMode = AUDIO_MODE_NORMAL;
282 }
283 AudioSystem::setMode(halMode);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800284
Eric Laurent10b71232018-04-13 18:14:44 -0700285 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700286 mAudioPolicyManager->setPhoneState(state);
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700287 mPhoneState = state;
Eric Laurent00dba062020-02-11 15:52:09 -0800288 mPhoneStateOwnerUid = uid;
Mingshu Pangd07c19b2021-02-25 11:40:32 +0800289 updateUidStates_l();
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800290 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800291}
292
Mikhail Naganovddceecc2021-09-03 13:58:56 -0700293Status AudioPolicyService::getPhoneState(AudioMode* _aidl_return) {
Andy Hung79eacdb2023-11-30 19:34:24 -0800294 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800295 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_mode_t_AudioMode(mPhoneState));
296 return Status::ok();
Eric Laurentbb6c9a02014-09-25 14:11:47 -0700297}
298
Mikhail Naganovd8670042024-11-20 21:17:52 +0000299Status AudioPolicyService::setForceUse(media::AudioPolicyForceUse usageAidl,
300 media::AudioPolicyForcedConfig configAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800301{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800302 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
303 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
304 audio_policy_forced_cfg_t config = VALUE_OR_RETURN_BINDER_STATUS(
305 aidl2legacy_AudioPolicyForcedConfig_audio_policy_forced_cfg_t(configAidl));
306
Eric Laurentdce54a12014-03-10 12:19:46 -0700307 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800308 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800309 }
Eric Laurente17378d2018-05-09 14:43:01 -0700310
Atneya Nair09859fe2024-07-15 16:38:02 -0700311 if (!(audioserver_permissions() ?
312 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
313 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800314 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800315 }
Eric Laurente17378d2018-05-09 14:43:01 -0700316
Eric Laurent2d388ec2014-03-07 13:25:54 -0800317 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800318 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800319 }
320 if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800321 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800322 }
323 ALOGV("setForceUse()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800324 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700325 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -0700326 mAudioPolicyManager->setForceUse(usage, config);
Eric Laurent39095982021-08-24 18:29:27 +0200327 onCheckSpatializer_l();
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800328 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800329}
330
Mikhail Naganovd8670042024-11-20 21:17:52 +0000331Status AudioPolicyService::getForceUse(media::AudioPolicyForceUse usageAidl,
332 media::AudioPolicyForcedConfig* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800333 audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
334 aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
335
Eric Laurentdce54a12014-03-10 12:19:46 -0700336 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800337 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800338 }
339 if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800340 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
341 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(AUDIO_POLICY_FORCE_NONE));
342 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800343 }
Eric Laurent10b71232018-04-13 18:14:44 -0700344 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800345 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
346 legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(
347 mAudioPolicyManager->getForceUse(usage)));
348 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800349}
350
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700351Status AudioPolicyService::getOutput(AudioStreamType streamAidl, int32_t* _aidl_return)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800352{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800353 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
354 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
355
Eric Laurent72af8012023-03-15 17:36:22 +0100356 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT
357 && stream != AUDIO_STREAM_ASSISTANT && stream != AUDIO_STREAM_CALL_ASSISTANT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800358 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
359 legacy2aidl_audio_io_handle_t_int32_t(AUDIO_IO_HANDLE_NONE));
360 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -0700361 }
Eric Laurentdce54a12014-03-10 12:19:46 -0700362 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800363 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800364 }
365 ALOGV("getOutput()");
Andy Hung79eacdb2023-11-30 19:34:24 -0800366 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700367 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800368 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
369 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutput(stream)));
370 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800371}
372
Mikhail Naganov1c400902023-05-17 11:48:43 -0700373Status AudioPolicyService::getOutputForAttr(const media::audio::common::AudioAttributes& attrAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800374 int32_t sessionAidl,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000375 const AttributionSourceState& attributionSource,
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700376 const AudioConfig& configAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800377 int32_t flagsAidl,
Robert Wufb971192024-10-30 21:54:35 +0000378 const std::vector<int32_t>& selectedDeviceIdsAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800379 media::GetOutputForAttrResponse* _aidl_return)
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700380{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800381 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -0700382 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800383 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
384 aidl2legacy_int32_t_audio_session_t(sessionAidl));
385 audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800386 audio_config_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -0700387 aidl2legacy_AudioConfig_audio_config_t(configAidl, false /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800388 audio_output_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
389 aidl2legacy_int32_t_audio_output_flags_t_mask(flagsAidl));
Robert Wufb971192024-10-30 21:54:35 +0000390 DeviceIdVector selectedDeviceIds = VALUE_OR_RETURN_BINDER_STATUS(
391 convertContainer<DeviceIdVector>(selectedDeviceIdsAidl,
392 aidl2legacy_int32_t_audio_port_handle_t));
Eric Laurentf99edd32021-02-01 15:57:33 +0100393
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800394 audio_io_handle_t output;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800395 audio_port_handle_t portId;
396 std::vector<audio_io_handle_t> secondaryOutputs;
397
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700398 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800399 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700400 }
Hayden Gomes524159d2019-12-23 14:41:47 -0800401
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800402 RETURN_IF_BINDER_ERROR(
403 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Atneya Nair09859fe2024-07-15 16:38:02 -0700404 RETURN_IF_BINDER_ERROR(validateUsage(attr, attributionSource));
Hayden Gomes524159d2019-12-23 14:41:47 -0800405
Eric Laurent8a1095a2019-11-08 14:44:16 -0800406 ALOGV("%s()", __func__);
Andy Hung79eacdb2023-11-30 19:34:24 -0800407 audio_utils::lock_guard _l(mMutex);
Eric Laurent8c7e6da2015-04-21 17:37:00 -0700408
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700409 if (!mPackageManager.allowPlaybackCapture(VALUE_OR_RETURN_BINDER_STATUS(
Eric Laurent9ff3e532022-11-10 16:04:44 +0100410 aidl2legacy_int32_t_uid_t(attributionSource.uid)))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800411 attr.flags = static_cast<audio_flags_mask_t>(attr.flags | AUDIO_FLAG_NO_MEDIA_PROJECTION);
Eric Laurent42984412019-05-09 17:57:03 -0700412 }
Atneya Nair09859fe2024-07-15 16:38:02 -0700413 const bool bypassInterruptionAllowed = audioserver_permissions() ? (
414 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid) ||
415 CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid) ||
416 CHECK_PERM(WRITE_SECURE_SETTINGS, attributionSource.uid))
417 : bypassInterruptionPolicyAllowed(attributionSource);
418
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800419 if (((attr.flags & (AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)) != 0)
Atneya Nair09859fe2024-07-15 16:38:02 -0700420 && !bypassInterruptionAllowed) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800421 attr.flags = static_cast<audio_flags_mask_t>(
422 attr.flags & ~(AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE));
Kevin Rocard8be94972019-02-22 13:26:25 -0800423 }
Carter Hsua3abb402021-10-26 11:11:20 +0800424
425 if (attr.content_type == AUDIO_CONTENT_TYPE_ULTRASOUND) {
Atneya Nair09859fe2024-07-15 16:38:02 -0700426 if (!(audioserver_permissions() ?
427 CHECK_PERM(ACCESS_ULTRASOUND, attributionSource.uid)
428 : accessUltrasoundAllowed(attributionSource))) {
Carter Hsua3abb402021-10-26 11:11:20 +0800429 ALOGE("%s: permission denied: ultrasound not allowed for uid %d pid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100430 __func__, attributionSource.uid, attributionSource.pid);
Carter Hsua3abb402021-10-26 11:11:20 +0800431 return binderStatusFromStatusT(PERMISSION_DENIED);
432 }
433 }
434
Jean-Michel Trivi2dbb1a92024-11-01 22:46:25 +0000435 //TODO this permission check should extend to all system usages
436 if (attr.usage == AUDIO_USAGE_SPEAKER_CLEANUP) {
437 if (!(audioserver_permissions() ?
438 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid)
439 : modifyAudioRoutingAllowed())) {
440 ALOGE("%s: permission denied: SPEAKER_CLEANUP not allowed for uid %d pid %d",
441 __func__, attributionSource.uid, attributionSource.pid);
442 return binderStatusFromStatusT(PERMISSION_DENIED);
443 }
444 }
445
Eric Laurent10b71232018-04-13 18:14:44 -0700446 AutoCallerClear acc;
Eric Laurent8a1095a2019-11-08 14:44:16 -0800447 AudioPolicyInterface::output_type_t outputType;
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200448 bool isSpatialized = false;
jiabinc658e452022-10-21 20:52:21 +0000449 bool isBitPerfect = false;
Andy Hung6b137d12024-08-27 22:35:17 +0000450 float volume;
Vlad Popa1e865e62024-08-15 19:11:42 -0700451 bool muted;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800452 status_t result = mAudioPolicyManager->getOutputForAttr(&attr, &output, session,
453 &stream,
Eric Laurent9ff3e532022-11-10 16:04:44 +0100454 attributionSource,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800455 &config,
Robert Wufb971192024-10-30 21:54:35 +0000456 &flags, &selectedDeviceIds, &portId,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800457 &secondaryOutputs,
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200458 &outputType,
jiabinc658e452022-10-21 20:52:21 +0000459 &isSpatialized,
Andy Hung6b137d12024-08-27 22:35:17 +0000460 &isBitPerfect,
Vlad Popa1e865e62024-08-15 19:11:42 -0700461 &volume,
462 &muted);
Nadav Bar766fb022018-01-07 12:18:03 +0200463
464 // FIXME: Introduce a way to check for the the telephony device before opening the output
Eric Laurent8a1095a2019-11-08 14:44:16 -0800465 if (result == NO_ERROR) {
466 // enforce permission (if any) required for each type of input
467 switch (outputType) {
468 case AudioPolicyInterface::API_OUTPUT_LEGACY:
469 break;
470 case AudioPolicyInterface::API_OUTPUT_TELEPHONY_TX:
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100471 if (((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0)
Atneya Nair09859fe2024-07-15 16:38:02 -0700472 && !(audioserver_permissions() ?
473 CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
474 : callAudioInterceptionAllowed(attributionSource))) {
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100475 ALOGE("%s() permission denied: call redirection not allowed for uid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100476 __func__, attributionSource.uid);
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100477 result = PERMISSION_DENIED;
Atneya Nair09859fe2024-07-15 16:38:02 -0700478 } else if (!(audioserver_permissions() ?
479 CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid)
480 : modifyPhoneStateAllowed(attributionSource))) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800481 ALOGE("%s() permission denied: modify phone state not allowed for uid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100482 __func__, attributionSource.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800483 result = PERMISSION_DENIED;
484 }
485 break;
486 case AudioPolicyInterface::API_OUT_MIX_PLAYBACK:
Atneya Nair09859fe2024-07-15 16:38:02 -0700487 if (!(audioserver_permissions() ?
488 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid)
489 : modifyAudioRoutingAllowed(attributionSource))) {
Eric Laurent8a1095a2019-11-08 14:44:16 -0800490 ALOGE("%s() permission denied: modify audio routing not allowed for uid %d",
Eric Laurent9ff3e532022-11-10 16:04:44 +0100491 __func__, attributionSource.uid);
Eric Laurent8a1095a2019-11-08 14:44:16 -0800492 result = PERMISSION_DENIED;
493 }
494 break;
495 case AudioPolicyInterface::API_OUTPUT_INVALID:
496 default:
497 LOG_ALWAYS_FATAL("%s() encountered an invalid output type %d",
498 __func__, (int)outputType);
499 }
Nadav Bar766fb022018-01-07 12:18:03 +0200500 }
Eric Laurentd7fe0862018-07-14 16:48:01 -0700501
502 if (result == NO_ERROR) {
Eric Laurent528181a2024-10-30 18:32:15 +0000503 // usecase validator is disabled by default
504 if (property_get_bool("ro.audio.usecase_validator_enabled", false /* default */)) {
505 attr = VALUE_OR_RETURN_BINDER_STATUS(
506 mUsecaseValidator->verifyAudioAttributes(output, attributionSource, attr));
507 }
Eric Laurent0d13fea2022-11-04 17:12:08 +0100508
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800509 sp<AudioPlaybackClient> client =
Eric Laurent9ff3e532022-11-10 16:04:44 +0100510 new AudioPlaybackClient(attr, output, attributionSource, session,
Robert Wufb971192024-10-30 21:54:35 +0000511 portId, selectedDeviceIds, stream, isSpatialized, config.channel_mask);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800512 mAudioPlaybackClients.add(portId, client);
513
514 _aidl_return->output = VALUE_OR_RETURN_BINDER_STATUS(
515 legacy2aidl_audio_io_handle_t_int32_t(output));
516 _aidl_return->stream = VALUE_OR_RETURN_BINDER_STATUS(
517 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
Robert Wufb971192024-10-30 21:54:35 +0000518 _aidl_return->selectedDeviceIds = VALUE_OR_RETURN_BINDER_STATUS(
519 convertContainer<std::vector<int32_t>>(selectedDeviceIds,
520 legacy2aidl_audio_port_handle_t_int32_t));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800521 _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
522 legacy2aidl_audio_port_handle_t_int32_t(portId));
523 _aidl_return->secondaryOutputs = VALUE_OR_RETURN_BINDER_STATUS(
524 convertContainer<std::vector<int32_t>>(secondaryOutputs,
525 legacy2aidl_audio_io_handle_t_int32_t));
Eric Laurentb0a7bc92022-04-05 15:06:08 +0200526 _aidl_return->isSpatialized = isSpatialized;
jiabinc658e452022-10-21 20:52:21 +0000527 _aidl_return->isBitPerfect = isBitPerfect;
Eric Laurent0d13fea2022-11-04 17:12:08 +0100528 _aidl_return->attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -0700529 legacy2aidl_audio_attributes_t_AudioAttributes(attr));
Andy Hung6b137d12024-08-27 22:35:17 +0000530 _aidl_return->volume = volume;
Vlad Popa1e865e62024-08-15 19:11:42 -0700531 _aidl_return->muted = muted;
jiabinf1c73972022-04-14 16:28:52 -0700532 } else {
533 _aidl_return->configBase.format = VALUE_OR_RETURN_BINDER_STATUS(
534 legacy2aidl_audio_format_t_AudioFormatDescription(config.format));
535 _aidl_return->configBase.channelMask = VALUE_OR_RETURN_BINDER_STATUS(
536 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
537 config.channel_mask, false /*isInput*/));
538 _aidl_return->configBase.sampleRate = config.sample_rate;
Eric Laurentd7fe0862018-07-14 16:48:01 -0700539 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800540 return binderStatusFromStatusT(result);
Jean-Michel Trivi5bd3f382014-06-13 16:06:54 -0700541}
542
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700543void AudioPolicyService::getPlaybackClientAndEffects(audio_port_handle_t portId,
544 sp<AudioPlaybackClient>& client,
545 sp<AudioPolicyEffects>& effects,
546 const char *context)
547{
Andy Hung79eacdb2023-11-30 19:34:24 -0800548 audio_utils::lock_guard _l(mMutex);
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700549 const ssize_t index = mAudioPlaybackClients.indexOfKey(portId);
550 if (index < 0) {
551 ALOGE("%s AudioTrack client not found for portId %d", context, portId);
552 return;
553 }
554 client = mAudioPlaybackClients.valueAt(index);
555 effects = mAudioPolicyEffects;
556}
557
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800558Status AudioPolicyService::startOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800559{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800560 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
561 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700562 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800563 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800564 }
565 ALOGV("startOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700566 sp<AudioPlaybackClient> client;
Shunkai Yao8d6489a2023-04-18 23:14:25 +0000567 sp<AudioPolicyEffects> audioPolicyEffects;
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700568
569 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
570
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700571 if (audioPolicyEffects != 0) {
572 // create audio processors according to stream
Shunkai Yao8d6489a2023-04-18 23:14:25 +0000573 status_t status = audioPolicyEffects->addOutputSessionEffects(client->io, client->stream,
574 client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700575 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700576 ALOGW("Failed to add effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700577 }
578 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800579 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700580 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700581 status_t status = mAudioPolicyManager->startOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700582 if (status == NO_ERROR) {
Eric Laurent0d13fea2022-11-04 17:12:08 +0100583 //TODO b/257922898: decide if/how we need to handle attributes update when playback starts
584 // or during playback
585 (void)mUsecaseValidator->startClient(client->io, client->portId, client->attributionSource,
586 client->attributes, nullptr /* callback */);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700587 client->active = true;
Eric Laurent15903592022-02-24 20:44:36 +0100588 onUpdateActiveSpatializerTracks_l();
Eric Laurentd7fe0862018-07-14 16:48:01 -0700589 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800590 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800591}
592
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800593Status AudioPolicyService::stopOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800594{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800595 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
596 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700597 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800598 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800599 }
600 ALOGV("stopOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700601 mOutputCommandThread->stopOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800602 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800603}
604
Eric Laurentd7fe0862018-07-14 16:48:01 -0700605status_t AudioPolicyService::doStopOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800606{
Eric Laurentd7fe0862018-07-14 16:48:01 -0700607 ALOGV("doStopOutput");
608 sp<AudioPlaybackClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700609 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentd7fe0862018-07-14 16:48:01 -0700610
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700611 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
612
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700613 if (audioPolicyEffects != 0) {
614 // release audio processors from the stream
Eric Laurentd7fe0862018-07-14 16:48:01 -0700615 status_t status = audioPolicyEffects->releaseOutputSessionEffects(
616 client->io, client->stream, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700617 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Eric Laurentd7fe0862018-07-14 16:48:01 -0700618 ALOGW("Failed to release effects on session %d", client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700619 }
620 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800621 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -0700622 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -0700623 status_t status = mAudioPolicyManager->stopOutput(portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700624 if (status == NO_ERROR) {
625 client->active = false;
Eric Laurent15903592022-02-24 20:44:36 +0100626 onUpdateActiveSpatializerTracks_l();
Eric Laurent0d13fea2022-11-04 17:12:08 +0100627 mUsecaseValidator->stopClient(client->io, client->portId);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700628 }
629 return status;
Eric Laurent2d388ec2014-03-07 13:25:54 -0800630}
631
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800632Status AudioPolicyService::releaseOutput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800633{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800634 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
635 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -0700636 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800637 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800638 }
639 ALOGV("releaseOutput()");
Eric Laurentd7fe0862018-07-14 16:48:01 -0700640 mOutputCommandThread->releaseOutputCommand(portId);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800641 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800642}
643
Eric Laurentd7fe0862018-07-14 16:48:01 -0700644void AudioPolicyService::doReleaseOutput(audio_port_handle_t portId)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800645{
646 ALOGV("doReleaseOutput from tid %d", gettid());
Eric Laurentbcfe5be2019-04-09 19:56:39 -0700647 sp<AudioPlaybackClient> client;
648 sp<AudioPolicyEffects> audioPolicyEffects;
649
650 getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
651
652 if (audioPolicyEffects != 0 && client->active) {
653 // clean up effects if output was not stopped before being released
654 audioPolicyEffects->releaseOutputSessionEffects(
655 client->io, client->stream, client->session);
Eric Laurentd7fe0862018-07-14 16:48:01 -0700656 }
Andy Hung79eacdb2023-11-30 19:34:24 -0800657 audio_utils::lock_guard _l(mMutex);
Eric Laurent15903592022-02-24 20:44:36 +0100658 if (client != nullptr && client->active) {
659 onUpdateActiveSpatializerTracks_l();
660 }
Eric Laurentd4007242019-03-27 12:42:16 -0700661 mAudioPlaybackClients.removeItem(portId);
Eric Laurent10b71232018-04-13 18:14:44 -0700662 // called from internal thread: no need to clear caller identity
Eric Laurent8fc147b2018-07-22 19:13:55 -0700663 mAudioPolicyManager->releaseOutput(portId);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800664}
665
Atneya Nair89ff0432024-11-19 12:47:28 -0800666// These are sources for which CAPTURE_AUDIO_OUTPUT granted access
667// for legacy reasons, before more specific permissions were deployed.
668// TODO: remove this access
669static bool isLegacyOutputSource(AudioSource source) {
670 switch (source) {
671 case AudioSource::VOICE_CALL:
672 case AudioSource::VOICE_DOWNLINK:
673 case AudioSource::VOICE_UPLINK:
674 case AudioSource::FM_TUNER:
675 return true;
676 default:
677 return false;
678 }
679}
680
Atneya Nairfda90e82024-11-19 19:55:25 -0800681error::BinderResult<bool> AudioPolicyService::AudioPolicyClient::checkPermissionForInput(
682 const AttributionSourceState& attrSource, const PermissionReqs& req) {
683
Atneya Nair89ff0432024-11-19 12:47:28 -0800684 error::BinderResult<bool> permRes = true;
685 const auto check_perm = [&](PermissionEnum perm, uid_t uid) {
Atneya Nairfda90e82024-11-19 19:55:25 -0800686 return mAudioPolicyService->getPermissionProvider().checkPermission(perm, uid);
Atneya Nair89ff0432024-11-19 12:47:28 -0800687 };
Atneya Nairfda90e82024-11-19 19:55:25 -0800688 switch (req.source) {
Atneya Nair89ff0432024-11-19 12:47:28 -0800689 case AudioSource::VOICE_UPLINK:
690 case AudioSource::VOICE_DOWNLINK:
691 case AudioSource::VOICE_CALL:
692 permRes = audioserver_permissions()
693 ? check_perm(CALL_AUDIO_INTERCEPTION, attrSource.uid)
694 : callAudioInterceptionAllowed(attrSource);
695 break;
696 case AudioSource::ECHO_REFERENCE:
697 permRes = audioserver_permissions() ? check_perm(CAPTURE_AUDIO_OUTPUT, attrSource.uid)
698 : captureAudioOutputAllowed(attrSource);
699 break;
700 case AudioSource::FM_TUNER:
701 permRes = audioserver_permissions()
702 ? check_perm(CAPTURE_TUNER_AUDIO_INPUT, attrSource.uid)
703 : captureTunerAudioInputAllowed(attrSource);
704 break;
705 case AudioSource::HOTWORD:
706 permRes = audioserver_permissions() ? check_perm(CAPTURE_AUDIO_HOTWORD, attrSource.uid)
707 : captureHotwordAllowed(attrSource);
708 break;
709 case AudioSource::ULTRASOUND:
710 permRes = audioserver_permissions() ? check_perm(ACCESS_ULTRASOUND, attrSource.uid)
711 : accessUltrasoundAllowed(attrSource);
712 break;
713 case AudioSource::SYS_RESERVED_INVALID:
714 case AudioSource::DEFAULT:
715 case AudioSource::MIC:
716 case AudioSource::CAMCORDER:
717 case AudioSource::VOICE_RECOGNITION:
718 case AudioSource::VOICE_COMMUNICATION:
719 case AudioSource::UNPROCESSED:
720 case AudioSource::VOICE_PERFORMANCE:
721 // No additional check intended
722 case AudioSource::REMOTE_SUBMIX:
Atneya Nairfda90e82024-11-19 19:55:25 -0800723 // special-case checked based on mix type below
Atneya Nair89ff0432024-11-19 12:47:28 -0800724 break;
725 }
726
Atneya Nairfda90e82024-11-19 19:55:25 -0800727 if (!permRes.has_value()) return permRes;
728 if (!permRes.value()) {
729 if (isLegacyOutputSource(req.source)) {
Atneya Nair89ff0432024-11-19 12:47:28 -0800730 permRes = audioserver_permissions() ? check_perm(CAPTURE_AUDIO_OUTPUT, attrSource.uid)
731 : captureAudioOutputAllowed(attrSource);
732 PROPAGATE_FALSEY(permRes);
733 } else {
734 return false;
735 }
736 }
737
Atneya Nairfda90e82024-11-19 19:55:25 -0800738 if (req.isHotword) {
Atneya Nair89ff0432024-11-19 12:47:28 -0800739 permRes = audioserver_permissions() ? check_perm(CAPTURE_AUDIO_HOTWORD, attrSource.uid)
740 : captureHotwordAllowed(attrSource);
741 PROPAGATE_FALSEY(permRes);
742 }
743
Atneya Nairfda90e82024-11-19 19:55:25 -0800744 // TODO evaluate whether we should be checking call redirection like this
Atneya Nair89ff0432024-11-19 12:47:28 -0800745 bool isAllowedDueToCallPerm = false;
Atneya Nairfda90e82024-11-19 19:55:25 -0800746 if (req.isCallRedir) {
Atneya Nair89ff0432024-11-19 12:47:28 -0800747 const auto checkCall = audioserver_permissions()
Atneya Nairfda90e82024-11-19 19:55:25 -0800748 ? check_perm(CALL_AUDIO_INTERCEPTION, attrSource.uid)
749 : callAudioInterceptionAllowed(attrSource);
Atneya Nair89ff0432024-11-19 12:47:28 -0800750 isAllowedDueToCallPerm = VALUE_OR_RETURN(checkCall);
751 }
Atneya Nairfda90e82024-11-19 19:55:25 -0800752
753 switch (req.mixType) {
754 case MixType::NONE:
755 break;
756 case MixType::PUBLIC_CAPTURE_PLAYBACK:
Atneya Nair89ff0432024-11-19 12:47:28 -0800757 // this use case has been validated in audio service with a MediaProjection token,
758 // and doesn't rely on regular permissions
Atneya Nairfda90e82024-11-19 19:55:25 -0800759 // TODO (b/378778313)
Atneya Nair89ff0432024-11-19 12:47:28 -0800760 break;
Atneya Nairfda90e82024-11-19 19:55:25 -0800761 case MixType::TELEPHONY_RX_CAPTURE:
Atneya Nair89ff0432024-11-19 12:47:28 -0800762 if (isAllowedDueToCallPerm) break;
763 // FIXME: use the same permission as for remote submix for now.
764 FALLTHROUGH_INTENDED;
Atneya Nairfda90e82024-11-19 19:55:25 -0800765 case MixType::CAPTURE:
Atneya Nair89ff0432024-11-19 12:47:28 -0800766 permRes = audioserver_permissions() ? check_perm(CAPTURE_AUDIO_OUTPUT, attrSource.uid)
767 : captureAudioOutputAllowed(attrSource);
768 break;
Atneya Nairfda90e82024-11-19 19:55:25 -0800769 case MixType::EXT_POLICY_REROUTE:
Atneya Nair89ff0432024-11-19 12:47:28 -0800770 // TODO intended?
771 if (isAllowedDueToCallPerm) break;
772 permRes = audioserver_permissions() ? check_perm(MODIFY_AUDIO_ROUTING, attrSource.uid)
773 : modifyAudioRoutingAllowed(attrSource);
774 break;
Atneya Nair89ff0432024-11-19 12:47:28 -0800775 }
776
777 PROPAGATE_FALSEY(permRes);
778
Atneya Nairfda90e82024-11-19 19:55:25 -0800779 // All sources which aren't output capture
780 // AND capture from vdi policy mix (the injected audio is mic data from another device)
781 // REQUIRE RECORD perms
782 const auto legacySource = aidl2legacy_AudioSource_audio_source_t(req.source).value();
783 if (req.virtualDeviceId != kDefaultVirtualDeviceId) {
784 // TODO assert that this is always a recordOpSource
785 // TODO upcall solution
786 return recordingAllowed(attrSource, req.virtualDeviceId, legacySource);
787 }
788
789 if (isRecordOpRequired(legacySource)) {
790 permRes = audioserver_permissions() ? check_perm(RECORD_AUDIO, attrSource.uid)
791 : recordingAllowed(attrSource, legacySource);
792 PROPAGATE_FALSEY(permRes);
Atneya Nair89ff0432024-11-19 12:47:28 -0800793 }
794 return true;
795}
796
Mikhail Naganov1c400902023-05-17 11:48:43 -0700797Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttributes& attrAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800798 int32_t inputAidl,
799 int32_t riidAidl,
800 int32_t sessionAidl,
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000801 const AttributionSourceState& attributionSource,
Mikhail Naganovdbf03642021-08-25 18:15:32 -0700802 const AudioConfigBase& configAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800803 int32_t flagsAidl,
Eric Laurentf99edd32021-02-01 15:57:33 +0100804 int32_t selectedDeviceIdAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800805 media::GetInputForAttrResponse* _aidl_return) {
Atneya Nair89ff0432024-11-19 12:47:28 -0800806 auto inputSource = attrAidl.source;
Atneya Nair25fbcf22024-11-19 19:53:23 -0800807 const audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -0700808 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Atneya Nair25fbcf22024-11-19 19:53:23 -0800809 const audio_io_handle_t requestedInput = VALUE_OR_RETURN_BINDER_STATUS(
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800810 aidl2legacy_int32_t_audio_io_handle_t(inputAidl));
Atneya Nair25fbcf22024-11-19 19:53:23 -0800811 const audio_unique_id_t riid = VALUE_OR_RETURN_BINDER_STATUS(
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800812 aidl2legacy_int32_t_audio_unique_id_t(riidAidl));
Atneya Nair25fbcf22024-11-19 19:53:23 -0800813 const audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800814 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Atneya Nair25fbcf22024-11-19 19:53:23 -0800815 const audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -0700816 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl, true /*isInput*/));
Atneya Nair25fbcf22024-11-19 19:53:23 -0800817 const audio_input_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800818 aidl2legacy_int32_t_audio_input_flags_t_mask(flagsAidl));
Atneya Nair25fbcf22024-11-19 19:53:23 -0800819 const audio_port_handle_t requestedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
Eric Laurentf99edd32021-02-01 15:57:33 +0100820 aidl2legacy_int32_t_audio_port_handle_t(selectedDeviceIdAidl));
821
Eric Laurentdce54a12014-03-10 12:19:46 -0700822 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800823 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800824 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800825
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800826 RETURN_IF_BINDER_ERROR(
827 binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
Hayden Gomes524159d2019-12-23 14:41:47 -0800828
Atneya Nair89ff0432024-11-19 12:47:28 -0800829 if (inputSource == AudioSource::SYS_RESERVED_INVALID ||
830 std::find(enum_range<AudioSource>().begin(), enum_range<AudioSource>().end(),
831 inputSource) == enum_range<AudioSource>().end()) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800832 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800833 }
834
Atneya Nair89ff0432024-11-19 12:47:28 -0800835 if (inputSource == AudioSource::DEFAULT) {
836 inputSource = AudioSource::MIC;
Eric Laurent7dca8a82018-01-29 18:44:26 -0800837 }
838
Atneya Nair89ff0432024-11-19 12:47:28 -0800839 const bool isCallRedir = (attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0;
840
Eric Laurentdbb80322024-11-18 16:09:51 -0800841 //TODO(b/374751406): remove forcing canBypassConcurrentPolicy to canCaptureOutput
842 // once all system apps using CAPTURE_AUDIO_OUTPUT to capture during calls
843 // are updated to use the new CONCURRENT_AUDIO_RECORD_BYPASS permission.
Atneya Nairfda90e82024-11-19 19:55:25 -0800844 bool canBypassConcurrentPolicy = audioserver_permissions()
845 ? CHECK_PERM(CAPTURE_AUDIO_OUTPUT, attributionSource.uid)
846 : captureAudioOutputAllowed(attributionSource);
Eric Laurentdbb80322024-11-18 16:09:51 -0800847 if (concurrent_audio_record_bypass_permission()) {
848 canBypassConcurrentPolicy = audioserver_permissions() ?
849 CHECK_PERM(BYPASS_CONCURRENT_RECORD_AUDIO_RESTRICTION,
850 attributionSource.uid)
851 : bypassConcurrentPolicyAllowed(attributionSource);
852 }
Eric Laurentb0eff0f2021-11-09 16:05:49 +0100853
Atneya Nair25fbcf22024-11-19 19:53:23 -0800854 sp<AudioPolicyEffects> audioPolicyEffects;
855 base::expected<media::GetInputForAttrResponse, std::variant<binder::Status, AudioConfigBase>>
856 res;
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700857 {
Andy Hung79eacdb2023-11-30 19:34:24 -0800858 audio_utils::lock_guard _l(mMutex);
Atneya Nairfda90e82024-11-19 19:55:25 -0800859 AutoCallerClear acc;
860 // the audio_in_acoustics_t parameter is ignored by get_input()
861 res = mAudioPolicyManager->getInputForAttr(attr, requestedInput, requestedDeviceId,
862 config, flags, riid, session,
863 attributionSource);
Atneya Nair25fbcf22024-11-19 19:53:23 -0800864 if (!res.has_value()) {
865 if (res.error().index() == 1) {
866 _aidl_return->config = std::get<1>(res.error());
867 return Status::fromExceptionCode(EX_ILLEGAL_STATE);
868 } else {
869 return std::get<0>(res.error());
870 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800871 }
Eric Laurentfee19762018-01-29 18:44:13 -0800872
Atneya Nairfda90e82024-11-19 19:55:25 -0800873 audioPolicyEffects = mAudioPolicyEffects;
874
875 sp<AudioRecordClient> client = new AudioRecordClient(
876 attr, res->input, session, res->portId, {res->selectedDeviceId}, attributionSource,
877 res->virtualDeviceId, canBypassConcurrentPolicy, mOutputCommandThread);
Atneya Nair25fbcf22024-11-19 19:53:23 -0800878 mAudioRecordClients.add(res->portId, client);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700879 }
Jean-Michel Trivi97bb33f2014-12-12 16:23:43 -0800880
Atneya Nairfda90e82024-11-19 19:55:25 -0800881 if (audioPolicyEffects != nullptr) {
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700882 // create audio pre processors according to input source
Atneya Nair25fbcf22024-11-19 19:53:23 -0800883 status_t status = audioPolicyEffects->addInputEffects(res->input,
Atneya Nair89ff0432024-11-19 12:47:28 -0800884 aidl2legacy_AudioSource_audio_source_t(inputSource).value(), session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700885 if (status != NO_ERROR && status != ALREADY_EXISTS) {
Atneya Nair25fbcf22024-11-19 19:53:23 -0800886 ALOGW("Failed to add effects on input %d", res->input);
Eric Laurent8b1e80b2014-10-07 09:08:47 -0700887 }
Eric Laurent2d388ec2014-03-07 13:25:54 -0800888 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800889
Atneya Nair25fbcf22024-11-19 19:53:23 -0800890 *_aidl_return = res.value();
891
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800892 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -0800893}
894
Eric Laurent99fcae42018-05-17 16:59:18 -0700895std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) {
jiabin19cdba52020-11-24 11:28:58 -0800896 struct audio_port_v7 port = {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700897 port.id = portId;
898 status_t status = mAudioPolicyManager->getAudioPort(&port);
899 if (status == NO_ERROR && port.type == AUDIO_PORT_TYPE_DEVICE) {
Andy Hung9b181952019-02-25 14:53:36 -0800900 return toString(port.ext.device.type);
Eric Laurent99fcae42018-05-17 16:59:18 -0700901 }
Andy Hung9b181952019-02-25 14:53:36 -0800902 return {};
Eric Laurent99fcae42018-05-17 16:59:18 -0700903}
904
Robert Wufb971192024-10-30 21:54:35 +0000905std::string AudioPolicyService::getDeviceTypeStrForPortIds(DeviceIdVector portIds) {
906 std::string output = {};
907 for (auto it = portIds.begin(); it != portIds.end(); ++it) {
908 if (it != portIds.begin()) {
909 output += ", ";
910 }
911 output += getDeviceTypeStrForPortId(*it);
912 }
913 return output;
914}
915
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800916Status AudioPolicyService::startInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -0800917{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800918 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
919 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
920
Eric Laurentdce54a12014-03-10 12:19:46 -0700921 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800922 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -0800923 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800924 sp<AudioRecordClient> client;
925 {
Andy Hung79eacdb2023-11-30 19:34:24 -0800926 audio_utils::lock_guard _l(mMutex);
Svet Ganovf4ddfef2018-01-16 07:37:58 -0800927
Eric Laurent7dca8a82018-01-29 18:44:26 -0800928 ssize_t index = mAudioRecordClients.indexOfKey(portId);
929 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800930 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800931 }
932 client = mAudioRecordClients.valueAt(index);
Eric Laurentfee19762018-01-29 18:44:13 -0800933 }
Eric Laurent7dca8a82018-01-29 18:44:26 -0800934
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700935 std::stringstream msg;
936 msg << "Audio recording on session " << client->session;
Atneya Nair38558e12024-10-25 17:59:36 -0700937
Atneya Nairdb6ef1e2024-09-16 20:26:30 +0000938 const auto permitted = startRecording(client->attributionSource, client->virtualDeviceId,
939 String16(msg.str().c_str()), client->attributes.source);
Philip P. Moltmannbda45752020-07-17 16:41:18 -0700940
Eric Laurent7dca8a82018-01-29 18:44:26 -0800941 // check calling permissions
Atneya Nair38558e12024-10-25 17:59:36 -0700942 if (permitted == PERMISSION_HARD_DENIED) {
Svet Ganov3e5f14f2021-05-13 22:51:08 +0000943 ALOGE("%s permission denied: recording not allowed for attribution source %s",
944 __func__, client->attributionSource.toString().c_str());
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -0800945 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent7dca8a82018-01-29 18:44:26 -0800946 }
Eric Laurentfee19762018-01-29 18:44:13 -0800947
Andy Hung79eacdb2023-11-30 19:34:24 -0800948 audio_utils::lock_guard _l(mMutex);
Eric Laurent4eb58f12018-12-07 16:41:02 -0800949
Atneya Naire7720b32023-05-10 17:26:30 -0700950 ALOGW_IF(client->silenced, "startInput on silenced input for port %d, uid %d. Unsilencing.",
951 portIdAidl,
952 client->attributionSource.uid);
953
954 if (client->active) {
955 ALOGE("Client should never be active before startInput. Uid %d port %d",
956 client->attributionSource.uid, portId);
Marvin Raminb03b49f2024-04-04 16:25:31 +0200957 finishRecording(client->attributionSource, client->virtualDeviceId,
958 client->attributes.source);
Atneya Naire7720b32023-05-10 17:26:30 -0700959 return binderStatusFromStatusT(INVALID_OPERATION);
960 }
961
Atneya Nairdb6ef1e2024-09-16 20:26:30 +0000962 // Force the possibly silenced client to match the state on the appops side
963 // following the call to startRecording (i.e. unsilenced iff call succeeded)
964 // At this point in time, the client is inactive, so no calls to appops are
965 // sent in setAppState_l. This ensures existing clients have the same
966 // behavior as new clients.
Atneya Naire7720b32023-05-10 17:26:30 -0700967 // TODO(b/282076713)
Atneya Nairdb6ef1e2024-09-16 20:26:30 +0000968 if (permitted == PERMISSION_GRANTED) {
969 setAppState_l(client, APP_STATE_TOP);
970 } else {
971 setAppState_l(client, APP_STATE_IDLE);
972 }
Atneya Naire7720b32023-05-10 17:26:30 -0700973
Eric Laurent4eb58f12018-12-07 16:41:02 -0800974 client->active = true;
975 client->startTimeNs = systemTime();
Atneya Naire7720b32023-05-10 17:26:30 -0700976 // This call updates the silenced state, and since we are active, appropriately notifies appops
977 // if we silence the track.
Eric Laurent4eb58f12018-12-07 16:41:02 -0800978 updateUidStates_l();
Eric Laurentfee19762018-01-29 18:44:13 -0800979
Eric Laurent10b71232018-04-13 18:14:44 -0700980 status_t status;
981 {
982 AutoCallerClear acc;
Eric Laurent4eb58f12018-12-07 16:41:02 -0800983 status = mAudioPolicyManager->startInput(portId);
Ray Essick84e84a52018-05-03 18:45:07 -0700984
985 }
986
Ray Essickf6a57cd2018-05-22 16:20:54 -0700987 // including successes gets very verbose
Muhammad Qureshi087b37c2020-06-16 16:37:36 -0700988 // but once we cut over to statsd, log them all.
Ray Essickf6a57cd2018-05-22 16:20:54 -0700989 if (status != NO_ERROR) {
Ray Essick84e84a52018-05-03 18:45:07 -0700990
991 static constexpr char kAudioPolicy[] = "audiopolicy";
992
Ray Essick84e84a52018-05-03 18:45:07 -0700993 static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status";
994 static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src";
995 static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg";
996 static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session";
Eric Laurent99fcae42018-05-17 16:59:18 -0700997 static constexpr char kAudioPolicyRqstDevice[] =
998 "android.media.audiopolicy.rqst.device";
Ray Essick84e84a52018-05-03 18:45:07 -0700999 static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src";
1000 static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg";
Eric Laurent99fcae42018-05-17 16:59:18 -07001001 static constexpr char kAudioPolicyActiveSession[] =
1002 "android.media.audiopolicy.active.session";
1003 static constexpr char kAudioPolicyActiveDevice[] =
1004 "android.media.audiopolicy.active.device";
Robert Wufb971192024-10-30 21:54:35 +00001005 static constexpr char kAudioPolicyActiveDevices[] =
1006 "android.media.audiopolicy.active.devices";
Ray Essick84e84a52018-05-03 18:45:07 -07001007
Ray Essickf27e9872019-12-07 06:28:46 -08001008 mediametrics::Item *item = mediametrics::Item::create(kAudioPolicy);
Ray Essick84e84a52018-05-03 18:45:07 -07001009 if (item != NULL) {
1010
Ray Essick84e84a52018-05-03 18:45:07 -07001011 item->setInt32(kAudioPolicyStatus, status);
1012
Eric Laurent99fcae42018-05-17 16:59:18 -07001013 item->setCString(kAudioPolicyRqstSrc,
Andy Hung9b181952019-02-25 14:53:36 -08001014 toString(client->attributes.source).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -07001015 item->setInt32(kAudioPolicyRqstSession, client->session);
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001016 if (client->attributionSource.packageName.has_value() &&
1017 client->attributionSource.packageName.value().size() != 0) {
Ray Essick51866952018-05-30 11:22:27 -07001018 item->setCString(kAudioPolicyRqstPkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001019 client->attributionSource.packageName.value().c_str());
Ray Essick51866952018-05-30 11:22:27 -07001020 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001021 item->setCString(kAudioPolicyRqstPkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001022 std::to_string(client->attributionSource.uid).c_str());
Ray Essick51866952018-05-30 11:22:27 -07001023 }
Robert Wufb971192024-10-30 21:54:35 +00001024 item->setCString(kAudioPolicyRqstDevice,
1025 getDeviceTypeStrForPortId(getFirstDeviceId(client->deviceIds)).c_str());
Eric Laurent99fcae42018-05-17 16:59:18 -07001026
Eric Laurent4eb58f12018-12-07 16:41:02 -08001027 int count = mAudioRecordClients.size();
1028 for (int i = 0; i < count ; i++) {
1029 if (portId == mAudioRecordClients.keyAt(i)) {
1030 continue;
1031 }
1032 sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
1033 if (other->active) {
1034 // keeps the last of the clients marked active
1035 item->setCString(kAudioPolicyActiveSrc,
Andy Hung9b181952019-02-25 14:53:36 -08001036 toString(other->attributes.source).c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -08001037 item->setInt32(kAudioPolicyActiveSession, other->session);
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001038 if (other->attributionSource.packageName.has_value() &&
1039 other->attributionSource.packageName.value().size() != 0) {
Eric Laurent4eb58f12018-12-07 16:41:02 -08001040 item->setCString(kAudioPolicyActivePkg,
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001041 other->attributionSource.packageName.value().c_str());
Eric Laurent4eb58f12018-12-07 16:41:02 -08001042 } else {
Philip P. Moltmannbda45752020-07-17 16:41:18 -07001043 item->setCString(kAudioPolicyRqstPkg, std::to_string(
Svet Ganov3e5f14f2021-05-13 22:51:08 +00001044 other->attributionSource.uid).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -07001045 }
Eric Laurent4eb58f12018-12-07 16:41:02 -08001046 item->setCString(kAudioPolicyActiveDevice,
Robert Wufb971192024-10-30 21:54:35 +00001047 getDeviceTypeStrForPortId(getFirstDeviceId(other->deviceIds)).c_str());
1048 item->setCString(kAudioPolicyActiveDevices,
1049 getDeviceTypeStrForPortIds(other->deviceIds).c_str());
Ray Essick84e84a52018-05-03 18:45:07 -07001050 }
1051 }
1052 item->selfrecord();
1053 delete item;
1054 item = NULL;
1055 }
Ray Essick6ce27e52019-02-15 10:58:05 -08001056 }
1057
1058 if (status != NO_ERROR) {
Eric Laurent4eb58f12018-12-07 16:41:02 -08001059 client->active = false;
1060 client->startTimeNs = 0;
1061 updateUidStates_l();
Atneya Nairdb6ef1e2024-09-16 20:26:30 +00001062 if (!client->silenced) {
1063 finishRecording(client->attributionSource, client->virtualDeviceId,
1064 client->attributes.source);
1065 }
Eric Laurentfb66dd92016-01-28 18:32:03 -08001066 }
1067
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001068 return binderStatusFromStatusT(status);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001069}
1070
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001071Status AudioPolicyService::stopInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001072{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001073 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
1074 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1075
Eric Laurentdce54a12014-03-10 12:19:46 -07001076 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001077 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001078 }
Eric Laurent4eb58f12018-12-07 16:41:02 -08001079
Andy Hung79eacdb2023-11-30 19:34:24 -08001080 audio_utils::lock_guard _l(mMutex);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001081
Eric Laurentfee19762018-01-29 18:44:13 -08001082 ssize_t index = mAudioRecordClients.indexOfKey(portId);
1083 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001084 return binderStatusFromStatusT(INVALID_OPERATION);
Eric Laurentfee19762018-01-29 18:44:13 -08001085 }
1086 sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
1087
Ray Essick84e84a52018-05-03 18:45:07 -07001088 client->active = false;
Eric Laurent4eb58f12018-12-07 16:41:02 -08001089 client->startTimeNs = 0;
1090
1091 updateUidStates_l();
Ray Essick84e84a52018-05-03 18:45:07 -07001092
Svet Ganov6e641372018-03-02 09:21:30 -08001093 // finish the recording app op
Atneya Nairdb6ef1e2024-09-16 20:26:30 +00001094 if (!client->silenced) {
1095 finishRecording(client->attributionSource, client->virtualDeviceId,
1096 client->attributes.source);
1097 }
1098
Eric Laurent10b71232018-04-13 18:14:44 -07001099 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001100 return binderStatusFromStatusT(mAudioPolicyManager->stopInput(portId));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001101}
1102
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001103Status AudioPolicyService::releaseInput(int32_t portIdAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001104{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001105 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
1106 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1107
Eric Laurentdce54a12014-03-10 12:19:46 -07001108 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001109 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001110 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001111 sp<AudioPolicyEffects>audioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -08001112 sp<AudioRecordClient> client;
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001113 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001114 audio_utils::lock_guard _l(mMutex);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001115 audioPolicyEffects = mAudioPolicyEffects;
Eric Laurentfee19762018-01-29 18:44:13 -08001116 ssize_t index = mAudioRecordClients.indexOfKey(portId);
1117 if (index < 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001118 return Status::ok();
Eric Laurentfee19762018-01-29 18:44:13 -08001119 }
1120 client = mAudioRecordClients.valueAt(index);
Eric Laurent4eb58f12018-12-07 16:41:02 -08001121
1122 if (client->active) {
1123 ALOGW("%s releasing active client portId %d", __FUNCTION__, portId);
1124 client->active = false;
1125 client->startTimeNs = 0;
1126 updateUidStates_l();
1127 }
1128
Eric Laurentfee19762018-01-29 18:44:13 -08001129 mAudioRecordClients.removeItem(portId);
1130 }
1131 if (client == 0) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001132 return Status::ok();
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001133 }
1134 if (audioPolicyEffects != 0) {
1135 // release audio processors from the input
Eric Laurentd7fe0862018-07-14 16:48:01 -07001136 status_t status = audioPolicyEffects->releaseInputEffects(client->io, client->session);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001137 if(status != NO_ERROR) {
Eric Laurentd7fe0862018-07-14 16:48:01 -07001138 ALOGW("Failed to release effects on input %d", client->io);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001139 }
Eric Laurent2d388ec2014-03-07 13:25:54 -08001140 }
Eric Laurentf10c7092016-12-06 17:09:56 -08001141 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001142 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001143 AutoCallerClear acc;
Eric Laurent8fc147b2018-07-22 19:13:55 -07001144 mAudioPolicyManager->releaseInput(portId);
Eric Laurentf10c7092016-12-06 17:09:56 -08001145 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001146 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001147}
1148
Vlad Popa87e0e582024-05-20 18:49:20 -07001149Status AudioPolicyService::setDeviceAbsoluteVolumeEnabled(const AudioDevice& deviceAidl,
1150 bool enabled,
1151 AudioStreamType streamToDriveAbsAidl) {
Vlad Popa08502d82024-10-22 20:17:47 -07001152 ALOGI("%s: deviceAidl %s, enabled %d, streamToDriveAbsAidl %d", __func__,
1153 deviceAidl.toString().c_str(), enabled, streamToDriveAbsAidl);
1154
Vlad Popae2c51382024-10-22 21:07:42 -07001155 audio_stream_type_t streamToDriveAbs = AUDIO_STREAM_DEFAULT;
1156 if (enabled) {
1157 streamToDriveAbs = VALUE_OR_RETURN_BINDER_STATUS(
1158 aidl2legacy_AudioStreamType_audio_stream_type_t(streamToDriveAbsAidl));
1159 }
1160
Vlad Popa87e0e582024-05-20 18:49:20 -07001161 audio_devices_t deviceType;
1162 std::string address;
1163 RETURN_BINDER_STATUS_IF_ERROR(
1164 aidl2legacy_AudioDevice_audio_device(deviceAidl, &deviceType, &address));
1165
1166 if (mAudioPolicyManager == nullptr) {
1167 return binderStatusFromStatusT(NO_INIT);
1168 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001169 if (!(audioserver_permissions() ?
1170 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1171 : settingsAllowed())) {
Vlad Popa87e0e582024-05-20 18:49:20 -07001172 return binderStatusFromStatusT(PERMISSION_DENIED);
1173 }
Vlad Popae2c51382024-10-22 21:07:42 -07001174
Vlad Popa87e0e582024-05-20 18:49:20 -07001175 audio_utils::lock_guard _l(mMutex);
1176 AutoCallerClear acc;
1177 return binderStatusFromStatusT(
1178 mAudioPolicyManager->setDeviceAbsoluteVolumeEnabled(deviceType, address.c_str(),
1179 enabled, streamToDriveAbs));
1180}
1181
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001182Status AudioPolicyService::initStreamVolume(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001183 int32_t indexMinAidl,
1184 int32_t indexMaxAidl) {
1185 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1186 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1187 int indexMin = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMinAidl));
1188 int indexMax = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMaxAidl));
1189
Eric Laurentdce54a12014-03-10 12:19:46 -07001190 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001191 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001192 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001193 if (!(audioserver_permissions() ?
1194 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1195 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001196 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001197 }
Eric Laurent223fd5c2014-11-11 13:43:36 -08001198 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001199 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001200 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001201 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001202 AutoCallerClear acc;
Eric Laurentdce54a12014-03-10 12:19:46 -07001203 mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001204 return binderStatusFromStatusT(NO_ERROR);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001205}
1206
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001207Status AudioPolicyService::setStreamVolumeIndex(AudioStreamType streamAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001208 const AudioDeviceDescription& deviceAidl,
Vlad Popa1e865e62024-08-15 19:11:42 -07001209 int32_t indexAidl, bool muted) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001210 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1211 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1212 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1213 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001214 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001215
Eric Laurentdce54a12014-03-10 12:19:46 -07001216 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001217 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001218 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001219 if (!(audioserver_permissions() ?
1220 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1221 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001222 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001223 }
Eric Laurent223fd5c2014-11-11 13:43:36 -08001224 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001225 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001226 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001227 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001228 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001229 return binderStatusFromStatusT(mAudioPolicyManager->setStreamVolumeIndex(stream,
1230 index,
Vlad Popa1e865e62024-08-15 19:11:42 -07001231 muted,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001232 device));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001233}
1234
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001235Status AudioPolicyService::getStreamVolumeIndex(AudioStreamType streamAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001236 const AudioDeviceDescription& deviceAidl,
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001237 int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001238 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1239 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1240 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001241 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001242 int index;
1243
Eric Laurentdce54a12014-03-10 12:19:46 -07001244 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001245 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001246 }
Eric Laurent223fd5c2014-11-11 13:43:36 -08001247 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001248 return binderStatusFromStatusT(BAD_VALUE);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001249 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001250 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001251 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001252 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1253 mAudioPolicyManager->getStreamVolumeIndex(stream, &index, device)));
1254 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1255 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001256}
1257
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001258Status AudioPolicyService::setVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001259 const media::audio::common::AudioAttributes& attrAidl,
Vlad Popa1e865e62024-08-15 19:11:42 -07001260 const AudioDeviceDescription& deviceAidl, int32_t indexAidl, bool muted) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001261 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001262 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001263 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1264 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001265 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001266 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1267 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1268
François Gaffiecfe17322018-11-07 13:41:29 +01001269 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001270 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001271 }
Atneya Nair09859fe2024-07-15 16:38:02 -07001272 if (!(audioserver_permissions() ?
1273 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1274 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001275 return binderStatusFromStatusT(PERMISSION_DENIED);
François Gaffiecfe17322018-11-07 13:41:29 +01001276 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001277 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001278 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001279 return binderStatusFromStatusT(
Vlad Popa1e865e62024-08-15 19:11:42 -07001280 mAudioPolicyManager->setVolumeIndexForAttributes(attributes, index, muted, device));
François Gaffiecfe17322018-11-07 13:41:29 +01001281}
1282
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001283Status AudioPolicyService::getVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001284 const media::audio::common::AudioAttributes& attrAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001285 const AudioDeviceDescription& deviceAidl, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001286 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001287 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001288 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001289 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001290 int index;
1291 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1292 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1293
François Gaffiecfe17322018-11-07 13:41:29 +01001294 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001295 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001296 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001297 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001298 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001299 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1300 mAudioPolicyManager->getVolumeIndexForAttributes(attributes, index, device)));
1301 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1302 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001303}
1304
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001305Status AudioPolicyService::getMinVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001306 const media::audio::common::AudioAttributes& attrAidl, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001307 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001308 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001309 int index;
1310 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1311 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1312
François Gaffiecfe17322018-11-07 13:41:29 +01001313 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001314 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001315 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001316 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001317 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001318 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1319 mAudioPolicyManager->getMinVolumeIndexForAttributes(attributes, index)));
1320 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1321 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001322}
1323
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001324Status AudioPolicyService::getMaxVolumeIndexForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001325 const media::audio::common::AudioAttributes& attrAidl, int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001326 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001327 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001328 int index;
1329 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1330 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1331
François Gaffiecfe17322018-11-07 13:41:29 +01001332 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001333 return binderStatusFromStatusT(NO_INIT);
François Gaffiecfe17322018-11-07 13:41:29 +01001334 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001335 audio_utils::lock_guard _l(mMutex);
François Gaffiecfe17322018-11-07 13:41:29 +01001336 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001337 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1338 mAudioPolicyManager->getMaxVolumeIndexForAttributes(attributes, index)));
1339 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1340 return Status::ok();
François Gaffiecfe17322018-11-07 13:41:29 +01001341}
1342
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001343Status AudioPolicyService::getStrategyForStream(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001344 int32_t* _aidl_return) {
1345 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1346 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1347
Eric Laurent223fd5c2014-11-11 13:43:36 -08001348 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001349 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1350 convertReinterpret<int32_t>(PRODUCT_STRATEGY_NONE));
1351 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001352 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001353 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001354 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001355 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001356
François Gaffiec005e562018-11-06 15:04:49 +01001357 // DO NOT LOCK, may be called from AudioFlinger with lock held, reaching deadlock
Eric Laurent10b71232018-04-13 18:14:44 -07001358 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001359 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1360 legacy2aidl_product_strategy_t_int32_t(
1361 mAudioPolicyManager->getStrategyForStream(stream)));
1362 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001363}
1364
Mikhail Naganov1c400902023-05-17 11:48:43 -07001365Status AudioPolicyService::getDevicesForAttributes(
1366 const media::audio::common::AudioAttributes& attrAidl,
1367 bool forVolume,
1368 std::vector<AudioDevice>* _aidl_return)
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001369{
François Gaffie1e2b56f2022-04-01 14:34:29 +02001370 audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001371 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001372 AudioDeviceTypeAddrVector devices;
1373
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001374 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001375 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001376 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001377 audio_utils::lock_guard _l(mMutex);
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001378 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001379 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
François Gaffie1e2b56f2022-04-01 14:34:29 +02001380 mAudioPolicyManager->getDevicesForAttributes(aa, &devices, forVolume)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001381 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00001382 convertContainer<std::vector<AudioDevice>>(devices,
1383 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001384 return Status::ok();
Jean-Michel Trivif41599b2020-01-07 14:22:08 -08001385}
1386
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001387Status AudioPolicyService::getOutputForEffect(const media::EffectDescriptor& descAidl,
1388 int32_t* _aidl_return) {
1389 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1390 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1391 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1392 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1393
Eric Laurentdce54a12014-03-10 12:19:46 -07001394 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001395 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001396 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001397 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001398 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001399 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1400 legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutputForEffect(&desc)));
1401 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001402}
1403
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001404Status AudioPolicyService::registerEffect(const media::EffectDescriptor& descAidl, int32_t ioAidl,
1405 int32_t strategyAidl, int32_t sessionAidl,
1406 int32_t idAidl) {
1407 effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1408 aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1409 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1410 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1411 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
1412 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
1413 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1414 aidl2legacy_int32_t_audio_session_t(sessionAidl));
1415 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
1416 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1417 AudioValidator::validateEffectDescriptor(desc, "73126106")));
1418
Eric Laurentdce54a12014-03-10 12:19:46 -07001419 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001420 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001421 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001422 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001423 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001424 return binderStatusFromStatusT(
1425 mAudioPolicyManager->registerEffect(&desc, io, strategy, session, id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001426}
1427
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001428Status AudioPolicyService::unregisterEffect(int32_t idAidl)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001429{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001430 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001431 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001432 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001433 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001434 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001435 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001436 return binderStatusFromStatusT(mAudioPolicyManager->unregisterEffect(id));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001437}
1438
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001439Status AudioPolicyService::setEffectEnabled(int32_t idAidl, bool enabled)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001440{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001441 int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001442 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001443 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001444 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001445 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001446 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001447 return binderStatusFromStatusT(mAudioPolicyManager->setEffectEnabled(id, enabled));
Eric Laurent2d388ec2014-03-07 13:25:54 -08001448}
1449
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001450Status AudioPolicyService::moveEffectsToIo(const std::vector<int32_t>& idsAidl, int32_t ioAidl)
1451
Eric Laurent6c796322019-04-09 14:13:17 -07001452{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001453 const std::vector<int>& ids = VALUE_OR_RETURN_BINDER_STATUS(
1454 convertContainer<std::vector<int>>(idsAidl, convertReinterpret<int, int32_t>));
1455 audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1456 aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1457 if (ids.size() > MAX_ITEMS_PER_LIST) {
1458 return binderStatusFromStatusT(BAD_VALUE);
1459 }
1460
Eric Laurent6c796322019-04-09 14:13:17 -07001461 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001462 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6c796322019-04-09 14:13:17 -07001463 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001464 audio_utils::lock_guard _l(mMutex);
Eric Laurent6c796322019-04-09 14:13:17 -07001465 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001466 return binderStatusFromStatusT(mAudioPolicyManager->moveEffectsToIo(ids, io));
Eric Laurent6c796322019-04-09 14:13:17 -07001467}
1468
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001469Status AudioPolicyService::isStreamActive(AudioStreamType streamAidl, int32_t inPastMsAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001470 bool* _aidl_return) {
1471 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1472 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1473 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1474
Eric Laurent223fd5c2014-11-11 13:43:36 -08001475 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001476 *_aidl_return = false;
1477 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001478 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001479 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001480 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001481 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001482 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001483 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001484 *_aidl_return = mAudioPolicyManager->isStreamActive(stream, inPastMs);
1485 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001486}
1487
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001488Status AudioPolicyService::isStreamActiveRemotely(AudioStreamType streamAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001489 int32_t inPastMsAidl,
1490 bool* _aidl_return) {
1491 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1492 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1493 uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1494
Eric Laurent223fd5c2014-11-11 13:43:36 -08001495 if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001496 *_aidl_return = false;
1497 return Status::ok();
Eric Laurentdea15412014-10-28 15:46:45 -07001498 }
Eric Laurentdce54a12014-03-10 12:19:46 -07001499 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001500 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001501 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001502 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001503 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001504 *_aidl_return = mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
1505 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001506}
1507
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001508Status AudioPolicyService::isSourceActive(AudioSource sourceAidl, bool* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001509 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001510 aidl2legacy_AudioSource_audio_source_t(sourceAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001511 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001512 return binderStatusFromStatusT(NO_INIT);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001513 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001514 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001515 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001516 *_aidl_return = mAudioPolicyManager->isSourceActive(source);
1517 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001518}
1519
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001520status_t AudioPolicyService::getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects)
Eric Laurent2d388ec2014-03-07 13:25:54 -08001521{
Eric Laurentdce54a12014-03-10 12:19:46 -07001522 if (mAudioPolicyManager == NULL) {
Eric Laurent2d388ec2014-03-07 13:25:54 -08001523 return NO_INIT;
1524 }
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001525 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001526 audio_utils::lock_guard _l(mMutex);
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001527 audioPolicyEffects = mAudioPolicyEffects;
1528 }
1529 if (audioPolicyEffects == 0) {
Eric Laurent8b1e80b2014-10-07 09:08:47 -07001530 return NO_INIT;
1531 }
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001532
1533 return OK;
1534}
1535
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001536Status AudioPolicyService::queryDefaultPreProcessing(
1537 int32_t audioSessionAidl,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001538 Int* countAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001539 std::vector<media::EffectDescriptor>* _aidl_return) {
1540 audio_session_t audioSession = VALUE_OR_RETURN_BINDER_STATUS(
1541 aidl2legacy_int32_t_audio_session_t(audioSessionAidl));
1542 uint32_t count = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(countAidl->value));
1543 if (count > AudioEffect::kMaxPreProcessing) {
1544 count = AudioEffect::kMaxPreProcessing;
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001545 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001546 uint32_t countReq = count;
1547 std::unique_ptr<effect_descriptor_t[]> descriptors(new effect_descriptor_t[count]);
1548
1549 sp<AudioPolicyEffects> audioPolicyEffects;
1550 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
1551 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->queryDefaultInputEffects(
1552 (audio_session_t) audioSession, descriptors.get(), &count)));
1553 countReq = std::min(count, countReq);
1554 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1555 convertRange(descriptors.get(), descriptors.get() + countReq,
1556 std::back_inserter(*_aidl_return),
1557 legacy2aidl_effect_descriptor_t_EffectDescriptor)));
1558 countAidl->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(count));
1559 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001560}
1561
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001562Status AudioPolicyService::addSourceDefaultEffect(const AudioUuid& typeAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001563 const std::string& opPackageNameAidl,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001564 const AudioUuid& uuidAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001565 int32_t priority,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001566 AudioSource sourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001567 int32_t* _aidl_return) {
1568 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1569 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1570 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1571 aidl2legacy_string_view_String16(opPackageNameAidl));
1572 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1573 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1574 audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001575 aidl2legacy_AudioSource_audio_source_t(sourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001576 audio_unique_id_t id;
1577
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001578 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001579 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001580 if (!(audioserver_permissions() ?
1581 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1582 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001583 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001584 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001585 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addSourceDefaultEffect(
1586 &type, opPackageName, &uuid, priority, source, &id)));
1587 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1588 return Status::ok();
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001589}
1590
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001591Status AudioPolicyService::addStreamDefaultEffect(const AudioUuid& typeAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001592 const std::string& opPackageNameAidl,
Mikhail Naganovddceecc2021-09-03 13:58:56 -07001593 const AudioUuid& uuidAidl,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001594 int32_t priority, AudioUsage usageAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001595 int32_t* _aidl_return) {
1596 effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1597 aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1598 String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1599 aidl2legacy_string_view_String16(opPackageNameAidl));
1600 effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1601 aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1602 audio_usage_t usage = VALUE_OR_RETURN_BINDER_STATUS(
1603 aidl2legacy_AudioUsage_audio_usage_t(usageAidl));
1604 audio_unique_id_t id;
1605
1606 sp<AudioPolicyEffects> audioPolicyEffects;
1607 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001608 if (!(audioserver_permissions() ?
1609 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1610 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001611 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001612 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001613 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addStreamDefaultEffect(
1614 &type, opPackageName, &uuid, priority, usage, &id)));
1615 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1616 return Status::ok();
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001617}
1618
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001619Status AudioPolicyService::removeSourceDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -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-Cohen24628312018-08-13 15:01:09 -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->removeSourceDefaultEffect(id));
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001631}
1632
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001633Status AudioPolicyService::removeStreamDefaultEffect(int32_t idAidl)
Ari Hausman-Cohen24628312018-08-13 15:01:09 -07001634{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001635 audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1636 aidl2legacy_int32_t_audio_unique_id_t(idAidl));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001637 sp<AudioPolicyEffects>audioPolicyEffects;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001638 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
Atneya Nair09859fe2024-07-15 16:38:02 -07001639 if (!(audioserver_permissions() ?
1640 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1641 : modifyDefaultAudioEffectsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001642 return binderStatusFromStatusT(PERMISSION_DENIED);
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001643 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001644 return binderStatusFromStatusT(audioPolicyEffects->removeStreamDefaultEffect(id));
Ari Hausman-Cohen433722e2018-04-24 14:25:22 -07001645}
1646
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001647Status AudioPolicyService::setSupportedSystemUsages(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001648 const std::vector<AudioUsage>& systemUsagesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001649 size_t size = systemUsagesAidl.size();
1650 if (size > MAX_ITEMS_PER_LIST) {
1651 size = MAX_ITEMS_PER_LIST;
1652 }
1653 std::vector<audio_usage_t> systemUsages;
1654 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1655 convertRange(systemUsagesAidl.begin(), systemUsagesAidl.begin() + size,
1656 std::back_inserter(systemUsages), aidl2legacy_AudioUsage_audio_usage_t)));
1657
Andy Hung79eacdb2023-11-30 19:34:24 -08001658 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001659 if (!(audioserver_permissions() ?
1660 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1661 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001662 return binderStatusFromStatusT(PERMISSION_DENIED);
Hayden Gomes524159d2019-12-23 14:41:47 -08001663 }
1664
1665 bool areAllSystemUsages = std::all_of(begin(systemUsages), end(systemUsages),
1666 [](audio_usage_t usage) { return isSystemUsage(usage); });
1667 if (!areAllSystemUsages) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001668 return binderStatusFromStatusT(BAD_VALUE);
Hayden Gomes524159d2019-12-23 14:41:47 -08001669 }
1670
1671 mSupportedSystemUsages = systemUsages;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001672 return Status::ok();
Hayden Gomes524159d2019-12-23 14:41:47 -08001673}
1674
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001675Status AudioPolicyService::setAllowedCapturePolicy(int32_t uidAidl, int32_t capturePolicyAidl) {
1676 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1677 audio_flags_mask_t capturePolicy = VALUE_OR_RETURN_BINDER_STATUS(
1678 aidl2legacy_int32_t_audio_flags_mask_t_mask(capturePolicyAidl));
1679
Andy Hung79eacdb2023-11-30 19:34:24 -08001680 audio_utils::lock_guard _l(mMutex);
Kevin Rocardb99cc752019-03-21 20:52:24 -07001681 if (mAudioPolicyManager == NULL) {
1682 ALOGV("%s() mAudioPolicyManager == NULL", __func__);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001683 return binderStatusFromStatusT(NO_INIT);
Kevin Rocardb99cc752019-03-21 20:52:24 -07001684 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001685 return binderStatusFromStatusT(
1686 mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy));
Kevin Rocardb99cc752019-03-21 20:52:24 -07001687}
1688
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001689Status AudioPolicyService::getOffloadSupport(const AudioOffloadInfo& infoAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001690 media::AudioOffloadMode* _aidl_return) {
1691 audio_offload_info_t info = VALUE_OR_RETURN_BINDER_STATUS(
1692 aidl2legacy_AudioOffloadInfo_audio_offload_info_t(infoAidl));
Eric Laurentdce54a12014-03-10 12:19:46 -07001693 if (mAudioPolicyManager == NULL) {
1694 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001695 return binderStatusFromStatusT(AUDIO_OFFLOAD_NOT_SUPPORTED);
Eric Laurent2d388ec2014-03-07 13:25:54 -08001696 }
Andy Hung79eacdb2023-11-30 19:34:24 -08001697 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07001698 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001699 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_offload_mode_t_AudioOffloadMode(
1700 mAudioPolicyManager->getOffloadSupport(info)));
1701 return Status::ok();
Eric Laurent2d388ec2014-03-07 13:25:54 -08001702}
1703
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001704Status AudioPolicyService::isDirectOutputSupported(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07001705 const AudioConfigBase& configAidl,
Mikhail Naganov1c400902023-05-17 11:48:43 -07001706 const media::audio::common::AudioAttributes& attributesAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001707 bool* _aidl_return) {
1708 audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovde3fa182021-07-30 15:06:42 -07001709 aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl, false /*isInput*/));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001710 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07001711 aidl2legacy_AudioAttributes_audio_attributes_t(attributesAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001712 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1713 AudioValidator::validateAudioAttributes(attributes, "169572641")));
1714
Michael Chana94fbb22018-04-24 14:31:19 +10001715 if (mAudioPolicyManager == NULL) {
1716 ALOGV("mAudioPolicyManager == NULL");
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001717 return binderStatusFromStatusT(NO_INIT);
Michael Chana94fbb22018-04-24 14:31:19 +10001718 }
Hayden Gomes524159d2019-12-23 14:41:47 -08001719
Atneya Nair09859fe2024-07-15 16:38:02 -07001720 RETURN_IF_BINDER_ERROR(validateUsage(attributes));
Hayden Gomes524159d2019-12-23 14:41:47 -08001721
Andy Hung79eacdb2023-11-30 19:34:24 -08001722 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001723 *_aidl_return = mAudioPolicyManager->isDirectOutputSupported(config, attributes);
1724 return Status::ok();
Michael Chana94fbb22018-04-24 14:31:19 +10001725}
1726
Atneya Nair23348762024-10-14 14:16:06 -07001727template <typename Port>
1728void anonymizePortBluetoothAddress(Port& port) {
1729 if (port.type != AUDIO_PORT_TYPE_DEVICE) {
1730 return;
1731 }
1732 if (!(audio_is_a2dp_device(port.ext.device.type)
1733 || audio_is_ble_device(port.ext.device.type)
1734 || audio_is_bluetooth_sco_device(port.ext.device.type)
1735 || audio_is_hearing_aid_out_device(port.ext.device.type))) {
1736 return;
1737 }
1738 anonymizeBluetoothAddress(port.ext.device.address);
1739}
Michael Chana94fbb22018-04-24 14:31:19 +10001740
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001741Status AudioPolicyService::listAudioPorts(media::AudioPortRole roleAidl,
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001742 media::AudioPortType typeAidl, Int* count,
Atneya Nair638a6e42022-12-18 16:45:15 -08001743 std::vector<media::AudioPortFw>* portsAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001744 int32_t* _aidl_return) {
1745 audio_port_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
1746 aidl2legacy_AudioPortRole_audio_port_role_t(roleAidl));
1747 audio_port_type_t type = VALUE_OR_RETURN_BINDER_STATUS(
1748 aidl2legacy_AudioPortType_audio_port_type_t(typeAidl));
1749 unsigned int num_ports = VALUE_OR_RETURN_BINDER_STATUS(
1750 convertIntegral<unsigned int>(count->value));
1751 if (num_ports > MAX_ITEMS_PER_LIST) {
1752 num_ports = MAX_ITEMS_PER_LIST;
1753 }
1754 unsigned int numPortsReq = num_ports;
1755 std::unique_ptr<audio_port_v7[]> ports(new audio_port_v7[num_ports]);
1756 unsigned int generation;
1757
Atneya Nair23348762024-10-14 14:16:06 -07001758 const AttributionSourceState attributionSource = getCallingAttributionSource();
Eric Laurent10b71232018-04-13 18:14:44 -07001759 AutoCallerClear acc;
Atneya Nair23348762024-10-14 14:16:06 -07001760 {
1761 audio_utils::lock_guard _l(mMutex);
1762 if (mAudioPolicyManager == NULL) {
1763 return binderStatusFromStatusT(NO_INIT);
1764 }
1765 // AudioPolicyManager->listAudioPorts makes a deep copy of port structs into ports
1766 // so it is safe to access after releasing the mutex
1767 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1768 mAudioPolicyManager->listAudioPorts(
1769 role, type, &num_ports, ports.get(), &generation)));
1770 numPortsReq = std::min(numPortsReq, num_ports);
1771 }
1772
1773 if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__))) {
1774 for (size_t i = 0; i < numPortsReq; ++i) {
1775 anonymizePortBluetoothAddress(ports[i]);
1776 }
1777 }
1778
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001779 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1780 convertRange(ports.get(), ports.get() + numPortsReq, std::back_inserter(*portsAidl),
Mikhail Naganov87227252023-01-13 17:38:10 -08001781 legacy2aidl_audio_port_v7_AudioPortFw)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001782 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_ports));
1783 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1784 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001785}
1786
Mikhail Naganov5edc5ed2023-03-23 14:52:15 -07001787Status AudioPolicyService::listDeclaredDevicePorts(media::AudioPortRole role,
1788 std::vector<media::AudioPortFw>* _aidl_return) {
Andy Hung79eacdb2023-11-30 19:34:24 -08001789 audio_utils::lock_guard _l(mMutex);
Mikhail Naganov5edc5ed2023-03-23 14:52:15 -07001790 if (mAudioPolicyManager == NULL) {
1791 return binderStatusFromStatusT(NO_INIT);
1792 }
1793 AutoCallerClear acc;
1794 return binderStatusFromStatusT(mAudioPolicyManager->listDeclaredDevicePorts(
1795 role, _aidl_return));
1796}
1797
Mikhail Naganov17031562022-02-23 23:00:27 +00001798Status AudioPolicyService::getAudioPort(int portId,
Atneya Nair638a6e42022-12-18 16:45:15 -08001799 media::AudioPortFw* _aidl_return) {
Mikhail Naganov17031562022-02-23 23:00:27 +00001800 audio_port_v7 port{ .id = portId };
Atneya Nair23348762024-10-14 14:16:06 -07001801
1802 const AttributionSourceState attributionSource = getCallingAttributionSource();
Eric Laurent10b71232018-04-13 18:14:44 -07001803 AutoCallerClear acc;
Atneya Nair23348762024-10-14 14:16:06 -07001804
1805 {
1806 audio_utils::lock_guard _l(mMutex);
1807 if (mAudioPolicyManager == NULL) {
1808 return binderStatusFromStatusT(NO_INIT);
1809 }
1810 // AudioPolicyManager->getAudioPort makes a deep copy of the port struct into port
1811 // so it is safe to access after releasing the mutex
1812 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(mAudioPolicyManager->getAudioPort(&port)));
1813 }
1814
1815 if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__))) {
1816 anonymizePortBluetoothAddress(port);
1817 }
1818
Mikhail Naganov87227252023-01-13 17:38:10 -08001819 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_v7_AudioPortFw(port));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001820 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001821}
1822
Atneya Nair3afdbd12022-12-18 16:14:18 -08001823Status AudioPolicyService::createAudioPatch(const media::AudioPatchFw& patchAidl,
1824 int32_t handleAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001825 int32_t* _aidl_return) {
1826 audio_patch patch = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov87227252023-01-13 17:38:10 -08001827 aidl2legacy_AudioPatchFw_audio_patch(patchAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001828 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1829 aidl2legacy_int32_t_audio_port_handle_t(handleAidl));
1830 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPatch(patch)));
1831
Andy Hung79eacdb2023-11-30 19:34:24 -08001832 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001833 if (!(audioserver_permissions() ?
1834 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1835 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001836 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001837 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001838 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001839 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001840 }
Eric Laurent10b71232018-04-13 18:14:44 -07001841 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001842 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1843 mAudioPolicyManager->createAudioPatch(&patch, &handle,
1844 IPCThreadState::self()->getCallingUid())));
1845 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_patch_handle_t_int32_t(handle));
1846 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001847}
1848
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001849Status AudioPolicyService::releaseAudioPatch(int32_t handleAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001850{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001851 audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1852 aidl2legacy_int32_t_audio_patch_handle_t(handleAidl));
Andy Hung79eacdb2023-11-30 19:34:24 -08001853 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001854 if (!(audioserver_permissions() ?
1855 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1856 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001857 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001858 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001859 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001860 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001861 }
Eric Laurent10b71232018-04-13 18:14:44 -07001862 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001863 return binderStatusFromStatusT(
1864 mAudioPolicyManager->releaseAudioPatch(handle,
1865 IPCThreadState::self()->getCallingUid()));
Eric Laurent203b1a12014-04-01 10:34:16 -07001866}
1867
Mikhail Naganov0078ee52021-09-30 23:06:20 +00001868Status AudioPolicyService::listAudioPatches(Int* count,
Atneya Nair3afdbd12022-12-18 16:14:18 -08001869 std::vector<media::AudioPatchFw>* patchesAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001870 int32_t* _aidl_return) {
1871 unsigned int num_patches = VALUE_OR_RETURN_BINDER_STATUS(
1872 convertIntegral<unsigned int>(count->value));
1873 if (num_patches > MAX_ITEMS_PER_LIST) {
1874 num_patches = MAX_ITEMS_PER_LIST;
1875 }
1876 unsigned int numPatchesReq = num_patches;
1877 std::unique_ptr<audio_patch[]> patches(new audio_patch[num_patches]);
1878 unsigned int generation;
1879
Atneya Nair23348762024-10-14 14:16:06 -07001880 const AttributionSourceState attributionSource = getCallingAttributionSource();
Eric Laurent10b71232018-04-13 18:14:44 -07001881 AutoCallerClear acc;
Atneya Nair23348762024-10-14 14:16:06 -07001882
1883 {
1884 audio_utils::lock_guard _l(mMutex);
1885 if (mAudioPolicyManager == NULL) {
1886 return binderStatusFromStatusT(NO_INIT);
1887 }
1888 // AudioPolicyManager->listAudioPatches makes a deep copy of patches structs into patches
1889 // so it is safe to access after releasing the mutex
1890 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1891 mAudioPolicyManager->listAudioPatches(&num_patches, patches.get(), &generation)));
1892 numPatchesReq = std::min(numPatchesReq, num_patches);
1893 }
1894
1895 if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__))) {
1896 for (size_t i = 0; i < numPatchesReq; ++i) {
1897 for (size_t j = 0; j < patches[i].num_sources; ++j) {
1898 anonymizePortBluetoothAddress(patches[i].sources[j]);
1899 }
1900 for (size_t j = 0; j < patches[i].num_sinks; ++j) {
1901 anonymizePortBluetoothAddress(patches[i].sinks[j]);
1902 }
1903 }
1904 }
1905
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001906 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1907 convertRange(patches.get(), patches.get() + numPatchesReq,
Mikhail Naganov87227252023-01-13 17:38:10 -08001908 std::back_inserter(*patchesAidl), legacy2aidl_audio_patch_AudioPatchFw)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001909 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_patches));
1910 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1911 return Status::ok();
Eric Laurent203b1a12014-04-01 10:34:16 -07001912}
1913
Atneya Nair7a9594f2022-12-18 17:26:26 -08001914Status AudioPolicyService::setAudioPortConfig(const media::AudioPortConfigFw& configAidl)
Eric Laurent203b1a12014-04-01 10:34:16 -07001915{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001916 audio_port_config config = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov87227252023-01-13 17:38:10 -08001917 aidl2legacy_AudioPortConfigFw_audio_port_config(configAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001918 RETURN_IF_BINDER_ERROR(
1919 binderStatusFromStatusT(AudioValidator::validateAudioPortConfig(config)));
1920
Andy Hung79eacdb2023-11-30 19:34:24 -08001921 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07001922 if (!(audioserver_permissions() ?
1923 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1924 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001925 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurent5284ed52014-05-29 14:37:38 -07001926 }
Eric Laurent6a94d692014-05-20 11:18:06 -07001927 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001928 return binderStatusFromStatusT(NO_INIT);
Eric Laurent6a94d692014-05-20 11:18:06 -07001929 }
Eric Laurent10b71232018-04-13 18:14:44 -07001930 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001931 return binderStatusFromStatusT(mAudioPolicyManager->setAudioPortConfig(&config));
Eric Laurent203b1a12014-04-01 10:34:16 -07001932}
Eric Laurent2d388ec2014-03-07 13:25:54 -08001933
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001934Status AudioPolicyService::acquireSoundTriggerSession(media::SoundTriggerSession* _aidl_return)
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001935{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001936 audio_session_t session;
1937 audio_io_handle_t ioHandle;
1938 audio_devices_t device;
1939
1940 {
Andy Hung79eacdb2023-11-30 19:34:24 -08001941 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001942 if (mAudioPolicyManager == NULL) {
1943 return binderStatusFromStatusT(NO_INIT);
1944 }
1945 AutoCallerClear acc;
1946 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1947 mAudioPolicyManager->acquireSoundTriggerSession(&session, &ioHandle, &device)));
1948 }
1949
1950 _aidl_return->session = VALUE_OR_RETURN_BINDER_STATUS(
1951 legacy2aidl_audio_session_t_int32_t(session));
1952 _aidl_return->ioHandle = VALUE_OR_RETURN_BINDER_STATUS(
1953 legacy2aidl_audio_io_handle_t_int32_t(ioHandle));
1954 _aidl_return->device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07001955 legacy2aidl_audio_devices_t_AudioDeviceDescription(device));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001956 return Status::ok();
1957}
1958
1959Status AudioPolicyService::releaseSoundTriggerSession(int32_t sessionAidl)
1960{
1961 audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1962 aidl2legacy_int32_t_audio_session_t(sessionAidl));
Andy Hung79eacdb2023-11-30 19:34:24 -08001963 audio_utils::lock_guard _l(mMutex);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001964 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001965 return binderStatusFromStatusT(NO_INIT);
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001966 }
Eric Laurent10b71232018-04-13 18:14:44 -07001967 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001968 return binderStatusFromStatusT(mAudioPolicyManager->releaseSoundTriggerSession(session));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001969}
1970
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001971Status AudioPolicyService::registerPolicyMixes(const std::vector<media::AudioMix>& mixesAidl,
1972 bool registration) {
1973 size_t size = mixesAidl.size();
1974 if (size > MAX_MIXES_PER_POLICY) {
1975 size = MAX_MIXES_PER_POLICY;
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001976 }
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001977 Vector<AudioMix> mixes;
1978 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1979 convertRange(mixesAidl.begin(), mixesAidl.begin() + size, std::back_inserter(mixes),
1980 aidl2legacy_AudioMix)));
Eric Laurentdf3dc7e2014-07-27 18:39:40 -07001981
Andy Hung79eacdb2023-11-30 19:34:24 -08001982 audio_utils::lock_guard _l(mMutex);
Kevin Rocardbe201852019-02-20 22:33:28 -08001983
1984 // loopback|render only need a MediaProjection (checked in caller AudioService.java)
1985 bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
1986 return !is_mix_loopback_render(mix.mRouteFlags); });
Atneya Nair09859fe2024-07-15 16:38:02 -07001987 if (needModifyAudioRouting && !(audioserver_permissions() ?
1988 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1989 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08001990 return binderStatusFromStatusT(PERMISSION_DENIED);
Eric Laurentbaac1832014-12-01 17:52:59 -08001991 }
Kevin Rocardbe201852019-02-20 22:33:28 -08001992
Nadav Bar287d3302020-02-05 14:55:38 +02001993 // If one of the mixes has needCaptureVoiceCommunicationOutput set to true, then we
1994 // need to verify that the caller still has CAPTURE_VOICE_COMMUNICATION_OUTPUT
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001995 bool needCaptureVoiceCommunicationOutput =
1996 std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Nadav Bar287d3302020-02-05 14:55:38 +02001997 return mix.mVoiceCommunicationCaptureAllowed; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02001998
Kevin Rocard36b17552019-03-07 18:48:07 -08001999 bool needCaptureMediaOutput = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
Eric Laurent5f9a6452020-12-22 20:10:10 +01002000 return mix.mAllowPrivilegedMediaPlaybackCapture; });
Nadav Bardbf0a2e2020-01-16 23:09:25 +02002001
Svet Ganov3e5f14f2021-05-13 22:51:08 +00002002 const AttributionSourceState attributionSource = getCallingAttributionSource();
Nadav Bardbf0a2e2020-01-16 23:09:25 +02002003
Philip P. Moltmannbda45752020-07-17 16:41:18 -07002004
Atneya Nair09859fe2024-07-15 16:38:02 -07002005 if (needCaptureMediaOutput && !(audioserver_permissions() ?
2006 CHECK_PERM(CAPTURE_MEDIA_OUTPUT, attributionSource.uid)
2007 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002008 return binderStatusFromStatusT(PERMISSION_DENIED);
Kevin Rocard36b17552019-03-07 18:48:07 -08002009 }
2010
Nadav Bardbf0a2e2020-01-16 23:09:25 +02002011 if (needCaptureVoiceCommunicationOutput &&
Atneya Nair09859fe2024-07-15 16:38:02 -07002012 !(audioserver_permissions() ?
2013 CHECK_PERM(CAPTURE_VOICE_COMMUNICATION_OUTPUT, attributionSource.uid)
2014 : captureVoiceCommunicationOutputAllowed(attributionSource))) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002015 return binderStatusFromStatusT(PERMISSION_DENIED);
Nadav Bardbf0a2e2020-01-16 23:09:25 +02002016 }
2017
Eric Laurentbaac1832014-12-01 17:52:59 -08002018 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002019 return binderStatusFromStatusT(NO_INIT);
Eric Laurentbaac1832014-12-01 17:52:59 -08002020 }
Eric Laurent10b71232018-04-13 18:14:44 -07002021 AutoCallerClear acc;
Eric Laurentbaac1832014-12-01 17:52:59 -08002022 if (registration) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002023 return binderStatusFromStatusT(mAudioPolicyManager->registerPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08002024 } else {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002025 return binderStatusFromStatusT(mAudioPolicyManager->unregisterPolicyMixes(mixes));
Eric Laurentbaac1832014-12-01 17:52:59 -08002026 }
2027}
2028
Marvin Raminbdefaf02023-11-01 09:10:32 +01002029Status
2030AudioPolicyService::getRegisteredPolicyMixes(std::vector<::android::media::AudioMix>* mixesAidl) {
2031 if (mAudioPolicyManager == nullptr) {
2032 return binderStatusFromStatusT(NO_INIT);
2033 }
2034
2035 std::vector<AudioMix> mixes;
2036 int status = mAudioPolicyManager->getRegisteredPolicyMixes(mixes);
2037
2038 for (const auto& mix : mixes) {
2039 media::AudioMix aidlMix = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_AudioMix(mix));
2040 mixesAidl->push_back(aidlMix);
2041 }
2042
2043 return binderStatusFromStatusT(status);
2044}
2045
Jan Sebechlebsky0af8e872023-08-11 14:45:08 +02002046Status AudioPolicyService::updatePolicyMixes(
2047 const ::std::vector<::android::media::AudioMixUpdate>& updates) {
Andy Hung79eacdb2023-11-30 19:34:24 -08002048 audio_utils::lock_guard _l(mMutex);
Jan Sebechlebsky0af8e872023-08-11 14:45:08 +02002049 for (const auto& update : updates) {
2050 AudioMix mix = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_AudioMix(update.audioMix));
2051 std::vector<AudioMixMatchCriterion> newCriteria =
2052 VALUE_OR_RETURN_BINDER_STATUS(convertContainer<std::vector<AudioMixMatchCriterion>>(
2053 update.newCriteria, aidl2legacy_AudioMixMatchCriterion));
2054 int status;
2055 if((status = mAudioPolicyManager->updatePolicyMix(mix, newCriteria)) != NO_ERROR) {
2056 return binderStatusFromStatusT(status);
2057 }
2058 }
2059 return binderStatusFromStatusT(NO_ERROR);
2060}
2061
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002062Status AudioPolicyService::setUidDeviceAffinities(
2063 int32_t uidAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002064 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002065 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2066 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2067 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2068 aidl2legacy_AudioDeviceTypeAddress));
2069
Andy Hung79eacdb2023-11-30 19:34:24 -08002070 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002071 if (!(audioserver_permissions() ?
2072 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2073 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002074 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002075 }
2076 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002077 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002078 }
2079 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002080 return binderStatusFromStatusT(mAudioPolicyManager->setUidDeviceAffinities(uid, devices));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002081}
2082
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002083Status AudioPolicyService::removeUidDeviceAffinities(int32_t uidAidl) {
2084 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2085
Andy Hung79eacdb2023-11-30 19:34:24 -08002086 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002087 if (!(audioserver_permissions() ?
2088 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2089 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002090 return binderStatusFromStatusT(PERMISSION_DENIED);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002091 }
2092 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002093 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002094 }
2095 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002096 return binderStatusFromStatusT(mAudioPolicyManager->removeUidDeviceAffinities(uid));
Jean-Michel Trivibda70da2018-12-19 07:30:15 -08002097}
2098
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002099Status AudioPolicyService::setUserIdDeviceAffinities(
2100 int32_t userIdAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002101 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002102 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
2103 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2104 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2105 aidl2legacy_AudioDeviceTypeAddress));
2106
Andy Hung79eacdb2023-11-30 19:34:24 -08002107 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002108 if (!(audioserver_permissions() ?
2109 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2110 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002111 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08002112 }
2113 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002114 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08002115 }
2116 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002117 return binderStatusFromStatusT(mAudioPolicyManager->setUserIdDeviceAffinities(userId, devices));
Oscar Azucena90e77632019-11-27 17:12:28 -08002118}
2119
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002120Status AudioPolicyService::removeUserIdDeviceAffinities(int32_t userIdAidl) {
2121 int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
2122
Andy Hung79eacdb2023-11-30 19:34:24 -08002123 audio_utils::lock_guard _l(mMutex);
Atneya Nair09859fe2024-07-15 16:38:02 -07002124 if (!(audioserver_permissions() ?
2125 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2126 : modifyAudioRoutingAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002127 return binderStatusFromStatusT(PERMISSION_DENIED);
Oscar Azucena90e77632019-11-27 17:12:28 -08002128 }
2129 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002130 return binderStatusFromStatusT(NO_INIT);
Oscar Azucena90e77632019-11-27 17:12:28 -08002131 }
2132 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002133 return binderStatusFromStatusT(mAudioPolicyManager->removeUserIdDeviceAffinities(userId));
Oscar Azucena90e77632019-11-27 17:12:28 -08002134}
2135
Atneya Nair7a9594f2022-12-18 17:26:26 -08002136Status AudioPolicyService::startAudioSource(const media::AudioPortConfigFw& sourceAidl,
Mikhail Naganov1c400902023-05-17 11:48:43 -07002137 const media::audio::common::AudioAttributes& attributesAidl,
2138 int32_t* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002139 audio_port_config source = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov87227252023-01-13 17:38:10 -08002140 aidl2legacy_AudioPortConfigFw_audio_port_config(sourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002141 audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002142 aidl2legacy_AudioAttributes_audio_attributes_t(attributesAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002143 audio_port_handle_t portId;
2144 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2145 AudioValidator::validateAudioPortConfig(source)));
2146 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2147 AudioValidator::validateAudioAttributes(attributes, "68953950")));
2148
Andy Hung79eacdb2023-11-30 19:34:24 -08002149 audio_utils::lock_guard _l(mMutex);
Eric Laurent554a2772015-04-10 11:29:24 -07002150 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002151 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07002152 }
Hayden Gomes524159d2019-12-23 14:41:47 -08002153
Atneya Nair09859fe2024-07-15 16:38:02 -07002154 RETURN_IF_BINDER_ERROR(validateUsage(attributes));
Hayden Gomes524159d2019-12-23 14:41:47 -08002155
Hongwei Wang5cd1f1d2019-03-26 15:21:11 -07002156 // startAudioSource should be created as the calling uid
2157 const uid_t callingUid = IPCThreadState::self()->getCallingUid();
Eric Laurent10b71232018-04-13 18:14:44 -07002158 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002159 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2160 mAudioPolicyManager->startAudioSource(&source, &attributes, &portId, callingUid)));
2161 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
2162 return Status::ok();
Eric Laurent554a2772015-04-10 11:29:24 -07002163}
2164
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002165Status AudioPolicyService::stopAudioSource(int32_t portIdAidl)
Eric Laurent554a2772015-04-10 11:29:24 -07002166{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002167 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2168 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2169
Andy Hung79eacdb2023-11-30 19:34:24 -08002170 audio_utils::lock_guard _l(mMutex);
Eric Laurent554a2772015-04-10 11:29:24 -07002171 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002172 return binderStatusFromStatusT(NO_INIT);
Eric Laurent554a2772015-04-10 11:29:24 -07002173 }
Eric Laurent10b71232018-04-13 18:14:44 -07002174 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002175 return binderStatusFromStatusT(mAudioPolicyManager->stopAudioSource(portId));
Eric Laurent554a2772015-04-10 11:29:24 -07002176}
2177
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002178Status AudioPolicyService::setMasterMono(bool mono)
Andy Hung2ddee192015-12-18 17:34:44 -08002179{
2180 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002181 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08002182 }
Atneya Nair09859fe2024-07-15 16:38:02 -07002183 if (!(audioserver_permissions() ?
2184 CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
2185 : settingsAllowed())) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002186 return binderStatusFromStatusT(PERMISSION_DENIED);
Andy Hung2ddee192015-12-18 17:34:44 -08002187 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002188 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07002189 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002190 return binderStatusFromStatusT(mAudioPolicyManager->setMasterMono(mono));
Andy Hung2ddee192015-12-18 17:34:44 -08002191}
2192
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002193Status AudioPolicyService::getMasterMono(bool* _aidl_return)
Andy Hung2ddee192015-12-18 17:34:44 -08002194{
2195 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002196 return binderStatusFromStatusT(NO_INIT);
Andy Hung2ddee192015-12-18 17:34:44 -08002197 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002198 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07002199 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002200 return binderStatusFromStatusT(mAudioPolicyManager->getMasterMono(_aidl_return));
Andy Hung2ddee192015-12-18 17:34:44 -08002201}
2202
Eric Laurentac9cef52017-06-09 15:46:26 -07002203
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07002204Status AudioPolicyService::getStreamVolumeDB(
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002205 AudioStreamType streamAidl, int32_t indexAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002206 const AudioDeviceDescription& deviceAidl, float* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002207 audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
2208 aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
2209 int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
2210 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov21a32ec2021-07-08 14:40:12 -07002211 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002212
Eric Laurentac9cef52017-06-09 15:46:26 -07002213 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002214 return binderStatusFromStatusT(NO_INIT);
Eric Laurentac9cef52017-06-09 15:46:26 -07002215 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002216 audio_utils::lock_guard _l(mMutex);
Eric Laurent10b71232018-04-13 18:14:44 -07002217 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002218 *_aidl_return = mAudioPolicyManager->getStreamVolumeDB(stream, index, device);
2219 return Status::ok();
Eric Laurentac9cef52017-06-09 15:46:26 -07002220}
2221
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002222Status AudioPolicyService::getSurroundFormats(Int* count,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002223 std::vector<AudioFormatDescription>* formats,
Kriti Dang877b27e2021-02-02 12:10:40 +01002224 std::vector<bool>* formatsEnabled) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002225 unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
2226 convertIntegral<unsigned int>(count->value));
2227 if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
2228 numSurroundFormats = MAX_ITEMS_PER_LIST;
2229 }
2230 unsigned int numSurroundFormatsReq = numSurroundFormats;
2231 std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
Kriti Dang877b27e2021-02-02 12:10:40 +01002232 std::unique_ptr<bool[]>surroundFormatsEnabled(new bool[numSurroundFormats]);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002233
jiabin81772902018-04-02 17:52:27 -07002234 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002235 return binderStatusFromStatusT(NO_INIT);
jiabin81772902018-04-02 17:52:27 -07002236 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002237 audio_utils::lock_guard _l(mMutex);
jiabin81772902018-04-02 17:52:27 -07002238 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002239 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2240 mAudioPolicyManager->getSurroundFormats(&numSurroundFormats, surroundFormats.get(),
Kriti Dang6537def2021-03-02 13:46:59 +01002241 surroundFormatsEnabled.get())));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002242 numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
2243 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2244 convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002245 std::back_inserter(*formats),
2246 legacy2aidl_audio_format_t_AudioFormatDescription)));
Kriti Dang877b27e2021-02-02 12:10:40 +01002247 formatsEnabled->insert(
2248 formatsEnabled->begin(),
2249 surroundFormatsEnabled.get(),
2250 surroundFormatsEnabled.get() + numSurroundFormatsReq);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002251 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
2252 return Status::ok();
jiabin81772902018-04-02 17:52:27 -07002253}
2254
Kriti Dang6537def2021-03-02 13:46:59 +01002255Status AudioPolicyService::getReportedSurroundFormats(
Mikhail Naganov0078ee52021-09-30 23:06:20 +00002256 Int* count, std::vector<AudioFormatDescription>* formats) {
Kriti Dang6537def2021-03-02 13:46:59 +01002257 unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
2258 convertIntegral<unsigned int>(count->value));
2259 if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
2260 numSurroundFormats = MAX_ITEMS_PER_LIST;
2261 }
2262 unsigned int numSurroundFormatsReq = numSurroundFormats;
2263 std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
2264
2265 if (mAudioPolicyManager == NULL) {
2266 return binderStatusFromStatusT(NO_INIT);
2267 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002268 audio_utils::lock_guard _l(mMutex);
Kriti Dang6537def2021-03-02 13:46:59 +01002269 AutoCallerClear acc;
2270 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2271 mAudioPolicyManager->getReportedSurroundFormats(
2272 &numSurroundFormats, surroundFormats.get())));
2273 numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
2274 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2275 convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002276 std::back_inserter(*formats),
2277 legacy2aidl_audio_format_t_AudioFormatDescription)));
Kriti Dang6537def2021-03-02 13:46:59 +01002278 count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
2279 return Status::ok();
2280}
2281
Pattydd807582021-11-04 21:01:03 +08002282Status AudioPolicyService::getHwOffloadFormatsSupportedForBluetoothMedia(
2283 const AudioDeviceDescription& deviceAidl,
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002284 std::vector<AudioFormatDescription>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002285 std::vector<audio_format_t> formats;
2286
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002287 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002288 return binderStatusFromStatusT(NO_INIT);
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002289 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002290 audio_utils::lock_guard _l(mMutex);
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002291 AutoCallerClear acc;
Pattydd807582021-11-04 21:01:03 +08002292 audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
2293 aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002294 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
Pattydd807582021-11-04 21:01:03 +08002295 mAudioPolicyManager->getHwOffloadFormatsSupportedForBluetoothMedia(device, &formats)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002296 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002297 convertContainer<std::vector<AudioFormatDescription>>(
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002298 formats,
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002299 legacy2aidl_audio_format_t_AudioFormatDescription));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002300 return Status::ok();
Arun Mirpuri11029ad2018-12-19 20:45:19 -08002301}
2302
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002303Status AudioPolicyService::setSurroundFormatEnabled(
Mikhail Naganov57bd06f2021-08-10 16:41:54 -07002304 const AudioFormatDescription& audioFormatAidl, bool enabled) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002305 audio_format_t audioFormat = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovb60bd1b2021-07-15 17:31:43 -07002306 aidl2legacy_AudioFormatDescription_audio_format_t(audioFormatAidl));
jiabin81772902018-04-02 17:52:27 -07002307 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002308 return binderStatusFromStatusT(NO_INIT);
jiabin81772902018-04-02 17:52:27 -07002309 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002310 audio_utils::lock_guard _l(mMutex);
jiabin81772902018-04-02 17:52:27 -07002311 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002312 return binderStatusFromStatusT(
2313 mAudioPolicyManager->setSurroundFormatEnabled(audioFormat, enabled));
jiabin81772902018-04-02 17:52:27 -07002314}
Eric Laurentac9cef52017-06-09 15:46:26 -07002315
Oscar Azucena829d90d2022-01-28 17:17:56 -08002316Status convertInt32VectorToUidVectorWithLimit(
2317 const std::vector<int32_t>& uidsAidl, std::vector<uid_t>& uids) {
2318 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2319 convertRangeWithLimit(uidsAidl.begin(),
2320 uidsAidl.end(),
2321 std::back_inserter(uids),
2322 aidl2legacy_int32_t_uid_t,
2323 MAX_ITEMS_PER_LIST)));
2324
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002325 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07002326}
2327
Oscar Azucena829d90d2022-01-28 17:17:56 -08002328Status AudioPolicyService::setAssistantServicesUids(const std::vector<int32_t>& uidsAidl)
Ahaan Ugalef51ce002021-08-04 16:34:20 -07002329{
Oscar Azucena829d90d2022-01-28 17:17:56 -08002330 std::vector<uid_t> uids;
2331 RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(uidsAidl, uids));
2332
Andy Hung79eacdb2023-11-30 19:34:24 -08002333 audio_utils::lock_guard _l(mMutex);
Oscar Azucena829d90d2022-01-28 17:17:56 -08002334 mUidPolicy->setAssistantUids(uids);
Ahaan Ugalef51ce002021-08-04 16:34:20 -07002335 return Status::ok();
2336}
2337
Oscar Azucenac2cdda32022-01-31 19:10:39 -08002338Status AudioPolicyService::setActiveAssistantServicesUids(
2339 const std::vector<int32_t>& activeUidsAidl) {
2340 std::vector<uid_t> activeUids;
2341 RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(activeUidsAidl, activeUids));
2342
Andy Hung79eacdb2023-11-30 19:34:24 -08002343 audio_utils::lock_guard _l(mMutex);
Oscar Azucenac2cdda32022-01-31 19:10:39 -08002344 mUidPolicy->setActiveAssistantUids(activeUids);
2345 return Status::ok();
2346}
2347
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002348Status AudioPolicyService::setA11yServicesUids(const std::vector<int32_t>& uidsAidl)
Eric Laurentb78763e2018-10-17 10:08:02 -07002349{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002350 std::vector<uid_t> uids;
Oscar Azucena829d90d2022-01-28 17:17:56 -08002351 RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(uidsAidl, uids));
2352
Andy Hung79eacdb2023-11-30 19:34:24 -08002353 audio_utils::lock_guard _l(mMutex);
Eric Laurentb78763e2018-10-17 10:08:02 -07002354 mUidPolicy->setA11yUids(uids);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002355 return Status::ok();
Eric Laurentb78763e2018-10-17 10:08:02 -07002356}
2357
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002358Status AudioPolicyService::setCurrentImeUid(int32_t uidAidl)
Kohsuke Yatoha623a132020-03-24 20:10:26 -07002359{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002360 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
Andy Hung79eacdb2023-11-30 19:34:24 -08002361 audio_utils::lock_guard _l(mMutex);
Kohsuke Yatoha623a132020-03-24 20:10:26 -07002362 mUidPolicy->setCurrentImeUid(uid);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002363 return Status::ok();
Kohsuke Yatoha623a132020-03-24 20:10:26 -07002364}
2365
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002366Status AudioPolicyService::isHapticPlaybackSupported(bool* _aidl_return)
jiabin6012f912018-11-02 17:06:30 -07002367{
2368 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002369 return binderStatusFromStatusT(NO_INIT);
jiabin6012f912018-11-02 17:06:30 -07002370 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002371 audio_utils::lock_guard _l(mMutex);
jiabin6012f912018-11-02 17:06:30 -07002372 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002373 *_aidl_return = mAudioPolicyManager->isHapticPlaybackSupported();
2374 return Status::ok();
jiabin6012f912018-11-02 17:06:30 -07002375}
2376
Carter Hsu325a8eb2022-01-19 19:56:51 +08002377Status AudioPolicyService::isUltrasoundSupported(bool* _aidl_return)
2378{
2379 if (mAudioPolicyManager == NULL) {
2380 return binderStatusFromStatusT(NO_INIT);
2381 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002382 audio_utils::lock_guard _l(mMutex);
Carter Hsu325a8eb2022-01-19 19:56:51 +08002383 AutoCallerClear acc;
2384 *_aidl_return = mAudioPolicyManager->isUltrasoundSupported();
2385 return Status::ok();
2386}
2387
Atneya Nair698f5ef2022-12-15 16:15:09 -08002388Status AudioPolicyService::isHotwordStreamSupported(bool lookbackAudio, bool* _aidl_return)
2389{
2390 if (mAudioPolicyManager == nullptr) {
2391 return binderStatusFromStatusT(NO_INIT);
2392 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002393 audio_utils::lock_guard _l(mMutex);
Atneya Nair698f5ef2022-12-15 16:15:09 -08002394 AutoCallerClear acc;
2395 *_aidl_return = mAudioPolicyManager->isHotwordStreamSupported(lookbackAudio);
2396 return Status::ok();
2397}
2398
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002399Status AudioPolicyService::listAudioProductStrategies(
2400 std::vector<media::AudioProductStrategy>* _aidl_return) {
2401 AudioProductStrategyVector strategies;
2402
François Gaffied0ba9ed2018-11-05 11:50:42 +01002403 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002404 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01002405 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002406 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002407 RETURN_IF_BINDER_ERROR(
2408 binderStatusFromStatusT(mAudioPolicyManager->listAudioProductStrategies(strategies)));
2409 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2410 convertContainer<std::vector<media::AudioProductStrategy>>(
2411 strategies,
2412 legacy2aidl_AudioProductStrategy));
2413 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01002414}
2415
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002416Status AudioPolicyService::getProductStrategyFromAudioAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002417 const media::audio::common::AudioAttributes& aaAidl,
François Gaffie1e2b56f2022-04-01 14:34:29 +02002418 bool fallbackOnDefault, int32_t* _aidl_return) {
2419 audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002420 aidl2legacy_AudioAttributes_audio_attributes_t(aaAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002421 product_strategy_t productStrategy;
2422
François Gaffied0ba9ed2018-11-05 11:50:42 +01002423 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002424 return binderStatusFromStatusT(NO_INIT);
François Gaffied0ba9ed2018-11-05 11:50:42 +01002425 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002426 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002427 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02002428 mAudioPolicyManager->getProductStrategyFromAudioAttributes(
2429 aa, productStrategy, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002430 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2431 legacy2aidl_product_strategy_t_int32_t(productStrategy));
2432 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01002433}
2434
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002435Status AudioPolicyService::listAudioVolumeGroups(std::vector<media::AudioVolumeGroup>* _aidl_return)
François Gaffie4b2018b2018-11-07 11:18:59 +01002436{
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002437 AudioVolumeGroupVector groups;
François Gaffie4b2018b2018-11-07 11:18:59 +01002438 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002439 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01002440 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002441 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002442 RETURN_IF_BINDER_ERROR(
2443 binderStatusFromStatusT(mAudioPolicyManager->listAudioVolumeGroups(groups)));
2444 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2445 convertContainer<std::vector<media::AudioVolumeGroup>>(groups,
2446 legacy2aidl_AudioVolumeGroup));
2447 return Status::ok();
François Gaffie4b2018b2018-11-07 11:18:59 +01002448}
2449
Francois Gaffie11b65922020-09-24 16:59:08 +02002450Status AudioPolicyService::getVolumeGroupFromAudioAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002451 const media::audio::common::AudioAttributes& aaAidl,
François Gaffie1e2b56f2022-04-01 14:34:29 +02002452 bool fallbackOnDefault, int32_t* _aidl_return) {
2453 audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002454 aidl2legacy_AudioAttributes_audio_attributes_t(aaAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002455 volume_group_t volumeGroup;
2456
François Gaffie4b2018b2018-11-07 11:18:59 +01002457 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002458 return binderStatusFromStatusT(NO_INIT);
François Gaffie4b2018b2018-11-07 11:18:59 +01002459 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002460 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002461 RETURN_IF_BINDER_ERROR(
2462 binderStatusFromStatusT(
Francois Gaffie11b65922020-09-24 16:59:08 +02002463 mAudioPolicyManager->getVolumeGroupFromAudioAttributes(
2464 aa, volumeGroup, fallbackOnDefault)));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002465 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_volume_group_t_int32_t(volumeGroup));
2466 return Status::ok();
François Gaffied0ba9ed2018-11-05 11:50:42 +01002467}
Eric Laurent6ede98f2019-06-11 14:50:30 -07002468
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002469Status AudioPolicyService::setRttEnabled(bool enabled)
Eric Laurent6ede98f2019-06-11 14:50:30 -07002470{
Andy Hung79eacdb2023-11-30 19:34:24 -08002471 audio_utils::lock_guard _l(mMutex);
Eric Laurent6ede98f2019-06-11 14:50:30 -07002472 mUidPolicy->setRttEnabled(enabled);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002473 return Status::ok();
Eric Laurent6ede98f2019-06-11 14:50:30 -07002474}
2475
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002476Status AudioPolicyService::isCallScreenModeSupported(bool* _aidl_return)
Eric Laurent8340e672019-11-06 11:01:08 -08002477{
2478 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002479 return binderStatusFromStatusT(NO_INIT);
Eric Laurent8340e672019-11-06 11:01:08 -08002480 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002481 audio_utils::lock_guard _l(mMutex);
Eric Laurent8340e672019-11-06 11:01:08 -08002482 AutoCallerClear acc;
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002483 *_aidl_return = mAudioPolicyManager->isCallScreenModeSupported();
2484 return Status::ok();
Eric Laurent8340e672019-11-06 11:01:08 -08002485}
2486
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002487Status AudioPolicyService::setDevicesRoleForStrategy(
2488 int32_t strategyAidl,
2489 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002490 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002491 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2492 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2493 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2494 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2495 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2496 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2497 aidl2legacy_AudioDeviceTypeAddress));
2498
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002499 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002500 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002501 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002502 audio_utils::lock_guard _l(mMutex);
Eric Laurent39095982021-08-24 18:29:27 +02002503 status_t status = mAudioPolicyManager->setDevicesRoleForStrategy(strategy, role, devices);
2504 if (status == NO_ERROR) {
2505 onCheckSpatializer_l();
2506 }
2507 return binderStatusFromStatusT(status);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002508}
2509
Paul Wang5d7cdb52022-11-22 09:45:06 +00002510Status AudioPolicyService::removeDevicesRoleForStrategy(
2511 int32_t strategyAidl,
2512 media::DeviceRole roleAidl,
2513 const std::vector<AudioDevice>& devicesAidl) {
2514 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2515 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2516 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2517 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2518 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2519 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2520 aidl2legacy_AudioDeviceTypeAddress));
2521
2522 if (mAudioPolicyManager == NULL) {
2523 return binderStatusFromStatusT(NO_INIT);
2524 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002525 audio_utils::lock_guard _l(mMutex);
Paul Wang5d7cdb52022-11-22 09:45:06 +00002526 status_t status = mAudioPolicyManager->removeDevicesRoleForStrategy(strategy, role, devices);
2527 if (status == NO_ERROR) {
2528 onCheckSpatializer_l();
2529 }
2530 return binderStatusFromStatusT(status);
2531}
2532
2533Status AudioPolicyService::clearDevicesRoleForStrategy(int32_t strategyAidl,
2534 media::DeviceRole roleAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002535 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2536 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2537 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2538 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2539 if (mAudioPolicyManager == NULL) {
2540 return binderStatusFromStatusT(NO_INIT);
2541 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002542 audio_utils::lock_guard _l(mMutex);
Paul Wang5d7cdb52022-11-22 09:45:06 +00002543 status_t status = mAudioPolicyManager->clearDevicesRoleForStrategy(strategy, role);
Eric Laurent39095982021-08-24 18:29:27 +02002544 if (status == NO_ERROR) {
2545 onCheckSpatializer_l();
2546 }
2547 return binderStatusFromStatusT(status);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002548}
2549
2550Status AudioPolicyService::getDevicesForRoleAndStrategy(
2551 int32_t strategyAidl,
2552 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002553 std::vector<AudioDevice>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002554 product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2555 aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2556 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2557 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2558 AudioDeviceTypeAddrVector devices;
2559
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002560 if (mAudioPolicyManager == NULL) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002561 return binderStatusFromStatusT(NO_INIT);
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002562 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002563 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002564 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2565 mAudioPolicyManager->getDevicesForRoleAndStrategy(strategy, role, devices)));
2566 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002567 convertContainer<std::vector<AudioDevice>>(devices,
2568 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002569 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002570}
2571
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002572Status AudioPolicyService::registerSoundTriggerCaptureStateListener(
2573 const sp<media::ICaptureStateListener>& listener, bool* _aidl_return) {
2574 *_aidl_return = mCaptureStateNotifier.RegisterListener(listener);
2575 return Status::ok();
Jean-Michel Trivi30857152019-11-01 11:04:15 -07002576}
2577
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002578Status AudioPolicyService::setDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002579 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002580 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002581 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002582 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002583 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002584 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2585 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2586 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2587 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2588 aidl2legacy_AudioDeviceTypeAddress));
Ytai Ben-Tsvi85093d52020-03-26 09:41:15 -07002589
Jiabin Huang3b98d322020-09-03 17:54:16 +00002590 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002591 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002592 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002593 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002594 return binderStatusFromStatusT(
2595 mAudioPolicyManager->setDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002596}
2597
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002598Status AudioPolicyService::addDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002599 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002600 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002601 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002602 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002603 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002604 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2605 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2606 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2607 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2608 aidl2legacy_AudioDeviceTypeAddress));
2609
Jiabin Huang3b98d322020-09-03 17:54:16 +00002610 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002611 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002612 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002613 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002614 return binderStatusFromStatusT(
2615 mAudioPolicyManager->addDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002616}
2617
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002618Status AudioPolicyService::removeDevicesRoleForCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002619 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002620 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002621 const std::vector<AudioDevice>& devicesAidl) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002622 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002623 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002624 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2625 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2626 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2627 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2628 aidl2legacy_AudioDeviceTypeAddress));
2629
2630 if (mAudioPolicyManager == nullptr) {
2631 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002632 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002633 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002634 return binderStatusFromStatusT(
2635 mAudioPolicyManager->removeDevicesRoleForCapturePreset(audioSource, role, devices));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002636}
2637
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002638Status AudioPolicyService::clearDevicesRoleForCapturePreset(AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002639 media::DeviceRole roleAidl) {
2640 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002641 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002642 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2643 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2644
Jiabin Huang3b98d322020-09-03 17:54:16 +00002645 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002646 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002647 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002648 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002649 return binderStatusFromStatusT(
2650 mAudioPolicyManager->clearDevicesRoleForCapturePreset(audioSource, role));
Jiabin Huang3b98d322020-09-03 17:54:16 +00002651}
2652
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002653Status AudioPolicyService::getDevicesForRoleAndCapturePreset(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002654 AudioSource audioSourceAidl,
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002655 media::DeviceRole roleAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002656 std::vector<AudioDevice>* _aidl_return) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002657 audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovddceecc2021-09-03 13:58:56 -07002658 aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002659 device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2660 aidl2legacy_DeviceRole_device_role_t(roleAidl));
2661 AudioDeviceTypeAddrVector devices;
2662
Jiabin Huang3b98d322020-09-03 17:54:16 +00002663 if (mAudioPolicyManager == nullptr) {
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002664 return binderStatusFromStatusT(NO_INIT);
Jiabin Huang3b98d322020-09-03 17:54:16 +00002665 }
Andy Hung79eacdb2023-11-30 19:34:24 -08002666 audio_utils::lock_guard _l(mMutex);
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002667 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2668 mAudioPolicyManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices)));
2669 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002670 convertContainer<std::vector<AudioDevice>>(devices,
2671 legacy2aidl_AudioDeviceTypeAddress));
Ytai Ben-Tsvi0a4904a2021-01-06 12:57:05 -08002672 return Status::ok();
Jiabin Huang3b98d322020-09-03 17:54:16 +00002673}
2674
Eric Laurent81dd0f52021-07-05 11:54:40 +02002675Status AudioPolicyService::getSpatializer(
2676 const sp<media::INativeSpatializerCallback>& callback,
2677 media::GetSpatializerResponse* _aidl_return) {
2678 _aidl_return->spatializer = nullptr;
Eric Laurent2be8b292021-08-23 09:44:33 -07002679 if (callback == nullptr) {
2680 return binderStatusFromStatusT(BAD_VALUE);
2681 }
Jean-Michel Trivi41628732021-09-09 12:16:21 -07002682 if (mSpatializer != nullptr) {
2683 RETURN_IF_BINDER_ERROR(
2684 binderStatusFromStatusT(mSpatializer->registerCallback(callback)));
2685 _aidl_return->spatializer = mSpatializer;
2686 }
Eric Laurent81dd0f52021-07-05 11:54:40 +02002687 return Status::ok();
2688}
2689
2690Status AudioPolicyService::canBeSpatialized(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002691 const std::optional<media::audio::common::AudioAttributes>& attrAidl,
Mikhail Naganovdbf03642021-08-25 18:15:32 -07002692 const std::optional<AudioConfig>& configAidl,
Mikhail Naganovf4a75362021-09-16 00:02:54 +00002693 const std::vector<AudioDevice>& devicesAidl,
Eric Laurent81dd0f52021-07-05 11:54:40 +02002694 bool* _aidl_return) {
2695 if (mAudioPolicyManager == nullptr) {
2696 return binderStatusFromStatusT(NO_INIT);
2697 }
2698 audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
2699 if (attrAidl.has_value()) {
2700 attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002701 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl.value()));
Eric Laurent81dd0f52021-07-05 11:54:40 +02002702 }
2703 audio_config_t config = AUDIO_CONFIG_INITIALIZER;
2704 if (configAidl.has_value()) {
2705 config = VALUE_OR_RETURN_BINDER_STATUS(
2706 aidl2legacy_AudioConfig_audio_config_t(configAidl.value(),
2707 false /*isInput*/));
2708 }
2709 AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2710 convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2711 aidl2legacy_AudioDeviceTypeAddress));
2712
Andy Hung79eacdb2023-11-30 19:34:24 -08002713 audio_utils::lock_guard _l(mMutex);
Eric Laurent81dd0f52021-07-05 11:54:40 +02002714 *_aidl_return = mAudioPolicyManager->canBeSpatialized(&attr, &config, devices);
2715 return Status::ok();
2716}
2717
Mikhail Naganov1c400902023-05-17 11:48:43 -07002718Status AudioPolicyService::getDirectPlaybackSupport(
2719 const media::audio::common::AudioAttributes &attrAidl,
2720 const AudioConfig &configAidl,
2721 media::AudioDirectMode *_aidl_return) {
jiabin2b9d5a12021-12-10 01:06:29 +00002722 if (mAudioPolicyManager == nullptr) {
2723 return binderStatusFromStatusT(NO_INIT);
2724 }
2725 if (_aidl_return == nullptr) {
2726 return binderStatusFromStatusT(BAD_VALUE);
2727 }
2728 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002729 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabin2b9d5a12021-12-10 01:06:29 +00002730 audio_config_t config = VALUE_OR_RETURN_BINDER_STATUS(
2731 aidl2legacy_AudioConfig_audio_config_t(configAidl, false /*isInput*/));
Andy Hung79eacdb2023-11-30 19:34:24 -08002732 audio_utils::lock_guard _l(mMutex);
jiabin2b9d5a12021-12-10 01:06:29 +00002733 *_aidl_return = static_cast<media::AudioDirectMode>(
2734 VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_direct_mode_t_int32_t_mask(
2735 mAudioPolicyManager->getDirectPlaybackSupport(&attr, &config))));
2736 return Status::ok();
2737}
2738
Dorin Drimusf2196d82022-01-03 12:11:18 +01002739Status AudioPolicyService::getDirectProfilesForAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002740 const media::audio::common::AudioAttributes& attrAidl,
Dorin Drimusf2196d82022-01-03 12:11:18 +01002741 std::vector<media::audio::common::AudioProfile>* _aidl_return) {
2742 if (mAudioPolicyManager == nullptr) {
2743 return binderStatusFromStatusT(NO_INIT);
2744 }
2745 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002746 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
Dorin Drimusf2196d82022-01-03 12:11:18 +01002747 AudioProfileVector audioProfiles;
2748
Andy Hung79eacdb2023-11-30 19:34:24 -08002749 audio_utils::lock_guard _l(mMutex);
Dorin Drimusf2196d82022-01-03 12:11:18 +01002750 RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2751 mAudioPolicyManager->getDirectProfilesForAttributes(&attr, audioProfiles)));
2752 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2753 convertContainer<std::vector<media::audio::common::AudioProfile>>(
2754 audioProfiles, legacy2aidl_AudioProfile_common, false /*isInput*/));
2755
2756 return Status::ok();
2757}
2758
jiabina84c3d32022-12-02 18:59:55 +00002759Status AudioPolicyService::getSupportedMixerAttributes(
2760 int32_t portIdAidl, std::vector<media::AudioMixerAttributesInternal>* _aidl_return) {
2761 if (mAudioPolicyManager == nullptr) {
2762 return binderStatusFromStatusT(NO_INIT);
2763 }
2764
2765 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2766 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2767
2768 std::vector<audio_mixer_attributes_t> mixerAttrs;
Andy Hung79eacdb2023-11-30 19:34:24 -08002769 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002770 RETURN_IF_BINDER_ERROR(
2771 binderStatusFromStatusT(mAudioPolicyManager->getSupportedMixerAttributes(
2772 portId, mixerAttrs)));
2773 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2774 convertContainer<std::vector<media::AudioMixerAttributesInternal>>(
2775 mixerAttrs,
2776 legacy2aidl_audio_mixer_attributes_t_AudioMixerAttributesInternal));
2777 return Status::ok();
2778}
2779
2780Status AudioPolicyService::setPreferredMixerAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002781 const media::audio::common::AudioAttributes& attrAidl,
jiabina84c3d32022-12-02 18:59:55 +00002782 int32_t portIdAidl,
2783 int32_t uidAidl,
2784 const media::AudioMixerAttributesInternal& mixerAttrAidl) {
2785 if (mAudioPolicyManager == nullptr) {
2786 return binderStatusFromStatusT(NO_INIT);
2787 }
2788
2789 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002790 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabina84c3d32022-12-02 18:59:55 +00002791 audio_mixer_attributes_t mixerAttr = VALUE_OR_RETURN_BINDER_STATUS(
2792 aidl2legacy_AudioMixerAttributesInternal_audio_mixer_attributes_t(mixerAttrAidl));
2793 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2794 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2795 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2796
Andy Hung79eacdb2023-11-30 19:34:24 -08002797 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002798 return binderStatusFromStatusT(
2799 mAudioPolicyManager->setPreferredMixerAttributes(&attr, portId, uid, &mixerAttr));
2800}
2801
2802Status AudioPolicyService::getPreferredMixerAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002803 const media::audio::common::AudioAttributes& attrAidl,
jiabina84c3d32022-12-02 18:59:55 +00002804 int32_t portIdAidl,
2805 std::optional<media::AudioMixerAttributesInternal>* _aidl_return) {
2806 if (mAudioPolicyManager == nullptr) {
2807 return binderStatusFromStatusT(NO_INIT);
2808 }
2809
2810 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002811 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabina84c3d32022-12-02 18:59:55 +00002812 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2813 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2814
Andy Hung79eacdb2023-11-30 19:34:24 -08002815 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002816 audio_mixer_attributes_t mixerAttr = AUDIO_MIXER_ATTRIBUTES_INITIALIZER;
2817 RETURN_IF_BINDER_ERROR(
2818 binderStatusFromStatusT(mAudioPolicyManager->getPreferredMixerAttributes(
2819 &attr, portId, &mixerAttr)));
2820 *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2821 legacy2aidl_audio_mixer_attributes_t_AudioMixerAttributesInternal(mixerAttr));
2822 return Status::ok();
2823}
2824
2825Status AudioPolicyService::clearPreferredMixerAttributes(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002826 const media::audio::common::AudioAttributes& attrAidl,
jiabina84c3d32022-12-02 18:59:55 +00002827 int32_t portIdAidl,
2828 int32_t uidAidl) {
2829 if (mAudioPolicyManager == nullptr) {
2830 return binderStatusFromStatusT(NO_INIT);
2831 }
2832
2833 audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
Mikhail Naganov1c400902023-05-17 11:48:43 -07002834 aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
jiabina84c3d32022-12-02 18:59:55 +00002835 uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2836 audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2837 aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2838
Andy Hung79eacdb2023-11-30 19:34:24 -08002839 audio_utils::lock_guard _l(mMutex);
jiabina84c3d32022-12-02 18:59:55 +00002840 return binderStatusFromStatusT(
2841 mAudioPolicyManager->clearPreferredMixerAttributes(&attr, portId, uid));
2842}
2843
Atneya Nair9f91a5e2024-05-09 16:25:05 -07002844Status AudioPolicyService::getPermissionController(sp<INativePermissionController>* out) {
2845 *out = mPermissionController;
2846 return Status::ok();
2847}
2848
Jiabin Huangaa6e9e32024-10-21 17:19:28 +00002849Status AudioPolicyService::getMmapPolicyInfos(
2850 AudioMMapPolicyType policyType, std::vector<AudioMMapPolicyInfo> *_aidl_return) {
2851 if (mAudioPolicyManager == nullptr) {
2852 return binderStatusFromStatusT(NO_INIT);
2853 }
2854 audio_utils::lock_guard _l(mMutex);
2855 return binderStatusFromStatusT(
2856 mAudioPolicyManager->getMmapPolicyInfos(policyType, _aidl_return));
2857}
2858
2859Status AudioPolicyService::getMmapPolicyForDevice(
2860 AudioMMapPolicyType policyType, AudioMMapPolicyInfo *policyInfo) {
2861 if (mAudioPolicyManager == nullptr) {
2862 return binderStatusFromStatusT(NO_INIT);
2863 }
2864 audio_utils::lock_guard _l(mMutex);
2865 return binderStatusFromStatusT(
2866 mAudioPolicyManager->getMmapPolicyForDevice(policyType, policyInfo));
2867}
2868
Mikhail Naganov1b2a7942017-12-08 10:18:09 -08002869} // namespace android