xref: /aosp_15_r20/frameworks/av/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker  * Copyright (C) 2009 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker  *
4*ec779b8eSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker  *
8*ec779b8eSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker  *
10*ec779b8eSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker  * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker  */
16*ec779b8eSAndroid Build Coastguard Worker 
17*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "AudioPolicyInterfaceImpl"
18*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include "AudioPolicyService.h"
21*ec779b8eSAndroid Build Coastguard Worker #include "AudioRecordClient.h"
22*ec779b8eSAndroid Build Coastguard Worker #include "TypeConverter.h"
23*ec779b8eSAndroid Build Coastguard Worker 
24*ec779b8eSAndroid Build Coastguard Worker #include <android/content/AttributionSourceState.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <android_media_audiopolicy.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <android_media_audio.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <binder/Enums.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <com_android_media_audio.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <cutils/properties.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <error/expected_utils.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <media/AidlConversion.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioPolicy.h>
33*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioValidator.h>
34*ec779b8eSAndroid Build Coastguard Worker #include <media/MediaMetricsItem.h>
35*ec779b8eSAndroid Build Coastguard Worker #include <media/PolicyAidlConversion.h>
36*ec779b8eSAndroid Build Coastguard Worker #include <utils/Log.h>
37*ec779b8eSAndroid Build Coastguard Worker 
38*ec779b8eSAndroid Build Coastguard Worker #define VALUE_OR_RETURN_BINDER_STATUS(x) \
39*ec779b8eSAndroid Build Coastguard Worker     ({ auto _tmp = (x); \
40*ec779b8eSAndroid Build Coastguard Worker        if (!_tmp.ok()) return aidl_utils::binderStatusFromStatusT(_tmp.error()); \
41*ec779b8eSAndroid Build Coastguard Worker        std::move(_tmp.value()); })
42*ec779b8eSAndroid Build Coastguard Worker 
43*ec779b8eSAndroid Build Coastguard Worker #define RETURN_BINDER_STATUS_IF_ERROR(x) \
44*ec779b8eSAndroid Build Coastguard Worker     if (status_t _tmp = (x); _tmp != OK) return aidl_utils::binderStatusFromStatusT(_tmp);
45*ec779b8eSAndroid Build Coastguard Worker 
46*ec779b8eSAndroid Build Coastguard Worker #define RETURN_IF_BINDER_ERROR(x)      \
47*ec779b8eSAndroid Build Coastguard Worker     {                                  \
48*ec779b8eSAndroid Build Coastguard Worker         binder::Status _tmp = (x);     \
49*ec779b8eSAndroid Build Coastguard Worker         if (!_tmp.isOk()) return _tmp; \
50*ec779b8eSAndroid Build Coastguard Worker     }
51*ec779b8eSAndroid Build Coastguard Worker 
52*ec779b8eSAndroid Build Coastguard Worker #define CHECK_PERM(expr1, expr2) \
53*ec779b8eSAndroid Build Coastguard Worker     VALUE_OR_RETURN_STATUS(getPermissionProvider().checkPermission((expr1), (expr2)))
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker #define PROPAGATE_FALSEY(val) do { if (!val.has_value() || !val.value()) return val; } while (0)
56*ec779b8eSAndroid Build Coastguard Worker 
57*ec779b8eSAndroid Build Coastguard Worker #define MAX_ITEMS_PER_LIST 1024
58*ec779b8eSAndroid Build Coastguard Worker 
59*ec779b8eSAndroid Build Coastguard Worker namespace android {
60*ec779b8eSAndroid Build Coastguard Worker namespace audiopolicy_flags = android::media::audiopolicy;
61*ec779b8eSAndroid Build Coastguard Worker using binder::Status;
62*ec779b8eSAndroid Build Coastguard Worker using aidl_utils::binderStatusFromStatusT;
63*ec779b8eSAndroid Build Coastguard Worker using android::media::audio::concurrent_audio_record_bypass_permission;
64*ec779b8eSAndroid Build Coastguard Worker using com::android::media::audio::audioserver_permissions;
65*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::NativePermissionController;
66*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum;
67*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::ACCESS_ULTRASOUND;
68*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::CALL_AUDIO_INTERCEPTION;
69*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::CAPTURE_AUDIO_HOTWORD;
70*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::CAPTURE_VOICE_COMMUNICATION_OUTPUT;
71*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::CAPTURE_AUDIO_OUTPUT;
72*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::CAPTURE_MEDIA_OUTPUT;
73*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::CAPTURE_TUNER_AUDIO_INPUT;
74*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::MODIFY_AUDIO_ROUTING;
75*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::MODIFY_AUDIO_SETTINGS;
76*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::MODIFY_AUDIO_SETTINGS_PRIVILEGED;
77*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::MODIFY_DEFAULT_AUDIO_EFFECTS;
78*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::MODIFY_PHONE_STATE;
79*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::RECORD_AUDIO;
80*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::WRITE_SECURE_SETTINGS;
81*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::BLUETOOTH_CONNECT;
82*ec779b8eSAndroid Build Coastguard Worker using com::android::media::permission::PermissionEnum::BYPASS_CONCURRENT_RECORD_AUDIO_RESTRICTION;
83*ec779b8eSAndroid Build Coastguard Worker using content::AttributionSourceState;
84*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioConfig;
85*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioConfigBase;
86*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDevice;
87*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDeviceAddress;
88*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDeviceDescription;
89*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioFormatDescription;
90*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioMode;
91*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioOffloadInfo;
92*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioSource;
93*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioStreamType;
94*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioUsage;
95*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioUuid;
96*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::Int;
97*ec779b8eSAndroid Build Coastguard Worker 
98*ec779b8eSAndroid Build Coastguard Worker constexpr int kDefaultVirtualDeviceId = 0;
99*ec779b8eSAndroid Build Coastguard Worker namespace {
100*ec779b8eSAndroid Build Coastguard Worker constexpr auto PERMISSION_HARD_DENIED = permission::PermissionChecker::PERMISSION_HARD_DENIED;
101*ec779b8eSAndroid Build Coastguard Worker constexpr auto PERMISSION_GRANTED = permission::PermissionChecker::PERMISSION_GRANTED;
102*ec779b8eSAndroid Build Coastguard Worker 
mustAnonymizeBluetoothAddress(const AttributionSourceState & attributionSource,const String16 & caller,const IPermissionProvider & provider)103*ec779b8eSAndroid Build Coastguard Worker bool mustAnonymizeBluetoothAddress(const AttributionSourceState& attributionSource,
104*ec779b8eSAndroid Build Coastguard Worker                                    const String16& caller,
105*ec779b8eSAndroid Build Coastguard Worker                                    const IPermissionProvider& provider) {
106*ec779b8eSAndroid Build Coastguard Worker     if (audioserver_permissions()) {
107*ec779b8eSAndroid Build Coastguard Worker         switch(multiuser_get_app_id(attributionSource.uid)) {
108*ec779b8eSAndroid Build Coastguard Worker             // out of caution, to prevent regression
109*ec779b8eSAndroid Build Coastguard Worker             case AID_ROOT:
110*ec779b8eSAndroid Build Coastguard Worker             case AID_SYSTEM:
111*ec779b8eSAndroid Build Coastguard Worker             case AID_AUDIOSERVER:
112*ec779b8eSAndroid Build Coastguard Worker             case AID_RADIO:
113*ec779b8eSAndroid Build Coastguard Worker             case AID_BLUETOOTH:
114*ec779b8eSAndroid Build Coastguard Worker             case AID_MEDIA:
115*ec779b8eSAndroid Build Coastguard Worker                 return false;
116*ec779b8eSAndroid Build Coastguard Worker         }
117*ec779b8eSAndroid Build Coastguard Worker         const auto res = provider.checkPermission(BLUETOOTH_CONNECT, attributionSource.uid);
118*ec779b8eSAndroid Build Coastguard Worker         if (res.has_value()) {
119*ec779b8eSAndroid Build Coastguard Worker             return !(*res);
120*ec779b8eSAndroid Build Coastguard Worker         } else {
121*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: error: %s", __func__, res.error().toString8().c_str());
122*ec779b8eSAndroid Build Coastguard Worker             return true;
123*ec779b8eSAndroid Build Coastguard Worker         }
124*ec779b8eSAndroid Build Coastguard Worker     } else {
125*ec779b8eSAndroid Build Coastguard Worker         return mustAnonymizeBluetoothAddressLegacy(attributionSource, caller);
126*ec779b8eSAndroid Build Coastguard Worker     }
127*ec779b8eSAndroid Build Coastguard Worker }
128*ec779b8eSAndroid Build Coastguard Worker 
129*ec779b8eSAndroid Build Coastguard Worker }
130*ec779b8eSAndroid Build Coastguard Worker 
131*ec779b8eSAndroid Build Coastguard Worker const std::vector<audio_usage_t>& SYSTEM_USAGES = {
132*ec779b8eSAndroid Build Coastguard Worker     AUDIO_USAGE_CALL_ASSISTANT,
133*ec779b8eSAndroid Build Coastguard Worker     AUDIO_USAGE_EMERGENCY,
134*ec779b8eSAndroid Build Coastguard Worker     AUDIO_USAGE_SAFETY,
135*ec779b8eSAndroid Build Coastguard Worker     AUDIO_USAGE_VEHICLE_STATUS,
136*ec779b8eSAndroid Build Coastguard Worker     AUDIO_USAGE_ANNOUNCEMENT
137*ec779b8eSAndroid Build Coastguard Worker };
138*ec779b8eSAndroid Build Coastguard Worker 
isSystemUsage(audio_usage_t usage)139*ec779b8eSAndroid Build Coastguard Worker bool isSystemUsage(audio_usage_t usage) {
140*ec779b8eSAndroid Build Coastguard Worker     return std::find(std::begin(SYSTEM_USAGES), std::end(SYSTEM_USAGES), usage)
141*ec779b8eSAndroid Build Coastguard Worker         != std::end(SYSTEM_USAGES);
142*ec779b8eSAndroid Build Coastguard Worker }
143*ec779b8eSAndroid Build Coastguard Worker 
isSupportedSystemUsage(audio_usage_t usage)144*ec779b8eSAndroid Build Coastguard Worker bool AudioPolicyService::isSupportedSystemUsage(audio_usage_t usage) {
145*ec779b8eSAndroid Build Coastguard Worker     return std::find(std::begin(mSupportedSystemUsages), std::end(mSupportedSystemUsages), usage)
146*ec779b8eSAndroid Build Coastguard Worker         != std::end(mSupportedSystemUsages);
147*ec779b8eSAndroid Build Coastguard Worker }
148*ec779b8eSAndroid Build Coastguard Worker 
validateUsage(const audio_attributes_t & attr)149*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::validateUsage(const audio_attributes_t& attr) {
150*ec779b8eSAndroid Build Coastguard Worker      return validateUsage(attr, getCallingAttributionSource());
151*ec779b8eSAndroid Build Coastguard Worker }
152*ec779b8eSAndroid Build Coastguard Worker 
validateUsage(const audio_attributes_t & attr,const AttributionSourceState & attributionSource)153*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::validateUsage(const audio_attributes_t& attr,
154*ec779b8eSAndroid Build Coastguard Worker         const AttributionSourceState& attributionSource) {
155*ec779b8eSAndroid Build Coastguard Worker     if (isSystemUsage(attr.usage)) {
156*ec779b8eSAndroid Build Coastguard Worker         if (isSupportedSystemUsage(attr.usage)) {
157*ec779b8eSAndroid Build Coastguard Worker             if (attr.usage == AUDIO_USAGE_CALL_ASSISTANT
158*ec779b8eSAndroid Build Coastguard Worker                     && ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0)) {
159*ec779b8eSAndroid Build Coastguard Worker                 if (!(audioserver_permissions() ?
160*ec779b8eSAndroid Build Coastguard Worker                             CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
161*ec779b8eSAndroid Build Coastguard Worker                             : callAudioInterceptionAllowed(attributionSource))) {
162*ec779b8eSAndroid Build Coastguard Worker                     ALOGE("%s: call audio interception not allowed for attribution source: %s",
163*ec779b8eSAndroid Build Coastguard Worker                            __func__, attributionSource.toString().c_str());
164*ec779b8eSAndroid Build Coastguard Worker                     return Status::fromExceptionCode(Status::EX_SECURITY,
165*ec779b8eSAndroid Build Coastguard Worker                             "Call audio interception not allowed");
166*ec779b8eSAndroid Build Coastguard Worker                 }
167*ec779b8eSAndroid Build Coastguard Worker             } else if (!(audioserver_permissions() ?
168*ec779b8eSAndroid Build Coastguard Worker                         CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid)
169*ec779b8eSAndroid Build Coastguard Worker                         : modifyAudioRoutingAllowed(attributionSource))) {
170*ec779b8eSAndroid Build Coastguard Worker                 ALOGE("%s: modify audio routing not allowed for attribution source: %s",
171*ec779b8eSAndroid Build Coastguard Worker                         __func__, attributionSource.toString().c_str());
172*ec779b8eSAndroid Build Coastguard Worker                     return Status::fromExceptionCode(Status::EX_SECURITY,
173*ec779b8eSAndroid Build Coastguard Worker                             "Modify audio routing not allowed");
174*ec779b8eSAndroid Build Coastguard Worker             }
175*ec779b8eSAndroid Build Coastguard Worker         } else {
176*ec779b8eSAndroid Build Coastguard Worker             return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT);
177*ec779b8eSAndroid Build Coastguard Worker         }
178*ec779b8eSAndroid Build Coastguard Worker     }
179*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
180*ec779b8eSAndroid Build Coastguard Worker }
181*ec779b8eSAndroid Build Coastguard Worker 
182*ec779b8eSAndroid Build Coastguard Worker 
183*ec779b8eSAndroid Build Coastguard Worker 
184*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
185*ec779b8eSAndroid Build Coastguard Worker 
doOnNewAudioModulesAvailable()186*ec779b8eSAndroid Build Coastguard Worker void AudioPolicyService::doOnNewAudioModulesAvailable()
187*ec779b8eSAndroid Build Coastguard Worker {
188*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) return;
189*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
190*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
191*ec779b8eSAndroid Build Coastguard Worker     mAudioPolicyManager->onNewAudioModulesAvailable();
192*ec779b8eSAndroid Build Coastguard Worker }
193*ec779b8eSAndroid Build Coastguard Worker 
setDeviceConnectionState(media::AudioPolicyDeviceState stateAidl,const android::media::audio::common::AudioPort & port,const AudioFormatDescription & encodedFormatAidl)194*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setDeviceConnectionState(
195*ec779b8eSAndroid Build Coastguard Worker         media::AudioPolicyDeviceState stateAidl,
196*ec779b8eSAndroid Build Coastguard Worker         const android::media::audio::common::AudioPort& port,
197*ec779b8eSAndroid Build Coastguard Worker         const AudioFormatDescription& encodedFormatAidl) {
198*ec779b8eSAndroid Build Coastguard Worker     audio_policy_dev_state_t state = VALUE_OR_RETURN_BINDER_STATUS(
199*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioPolicyDeviceState_audio_policy_dev_state_t(stateAidl));
200*ec779b8eSAndroid Build Coastguard Worker     audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
201*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioFormatDescription_audio_format_t(encodedFormatAidl));
202*ec779b8eSAndroid Build Coastguard Worker 
203*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
204*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
205*ec779b8eSAndroid Build Coastguard Worker     }
206*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
207*ec779b8eSAndroid Build Coastguard Worker             CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
208*ec779b8eSAndroid Build Coastguard Worker             : settingsAllowed())) {
209*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
210*ec779b8eSAndroid Build Coastguard Worker     }
211*ec779b8eSAndroid Build Coastguard Worker     if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
212*ec779b8eSAndroid Build Coastguard Worker             state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
213*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(BAD_VALUE);
214*ec779b8eSAndroid Build Coastguard Worker     }
215*ec779b8eSAndroid Build Coastguard Worker 
216*ec779b8eSAndroid Build Coastguard Worker     ALOGV("setDeviceConnectionState()");
217*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
218*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
219*ec779b8eSAndroid Build Coastguard Worker     status_t status = mAudioPolicyManager->setDeviceConnectionState(
220*ec779b8eSAndroid Build Coastguard Worker             state, port, encodedFormat);
221*ec779b8eSAndroid Build Coastguard Worker     if (status == NO_ERROR) {
222*ec779b8eSAndroid Build Coastguard Worker         onCheckSpatializer_l();
223*ec779b8eSAndroid Build Coastguard Worker     }
224*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(status);
225*ec779b8eSAndroid Build Coastguard Worker }
226*ec779b8eSAndroid Build Coastguard Worker 
getDeviceConnectionState(const AudioDevice & deviceAidl,media::AudioPolicyDeviceState * _aidl_return)227*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getDeviceConnectionState(const AudioDevice& deviceAidl,
228*ec779b8eSAndroid Build Coastguard Worker                                                     media::AudioPolicyDeviceState* _aidl_return) {
229*ec779b8eSAndroid Build Coastguard Worker     audio_devices_t device;
230*ec779b8eSAndroid Build Coastguard Worker     std::string address;
231*ec779b8eSAndroid Build Coastguard Worker     RETURN_BINDER_STATUS_IF_ERROR(
232*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
233*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
234*ec779b8eSAndroid Build Coastguard Worker         *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
235*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
236*ec779b8eSAndroid Build Coastguard Worker                         AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE));
237*ec779b8eSAndroid Build Coastguard Worker         return Status::ok();
238*ec779b8eSAndroid Build Coastguard Worker     }
239*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
240*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
241*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
242*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_policy_dev_state_t_AudioPolicyDeviceState(
243*ec779b8eSAndroid Build Coastguard Worker                     mAudioPolicyManager->getDeviceConnectionState(
244*ec779b8eSAndroid Build Coastguard Worker                             device, address.c_str())));
245*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
246*ec779b8eSAndroid Build Coastguard Worker }
247*ec779b8eSAndroid Build Coastguard Worker 
handleDeviceConfigChange(const AudioDevice & deviceAidl,const std::string & deviceNameAidl,const AudioFormatDescription & encodedFormatAidl)248*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::handleDeviceConfigChange(
249*ec779b8eSAndroid Build Coastguard Worker         const AudioDevice& deviceAidl,
250*ec779b8eSAndroid Build Coastguard Worker         const std::string& deviceNameAidl,
251*ec779b8eSAndroid Build Coastguard Worker         const AudioFormatDescription& encodedFormatAidl) {
252*ec779b8eSAndroid Build Coastguard Worker     audio_devices_t device;
253*ec779b8eSAndroid Build Coastguard Worker     std::string address;
254*ec779b8eSAndroid Build Coastguard Worker     RETURN_BINDER_STATUS_IF_ERROR(
255*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioDevice_audio_device(deviceAidl, &device, &address));
256*ec779b8eSAndroid Build Coastguard Worker     audio_format_t encodedFormat = VALUE_OR_RETURN_BINDER_STATUS(
257*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioFormatDescription_audio_format_t(encodedFormatAidl));
258*ec779b8eSAndroid Build Coastguard Worker 
259*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
260*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
261*ec779b8eSAndroid Build Coastguard Worker     }
262*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
263*ec779b8eSAndroid Build Coastguard Worker             CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
264*ec779b8eSAndroid Build Coastguard Worker             : settingsAllowed())) {
265*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
266*ec779b8eSAndroid Build Coastguard Worker     }
267*ec779b8eSAndroid Build Coastguard Worker 
268*ec779b8eSAndroid Build Coastguard Worker     ALOGV("handleDeviceConfigChange()");
269*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
270*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
271*ec779b8eSAndroid Build Coastguard Worker     status_t status =  mAudioPolicyManager->handleDeviceConfigChange(
272*ec779b8eSAndroid Build Coastguard Worker             device, address.c_str(), deviceNameAidl.c_str(), encodedFormat);
273*ec779b8eSAndroid Build Coastguard Worker 
274*ec779b8eSAndroid Build Coastguard Worker     if (status == NO_ERROR) {
275*ec779b8eSAndroid Build Coastguard Worker        onCheckSpatializer_l();
276*ec779b8eSAndroid Build Coastguard Worker     }
277*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(status);
278*ec779b8eSAndroid Build Coastguard Worker }
279*ec779b8eSAndroid Build Coastguard Worker 
setPhoneState(AudioMode stateAidl,int32_t uidAidl)280*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setPhoneState(AudioMode stateAidl, int32_t uidAidl)
281*ec779b8eSAndroid Build Coastguard Worker {
282*ec779b8eSAndroid Build Coastguard Worker     audio_mode_t state = VALUE_OR_RETURN_BINDER_STATUS(
283*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioMode_audio_mode_t(stateAidl));
284*ec779b8eSAndroid Build Coastguard Worker     uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
285*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
286*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
287*ec779b8eSAndroid Build Coastguard Worker     }
288*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
289*ec779b8eSAndroid Build Coastguard Worker             CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
290*ec779b8eSAndroid Build Coastguard Worker             : settingsAllowed())) {
291*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
292*ec779b8eSAndroid Build Coastguard Worker     }
293*ec779b8eSAndroid Build Coastguard Worker     if (uint32_t(state) >= AUDIO_MODE_CNT) {
294*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(BAD_VALUE);
295*ec779b8eSAndroid Build Coastguard Worker     }
296*ec779b8eSAndroid Build Coastguard Worker 
297*ec779b8eSAndroid Build Coastguard Worker     ALOGV("setPhoneState()");
298*ec779b8eSAndroid Build Coastguard Worker 
299*ec779b8eSAndroid Build Coastguard Worker     // acquire lock before calling setMode() so that setMode() + setPhoneState() are an atomic
300*ec779b8eSAndroid Build Coastguard Worker     // operation from policy manager standpoint (no other operation (e.g track start or stop)
301*ec779b8eSAndroid Build Coastguard Worker     // can be interleaved).
302*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
303*ec779b8eSAndroid Build Coastguard Worker     // TODO: check if it is more appropriate to do it in platform specific policy manager
304*ec779b8eSAndroid Build Coastguard Worker 
305*ec779b8eSAndroid Build Coastguard Worker     // Audio HAL mode conversion for call redirect modes
306*ec779b8eSAndroid Build Coastguard Worker     audio_mode_t halMode = state;
307*ec779b8eSAndroid Build Coastguard Worker     if (state == AUDIO_MODE_CALL_REDIRECT) {
308*ec779b8eSAndroid Build Coastguard Worker         halMode = AUDIO_MODE_CALL_SCREEN;
309*ec779b8eSAndroid Build Coastguard Worker     } else if (state == AUDIO_MODE_COMMUNICATION_REDIRECT) {
310*ec779b8eSAndroid Build Coastguard Worker         halMode = AUDIO_MODE_NORMAL;
311*ec779b8eSAndroid Build Coastguard Worker     }
312*ec779b8eSAndroid Build Coastguard Worker     AudioSystem::setMode(halMode);
313*ec779b8eSAndroid Build Coastguard Worker 
314*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
315*ec779b8eSAndroid Build Coastguard Worker     mAudioPolicyManager->setPhoneState(state);
316*ec779b8eSAndroid Build Coastguard Worker     mPhoneState = state;
317*ec779b8eSAndroid Build Coastguard Worker     mPhoneStateOwnerUid = uid;
318*ec779b8eSAndroid Build Coastguard Worker     updateUidStates_l();
319*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
320*ec779b8eSAndroid Build Coastguard Worker }
321*ec779b8eSAndroid Build Coastguard Worker 
getPhoneState(AudioMode * _aidl_return)322*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getPhoneState(AudioMode* _aidl_return) {
323*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
324*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_mode_t_AudioMode(mPhoneState));
325*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
326*ec779b8eSAndroid Build Coastguard Worker }
327*ec779b8eSAndroid Build Coastguard Worker 
setForceUse(media::AudioPolicyForceUse usageAidl,media::AudioPolicyForcedConfig configAidl)328*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setForceUse(media::AudioPolicyForceUse usageAidl,
329*ec779b8eSAndroid Build Coastguard Worker                                        media::AudioPolicyForcedConfig configAidl)
330*ec779b8eSAndroid Build Coastguard Worker {
331*ec779b8eSAndroid Build Coastguard Worker     audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
332*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
333*ec779b8eSAndroid Build Coastguard Worker     audio_policy_forced_cfg_t config = VALUE_OR_RETURN_BINDER_STATUS(
334*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioPolicyForcedConfig_audio_policy_forced_cfg_t(configAidl));
335*ec779b8eSAndroid Build Coastguard Worker 
336*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
337*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
338*ec779b8eSAndroid Build Coastguard Worker     }
339*ec779b8eSAndroid Build Coastguard Worker 
340*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
341*ec779b8eSAndroid Build Coastguard Worker             CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
342*ec779b8eSAndroid Build Coastguard Worker             : modifyAudioRoutingAllowed())) {
343*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
344*ec779b8eSAndroid Build Coastguard Worker     }
345*ec779b8eSAndroid Build Coastguard Worker 
346*ec779b8eSAndroid Build Coastguard Worker     if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
347*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(BAD_VALUE);
348*ec779b8eSAndroid Build Coastguard Worker     }
349*ec779b8eSAndroid Build Coastguard Worker     if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
350*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(BAD_VALUE);
351*ec779b8eSAndroid Build Coastguard Worker     }
352*ec779b8eSAndroid Build Coastguard Worker     ALOGV("setForceUse()");
353*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
354*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
355*ec779b8eSAndroid Build Coastguard Worker     mAudioPolicyManager->setForceUse(usage, config);
356*ec779b8eSAndroid Build Coastguard Worker     onCheckSpatializer_l();
357*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
358*ec779b8eSAndroid Build Coastguard Worker }
359*ec779b8eSAndroid Build Coastguard Worker 
getForceUse(media::AudioPolicyForceUse usageAidl,media::AudioPolicyForcedConfig * _aidl_return)360*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getForceUse(media::AudioPolicyForceUse usageAidl,
361*ec779b8eSAndroid Build Coastguard Worker                                        media::AudioPolicyForcedConfig* _aidl_return) {
362*ec779b8eSAndroid Build Coastguard Worker     audio_policy_force_use_t usage = VALUE_OR_RETURN_BINDER_STATUS(
363*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioPolicyForceUse_audio_policy_force_use_t(usageAidl));
364*ec779b8eSAndroid Build Coastguard Worker 
365*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
366*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
367*ec779b8eSAndroid Build Coastguard Worker     }
368*ec779b8eSAndroid Build Coastguard Worker     if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
369*ec779b8eSAndroid Build Coastguard Worker         *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
370*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(AUDIO_POLICY_FORCE_NONE));
371*ec779b8eSAndroid Build Coastguard Worker         return Status::ok();
372*ec779b8eSAndroid Build Coastguard Worker     }
373*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
374*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
375*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_policy_forced_cfg_t_AudioPolicyForcedConfig(
376*ec779b8eSAndroid Build Coastguard Worker                     mAudioPolicyManager->getForceUse(usage)));
377*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
378*ec779b8eSAndroid Build Coastguard Worker }
379*ec779b8eSAndroid Build Coastguard Worker 
getOutput(AudioStreamType streamAidl,int32_t * _aidl_return)380*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getOutput(AudioStreamType streamAidl, int32_t* _aidl_return)
381*ec779b8eSAndroid Build Coastguard Worker {
382*ec779b8eSAndroid Build Coastguard Worker     audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
383*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
384*ec779b8eSAndroid Build Coastguard Worker 
385*ec779b8eSAndroid Build Coastguard Worker     if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT
386*ec779b8eSAndroid Build Coastguard Worker           && stream != AUDIO_STREAM_ASSISTANT && stream != AUDIO_STREAM_CALL_ASSISTANT) {
387*ec779b8eSAndroid Build Coastguard Worker         *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
388*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_io_handle_t_int32_t(AUDIO_IO_HANDLE_NONE));
389*ec779b8eSAndroid Build Coastguard Worker         return Status::ok();
390*ec779b8eSAndroid Build Coastguard Worker     }
391*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
392*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
393*ec779b8eSAndroid Build Coastguard Worker     }
394*ec779b8eSAndroid Build Coastguard Worker     ALOGV("getOutput()");
395*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
396*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
397*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
398*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutput(stream)));
399*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
400*ec779b8eSAndroid Build Coastguard Worker }
401*ec779b8eSAndroid Build Coastguard Worker 
getOutputForAttr(const media::audio::common::AudioAttributes & attrAidl,int32_t sessionAidl,const AttributionSourceState & attributionSource,const AudioConfig & configAidl,int32_t flagsAidl,const std::vector<int32_t> & selectedDeviceIdsAidl,media::GetOutputForAttrResponse * _aidl_return)402*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getOutputForAttr(const media::audio::common::AudioAttributes& attrAidl,
403*ec779b8eSAndroid Build Coastguard Worker                                             int32_t sessionAidl,
404*ec779b8eSAndroid Build Coastguard Worker                                             const AttributionSourceState& attributionSource,
405*ec779b8eSAndroid Build Coastguard Worker                                             const AudioConfig& configAidl,
406*ec779b8eSAndroid Build Coastguard Worker                                             int32_t flagsAidl,
407*ec779b8eSAndroid Build Coastguard Worker                                             const std::vector<int32_t>& selectedDeviceIdsAidl,
408*ec779b8eSAndroid Build Coastguard Worker                                             media::GetOutputForAttrResponse* _aidl_return)
409*ec779b8eSAndroid Build Coastguard Worker {
410*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
411*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
412*ec779b8eSAndroid Build Coastguard Worker     audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
413*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_session_t(sessionAidl));
414*ec779b8eSAndroid Build Coastguard Worker     audio_stream_type_t stream = AUDIO_STREAM_DEFAULT;
415*ec779b8eSAndroid Build Coastguard Worker     audio_config_t config = VALUE_OR_RETURN_BINDER_STATUS(
416*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioConfig_audio_config_t(configAidl, false /*isInput*/));
417*ec779b8eSAndroid Build Coastguard Worker     audio_output_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
418*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_output_flags_t_mask(flagsAidl));
419*ec779b8eSAndroid Build Coastguard Worker     DeviceIdVector selectedDeviceIds = VALUE_OR_RETURN_BINDER_STATUS(
420*ec779b8eSAndroid Build Coastguard Worker             convertContainer<DeviceIdVector>(selectedDeviceIdsAidl,
421*ec779b8eSAndroid Build Coastguard Worker                                              aidl2legacy_int32_t_audio_port_handle_t));
422*ec779b8eSAndroid Build Coastguard Worker 
423*ec779b8eSAndroid Build Coastguard Worker     audio_io_handle_t output;
424*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t portId;
425*ec779b8eSAndroid Build Coastguard Worker     std::vector<audio_io_handle_t> secondaryOutputs;
426*ec779b8eSAndroid Build Coastguard Worker 
427*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
428*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
429*ec779b8eSAndroid Build Coastguard Worker     }
430*ec779b8eSAndroid Build Coastguard Worker 
431*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(
432*ec779b8eSAndroid Build Coastguard Worker             binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
433*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(validateUsage(attr, attributionSource));
434*ec779b8eSAndroid Build Coastguard Worker 
435*ec779b8eSAndroid Build Coastguard Worker     ALOGV("%s()", __func__);
436*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
437*ec779b8eSAndroid Build Coastguard Worker 
438*ec779b8eSAndroid Build Coastguard Worker     if (!mPackageManager.allowPlaybackCapture(VALUE_OR_RETURN_BINDER_STATUS(
439*ec779b8eSAndroid Build Coastguard Worker         aidl2legacy_int32_t_uid_t(attributionSource.uid)))) {
440*ec779b8eSAndroid Build Coastguard Worker         attr.flags = static_cast<audio_flags_mask_t>(attr.flags | AUDIO_FLAG_NO_MEDIA_PROJECTION);
441*ec779b8eSAndroid Build Coastguard Worker     }
442*ec779b8eSAndroid Build Coastguard Worker     const bool bypassInterruptionAllowed = audioserver_permissions() ? (
443*ec779b8eSAndroid Build Coastguard Worker             CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid) ||
444*ec779b8eSAndroid Build Coastguard Worker             CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid) ||
445*ec779b8eSAndroid Build Coastguard Worker             CHECK_PERM(WRITE_SECURE_SETTINGS, attributionSource.uid))
446*ec779b8eSAndroid Build Coastguard Worker             : bypassInterruptionPolicyAllowed(attributionSource);
447*ec779b8eSAndroid Build Coastguard Worker 
448*ec779b8eSAndroid Build Coastguard Worker     if (((attr.flags & (AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)) != 0)
449*ec779b8eSAndroid Build Coastguard Worker             && !bypassInterruptionAllowed) {
450*ec779b8eSAndroid Build Coastguard Worker         attr.flags = static_cast<audio_flags_mask_t>(
451*ec779b8eSAndroid Build Coastguard Worker                 attr.flags & ~(AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE));
452*ec779b8eSAndroid Build Coastguard Worker     }
453*ec779b8eSAndroid Build Coastguard Worker 
454*ec779b8eSAndroid Build Coastguard Worker     if (attr.content_type == AUDIO_CONTENT_TYPE_ULTRASOUND) {
455*ec779b8eSAndroid Build Coastguard Worker         if (!(audioserver_permissions() ?
456*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(ACCESS_ULTRASOUND, attributionSource.uid)
457*ec779b8eSAndroid Build Coastguard Worker                 : accessUltrasoundAllowed(attributionSource))) {
458*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: permission denied: ultrasound not allowed for uid %d pid %d",
459*ec779b8eSAndroid Build Coastguard Worker                     __func__, attributionSource.uid, attributionSource.pid);
460*ec779b8eSAndroid Build Coastguard Worker             return binderStatusFromStatusT(PERMISSION_DENIED);
461*ec779b8eSAndroid Build Coastguard Worker         }
462*ec779b8eSAndroid Build Coastguard Worker     }
463*ec779b8eSAndroid Build Coastguard Worker 
464*ec779b8eSAndroid Build Coastguard Worker     //TODO this permission check should extend to all system usages
465*ec779b8eSAndroid Build Coastguard Worker     if (attr.usage == AUDIO_USAGE_SPEAKER_CLEANUP) {
466*ec779b8eSAndroid Build Coastguard Worker         if (!(audioserver_permissions() ?
467*ec779b8eSAndroid Build Coastguard Worker               CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid)
468*ec779b8eSAndroid Build Coastguard Worker               : modifyAudioRoutingAllowed())) {
469*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: permission denied: SPEAKER_CLEANUP not allowed for uid %d pid %d",
470*ec779b8eSAndroid Build Coastguard Worker                     __func__, attributionSource.uid, attributionSource.pid);
471*ec779b8eSAndroid Build Coastguard Worker             return binderStatusFromStatusT(PERMISSION_DENIED);
472*ec779b8eSAndroid Build Coastguard Worker         }
473*ec779b8eSAndroid Build Coastguard Worker     }
474*ec779b8eSAndroid Build Coastguard Worker 
475*ec779b8eSAndroid Build Coastguard Worker     if (strlen(attr.tags) != 0) {
476*ec779b8eSAndroid Build Coastguard Worker         const bool audioAttributesTagsAllowed = audioserver_permissions() ? (
477*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_AUDIO_SETTINGS_PRIVILEGED, attributionSource.uid) ||
478*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid) ||
479*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid) ||
480*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(CAPTURE_MEDIA_OUTPUT, attributionSource.uid) ||
481*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(CAPTURE_VOICE_COMMUNICATION_OUTPUT, attributionSource.uid))
482*ec779b8eSAndroid Build Coastguard Worker                 : (modifyAudioSettingsPrivilegedAllowed(attributionSource) ||
483*ec779b8eSAndroid Build Coastguard Worker                    modifyAudioRoutingAllowed() ||
484*ec779b8eSAndroid Build Coastguard Worker                    callAudioInterceptionAllowed(attributionSource) ||
485*ec779b8eSAndroid Build Coastguard Worker                    captureMediaOutputAllowed(attributionSource) ||
486*ec779b8eSAndroid Build Coastguard Worker                    captureVoiceCommunicationOutputAllowed(attributionSource));
487*ec779b8eSAndroid Build Coastguard Worker         if (!audioAttributesTagsAllowed) {
488*ec779b8eSAndroid Build Coastguard Worker             ALOGE("%s: permission denied: audio attributes tags not allowed for uid %d pid %d",
489*ec779b8eSAndroid Build Coastguard Worker                   __func__, attributionSource.uid, attributionSource.pid);
490*ec779b8eSAndroid Build Coastguard Worker             return binderStatusFromStatusT(PERMISSION_DENIED);
491*ec779b8eSAndroid Build Coastguard Worker         }
492*ec779b8eSAndroid Build Coastguard Worker     }
493*ec779b8eSAndroid Build Coastguard Worker 
494*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
495*ec779b8eSAndroid Build Coastguard Worker     AudioPolicyInterface::output_type_t outputType;
496*ec779b8eSAndroid Build Coastguard Worker     bool isSpatialized = false;
497*ec779b8eSAndroid Build Coastguard Worker     bool isBitPerfect = false;
498*ec779b8eSAndroid Build Coastguard Worker     float volume;
499*ec779b8eSAndroid Build Coastguard Worker     bool muted;
500*ec779b8eSAndroid Build Coastguard Worker     status_t result = mAudioPolicyManager->getOutputForAttr(&attr, &output, session,
501*ec779b8eSAndroid Build Coastguard Worker                                                             &stream,
502*ec779b8eSAndroid Build Coastguard Worker                                                             attributionSource,
503*ec779b8eSAndroid Build Coastguard Worker                                                             &config,
504*ec779b8eSAndroid Build Coastguard Worker                                                             &flags, &selectedDeviceIds, &portId,
505*ec779b8eSAndroid Build Coastguard Worker                                                             &secondaryOutputs,
506*ec779b8eSAndroid Build Coastguard Worker                                                             &outputType,
507*ec779b8eSAndroid Build Coastguard Worker                                                             &isSpatialized,
508*ec779b8eSAndroid Build Coastguard Worker                                                             &isBitPerfect,
509*ec779b8eSAndroid Build Coastguard Worker                                                             &volume,
510*ec779b8eSAndroid Build Coastguard Worker                                                             &muted);
511*ec779b8eSAndroid Build Coastguard Worker 
512*ec779b8eSAndroid Build Coastguard Worker     // FIXME: Introduce a way to check for the the telephony device before opening the output
513*ec779b8eSAndroid Build Coastguard Worker     if (result == NO_ERROR) {
514*ec779b8eSAndroid Build Coastguard Worker         // enforce permission (if any) required for each type of input
515*ec779b8eSAndroid Build Coastguard Worker         switch (outputType) {
516*ec779b8eSAndroid Build Coastguard Worker         case AudioPolicyInterface::API_OUTPUT_LEGACY:
517*ec779b8eSAndroid Build Coastguard Worker             break;
518*ec779b8eSAndroid Build Coastguard Worker         case AudioPolicyInterface::API_OUTPUT_TELEPHONY_TX:
519*ec779b8eSAndroid Build Coastguard Worker             if (((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0)
520*ec779b8eSAndroid Build Coastguard Worker                 && !(audioserver_permissions() ?
521*ec779b8eSAndroid Build Coastguard Worker                         CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid)
522*ec779b8eSAndroid Build Coastguard Worker                 : callAudioInterceptionAllowed(attributionSource))) {
523*ec779b8eSAndroid Build Coastguard Worker                 ALOGE("%s() permission denied: call redirection not allowed for uid %d",
524*ec779b8eSAndroid Build Coastguard Worker                     __func__, attributionSource.uid);
525*ec779b8eSAndroid Build Coastguard Worker                 result = PERMISSION_DENIED;
526*ec779b8eSAndroid Build Coastguard Worker             } else if (!(audioserver_permissions() ?
527*ec779b8eSAndroid Build Coastguard Worker                         CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid)
528*ec779b8eSAndroid Build Coastguard Worker                     : modifyPhoneStateAllowed(attributionSource))) {
529*ec779b8eSAndroid Build Coastguard Worker                 ALOGE("%s() permission denied: modify phone state not allowed for uid %d",
530*ec779b8eSAndroid Build Coastguard Worker                     __func__, attributionSource.uid);
531*ec779b8eSAndroid Build Coastguard Worker                 result = PERMISSION_DENIED;
532*ec779b8eSAndroid Build Coastguard Worker             }
533*ec779b8eSAndroid Build Coastguard Worker             break;
534*ec779b8eSAndroid Build Coastguard Worker         case AudioPolicyInterface::API_OUT_MIX_PLAYBACK:
535*ec779b8eSAndroid Build Coastguard Worker             if (!(audioserver_permissions() ?
536*ec779b8eSAndroid Build Coastguard Worker                         CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid)
537*ec779b8eSAndroid Build Coastguard Worker                     : modifyAudioRoutingAllowed(attributionSource))) {
538*ec779b8eSAndroid Build Coastguard Worker                 ALOGE("%s() permission denied: modify audio routing not allowed for uid %d",
539*ec779b8eSAndroid Build Coastguard Worker                     __func__, attributionSource.uid);
540*ec779b8eSAndroid Build Coastguard Worker                 result = PERMISSION_DENIED;
541*ec779b8eSAndroid Build Coastguard Worker             }
542*ec779b8eSAndroid Build Coastguard Worker             break;
543*ec779b8eSAndroid Build Coastguard Worker         case AudioPolicyInterface::API_OUTPUT_INVALID:
544*ec779b8eSAndroid Build Coastguard Worker         default:
545*ec779b8eSAndroid Build Coastguard Worker             LOG_ALWAYS_FATAL("%s() encountered an invalid output type %d",
546*ec779b8eSAndroid Build Coastguard Worker                 __func__, (int)outputType);
547*ec779b8eSAndroid Build Coastguard Worker         }
548*ec779b8eSAndroid Build Coastguard Worker     }
549*ec779b8eSAndroid Build Coastguard Worker 
550*ec779b8eSAndroid Build Coastguard Worker     if (result == NO_ERROR) {
551*ec779b8eSAndroid Build Coastguard Worker         // usecase validator is disabled by default
552*ec779b8eSAndroid Build Coastguard Worker         if (property_get_bool("ro.audio.usecase_validator_enabled", false /* default */)) {
553*ec779b8eSAndroid Build Coastguard Worker                 attr = VALUE_OR_RETURN_BINDER_STATUS(
554*ec779b8eSAndroid Build Coastguard Worker                         mUsecaseValidator->verifyAudioAttributes(output, attributionSource, attr));
555*ec779b8eSAndroid Build Coastguard Worker         }
556*ec779b8eSAndroid Build Coastguard Worker 
557*ec779b8eSAndroid Build Coastguard Worker         sp<AudioPlaybackClient> client =
558*ec779b8eSAndroid Build Coastguard Worker                 new AudioPlaybackClient(attr, output, attributionSource, session,
559*ec779b8eSAndroid Build Coastguard Worker                     portId, selectedDeviceIds, stream, isSpatialized, config.channel_mask);
560*ec779b8eSAndroid Build Coastguard Worker         mAudioPlaybackClients.add(portId, client);
561*ec779b8eSAndroid Build Coastguard Worker 
562*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->output = VALUE_OR_RETURN_BINDER_STATUS(
563*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_io_handle_t_int32_t(output));
564*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->stream = VALUE_OR_RETURN_BINDER_STATUS(
565*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_stream_type_t_AudioStreamType(stream));
566*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->selectedDeviceIds = VALUE_OR_RETURN_BINDER_STATUS(
567*ec779b8eSAndroid Build Coastguard Worker                 convertContainer<std::vector<int32_t>>(selectedDeviceIds,
568*ec779b8eSAndroid Build Coastguard Worker                                                        legacy2aidl_audio_port_handle_t_int32_t));
569*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->portId = VALUE_OR_RETURN_BINDER_STATUS(
570*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_port_handle_t_int32_t(portId));
571*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->secondaryOutputs = VALUE_OR_RETURN_BINDER_STATUS(
572*ec779b8eSAndroid Build Coastguard Worker                 convertContainer<std::vector<int32_t>>(secondaryOutputs,
573*ec779b8eSAndroid Build Coastguard Worker                                                        legacy2aidl_audio_io_handle_t_int32_t));
574*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->isSpatialized = isSpatialized;
575*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->isBitPerfect = isBitPerfect;
576*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->attr = VALUE_OR_RETURN_BINDER_STATUS(
577*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_attributes_t_AudioAttributes(attr));
578*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->volume = volume;
579*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->muted = muted;
580*ec779b8eSAndroid Build Coastguard Worker     } else {
581*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->configBase.format = VALUE_OR_RETURN_BINDER_STATUS(
582*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_format_t_AudioFormatDescription(config.format));
583*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->configBase.channelMask = VALUE_OR_RETURN_BINDER_STATUS(
584*ec779b8eSAndroid Build Coastguard Worker                 legacy2aidl_audio_channel_mask_t_AudioChannelLayout(
585*ec779b8eSAndroid Build Coastguard Worker                         config.channel_mask, false /*isInput*/));
586*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->configBase.sampleRate = config.sample_rate;
587*ec779b8eSAndroid Build Coastguard Worker     }
588*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(result);
589*ec779b8eSAndroid Build Coastguard Worker }
590*ec779b8eSAndroid Build Coastguard Worker 
getPlaybackClientAndEffects(audio_port_handle_t portId,sp<AudioPlaybackClient> & client,sp<AudioPolicyEffects> & effects,const char * context)591*ec779b8eSAndroid Build Coastguard Worker void AudioPolicyService::getPlaybackClientAndEffects(audio_port_handle_t portId,
592*ec779b8eSAndroid Build Coastguard Worker                                                      sp<AudioPlaybackClient>& client,
593*ec779b8eSAndroid Build Coastguard Worker                                                      sp<AudioPolicyEffects>& effects,
594*ec779b8eSAndroid Build Coastguard Worker                                                      const char *context)
595*ec779b8eSAndroid Build Coastguard Worker {
596*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
597*ec779b8eSAndroid Build Coastguard Worker     const ssize_t index = mAudioPlaybackClients.indexOfKey(portId);
598*ec779b8eSAndroid Build Coastguard Worker     if (index < 0) {
599*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s AudioTrack client not found for portId %d", context, portId);
600*ec779b8eSAndroid Build Coastguard Worker         return;
601*ec779b8eSAndroid Build Coastguard Worker     }
602*ec779b8eSAndroid Build Coastguard Worker     client = mAudioPlaybackClients.valueAt(index);
603*ec779b8eSAndroid Build Coastguard Worker     effects = mAudioPolicyEffects;
604*ec779b8eSAndroid Build Coastguard Worker }
605*ec779b8eSAndroid Build Coastguard Worker 
startOutput(int32_t portIdAidl)606*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::startOutput(int32_t portIdAidl)
607*ec779b8eSAndroid Build Coastguard Worker {
608*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
609*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
610*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
611*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
612*ec779b8eSAndroid Build Coastguard Worker     }
613*ec779b8eSAndroid Build Coastguard Worker     ALOGV("startOutput()");
614*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPlaybackClient> client;
615*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPolicyEffects> audioPolicyEffects;
616*ec779b8eSAndroid Build Coastguard Worker 
617*ec779b8eSAndroid Build Coastguard Worker     getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
618*ec779b8eSAndroid Build Coastguard Worker 
619*ec779b8eSAndroid Build Coastguard Worker     if (audioPolicyEffects != 0) {
620*ec779b8eSAndroid Build Coastguard Worker         // create audio processors according to stream
621*ec779b8eSAndroid Build Coastguard Worker         status_t status = audioPolicyEffects->addOutputSessionEffects(client->io, client->stream,
622*ec779b8eSAndroid Build Coastguard Worker                                                                       client->session);
623*ec779b8eSAndroid Build Coastguard Worker         if (status != NO_ERROR && status != ALREADY_EXISTS) {
624*ec779b8eSAndroid Build Coastguard Worker             ALOGW("Failed to add effects on session %d", client->session);
625*ec779b8eSAndroid Build Coastguard Worker         }
626*ec779b8eSAndroid Build Coastguard Worker     }
627*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
628*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
629*ec779b8eSAndroid Build Coastguard Worker     status_t status = mAudioPolicyManager->startOutput(portId);
630*ec779b8eSAndroid Build Coastguard Worker     if (status == NO_ERROR) {
631*ec779b8eSAndroid Build Coastguard Worker         //TODO b/257922898: decide if/how we need to handle attributes update when playback starts
632*ec779b8eSAndroid Build Coastguard Worker         // or during playback
633*ec779b8eSAndroid Build Coastguard Worker         (void)mUsecaseValidator->startClient(client->io, client->portId, client->attributionSource,
634*ec779b8eSAndroid Build Coastguard Worker                 client->attributes, nullptr /* callback */);
635*ec779b8eSAndroid Build Coastguard Worker         client->active = true;
636*ec779b8eSAndroid Build Coastguard Worker         onUpdateActiveSpatializerTracks_l();
637*ec779b8eSAndroid Build Coastguard Worker     }
638*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(status);
639*ec779b8eSAndroid Build Coastguard Worker }
640*ec779b8eSAndroid Build Coastguard Worker 
stopOutput(int32_t portIdAidl)641*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::stopOutput(int32_t portIdAidl)
642*ec779b8eSAndroid Build Coastguard Worker {
643*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
644*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
645*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
646*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
647*ec779b8eSAndroid Build Coastguard Worker     }
648*ec779b8eSAndroid Build Coastguard Worker     ALOGV("stopOutput()");
649*ec779b8eSAndroid Build Coastguard Worker     mOutputCommandThread->stopOutputCommand(portId);
650*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
651*ec779b8eSAndroid Build Coastguard Worker }
652*ec779b8eSAndroid Build Coastguard Worker 
doStopOutput(audio_port_handle_t portId)653*ec779b8eSAndroid Build Coastguard Worker status_t  AudioPolicyService::doStopOutput(audio_port_handle_t portId)
654*ec779b8eSAndroid Build Coastguard Worker {
655*ec779b8eSAndroid Build Coastguard Worker     ALOGV("doStopOutput");
656*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPlaybackClient> client;
657*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPolicyEffects>audioPolicyEffects;
658*ec779b8eSAndroid Build Coastguard Worker 
659*ec779b8eSAndroid Build Coastguard Worker     getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
660*ec779b8eSAndroid Build Coastguard Worker 
661*ec779b8eSAndroid Build Coastguard Worker     if (audioPolicyEffects != 0) {
662*ec779b8eSAndroid Build Coastguard Worker         // release audio processors from the stream
663*ec779b8eSAndroid Build Coastguard Worker         status_t status = audioPolicyEffects->releaseOutputSessionEffects(
664*ec779b8eSAndroid Build Coastguard Worker             client->io, client->stream, client->session);
665*ec779b8eSAndroid Build Coastguard Worker         if (status != NO_ERROR && status != ALREADY_EXISTS) {
666*ec779b8eSAndroid Build Coastguard Worker             ALOGW("Failed to release effects on session %d", client->session);
667*ec779b8eSAndroid Build Coastguard Worker         }
668*ec779b8eSAndroid Build Coastguard Worker     }
669*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
670*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
671*ec779b8eSAndroid Build Coastguard Worker     status_t status = mAudioPolicyManager->stopOutput(portId);
672*ec779b8eSAndroid Build Coastguard Worker     if (status == NO_ERROR) {
673*ec779b8eSAndroid Build Coastguard Worker         client->active = false;
674*ec779b8eSAndroid Build Coastguard Worker         onUpdateActiveSpatializerTracks_l();
675*ec779b8eSAndroid Build Coastguard Worker         mUsecaseValidator->stopClient(client->io, client->portId);
676*ec779b8eSAndroid Build Coastguard Worker     }
677*ec779b8eSAndroid Build Coastguard Worker     return status;
678*ec779b8eSAndroid Build Coastguard Worker }
679*ec779b8eSAndroid Build Coastguard Worker 
releaseOutput(int32_t portIdAidl)680*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::releaseOutput(int32_t portIdAidl)
681*ec779b8eSAndroid Build Coastguard Worker {
682*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
683*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
684*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
685*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
686*ec779b8eSAndroid Build Coastguard Worker     }
687*ec779b8eSAndroid Build Coastguard Worker     ALOGV("releaseOutput()");
688*ec779b8eSAndroid Build Coastguard Worker     mOutputCommandThread->releaseOutputCommand(portId);
689*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
690*ec779b8eSAndroid Build Coastguard Worker }
691*ec779b8eSAndroid Build Coastguard Worker 
doReleaseOutput(audio_port_handle_t portId)692*ec779b8eSAndroid Build Coastguard Worker void AudioPolicyService::doReleaseOutput(audio_port_handle_t portId)
693*ec779b8eSAndroid Build Coastguard Worker {
694*ec779b8eSAndroid Build Coastguard Worker     ALOGV("doReleaseOutput from tid %d", gettid());
695*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPlaybackClient> client;
696*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPolicyEffects> audioPolicyEffects;
697*ec779b8eSAndroid Build Coastguard Worker 
698*ec779b8eSAndroid Build Coastguard Worker     getPlaybackClientAndEffects(portId, client, audioPolicyEffects, __func__);
699*ec779b8eSAndroid Build Coastguard Worker 
700*ec779b8eSAndroid Build Coastguard Worker     if (audioPolicyEffects != 0 && client->active) {
701*ec779b8eSAndroid Build Coastguard Worker         // clean up effects if output was not stopped before being released
702*ec779b8eSAndroid Build Coastguard Worker         audioPolicyEffects->releaseOutputSessionEffects(
703*ec779b8eSAndroid Build Coastguard Worker             client->io, client->stream, client->session);
704*ec779b8eSAndroid Build Coastguard Worker     }
705*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
706*ec779b8eSAndroid Build Coastguard Worker     if (client != nullptr && client->active) {
707*ec779b8eSAndroid Build Coastguard Worker         onUpdateActiveSpatializerTracks_l();
708*ec779b8eSAndroid Build Coastguard Worker     }
709*ec779b8eSAndroid Build Coastguard Worker     mAudioPlaybackClients.removeItem(portId);
710*ec779b8eSAndroid Build Coastguard Worker     // called from internal thread: no need to clear caller identity
711*ec779b8eSAndroid Build Coastguard Worker     mAudioPolicyManager->releaseOutput(portId);
712*ec779b8eSAndroid Build Coastguard Worker }
713*ec779b8eSAndroid Build Coastguard Worker 
714*ec779b8eSAndroid Build Coastguard Worker // These are sources for which CAPTURE_AUDIO_OUTPUT granted access
715*ec779b8eSAndroid Build Coastguard Worker // for legacy reasons, before more specific permissions were deployed.
716*ec779b8eSAndroid Build Coastguard Worker // TODO: remove this access
isLegacyOutputSource(AudioSource source)717*ec779b8eSAndroid Build Coastguard Worker static bool isLegacyOutputSource(AudioSource source) {
718*ec779b8eSAndroid Build Coastguard Worker     switch (source) {
719*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_CALL:
720*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_DOWNLINK:
721*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_UPLINK:
722*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::FM_TUNER:
723*ec779b8eSAndroid Build Coastguard Worker             return true;
724*ec779b8eSAndroid Build Coastguard Worker         default:
725*ec779b8eSAndroid Build Coastguard Worker             return false;
726*ec779b8eSAndroid Build Coastguard Worker     }
727*ec779b8eSAndroid Build Coastguard Worker }
728*ec779b8eSAndroid Build Coastguard Worker 
checkPermissionForInput(const AttributionSourceState & attrSource,const PermissionReqs & req)729*ec779b8eSAndroid Build Coastguard Worker error::BinderResult<bool> AudioPolicyService::AudioPolicyClient::checkPermissionForInput(
730*ec779b8eSAndroid Build Coastguard Worker         const AttributionSourceState& attrSource, const PermissionReqs& req) {
731*ec779b8eSAndroid Build Coastguard Worker 
732*ec779b8eSAndroid Build Coastguard Worker     error::BinderResult<bool> permRes = true;
733*ec779b8eSAndroid Build Coastguard Worker     const auto check_perm = [&](PermissionEnum perm, uid_t uid) {
734*ec779b8eSAndroid Build Coastguard Worker         return mAudioPolicyService->getPermissionProvider().checkPermission(perm, uid);
735*ec779b8eSAndroid Build Coastguard Worker     };
736*ec779b8eSAndroid Build Coastguard Worker     switch (req.source) {
737*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_UPLINK:
738*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_DOWNLINK:
739*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_CALL:
740*ec779b8eSAndroid Build Coastguard Worker             permRes = audioserver_permissions()
741*ec779b8eSAndroid Build Coastguard Worker                               ? check_perm(CALL_AUDIO_INTERCEPTION, attrSource.uid)
742*ec779b8eSAndroid Build Coastguard Worker                               : callAudioInterceptionAllowed(attrSource);
743*ec779b8eSAndroid Build Coastguard Worker             break;
744*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::ECHO_REFERENCE:
745*ec779b8eSAndroid Build Coastguard Worker             permRes = audioserver_permissions() ? check_perm(CAPTURE_AUDIO_OUTPUT, attrSource.uid)
746*ec779b8eSAndroid Build Coastguard Worker                                                 : captureAudioOutputAllowed(attrSource);
747*ec779b8eSAndroid Build Coastguard Worker             break;
748*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::FM_TUNER:
749*ec779b8eSAndroid Build Coastguard Worker             permRes = audioserver_permissions()
750*ec779b8eSAndroid Build Coastguard Worker                               ? check_perm(CAPTURE_TUNER_AUDIO_INPUT, attrSource.uid)
751*ec779b8eSAndroid Build Coastguard Worker                               : captureTunerAudioInputAllowed(attrSource);
752*ec779b8eSAndroid Build Coastguard Worker             break;
753*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::HOTWORD:
754*ec779b8eSAndroid Build Coastguard Worker             permRes = audioserver_permissions() ? check_perm(CAPTURE_AUDIO_HOTWORD, attrSource.uid)
755*ec779b8eSAndroid Build Coastguard Worker                                                 : captureHotwordAllowed(attrSource);
756*ec779b8eSAndroid Build Coastguard Worker             break;
757*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::ULTRASOUND:
758*ec779b8eSAndroid Build Coastguard Worker             permRes = audioserver_permissions() ? check_perm(ACCESS_ULTRASOUND, attrSource.uid)
759*ec779b8eSAndroid Build Coastguard Worker                                                 : accessUltrasoundAllowed(attrSource);
760*ec779b8eSAndroid Build Coastguard Worker             break;
761*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::SYS_RESERVED_INVALID:
762*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::DEFAULT:
763*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::MIC:
764*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::CAMCORDER:
765*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_RECOGNITION:
766*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_COMMUNICATION:
767*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::UNPROCESSED:
768*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::VOICE_PERFORMANCE:
769*ec779b8eSAndroid Build Coastguard Worker             // No additional check intended
770*ec779b8eSAndroid Build Coastguard Worker         case AudioSource::REMOTE_SUBMIX:
771*ec779b8eSAndroid Build Coastguard Worker             // special-case checked based on mix type below
772*ec779b8eSAndroid Build Coastguard Worker             break;
773*ec779b8eSAndroid Build Coastguard Worker     }
774*ec779b8eSAndroid Build Coastguard Worker 
775*ec779b8eSAndroid Build Coastguard Worker     if (!permRes.has_value()) return permRes;
776*ec779b8eSAndroid Build Coastguard Worker     if (!permRes.value()) {
777*ec779b8eSAndroid Build Coastguard Worker         if (isLegacyOutputSource(req.source)) {
778*ec779b8eSAndroid Build Coastguard Worker             permRes = audioserver_permissions() ? check_perm(CAPTURE_AUDIO_OUTPUT, attrSource.uid)
779*ec779b8eSAndroid Build Coastguard Worker                                                 : captureAudioOutputAllowed(attrSource);
780*ec779b8eSAndroid Build Coastguard Worker             PROPAGATE_FALSEY(permRes);
781*ec779b8eSAndroid Build Coastguard Worker         } else {
782*ec779b8eSAndroid Build Coastguard Worker             return false;
783*ec779b8eSAndroid Build Coastguard Worker         }
784*ec779b8eSAndroid Build Coastguard Worker     }
785*ec779b8eSAndroid Build Coastguard Worker 
786*ec779b8eSAndroid Build Coastguard Worker     if (req.isHotword) {
787*ec779b8eSAndroid Build Coastguard Worker         permRes = audioserver_permissions() ? check_perm(CAPTURE_AUDIO_HOTWORD, attrSource.uid)
788*ec779b8eSAndroid Build Coastguard Worker                                             : captureHotwordAllowed(attrSource);
789*ec779b8eSAndroid Build Coastguard Worker         PROPAGATE_FALSEY(permRes);
790*ec779b8eSAndroid Build Coastguard Worker     }
791*ec779b8eSAndroid Build Coastguard Worker 
792*ec779b8eSAndroid Build Coastguard Worker     // TODO evaluate whether we should be checking call redirection like this
793*ec779b8eSAndroid Build Coastguard Worker     bool isAllowedDueToCallPerm = false;
794*ec779b8eSAndroid Build Coastguard Worker     if (req.isCallRedir) {
795*ec779b8eSAndroid Build Coastguard Worker         const auto checkCall = audioserver_permissions()
796*ec779b8eSAndroid Build Coastguard Worker                                          ? check_perm(CALL_AUDIO_INTERCEPTION, attrSource.uid)
797*ec779b8eSAndroid Build Coastguard Worker                                          : callAudioInterceptionAllowed(attrSource);
798*ec779b8eSAndroid Build Coastguard Worker         isAllowedDueToCallPerm = VALUE_OR_RETURN(checkCall);
799*ec779b8eSAndroid Build Coastguard Worker     }
800*ec779b8eSAndroid Build Coastguard Worker 
801*ec779b8eSAndroid Build Coastguard Worker     switch (req.mixType) {
802*ec779b8eSAndroid Build Coastguard Worker         case MixType::NONE:
803*ec779b8eSAndroid Build Coastguard Worker             break;
804*ec779b8eSAndroid Build Coastguard Worker         case MixType::PUBLIC_CAPTURE_PLAYBACK:
805*ec779b8eSAndroid Build Coastguard Worker             // this use case has been validated in audio service with a MediaProjection token,
806*ec779b8eSAndroid Build Coastguard Worker             // and doesn't rely on regular permissions
807*ec779b8eSAndroid Build Coastguard Worker             // TODO (b/378778313)
808*ec779b8eSAndroid Build Coastguard Worker             break;
809*ec779b8eSAndroid Build Coastguard Worker         case MixType::TELEPHONY_RX_CAPTURE:
810*ec779b8eSAndroid Build Coastguard Worker             if (isAllowedDueToCallPerm) break;
811*ec779b8eSAndroid Build Coastguard Worker             // FIXME: use the same permission as for remote submix for now.
812*ec779b8eSAndroid Build Coastguard Worker             FALLTHROUGH_INTENDED;
813*ec779b8eSAndroid Build Coastguard Worker         case MixType::CAPTURE:
814*ec779b8eSAndroid Build Coastguard Worker             permRes = audioserver_permissions() ? check_perm(CAPTURE_AUDIO_OUTPUT, attrSource.uid)
815*ec779b8eSAndroid Build Coastguard Worker                                                 : captureAudioOutputAllowed(attrSource);
816*ec779b8eSAndroid Build Coastguard Worker             break;
817*ec779b8eSAndroid Build Coastguard Worker         case MixType::EXT_POLICY_REROUTE:
818*ec779b8eSAndroid Build Coastguard Worker             // TODO intended?
819*ec779b8eSAndroid Build Coastguard Worker             if (isAllowedDueToCallPerm) break;
820*ec779b8eSAndroid Build Coastguard Worker             permRes = audioserver_permissions() ? check_perm(MODIFY_AUDIO_ROUTING, attrSource.uid)
821*ec779b8eSAndroid Build Coastguard Worker                                                 : modifyAudioRoutingAllowed(attrSource);
822*ec779b8eSAndroid Build Coastguard Worker             break;
823*ec779b8eSAndroid Build Coastguard Worker     }
824*ec779b8eSAndroid Build Coastguard Worker 
825*ec779b8eSAndroid Build Coastguard Worker     PROPAGATE_FALSEY(permRes);
826*ec779b8eSAndroid Build Coastguard Worker 
827*ec779b8eSAndroid Build Coastguard Worker     // All sources which aren't output capture
828*ec779b8eSAndroid Build Coastguard Worker     // AND capture from vdi policy mix (the injected audio is mic data from another device)
829*ec779b8eSAndroid Build Coastguard Worker     // REQUIRE RECORD perms
830*ec779b8eSAndroid Build Coastguard Worker     const auto legacySource = aidl2legacy_AudioSource_audio_source_t(req.source).value();
831*ec779b8eSAndroid Build Coastguard Worker     if (req.virtualDeviceId != kDefaultVirtualDeviceId) {
832*ec779b8eSAndroid Build Coastguard Worker         // TODO assert that this is always a recordOpSource
833*ec779b8eSAndroid Build Coastguard Worker         // TODO upcall solution
834*ec779b8eSAndroid Build Coastguard Worker         return recordingAllowed(attrSource, req.virtualDeviceId, legacySource);
835*ec779b8eSAndroid Build Coastguard Worker     }
836*ec779b8eSAndroid Build Coastguard Worker 
837*ec779b8eSAndroid Build Coastguard Worker     if (isRecordOpRequired(legacySource)) {
838*ec779b8eSAndroid Build Coastguard Worker         permRes = audioserver_permissions() ? check_perm(RECORD_AUDIO, attrSource.uid)
839*ec779b8eSAndroid Build Coastguard Worker                                             : recordingAllowed(attrSource, legacySource);
840*ec779b8eSAndroid Build Coastguard Worker         PROPAGATE_FALSEY(permRes);
841*ec779b8eSAndroid Build Coastguard Worker     }
842*ec779b8eSAndroid Build Coastguard Worker     return true;
843*ec779b8eSAndroid Build Coastguard Worker }
844*ec779b8eSAndroid Build Coastguard Worker 
getInputForAttr(const media::audio::common::AudioAttributes & attrAidl,int32_t inputAidl,int32_t riidAidl,int32_t sessionAidl,const AttributionSourceState & attributionSource,const AudioConfigBase & configAidl,int32_t flagsAidl,int32_t selectedDeviceIdAidl,media::GetInputForAttrResponse * _aidl_return)845*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttributes& attrAidl,
846*ec779b8eSAndroid Build Coastguard Worker                                            int32_t inputAidl,
847*ec779b8eSAndroid Build Coastguard Worker                                            int32_t riidAidl,
848*ec779b8eSAndroid Build Coastguard Worker                                            int32_t sessionAidl,
849*ec779b8eSAndroid Build Coastguard Worker                                            const AttributionSourceState& attributionSource,
850*ec779b8eSAndroid Build Coastguard Worker                                            const AudioConfigBase& configAidl,
851*ec779b8eSAndroid Build Coastguard Worker                                            int32_t flagsAidl,
852*ec779b8eSAndroid Build Coastguard Worker                                            int32_t selectedDeviceIdAidl,
853*ec779b8eSAndroid Build Coastguard Worker                                            media::GetInputForAttrResponse* _aidl_return) {
854*ec779b8eSAndroid Build Coastguard Worker     auto inputSource = attrAidl.source;
855*ec779b8eSAndroid Build Coastguard Worker     const audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
856*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
857*ec779b8eSAndroid Build Coastguard Worker     const audio_io_handle_t requestedInput = VALUE_OR_RETURN_BINDER_STATUS(
858*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_io_handle_t(inputAidl));
859*ec779b8eSAndroid Build Coastguard Worker     const audio_unique_id_t riid = VALUE_OR_RETURN_BINDER_STATUS(
860*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_unique_id_t(riidAidl));
861*ec779b8eSAndroid Build Coastguard Worker     const audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
862*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_session_t(sessionAidl));
863*ec779b8eSAndroid Build Coastguard Worker     const audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
864*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl, true /*isInput*/));
865*ec779b8eSAndroid Build Coastguard Worker     const audio_input_flags_t flags = VALUE_OR_RETURN_BINDER_STATUS(
866*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_input_flags_t_mask(flagsAidl));
867*ec779b8eSAndroid Build Coastguard Worker     const audio_port_handle_t requestedDeviceId = VALUE_OR_RETURN_BINDER_STATUS(
868*ec779b8eSAndroid Build Coastguard Worker                 aidl2legacy_int32_t_audio_port_handle_t(selectedDeviceIdAidl));
869*ec779b8eSAndroid Build Coastguard Worker 
870*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
871*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
872*ec779b8eSAndroid Build Coastguard Worker     }
873*ec779b8eSAndroid Build Coastguard Worker 
874*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(
875*ec779b8eSAndroid Build Coastguard Worker             binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950")));
876*ec779b8eSAndroid Build Coastguard Worker 
877*ec779b8eSAndroid Build Coastguard Worker     if (inputSource == AudioSource::SYS_RESERVED_INVALID ||
878*ec779b8eSAndroid Build Coastguard Worker             std::find(enum_range<AudioSource>().begin(), enum_range<AudioSource>().end(),
879*ec779b8eSAndroid Build Coastguard Worker                 inputSource) == enum_range<AudioSource>().end()) {
880*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(BAD_VALUE);
881*ec779b8eSAndroid Build Coastguard Worker     }
882*ec779b8eSAndroid Build Coastguard Worker 
883*ec779b8eSAndroid Build Coastguard Worker     if (inputSource == AudioSource::DEFAULT) {
884*ec779b8eSAndroid Build Coastguard Worker         inputSource = AudioSource::MIC;
885*ec779b8eSAndroid Build Coastguard Worker     }
886*ec779b8eSAndroid Build Coastguard Worker 
887*ec779b8eSAndroid Build Coastguard Worker     const bool isCallRedir = (attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0;
888*ec779b8eSAndroid Build Coastguard Worker 
889*ec779b8eSAndroid Build Coastguard Worker     //TODO(b/374751406): remove forcing canBypassConcurrentPolicy to canCaptureOutput
890*ec779b8eSAndroid Build Coastguard Worker     // once all system apps using CAPTURE_AUDIO_OUTPUT to capture during calls
891*ec779b8eSAndroid Build Coastguard Worker     // are updated to use the new CONCURRENT_AUDIO_RECORD_BYPASS permission.
892*ec779b8eSAndroid Build Coastguard Worker     bool canBypassConcurrentPolicy = audioserver_permissions()
893*ec779b8eSAndroid Build Coastguard Worker                                 ? CHECK_PERM(CAPTURE_AUDIO_OUTPUT, attributionSource.uid)
894*ec779b8eSAndroid Build Coastguard Worker                                 : captureAudioOutputAllowed(attributionSource);
895*ec779b8eSAndroid Build Coastguard Worker     if (concurrent_audio_record_bypass_permission()) {
896*ec779b8eSAndroid Build Coastguard Worker         canBypassConcurrentPolicy = audioserver_permissions() ?
897*ec779b8eSAndroid Build Coastguard Worker                             CHECK_PERM(BYPASS_CONCURRENT_RECORD_AUDIO_RESTRICTION,
898*ec779b8eSAndroid Build Coastguard Worker                                        attributionSource.uid)
899*ec779b8eSAndroid Build Coastguard Worker                             : bypassConcurrentPolicyAllowed(attributionSource);
900*ec779b8eSAndroid Build Coastguard Worker     }
901*ec779b8eSAndroid Build Coastguard Worker 
902*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPolicyEffects> audioPolicyEffects;
903*ec779b8eSAndroid Build Coastguard Worker     base::expected<media::GetInputForAttrResponse, std::variant<binder::Status, AudioConfigBase>>
904*ec779b8eSAndroid Build Coastguard Worker             res;
905*ec779b8eSAndroid Build Coastguard Worker     {
906*ec779b8eSAndroid Build Coastguard Worker         audio_utils::lock_guard _l(mMutex);
907*ec779b8eSAndroid Build Coastguard Worker         AutoCallerClear acc;
908*ec779b8eSAndroid Build Coastguard Worker         // the audio_in_acoustics_t parameter is ignored by get_input()
909*ec779b8eSAndroid Build Coastguard Worker         res = mAudioPolicyManager->getInputForAttr(attr, requestedInput, requestedDeviceId,
910*ec779b8eSAndroid Build Coastguard Worker                                                    config, flags, riid, session,
911*ec779b8eSAndroid Build Coastguard Worker                                                    attributionSource);
912*ec779b8eSAndroid Build Coastguard Worker         if (!res.has_value()) {
913*ec779b8eSAndroid Build Coastguard Worker             if (res.error().index() == 1) {
914*ec779b8eSAndroid Build Coastguard Worker                 _aidl_return->config = std::get<1>(res.error());
915*ec779b8eSAndroid Build Coastguard Worker                 return Status::fromExceptionCode(EX_ILLEGAL_STATE);
916*ec779b8eSAndroid Build Coastguard Worker             } else {
917*ec779b8eSAndroid Build Coastguard Worker                 return std::get<0>(res.error());
918*ec779b8eSAndroid Build Coastguard Worker             }
919*ec779b8eSAndroid Build Coastguard Worker         }
920*ec779b8eSAndroid Build Coastguard Worker 
921*ec779b8eSAndroid Build Coastguard Worker         audioPolicyEffects = mAudioPolicyEffects;
922*ec779b8eSAndroid Build Coastguard Worker 
923*ec779b8eSAndroid Build Coastguard Worker         sp<AudioRecordClient> client = new AudioRecordClient(
924*ec779b8eSAndroid Build Coastguard Worker                 attr, res->input, session, res->portId, {res->selectedDeviceId}, attributionSource,
925*ec779b8eSAndroid Build Coastguard Worker                 res->virtualDeviceId, canBypassConcurrentPolicy, mOutputCommandThread);
926*ec779b8eSAndroid Build Coastguard Worker         mAudioRecordClients.add(res->portId, client);
927*ec779b8eSAndroid Build Coastguard Worker     }
928*ec779b8eSAndroid Build Coastguard Worker 
929*ec779b8eSAndroid Build Coastguard Worker     if (audioPolicyEffects != nullptr) {
930*ec779b8eSAndroid Build Coastguard Worker         // create audio pre processors according to input source
931*ec779b8eSAndroid Build Coastguard Worker         status_t status = audioPolicyEffects->addInputEffects(res->input,
932*ec779b8eSAndroid Build Coastguard Worker                 aidl2legacy_AudioSource_audio_source_t(inputSource).value(), session);
933*ec779b8eSAndroid Build Coastguard Worker         if (status != NO_ERROR && status != ALREADY_EXISTS) {
934*ec779b8eSAndroid Build Coastguard Worker             ALOGW("Failed to add effects on input %d", res->input);
935*ec779b8eSAndroid Build Coastguard Worker         }
936*ec779b8eSAndroid Build Coastguard Worker     }
937*ec779b8eSAndroid Build Coastguard Worker 
938*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = res.value();
939*ec779b8eSAndroid Build Coastguard Worker 
940*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
941*ec779b8eSAndroid Build Coastguard Worker }
942*ec779b8eSAndroid Build Coastguard Worker 
getDeviceTypeStrForPortId(audio_port_handle_t portId)943*ec779b8eSAndroid Build Coastguard Worker std::string AudioPolicyService::getDeviceTypeStrForPortId(audio_port_handle_t portId) {
944*ec779b8eSAndroid Build Coastguard Worker     struct audio_port_v7 port = {};
945*ec779b8eSAndroid Build Coastguard Worker     port.id = portId;
946*ec779b8eSAndroid Build Coastguard Worker     status_t status = mAudioPolicyManager->getAudioPort(&port);
947*ec779b8eSAndroid Build Coastguard Worker     if (status == NO_ERROR && port.type == AUDIO_PORT_TYPE_DEVICE) {
948*ec779b8eSAndroid Build Coastguard Worker         return toString(port.ext.device.type);
949*ec779b8eSAndroid Build Coastguard Worker     }
950*ec779b8eSAndroid Build Coastguard Worker     return {};
951*ec779b8eSAndroid Build Coastguard Worker }
952*ec779b8eSAndroid Build Coastguard Worker 
getDeviceTypeStrForPortIds(DeviceIdVector portIds)953*ec779b8eSAndroid Build Coastguard Worker std::string AudioPolicyService::getDeviceTypeStrForPortIds(DeviceIdVector portIds) {
954*ec779b8eSAndroid Build Coastguard Worker     std::string output = {};
955*ec779b8eSAndroid Build Coastguard Worker     for (auto it = portIds.begin(); it != portIds.end(); ++it) {
956*ec779b8eSAndroid Build Coastguard Worker         if (it != portIds.begin()) {
957*ec779b8eSAndroid Build Coastguard Worker             output += ", ";
958*ec779b8eSAndroid Build Coastguard Worker         }
959*ec779b8eSAndroid Build Coastguard Worker         output += getDeviceTypeStrForPortId(*it);
960*ec779b8eSAndroid Build Coastguard Worker     }
961*ec779b8eSAndroid Build Coastguard Worker     return output;
962*ec779b8eSAndroid Build Coastguard Worker }
963*ec779b8eSAndroid Build Coastguard Worker 
startInput(int32_t portIdAidl)964*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::startInput(int32_t portIdAidl)
965*ec779b8eSAndroid Build Coastguard Worker {
966*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
967*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
968*ec779b8eSAndroid Build Coastguard Worker 
969*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
970*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
971*ec779b8eSAndroid Build Coastguard Worker     }
972*ec779b8eSAndroid Build Coastguard Worker     sp<AudioRecordClient> client;
973*ec779b8eSAndroid Build Coastguard Worker     {
974*ec779b8eSAndroid Build Coastguard Worker         audio_utils::lock_guard _l(mMutex);
975*ec779b8eSAndroid Build Coastguard Worker 
976*ec779b8eSAndroid Build Coastguard Worker         ssize_t index = mAudioRecordClients.indexOfKey(portId);
977*ec779b8eSAndroid Build Coastguard Worker         if (index < 0) {
978*ec779b8eSAndroid Build Coastguard Worker             return binderStatusFromStatusT(INVALID_OPERATION);
979*ec779b8eSAndroid Build Coastguard Worker         }
980*ec779b8eSAndroid Build Coastguard Worker         client = mAudioRecordClients.valueAt(index);
981*ec779b8eSAndroid Build Coastguard Worker     }
982*ec779b8eSAndroid Build Coastguard Worker 
983*ec779b8eSAndroid Build Coastguard Worker     std::stringstream msg;
984*ec779b8eSAndroid Build Coastguard Worker     msg << "Audio recording on session " << client->session;
985*ec779b8eSAndroid Build Coastguard Worker 
986*ec779b8eSAndroid Build Coastguard Worker     const auto permitted = startRecording(client->attributionSource, client->virtualDeviceId,
987*ec779b8eSAndroid Build Coastguard Worker             String16(msg.str().c_str()), client->attributes.source);
988*ec779b8eSAndroid Build Coastguard Worker 
989*ec779b8eSAndroid Build Coastguard Worker     // check calling permissions
990*ec779b8eSAndroid Build Coastguard Worker     if (permitted == PERMISSION_HARD_DENIED) {
991*ec779b8eSAndroid Build Coastguard Worker         ALOGE("%s permission denied: recording not allowed for attribution source %s",
992*ec779b8eSAndroid Build Coastguard Worker                 __func__, client->attributionSource.toString().c_str());
993*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
994*ec779b8eSAndroid Build Coastguard Worker     }
995*ec779b8eSAndroid Build Coastguard Worker 
996*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
997*ec779b8eSAndroid Build Coastguard Worker 
998*ec779b8eSAndroid Build Coastguard Worker     ALOGW_IF(client->silenced, "startInput on silenced input for port %d, uid %d. Unsilencing.",
999*ec779b8eSAndroid Build Coastguard Worker             portIdAidl,
1000*ec779b8eSAndroid Build Coastguard Worker             client->attributionSource.uid);
1001*ec779b8eSAndroid Build Coastguard Worker 
1002*ec779b8eSAndroid Build Coastguard Worker     if (client->active) {
1003*ec779b8eSAndroid Build Coastguard Worker         ALOGE("Client should never be active before startInput. Uid %d port %d",
1004*ec779b8eSAndroid Build Coastguard Worker                 client->attributionSource.uid, portId);
1005*ec779b8eSAndroid Build Coastguard Worker         finishRecording(client->attributionSource, client->virtualDeviceId,
1006*ec779b8eSAndroid Build Coastguard Worker                         client->attributes.source);
1007*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(INVALID_OPERATION);
1008*ec779b8eSAndroid Build Coastguard Worker     }
1009*ec779b8eSAndroid Build Coastguard Worker 
1010*ec779b8eSAndroid Build Coastguard Worker     // Force the possibly silenced client to match the state on the appops side
1011*ec779b8eSAndroid Build Coastguard Worker     // following the call to startRecording (i.e. unsilenced iff call succeeded)
1012*ec779b8eSAndroid Build Coastguard Worker     // At this point in time, the client is inactive, so no calls to appops are
1013*ec779b8eSAndroid Build Coastguard Worker     // sent in setAppState_l. This ensures existing clients have the same
1014*ec779b8eSAndroid Build Coastguard Worker     // behavior as new clients.
1015*ec779b8eSAndroid Build Coastguard Worker     // TODO(b/282076713)
1016*ec779b8eSAndroid Build Coastguard Worker     if (permitted == PERMISSION_GRANTED) {
1017*ec779b8eSAndroid Build Coastguard Worker         setAppState_l(client, APP_STATE_TOP);
1018*ec779b8eSAndroid Build Coastguard Worker     } else {
1019*ec779b8eSAndroid Build Coastguard Worker         setAppState_l(client, APP_STATE_IDLE);
1020*ec779b8eSAndroid Build Coastguard Worker     }
1021*ec779b8eSAndroid Build Coastguard Worker 
1022*ec779b8eSAndroid Build Coastguard Worker     client->active = true;
1023*ec779b8eSAndroid Build Coastguard Worker     client->startTimeNs = systemTime();
1024*ec779b8eSAndroid Build Coastguard Worker     // This call updates the silenced state, and since we are active, appropriately notifies appops
1025*ec779b8eSAndroid Build Coastguard Worker     // if we silence the track.
1026*ec779b8eSAndroid Build Coastguard Worker     updateUidStates_l();
1027*ec779b8eSAndroid Build Coastguard Worker 
1028*ec779b8eSAndroid Build Coastguard Worker     status_t status;
1029*ec779b8eSAndroid Build Coastguard Worker     {
1030*ec779b8eSAndroid Build Coastguard Worker         AutoCallerClear acc;
1031*ec779b8eSAndroid Build Coastguard Worker         status = mAudioPolicyManager->startInput(portId);
1032*ec779b8eSAndroid Build Coastguard Worker 
1033*ec779b8eSAndroid Build Coastguard Worker     }
1034*ec779b8eSAndroid Build Coastguard Worker 
1035*ec779b8eSAndroid Build Coastguard Worker     // including successes gets very verbose
1036*ec779b8eSAndroid Build Coastguard Worker     // but once we cut over to statsd, log them all.
1037*ec779b8eSAndroid Build Coastguard Worker     if (status != NO_ERROR) {
1038*ec779b8eSAndroid Build Coastguard Worker 
1039*ec779b8eSAndroid Build Coastguard Worker         static constexpr char kAudioPolicy[] = "audiopolicy";
1040*ec779b8eSAndroid Build Coastguard Worker 
1041*ec779b8eSAndroid Build Coastguard Worker         static constexpr char kAudioPolicyStatus[] = "android.media.audiopolicy.status";
1042*ec779b8eSAndroid Build Coastguard Worker         static constexpr char kAudioPolicyRqstSrc[] = "android.media.audiopolicy.rqst.src";
1043*ec779b8eSAndroid Build Coastguard Worker         static constexpr char kAudioPolicyRqstPkg[] = "android.media.audiopolicy.rqst.pkg";
1044*ec779b8eSAndroid Build Coastguard Worker         static constexpr char kAudioPolicyRqstSession[] = "android.media.audiopolicy.rqst.session";
1045*ec779b8eSAndroid Build Coastguard Worker         static constexpr char kAudioPolicyRqstDevice[] =
1046*ec779b8eSAndroid Build Coastguard Worker                 "android.media.audiopolicy.rqst.device";
1047*ec779b8eSAndroid Build Coastguard Worker         static constexpr char kAudioPolicyActiveSrc[] = "android.media.audiopolicy.active.src";
1048*ec779b8eSAndroid Build Coastguard Worker         static constexpr char kAudioPolicyActivePkg[] = "android.media.audiopolicy.active.pkg";
1049*ec779b8eSAndroid Build Coastguard Worker         static constexpr char kAudioPolicyActiveSession[] =
1050*ec779b8eSAndroid Build Coastguard Worker                 "android.media.audiopolicy.active.session";
1051*ec779b8eSAndroid Build Coastguard Worker         static constexpr char kAudioPolicyActiveDevice[] =
1052*ec779b8eSAndroid Build Coastguard Worker                 "android.media.audiopolicy.active.device";
1053*ec779b8eSAndroid Build Coastguard Worker         static constexpr char kAudioPolicyActiveDevices[] =
1054*ec779b8eSAndroid Build Coastguard Worker                 "android.media.audiopolicy.active.devices";
1055*ec779b8eSAndroid Build Coastguard Worker 
1056*ec779b8eSAndroid Build Coastguard Worker         mediametrics::Item *item = mediametrics::Item::create(kAudioPolicy);
1057*ec779b8eSAndroid Build Coastguard Worker         if (item != NULL) {
1058*ec779b8eSAndroid Build Coastguard Worker 
1059*ec779b8eSAndroid Build Coastguard Worker             item->setInt32(kAudioPolicyStatus, status);
1060*ec779b8eSAndroid Build Coastguard Worker 
1061*ec779b8eSAndroid Build Coastguard Worker             item->setCString(kAudioPolicyRqstSrc,
1062*ec779b8eSAndroid Build Coastguard Worker                              toString(client->attributes.source).c_str());
1063*ec779b8eSAndroid Build Coastguard Worker             item->setInt32(kAudioPolicyRqstSession, client->session);
1064*ec779b8eSAndroid Build Coastguard Worker             if (client->attributionSource.packageName.has_value() &&
1065*ec779b8eSAndroid Build Coastguard Worker                 client->attributionSource.packageName.value().size() != 0) {
1066*ec779b8eSAndroid Build Coastguard Worker                 item->setCString(kAudioPolicyRqstPkg,
1067*ec779b8eSAndroid Build Coastguard Worker                     client->attributionSource.packageName.value().c_str());
1068*ec779b8eSAndroid Build Coastguard Worker             } else {
1069*ec779b8eSAndroid Build Coastguard Worker                 item->setCString(kAudioPolicyRqstPkg,
1070*ec779b8eSAndroid Build Coastguard Worker                     std::to_string(client->attributionSource.uid).c_str());
1071*ec779b8eSAndroid Build Coastguard Worker             }
1072*ec779b8eSAndroid Build Coastguard Worker             item->setCString(kAudioPolicyRqstDevice,
1073*ec779b8eSAndroid Build Coastguard Worker                     getDeviceTypeStrForPortId(getFirstDeviceId(client->deviceIds)).c_str());
1074*ec779b8eSAndroid Build Coastguard Worker 
1075*ec779b8eSAndroid Build Coastguard Worker             int count = mAudioRecordClients.size();
1076*ec779b8eSAndroid Build Coastguard Worker             for (int i = 0; i < count ; i++) {
1077*ec779b8eSAndroid Build Coastguard Worker                 if (portId == mAudioRecordClients.keyAt(i)) {
1078*ec779b8eSAndroid Build Coastguard Worker                     continue;
1079*ec779b8eSAndroid Build Coastguard Worker                 }
1080*ec779b8eSAndroid Build Coastguard Worker                 sp<AudioRecordClient> other = mAudioRecordClients.valueAt(i);
1081*ec779b8eSAndroid Build Coastguard Worker                 if (other->active) {
1082*ec779b8eSAndroid Build Coastguard Worker                     // keeps the last of the clients marked active
1083*ec779b8eSAndroid Build Coastguard Worker                     item->setCString(kAudioPolicyActiveSrc,
1084*ec779b8eSAndroid Build Coastguard Worker                                      toString(other->attributes.source).c_str());
1085*ec779b8eSAndroid Build Coastguard Worker                     item->setInt32(kAudioPolicyActiveSession, other->session);
1086*ec779b8eSAndroid Build Coastguard Worker                     if (other->attributionSource.packageName.has_value() &&
1087*ec779b8eSAndroid Build Coastguard Worker                         other->attributionSource.packageName.value().size() != 0) {
1088*ec779b8eSAndroid Build Coastguard Worker                         item->setCString(kAudioPolicyActivePkg,
1089*ec779b8eSAndroid Build Coastguard Worker                             other->attributionSource.packageName.value().c_str());
1090*ec779b8eSAndroid Build Coastguard Worker                     } else {
1091*ec779b8eSAndroid Build Coastguard Worker                         item->setCString(kAudioPolicyRqstPkg, std::to_string(
1092*ec779b8eSAndroid Build Coastguard Worker                             other->attributionSource.uid).c_str());
1093*ec779b8eSAndroid Build Coastguard Worker                     }
1094*ec779b8eSAndroid Build Coastguard Worker                     item->setCString(kAudioPolicyActiveDevice,
1095*ec779b8eSAndroid Build Coastguard Worker                             getDeviceTypeStrForPortId(getFirstDeviceId(other->deviceIds)).c_str());
1096*ec779b8eSAndroid Build Coastguard Worker                     item->setCString(kAudioPolicyActiveDevices,
1097*ec779b8eSAndroid Build Coastguard Worker                             getDeviceTypeStrForPortIds(other->deviceIds).c_str());
1098*ec779b8eSAndroid Build Coastguard Worker                 }
1099*ec779b8eSAndroid Build Coastguard Worker             }
1100*ec779b8eSAndroid Build Coastguard Worker             item->selfrecord();
1101*ec779b8eSAndroid Build Coastguard Worker             delete item;
1102*ec779b8eSAndroid Build Coastguard Worker             item = NULL;
1103*ec779b8eSAndroid Build Coastguard Worker         }
1104*ec779b8eSAndroid Build Coastguard Worker     }
1105*ec779b8eSAndroid Build Coastguard Worker 
1106*ec779b8eSAndroid Build Coastguard Worker     if (status != NO_ERROR) {
1107*ec779b8eSAndroid Build Coastguard Worker         client->active = false;
1108*ec779b8eSAndroid Build Coastguard Worker         client->startTimeNs = 0;
1109*ec779b8eSAndroid Build Coastguard Worker         updateUidStates_l();
1110*ec779b8eSAndroid Build Coastguard Worker         if (!client->silenced) {
1111*ec779b8eSAndroid Build Coastguard Worker             finishRecording(client->attributionSource, client->virtualDeviceId,
1112*ec779b8eSAndroid Build Coastguard Worker                     client->attributes.source);
1113*ec779b8eSAndroid Build Coastguard Worker         }
1114*ec779b8eSAndroid Build Coastguard Worker     }
1115*ec779b8eSAndroid Build Coastguard Worker 
1116*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(status);
1117*ec779b8eSAndroid Build Coastguard Worker }
1118*ec779b8eSAndroid Build Coastguard Worker 
stopInput(int32_t portIdAidl)1119*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::stopInput(int32_t portIdAidl)
1120*ec779b8eSAndroid Build Coastguard Worker {
1121*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
1122*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1123*ec779b8eSAndroid Build Coastguard Worker 
1124*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1125*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1126*ec779b8eSAndroid Build Coastguard Worker     }
1127*ec779b8eSAndroid Build Coastguard Worker 
1128*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1129*ec779b8eSAndroid Build Coastguard Worker 
1130*ec779b8eSAndroid Build Coastguard Worker     ssize_t index = mAudioRecordClients.indexOfKey(portId);
1131*ec779b8eSAndroid Build Coastguard Worker     if (index < 0) {
1132*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(INVALID_OPERATION);
1133*ec779b8eSAndroid Build Coastguard Worker     }
1134*ec779b8eSAndroid Build Coastguard Worker     sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
1135*ec779b8eSAndroid Build Coastguard Worker 
1136*ec779b8eSAndroid Build Coastguard Worker     client->active = false;
1137*ec779b8eSAndroid Build Coastguard Worker     client->startTimeNs = 0;
1138*ec779b8eSAndroid Build Coastguard Worker 
1139*ec779b8eSAndroid Build Coastguard Worker     updateUidStates_l();
1140*ec779b8eSAndroid Build Coastguard Worker 
1141*ec779b8eSAndroid Build Coastguard Worker     // finish the recording app op
1142*ec779b8eSAndroid Build Coastguard Worker     if (!client->silenced) {
1143*ec779b8eSAndroid Build Coastguard Worker         finishRecording(client->attributionSource, client->virtualDeviceId,
1144*ec779b8eSAndroid Build Coastguard Worker                 client->attributes.source);
1145*ec779b8eSAndroid Build Coastguard Worker     }
1146*ec779b8eSAndroid Build Coastguard Worker 
1147*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1148*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->stopInput(portId));
1149*ec779b8eSAndroid Build Coastguard Worker }
1150*ec779b8eSAndroid Build Coastguard Worker 
releaseInput(int32_t portIdAidl)1151*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::releaseInput(int32_t portIdAidl)
1152*ec779b8eSAndroid Build Coastguard Worker {
1153*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
1154*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
1155*ec779b8eSAndroid Build Coastguard Worker 
1156*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1157*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1158*ec779b8eSAndroid Build Coastguard Worker     }
1159*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPolicyEffects>audioPolicyEffects;
1160*ec779b8eSAndroid Build Coastguard Worker     sp<AudioRecordClient> client;
1161*ec779b8eSAndroid Build Coastguard Worker     {
1162*ec779b8eSAndroid Build Coastguard Worker         audio_utils::lock_guard _l(mMutex);
1163*ec779b8eSAndroid Build Coastguard Worker         audioPolicyEffects = mAudioPolicyEffects;
1164*ec779b8eSAndroid Build Coastguard Worker         ssize_t index = mAudioRecordClients.indexOfKey(portId);
1165*ec779b8eSAndroid Build Coastguard Worker         if (index < 0) {
1166*ec779b8eSAndroid Build Coastguard Worker             return Status::ok();
1167*ec779b8eSAndroid Build Coastguard Worker         }
1168*ec779b8eSAndroid Build Coastguard Worker         client = mAudioRecordClients.valueAt(index);
1169*ec779b8eSAndroid Build Coastguard Worker 
1170*ec779b8eSAndroid Build Coastguard Worker         if (client->active) {
1171*ec779b8eSAndroid Build Coastguard Worker             ALOGW("%s releasing active client portId %d", __FUNCTION__, portId);
1172*ec779b8eSAndroid Build Coastguard Worker             client->active = false;
1173*ec779b8eSAndroid Build Coastguard Worker             client->startTimeNs = 0;
1174*ec779b8eSAndroid Build Coastguard Worker             updateUidStates_l();
1175*ec779b8eSAndroid Build Coastguard Worker         }
1176*ec779b8eSAndroid Build Coastguard Worker 
1177*ec779b8eSAndroid Build Coastguard Worker         mAudioRecordClients.removeItem(portId);
1178*ec779b8eSAndroid Build Coastguard Worker     }
1179*ec779b8eSAndroid Build Coastguard Worker     if (client == 0) {
1180*ec779b8eSAndroid Build Coastguard Worker         return Status::ok();
1181*ec779b8eSAndroid Build Coastguard Worker     }
1182*ec779b8eSAndroid Build Coastguard Worker     if (audioPolicyEffects != 0) {
1183*ec779b8eSAndroid Build Coastguard Worker         // release audio processors from the input
1184*ec779b8eSAndroid Build Coastguard Worker         status_t status = audioPolicyEffects->releaseInputEffects(client->io, client->session);
1185*ec779b8eSAndroid Build Coastguard Worker         if(status != NO_ERROR) {
1186*ec779b8eSAndroid Build Coastguard Worker             ALOGW("Failed to release effects on input %d", client->io);
1187*ec779b8eSAndroid Build Coastguard Worker         }
1188*ec779b8eSAndroid Build Coastguard Worker     }
1189*ec779b8eSAndroid Build Coastguard Worker     {
1190*ec779b8eSAndroid Build Coastguard Worker         audio_utils::lock_guard _l(mMutex);
1191*ec779b8eSAndroid Build Coastguard Worker         AutoCallerClear acc;
1192*ec779b8eSAndroid Build Coastguard Worker         mAudioPolicyManager->releaseInput(portId);
1193*ec779b8eSAndroid Build Coastguard Worker     }
1194*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1195*ec779b8eSAndroid Build Coastguard Worker }
1196*ec779b8eSAndroid Build Coastguard Worker 
setDeviceAbsoluteVolumeEnabled(const AudioDevice & deviceAidl,bool enabled,AudioStreamType streamToDriveAbsAidl)1197*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setDeviceAbsoluteVolumeEnabled(const AudioDevice& deviceAidl,
1198*ec779b8eSAndroid Build Coastguard Worker                                                           bool enabled,
1199*ec779b8eSAndroid Build Coastguard Worker                                                           AudioStreamType streamToDriveAbsAidl) {
1200*ec779b8eSAndroid Build Coastguard Worker     ALOGI("%s: deviceAidl %s, enabled %d, streamToDriveAbsAidl %d", __func__,
1201*ec779b8eSAndroid Build Coastguard Worker           deviceAidl.toString().c_str(), enabled, streamToDriveAbsAidl);
1202*ec779b8eSAndroid Build Coastguard Worker 
1203*ec779b8eSAndroid Build Coastguard Worker     audio_stream_type_t streamToDriveAbs = AUDIO_STREAM_DEFAULT;
1204*ec779b8eSAndroid Build Coastguard Worker     if (enabled) {
1205*ec779b8eSAndroid Build Coastguard Worker         streamToDriveAbs = VALUE_OR_RETURN_BINDER_STATUS(
1206*ec779b8eSAndroid Build Coastguard Worker                 aidl2legacy_AudioStreamType_audio_stream_type_t(streamToDriveAbsAidl));
1207*ec779b8eSAndroid Build Coastguard Worker     }
1208*ec779b8eSAndroid Build Coastguard Worker 
1209*ec779b8eSAndroid Build Coastguard Worker     audio_devices_t deviceType;
1210*ec779b8eSAndroid Build Coastguard Worker     std::string address;
1211*ec779b8eSAndroid Build Coastguard Worker     RETURN_BINDER_STATUS_IF_ERROR(
1212*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioDevice_audio_device(deviceAidl, &deviceType, &address));
1213*ec779b8eSAndroid Build Coastguard Worker 
1214*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
1215*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1216*ec779b8eSAndroid Build Coastguard Worker     }
1217*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
1218*ec779b8eSAndroid Build Coastguard Worker             CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1219*ec779b8eSAndroid Build Coastguard Worker             : settingsAllowed())) {
1220*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
1221*ec779b8eSAndroid Build Coastguard Worker     }
1222*ec779b8eSAndroid Build Coastguard Worker 
1223*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1224*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1225*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
1226*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->setDeviceAbsoluteVolumeEnabled(deviceType, address.c_str(),
1227*ec779b8eSAndroid Build Coastguard Worker                                                                 enabled, streamToDriveAbs));
1228*ec779b8eSAndroid Build Coastguard Worker }
1229*ec779b8eSAndroid Build Coastguard Worker 
initStreamVolume(AudioStreamType streamAidl,int32_t indexMinAidl,int32_t indexMaxAidl)1230*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::initStreamVolume(AudioStreamType streamAidl,
1231*ec779b8eSAndroid Build Coastguard Worker                                             int32_t indexMinAidl,
1232*ec779b8eSAndroid Build Coastguard Worker                                             int32_t indexMaxAidl) {
1233*ec779b8eSAndroid Build Coastguard Worker     audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1234*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1235*ec779b8eSAndroid Build Coastguard Worker     int indexMin = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMinAidl));
1236*ec779b8eSAndroid Build Coastguard Worker     int indexMax = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexMaxAidl));
1237*ec779b8eSAndroid Build Coastguard Worker 
1238*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1239*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1240*ec779b8eSAndroid Build Coastguard Worker     }
1241*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
1242*ec779b8eSAndroid Build Coastguard Worker             CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1243*ec779b8eSAndroid Build Coastguard Worker             : settingsAllowed())) {
1244*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
1245*ec779b8eSAndroid Build Coastguard Worker     }
1246*ec779b8eSAndroid Build Coastguard Worker     if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
1247*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(BAD_VALUE);
1248*ec779b8eSAndroid Build Coastguard Worker     }
1249*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1250*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1251*ec779b8eSAndroid Build Coastguard Worker     mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
1252*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(NO_ERROR);
1253*ec779b8eSAndroid Build Coastguard Worker }
1254*ec779b8eSAndroid Build Coastguard Worker 
setStreamVolumeIndex(AudioStreamType streamAidl,const AudioDeviceDescription & deviceAidl,int32_t indexAidl,bool muted)1255*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setStreamVolumeIndex(AudioStreamType streamAidl,
1256*ec779b8eSAndroid Build Coastguard Worker                                                 const AudioDeviceDescription& deviceAidl,
1257*ec779b8eSAndroid Build Coastguard Worker                                                 int32_t indexAidl, bool muted) {
1258*ec779b8eSAndroid Build Coastguard Worker     audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1259*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1260*ec779b8eSAndroid Build Coastguard Worker     int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1261*ec779b8eSAndroid Build Coastguard Worker     audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
1262*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
1263*ec779b8eSAndroid Build Coastguard Worker 
1264*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1265*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1266*ec779b8eSAndroid Build Coastguard Worker     }
1267*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
1268*ec779b8eSAndroid Build Coastguard Worker             CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1269*ec779b8eSAndroid Build Coastguard Worker             : settingsAllowed())) {
1270*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
1271*ec779b8eSAndroid Build Coastguard Worker     }
1272*ec779b8eSAndroid Build Coastguard Worker     if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
1273*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(BAD_VALUE);
1274*ec779b8eSAndroid Build Coastguard Worker     }
1275*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1276*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1277*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->setStreamVolumeIndex(stream,
1278*ec779b8eSAndroid Build Coastguard Worker                                                                              index,
1279*ec779b8eSAndroid Build Coastguard Worker                                                                              muted,
1280*ec779b8eSAndroid Build Coastguard Worker                                                                              device));
1281*ec779b8eSAndroid Build Coastguard Worker }
1282*ec779b8eSAndroid Build Coastguard Worker 
getStreamVolumeIndex(AudioStreamType streamAidl,const AudioDeviceDescription & deviceAidl,int32_t * _aidl_return)1283*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getStreamVolumeIndex(AudioStreamType streamAidl,
1284*ec779b8eSAndroid Build Coastguard Worker                                                 const AudioDeviceDescription& deviceAidl,
1285*ec779b8eSAndroid Build Coastguard Worker                                                 int32_t* _aidl_return) {
1286*ec779b8eSAndroid Build Coastguard Worker     audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1287*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1288*ec779b8eSAndroid Build Coastguard Worker     audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
1289*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
1290*ec779b8eSAndroid Build Coastguard Worker     int index;
1291*ec779b8eSAndroid Build Coastguard Worker 
1292*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1293*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1294*ec779b8eSAndroid Build Coastguard Worker     }
1295*ec779b8eSAndroid Build Coastguard Worker     if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
1296*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(BAD_VALUE);
1297*ec779b8eSAndroid Build Coastguard Worker     }
1298*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1299*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1300*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1301*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getStreamVolumeIndex(stream, &index, device)));
1302*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1303*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1304*ec779b8eSAndroid Build Coastguard Worker }
1305*ec779b8eSAndroid Build Coastguard Worker 
setVolumeIndexForAttributes(const media::audio::common::AudioAttributes & attrAidl,const AudioDeviceDescription & deviceAidl,int32_t indexAidl,bool muted)1306*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setVolumeIndexForAttributes(
1307*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioAttributes& attrAidl,
1308*ec779b8eSAndroid Build Coastguard Worker         const AudioDeviceDescription& deviceAidl, int32_t indexAidl, bool muted) {
1309*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1310*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
1311*ec779b8eSAndroid Build Coastguard Worker     int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
1312*ec779b8eSAndroid Build Coastguard Worker     audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
1313*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
1314*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1315*ec779b8eSAndroid Build Coastguard Worker             AudioValidator::validateAudioAttributes(attributes, "169572641")));
1316*ec779b8eSAndroid Build Coastguard Worker 
1317*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1318*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1319*ec779b8eSAndroid Build Coastguard Worker     }
1320*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
1321*ec779b8eSAndroid Build Coastguard Worker             CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
1322*ec779b8eSAndroid Build Coastguard Worker             : settingsAllowed())) {
1323*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
1324*ec779b8eSAndroid Build Coastguard Worker     }
1325*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1326*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1327*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
1328*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->setVolumeIndexForAttributes(attributes, index, muted, device));
1329*ec779b8eSAndroid Build Coastguard Worker }
1330*ec779b8eSAndroid Build Coastguard Worker 
getVolumeIndexForAttributes(const media::audio::common::AudioAttributes & attrAidl,const AudioDeviceDescription & deviceAidl,int32_t * _aidl_return)1331*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getVolumeIndexForAttributes(
1332*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioAttributes& attrAidl,
1333*ec779b8eSAndroid Build Coastguard Worker         const AudioDeviceDescription& deviceAidl, int32_t* _aidl_return) {
1334*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1335*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
1336*ec779b8eSAndroid Build Coastguard Worker     audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
1337*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
1338*ec779b8eSAndroid Build Coastguard Worker     int index;
1339*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1340*ec779b8eSAndroid Build Coastguard Worker             AudioValidator::validateAudioAttributes(attributes, "169572641")));
1341*ec779b8eSAndroid Build Coastguard Worker 
1342*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1343*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1344*ec779b8eSAndroid Build Coastguard Worker     }
1345*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1346*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1347*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1348*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getVolumeIndexForAttributes(attributes, index, device)));
1349*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1350*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1351*ec779b8eSAndroid Build Coastguard Worker }
1352*ec779b8eSAndroid Build Coastguard Worker 
getMinVolumeIndexForAttributes(const media::audio::common::AudioAttributes & attrAidl,int32_t * _aidl_return)1353*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getMinVolumeIndexForAttributes(
1354*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioAttributes& attrAidl, int32_t* _aidl_return) {
1355*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1356*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
1357*ec779b8eSAndroid Build Coastguard Worker     int index;
1358*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1359*ec779b8eSAndroid Build Coastguard Worker             AudioValidator::validateAudioAttributes(attributes, "169572641")));
1360*ec779b8eSAndroid Build Coastguard Worker 
1361*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1362*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1363*ec779b8eSAndroid Build Coastguard Worker     }
1364*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1365*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1366*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1367*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getMinVolumeIndexForAttributes(attributes, index)));
1368*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1369*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1370*ec779b8eSAndroid Build Coastguard Worker }
1371*ec779b8eSAndroid Build Coastguard Worker 
getMaxVolumeIndexForAttributes(const media::audio::common::AudioAttributes & attrAidl,int32_t * _aidl_return)1372*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getMaxVolumeIndexForAttributes(
1373*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioAttributes& attrAidl, int32_t* _aidl_return) {
1374*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1375*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
1376*ec779b8eSAndroid Build Coastguard Worker     int index;
1377*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1378*ec779b8eSAndroid Build Coastguard Worker             AudioValidator::validateAudioAttributes(attributes, "169572641")));
1379*ec779b8eSAndroid Build Coastguard Worker 
1380*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1381*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1382*ec779b8eSAndroid Build Coastguard Worker     }
1383*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1384*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1385*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1386*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getMaxVolumeIndexForAttributes(attributes, index)));
1387*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(index));
1388*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1389*ec779b8eSAndroid Build Coastguard Worker }
1390*ec779b8eSAndroid Build Coastguard Worker 
getStrategyForStream(AudioStreamType streamAidl,int32_t * _aidl_return)1391*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getStrategyForStream(AudioStreamType streamAidl,
1392*ec779b8eSAndroid Build Coastguard Worker                                                 int32_t* _aidl_return) {
1393*ec779b8eSAndroid Build Coastguard Worker     audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1394*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1395*ec779b8eSAndroid Build Coastguard Worker 
1396*ec779b8eSAndroid Build Coastguard Worker     if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
1397*ec779b8eSAndroid Build Coastguard Worker         *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1398*ec779b8eSAndroid Build Coastguard Worker                 convertReinterpret<int32_t>(PRODUCT_STRATEGY_NONE));
1399*ec779b8eSAndroid Build Coastguard Worker         return Status::ok();
1400*ec779b8eSAndroid Build Coastguard Worker     }
1401*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1402*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1403*ec779b8eSAndroid Build Coastguard Worker     }
1404*ec779b8eSAndroid Build Coastguard Worker 
1405*ec779b8eSAndroid Build Coastguard Worker     // DO NOT LOCK, may be called from AudioFlinger with lock held, reaching deadlock
1406*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1407*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1408*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_product_strategy_t_int32_t(
1409*ec779b8eSAndroid Build Coastguard Worker                     mAudioPolicyManager->getStrategyForStream(stream)));
1410*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1411*ec779b8eSAndroid Build Coastguard Worker }
1412*ec779b8eSAndroid Build Coastguard Worker 
getDevicesForAttributes(const media::audio::common::AudioAttributes & attrAidl,bool forVolume,std::vector<AudioDevice> * _aidl_return)1413*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getDevicesForAttributes(
1414*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioAttributes& attrAidl,
1415*ec779b8eSAndroid Build Coastguard Worker         bool forVolume,
1416*ec779b8eSAndroid Build Coastguard Worker         std::vector<AudioDevice>* _aidl_return)
1417*ec779b8eSAndroid Build Coastguard Worker {
1418*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
1419*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
1420*ec779b8eSAndroid Build Coastguard Worker     AudioDeviceTypeAddrVector devices;
1421*ec779b8eSAndroid Build Coastguard Worker 
1422*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1423*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1424*ec779b8eSAndroid Build Coastguard Worker     }
1425*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1426*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1427*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1428*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getDevicesForAttributes(aa, &devices, forVolume)));
1429*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1430*ec779b8eSAndroid Build Coastguard Worker             convertContainer<std::vector<AudioDevice>>(devices,
1431*ec779b8eSAndroid Build Coastguard Worker                                                        legacy2aidl_AudioDeviceTypeAddress));
1432*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1433*ec779b8eSAndroid Build Coastguard Worker }
1434*ec779b8eSAndroid Build Coastguard Worker 
getOutputForEffect(const media::EffectDescriptor & descAidl,int32_t * _aidl_return)1435*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getOutputForEffect(const media::EffectDescriptor& descAidl,
1436*ec779b8eSAndroid Build Coastguard Worker                                               int32_t* _aidl_return) {
1437*ec779b8eSAndroid Build Coastguard Worker     effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1438*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1439*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1440*ec779b8eSAndroid Build Coastguard Worker             AudioValidator::validateEffectDescriptor(desc, "73126106")));
1441*ec779b8eSAndroid Build Coastguard Worker 
1442*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1443*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1444*ec779b8eSAndroid Build Coastguard Worker     }
1445*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1446*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1447*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
1448*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_io_handle_t_int32_t(mAudioPolicyManager->getOutputForEffect(&desc)));
1449*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1450*ec779b8eSAndroid Build Coastguard Worker }
1451*ec779b8eSAndroid Build Coastguard Worker 
registerEffect(const media::EffectDescriptor & descAidl,int32_t ioAidl,int32_t strategyAidl,int32_t sessionAidl,int32_t idAidl)1452*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::registerEffect(const media::EffectDescriptor& descAidl, int32_t ioAidl,
1453*ec779b8eSAndroid Build Coastguard Worker                                           int32_t strategyAidl, int32_t sessionAidl,
1454*ec779b8eSAndroid Build Coastguard Worker                                           int32_t idAidl) {
1455*ec779b8eSAndroid Build Coastguard Worker     effect_descriptor_t desc = VALUE_OR_RETURN_BINDER_STATUS(
1456*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_EffectDescriptor_effect_descriptor_t(descAidl));
1457*ec779b8eSAndroid Build Coastguard Worker     audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1458*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1459*ec779b8eSAndroid Build Coastguard Worker     product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
1460*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_product_strategy_t(strategyAidl));
1461*ec779b8eSAndroid Build Coastguard Worker     audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
1462*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_session_t(sessionAidl));
1463*ec779b8eSAndroid Build Coastguard Worker     int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
1464*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1465*ec779b8eSAndroid Build Coastguard Worker             AudioValidator::validateEffectDescriptor(desc, "73126106")));
1466*ec779b8eSAndroid Build Coastguard Worker 
1467*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1468*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1469*ec779b8eSAndroid Build Coastguard Worker     }
1470*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1471*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1472*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
1473*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->registerEffect(&desc, io, strategy, session, id));
1474*ec779b8eSAndroid Build Coastguard Worker }
1475*ec779b8eSAndroid Build Coastguard Worker 
unregisterEffect(int32_t idAidl)1476*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::unregisterEffect(int32_t idAidl)
1477*ec779b8eSAndroid Build Coastguard Worker {
1478*ec779b8eSAndroid Build Coastguard Worker     int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
1479*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1480*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1481*ec779b8eSAndroid Build Coastguard Worker     }
1482*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1483*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1484*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->unregisterEffect(id));
1485*ec779b8eSAndroid Build Coastguard Worker }
1486*ec779b8eSAndroid Build Coastguard Worker 
setEffectEnabled(int32_t idAidl,bool enabled)1487*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setEffectEnabled(int32_t idAidl, bool enabled)
1488*ec779b8eSAndroid Build Coastguard Worker {
1489*ec779b8eSAndroid Build Coastguard Worker     int id = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(idAidl));
1490*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1491*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1492*ec779b8eSAndroid Build Coastguard Worker     }
1493*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1494*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1495*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->setEffectEnabled(id, enabled));
1496*ec779b8eSAndroid Build Coastguard Worker }
1497*ec779b8eSAndroid Build Coastguard Worker 
moveEffectsToIo(const std::vector<int32_t> & idsAidl,int32_t ioAidl)1498*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::moveEffectsToIo(const std::vector<int32_t>& idsAidl, int32_t ioAidl)
1499*ec779b8eSAndroid Build Coastguard Worker 
1500*ec779b8eSAndroid Build Coastguard Worker {
1501*ec779b8eSAndroid Build Coastguard Worker     const std::vector<int>& ids = VALUE_OR_RETURN_BINDER_STATUS(
1502*ec779b8eSAndroid Build Coastguard Worker             convertContainer<std::vector<int>>(idsAidl, convertReinterpret<int, int32_t>));
1503*ec779b8eSAndroid Build Coastguard Worker     audio_io_handle_t io = VALUE_OR_RETURN_BINDER_STATUS(
1504*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_io_handle_t(ioAidl));
1505*ec779b8eSAndroid Build Coastguard Worker     if (ids.size() > MAX_ITEMS_PER_LIST) {
1506*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(BAD_VALUE);
1507*ec779b8eSAndroid Build Coastguard Worker     }
1508*ec779b8eSAndroid Build Coastguard Worker 
1509*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1510*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1511*ec779b8eSAndroid Build Coastguard Worker     }
1512*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1513*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1514*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->moveEffectsToIo(ids, io));
1515*ec779b8eSAndroid Build Coastguard Worker }
1516*ec779b8eSAndroid Build Coastguard Worker 
isStreamActive(AudioStreamType streamAidl,int32_t inPastMsAidl,bool * _aidl_return)1517*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::isStreamActive(AudioStreamType streamAidl, int32_t inPastMsAidl,
1518*ec779b8eSAndroid Build Coastguard Worker                                           bool* _aidl_return) {
1519*ec779b8eSAndroid Build Coastguard Worker     audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1520*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1521*ec779b8eSAndroid Build Coastguard Worker     uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1522*ec779b8eSAndroid Build Coastguard Worker 
1523*ec779b8eSAndroid Build Coastguard Worker     if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
1524*ec779b8eSAndroid Build Coastguard Worker         *_aidl_return = false;
1525*ec779b8eSAndroid Build Coastguard Worker         return Status::ok();
1526*ec779b8eSAndroid Build Coastguard Worker     }
1527*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1528*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1529*ec779b8eSAndroid Build Coastguard Worker     }
1530*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1531*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1532*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = mAudioPolicyManager->isStreamActive(stream, inPastMs);
1533*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1534*ec779b8eSAndroid Build Coastguard Worker }
1535*ec779b8eSAndroid Build Coastguard Worker 
isStreamActiveRemotely(AudioStreamType streamAidl,int32_t inPastMsAidl,bool * _aidl_return)1536*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::isStreamActiveRemotely(AudioStreamType streamAidl,
1537*ec779b8eSAndroid Build Coastguard Worker                                                   int32_t inPastMsAidl,
1538*ec779b8eSAndroid Build Coastguard Worker                                                   bool* _aidl_return) {
1539*ec779b8eSAndroid Build Coastguard Worker     audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
1540*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
1541*ec779b8eSAndroid Build Coastguard Worker     uint32_t inPastMs = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(inPastMsAidl));
1542*ec779b8eSAndroid Build Coastguard Worker 
1543*ec779b8eSAndroid Build Coastguard Worker     if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
1544*ec779b8eSAndroid Build Coastguard Worker         *_aidl_return = false;
1545*ec779b8eSAndroid Build Coastguard Worker         return Status::ok();
1546*ec779b8eSAndroid Build Coastguard Worker     }
1547*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1548*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1549*ec779b8eSAndroid Build Coastguard Worker     }
1550*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1551*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1552*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = mAudioPolicyManager->isStreamActiveRemotely(stream, inPastMs);
1553*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1554*ec779b8eSAndroid Build Coastguard Worker }
1555*ec779b8eSAndroid Build Coastguard Worker 
isSourceActive(AudioSource sourceAidl,bool * _aidl_return)1556*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::isSourceActive(AudioSource sourceAidl, bool* _aidl_return) {
1557*ec779b8eSAndroid Build Coastguard Worker     audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
1558*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioSource_audio_source_t(sourceAidl));
1559*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1560*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1561*ec779b8eSAndroid Build Coastguard Worker     }
1562*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1563*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1564*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = mAudioPolicyManager->isSourceActive(source);
1565*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1566*ec779b8eSAndroid Build Coastguard Worker }
1567*ec779b8eSAndroid Build Coastguard Worker 
getAudioPolicyEffects(sp<AudioPolicyEffects> & audioPolicyEffects)1568*ec779b8eSAndroid Build Coastguard Worker status_t AudioPolicyService::getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects)
1569*ec779b8eSAndroid Build Coastguard Worker {
1570*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1571*ec779b8eSAndroid Build Coastguard Worker         return NO_INIT;
1572*ec779b8eSAndroid Build Coastguard Worker     }
1573*ec779b8eSAndroid Build Coastguard Worker     {
1574*ec779b8eSAndroid Build Coastguard Worker         audio_utils::lock_guard _l(mMutex);
1575*ec779b8eSAndroid Build Coastguard Worker         audioPolicyEffects = mAudioPolicyEffects;
1576*ec779b8eSAndroid Build Coastguard Worker     }
1577*ec779b8eSAndroid Build Coastguard Worker     if (audioPolicyEffects == 0) {
1578*ec779b8eSAndroid Build Coastguard Worker         return NO_INIT;
1579*ec779b8eSAndroid Build Coastguard Worker     }
1580*ec779b8eSAndroid Build Coastguard Worker 
1581*ec779b8eSAndroid Build Coastguard Worker     return OK;
1582*ec779b8eSAndroid Build Coastguard Worker }
1583*ec779b8eSAndroid Build Coastguard Worker 
queryDefaultPreProcessing(int32_t audioSessionAidl,Int * countAidl,std::vector<media::EffectDescriptor> * _aidl_return)1584*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::queryDefaultPreProcessing(
1585*ec779b8eSAndroid Build Coastguard Worker         int32_t audioSessionAidl,
1586*ec779b8eSAndroid Build Coastguard Worker         Int* countAidl,
1587*ec779b8eSAndroid Build Coastguard Worker         std::vector<media::EffectDescriptor>* _aidl_return) {
1588*ec779b8eSAndroid Build Coastguard Worker     audio_session_t audioSession = VALUE_OR_RETURN_BINDER_STATUS(
1589*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_session_t(audioSessionAidl));
1590*ec779b8eSAndroid Build Coastguard Worker     uint32_t count = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(countAidl->value));
1591*ec779b8eSAndroid Build Coastguard Worker     if (count > AudioEffect::kMaxPreProcessing) {
1592*ec779b8eSAndroid Build Coastguard Worker         count = AudioEffect::kMaxPreProcessing;
1593*ec779b8eSAndroid Build Coastguard Worker     }
1594*ec779b8eSAndroid Build Coastguard Worker     uint32_t countReq = count;
1595*ec779b8eSAndroid Build Coastguard Worker     std::unique_ptr<effect_descriptor_t[]> descriptors(new effect_descriptor_t[count]);
1596*ec779b8eSAndroid Build Coastguard Worker 
1597*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPolicyEffects> audioPolicyEffects;
1598*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
1599*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->queryDefaultInputEffects(
1600*ec779b8eSAndroid Build Coastguard Worker             (audio_session_t) audioSession, descriptors.get(), &count)));
1601*ec779b8eSAndroid Build Coastguard Worker     countReq = std::min(count, countReq);
1602*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1603*ec779b8eSAndroid Build Coastguard Worker             convertRange(descriptors.get(), descriptors.get() + countReq,
1604*ec779b8eSAndroid Build Coastguard Worker                          std::back_inserter(*_aidl_return),
1605*ec779b8eSAndroid Build Coastguard Worker                          legacy2aidl_effect_descriptor_t_EffectDescriptor)));
1606*ec779b8eSAndroid Build Coastguard Worker     countAidl->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(count));
1607*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1608*ec779b8eSAndroid Build Coastguard Worker }
1609*ec779b8eSAndroid Build Coastguard Worker 
addSourceDefaultEffect(const AudioUuid & typeAidl,const std::string & opPackageNameAidl,const AudioUuid & uuidAidl,int32_t priority,AudioSource sourceAidl,int32_t * _aidl_return)1610*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::addSourceDefaultEffect(const AudioUuid& typeAidl,
1611*ec779b8eSAndroid Build Coastguard Worker                                                   const std::string& opPackageNameAidl,
1612*ec779b8eSAndroid Build Coastguard Worker                                                   const AudioUuid& uuidAidl,
1613*ec779b8eSAndroid Build Coastguard Worker                                                   int32_t priority,
1614*ec779b8eSAndroid Build Coastguard Worker                                                   AudioSource sourceAidl,
1615*ec779b8eSAndroid Build Coastguard Worker                                                   int32_t* _aidl_return) {
1616*ec779b8eSAndroid Build Coastguard Worker     effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1617*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1618*ec779b8eSAndroid Build Coastguard Worker     String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1619*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_string_view_String16(opPackageNameAidl));
1620*ec779b8eSAndroid Build Coastguard Worker     effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1621*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1622*ec779b8eSAndroid Build Coastguard Worker     audio_source_t source = VALUE_OR_RETURN_BINDER_STATUS(
1623*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioSource_audio_source_t(sourceAidl));
1624*ec779b8eSAndroid Build Coastguard Worker     audio_unique_id_t id;
1625*ec779b8eSAndroid Build Coastguard Worker 
1626*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPolicyEffects>audioPolicyEffects;
1627*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
1628*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
1629*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1630*ec779b8eSAndroid Build Coastguard Worker                 : modifyDefaultAudioEffectsAllowed())) {
1631*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
1632*ec779b8eSAndroid Build Coastguard Worker     }
1633*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addSourceDefaultEffect(
1634*ec779b8eSAndroid Build Coastguard Worker             &type, opPackageName, &uuid, priority, source, &id)));
1635*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1636*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1637*ec779b8eSAndroid Build Coastguard Worker }
1638*ec779b8eSAndroid Build Coastguard Worker 
addStreamDefaultEffect(const AudioUuid & typeAidl,const std::string & opPackageNameAidl,const AudioUuid & uuidAidl,int32_t priority,AudioUsage usageAidl,int32_t * _aidl_return)1639*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::addStreamDefaultEffect(const AudioUuid& typeAidl,
1640*ec779b8eSAndroid Build Coastguard Worker                                                   const std::string& opPackageNameAidl,
1641*ec779b8eSAndroid Build Coastguard Worker                                                   const AudioUuid& uuidAidl,
1642*ec779b8eSAndroid Build Coastguard Worker                                                   int32_t priority, AudioUsage usageAidl,
1643*ec779b8eSAndroid Build Coastguard Worker                                                   int32_t* _aidl_return) {
1644*ec779b8eSAndroid Build Coastguard Worker     effect_uuid_t type = VALUE_OR_RETURN_BINDER_STATUS(
1645*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioUuid_audio_uuid_t(typeAidl));
1646*ec779b8eSAndroid Build Coastguard Worker     String16 opPackageName = VALUE_OR_RETURN_BINDER_STATUS(
1647*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_string_view_String16(opPackageNameAidl));
1648*ec779b8eSAndroid Build Coastguard Worker     effect_uuid_t uuid = VALUE_OR_RETURN_BINDER_STATUS(
1649*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioUuid_audio_uuid_t(uuidAidl));
1650*ec779b8eSAndroid Build Coastguard Worker     audio_usage_t usage = VALUE_OR_RETURN_BINDER_STATUS(
1651*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioUsage_audio_usage_t(usageAidl));
1652*ec779b8eSAndroid Build Coastguard Worker     audio_unique_id_t id;
1653*ec779b8eSAndroid Build Coastguard Worker 
1654*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPolicyEffects> audioPolicyEffects;
1655*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
1656*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
1657*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1658*ec779b8eSAndroid Build Coastguard Worker                 : modifyDefaultAudioEffectsAllowed())) {
1659*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
1660*ec779b8eSAndroid Build Coastguard Worker     }
1661*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addStreamDefaultEffect(
1662*ec779b8eSAndroid Build Coastguard Worker             &type, opPackageName, &uuid, priority, usage, &id)));
1663*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_unique_id_t_int32_t(id));
1664*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1665*ec779b8eSAndroid Build Coastguard Worker }
1666*ec779b8eSAndroid Build Coastguard Worker 
removeSourceDefaultEffect(int32_t idAidl)1667*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::removeSourceDefaultEffect(int32_t idAidl)
1668*ec779b8eSAndroid Build Coastguard Worker {
1669*ec779b8eSAndroid Build Coastguard Worker     audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1670*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_unique_id_t(idAidl));
1671*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPolicyEffects>audioPolicyEffects;
1672*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
1673*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
1674*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1675*ec779b8eSAndroid Build Coastguard Worker                 : modifyDefaultAudioEffectsAllowed())) {
1676*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
1677*ec779b8eSAndroid Build Coastguard Worker     }
1678*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(audioPolicyEffects->removeSourceDefaultEffect(id));
1679*ec779b8eSAndroid Build Coastguard Worker }
1680*ec779b8eSAndroid Build Coastguard Worker 
removeStreamDefaultEffect(int32_t idAidl)1681*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::removeStreamDefaultEffect(int32_t idAidl)
1682*ec779b8eSAndroid Build Coastguard Worker {
1683*ec779b8eSAndroid Build Coastguard Worker     audio_unique_id_t id = VALUE_OR_RETURN_BINDER_STATUS(
1684*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_unique_id_t(idAidl));
1685*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPolicyEffects>audioPolicyEffects;
1686*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects)));
1687*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
1688*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid())
1689*ec779b8eSAndroid Build Coastguard Worker                 : modifyDefaultAudioEffectsAllowed())) {
1690*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
1691*ec779b8eSAndroid Build Coastguard Worker     }
1692*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(audioPolicyEffects->removeStreamDefaultEffect(id));
1693*ec779b8eSAndroid Build Coastguard Worker }
1694*ec779b8eSAndroid Build Coastguard Worker 
setSupportedSystemUsages(const std::vector<AudioUsage> & systemUsagesAidl)1695*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setSupportedSystemUsages(
1696*ec779b8eSAndroid Build Coastguard Worker         const std::vector<AudioUsage>& systemUsagesAidl) {
1697*ec779b8eSAndroid Build Coastguard Worker     size_t size = systemUsagesAidl.size();
1698*ec779b8eSAndroid Build Coastguard Worker     if (size > MAX_ITEMS_PER_LIST) {
1699*ec779b8eSAndroid Build Coastguard Worker         size = MAX_ITEMS_PER_LIST;
1700*ec779b8eSAndroid Build Coastguard Worker     }
1701*ec779b8eSAndroid Build Coastguard Worker     std::vector<audio_usage_t> systemUsages;
1702*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1703*ec779b8eSAndroid Build Coastguard Worker             convertRange(systemUsagesAidl.begin(), systemUsagesAidl.begin() + size,
1704*ec779b8eSAndroid Build Coastguard Worker                          std::back_inserter(systemUsages), aidl2legacy_AudioUsage_audio_usage_t)));
1705*ec779b8eSAndroid Build Coastguard Worker 
1706*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1707*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
1708*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1709*ec779b8eSAndroid Build Coastguard Worker                 : modifyAudioRoutingAllowed())) {
1710*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
1711*ec779b8eSAndroid Build Coastguard Worker     }
1712*ec779b8eSAndroid Build Coastguard Worker 
1713*ec779b8eSAndroid Build Coastguard Worker     bool areAllSystemUsages = std::all_of(begin(systemUsages), end(systemUsages),
1714*ec779b8eSAndroid Build Coastguard Worker         [](audio_usage_t usage) { return isSystemUsage(usage); });
1715*ec779b8eSAndroid Build Coastguard Worker     if (!areAllSystemUsages) {
1716*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(BAD_VALUE);
1717*ec779b8eSAndroid Build Coastguard Worker     }
1718*ec779b8eSAndroid Build Coastguard Worker 
1719*ec779b8eSAndroid Build Coastguard Worker     mSupportedSystemUsages = systemUsages;
1720*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1721*ec779b8eSAndroid Build Coastguard Worker }
1722*ec779b8eSAndroid Build Coastguard Worker 
setAllowedCapturePolicy(int32_t uidAidl,int32_t capturePolicyAidl)1723*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setAllowedCapturePolicy(int32_t uidAidl, int32_t capturePolicyAidl) {
1724*ec779b8eSAndroid Build Coastguard Worker     uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
1725*ec779b8eSAndroid Build Coastguard Worker     audio_flags_mask_t capturePolicy = VALUE_OR_RETURN_BINDER_STATUS(
1726*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_flags_mask_t_mask(capturePolicyAidl));
1727*ec779b8eSAndroid Build Coastguard Worker 
1728*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1729*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1730*ec779b8eSAndroid Build Coastguard Worker         ALOGV("%s() mAudioPolicyManager == NULL", __func__);
1731*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1732*ec779b8eSAndroid Build Coastguard Worker     }
1733*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
1734*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->setAllowedCapturePolicy(uid, capturePolicy));
1735*ec779b8eSAndroid Build Coastguard Worker }
1736*ec779b8eSAndroid Build Coastguard Worker 
getOffloadSupport(const AudioOffloadInfo & infoAidl,media::AudioOffloadMode * _aidl_return)1737*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getOffloadSupport(const AudioOffloadInfo& infoAidl,
1738*ec779b8eSAndroid Build Coastguard Worker                                              media::AudioOffloadMode* _aidl_return) {
1739*ec779b8eSAndroid Build Coastguard Worker     audio_offload_info_t info = VALUE_OR_RETURN_BINDER_STATUS(
1740*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioOffloadInfo_audio_offload_info_t(infoAidl));
1741*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1742*ec779b8eSAndroid Build Coastguard Worker         ALOGV("mAudioPolicyManager == NULL");
1743*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(AUDIO_OFFLOAD_NOT_SUPPORTED);
1744*ec779b8eSAndroid Build Coastguard Worker     }
1745*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1746*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1747*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_offload_mode_t_AudioOffloadMode(
1748*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getOffloadSupport(info)));
1749*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1750*ec779b8eSAndroid Build Coastguard Worker }
1751*ec779b8eSAndroid Build Coastguard Worker 
isDirectOutputSupported(const AudioConfigBase & configAidl,const media::audio::common::AudioAttributes & attributesAidl,bool * _aidl_return)1752*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::isDirectOutputSupported(
1753*ec779b8eSAndroid Build Coastguard Worker         const AudioConfigBase& configAidl,
1754*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioAttributes& attributesAidl,
1755*ec779b8eSAndroid Build Coastguard Worker         bool* _aidl_return) {
1756*ec779b8eSAndroid Build Coastguard Worker     audio_config_base_t config = VALUE_OR_RETURN_BINDER_STATUS(
1757*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioConfigBase_audio_config_base_t(configAidl, false /*isInput*/));
1758*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
1759*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attributesAidl));
1760*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1761*ec779b8eSAndroid Build Coastguard Worker             AudioValidator::validateAudioAttributes(attributes, "169572641")));
1762*ec779b8eSAndroid Build Coastguard Worker 
1763*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1764*ec779b8eSAndroid Build Coastguard Worker         ALOGV("mAudioPolicyManager == NULL");
1765*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1766*ec779b8eSAndroid Build Coastguard Worker     }
1767*ec779b8eSAndroid Build Coastguard Worker 
1768*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(validateUsage(attributes));
1769*ec779b8eSAndroid Build Coastguard Worker 
1770*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1771*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = mAudioPolicyManager->isDirectOutputSupported(config, attributes);
1772*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1773*ec779b8eSAndroid Build Coastguard Worker }
1774*ec779b8eSAndroid Build Coastguard Worker 
1775*ec779b8eSAndroid Build Coastguard Worker template <typename Port>
anonymizePortBluetoothAddress(Port & port)1776*ec779b8eSAndroid Build Coastguard Worker void anonymizePortBluetoothAddress(Port& port) {
1777*ec779b8eSAndroid Build Coastguard Worker     if (port.type != AUDIO_PORT_TYPE_DEVICE) {
1778*ec779b8eSAndroid Build Coastguard Worker         return;
1779*ec779b8eSAndroid Build Coastguard Worker     }
1780*ec779b8eSAndroid Build Coastguard Worker     if (!(audio_is_a2dp_device(port.ext.device.type)
1781*ec779b8eSAndroid Build Coastguard Worker             || audio_is_ble_device(port.ext.device.type)
1782*ec779b8eSAndroid Build Coastguard Worker             || audio_is_bluetooth_sco_device(port.ext.device.type)
1783*ec779b8eSAndroid Build Coastguard Worker             || audio_is_hearing_aid_out_device(port.ext.device.type))) {
1784*ec779b8eSAndroid Build Coastguard Worker         return;
1785*ec779b8eSAndroid Build Coastguard Worker     }
1786*ec779b8eSAndroid Build Coastguard Worker     anonymizeBluetoothAddress(port.ext.device.address);
1787*ec779b8eSAndroid Build Coastguard Worker }
1788*ec779b8eSAndroid Build Coastguard Worker 
listAudioPorts(media::AudioPortRole roleAidl,media::AudioPortType typeAidl,Int * count,std::vector<media::AudioPortFw> * portsAidl,int32_t * _aidl_return)1789*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::listAudioPorts(media::AudioPortRole roleAidl,
1790*ec779b8eSAndroid Build Coastguard Worker                                           media::AudioPortType typeAidl, Int* count,
1791*ec779b8eSAndroid Build Coastguard Worker                                           std::vector<media::AudioPortFw>* portsAidl,
1792*ec779b8eSAndroid Build Coastguard Worker                                           int32_t* _aidl_return) {
1793*ec779b8eSAndroid Build Coastguard Worker     audio_port_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
1794*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioPortRole_audio_port_role_t(roleAidl));
1795*ec779b8eSAndroid Build Coastguard Worker     audio_port_type_t type = VALUE_OR_RETURN_BINDER_STATUS(
1796*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioPortType_audio_port_type_t(typeAidl));
1797*ec779b8eSAndroid Build Coastguard Worker     unsigned int num_ports = VALUE_OR_RETURN_BINDER_STATUS(
1798*ec779b8eSAndroid Build Coastguard Worker             convertIntegral<unsigned int>(count->value));
1799*ec779b8eSAndroid Build Coastguard Worker     if (num_ports > MAX_ITEMS_PER_LIST) {
1800*ec779b8eSAndroid Build Coastguard Worker         num_ports = MAX_ITEMS_PER_LIST;
1801*ec779b8eSAndroid Build Coastguard Worker     }
1802*ec779b8eSAndroid Build Coastguard Worker     unsigned int numPortsReq = num_ports;
1803*ec779b8eSAndroid Build Coastguard Worker     std::unique_ptr<audio_port_v7[]> ports(new audio_port_v7[num_ports]);
1804*ec779b8eSAndroid Build Coastguard Worker     unsigned int generation;
1805*ec779b8eSAndroid Build Coastguard Worker 
1806*ec779b8eSAndroid Build Coastguard Worker     const AttributionSourceState attributionSource = getCallingAttributionSource();
1807*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1808*ec779b8eSAndroid Build Coastguard Worker     {
1809*ec779b8eSAndroid Build Coastguard Worker         audio_utils::lock_guard _l(mMutex);
1810*ec779b8eSAndroid Build Coastguard Worker         if (mAudioPolicyManager == NULL) {
1811*ec779b8eSAndroid Build Coastguard Worker             return binderStatusFromStatusT(NO_INIT);
1812*ec779b8eSAndroid Build Coastguard Worker         }
1813*ec779b8eSAndroid Build Coastguard Worker         // AudioPolicyManager->listAudioPorts makes a deep copy of port structs into ports
1814*ec779b8eSAndroid Build Coastguard Worker         // so it is safe to access after releasing the mutex
1815*ec779b8eSAndroid Build Coastguard Worker         RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1816*ec779b8eSAndroid Build Coastguard Worker                 mAudioPolicyManager->listAudioPorts(
1817*ec779b8eSAndroid Build Coastguard Worker                         role, type, &num_ports, ports.get(), &generation)));
1818*ec779b8eSAndroid Build Coastguard Worker         numPortsReq = std::min(numPortsReq, num_ports);
1819*ec779b8eSAndroid Build Coastguard Worker     }
1820*ec779b8eSAndroid Build Coastguard Worker 
1821*ec779b8eSAndroid Build Coastguard Worker     if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__),
1822*ec779b8eSAndroid Build Coastguard Worker                                       getPermissionProvider())) {
1823*ec779b8eSAndroid Build Coastguard Worker         for (size_t i = 0; i < numPortsReq; ++i) {
1824*ec779b8eSAndroid Build Coastguard Worker             anonymizePortBluetoothAddress(ports[i]);
1825*ec779b8eSAndroid Build Coastguard Worker         }
1826*ec779b8eSAndroid Build Coastguard Worker     }
1827*ec779b8eSAndroid Build Coastguard Worker 
1828*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1829*ec779b8eSAndroid Build Coastguard Worker             convertRange(ports.get(), ports.get() + numPortsReq, std::back_inserter(*portsAidl),
1830*ec779b8eSAndroid Build Coastguard Worker                          legacy2aidl_audio_port_v7_AudioPortFw)));
1831*ec779b8eSAndroid Build Coastguard Worker     count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_ports));
1832*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1833*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1834*ec779b8eSAndroid Build Coastguard Worker }
1835*ec779b8eSAndroid Build Coastguard Worker 
listDeclaredDevicePorts(media::AudioPortRole role,std::vector<media::AudioPortFw> * _aidl_return)1836*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::listDeclaredDevicePorts(media::AudioPortRole role,
1837*ec779b8eSAndroid Build Coastguard Worker                                                     std::vector<media::AudioPortFw>* _aidl_return) {
1838*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1839*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1840*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1841*ec779b8eSAndroid Build Coastguard Worker     }
1842*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1843*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->listDeclaredDevicePorts(
1844*ec779b8eSAndroid Build Coastguard Worker                     role, _aidl_return));
1845*ec779b8eSAndroid Build Coastguard Worker }
1846*ec779b8eSAndroid Build Coastguard Worker 
getAudioPort(int portId,media::AudioPortFw * _aidl_return)1847*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getAudioPort(int portId,
1848*ec779b8eSAndroid Build Coastguard Worker                                         media::AudioPortFw* _aidl_return) {
1849*ec779b8eSAndroid Build Coastguard Worker     audio_port_v7 port{ .id = portId };
1850*ec779b8eSAndroid Build Coastguard Worker 
1851*ec779b8eSAndroid Build Coastguard Worker     const AttributionSourceState attributionSource = getCallingAttributionSource();
1852*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1853*ec779b8eSAndroid Build Coastguard Worker 
1854*ec779b8eSAndroid Build Coastguard Worker     {
1855*ec779b8eSAndroid Build Coastguard Worker         audio_utils::lock_guard _l(mMutex);
1856*ec779b8eSAndroid Build Coastguard Worker         if (mAudioPolicyManager == NULL) {
1857*ec779b8eSAndroid Build Coastguard Worker             return binderStatusFromStatusT(NO_INIT);
1858*ec779b8eSAndroid Build Coastguard Worker         }
1859*ec779b8eSAndroid Build Coastguard Worker         // AudioPolicyManager->getAudioPort makes a deep copy of the port struct into port
1860*ec779b8eSAndroid Build Coastguard Worker         // so it is safe to access after releasing the mutex
1861*ec779b8eSAndroid Build Coastguard Worker         RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(mAudioPolicyManager->getAudioPort(&port)));
1862*ec779b8eSAndroid Build Coastguard Worker     }
1863*ec779b8eSAndroid Build Coastguard Worker 
1864*ec779b8eSAndroid Build Coastguard Worker     if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__),
1865*ec779b8eSAndroid Build Coastguard Worker                                       getPermissionProvider())) {
1866*ec779b8eSAndroid Build Coastguard Worker         anonymizePortBluetoothAddress(port);
1867*ec779b8eSAndroid Build Coastguard Worker     }
1868*ec779b8eSAndroid Build Coastguard Worker 
1869*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_v7_AudioPortFw(port));
1870*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1871*ec779b8eSAndroid Build Coastguard Worker }
1872*ec779b8eSAndroid Build Coastguard Worker 
createAudioPatch(const media::AudioPatchFw & patchAidl,int32_t handleAidl,int32_t * _aidl_return)1873*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::createAudioPatch(const media::AudioPatchFw& patchAidl,
1874*ec779b8eSAndroid Build Coastguard Worker                                             int32_t handleAidl,
1875*ec779b8eSAndroid Build Coastguard Worker                                             int32_t* _aidl_return) {
1876*ec779b8eSAndroid Build Coastguard Worker     audio_patch patch = VALUE_OR_RETURN_BINDER_STATUS(
1877*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioPatchFw_audio_patch(patchAidl));
1878*ec779b8eSAndroid Build Coastguard Worker     audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1879*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_port_handle_t(handleAidl));
1880*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPatch(patch)));
1881*ec779b8eSAndroid Build Coastguard Worker 
1882*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1883*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
1884*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1885*ec779b8eSAndroid Build Coastguard Worker                 : modifyAudioRoutingAllowed())) {
1886*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
1887*ec779b8eSAndroid Build Coastguard Worker     }
1888*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1889*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1890*ec779b8eSAndroid Build Coastguard Worker     }
1891*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1892*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1893*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->createAudioPatch(&patch, &handle,
1894*ec779b8eSAndroid Build Coastguard Worker                                                   IPCThreadState::self()->getCallingUid())));
1895*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_patch_handle_t_int32_t(handle));
1896*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1897*ec779b8eSAndroid Build Coastguard Worker }
1898*ec779b8eSAndroid Build Coastguard Worker 
releaseAudioPatch(int32_t handleAidl)1899*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::releaseAudioPatch(int32_t handleAidl)
1900*ec779b8eSAndroid Build Coastguard Worker {
1901*ec779b8eSAndroid Build Coastguard Worker     audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS(
1902*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_patch_handle_t(handleAidl));
1903*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1904*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
1905*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1906*ec779b8eSAndroid Build Coastguard Worker                 : modifyAudioRoutingAllowed())) {
1907*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
1908*ec779b8eSAndroid Build Coastguard Worker     }
1909*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1910*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1911*ec779b8eSAndroid Build Coastguard Worker     }
1912*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1913*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
1914*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->releaseAudioPatch(handle,
1915*ec779b8eSAndroid Build Coastguard Worker                                                    IPCThreadState::self()->getCallingUid()));
1916*ec779b8eSAndroid Build Coastguard Worker }
1917*ec779b8eSAndroid Build Coastguard Worker 
listAudioPatches(Int * count,std::vector<media::AudioPatchFw> * patchesAidl,int32_t * _aidl_return)1918*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::listAudioPatches(Int* count,
1919*ec779b8eSAndroid Build Coastguard Worker                                             std::vector<media::AudioPatchFw>* patchesAidl,
1920*ec779b8eSAndroid Build Coastguard Worker                                             int32_t* _aidl_return) {
1921*ec779b8eSAndroid Build Coastguard Worker     unsigned int num_patches = VALUE_OR_RETURN_BINDER_STATUS(
1922*ec779b8eSAndroid Build Coastguard Worker             convertIntegral<unsigned int>(count->value));
1923*ec779b8eSAndroid Build Coastguard Worker     if (num_patches > MAX_ITEMS_PER_LIST) {
1924*ec779b8eSAndroid Build Coastguard Worker         num_patches = MAX_ITEMS_PER_LIST;
1925*ec779b8eSAndroid Build Coastguard Worker     }
1926*ec779b8eSAndroid Build Coastguard Worker     unsigned int numPatchesReq = num_patches;
1927*ec779b8eSAndroid Build Coastguard Worker     std::unique_ptr<audio_patch[]> patches(new audio_patch[num_patches]);
1928*ec779b8eSAndroid Build Coastguard Worker     unsigned int generation;
1929*ec779b8eSAndroid Build Coastguard Worker 
1930*ec779b8eSAndroid Build Coastguard Worker     const AttributionSourceState attributionSource = getCallingAttributionSource();
1931*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1932*ec779b8eSAndroid Build Coastguard Worker 
1933*ec779b8eSAndroid Build Coastguard Worker     {
1934*ec779b8eSAndroid Build Coastguard Worker         audio_utils::lock_guard _l(mMutex);
1935*ec779b8eSAndroid Build Coastguard Worker         if (mAudioPolicyManager == NULL) {
1936*ec779b8eSAndroid Build Coastguard Worker             return binderStatusFromStatusT(NO_INIT);
1937*ec779b8eSAndroid Build Coastguard Worker         }
1938*ec779b8eSAndroid Build Coastguard Worker         // AudioPolicyManager->listAudioPatches makes a deep copy of patches structs into patches
1939*ec779b8eSAndroid Build Coastguard Worker         // so it is safe to access after releasing the mutex
1940*ec779b8eSAndroid Build Coastguard Worker         RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1941*ec779b8eSAndroid Build Coastguard Worker                 mAudioPolicyManager->listAudioPatches(&num_patches, patches.get(), &generation)));
1942*ec779b8eSAndroid Build Coastguard Worker         numPatchesReq = std::min(numPatchesReq, num_patches);
1943*ec779b8eSAndroid Build Coastguard Worker     }
1944*ec779b8eSAndroid Build Coastguard Worker 
1945*ec779b8eSAndroid Build Coastguard Worker     if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__),
1946*ec779b8eSAndroid Build Coastguard Worker                                       getPermissionProvider())) {
1947*ec779b8eSAndroid Build Coastguard Worker         for (size_t i = 0; i < numPatchesReq; ++i) {
1948*ec779b8eSAndroid Build Coastguard Worker             for (size_t j = 0; j < patches[i].num_sources; ++j) {
1949*ec779b8eSAndroid Build Coastguard Worker                 anonymizePortBluetoothAddress(patches[i].sources[j]);
1950*ec779b8eSAndroid Build Coastguard Worker             }
1951*ec779b8eSAndroid Build Coastguard Worker             for (size_t j = 0; j < patches[i].num_sinks; ++j) {
1952*ec779b8eSAndroid Build Coastguard Worker                 anonymizePortBluetoothAddress(patches[i].sinks[j]);
1953*ec779b8eSAndroid Build Coastguard Worker             }
1954*ec779b8eSAndroid Build Coastguard Worker         }
1955*ec779b8eSAndroid Build Coastguard Worker     }
1956*ec779b8eSAndroid Build Coastguard Worker 
1957*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1958*ec779b8eSAndroid Build Coastguard Worker             convertRange(patches.get(), patches.get() + numPatchesReq,
1959*ec779b8eSAndroid Build Coastguard Worker                          std::back_inserter(*patchesAidl), legacy2aidl_audio_patch_AudioPatchFw)));
1960*ec779b8eSAndroid Build Coastguard Worker     count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(num_patches));
1961*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int32_t>(generation));
1962*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
1963*ec779b8eSAndroid Build Coastguard Worker }
1964*ec779b8eSAndroid Build Coastguard Worker 
setAudioPortConfig(const media::AudioPortConfigFw & configAidl)1965*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setAudioPortConfig(const media::AudioPortConfigFw& configAidl)
1966*ec779b8eSAndroid Build Coastguard Worker {
1967*ec779b8eSAndroid Build Coastguard Worker     audio_port_config config = VALUE_OR_RETURN_BINDER_STATUS(
1968*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioPortConfigFw_audio_port_config(configAidl));
1969*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(
1970*ec779b8eSAndroid Build Coastguard Worker             binderStatusFromStatusT(AudioValidator::validateAudioPortConfig(config)));
1971*ec779b8eSAndroid Build Coastguard Worker 
1972*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
1973*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
1974*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
1975*ec779b8eSAndroid Build Coastguard Worker                 : modifyAudioRoutingAllowed())) {
1976*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
1977*ec779b8eSAndroid Build Coastguard Worker     }
1978*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
1979*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
1980*ec779b8eSAndroid Build Coastguard Worker     }
1981*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
1982*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->setAudioPortConfig(&config));
1983*ec779b8eSAndroid Build Coastguard Worker }
1984*ec779b8eSAndroid Build Coastguard Worker 
acquireSoundTriggerSession(media::SoundTriggerSession * _aidl_return)1985*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::acquireSoundTriggerSession(media::SoundTriggerSession* _aidl_return)
1986*ec779b8eSAndroid Build Coastguard Worker {
1987*ec779b8eSAndroid Build Coastguard Worker     audio_session_t session;
1988*ec779b8eSAndroid Build Coastguard Worker     audio_io_handle_t ioHandle;
1989*ec779b8eSAndroid Build Coastguard Worker     audio_devices_t device;
1990*ec779b8eSAndroid Build Coastguard Worker 
1991*ec779b8eSAndroid Build Coastguard Worker     {
1992*ec779b8eSAndroid Build Coastguard Worker         audio_utils::lock_guard _l(mMutex);
1993*ec779b8eSAndroid Build Coastguard Worker         if (mAudioPolicyManager == NULL) {
1994*ec779b8eSAndroid Build Coastguard Worker             return binderStatusFromStatusT(NO_INIT);
1995*ec779b8eSAndroid Build Coastguard Worker         }
1996*ec779b8eSAndroid Build Coastguard Worker         AutoCallerClear acc;
1997*ec779b8eSAndroid Build Coastguard Worker         RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
1998*ec779b8eSAndroid Build Coastguard Worker                 mAudioPolicyManager->acquireSoundTriggerSession(&session, &ioHandle, &device)));
1999*ec779b8eSAndroid Build Coastguard Worker     }
2000*ec779b8eSAndroid Build Coastguard Worker 
2001*ec779b8eSAndroid Build Coastguard Worker     _aidl_return->session = VALUE_OR_RETURN_BINDER_STATUS(
2002*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_session_t_int32_t(session));
2003*ec779b8eSAndroid Build Coastguard Worker     _aidl_return->ioHandle = VALUE_OR_RETURN_BINDER_STATUS(
2004*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_io_handle_t_int32_t(ioHandle));
2005*ec779b8eSAndroid Build Coastguard Worker     _aidl_return->device = VALUE_OR_RETURN_BINDER_STATUS(
2006*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_devices_t_AudioDeviceDescription(device));
2007*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2008*ec779b8eSAndroid Build Coastguard Worker }
2009*ec779b8eSAndroid Build Coastguard Worker 
releaseSoundTriggerSession(int32_t sessionAidl)2010*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::releaseSoundTriggerSession(int32_t sessionAidl)
2011*ec779b8eSAndroid Build Coastguard Worker {
2012*ec779b8eSAndroid Build Coastguard Worker     audio_session_t session = VALUE_OR_RETURN_BINDER_STATUS(
2013*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_session_t(sessionAidl));
2014*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2015*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2016*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2017*ec779b8eSAndroid Build Coastguard Worker     }
2018*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2019*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->releaseSoundTriggerSession(session));
2020*ec779b8eSAndroid Build Coastguard Worker }
2021*ec779b8eSAndroid Build Coastguard Worker 
registerPolicyMixes(const std::vector<media::AudioMix> & mixesAidl,bool registration)2022*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::registerPolicyMixes(const std::vector<media::AudioMix>& mixesAidl,
2023*ec779b8eSAndroid Build Coastguard Worker                                                bool registration) {
2024*ec779b8eSAndroid Build Coastguard Worker     size_t size = mixesAidl.size();
2025*ec779b8eSAndroid Build Coastguard Worker     if (size > MAX_MIXES_PER_POLICY) {
2026*ec779b8eSAndroid Build Coastguard Worker         size = MAX_MIXES_PER_POLICY;
2027*ec779b8eSAndroid Build Coastguard Worker     }
2028*ec779b8eSAndroid Build Coastguard Worker     Vector<AudioMix> mixes;
2029*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2030*ec779b8eSAndroid Build Coastguard Worker             convertRange(mixesAidl.begin(), mixesAidl.begin() + size, std::back_inserter(mixes),
2031*ec779b8eSAndroid Build Coastguard Worker                          aidl2legacy_AudioMix)));
2032*ec779b8eSAndroid Build Coastguard Worker 
2033*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2034*ec779b8eSAndroid Build Coastguard Worker 
2035*ec779b8eSAndroid Build Coastguard Worker     // loopback|render only need a MediaProjection (checked in caller AudioService.java)
2036*ec779b8eSAndroid Build Coastguard Worker     bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
2037*ec779b8eSAndroid Build Coastguard Worker             return !is_mix_loopback_render(mix.mRouteFlags); });
2038*ec779b8eSAndroid Build Coastguard Worker     if (needModifyAudioRouting && !(audioserver_permissions() ?
2039*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2040*ec779b8eSAndroid Build Coastguard Worker                 : modifyAudioRoutingAllowed())) {
2041*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
2042*ec779b8eSAndroid Build Coastguard Worker     }
2043*ec779b8eSAndroid Build Coastguard Worker 
2044*ec779b8eSAndroid Build Coastguard Worker     // If one of the mixes has needCaptureVoiceCommunicationOutput set to true, then we
2045*ec779b8eSAndroid Build Coastguard Worker     // need to verify that the caller still has CAPTURE_VOICE_COMMUNICATION_OUTPUT
2046*ec779b8eSAndroid Build Coastguard Worker     bool needCaptureVoiceCommunicationOutput =
2047*ec779b8eSAndroid Build Coastguard Worker         std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
2048*ec779b8eSAndroid Build Coastguard Worker             return mix.mVoiceCommunicationCaptureAllowed; });
2049*ec779b8eSAndroid Build Coastguard Worker 
2050*ec779b8eSAndroid Build Coastguard Worker     bool needCaptureMediaOutput = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) {
2051*ec779b8eSAndroid Build Coastguard Worker             return mix.mAllowPrivilegedMediaPlaybackCapture; });
2052*ec779b8eSAndroid Build Coastguard Worker 
2053*ec779b8eSAndroid Build Coastguard Worker     const AttributionSourceState attributionSource = getCallingAttributionSource();
2054*ec779b8eSAndroid Build Coastguard Worker 
2055*ec779b8eSAndroid Build Coastguard Worker 
2056*ec779b8eSAndroid Build Coastguard Worker     if (needCaptureMediaOutput && !(audioserver_permissions() ?
2057*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(CAPTURE_MEDIA_OUTPUT, attributionSource.uid)
2058*ec779b8eSAndroid Build Coastguard Worker                 : captureMediaOutputAllowed(attributionSource))) {
2059*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
2060*ec779b8eSAndroid Build Coastguard Worker     }
2061*ec779b8eSAndroid Build Coastguard Worker 
2062*ec779b8eSAndroid Build Coastguard Worker     if (needCaptureVoiceCommunicationOutput &&
2063*ec779b8eSAndroid Build Coastguard Worker         !(audioserver_permissions() ?
2064*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(CAPTURE_VOICE_COMMUNICATION_OUTPUT, attributionSource.uid)
2065*ec779b8eSAndroid Build Coastguard Worker                 : captureVoiceCommunicationOutputAllowed(attributionSource))) {
2066*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
2067*ec779b8eSAndroid Build Coastguard Worker     }
2068*ec779b8eSAndroid Build Coastguard Worker 
2069*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2070*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2071*ec779b8eSAndroid Build Coastguard Worker     }
2072*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2073*ec779b8eSAndroid Build Coastguard Worker     if (registration) {
2074*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(mAudioPolicyManager->registerPolicyMixes(mixes));
2075*ec779b8eSAndroid Build Coastguard Worker     } else {
2076*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(mAudioPolicyManager->unregisterPolicyMixes(mixes));
2077*ec779b8eSAndroid Build Coastguard Worker     }
2078*ec779b8eSAndroid Build Coastguard Worker }
2079*ec779b8eSAndroid Build Coastguard Worker 
2080*ec779b8eSAndroid Build Coastguard Worker Status
getRegisteredPolicyMixes(std::vector<::android::media::AudioMix> * mixesAidl)2081*ec779b8eSAndroid Build Coastguard Worker AudioPolicyService::getRegisteredPolicyMixes(std::vector<::android::media::AudioMix>* mixesAidl) {
2082*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2083*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2084*ec779b8eSAndroid Build Coastguard Worker     }
2085*ec779b8eSAndroid Build Coastguard Worker 
2086*ec779b8eSAndroid Build Coastguard Worker     std::vector<AudioMix> mixes;
2087*ec779b8eSAndroid Build Coastguard Worker     int status = mAudioPolicyManager->getRegisteredPolicyMixes(mixes);
2088*ec779b8eSAndroid Build Coastguard Worker 
2089*ec779b8eSAndroid Build Coastguard Worker     for (const auto& mix : mixes) {
2090*ec779b8eSAndroid Build Coastguard Worker         media::AudioMix aidlMix = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_AudioMix(mix));
2091*ec779b8eSAndroid Build Coastguard Worker         mixesAidl->push_back(aidlMix);
2092*ec779b8eSAndroid Build Coastguard Worker     }
2093*ec779b8eSAndroid Build Coastguard Worker 
2094*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(status);
2095*ec779b8eSAndroid Build Coastguard Worker }
2096*ec779b8eSAndroid Build Coastguard Worker 
updatePolicyMixes(const::std::vector<::android::media::AudioMixUpdate> & updates)2097*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::updatePolicyMixes(
2098*ec779b8eSAndroid Build Coastguard Worker         const ::std::vector<::android::media::AudioMixUpdate>& updates) {
2099*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2100*ec779b8eSAndroid Build Coastguard Worker     for (const auto& update : updates) {
2101*ec779b8eSAndroid Build Coastguard Worker         AudioMix mix = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_AudioMix(update.audioMix));
2102*ec779b8eSAndroid Build Coastguard Worker         std::vector<AudioMixMatchCriterion> newCriteria =
2103*ec779b8eSAndroid Build Coastguard Worker                 VALUE_OR_RETURN_BINDER_STATUS(convertContainer<std::vector<AudioMixMatchCriterion>>(
2104*ec779b8eSAndroid Build Coastguard Worker                         update.newCriteria, aidl2legacy_AudioMixMatchCriterion));
2105*ec779b8eSAndroid Build Coastguard Worker         int status;
2106*ec779b8eSAndroid Build Coastguard Worker         if((status = mAudioPolicyManager->updatePolicyMix(mix, newCriteria)) != NO_ERROR) {
2107*ec779b8eSAndroid Build Coastguard Worker             return binderStatusFromStatusT(status);
2108*ec779b8eSAndroid Build Coastguard Worker         }
2109*ec779b8eSAndroid Build Coastguard Worker     }
2110*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(NO_ERROR);
2111*ec779b8eSAndroid Build Coastguard Worker }
2112*ec779b8eSAndroid Build Coastguard Worker 
setUidDeviceAffinities(int32_t uidAidl,const std::vector<AudioDevice> & devicesAidl)2113*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setUidDeviceAffinities(
2114*ec779b8eSAndroid Build Coastguard Worker         int32_t uidAidl,
2115*ec779b8eSAndroid Build Coastguard Worker         const std::vector<AudioDevice>& devicesAidl) {
2116*ec779b8eSAndroid Build Coastguard Worker     uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2117*ec779b8eSAndroid Build Coastguard Worker     AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2118*ec779b8eSAndroid Build Coastguard Worker             convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2119*ec779b8eSAndroid Build Coastguard Worker                                                         aidl2legacy_AudioDeviceTypeAddress));
2120*ec779b8eSAndroid Build Coastguard Worker 
2121*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2122*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
2123*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2124*ec779b8eSAndroid Build Coastguard Worker                 : modifyAudioRoutingAllowed())) {
2125*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
2126*ec779b8eSAndroid Build Coastguard Worker     }
2127*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2128*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2129*ec779b8eSAndroid Build Coastguard Worker     }
2130*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2131*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->setUidDeviceAffinities(uid, devices));
2132*ec779b8eSAndroid Build Coastguard Worker }
2133*ec779b8eSAndroid Build Coastguard Worker 
removeUidDeviceAffinities(int32_t uidAidl)2134*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::removeUidDeviceAffinities(int32_t uidAidl) {
2135*ec779b8eSAndroid Build Coastguard Worker     uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2136*ec779b8eSAndroid Build Coastguard Worker 
2137*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2138*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
2139*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2140*ec779b8eSAndroid Build Coastguard Worker                 : modifyAudioRoutingAllowed())) {
2141*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
2142*ec779b8eSAndroid Build Coastguard Worker     }
2143*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2144*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2145*ec779b8eSAndroid Build Coastguard Worker     }
2146*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2147*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->removeUidDeviceAffinities(uid));
2148*ec779b8eSAndroid Build Coastguard Worker }
2149*ec779b8eSAndroid Build Coastguard Worker 
setUserIdDeviceAffinities(int32_t userIdAidl,const std::vector<AudioDevice> & devicesAidl)2150*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setUserIdDeviceAffinities(
2151*ec779b8eSAndroid Build Coastguard Worker         int32_t userIdAidl,
2152*ec779b8eSAndroid Build Coastguard Worker         const std::vector<AudioDevice>& devicesAidl) {
2153*ec779b8eSAndroid Build Coastguard Worker     int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
2154*ec779b8eSAndroid Build Coastguard Worker     AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2155*ec779b8eSAndroid Build Coastguard Worker             convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2156*ec779b8eSAndroid Build Coastguard Worker                                                         aidl2legacy_AudioDeviceTypeAddress));
2157*ec779b8eSAndroid Build Coastguard Worker 
2158*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2159*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
2160*ec779b8eSAndroid Build Coastguard Worker                 CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2161*ec779b8eSAndroid Build Coastguard Worker                 : modifyAudioRoutingAllowed())) {
2162*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
2163*ec779b8eSAndroid Build Coastguard Worker     }
2164*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2165*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2166*ec779b8eSAndroid Build Coastguard Worker     }
2167*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2168*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->setUserIdDeviceAffinities(userId, devices));
2169*ec779b8eSAndroid Build Coastguard Worker }
2170*ec779b8eSAndroid Build Coastguard Worker 
removeUserIdDeviceAffinities(int32_t userIdAidl)2171*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::removeUserIdDeviceAffinities(int32_t userIdAidl) {
2172*ec779b8eSAndroid Build Coastguard Worker     int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl));
2173*ec779b8eSAndroid Build Coastguard Worker 
2174*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2175*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
2176*ec779b8eSAndroid Build Coastguard Worker             CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid())
2177*ec779b8eSAndroid Build Coastguard Worker             : modifyAudioRoutingAllowed())) {
2178*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
2179*ec779b8eSAndroid Build Coastguard Worker     }
2180*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2181*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2182*ec779b8eSAndroid Build Coastguard Worker     }
2183*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2184*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->removeUserIdDeviceAffinities(userId));
2185*ec779b8eSAndroid Build Coastguard Worker }
2186*ec779b8eSAndroid Build Coastguard Worker 
startAudioSource(const media::AudioPortConfigFw & sourceAidl,const media::audio::common::AudioAttributes & attributesAidl,int32_t * _aidl_return)2187*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::startAudioSource(const media::AudioPortConfigFw& sourceAidl,
2188*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioAttributes& attributesAidl,
2189*ec779b8eSAndroid Build Coastguard Worker         int32_t* _aidl_return) {
2190*ec779b8eSAndroid Build Coastguard Worker     audio_port_config source = VALUE_OR_RETURN_BINDER_STATUS(
2191*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioPortConfigFw_audio_port_config(sourceAidl));
2192*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t attributes = VALUE_OR_RETURN_BINDER_STATUS(
2193*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attributesAidl));
2194*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t portId;
2195*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2196*ec779b8eSAndroid Build Coastguard Worker             AudioValidator::validateAudioPortConfig(source)));
2197*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2198*ec779b8eSAndroid Build Coastguard Worker             AudioValidator::validateAudioAttributes(attributes, "68953950")));
2199*ec779b8eSAndroid Build Coastguard Worker 
2200*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2201*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2202*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2203*ec779b8eSAndroid Build Coastguard Worker     }
2204*ec779b8eSAndroid Build Coastguard Worker 
2205*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(validateUsage(attributes));
2206*ec779b8eSAndroid Build Coastguard Worker 
2207*ec779b8eSAndroid Build Coastguard Worker     // startAudioSource should be created as the calling uid
2208*ec779b8eSAndroid Build Coastguard Worker     const uid_t callingUid = IPCThreadState::self()->getCallingUid();
2209*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2210*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2211*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->startAudioSource(&source, &attributes, &portId, callingUid)));
2212*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_port_handle_t_int32_t(portId));
2213*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2214*ec779b8eSAndroid Build Coastguard Worker }
2215*ec779b8eSAndroid Build Coastguard Worker 
stopAudioSource(int32_t portIdAidl)2216*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::stopAudioSource(int32_t portIdAidl)
2217*ec779b8eSAndroid Build Coastguard Worker {
2218*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2219*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2220*ec779b8eSAndroid Build Coastguard Worker 
2221*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2222*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2223*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2224*ec779b8eSAndroid Build Coastguard Worker     }
2225*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2226*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->stopAudioSource(portId));
2227*ec779b8eSAndroid Build Coastguard Worker }
2228*ec779b8eSAndroid Build Coastguard Worker 
setMasterMono(bool mono)2229*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setMasterMono(bool mono)
2230*ec779b8eSAndroid Build Coastguard Worker {
2231*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2232*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2233*ec779b8eSAndroid Build Coastguard Worker     }
2234*ec779b8eSAndroid Build Coastguard Worker     if (!(audioserver_permissions() ?
2235*ec779b8eSAndroid Build Coastguard Worker             CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid())
2236*ec779b8eSAndroid Build Coastguard Worker             : settingsAllowed())) {
2237*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(PERMISSION_DENIED);
2238*ec779b8eSAndroid Build Coastguard Worker     }
2239*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2240*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2241*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->setMasterMono(mono));
2242*ec779b8eSAndroid Build Coastguard Worker }
2243*ec779b8eSAndroid Build Coastguard Worker 
getMasterMono(bool * _aidl_return)2244*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getMasterMono(bool* _aidl_return)
2245*ec779b8eSAndroid Build Coastguard Worker {
2246*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2247*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2248*ec779b8eSAndroid Build Coastguard Worker     }
2249*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2250*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2251*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(mAudioPolicyManager->getMasterMono(_aidl_return));
2252*ec779b8eSAndroid Build Coastguard Worker }
2253*ec779b8eSAndroid Build Coastguard Worker 
2254*ec779b8eSAndroid Build Coastguard Worker 
getStreamVolumeDB(AudioStreamType streamAidl,int32_t indexAidl,const AudioDeviceDescription & deviceAidl,float * _aidl_return)2255*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getStreamVolumeDB(
2256*ec779b8eSAndroid Build Coastguard Worker         AudioStreamType streamAidl, int32_t indexAidl,
2257*ec779b8eSAndroid Build Coastguard Worker         const AudioDeviceDescription& deviceAidl, float* _aidl_return) {
2258*ec779b8eSAndroid Build Coastguard Worker     audio_stream_type_t stream = VALUE_OR_RETURN_BINDER_STATUS(
2259*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioStreamType_audio_stream_type_t(streamAidl));
2260*ec779b8eSAndroid Build Coastguard Worker     int index = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<int>(indexAidl));
2261*ec779b8eSAndroid Build Coastguard Worker     audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
2262*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
2263*ec779b8eSAndroid Build Coastguard Worker 
2264*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2265*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2266*ec779b8eSAndroid Build Coastguard Worker     }
2267*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2268*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2269*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = mAudioPolicyManager->getStreamVolumeDB(stream, index, device);
2270*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2271*ec779b8eSAndroid Build Coastguard Worker }
2272*ec779b8eSAndroid Build Coastguard Worker 
getSurroundFormats(Int * count,std::vector<AudioFormatDescription> * formats,std::vector<bool> * formatsEnabled)2273*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getSurroundFormats(Int* count,
2274*ec779b8eSAndroid Build Coastguard Worker         std::vector<AudioFormatDescription>* formats,
2275*ec779b8eSAndroid Build Coastguard Worker         std::vector<bool>* formatsEnabled) {
2276*ec779b8eSAndroid Build Coastguard Worker     unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
2277*ec779b8eSAndroid Build Coastguard Worker             convertIntegral<unsigned int>(count->value));
2278*ec779b8eSAndroid Build Coastguard Worker     if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
2279*ec779b8eSAndroid Build Coastguard Worker         numSurroundFormats = MAX_ITEMS_PER_LIST;
2280*ec779b8eSAndroid Build Coastguard Worker     }
2281*ec779b8eSAndroid Build Coastguard Worker     unsigned int numSurroundFormatsReq = numSurroundFormats;
2282*ec779b8eSAndroid Build Coastguard Worker     std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
2283*ec779b8eSAndroid Build Coastguard Worker     std::unique_ptr<bool[]>surroundFormatsEnabled(new bool[numSurroundFormats]);
2284*ec779b8eSAndroid Build Coastguard Worker 
2285*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2286*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2287*ec779b8eSAndroid Build Coastguard Worker     }
2288*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2289*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2290*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2291*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getSurroundFormats(&numSurroundFormats, surroundFormats.get(),
2292*ec779b8eSAndroid Build Coastguard Worker                                                     surroundFormatsEnabled.get())));
2293*ec779b8eSAndroid Build Coastguard Worker     numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
2294*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2295*ec779b8eSAndroid Build Coastguard Worker             convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
2296*ec779b8eSAndroid Build Coastguard Worker                          std::back_inserter(*formats),
2297*ec779b8eSAndroid Build Coastguard Worker                          legacy2aidl_audio_format_t_AudioFormatDescription)));
2298*ec779b8eSAndroid Build Coastguard Worker     formatsEnabled->insert(
2299*ec779b8eSAndroid Build Coastguard Worker             formatsEnabled->begin(),
2300*ec779b8eSAndroid Build Coastguard Worker             surroundFormatsEnabled.get(),
2301*ec779b8eSAndroid Build Coastguard Worker             surroundFormatsEnabled.get() + numSurroundFormatsReq);
2302*ec779b8eSAndroid Build Coastguard Worker     count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
2303*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2304*ec779b8eSAndroid Build Coastguard Worker }
2305*ec779b8eSAndroid Build Coastguard Worker 
getReportedSurroundFormats(Int * count,std::vector<AudioFormatDescription> * formats)2306*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getReportedSurroundFormats(
2307*ec779b8eSAndroid Build Coastguard Worker         Int* count, std::vector<AudioFormatDescription>* formats) {
2308*ec779b8eSAndroid Build Coastguard Worker     unsigned int numSurroundFormats = VALUE_OR_RETURN_BINDER_STATUS(
2309*ec779b8eSAndroid Build Coastguard Worker             convertIntegral<unsigned int>(count->value));
2310*ec779b8eSAndroid Build Coastguard Worker     if (numSurroundFormats > MAX_ITEMS_PER_LIST) {
2311*ec779b8eSAndroid Build Coastguard Worker         numSurroundFormats = MAX_ITEMS_PER_LIST;
2312*ec779b8eSAndroid Build Coastguard Worker     }
2313*ec779b8eSAndroid Build Coastguard Worker     unsigned int numSurroundFormatsReq = numSurroundFormats;
2314*ec779b8eSAndroid Build Coastguard Worker     std::unique_ptr<audio_format_t[]>surroundFormats(new audio_format_t[numSurroundFormats]);
2315*ec779b8eSAndroid Build Coastguard Worker 
2316*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2317*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2318*ec779b8eSAndroid Build Coastguard Worker     }
2319*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2320*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2321*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2322*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getReportedSurroundFormats(
2323*ec779b8eSAndroid Build Coastguard Worker                     &numSurroundFormats, surroundFormats.get())));
2324*ec779b8eSAndroid Build Coastguard Worker     numSurroundFormatsReq = std::min(numSurroundFormats, numSurroundFormatsReq);
2325*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2326*ec779b8eSAndroid Build Coastguard Worker             convertRange(surroundFormats.get(), surroundFormats.get() + numSurroundFormatsReq,
2327*ec779b8eSAndroid Build Coastguard Worker                          std::back_inserter(*formats),
2328*ec779b8eSAndroid Build Coastguard Worker                          legacy2aidl_audio_format_t_AudioFormatDescription)));
2329*ec779b8eSAndroid Build Coastguard Worker     count->value = VALUE_OR_RETURN_BINDER_STATUS(convertIntegral<uint32_t>(numSurroundFormats));
2330*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2331*ec779b8eSAndroid Build Coastguard Worker }
2332*ec779b8eSAndroid Build Coastguard Worker 
getHwOffloadFormatsSupportedForBluetoothMedia(const AudioDeviceDescription & deviceAidl,std::vector<AudioFormatDescription> * _aidl_return)2333*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getHwOffloadFormatsSupportedForBluetoothMedia(
2334*ec779b8eSAndroid Build Coastguard Worker         const AudioDeviceDescription& deviceAidl,
2335*ec779b8eSAndroid Build Coastguard Worker         std::vector<AudioFormatDescription>* _aidl_return) {
2336*ec779b8eSAndroid Build Coastguard Worker     std::vector<audio_format_t> formats;
2337*ec779b8eSAndroid Build Coastguard Worker 
2338*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2339*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2340*ec779b8eSAndroid Build Coastguard Worker     }
2341*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2342*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2343*ec779b8eSAndroid Build Coastguard Worker     audio_devices_t device = VALUE_OR_RETURN_BINDER_STATUS(
2344*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioDeviceDescription_audio_devices_t(deviceAidl));
2345*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2346*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getHwOffloadFormatsSupportedForBluetoothMedia(device, &formats)));
2347*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2348*ec779b8eSAndroid Build Coastguard Worker             convertContainer<std::vector<AudioFormatDescription>>(
2349*ec779b8eSAndroid Build Coastguard Worker                     formats,
2350*ec779b8eSAndroid Build Coastguard Worker                     legacy2aidl_audio_format_t_AudioFormatDescription));
2351*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2352*ec779b8eSAndroid Build Coastguard Worker }
2353*ec779b8eSAndroid Build Coastguard Worker 
setSurroundFormatEnabled(const AudioFormatDescription & audioFormatAidl,bool enabled)2354*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setSurroundFormatEnabled(
2355*ec779b8eSAndroid Build Coastguard Worker         const AudioFormatDescription& audioFormatAidl, bool enabled) {
2356*ec779b8eSAndroid Build Coastguard Worker     audio_format_t audioFormat = VALUE_OR_RETURN_BINDER_STATUS(
2357*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioFormatDescription_audio_format_t(audioFormatAidl));
2358*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2359*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2360*ec779b8eSAndroid Build Coastguard Worker     }
2361*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2362*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2363*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
2364*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->setSurroundFormatEnabled(audioFormat, enabled));
2365*ec779b8eSAndroid Build Coastguard Worker }
2366*ec779b8eSAndroid Build Coastguard Worker 
convertInt32VectorToUidVectorWithLimit(const std::vector<int32_t> & uidsAidl,std::vector<uid_t> & uids)2367*ec779b8eSAndroid Build Coastguard Worker Status convertInt32VectorToUidVectorWithLimit(
2368*ec779b8eSAndroid Build Coastguard Worker         const std::vector<int32_t>& uidsAidl, std::vector<uid_t>& uids) {
2369*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2370*ec779b8eSAndroid Build Coastguard Worker         convertRangeWithLimit(uidsAidl.begin(),
2371*ec779b8eSAndroid Build Coastguard Worker             uidsAidl.end(),
2372*ec779b8eSAndroid Build Coastguard Worker             std::back_inserter(uids),
2373*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_uid_t,
2374*ec779b8eSAndroid Build Coastguard Worker             MAX_ITEMS_PER_LIST)));
2375*ec779b8eSAndroid Build Coastguard Worker 
2376*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2377*ec779b8eSAndroid Build Coastguard Worker }
2378*ec779b8eSAndroid Build Coastguard Worker 
setAssistantServicesUids(const std::vector<int32_t> & uidsAidl)2379*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setAssistantServicesUids(const std::vector<int32_t>& uidsAidl)
2380*ec779b8eSAndroid Build Coastguard Worker {
2381*ec779b8eSAndroid Build Coastguard Worker     std::vector<uid_t> uids;
2382*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(uidsAidl, uids));
2383*ec779b8eSAndroid Build Coastguard Worker 
2384*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2385*ec779b8eSAndroid Build Coastguard Worker     mUidPolicy->setAssistantUids(uids);
2386*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2387*ec779b8eSAndroid Build Coastguard Worker }
2388*ec779b8eSAndroid Build Coastguard Worker 
setActiveAssistantServicesUids(const std::vector<int32_t> & activeUidsAidl)2389*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setActiveAssistantServicesUids(
2390*ec779b8eSAndroid Build Coastguard Worker         const std::vector<int32_t>& activeUidsAidl) {
2391*ec779b8eSAndroid Build Coastguard Worker     std::vector<uid_t> activeUids;
2392*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(activeUidsAidl, activeUids));
2393*ec779b8eSAndroid Build Coastguard Worker 
2394*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2395*ec779b8eSAndroid Build Coastguard Worker     mUidPolicy->setActiveAssistantUids(activeUids);
2396*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2397*ec779b8eSAndroid Build Coastguard Worker }
2398*ec779b8eSAndroid Build Coastguard Worker 
setA11yServicesUids(const std::vector<int32_t> & uidsAidl)2399*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setA11yServicesUids(const std::vector<int32_t>& uidsAidl)
2400*ec779b8eSAndroid Build Coastguard Worker {
2401*ec779b8eSAndroid Build Coastguard Worker     std::vector<uid_t> uids;
2402*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(convertInt32VectorToUidVectorWithLimit(uidsAidl, uids));
2403*ec779b8eSAndroid Build Coastguard Worker 
2404*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2405*ec779b8eSAndroid Build Coastguard Worker     mUidPolicy->setA11yUids(uids);
2406*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2407*ec779b8eSAndroid Build Coastguard Worker }
2408*ec779b8eSAndroid Build Coastguard Worker 
setCurrentImeUid(int32_t uidAidl)2409*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setCurrentImeUid(int32_t uidAidl)
2410*ec779b8eSAndroid Build Coastguard Worker {
2411*ec779b8eSAndroid Build Coastguard Worker     uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2412*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2413*ec779b8eSAndroid Build Coastguard Worker     mUidPolicy->setCurrentImeUid(uid);
2414*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2415*ec779b8eSAndroid Build Coastguard Worker }
2416*ec779b8eSAndroid Build Coastguard Worker 
isHapticPlaybackSupported(bool * _aidl_return)2417*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::isHapticPlaybackSupported(bool* _aidl_return)
2418*ec779b8eSAndroid Build Coastguard Worker {
2419*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2420*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2421*ec779b8eSAndroid Build Coastguard Worker     }
2422*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2423*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2424*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = mAudioPolicyManager->isHapticPlaybackSupported();
2425*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2426*ec779b8eSAndroid Build Coastguard Worker }
2427*ec779b8eSAndroid Build Coastguard Worker 
isUltrasoundSupported(bool * _aidl_return)2428*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::isUltrasoundSupported(bool* _aidl_return)
2429*ec779b8eSAndroid Build Coastguard Worker {
2430*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2431*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2432*ec779b8eSAndroid Build Coastguard Worker     }
2433*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2434*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2435*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = mAudioPolicyManager->isUltrasoundSupported();
2436*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2437*ec779b8eSAndroid Build Coastguard Worker }
2438*ec779b8eSAndroid Build Coastguard Worker 
isHotwordStreamSupported(bool lookbackAudio,bool * _aidl_return)2439*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::isHotwordStreamSupported(bool lookbackAudio, bool* _aidl_return)
2440*ec779b8eSAndroid Build Coastguard Worker {
2441*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2442*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2443*ec779b8eSAndroid Build Coastguard Worker     }
2444*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2445*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2446*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = mAudioPolicyManager->isHotwordStreamSupported(lookbackAudio);
2447*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2448*ec779b8eSAndroid Build Coastguard Worker }
2449*ec779b8eSAndroid Build Coastguard Worker 
listAudioProductStrategies(std::vector<media::AudioProductStrategy> * _aidl_return)2450*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::listAudioProductStrategies(
2451*ec779b8eSAndroid Build Coastguard Worker         std::vector<media::AudioProductStrategy>* _aidl_return) {
2452*ec779b8eSAndroid Build Coastguard Worker     AudioProductStrategyVector strategies;
2453*ec779b8eSAndroid Build Coastguard Worker 
2454*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2455*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2456*ec779b8eSAndroid Build Coastguard Worker     }
2457*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2458*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(
2459*ec779b8eSAndroid Build Coastguard Worker             binderStatusFromStatusT(mAudioPolicyManager->listAudioProductStrategies(strategies)));
2460*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2461*ec779b8eSAndroid Build Coastguard Worker             convertContainer<std::vector<media::AudioProductStrategy>>(
2462*ec779b8eSAndroid Build Coastguard Worker                     strategies,
2463*ec779b8eSAndroid Build Coastguard Worker                     legacy2aidl_AudioProductStrategy));
2464*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2465*ec779b8eSAndroid Build Coastguard Worker }
2466*ec779b8eSAndroid Build Coastguard Worker 
getProductStrategyFromAudioAttributes(const media::audio::common::AudioAttributes & aaAidl,bool fallbackOnDefault,int32_t * _aidl_return)2467*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getProductStrategyFromAudioAttributes(
2468*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioAttributes& aaAidl,
2469*ec779b8eSAndroid Build Coastguard Worker         bool fallbackOnDefault, int32_t* _aidl_return) {
2470*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
2471*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(aaAidl));
2472*ec779b8eSAndroid Build Coastguard Worker     product_strategy_t productStrategy;
2473*ec779b8eSAndroid Build Coastguard Worker 
2474*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2475*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2476*ec779b8eSAndroid Build Coastguard Worker     }
2477*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2478*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2479*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getProductStrategyFromAudioAttributes(
2480*ec779b8eSAndroid Build Coastguard Worker                     aa, productStrategy, fallbackOnDefault)));
2481*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2482*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_product_strategy_t_int32_t(productStrategy));
2483*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2484*ec779b8eSAndroid Build Coastguard Worker }
2485*ec779b8eSAndroid Build Coastguard Worker 
listAudioVolumeGroups(std::vector<media::AudioVolumeGroup> * _aidl_return)2486*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::listAudioVolumeGroups(std::vector<media::AudioVolumeGroup>* _aidl_return)
2487*ec779b8eSAndroid Build Coastguard Worker {
2488*ec779b8eSAndroid Build Coastguard Worker     AudioVolumeGroupVector groups;
2489*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2490*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2491*ec779b8eSAndroid Build Coastguard Worker     }
2492*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2493*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(
2494*ec779b8eSAndroid Build Coastguard Worker             binderStatusFromStatusT(mAudioPolicyManager->listAudioVolumeGroups(groups)));
2495*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2496*ec779b8eSAndroid Build Coastguard Worker             convertContainer<std::vector<media::AudioVolumeGroup>>(groups,
2497*ec779b8eSAndroid Build Coastguard Worker                                                                    legacy2aidl_AudioVolumeGroup));
2498*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2499*ec779b8eSAndroid Build Coastguard Worker }
2500*ec779b8eSAndroid Build Coastguard Worker 
getVolumeGroupFromAudioAttributes(const media::audio::common::AudioAttributes & aaAidl,bool fallbackOnDefault,int32_t * _aidl_return)2501*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getVolumeGroupFromAudioAttributes(
2502*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioAttributes& aaAidl,
2503*ec779b8eSAndroid Build Coastguard Worker         bool fallbackOnDefault, int32_t* _aidl_return) {
2504*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t aa = VALUE_OR_RETURN_BINDER_STATUS(
2505*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(aaAidl));
2506*ec779b8eSAndroid Build Coastguard Worker     volume_group_t volumeGroup;
2507*ec779b8eSAndroid Build Coastguard Worker 
2508*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2509*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2510*ec779b8eSAndroid Build Coastguard Worker     }
2511*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2512*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(
2513*ec779b8eSAndroid Build Coastguard Worker             binderStatusFromStatusT(
2514*ec779b8eSAndroid Build Coastguard Worker                     mAudioPolicyManager->getVolumeGroupFromAudioAttributes(
2515*ec779b8eSAndroid Build Coastguard Worker                             aa, volumeGroup, fallbackOnDefault)));
2516*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_volume_group_t_int32_t(volumeGroup));
2517*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2518*ec779b8eSAndroid Build Coastguard Worker }
2519*ec779b8eSAndroid Build Coastguard Worker 
setRttEnabled(bool enabled)2520*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setRttEnabled(bool enabled)
2521*ec779b8eSAndroid Build Coastguard Worker {
2522*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2523*ec779b8eSAndroid Build Coastguard Worker     mUidPolicy->setRttEnabled(enabled);
2524*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2525*ec779b8eSAndroid Build Coastguard Worker }
2526*ec779b8eSAndroid Build Coastguard Worker 
isCallScreenModeSupported(bool * _aidl_return)2527*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::isCallScreenModeSupported(bool* _aidl_return)
2528*ec779b8eSAndroid Build Coastguard Worker {
2529*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2530*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2531*ec779b8eSAndroid Build Coastguard Worker     }
2532*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2533*ec779b8eSAndroid Build Coastguard Worker     AutoCallerClear acc;
2534*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = mAudioPolicyManager->isCallScreenModeSupported();
2535*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2536*ec779b8eSAndroid Build Coastguard Worker }
2537*ec779b8eSAndroid Build Coastguard Worker 
setDevicesRoleForStrategy(int32_t strategyAidl,media::DeviceRole roleAidl,const std::vector<AudioDevice> & devicesAidl)2538*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setDevicesRoleForStrategy(
2539*ec779b8eSAndroid Build Coastguard Worker         int32_t strategyAidl,
2540*ec779b8eSAndroid Build Coastguard Worker         media::DeviceRole roleAidl,
2541*ec779b8eSAndroid Build Coastguard Worker         const std::vector<AudioDevice>& devicesAidl) {
2542*ec779b8eSAndroid Build Coastguard Worker     product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2543*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2544*ec779b8eSAndroid Build Coastguard Worker     device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2545*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_DeviceRole_device_role_t(roleAidl));
2546*ec779b8eSAndroid Build Coastguard Worker     AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2547*ec779b8eSAndroid Build Coastguard Worker             convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2548*ec779b8eSAndroid Build Coastguard Worker                                                         aidl2legacy_AudioDeviceTypeAddress));
2549*ec779b8eSAndroid Build Coastguard Worker 
2550*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2551*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2552*ec779b8eSAndroid Build Coastguard Worker     }
2553*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2554*ec779b8eSAndroid Build Coastguard Worker     status_t status = mAudioPolicyManager->setDevicesRoleForStrategy(strategy, role, devices);
2555*ec779b8eSAndroid Build Coastguard Worker     if (status == NO_ERROR) {
2556*ec779b8eSAndroid Build Coastguard Worker        onCheckSpatializer_l();
2557*ec779b8eSAndroid Build Coastguard Worker     }
2558*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(status);
2559*ec779b8eSAndroid Build Coastguard Worker }
2560*ec779b8eSAndroid Build Coastguard Worker 
removeDevicesRoleForStrategy(int32_t strategyAidl,media::DeviceRole roleAidl,const std::vector<AudioDevice> & devicesAidl)2561*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::removeDevicesRoleForStrategy(
2562*ec779b8eSAndroid Build Coastguard Worker         int32_t strategyAidl,
2563*ec779b8eSAndroid Build Coastguard Worker         media::DeviceRole roleAidl,
2564*ec779b8eSAndroid Build Coastguard Worker         const std::vector<AudioDevice>& devicesAidl) {
2565*ec779b8eSAndroid Build Coastguard Worker     product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2566*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2567*ec779b8eSAndroid Build Coastguard Worker     device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2568*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_DeviceRole_device_role_t(roleAidl));
2569*ec779b8eSAndroid Build Coastguard Worker     AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2570*ec779b8eSAndroid Build Coastguard Worker             convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2571*ec779b8eSAndroid Build Coastguard Worker                                                         aidl2legacy_AudioDeviceTypeAddress));
2572*ec779b8eSAndroid Build Coastguard Worker 
2573*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2574*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2575*ec779b8eSAndroid Build Coastguard Worker     }
2576*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2577*ec779b8eSAndroid Build Coastguard Worker     status_t status = mAudioPolicyManager->removeDevicesRoleForStrategy(strategy, role, devices);
2578*ec779b8eSAndroid Build Coastguard Worker     if (status == NO_ERROR) {
2579*ec779b8eSAndroid Build Coastguard Worker        onCheckSpatializer_l();
2580*ec779b8eSAndroid Build Coastguard Worker     }
2581*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(status);
2582*ec779b8eSAndroid Build Coastguard Worker }
2583*ec779b8eSAndroid Build Coastguard Worker 
clearDevicesRoleForStrategy(int32_t strategyAidl,media::DeviceRole roleAidl)2584*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::clearDevicesRoleForStrategy(int32_t strategyAidl,
2585*ec779b8eSAndroid Build Coastguard Worker                                                            media::DeviceRole roleAidl) {
2586*ec779b8eSAndroid Build Coastguard Worker      product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2587*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2588*ec779b8eSAndroid Build Coastguard Worker     device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2589*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_DeviceRole_device_role_t(roleAidl));
2590*ec779b8eSAndroid Build Coastguard Worker    if (mAudioPolicyManager == NULL) {
2591*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2592*ec779b8eSAndroid Build Coastguard Worker     }
2593*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2594*ec779b8eSAndroid Build Coastguard Worker     status_t status = mAudioPolicyManager->clearDevicesRoleForStrategy(strategy, role);
2595*ec779b8eSAndroid Build Coastguard Worker     if (status == NO_ERROR) {
2596*ec779b8eSAndroid Build Coastguard Worker        onCheckSpatializer_l();
2597*ec779b8eSAndroid Build Coastguard Worker     }
2598*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(status);
2599*ec779b8eSAndroid Build Coastguard Worker }
2600*ec779b8eSAndroid Build Coastguard Worker 
getDevicesForRoleAndStrategy(int32_t strategyAidl,media::DeviceRole roleAidl,std::vector<AudioDevice> * _aidl_return)2601*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getDevicesForRoleAndStrategy(
2602*ec779b8eSAndroid Build Coastguard Worker         int32_t strategyAidl,
2603*ec779b8eSAndroid Build Coastguard Worker         media::DeviceRole roleAidl,
2604*ec779b8eSAndroid Build Coastguard Worker         std::vector<AudioDevice>* _aidl_return) {
2605*ec779b8eSAndroid Build Coastguard Worker     product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
2606*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_product_strategy_t(strategyAidl));
2607*ec779b8eSAndroid Build Coastguard Worker     device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2608*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_DeviceRole_device_role_t(roleAidl));
2609*ec779b8eSAndroid Build Coastguard Worker     AudioDeviceTypeAddrVector devices;
2610*ec779b8eSAndroid Build Coastguard Worker 
2611*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == NULL) {
2612*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2613*ec779b8eSAndroid Build Coastguard Worker     }
2614*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2615*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2616*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getDevicesForRoleAndStrategy(strategy, role, devices)));
2617*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2618*ec779b8eSAndroid Build Coastguard Worker             convertContainer<std::vector<AudioDevice>>(devices,
2619*ec779b8eSAndroid Build Coastguard Worker                                                        legacy2aidl_AudioDeviceTypeAddress));
2620*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2621*ec779b8eSAndroid Build Coastguard Worker }
2622*ec779b8eSAndroid Build Coastguard Worker 
registerSoundTriggerCaptureStateListener(const sp<media::ICaptureStateListener> & listener,bool * _aidl_return)2623*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::registerSoundTriggerCaptureStateListener(
2624*ec779b8eSAndroid Build Coastguard Worker         const sp<media::ICaptureStateListener>& listener, bool* _aidl_return) {
2625*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = mCaptureStateNotifier.RegisterListener(listener);
2626*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2627*ec779b8eSAndroid Build Coastguard Worker }
2628*ec779b8eSAndroid Build Coastguard Worker 
setDevicesRoleForCapturePreset(AudioSource audioSourceAidl,media::DeviceRole roleAidl,const std::vector<AudioDevice> & devicesAidl)2629*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setDevicesRoleForCapturePreset(
2630*ec779b8eSAndroid Build Coastguard Worker         AudioSource audioSourceAidl,
2631*ec779b8eSAndroid Build Coastguard Worker         media::DeviceRole roleAidl,
2632*ec779b8eSAndroid Build Coastguard Worker         const std::vector<AudioDevice>& devicesAidl) {
2633*ec779b8eSAndroid Build Coastguard Worker     audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2634*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
2635*ec779b8eSAndroid Build Coastguard Worker     device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2636*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_DeviceRole_device_role_t(roleAidl));
2637*ec779b8eSAndroid Build Coastguard Worker     AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2638*ec779b8eSAndroid Build Coastguard Worker             convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2639*ec779b8eSAndroid Build Coastguard Worker                                                         aidl2legacy_AudioDeviceTypeAddress));
2640*ec779b8eSAndroid Build Coastguard Worker 
2641*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2642*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2643*ec779b8eSAndroid Build Coastguard Worker     }
2644*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2645*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
2646*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->setDevicesRoleForCapturePreset(audioSource, role, devices));
2647*ec779b8eSAndroid Build Coastguard Worker }
2648*ec779b8eSAndroid Build Coastguard Worker 
addDevicesRoleForCapturePreset(AudioSource audioSourceAidl,media::DeviceRole roleAidl,const std::vector<AudioDevice> & devicesAidl)2649*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::addDevicesRoleForCapturePreset(
2650*ec779b8eSAndroid Build Coastguard Worker         AudioSource audioSourceAidl,
2651*ec779b8eSAndroid Build Coastguard Worker         media::DeviceRole roleAidl,
2652*ec779b8eSAndroid Build Coastguard Worker         const std::vector<AudioDevice>& devicesAidl) {
2653*ec779b8eSAndroid Build Coastguard Worker     audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2654*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
2655*ec779b8eSAndroid Build Coastguard Worker     device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2656*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_DeviceRole_device_role_t(roleAidl));
2657*ec779b8eSAndroid Build Coastguard Worker     AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2658*ec779b8eSAndroid Build Coastguard Worker             convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2659*ec779b8eSAndroid Build Coastguard Worker                                                         aidl2legacy_AudioDeviceTypeAddress));
2660*ec779b8eSAndroid Build Coastguard Worker 
2661*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2662*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2663*ec779b8eSAndroid Build Coastguard Worker     }
2664*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2665*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
2666*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->addDevicesRoleForCapturePreset(audioSource, role, devices));
2667*ec779b8eSAndroid Build Coastguard Worker }
2668*ec779b8eSAndroid Build Coastguard Worker 
removeDevicesRoleForCapturePreset(AudioSource audioSourceAidl,media::DeviceRole roleAidl,const std::vector<AudioDevice> & devicesAidl)2669*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::removeDevicesRoleForCapturePreset(
2670*ec779b8eSAndroid Build Coastguard Worker         AudioSource audioSourceAidl,
2671*ec779b8eSAndroid Build Coastguard Worker         media::DeviceRole roleAidl,
2672*ec779b8eSAndroid Build Coastguard Worker         const std::vector<AudioDevice>& devicesAidl) {
2673*ec779b8eSAndroid Build Coastguard Worker     audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2674*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
2675*ec779b8eSAndroid Build Coastguard Worker     device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2676*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_DeviceRole_device_role_t(roleAidl));
2677*ec779b8eSAndroid Build Coastguard Worker     AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2678*ec779b8eSAndroid Build Coastguard Worker             convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2679*ec779b8eSAndroid Build Coastguard Worker                                                         aidl2legacy_AudioDeviceTypeAddress));
2680*ec779b8eSAndroid Build Coastguard Worker 
2681*ec779b8eSAndroid Build Coastguard Worker    if (mAudioPolicyManager == nullptr) {
2682*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2683*ec779b8eSAndroid Build Coastguard Worker     }
2684*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2685*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
2686*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->removeDevicesRoleForCapturePreset(audioSource, role, devices));
2687*ec779b8eSAndroid Build Coastguard Worker }
2688*ec779b8eSAndroid Build Coastguard Worker 
clearDevicesRoleForCapturePreset(AudioSource audioSourceAidl,media::DeviceRole roleAidl)2689*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::clearDevicesRoleForCapturePreset(AudioSource audioSourceAidl,
2690*ec779b8eSAndroid Build Coastguard Worker                                                             media::DeviceRole roleAidl) {
2691*ec779b8eSAndroid Build Coastguard Worker     audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2692*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
2693*ec779b8eSAndroid Build Coastguard Worker     device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2694*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_DeviceRole_device_role_t(roleAidl));
2695*ec779b8eSAndroid Build Coastguard Worker 
2696*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2697*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2698*ec779b8eSAndroid Build Coastguard Worker     }
2699*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2700*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
2701*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->clearDevicesRoleForCapturePreset(audioSource, role));
2702*ec779b8eSAndroid Build Coastguard Worker }
2703*ec779b8eSAndroid Build Coastguard Worker 
getDevicesForRoleAndCapturePreset(AudioSource audioSourceAidl,media::DeviceRole roleAidl,std::vector<AudioDevice> * _aidl_return)2704*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getDevicesForRoleAndCapturePreset(
2705*ec779b8eSAndroid Build Coastguard Worker         AudioSource audioSourceAidl,
2706*ec779b8eSAndroid Build Coastguard Worker         media::DeviceRole roleAidl,
2707*ec779b8eSAndroid Build Coastguard Worker         std::vector<AudioDevice>* _aidl_return) {
2708*ec779b8eSAndroid Build Coastguard Worker     audio_source_t audioSource = VALUE_OR_RETURN_BINDER_STATUS(
2709*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioSource_audio_source_t(audioSourceAidl));
2710*ec779b8eSAndroid Build Coastguard Worker     device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
2711*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_DeviceRole_device_role_t(roleAidl));
2712*ec779b8eSAndroid Build Coastguard Worker     AudioDeviceTypeAddrVector devices;
2713*ec779b8eSAndroid Build Coastguard Worker 
2714*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2715*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2716*ec779b8eSAndroid Build Coastguard Worker     }
2717*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2718*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2719*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getDevicesForRoleAndCapturePreset(audioSource, role, devices)));
2720*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2721*ec779b8eSAndroid Build Coastguard Worker             convertContainer<std::vector<AudioDevice>>(devices,
2722*ec779b8eSAndroid Build Coastguard Worker                                                        legacy2aidl_AudioDeviceTypeAddress));
2723*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2724*ec779b8eSAndroid Build Coastguard Worker }
2725*ec779b8eSAndroid Build Coastguard Worker 
getSpatializer(const sp<media::INativeSpatializerCallback> & callback,media::GetSpatializerResponse * _aidl_return)2726*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getSpatializer(
2727*ec779b8eSAndroid Build Coastguard Worker         const sp<media::INativeSpatializerCallback>& callback,
2728*ec779b8eSAndroid Build Coastguard Worker         media::GetSpatializerResponse* _aidl_return) {
2729*ec779b8eSAndroid Build Coastguard Worker     _aidl_return->spatializer = nullptr;
2730*ec779b8eSAndroid Build Coastguard Worker     if (callback == nullptr) {
2731*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(BAD_VALUE);
2732*ec779b8eSAndroid Build Coastguard Worker     }
2733*ec779b8eSAndroid Build Coastguard Worker     if (mSpatializer != nullptr) {
2734*ec779b8eSAndroid Build Coastguard Worker         RETURN_IF_BINDER_ERROR(
2735*ec779b8eSAndroid Build Coastguard Worker                 binderStatusFromStatusT(mSpatializer->registerCallback(callback)));
2736*ec779b8eSAndroid Build Coastguard Worker         _aidl_return->spatializer = mSpatializer;
2737*ec779b8eSAndroid Build Coastguard Worker     }
2738*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2739*ec779b8eSAndroid Build Coastguard Worker }
2740*ec779b8eSAndroid Build Coastguard Worker 
canBeSpatialized(const std::optional<media::audio::common::AudioAttributes> & attrAidl,const std::optional<AudioConfig> & configAidl,const std::vector<AudioDevice> & devicesAidl,bool * _aidl_return)2741*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::canBeSpatialized(
2742*ec779b8eSAndroid Build Coastguard Worker         const std::optional<media::audio::common::AudioAttributes>& attrAidl,
2743*ec779b8eSAndroid Build Coastguard Worker         const std::optional<AudioConfig>& configAidl,
2744*ec779b8eSAndroid Build Coastguard Worker         const std::vector<AudioDevice>& devicesAidl,
2745*ec779b8eSAndroid Build Coastguard Worker         bool* _aidl_return) {
2746*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2747*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2748*ec779b8eSAndroid Build Coastguard Worker     }
2749*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t attr = AUDIO_ATTRIBUTES_INITIALIZER;
2750*ec779b8eSAndroid Build Coastguard Worker     if (attrAidl.has_value()) {
2751*ec779b8eSAndroid Build Coastguard Worker         attr = VALUE_OR_RETURN_BINDER_STATUS(
2752*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl.value()));
2753*ec779b8eSAndroid Build Coastguard Worker     }
2754*ec779b8eSAndroid Build Coastguard Worker     audio_config_t config = AUDIO_CONFIG_INITIALIZER;
2755*ec779b8eSAndroid Build Coastguard Worker     if (configAidl.has_value()) {
2756*ec779b8eSAndroid Build Coastguard Worker         config = VALUE_OR_RETURN_BINDER_STATUS(
2757*ec779b8eSAndroid Build Coastguard Worker                                     aidl2legacy_AudioConfig_audio_config_t(configAidl.value(),
2758*ec779b8eSAndroid Build Coastguard Worker                                     false /*isInput*/));
2759*ec779b8eSAndroid Build Coastguard Worker     }
2760*ec779b8eSAndroid Build Coastguard Worker     AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
2761*ec779b8eSAndroid Build Coastguard Worker             convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
2762*ec779b8eSAndroid Build Coastguard Worker                                                         aidl2legacy_AudioDeviceTypeAddress));
2763*ec779b8eSAndroid Build Coastguard Worker 
2764*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2765*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = mAudioPolicyManager->canBeSpatialized(&attr, &config, devices);
2766*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2767*ec779b8eSAndroid Build Coastguard Worker }
2768*ec779b8eSAndroid Build Coastguard Worker 
getDirectPlaybackSupport(const media::audio::common::AudioAttributes & attrAidl,const AudioConfig & configAidl,media::AudioDirectMode * _aidl_return)2769*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getDirectPlaybackSupport(
2770*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioAttributes &attrAidl,
2771*ec779b8eSAndroid Build Coastguard Worker         const AudioConfig &configAidl,
2772*ec779b8eSAndroid Build Coastguard Worker         media::AudioDirectMode *_aidl_return) {
2773*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2774*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2775*ec779b8eSAndroid Build Coastguard Worker     }
2776*ec779b8eSAndroid Build Coastguard Worker     if (_aidl_return == nullptr) {
2777*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(BAD_VALUE);
2778*ec779b8eSAndroid Build Coastguard Worker     }
2779*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
2780*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
2781*ec779b8eSAndroid Build Coastguard Worker     audio_config_t config = VALUE_OR_RETURN_BINDER_STATUS(
2782*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioConfig_audio_config_t(configAidl, false /*isInput*/));
2783*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2784*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = static_cast<media::AudioDirectMode>(
2785*ec779b8eSAndroid Build Coastguard Worker             VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_audio_direct_mode_t_int32_t_mask(
2786*ec779b8eSAndroid Build Coastguard Worker                     mAudioPolicyManager->getDirectPlaybackSupport(&attr, &config))));
2787*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2788*ec779b8eSAndroid Build Coastguard Worker }
2789*ec779b8eSAndroid Build Coastguard Worker 
getDirectProfilesForAttributes(const media::audio::common::AudioAttributes & attrAidl,std::vector<media::audio::common::AudioProfile> * _aidl_return)2790*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getDirectProfilesForAttributes(
2791*ec779b8eSAndroid Build Coastguard Worker                                 const media::audio::common::AudioAttributes& attrAidl,
2792*ec779b8eSAndroid Build Coastguard Worker                                 std::vector<media::audio::common::AudioProfile>* _aidl_return) {
2793*ec779b8eSAndroid Build Coastguard Worker    if (mAudioPolicyManager == nullptr) {
2794*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2795*ec779b8eSAndroid Build Coastguard Worker     }
2796*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t attr = VALUE_OR_RETURN_BINDER_STATUS(
2797*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
2798*ec779b8eSAndroid Build Coastguard Worker     AudioProfileVector audioProfiles;
2799*ec779b8eSAndroid Build Coastguard Worker 
2800*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2801*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
2802*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getDirectProfilesForAttributes(&attr, audioProfiles)));
2803*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2804*ec779b8eSAndroid Build Coastguard Worker             convertContainer<std::vector<media::audio::common::AudioProfile>>(
2805*ec779b8eSAndroid Build Coastguard Worker                 audioProfiles, legacy2aidl_AudioProfile_common, false /*isInput*/));
2806*ec779b8eSAndroid Build Coastguard Worker 
2807*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2808*ec779b8eSAndroid Build Coastguard Worker }
2809*ec779b8eSAndroid Build Coastguard Worker 
getSupportedMixerAttributes(int32_t portIdAidl,std::vector<media::AudioMixerAttributesInternal> * _aidl_return)2810*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getSupportedMixerAttributes(
2811*ec779b8eSAndroid Build Coastguard Worker         int32_t portIdAidl, std::vector<media::AudioMixerAttributesInternal>* _aidl_return) {
2812*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2813*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2814*ec779b8eSAndroid Build Coastguard Worker     }
2815*ec779b8eSAndroid Build Coastguard Worker 
2816*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2817*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2818*ec779b8eSAndroid Build Coastguard Worker 
2819*ec779b8eSAndroid Build Coastguard Worker     std::vector<audio_mixer_attributes_t> mixerAttrs;
2820*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2821*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(
2822*ec779b8eSAndroid Build Coastguard Worker             binderStatusFromStatusT(mAudioPolicyManager->getSupportedMixerAttributes(
2823*ec779b8eSAndroid Build Coastguard Worker                     portId, mixerAttrs)));
2824*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2825*ec779b8eSAndroid Build Coastguard Worker             convertContainer<std::vector<media::AudioMixerAttributesInternal>>(
2826*ec779b8eSAndroid Build Coastguard Worker                     mixerAttrs,
2827*ec779b8eSAndroid Build Coastguard Worker                     legacy2aidl_audio_mixer_attributes_t_AudioMixerAttributesInternal));
2828*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2829*ec779b8eSAndroid Build Coastguard Worker }
2830*ec779b8eSAndroid Build Coastguard Worker 
setPreferredMixerAttributes(const media::audio::common::AudioAttributes & attrAidl,int32_t portIdAidl,int32_t uidAidl,const media::AudioMixerAttributesInternal & mixerAttrAidl)2831*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::setPreferredMixerAttributes(
2832*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioAttributes& attrAidl,
2833*ec779b8eSAndroid Build Coastguard Worker         int32_t portIdAidl,
2834*ec779b8eSAndroid Build Coastguard Worker         int32_t uidAidl,
2835*ec779b8eSAndroid Build Coastguard Worker         const media::AudioMixerAttributesInternal& mixerAttrAidl) {
2836*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2837*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2838*ec779b8eSAndroid Build Coastguard Worker     }
2839*ec779b8eSAndroid Build Coastguard Worker 
2840*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t  attr = VALUE_OR_RETURN_BINDER_STATUS(
2841*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
2842*ec779b8eSAndroid Build Coastguard Worker     audio_mixer_attributes_t mixerAttr = VALUE_OR_RETURN_BINDER_STATUS(
2843*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioMixerAttributesInternal_audio_mixer_attributes_t(mixerAttrAidl));
2844*ec779b8eSAndroid Build Coastguard Worker     uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2845*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2846*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2847*ec779b8eSAndroid Build Coastguard Worker 
2848*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2849*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
2850*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->setPreferredMixerAttributes(&attr, portId, uid, &mixerAttr));
2851*ec779b8eSAndroid Build Coastguard Worker }
2852*ec779b8eSAndroid Build Coastguard Worker 
getPreferredMixerAttributes(const media::audio::common::AudioAttributes & attrAidl,int32_t portIdAidl,std::optional<media::AudioMixerAttributesInternal> * _aidl_return)2853*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getPreferredMixerAttributes(
2854*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioAttributes& attrAidl,
2855*ec779b8eSAndroid Build Coastguard Worker         int32_t portIdAidl,
2856*ec779b8eSAndroid Build Coastguard Worker         std::optional<media::AudioMixerAttributesInternal>* _aidl_return) {
2857*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2858*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2859*ec779b8eSAndroid Build Coastguard Worker     }
2860*ec779b8eSAndroid Build Coastguard Worker 
2861*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t  attr = VALUE_OR_RETURN_BINDER_STATUS(
2862*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
2863*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2864*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2865*ec779b8eSAndroid Build Coastguard Worker 
2866*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2867*ec779b8eSAndroid Build Coastguard Worker     audio_mixer_attributes_t mixerAttr = AUDIO_MIXER_ATTRIBUTES_INITIALIZER;
2868*ec779b8eSAndroid Build Coastguard Worker     RETURN_IF_BINDER_ERROR(
2869*ec779b8eSAndroid Build Coastguard Worker             binderStatusFromStatusT(mAudioPolicyManager->getPreferredMixerAttributes(
2870*ec779b8eSAndroid Build Coastguard Worker                     &attr, portId, &mixerAttr)));
2871*ec779b8eSAndroid Build Coastguard Worker     *_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
2872*ec779b8eSAndroid Build Coastguard Worker             legacy2aidl_audio_mixer_attributes_t_AudioMixerAttributesInternal(mixerAttr));
2873*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2874*ec779b8eSAndroid Build Coastguard Worker }
2875*ec779b8eSAndroid Build Coastguard Worker 
clearPreferredMixerAttributes(const media::audio::common::AudioAttributes & attrAidl,int32_t portIdAidl,int32_t uidAidl)2876*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::clearPreferredMixerAttributes(
2877*ec779b8eSAndroid Build Coastguard Worker         const media::audio::common::AudioAttributes& attrAidl,
2878*ec779b8eSAndroid Build Coastguard Worker         int32_t portIdAidl,
2879*ec779b8eSAndroid Build Coastguard Worker         int32_t uidAidl) {
2880*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2881*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2882*ec779b8eSAndroid Build Coastguard Worker     }
2883*ec779b8eSAndroid Build Coastguard Worker 
2884*ec779b8eSAndroid Build Coastguard Worker     audio_attributes_t  attr = VALUE_OR_RETURN_BINDER_STATUS(
2885*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_AudioAttributes_audio_attributes_t(attrAidl));
2886*ec779b8eSAndroid Build Coastguard Worker     uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl));
2887*ec779b8eSAndroid Build Coastguard Worker     audio_port_handle_t portId = VALUE_OR_RETURN_BINDER_STATUS(
2888*ec779b8eSAndroid Build Coastguard Worker             aidl2legacy_int32_t_audio_port_handle_t(portIdAidl));
2889*ec779b8eSAndroid Build Coastguard Worker 
2890*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2891*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
2892*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->clearPreferredMixerAttributes(&attr, portId, uid));
2893*ec779b8eSAndroid Build Coastguard Worker }
2894*ec779b8eSAndroid Build Coastguard Worker 
getPermissionController(sp<INativePermissionController> * out)2895*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getPermissionController(sp<INativePermissionController>* out) {
2896*ec779b8eSAndroid Build Coastguard Worker     *out = mPermissionController;
2897*ec779b8eSAndroid Build Coastguard Worker     return Status::ok();
2898*ec779b8eSAndroid Build Coastguard Worker }
2899*ec779b8eSAndroid Build Coastguard Worker 
getMmapPolicyInfos(AudioMMapPolicyType policyType,std::vector<AudioMMapPolicyInfo> * _aidl_return)2900*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getMmapPolicyInfos(
2901*ec779b8eSAndroid Build Coastguard Worker         AudioMMapPolicyType policyType, std::vector<AudioMMapPolicyInfo> *_aidl_return) {
2902*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2903*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2904*ec779b8eSAndroid Build Coastguard Worker     }
2905*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2906*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
2907*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getMmapPolicyInfos(policyType, _aidl_return));
2908*ec779b8eSAndroid Build Coastguard Worker }
2909*ec779b8eSAndroid Build Coastguard Worker 
getMmapPolicyForDevice(AudioMMapPolicyType policyType,AudioMMapPolicyInfo * policyInfo)2910*ec779b8eSAndroid Build Coastguard Worker Status AudioPolicyService::getMmapPolicyForDevice(
2911*ec779b8eSAndroid Build Coastguard Worker         AudioMMapPolicyType policyType, AudioMMapPolicyInfo *policyInfo) {
2912*ec779b8eSAndroid Build Coastguard Worker     if (mAudioPolicyManager == nullptr) {
2913*ec779b8eSAndroid Build Coastguard Worker         return binderStatusFromStatusT(NO_INIT);
2914*ec779b8eSAndroid Build Coastguard Worker     }
2915*ec779b8eSAndroid Build Coastguard Worker     audio_utils::lock_guard _l(mMutex);
2916*ec779b8eSAndroid Build Coastguard Worker     return binderStatusFromStatusT(
2917*ec779b8eSAndroid Build Coastguard Worker             mAudioPolicyManager->getMmapPolicyForDevice(policyType, policyInfo));
2918*ec779b8eSAndroid Build Coastguard Worker }
2919*ec779b8eSAndroid Build Coastguard Worker 
2920*ec779b8eSAndroid Build Coastguard Worker } // namespace android
2921