xref: /aosp_15_r20/frameworks/av/services/audiopolicy/service/AudioPolicyService.h (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 #ifndef ANDROID_AUDIOPOLICYSERVICE_H
18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_AUDIOPOLICYSERVICE_H
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <android/media/BnAudioPolicyService.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <android/media/GetSpatializerResponse.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <android-base/thread_annotations.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <audio_utils/mutex.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <com/android/media/permission/INativePermissionController.h>
25*ec779b8eSAndroid Build Coastguard Worker #include <cutils/misc.h>
26*ec779b8eSAndroid Build Coastguard Worker #include <cutils/config_utils.h>
27*ec779b8eSAndroid Build Coastguard Worker #include <cutils/compiler.h>
28*ec779b8eSAndroid Build Coastguard Worker #include <utils/String8.h>
29*ec779b8eSAndroid Build Coastguard Worker #include <utils/Vector.h>
30*ec779b8eSAndroid Build Coastguard Worker #include <utils/SortedVector.h>
31*ec779b8eSAndroid Build Coastguard Worker #include <binder/ActivityManager.h>
32*ec779b8eSAndroid Build Coastguard Worker #include <binder/BinderService.h>
33*ec779b8eSAndroid Build Coastguard Worker #include <binder/IUidObserver.h>
34*ec779b8eSAndroid Build Coastguard Worker #include <system/audio.h>
35*ec779b8eSAndroid Build Coastguard Worker #include <system/audio_policy.h>
36*ec779b8eSAndroid Build Coastguard Worker #include <media/ToneGenerator.h>
37*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioEffect.h>
38*ec779b8eSAndroid Build Coastguard Worker #include <media/AudioPolicy.h>
39*ec779b8eSAndroid Build Coastguard Worker #include <media/IAudioPolicyServiceLocal.h>
40*ec779b8eSAndroid Build Coastguard Worker #include <media/NativePermissionController.h>
41*ec779b8eSAndroid Build Coastguard Worker #include <media/UsecaseValidator.h>
42*ec779b8eSAndroid Build Coastguard Worker #include <mediautils/ServiceUtilities.h>
43*ec779b8eSAndroid Build Coastguard Worker #include "AudioPolicyEffects.h"
44*ec779b8eSAndroid Build Coastguard Worker #include "CaptureStateNotifier.h"
45*ec779b8eSAndroid Build Coastguard Worker #include "Spatializer.h"
46*ec779b8eSAndroid Build Coastguard Worker #include <AudioPolicyInterface.h>
47*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/BnSensorPrivacyListener.h>
48*ec779b8eSAndroid Build Coastguard Worker #include <android/content/AttributionSourceState.h>
49*ec779b8eSAndroid Build Coastguard Worker 
50*ec779b8eSAndroid Build Coastguard Worker #include <numeric>
51*ec779b8eSAndroid Build Coastguard Worker #include <unordered_map>
52*ec779b8eSAndroid Build Coastguard Worker 
53*ec779b8eSAndroid Build Coastguard Worker namespace android {
54*ec779b8eSAndroid Build Coastguard Worker 
55*ec779b8eSAndroid Build Coastguard Worker using content::AttributionSourceState;
56*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioConfig;
57*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioConfigBase;
58*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDevice;
59*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioDeviceDescription;
60*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioFormatDescription;
61*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioMMapPolicyInfo;
62*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioMMapPolicyType;
63*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioMode;
64*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioSource;
65*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioStreamType;
66*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioUsage;
67*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::AudioUuid;
68*ec779b8eSAndroid Build Coastguard Worker using media::audio::common::Int;
69*ec779b8eSAndroid Build Coastguard Worker 
70*ec779b8eSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------
71*ec779b8eSAndroid Build Coastguard Worker 
72*ec779b8eSAndroid Build Coastguard Worker namespace media::audiopolicy {
73*ec779b8eSAndroid Build Coastguard Worker     class AudioRecordClient;
74*ec779b8eSAndroid Build Coastguard Worker }
75*ec779b8eSAndroid Build Coastguard Worker 
76*ec779b8eSAndroid Build Coastguard Worker using ::android::media::audiopolicy::AudioRecordClient;
77*ec779b8eSAndroid Build Coastguard Worker using ::com::android::media::permission::INativePermissionController;
78*ec779b8eSAndroid Build Coastguard Worker using ::com::android::media::permission::NativePermissionController;
79*ec779b8eSAndroid Build Coastguard Worker using ::com::android::media::permission::IPermissionProvider;
80*ec779b8eSAndroid Build Coastguard Worker 
81*ec779b8eSAndroid Build Coastguard Worker class AudioPolicyService :
82*ec779b8eSAndroid Build Coastguard Worker     public BinderService<AudioPolicyService>,
83*ec779b8eSAndroid Build Coastguard Worker     public media::BnAudioPolicyService,
84*ec779b8eSAndroid Build Coastguard Worker     public IBinder::DeathRecipient,
85*ec779b8eSAndroid Build Coastguard Worker     public SpatializerPolicyCallback,
86*ec779b8eSAndroid Build Coastguard Worker     public media::IAudioPolicyServiceLocal
87*ec779b8eSAndroid Build Coastguard Worker {
88*ec779b8eSAndroid Build Coastguard Worker     friend class sp<AudioPolicyService>;
89*ec779b8eSAndroid Build Coastguard Worker 
90*ec779b8eSAndroid Build Coastguard Worker public:
91*ec779b8eSAndroid Build Coastguard Worker     // for BinderService
getServiceName()92*ec779b8eSAndroid Build Coastguard Worker     static const char *getServiceName() ANDROID_API { return "media.audio_policy"; }
93*ec779b8eSAndroid Build Coastguard Worker 
94*ec779b8eSAndroid Build Coastguard Worker     virtual status_t    dump(int fd, const Vector<String16>& args);
95*ec779b8eSAndroid Build Coastguard Worker 
96*ec779b8eSAndroid Build Coastguard Worker     //
97*ec779b8eSAndroid Build Coastguard Worker     // BnAudioPolicyService (see AudioPolicyInterface for method descriptions)
98*ec779b8eSAndroid Build Coastguard Worker     //
99*ec779b8eSAndroid Build Coastguard Worker     binder::Status onNewAudioModulesAvailable() override;
100*ec779b8eSAndroid Build Coastguard Worker     binder::Status setDeviceConnectionState(
101*ec779b8eSAndroid Build Coastguard Worker             media::AudioPolicyDeviceState state,
102*ec779b8eSAndroid Build Coastguard Worker             const android::media::audio::common::AudioPort& port,
103*ec779b8eSAndroid Build Coastguard Worker             const AudioFormatDescription& encodedFormat) override;
104*ec779b8eSAndroid Build Coastguard Worker     binder::Status getDeviceConnectionState(const AudioDevice& device,
105*ec779b8eSAndroid Build Coastguard Worker                                             media::AudioPolicyDeviceState* _aidl_return) override;
106*ec779b8eSAndroid Build Coastguard Worker     binder::Status handleDeviceConfigChange(
107*ec779b8eSAndroid Build Coastguard Worker             const AudioDevice& device,
108*ec779b8eSAndroid Build Coastguard Worker             const std::string& deviceName,
109*ec779b8eSAndroid Build Coastguard Worker             const AudioFormatDescription& encodedFormat) override;
110*ec779b8eSAndroid Build Coastguard Worker     binder::Status setPhoneState(AudioMode state, int32_t uid) override;
111*ec779b8eSAndroid Build Coastguard Worker     binder::Status setForceUse(media::AudioPolicyForceUse usage,
112*ec779b8eSAndroid Build Coastguard Worker                                media::AudioPolicyForcedConfig config) override;
113*ec779b8eSAndroid Build Coastguard Worker     binder::Status getForceUse(media::AudioPolicyForceUse usage,
114*ec779b8eSAndroid Build Coastguard Worker                                media::AudioPolicyForcedConfig* _aidl_return) override;
115*ec779b8eSAndroid Build Coastguard Worker     binder::Status getOutput(AudioStreamType stream, int32_t* _aidl_return) override;
116*ec779b8eSAndroid Build Coastguard Worker     binder::Status getOutputForAttr(const media::audio::common::AudioAttributes& attr,
117*ec779b8eSAndroid Build Coastguard Worker                                     int32_t session,
118*ec779b8eSAndroid Build Coastguard Worker                                     const AttributionSourceState &attributionSource,
119*ec779b8eSAndroid Build Coastguard Worker                                     const AudioConfig& config,
120*ec779b8eSAndroid Build Coastguard Worker                                     int32_t flags, const std::vector<int32_t>& selectedDeviceIds,
121*ec779b8eSAndroid Build Coastguard Worker                                     media::GetOutputForAttrResponse* _aidl_return) override;
122*ec779b8eSAndroid Build Coastguard Worker     binder::Status startOutput(int32_t portId) override;
123*ec779b8eSAndroid Build Coastguard Worker     binder::Status stopOutput(int32_t portId) override;
124*ec779b8eSAndroid Build Coastguard Worker     binder::Status releaseOutput(int32_t portId) override;
125*ec779b8eSAndroid Build Coastguard Worker     binder::Status getInputForAttr(const media::audio::common::AudioAttributes& attr, int32_t input,
126*ec779b8eSAndroid Build Coastguard Worker                                    int32_t riid, int32_t session,
127*ec779b8eSAndroid Build Coastguard Worker                                    const AttributionSourceState &attributionSource,
128*ec779b8eSAndroid Build Coastguard Worker                                    const AudioConfigBase& config, int32_t flags,
129*ec779b8eSAndroid Build Coastguard Worker                                    int32_t selectedDeviceId,
130*ec779b8eSAndroid Build Coastguard Worker                                    media::GetInputForAttrResponse* _aidl_return) override;
131*ec779b8eSAndroid Build Coastguard Worker     binder::Status startInput(int32_t portId) override;
132*ec779b8eSAndroid Build Coastguard Worker     binder::Status stopInput(int32_t portId) override;
133*ec779b8eSAndroid Build Coastguard Worker     binder::Status releaseInput(int32_t portId) override;
134*ec779b8eSAndroid Build Coastguard Worker     binder::Status setDeviceAbsoluteVolumeEnabled(const AudioDevice& device,
135*ec779b8eSAndroid Build Coastguard Worker                                                   bool enabled,
136*ec779b8eSAndroid Build Coastguard Worker                                                   AudioStreamType streamToDriveAbs) override;
137*ec779b8eSAndroid Build Coastguard Worker     binder::Status initStreamVolume(AudioStreamType stream, int32_t indexMin,
138*ec779b8eSAndroid Build Coastguard Worker                                     int32_t indexMax) override;
139*ec779b8eSAndroid Build Coastguard Worker     binder::Status setStreamVolumeIndex(AudioStreamType stream,
140*ec779b8eSAndroid Build Coastguard Worker                                         const AudioDeviceDescription& device,
141*ec779b8eSAndroid Build Coastguard Worker                                         int32_t index, bool muted) override;
142*ec779b8eSAndroid Build Coastguard Worker     binder::Status getStreamVolumeIndex(AudioStreamType stream,
143*ec779b8eSAndroid Build Coastguard Worker                                         const AudioDeviceDescription& device,
144*ec779b8eSAndroid Build Coastguard Worker                                         int32_t* _aidl_return) override;
145*ec779b8eSAndroid Build Coastguard Worker     binder::Status setVolumeIndexForAttributes(const media::audio::common::AudioAttributes& attr,
146*ec779b8eSAndroid Build Coastguard Worker                                                const AudioDeviceDescription& device,
147*ec779b8eSAndroid Build Coastguard Worker                                                int32_t index, bool muted) override;
148*ec779b8eSAndroid Build Coastguard Worker     binder::Status getVolumeIndexForAttributes(const media::audio::common::AudioAttributes& attr,
149*ec779b8eSAndroid Build Coastguard Worker                                                const AudioDeviceDescription& device,
150*ec779b8eSAndroid Build Coastguard Worker                                                int32_t* _aidl_return) override;
151*ec779b8eSAndroid Build Coastguard Worker     binder::Status getMaxVolumeIndexForAttributes(const media::audio::common::AudioAttributes& attr,
152*ec779b8eSAndroid Build Coastguard Worker                                                   int32_t* _aidl_return) override;
153*ec779b8eSAndroid Build Coastguard Worker     binder::Status getMinVolumeIndexForAttributes(const media::audio::common::AudioAttributes& attr,
154*ec779b8eSAndroid Build Coastguard Worker                                                   int32_t* _aidl_return) override;
155*ec779b8eSAndroid Build Coastguard Worker     binder::Status getStrategyForStream(AudioStreamType stream,
156*ec779b8eSAndroid Build Coastguard Worker                                         int32_t* _aidl_return) override;
157*ec779b8eSAndroid Build Coastguard Worker     binder::Status getDevicesForAttributes(const media::audio::common::AudioAttributes& attr,
158*ec779b8eSAndroid Build Coastguard Worker                                            bool forVolume,
159*ec779b8eSAndroid Build Coastguard Worker                                            std::vector<AudioDevice>* _aidl_return) override;
160*ec779b8eSAndroid Build Coastguard Worker     binder::Status getOutputForEffect(const media::EffectDescriptor& desc,
161*ec779b8eSAndroid Build Coastguard Worker                                       int32_t* _aidl_return) override;
162*ec779b8eSAndroid Build Coastguard Worker     binder::Status registerEffect(const media::EffectDescriptor& desc, int32_t io, int32_t strategy,
163*ec779b8eSAndroid Build Coastguard Worker                                   int32_t session, int32_t id) override;
164*ec779b8eSAndroid Build Coastguard Worker     binder::Status unregisterEffect(int32_t id) override;
165*ec779b8eSAndroid Build Coastguard Worker     binder::Status setEffectEnabled(int32_t id, bool enabled) override;
166*ec779b8eSAndroid Build Coastguard Worker     binder::Status moveEffectsToIo(const std::vector<int32_t>& ids, int32_t io) override;
167*ec779b8eSAndroid Build Coastguard Worker     binder::Status isStreamActive(AudioStreamType stream, int32_t inPastMs,
168*ec779b8eSAndroid Build Coastguard Worker                                   bool* _aidl_return) override;
169*ec779b8eSAndroid Build Coastguard Worker     binder::Status isStreamActiveRemotely(AudioStreamType stream, int32_t inPastMs,
170*ec779b8eSAndroid Build Coastguard Worker                                           bool* _aidl_return) override;
171*ec779b8eSAndroid Build Coastguard Worker     binder::Status isSourceActive(AudioSource source, bool* _aidl_return) override;
172*ec779b8eSAndroid Build Coastguard Worker     binder::Status queryDefaultPreProcessing(
173*ec779b8eSAndroid Build Coastguard Worker             int32_t audioSession, Int* count,
174*ec779b8eSAndroid Build Coastguard Worker             std::vector<media::EffectDescriptor>* _aidl_return) override;
175*ec779b8eSAndroid Build Coastguard Worker     binder::Status addSourceDefaultEffect(const AudioUuid& type,
176*ec779b8eSAndroid Build Coastguard Worker                                           const std::string& opPackageName,
177*ec779b8eSAndroid Build Coastguard Worker                                           const AudioUuid& uuid, int32_t priority,
178*ec779b8eSAndroid Build Coastguard Worker                                           AudioSource source,
179*ec779b8eSAndroid Build Coastguard Worker                                           int32_t* _aidl_return) override;
180*ec779b8eSAndroid Build Coastguard Worker     binder::Status addStreamDefaultEffect(const AudioUuid& type,
181*ec779b8eSAndroid Build Coastguard Worker                                           const std::string& opPackageName,
182*ec779b8eSAndroid Build Coastguard Worker                                           const AudioUuid& uuid, int32_t priority,
183*ec779b8eSAndroid Build Coastguard Worker                                           AudioUsage usage, int32_t* _aidl_return) override;
184*ec779b8eSAndroid Build Coastguard Worker     binder::Status removeSourceDefaultEffect(int32_t id) override;
185*ec779b8eSAndroid Build Coastguard Worker     binder::Status removeStreamDefaultEffect(int32_t id) override;
186*ec779b8eSAndroid Build Coastguard Worker     binder::Status setSupportedSystemUsages(
187*ec779b8eSAndroid Build Coastguard Worker             const std::vector<AudioUsage>& systemUsages) override;
188*ec779b8eSAndroid Build Coastguard Worker     binder::Status setAllowedCapturePolicy(int32_t uid, int32_t capturePolicy) override;
189*ec779b8eSAndroid Build Coastguard Worker     binder::Status getOffloadSupport(const media::audio::common::AudioOffloadInfo& info,
190*ec779b8eSAndroid Build Coastguard Worker                                      media::AudioOffloadMode* _aidl_return) override;
191*ec779b8eSAndroid Build Coastguard Worker     binder::Status isDirectOutputSupported(const AudioConfigBase& config,
192*ec779b8eSAndroid Build Coastguard Worker                                            const media::audio::common::AudioAttributes& attributes,
193*ec779b8eSAndroid Build Coastguard Worker                                            bool* _aidl_return) override;
194*ec779b8eSAndroid Build Coastguard Worker     binder::Status listAudioPorts(media::AudioPortRole role, media::AudioPortType type,
195*ec779b8eSAndroid Build Coastguard Worker                                   Int* count, std::vector<media::AudioPortFw>* ports,
196*ec779b8eSAndroid Build Coastguard Worker                                   int32_t* _aidl_return) override;
197*ec779b8eSAndroid Build Coastguard Worker     binder::Status listDeclaredDevicePorts(media::AudioPortRole role,
198*ec779b8eSAndroid Build Coastguard Worker                                            std::vector<media::AudioPortFw>* _aidl_return) override;
199*ec779b8eSAndroid Build Coastguard Worker     binder::Status getAudioPort(int portId,
200*ec779b8eSAndroid Build Coastguard Worker                                 media::AudioPortFw* _aidl_return) override;
201*ec779b8eSAndroid Build Coastguard Worker     binder::Status createAudioPatch(const media::AudioPatchFw& patch, int32_t handle,
202*ec779b8eSAndroid Build Coastguard Worker                                     int32_t* _aidl_return) override;
203*ec779b8eSAndroid Build Coastguard Worker     binder::Status releaseAudioPatch(int32_t handle) override;
204*ec779b8eSAndroid Build Coastguard Worker     binder::Status listAudioPatches(Int* count, std::vector<media::AudioPatchFw>* patches,
205*ec779b8eSAndroid Build Coastguard Worker                                     int32_t* _aidl_return) override;
206*ec779b8eSAndroid Build Coastguard Worker     binder::Status setAudioPortConfig(const media::AudioPortConfigFw& config) override;
207*ec779b8eSAndroid Build Coastguard Worker     binder::Status registerClient(const sp<media::IAudioPolicyServiceClient>& client) override;
208*ec779b8eSAndroid Build Coastguard Worker     binder::Status setAudioPortCallbacksEnabled(bool enabled) override;
209*ec779b8eSAndroid Build Coastguard Worker     binder::Status setAudioVolumeGroupCallbacksEnabled(bool enabled) override;
210*ec779b8eSAndroid Build Coastguard Worker     binder::Status acquireSoundTriggerSession(media::SoundTriggerSession* _aidl_return) override;
211*ec779b8eSAndroid Build Coastguard Worker     binder::Status releaseSoundTriggerSession(int32_t session) override;
212*ec779b8eSAndroid Build Coastguard Worker     binder::Status getPhoneState(AudioMode* _aidl_return) override;
213*ec779b8eSAndroid Build Coastguard Worker     binder::Status registerPolicyMixes(const std::vector<media::AudioMix>& mixes,
214*ec779b8eSAndroid Build Coastguard Worker                                        bool registration) override;
215*ec779b8eSAndroid Build Coastguard Worker     binder::Status updatePolicyMixes(
216*ec779b8eSAndroid Build Coastguard Worker         const ::std::vector<::android::media::AudioMixUpdate>& updates) override;
217*ec779b8eSAndroid Build Coastguard Worker     binder::Status setUidDeviceAffinities(int32_t uid,
218*ec779b8eSAndroid Build Coastguard Worker                                           const std::vector<AudioDevice>& devices) override;
219*ec779b8eSAndroid Build Coastguard Worker     binder::Status removeUidDeviceAffinities(int32_t uid) override;
220*ec779b8eSAndroid Build Coastguard Worker     binder::Status setUserIdDeviceAffinities(
221*ec779b8eSAndroid Build Coastguard Worker             int32_t userId,
222*ec779b8eSAndroid Build Coastguard Worker             const std::vector<AudioDevice>& devices) override;
223*ec779b8eSAndroid Build Coastguard Worker     binder::Status removeUserIdDeviceAffinities(int32_t userId) override;
224*ec779b8eSAndroid Build Coastguard Worker     binder::Status startAudioSource(const media::AudioPortConfigFw& source,
225*ec779b8eSAndroid Build Coastguard Worker                                     const media::audio::common::AudioAttributes& attributes,
226*ec779b8eSAndroid Build Coastguard Worker                                     int32_t* _aidl_return) override;
227*ec779b8eSAndroid Build Coastguard Worker     binder::Status stopAudioSource(int32_t portId) override;
228*ec779b8eSAndroid Build Coastguard Worker     binder::Status setMasterMono(bool mono) override;
229*ec779b8eSAndroid Build Coastguard Worker     binder::Status getMasterMono(bool* _aidl_return) override;
230*ec779b8eSAndroid Build Coastguard Worker     binder::Status getStreamVolumeDB(AudioStreamType stream, int32_t index,
231*ec779b8eSAndroid Build Coastguard Worker                                      const AudioDeviceDescription& device,
232*ec779b8eSAndroid Build Coastguard Worker                                      float* _aidl_return) override;
233*ec779b8eSAndroid Build Coastguard Worker     binder::Status getSurroundFormats(Int* count,
234*ec779b8eSAndroid Build Coastguard Worker                                       std::vector<AudioFormatDescription>* formats,
235*ec779b8eSAndroid Build Coastguard Worker                                       std::vector<bool>* formatsEnabled) override;
236*ec779b8eSAndroid Build Coastguard Worker     binder::Status getReportedSurroundFormats(
237*ec779b8eSAndroid Build Coastguard Worker             Int* count, std::vector<AudioFormatDescription>* formats) override;
238*ec779b8eSAndroid Build Coastguard Worker     binder::Status getHwOffloadFormatsSupportedForBluetoothMedia(
239*ec779b8eSAndroid Build Coastguard Worker             const AudioDeviceDescription& device,
240*ec779b8eSAndroid Build Coastguard Worker             std::vector<AudioFormatDescription>* _aidl_return) override;
241*ec779b8eSAndroid Build Coastguard Worker     binder::Status setSurroundFormatEnabled(const AudioFormatDescription& audioFormat,
242*ec779b8eSAndroid Build Coastguard Worker                                             bool enabled) override;
243*ec779b8eSAndroid Build Coastguard Worker     binder::Status setAssistantServicesUids(const std::vector<int32_t>& uids) override;
244*ec779b8eSAndroid Build Coastguard Worker     binder::Status setActiveAssistantServicesUids(const std::vector<int32_t>& activeUids) override;
245*ec779b8eSAndroid Build Coastguard Worker     binder::Status setA11yServicesUids(const std::vector<int32_t>& uids) override;
246*ec779b8eSAndroid Build Coastguard Worker     binder::Status setCurrentImeUid(int32_t uid) override;
247*ec779b8eSAndroid Build Coastguard Worker     binder::Status isHapticPlaybackSupported(bool* _aidl_return) override;
248*ec779b8eSAndroid Build Coastguard Worker     binder::Status isUltrasoundSupported(bool* _aidl_return) override;
249*ec779b8eSAndroid Build Coastguard Worker     binder::Status isHotwordStreamSupported(bool lookbackAudio, bool* _aidl_return) override;
250*ec779b8eSAndroid Build Coastguard Worker     binder::Status listAudioProductStrategies(
251*ec779b8eSAndroid Build Coastguard Worker             std::vector<media::AudioProductStrategy>* _aidl_return) override;
252*ec779b8eSAndroid Build Coastguard Worker     binder::Status getProductStrategyFromAudioAttributes(
253*ec779b8eSAndroid Build Coastguard Worker             const media::audio::common::AudioAttributes& aa,
254*ec779b8eSAndroid Build Coastguard Worker             bool fallbackOnDefault,
255*ec779b8eSAndroid Build Coastguard Worker             int32_t* _aidl_return) override;
256*ec779b8eSAndroid Build Coastguard Worker     binder::Status listAudioVolumeGroups(
257*ec779b8eSAndroid Build Coastguard Worker             std::vector<media::AudioVolumeGroup>* _aidl_return) override;
258*ec779b8eSAndroid Build Coastguard Worker     binder::Status getVolumeGroupFromAudioAttributes(
259*ec779b8eSAndroid Build Coastguard Worker             const media::audio::common::AudioAttributes& aa,
260*ec779b8eSAndroid Build Coastguard Worker             bool fallbackOnDefault,
261*ec779b8eSAndroid Build Coastguard Worker             int32_t* _aidl_return) override;
262*ec779b8eSAndroid Build Coastguard Worker     binder::Status setRttEnabled(bool enabled) override;
263*ec779b8eSAndroid Build Coastguard Worker     binder::Status isCallScreenModeSupported(bool* _aidl_return) override;
264*ec779b8eSAndroid Build Coastguard Worker     binder::Status setDevicesRoleForStrategy(
265*ec779b8eSAndroid Build Coastguard Worker             int32_t strategy, media::DeviceRole role,
266*ec779b8eSAndroid Build Coastguard Worker             const std::vector<AudioDevice>& devices) override;
267*ec779b8eSAndroid Build Coastguard Worker     binder::Status removeDevicesRoleForStrategy(
268*ec779b8eSAndroid Build Coastguard Worker             int32_t strategy, media::DeviceRole role,
269*ec779b8eSAndroid Build Coastguard Worker             const std::vector<AudioDevice>& devices) override;
270*ec779b8eSAndroid Build Coastguard Worker     binder::Status clearDevicesRoleForStrategy(
271*ec779b8eSAndroid Build Coastguard Worker             int32_t strategy,
272*ec779b8eSAndroid Build Coastguard Worker             media::DeviceRole role) override;
273*ec779b8eSAndroid Build Coastguard Worker     binder::Status getDevicesForRoleAndStrategy(
274*ec779b8eSAndroid Build Coastguard Worker             int32_t strategy, media::DeviceRole role,
275*ec779b8eSAndroid Build Coastguard Worker             std::vector<AudioDevice>* _aidl_return) override;
276*ec779b8eSAndroid Build Coastguard Worker     binder::Status setDevicesRoleForCapturePreset(
277*ec779b8eSAndroid Build Coastguard Worker             AudioSource audioSource,
278*ec779b8eSAndroid Build Coastguard Worker             media::DeviceRole role,
279*ec779b8eSAndroid Build Coastguard Worker             const std::vector<AudioDevice>& devices) override;
280*ec779b8eSAndroid Build Coastguard Worker     binder::Status addDevicesRoleForCapturePreset(
281*ec779b8eSAndroid Build Coastguard Worker             AudioSource audioSource,
282*ec779b8eSAndroid Build Coastguard Worker             media::DeviceRole role,
283*ec779b8eSAndroid Build Coastguard Worker             const std::vector<AudioDevice>& devices) override;
284*ec779b8eSAndroid Build Coastguard Worker     binder::Status removeDevicesRoleForCapturePreset(
285*ec779b8eSAndroid Build Coastguard Worker             AudioSource audioSource,
286*ec779b8eSAndroid Build Coastguard Worker             media::DeviceRole role,
287*ec779b8eSAndroid Build Coastguard Worker             const std::vector<AudioDevice>& devices) override;
288*ec779b8eSAndroid Build Coastguard Worker     binder::Status clearDevicesRoleForCapturePreset(AudioSource audioSource,
289*ec779b8eSAndroid Build Coastguard Worker                                                     media::DeviceRole role) override;
290*ec779b8eSAndroid Build Coastguard Worker     binder::Status getDevicesForRoleAndCapturePreset(
291*ec779b8eSAndroid Build Coastguard Worker             AudioSource audioSource,
292*ec779b8eSAndroid Build Coastguard Worker             media::DeviceRole role,
293*ec779b8eSAndroid Build Coastguard Worker             std::vector<AudioDevice>* _aidl_return) override;
294*ec779b8eSAndroid Build Coastguard Worker     binder::Status registerSoundTriggerCaptureStateListener(
295*ec779b8eSAndroid Build Coastguard Worker             const sp<media::ICaptureStateListener>& listener, bool* _aidl_return) override;
296*ec779b8eSAndroid Build Coastguard Worker 
297*ec779b8eSAndroid Build Coastguard Worker     binder::Status getSpatializer(const sp<media::INativeSpatializerCallback>& callback,
298*ec779b8eSAndroid Build Coastguard Worker             media::GetSpatializerResponse* _aidl_return) override;
299*ec779b8eSAndroid Build Coastguard Worker     binder::Status canBeSpatialized(
300*ec779b8eSAndroid Build Coastguard Worker             const std::optional<media::audio::common::AudioAttributes>& attr,
301*ec779b8eSAndroid Build Coastguard Worker             const std::optional<AudioConfig>& config,
302*ec779b8eSAndroid Build Coastguard Worker             const std::vector<AudioDevice>& devices,
303*ec779b8eSAndroid Build Coastguard Worker             bool* _aidl_return) override;
304*ec779b8eSAndroid Build Coastguard Worker 
305*ec779b8eSAndroid Build Coastguard Worker     binder::Status getDirectPlaybackSupport(const media::audio::common::AudioAttributes& attr,
306*ec779b8eSAndroid Build Coastguard Worker                                             const AudioConfig& config,
307*ec779b8eSAndroid Build Coastguard Worker                                             media::AudioDirectMode* _aidl_return) override;
308*ec779b8eSAndroid Build Coastguard Worker 
309*ec779b8eSAndroid Build Coastguard Worker     binder::Status getDirectProfilesForAttributes(const media::audio::common::AudioAttributes& attr,
310*ec779b8eSAndroid Build Coastguard Worker                         std::vector<media::audio::common::AudioProfile>* _aidl_return) override;
311*ec779b8eSAndroid Build Coastguard Worker 
312*ec779b8eSAndroid Build Coastguard Worker     binder::Status getSupportedMixerAttributes(
313*ec779b8eSAndroid Build Coastguard Worker             int32_t portId,
314*ec779b8eSAndroid Build Coastguard Worker             std::vector<media::AudioMixerAttributesInternal>* _aidl_return) override;
315*ec779b8eSAndroid Build Coastguard Worker     binder::Status setPreferredMixerAttributes(
316*ec779b8eSAndroid Build Coastguard Worker             const media::audio::common::AudioAttributes& attr,
317*ec779b8eSAndroid Build Coastguard Worker             int32_t portId,
318*ec779b8eSAndroid Build Coastguard Worker             int32_t uid,
319*ec779b8eSAndroid Build Coastguard Worker             const media::AudioMixerAttributesInternal& mixerAttr) override;
320*ec779b8eSAndroid Build Coastguard Worker     binder::Status getPreferredMixerAttributes(
321*ec779b8eSAndroid Build Coastguard Worker             const media::audio::common::AudioAttributes& attr,
322*ec779b8eSAndroid Build Coastguard Worker             int32_t portId,
323*ec779b8eSAndroid Build Coastguard Worker             std::optional<media::AudioMixerAttributesInternal>* _aidl_return) override;
324*ec779b8eSAndroid Build Coastguard Worker     binder::Status clearPreferredMixerAttributes(const media::audio::common::AudioAttributes& attr,
325*ec779b8eSAndroid Build Coastguard Worker                                                  int32_t portId,
326*ec779b8eSAndroid Build Coastguard Worker                                                  int32_t uid) override;
327*ec779b8eSAndroid Build Coastguard Worker     binder::Status getRegisteredPolicyMixes(
328*ec779b8eSAndroid Build Coastguard Worker             std::vector <::android::media::AudioMix>* mixes) override;
329*ec779b8eSAndroid Build Coastguard Worker 
330*ec779b8eSAndroid Build Coastguard Worker     // Should only be called by AudioService to push permission data down to audioserver
331*ec779b8eSAndroid Build Coastguard Worker     binder::Status getPermissionController(sp<INativePermissionController>* out) override;
332*ec779b8eSAndroid Build Coastguard Worker 
333*ec779b8eSAndroid Build Coastguard Worker     binder::Status getMmapPolicyInfos(
334*ec779b8eSAndroid Build Coastguard Worker             AudioMMapPolicyType policyType,
335*ec779b8eSAndroid Build Coastguard Worker             std::vector<AudioMMapPolicyInfo>* _aidl_return) override;
336*ec779b8eSAndroid Build Coastguard Worker     binder::Status getMmapPolicyForDevice(
337*ec779b8eSAndroid Build Coastguard Worker             AudioMMapPolicyType policyType,
338*ec779b8eSAndroid Build Coastguard Worker             AudioMMapPolicyInfo* policyInfo) override;
339*ec779b8eSAndroid Build Coastguard Worker 
340*ec779b8eSAndroid Build Coastguard Worker     status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) override;
341*ec779b8eSAndroid Build Coastguard Worker 
342*ec779b8eSAndroid Build Coastguard Worker     // -- IAudioPolicyLocal methods
343*ec779b8eSAndroid Build Coastguard Worker     const IPermissionProvider& getPermissionProvider() const override;
344*ec779b8eSAndroid Build Coastguard Worker 
345*ec779b8eSAndroid Build Coastguard Worker     // IBinder::DeathRecipient
346*ec779b8eSAndroid Build Coastguard Worker     virtual     void        binderDied(const wp<IBinder>& who);
347*ec779b8eSAndroid Build Coastguard Worker 
348*ec779b8eSAndroid Build Coastguard Worker     // RefBase
349*ec779b8eSAndroid Build Coastguard Worker     virtual     void        onFirstRef();
350*ec779b8eSAndroid Build Coastguard Worker 
351*ec779b8eSAndroid Build Coastguard Worker     // Commence initialization when AudioSystem is ready.
352*ec779b8eSAndroid Build Coastguard Worker     void onAudioSystemReady();
353*ec779b8eSAndroid Build Coastguard Worker 
354*ec779b8eSAndroid Build Coastguard Worker     //
355*ec779b8eSAndroid Build Coastguard Worker     // Helpers for the struct audio_policy_service_ops implementation.
356*ec779b8eSAndroid Build Coastguard Worker     // This is used by the audio policy manager for certain operations that
357*ec779b8eSAndroid Build Coastguard Worker     // are implemented by the policy service.
358*ec779b8eSAndroid Build Coastguard Worker     //
359*ec779b8eSAndroid Build Coastguard Worker     virtual void setParameters(audio_io_handle_t ioHandle,
360*ec779b8eSAndroid Build Coastguard Worker                                const char *keyValuePairs,
361*ec779b8eSAndroid Build Coastguard Worker                                int delayMs);
362*ec779b8eSAndroid Build Coastguard Worker 
363*ec779b8eSAndroid Build Coastguard Worker     virtual status_t setStreamVolume(audio_stream_type_t stream,
364*ec779b8eSAndroid Build Coastguard Worker                                      float volume,
365*ec779b8eSAndroid Build Coastguard Worker                                      bool muted,
366*ec779b8eSAndroid Build Coastguard Worker                                      audio_io_handle_t output,
367*ec779b8eSAndroid Build Coastguard Worker                                      int delayMs = 0);
368*ec779b8eSAndroid Build Coastguard Worker 
369*ec779b8eSAndroid Build Coastguard Worker     /**
370*ec779b8eSAndroid Build Coastguard Worker      * Set a volume on AudioTrack port id(s) for a particular output.
371*ec779b8eSAndroid Build Coastguard Worker      * For the same user setting, a volume group (and associated given port of the
372*ec779b8eSAndroid Build Coastguard Worker      * client's track) can have different volumes for each output destination device
373*ec779b8eSAndroid Build Coastguard Worker      * it is attached to.
374*ec779b8eSAndroid Build Coastguard Worker      *
375*ec779b8eSAndroid Build Coastguard Worker      * @param ports to consider
376*ec779b8eSAndroid Build Coastguard Worker      * @param volume to set
377*ec779b8eSAndroid Build Coastguard Worker      * @param muted to set
378*ec779b8eSAndroid Build Coastguard Worker      * @param output to consider
379*ec779b8eSAndroid Build Coastguard Worker      * @param delayMs to use
380*ec779b8eSAndroid Build Coastguard Worker      * @return NO_ERROR if successful
381*ec779b8eSAndroid Build Coastguard Worker      */
382*ec779b8eSAndroid Build Coastguard Worker     virtual status_t setPortsVolume(const std::vector<audio_port_handle_t> &ports, float volume,
383*ec779b8eSAndroid Build Coastguard Worker             bool muted, audio_io_handle_t output, int delayMs = 0);
384*ec779b8eSAndroid Build Coastguard Worker     virtual status_t setVoiceVolume(float volume, int delayMs = 0);
385*ec779b8eSAndroid Build Coastguard Worker 
386*ec779b8eSAndroid Build Coastguard Worker     void doOnNewAudioModulesAvailable();
387*ec779b8eSAndroid Build Coastguard Worker     status_t doStopOutput(audio_port_handle_t portId);
388*ec779b8eSAndroid Build Coastguard Worker     void doReleaseOutput(audio_port_handle_t portId);
389*ec779b8eSAndroid Build Coastguard Worker 
390*ec779b8eSAndroid Build Coastguard Worker     status_t clientCreateAudioPatch(const struct audio_patch *patch,
391*ec779b8eSAndroid Build Coastguard Worker                               audio_patch_handle_t *handle,
392*ec779b8eSAndroid Build Coastguard Worker                               int delayMs);
393*ec779b8eSAndroid Build Coastguard Worker     status_t clientReleaseAudioPatch(audio_patch_handle_t handle,
394*ec779b8eSAndroid Build Coastguard Worker                                      int delayMs);
395*ec779b8eSAndroid Build Coastguard Worker     virtual status_t clientSetAudioPortConfig(const struct audio_port_config *config,
396*ec779b8eSAndroid Build Coastguard Worker                                               int delayMs);
397*ec779b8eSAndroid Build Coastguard Worker 
398*ec779b8eSAndroid Build Coastguard Worker     void removeNotificationClient(uid_t uid, pid_t pid);
399*ec779b8eSAndroid Build Coastguard Worker     void onAudioPortListUpdate();
400*ec779b8eSAndroid Build Coastguard Worker     void doOnAudioPortListUpdate();
401*ec779b8eSAndroid Build Coastguard Worker     void onAudioPatchListUpdate();
402*ec779b8eSAndroid Build Coastguard Worker     void doOnAudioPatchListUpdate();
403*ec779b8eSAndroid Build Coastguard Worker 
404*ec779b8eSAndroid Build Coastguard Worker     void onDynamicPolicyMixStateUpdate(const String8& regId, int32_t state);
405*ec779b8eSAndroid Build Coastguard Worker     void doOnDynamicPolicyMixStateUpdate(const String8& regId, int32_t state);
406*ec779b8eSAndroid Build Coastguard Worker     void onRecordingConfigurationUpdate(int event,
407*ec779b8eSAndroid Build Coastguard Worker                                         const record_client_info_t *clientInfo,
408*ec779b8eSAndroid Build Coastguard Worker                                         const audio_config_base_t *clientConfig,
409*ec779b8eSAndroid Build Coastguard Worker                                         std::vector<effect_descriptor_t> clientEffects,
410*ec779b8eSAndroid Build Coastguard Worker                                         const audio_config_base_t *deviceConfig,
411*ec779b8eSAndroid Build Coastguard Worker                                         std::vector<effect_descriptor_t> effects,
412*ec779b8eSAndroid Build Coastguard Worker                                         audio_patch_handle_t patchHandle,
413*ec779b8eSAndroid Build Coastguard Worker                                         audio_source_t source);
414*ec779b8eSAndroid Build Coastguard Worker     void doOnRecordingConfigurationUpdate(int event,
415*ec779b8eSAndroid Build Coastguard Worker                                           const record_client_info_t *clientInfo,
416*ec779b8eSAndroid Build Coastguard Worker                                           const audio_config_base_t *clientConfig,
417*ec779b8eSAndroid Build Coastguard Worker                                           std::vector<effect_descriptor_t> clientEffects,
418*ec779b8eSAndroid Build Coastguard Worker                                           const audio_config_base_t *deviceConfig,
419*ec779b8eSAndroid Build Coastguard Worker                                           std::vector<effect_descriptor_t> effects,
420*ec779b8eSAndroid Build Coastguard Worker                                           audio_patch_handle_t patchHandle,
421*ec779b8eSAndroid Build Coastguard Worker                                           audio_source_t source);
422*ec779b8eSAndroid Build Coastguard Worker 
423*ec779b8eSAndroid Build Coastguard Worker     void onAudioVolumeGroupChanged(volume_group_t group, int flags);
424*ec779b8eSAndroid Build Coastguard Worker     void doOnAudioVolumeGroupChanged(volume_group_t group, int flags);
425*ec779b8eSAndroid Build Coastguard Worker 
426*ec779b8eSAndroid Build Coastguard Worker     void onRoutingUpdated();
427*ec779b8eSAndroid Build Coastguard Worker     void doOnRoutingUpdated();
428*ec779b8eSAndroid Build Coastguard Worker 
429*ec779b8eSAndroid Build Coastguard Worker     void onVolumeRangeInitRequest();
430*ec779b8eSAndroid Build Coastguard Worker     void doOnVolumeRangeInitRequest();
431*ec779b8eSAndroid Build Coastguard Worker 
432*ec779b8eSAndroid Build Coastguard Worker     /**
433*ec779b8eSAndroid Build Coastguard Worker      * Spatializer SpatializerPolicyCallback implementation.
434*ec779b8eSAndroid Build Coastguard Worker      * onCheckSpatializer() sends an event on mOutputCommandThread which executes
435*ec779b8eSAndroid Build Coastguard Worker      * doOnCheckSpatializer() to check if a Spatializer output must be opened or closed
436*ec779b8eSAndroid Build Coastguard Worker      * by audio policy manager and attach/detach the spatializer effect accordingly.
437*ec779b8eSAndroid Build Coastguard Worker      */
438*ec779b8eSAndroid Build Coastguard Worker     void onCheckSpatializer() override;
439*ec779b8eSAndroid Build Coastguard Worker     void onCheckSpatializer_l() REQUIRES(mMutex);
440*ec779b8eSAndroid Build Coastguard Worker     void doOnCheckSpatializer();
441*ec779b8eSAndroid Build Coastguard Worker 
442*ec779b8eSAndroid Build Coastguard Worker     void onUpdateActiveSpatializerTracks_l() REQUIRES(mMutex);
443*ec779b8eSAndroid Build Coastguard Worker     void doOnUpdateActiveSpatializerTracks();
444*ec779b8eSAndroid Build Coastguard Worker 
445*ec779b8eSAndroid Build Coastguard Worker 
446*ec779b8eSAndroid Build Coastguard Worker     void setEffectSuspended(int effectId,
447*ec779b8eSAndroid Build Coastguard Worker                             audio_session_t sessionId,
448*ec779b8eSAndroid Build Coastguard Worker                             bool suspended);
449*ec779b8eSAndroid Build Coastguard Worker 
450*ec779b8eSAndroid Build Coastguard Worker private:
451*ec779b8eSAndroid Build Coastguard Worker                         AudioPolicyService() ANDROID_API;
452*ec779b8eSAndroid Build Coastguard Worker     virtual             ~AudioPolicyService();
453*ec779b8eSAndroid Build Coastguard Worker 
454*ec779b8eSAndroid Build Coastguard Worker     status_t dumpInternals(int fd) REQUIRES(mMutex);
455*ec779b8eSAndroid Build Coastguard Worker 
456*ec779b8eSAndroid Build Coastguard Worker     // Handles binder shell commands
457*ec779b8eSAndroid Build Coastguard Worker     virtual status_t shellCommand(int in, int out, int err, Vector<String16>& args);
458*ec779b8eSAndroid Build Coastguard Worker 
459*ec779b8eSAndroid Build Coastguard Worker 
460*ec779b8eSAndroid Build Coastguard Worker     // Sets whether the given UID records only silence
461*ec779b8eSAndroid Build Coastguard Worker     virtual void setAppState_l(sp<AudioRecordClient> client, app_state_t state) REQUIRES(mMutex);
462*ec779b8eSAndroid Build Coastguard Worker 
463*ec779b8eSAndroid Build Coastguard Worker     // Overrides the UID state as if it is idle
464*ec779b8eSAndroid Build Coastguard Worker     status_t handleSetUidState(Vector<String16>& args, int err);
465*ec779b8eSAndroid Build Coastguard Worker 
466*ec779b8eSAndroid Build Coastguard Worker     // Clears the override for the UID state
467*ec779b8eSAndroid Build Coastguard Worker     status_t handleResetUidState(Vector<String16>& args, int err);
468*ec779b8eSAndroid Build Coastguard Worker 
469*ec779b8eSAndroid Build Coastguard Worker     // Gets the UID state
470*ec779b8eSAndroid Build Coastguard Worker     status_t handleGetUidState(Vector<String16>& args, int out, int err);
471*ec779b8eSAndroid Build Coastguard Worker 
472*ec779b8eSAndroid Build Coastguard Worker     // Prints the shell command help
473*ec779b8eSAndroid Build Coastguard Worker     status_t printHelp(int out);
474*ec779b8eSAndroid Build Coastguard Worker 
475*ec779b8eSAndroid Build Coastguard Worker     std::string getDeviceTypeStrForPortId(audio_port_handle_t portId);
476*ec779b8eSAndroid Build Coastguard Worker 
477*ec779b8eSAndroid Build Coastguard Worker     std::string getDeviceTypeStrForPortIds(DeviceIdVector portIds);
478*ec779b8eSAndroid Build Coastguard Worker 
479*ec779b8eSAndroid Build Coastguard Worker     status_t getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects);
480*ec779b8eSAndroid Build Coastguard Worker 
481*ec779b8eSAndroid Build Coastguard Worker     app_state_t apmStatFromAmState(int amState);
482*ec779b8eSAndroid Build Coastguard Worker 
483*ec779b8eSAndroid Build Coastguard Worker     bool isSupportedSystemUsage(audio_usage_t usage);
484*ec779b8eSAndroid Build Coastguard Worker     binder::Status validateUsage(const audio_attributes_t& attr);
485*ec779b8eSAndroid Build Coastguard Worker     binder::Status validateUsage(const audio_attributes_t& attr,
486*ec779b8eSAndroid Build Coastguard Worker                            const AttributionSourceState& attributionSource);
487*ec779b8eSAndroid Build Coastguard Worker 
488*ec779b8eSAndroid Build Coastguard Worker     void updateUidStates();
489*ec779b8eSAndroid Build Coastguard Worker     void updateUidStates_l() REQUIRES(mMutex);
490*ec779b8eSAndroid Build Coastguard Worker 
491*ec779b8eSAndroid Build Coastguard Worker     void silenceAllRecordings_l() REQUIRES(mMutex);
492*ec779b8eSAndroid Build Coastguard Worker 
493*ec779b8eSAndroid Build Coastguard Worker     static bool isVirtualSource(audio_source_t source);
494*ec779b8eSAndroid Build Coastguard Worker 
495*ec779b8eSAndroid Build Coastguard Worker     /** returns true if the audio source must be silenced when the corresponding app op is denied.
496*ec779b8eSAndroid Build Coastguard Worker      *          false if the audio source does not actually capture from the microphone while still
497*ec779b8eSAndroid Build Coastguard Worker      *          being mapped to app op OP_RECORD_AUDIO and not a specialized op tracked separately.
498*ec779b8eSAndroid Build Coastguard Worker      *          See getOpForSource().
499*ec779b8eSAndroid Build Coastguard Worker      */
500*ec779b8eSAndroid Build Coastguard Worker     static bool isAppOpSource(audio_source_t source);
501*ec779b8eSAndroid Build Coastguard Worker 
502*ec779b8eSAndroid Build Coastguard Worker     status_t registerOutput(audio_io_handle_t output,
503*ec779b8eSAndroid Build Coastguard Worker                             const audio_config_base_t& config,
504*ec779b8eSAndroid Build Coastguard Worker                             const audio_output_flags_t flags);
505*ec779b8eSAndroid Build Coastguard Worker     status_t unregisterOutput(audio_io_handle_t output);
506*ec779b8eSAndroid Build Coastguard Worker 
507*ec779b8eSAndroid Build Coastguard Worker     // If recording we need to make sure the UID is allowed to do that. If the UID is idle
508*ec779b8eSAndroid Build Coastguard Worker     // then it cannot record and gets buffers with zeros - silence. As soon as the UID
509*ec779b8eSAndroid Build Coastguard Worker     // transitions to an active state we will start reporting buffers with data. This approach
510*ec779b8eSAndroid Build Coastguard Worker     // transparently handles recording while the UID transitions between idle/active state
511*ec779b8eSAndroid Build Coastguard Worker     // avoiding to get stuck in a state receiving non-empty buffers while idle or in a state
512*ec779b8eSAndroid Build Coastguard Worker     // receiving empty buffers while active.
513*ec779b8eSAndroid Build Coastguard Worker     class UidPolicy : public BnUidObserver, public virtual IBinder::DeathRecipient {
514*ec779b8eSAndroid Build Coastguard Worker     public:
UidPolicy(wp<AudioPolicyService> service)515*ec779b8eSAndroid Build Coastguard Worker         explicit UidPolicy(wp<AudioPolicyService> service)
516*ec779b8eSAndroid Build Coastguard Worker                 : mService(service), mObserverRegistered(false),
517*ec779b8eSAndroid Build Coastguard Worker                   mCurrentImeUid(0),
518*ec779b8eSAndroid Build Coastguard Worker                   mRttEnabled(false) {}
519*ec779b8eSAndroid Build Coastguard Worker 
520*ec779b8eSAndroid Build Coastguard Worker         void registerSelf();
521*ec779b8eSAndroid Build Coastguard Worker         void unregisterSelf();
522*ec779b8eSAndroid Build Coastguard Worker 
523*ec779b8eSAndroid Build Coastguard Worker         // IBinder::DeathRecipient implementation
524*ec779b8eSAndroid Build Coastguard Worker         void binderDied(const wp<IBinder> &who) override;
525*ec779b8eSAndroid Build Coastguard Worker 
526*ec779b8eSAndroid Build Coastguard Worker         bool isUidActive(uid_t uid);
527*ec779b8eSAndroid Build Coastguard Worker         int getUidState(uid_t uid);
528*ec779b8eSAndroid Build Coastguard Worker         void setAssistantUids(const std::vector<uid_t>& uids);
529*ec779b8eSAndroid Build Coastguard Worker         bool isAssistantUid(uid_t uid);
530*ec779b8eSAndroid Build Coastguard Worker         void setActiveAssistantUids(const std::vector<uid_t>& activeUids);
531*ec779b8eSAndroid Build Coastguard Worker         bool isActiveAssistantUid(uid_t uid);
setA11yUids(const std::vector<uid_t> & uids)532*ec779b8eSAndroid Build Coastguard Worker         void setA11yUids(const std::vector<uid_t>& uids) { mA11yUids.clear(); mA11yUids = uids; }
533*ec779b8eSAndroid Build Coastguard Worker         bool isA11yUid(uid_t uid);
534*ec779b8eSAndroid Build Coastguard Worker         bool isA11yOnTop();
setCurrentImeUid(uid_t uid)535*ec779b8eSAndroid Build Coastguard Worker         void setCurrentImeUid(uid_t uid) { mCurrentImeUid = uid; }
isCurrentImeUid(uid_t uid)536*ec779b8eSAndroid Build Coastguard Worker         bool isCurrentImeUid(uid_t uid) { return uid == mCurrentImeUid; }
setRttEnabled(bool enabled)537*ec779b8eSAndroid Build Coastguard Worker         void setRttEnabled(bool enabled) { mRttEnabled = enabled; }
isRttEnabled()538*ec779b8eSAndroid Build Coastguard Worker         bool isRttEnabled() { return mRttEnabled; }
539*ec779b8eSAndroid Build Coastguard Worker 
540*ec779b8eSAndroid Build Coastguard Worker         // BnUidObserver implementation
541*ec779b8eSAndroid Build Coastguard Worker         void onUidActive(uid_t uid) override;
542*ec779b8eSAndroid Build Coastguard Worker         void onUidGone(uid_t uid, bool disabled) override;
543*ec779b8eSAndroid Build Coastguard Worker         void onUidIdle(uid_t uid, bool disabled) override;
544*ec779b8eSAndroid Build Coastguard Worker         void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq,
545*ec779b8eSAndroid Build Coastguard Worker                 int32_t capability) override;
546*ec779b8eSAndroid Build Coastguard Worker         void onUidProcAdjChanged(uid_t uid, int32_t adj) override;
547*ec779b8eSAndroid Build Coastguard Worker 
548*ec779b8eSAndroid Build Coastguard Worker 
549*ec779b8eSAndroid Build Coastguard Worker         void updateUid(std::unordered_map<uid_t, std::pair<bool, int>> *uids,
550*ec779b8eSAndroid Build Coastguard Worker                        uid_t uid, bool active, int state, bool insert);
551*ec779b8eSAndroid Build Coastguard Worker 
552*ec779b8eSAndroid Build Coastguard Worker         void dumpInternals(int fd);
553*ec779b8eSAndroid Build Coastguard Worker 
554*ec779b8eSAndroid Build Coastguard Worker      private:
555*ec779b8eSAndroid Build Coastguard Worker         void notifyService();
556*ec779b8eSAndroid Build Coastguard Worker         void updateUidLocked(std::unordered_map<uid_t, std::pair<bool, int>> *uids,
557*ec779b8eSAndroid Build Coastguard Worker                              uid_t uid, bool active, int state, bool insert);
558*ec779b8eSAndroid Build Coastguard Worker         void checkRegistered();
559*ec779b8eSAndroid Build Coastguard Worker 
560*ec779b8eSAndroid Build Coastguard Worker         wp<AudioPolicyService> mService;
561*ec779b8eSAndroid Build Coastguard Worker         audio_utils::mutex mMutex{audio_utils::MutexOrder::kUidPolicy_Mutex};
562*ec779b8eSAndroid Build Coastguard Worker         ActivityManager mAm;
563*ec779b8eSAndroid Build Coastguard Worker         bool mObserverRegistered = false;
564*ec779b8eSAndroid Build Coastguard Worker         std::unordered_map<uid_t, std::pair<bool, int>> mCachedUids GUARDED_BY(mMutex);
565*ec779b8eSAndroid Build Coastguard Worker         std::vector<uid_t> mAssistantUids;
566*ec779b8eSAndroid Build Coastguard Worker         std::vector<uid_t> mActiveAssistantUids;
567*ec779b8eSAndroid Build Coastguard Worker         std::vector<uid_t> mA11yUids;
568*ec779b8eSAndroid Build Coastguard Worker         uid_t mCurrentImeUid = -1;
569*ec779b8eSAndroid Build Coastguard Worker         bool mRttEnabled = false;
570*ec779b8eSAndroid Build Coastguard Worker     };
571*ec779b8eSAndroid Build Coastguard Worker 
572*ec779b8eSAndroid Build Coastguard Worker     // If sensor privacy is enabled then all apps, including those that are active, should be
573*ec779b8eSAndroid Build Coastguard Worker     // prevented from recording. This is handled similar to idle UIDs, any app that attempts
574*ec779b8eSAndroid Build Coastguard Worker     // to record while sensor privacy is enabled will receive buffers with zeros. As soon as
575*ec779b8eSAndroid Build Coastguard Worker     // sensor privacy is disabled active apps will receive the expected data when recording.
576*ec779b8eSAndroid Build Coastguard Worker     class SensorPrivacyPolicy : public hardware::BnSensorPrivacyListener {
577*ec779b8eSAndroid Build Coastguard Worker         public:
SensorPrivacyPolicy(wp<AudioPolicyService> service)578*ec779b8eSAndroid Build Coastguard Worker             explicit SensorPrivacyPolicy(wp<AudioPolicyService> service)
579*ec779b8eSAndroid Build Coastguard Worker                     : mService(service) {}
580*ec779b8eSAndroid Build Coastguard Worker 
581*ec779b8eSAndroid Build Coastguard Worker             void registerSelf();
582*ec779b8eSAndroid Build Coastguard Worker             void unregisterSelf();
583*ec779b8eSAndroid Build Coastguard Worker 
584*ec779b8eSAndroid Build Coastguard Worker             bool isSensorPrivacyEnabled();
585*ec779b8eSAndroid Build Coastguard Worker 
586*ec779b8eSAndroid Build Coastguard Worker             binder::Status onSensorPrivacyChanged(int toggleType, int sensor,
587*ec779b8eSAndroid Build Coastguard Worker                                                   bool enabled);
588*ec779b8eSAndroid Build Coastguard Worker 
onSensorPrivacyStateChanged(int,int,int)589*ec779b8eSAndroid Build Coastguard Worker             binder::Status onSensorPrivacyStateChanged(int, int, int) {
590*ec779b8eSAndroid Build Coastguard Worker                 return binder::Status::ok();
591*ec779b8eSAndroid Build Coastguard Worker             }
592*ec779b8eSAndroid Build Coastguard Worker 
593*ec779b8eSAndroid Build Coastguard Worker         private:
594*ec779b8eSAndroid Build Coastguard Worker             wp<AudioPolicyService> mService;
595*ec779b8eSAndroid Build Coastguard Worker             std::atomic_bool mSensorPrivacyEnabled = false;
596*ec779b8eSAndroid Build Coastguard Worker     };
597*ec779b8eSAndroid Build Coastguard Worker 
598*ec779b8eSAndroid Build Coastguard Worker     // Thread used to send audio config commands to audio flinger
599*ec779b8eSAndroid Build Coastguard Worker     // For audio config commands, it is necessary because audio flinger requires that the calling
600*ec779b8eSAndroid Build Coastguard Worker     // process (user) has permission to modify audio settings.
601*ec779b8eSAndroid Build Coastguard Worker     public:
602*ec779b8eSAndroid Build Coastguard Worker     class AudioCommandThread : public Thread {
603*ec779b8eSAndroid Build Coastguard Worker         class AudioCommand;
604*ec779b8eSAndroid Build Coastguard Worker     public:
605*ec779b8eSAndroid Build Coastguard Worker 
606*ec779b8eSAndroid Build Coastguard Worker         // commands for tone AudioCommand
607*ec779b8eSAndroid Build Coastguard Worker         enum {
608*ec779b8eSAndroid Build Coastguard Worker             SET_VOLUME,
609*ec779b8eSAndroid Build Coastguard Worker             SET_PORTS_VOLUME,
610*ec779b8eSAndroid Build Coastguard Worker             SET_PARAMETERS,
611*ec779b8eSAndroid Build Coastguard Worker             SET_VOICE_VOLUME,
612*ec779b8eSAndroid Build Coastguard Worker             STOP_OUTPUT,
613*ec779b8eSAndroid Build Coastguard Worker             RELEASE_OUTPUT,
614*ec779b8eSAndroid Build Coastguard Worker             CREATE_AUDIO_PATCH,
615*ec779b8eSAndroid Build Coastguard Worker             RELEASE_AUDIO_PATCH,
616*ec779b8eSAndroid Build Coastguard Worker             UPDATE_AUDIOPORT_LIST,
617*ec779b8eSAndroid Build Coastguard Worker             UPDATE_AUDIOPATCH_LIST,
618*ec779b8eSAndroid Build Coastguard Worker             CHANGED_AUDIOVOLUMEGROUP,
619*ec779b8eSAndroid Build Coastguard Worker             SET_AUDIOPORT_CONFIG,
620*ec779b8eSAndroid Build Coastguard Worker             DYN_POLICY_MIX_STATE_UPDATE,
621*ec779b8eSAndroid Build Coastguard Worker             RECORDING_CONFIGURATION_UPDATE,
622*ec779b8eSAndroid Build Coastguard Worker             SET_EFFECT_SUSPENDED,
623*ec779b8eSAndroid Build Coastguard Worker             AUDIO_MODULES_UPDATE,
624*ec779b8eSAndroid Build Coastguard Worker             ROUTING_UPDATED,
625*ec779b8eSAndroid Build Coastguard Worker             UPDATE_UID_STATES,
626*ec779b8eSAndroid Build Coastguard Worker             CHECK_SPATIALIZER_OUTPUT, // verify if spatializer effect should be created or moved
627*ec779b8eSAndroid Build Coastguard Worker             UPDATE_ACTIVE_SPATIALIZER_TRACKS, // Update active track counts on spalializer output
628*ec779b8eSAndroid Build Coastguard Worker             VOL_RANGE_INIT_REQUEST, // request to reset the volume range indices
629*ec779b8eSAndroid Build Coastguard Worker         };
630*ec779b8eSAndroid Build Coastguard Worker 
631*ec779b8eSAndroid Build Coastguard Worker         AudioCommandThread (String8 name, const wp<AudioPolicyService>& service);
632*ec779b8eSAndroid Build Coastguard Worker         virtual             ~AudioCommandThread();
633*ec779b8eSAndroid Build Coastguard Worker 
634*ec779b8eSAndroid Build Coastguard Worker                     status_t    dump(int fd);
635*ec779b8eSAndroid Build Coastguard Worker 
636*ec779b8eSAndroid Build Coastguard Worker         // Thread virtuals
637*ec779b8eSAndroid Build Coastguard Worker         virtual     void        onFirstRef();
638*ec779b8eSAndroid Build Coastguard Worker         virtual     bool        threadLoop();
639*ec779b8eSAndroid Build Coastguard Worker 
640*ec779b8eSAndroid Build Coastguard Worker                     void        exit();
641*ec779b8eSAndroid Build Coastguard Worker                     status_t    volumeCommand(audio_stream_type_t stream, float volume, bool muted,
642*ec779b8eSAndroid Build Coastguard Worker                                             audio_io_handle_t output, int delayMs = 0);
643*ec779b8eSAndroid Build Coastguard Worker                     status_t    volumePortsCommand(const std::vector<audio_port_handle_t> &ports,
644*ec779b8eSAndroid Build Coastguard Worker                             float volume, bool muted, audio_io_handle_t output, int delayMs = 0);
645*ec779b8eSAndroid Build Coastguard Worker                     status_t    parametersCommand(audio_io_handle_t ioHandle,
646*ec779b8eSAndroid Build Coastguard Worker                                             const char *keyValuePairs, int delayMs = 0);
647*ec779b8eSAndroid Build Coastguard Worker                     status_t    voiceVolumeCommand(float volume, int delayMs = 0);
648*ec779b8eSAndroid Build Coastguard Worker                     void        stopOutputCommand(audio_port_handle_t portId);
649*ec779b8eSAndroid Build Coastguard Worker                     void        releaseOutputCommand(audio_port_handle_t portId);
650*ec779b8eSAndroid Build Coastguard Worker                     status_t    sendCommand(sp<AudioCommand>& command, int delayMs = 0);
651*ec779b8eSAndroid Build Coastguard Worker                     void        insertCommand_l(sp<AudioCommand>& command, int delayMs = 0);
652*ec779b8eSAndroid Build Coastguard Worker                     status_t    createAudioPatchCommand(const struct audio_patch *patch,
653*ec779b8eSAndroid Build Coastguard Worker                                                         audio_patch_handle_t *handle,
654*ec779b8eSAndroid Build Coastguard Worker                                                         int delayMs);
655*ec779b8eSAndroid Build Coastguard Worker                     status_t    releaseAudioPatchCommand(audio_patch_handle_t handle,
656*ec779b8eSAndroid Build Coastguard Worker                                                          int delayMs);
657*ec779b8eSAndroid Build Coastguard Worker                     void        updateAudioPortListCommand();
658*ec779b8eSAndroid Build Coastguard Worker                     void        updateAudioPatchListCommand();
659*ec779b8eSAndroid Build Coastguard Worker                     void        changeAudioVolumeGroupCommand(volume_group_t group, int flags);
660*ec779b8eSAndroid Build Coastguard Worker                     status_t    setAudioPortConfigCommand(const struct audio_port_config *config,
661*ec779b8eSAndroid Build Coastguard Worker                                                           int delayMs);
662*ec779b8eSAndroid Build Coastguard Worker                     void        dynamicPolicyMixStateUpdateCommand(const String8& regId,
663*ec779b8eSAndroid Build Coastguard Worker                                                                    int32_t state);
664*ec779b8eSAndroid Build Coastguard Worker                     void        recordingConfigurationUpdateCommand(
665*ec779b8eSAndroid Build Coastguard Worker                                                     int event,
666*ec779b8eSAndroid Build Coastguard Worker                                                     const record_client_info_t *clientInfo,
667*ec779b8eSAndroid Build Coastguard Worker                                                     const audio_config_base_t *clientConfig,
668*ec779b8eSAndroid Build Coastguard Worker                                                     std::vector<effect_descriptor_t> clientEffects,
669*ec779b8eSAndroid Build Coastguard Worker                                                     const audio_config_base_t *deviceConfig,
670*ec779b8eSAndroid Build Coastguard Worker                                                     std::vector<effect_descriptor_t> effects,
671*ec779b8eSAndroid Build Coastguard Worker                                                     audio_patch_handle_t patchHandle,
672*ec779b8eSAndroid Build Coastguard Worker                                                     audio_source_t source);
673*ec779b8eSAndroid Build Coastguard Worker                     void        setEffectSuspendedCommand(int effectId,
674*ec779b8eSAndroid Build Coastguard Worker                                                           audio_session_t sessionId,
675*ec779b8eSAndroid Build Coastguard Worker                                                           bool suspended);
676*ec779b8eSAndroid Build Coastguard Worker                     void        audioModulesUpdateCommand();
677*ec779b8eSAndroid Build Coastguard Worker                     void        routingChangedCommand();
678*ec779b8eSAndroid Build Coastguard Worker                     void        updateUidStatesCommand();
679*ec779b8eSAndroid Build Coastguard Worker                     void        checkSpatializerCommand();
680*ec779b8eSAndroid Build Coastguard Worker                     void        updateActiveSpatializerTracksCommand();
681*ec779b8eSAndroid Build Coastguard Worker                     void        volRangeInitReqCommand();
682*ec779b8eSAndroid Build Coastguard Worker 
683*ec779b8eSAndroid Build Coastguard Worker                     void        insertCommand_l(AudioCommand *command, int delayMs = 0);
684*ec779b8eSAndroid Build Coastguard Worker     private:
685*ec779b8eSAndroid Build Coastguard Worker         class AudioCommandData;
686*ec779b8eSAndroid Build Coastguard Worker 
687*ec779b8eSAndroid Build Coastguard Worker         // descriptor for requested tone playback event
688*ec779b8eSAndroid Build Coastguard Worker         class AudioCommand: public RefBase {
689*ec779b8eSAndroid Build Coastguard Worker 
690*ec779b8eSAndroid Build Coastguard Worker         public:
AudioCommand()691*ec779b8eSAndroid Build Coastguard Worker             AudioCommand()
692*ec779b8eSAndroid Build Coastguard Worker             : mCommand(-1), mStatus(NO_ERROR), mWaitStatus(false) {}
693*ec779b8eSAndroid Build Coastguard Worker 
694*ec779b8eSAndroid Build Coastguard Worker             void dump(char* buffer, size_t size);
695*ec779b8eSAndroid Build Coastguard Worker 
696*ec779b8eSAndroid Build Coastguard Worker             int mCommand;   // SET_VOLUME, SET_PARAMETERS...
697*ec779b8eSAndroid Build Coastguard Worker             nsecs_t mTime;  // time stamp
698*ec779b8eSAndroid Build Coastguard Worker             audio_utils::mutex mMutex{audio_utils::MutexOrder::kAudioCommand_Mutex};
699*ec779b8eSAndroid Build Coastguard Worker             audio_utils::condition_variable mCond; // condition for status return
700*ec779b8eSAndroid Build Coastguard Worker             status_t mStatus; // command status
701*ec779b8eSAndroid Build Coastguard Worker             bool mWaitStatus; // true if caller is waiting for status
702*ec779b8eSAndroid Build Coastguard Worker             sp<AudioCommandData> mParam;     // command specific parameter data
703*ec779b8eSAndroid Build Coastguard Worker         };
704*ec779b8eSAndroid Build Coastguard Worker 
705*ec779b8eSAndroid Build Coastguard Worker         class AudioCommandData: public RefBase {
706*ec779b8eSAndroid Build Coastguard Worker         public:
~AudioCommandData()707*ec779b8eSAndroid Build Coastguard Worker             virtual ~AudioCommandData() {}
708*ec779b8eSAndroid Build Coastguard Worker         protected:
AudioCommandData()709*ec779b8eSAndroid Build Coastguard Worker             AudioCommandData() {}
710*ec779b8eSAndroid Build Coastguard Worker         };
711*ec779b8eSAndroid Build Coastguard Worker 
712*ec779b8eSAndroid Build Coastguard Worker         class VolumeData : public AudioCommandData {
713*ec779b8eSAndroid Build Coastguard Worker         public:
714*ec779b8eSAndroid Build Coastguard Worker             audio_stream_type_t mStream;
715*ec779b8eSAndroid Build Coastguard Worker             float mVolume;
716*ec779b8eSAndroid Build Coastguard Worker             bool mIsMuted;
717*ec779b8eSAndroid Build Coastguard Worker             audio_io_handle_t mIO;
718*ec779b8eSAndroid Build Coastguard Worker         };
719*ec779b8eSAndroid Build Coastguard Worker 
720*ec779b8eSAndroid Build Coastguard Worker         class VolumePortsData : public AudioCommandData {
721*ec779b8eSAndroid Build Coastguard Worker         public:
722*ec779b8eSAndroid Build Coastguard Worker             std::vector<audio_port_handle_t> mPorts;
723*ec779b8eSAndroid Build Coastguard Worker             float mVolume;
724*ec779b8eSAndroid Build Coastguard Worker             bool mMuted;
725*ec779b8eSAndroid Build Coastguard Worker             audio_io_handle_t mIO;
dumpPorts()726*ec779b8eSAndroid Build Coastguard Worker             std::string dumpPorts() {
727*ec779b8eSAndroid Build Coastguard Worker                 return std::string("volume ") + std::to_string(mVolume) + std::string("muted ") +
728*ec779b8eSAndroid Build Coastguard Worker                        std::to_string(mMuted) + " on IO " + std::to_string(mIO) + " and ports " +
729*ec779b8eSAndroid Build Coastguard Worker                        std::accumulate(std::begin(mPorts), std::end(mPorts), std::string{},
730*ec779b8eSAndroid Build Coastguard Worker                                        [](const std::string &ls, int rs) {
731*ec779b8eSAndroid Build Coastguard Worker                                            return ls + std::to_string(rs) + " ";
732*ec779b8eSAndroid Build Coastguard Worker                                        });
733*ec779b8eSAndroid Build Coastguard Worker             }
734*ec779b8eSAndroid Build Coastguard Worker         };
735*ec779b8eSAndroid Build Coastguard Worker 
736*ec779b8eSAndroid Build Coastguard Worker         class ParametersData : public AudioCommandData {
737*ec779b8eSAndroid Build Coastguard Worker         public:
738*ec779b8eSAndroid Build Coastguard Worker             audio_io_handle_t mIO;
739*ec779b8eSAndroid Build Coastguard Worker             String8 mKeyValuePairs;
740*ec779b8eSAndroid Build Coastguard Worker         };
741*ec779b8eSAndroid Build Coastguard Worker 
742*ec779b8eSAndroid Build Coastguard Worker         class VoiceVolumeData : public AudioCommandData {
743*ec779b8eSAndroid Build Coastguard Worker         public:
744*ec779b8eSAndroid Build Coastguard Worker             float mVolume;
745*ec779b8eSAndroid Build Coastguard Worker         };
746*ec779b8eSAndroid Build Coastguard Worker 
747*ec779b8eSAndroid Build Coastguard Worker         class StopOutputData : public AudioCommandData {
748*ec779b8eSAndroid Build Coastguard Worker         public:
749*ec779b8eSAndroid Build Coastguard Worker             audio_port_handle_t mPortId;
750*ec779b8eSAndroid Build Coastguard Worker         };
751*ec779b8eSAndroid Build Coastguard Worker 
752*ec779b8eSAndroid Build Coastguard Worker         class ReleaseOutputData : public AudioCommandData {
753*ec779b8eSAndroid Build Coastguard Worker         public:
754*ec779b8eSAndroid Build Coastguard Worker             audio_port_handle_t mPortId;
755*ec779b8eSAndroid Build Coastguard Worker         };
756*ec779b8eSAndroid Build Coastguard Worker 
757*ec779b8eSAndroid Build Coastguard Worker         class CreateAudioPatchData : public AudioCommandData {
758*ec779b8eSAndroid Build Coastguard Worker         public:
759*ec779b8eSAndroid Build Coastguard Worker             struct audio_patch mPatch;
760*ec779b8eSAndroid Build Coastguard Worker             audio_patch_handle_t mHandle;
761*ec779b8eSAndroid Build Coastguard Worker         };
762*ec779b8eSAndroid Build Coastguard Worker 
763*ec779b8eSAndroid Build Coastguard Worker         class ReleaseAudioPatchData : public AudioCommandData {
764*ec779b8eSAndroid Build Coastguard Worker         public:
765*ec779b8eSAndroid Build Coastguard Worker             audio_patch_handle_t mHandle;
766*ec779b8eSAndroid Build Coastguard Worker         };
767*ec779b8eSAndroid Build Coastguard Worker 
768*ec779b8eSAndroid Build Coastguard Worker         class AudioVolumeGroupData : public AudioCommandData {
769*ec779b8eSAndroid Build Coastguard Worker         public:
770*ec779b8eSAndroid Build Coastguard Worker             volume_group_t mGroup;
771*ec779b8eSAndroid Build Coastguard Worker             int mFlags;
772*ec779b8eSAndroid Build Coastguard Worker         };
773*ec779b8eSAndroid Build Coastguard Worker 
774*ec779b8eSAndroid Build Coastguard Worker         class SetAudioPortConfigData : public AudioCommandData {
775*ec779b8eSAndroid Build Coastguard Worker         public:
776*ec779b8eSAndroid Build Coastguard Worker             struct audio_port_config mConfig;
777*ec779b8eSAndroid Build Coastguard Worker         };
778*ec779b8eSAndroid Build Coastguard Worker 
779*ec779b8eSAndroid Build Coastguard Worker         class DynPolicyMixStateUpdateData : public AudioCommandData {
780*ec779b8eSAndroid Build Coastguard Worker         public:
781*ec779b8eSAndroid Build Coastguard Worker             String8 mRegId;
782*ec779b8eSAndroid Build Coastguard Worker             int32_t mState;
783*ec779b8eSAndroid Build Coastguard Worker         };
784*ec779b8eSAndroid Build Coastguard Worker 
785*ec779b8eSAndroid Build Coastguard Worker         class RecordingConfigurationUpdateData : public AudioCommandData {
786*ec779b8eSAndroid Build Coastguard Worker         public:
787*ec779b8eSAndroid Build Coastguard Worker             int mEvent;
788*ec779b8eSAndroid Build Coastguard Worker             record_client_info_t mClientInfo;
789*ec779b8eSAndroid Build Coastguard Worker             struct audio_config_base mClientConfig;
790*ec779b8eSAndroid Build Coastguard Worker             std::vector<effect_descriptor_t> mClientEffects;
791*ec779b8eSAndroid Build Coastguard Worker             struct audio_config_base mDeviceConfig;
792*ec779b8eSAndroid Build Coastguard Worker             std::vector<effect_descriptor_t> mEffects;
793*ec779b8eSAndroid Build Coastguard Worker             audio_patch_handle_t mPatchHandle;
794*ec779b8eSAndroid Build Coastguard Worker             audio_source_t mSource;
795*ec779b8eSAndroid Build Coastguard Worker         };
796*ec779b8eSAndroid Build Coastguard Worker 
797*ec779b8eSAndroid Build Coastguard Worker         class SetEffectSuspendedData : public AudioCommandData {
798*ec779b8eSAndroid Build Coastguard Worker         public:
799*ec779b8eSAndroid Build Coastguard Worker             int mEffectId;
800*ec779b8eSAndroid Build Coastguard Worker             audio_session_t mSessionId;
801*ec779b8eSAndroid Build Coastguard Worker             bool mSuspended;
802*ec779b8eSAndroid Build Coastguard Worker         };
803*ec779b8eSAndroid Build Coastguard Worker 
804*ec779b8eSAndroid Build Coastguard Worker         mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kCommandThread_Mutex};
805*ec779b8eSAndroid Build Coastguard Worker         audio_utils::condition_variable mWaitWorkCV;
806*ec779b8eSAndroid Build Coastguard Worker         Vector < sp<AudioCommand> > mAudioCommands; // list of pending commands
807*ec779b8eSAndroid Build Coastguard Worker         sp<AudioCommand> mLastCommand;      // last processed command (used by dump)
808*ec779b8eSAndroid Build Coastguard Worker         String8 mName;                      // string used by wake lock fo delayed commands
809*ec779b8eSAndroid Build Coastguard Worker         wp<AudioPolicyService> mService;
810*ec779b8eSAndroid Build Coastguard Worker     };
811*ec779b8eSAndroid Build Coastguard Worker 
812*ec779b8eSAndroid Build Coastguard Worker     private:
813*ec779b8eSAndroid Build Coastguard Worker     class AudioPolicyClient : public AudioPolicyClientInterface
814*ec779b8eSAndroid Build Coastguard Worker     {
815*ec779b8eSAndroid Build Coastguard Worker      public:
AudioPolicyClient(AudioPolicyService * service)816*ec779b8eSAndroid Build Coastguard Worker         explicit AudioPolicyClient(AudioPolicyService *service) : mAudioPolicyService(service) {}
~AudioPolicyClient()817*ec779b8eSAndroid Build Coastguard Worker         virtual ~AudioPolicyClient() {}
818*ec779b8eSAndroid Build Coastguard Worker 
819*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getAudioPolicyConfig(media::AudioPolicyConfig *config);
820*ec779b8eSAndroid Build Coastguard Worker 
821*ec779b8eSAndroid Build Coastguard Worker         //
822*ec779b8eSAndroid Build Coastguard Worker         // Audio HW module functions
823*ec779b8eSAndroid Build Coastguard Worker         //
824*ec779b8eSAndroid Build Coastguard Worker 
825*ec779b8eSAndroid Build Coastguard Worker         // loads a HW module.
826*ec779b8eSAndroid Build Coastguard Worker         virtual audio_module_handle_t loadHwModule(const char *name);
827*ec779b8eSAndroid Build Coastguard Worker 
828*ec779b8eSAndroid Build Coastguard Worker         //
829*ec779b8eSAndroid Build Coastguard Worker         // Audio output Control functions
830*ec779b8eSAndroid Build Coastguard Worker         //
831*ec779b8eSAndroid Build Coastguard Worker 
832*ec779b8eSAndroid Build Coastguard Worker         // opens an audio output with the requested parameters. The parameter values can indicate to use the default values
833*ec779b8eSAndroid Build Coastguard Worker         // in case the audio policy manager has no specific requirements for the output being opened.
834*ec779b8eSAndroid Build Coastguard Worker         // When the function returns, the parameter values reflect the actual values used by the audio hardware output stream.
835*ec779b8eSAndroid Build Coastguard Worker         // The audio policy manager can check if the proposed parameters are suitable or not and act accordingly.
836*ec779b8eSAndroid Build Coastguard Worker         virtual status_t openOutput(audio_module_handle_t module,
837*ec779b8eSAndroid Build Coastguard Worker                                     audio_io_handle_t *output,
838*ec779b8eSAndroid Build Coastguard Worker                                     audio_config_t *halConfig,
839*ec779b8eSAndroid Build Coastguard Worker                                     audio_config_base_t *mixerConfig,
840*ec779b8eSAndroid Build Coastguard Worker                                     const sp<DeviceDescriptorBase>& device,
841*ec779b8eSAndroid Build Coastguard Worker                                     uint32_t *latencyMs,
842*ec779b8eSAndroid Build Coastguard Worker                                     audio_output_flags_t *flags,
843*ec779b8eSAndroid Build Coastguard Worker                                     audio_attributes_t attributes);
844*ec779b8eSAndroid Build Coastguard Worker         // creates a special output that is duplicated to the two outputs passed as arguments. The duplication is performed by
845*ec779b8eSAndroid Build Coastguard Worker         // a special mixer thread in the AudioFlinger.
846*ec779b8eSAndroid Build Coastguard Worker         virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, audio_io_handle_t output2);
847*ec779b8eSAndroid Build Coastguard Worker         // closes the output stream
848*ec779b8eSAndroid Build Coastguard Worker         virtual status_t closeOutput(audio_io_handle_t output);
849*ec779b8eSAndroid Build Coastguard Worker         // suspends the output. When an output is suspended, the corresponding audio hardware output stream is placed in
850*ec779b8eSAndroid Build Coastguard Worker         // standby and the AudioTracks attached to the mixer thread are still processed but the output mix is discarded.
851*ec779b8eSAndroid Build Coastguard Worker         virtual status_t suspendOutput(audio_io_handle_t output);
852*ec779b8eSAndroid Build Coastguard Worker         // restores a suspended output.
853*ec779b8eSAndroid Build Coastguard Worker         virtual status_t restoreOutput(audio_io_handle_t output);
854*ec779b8eSAndroid Build Coastguard Worker 
855*ec779b8eSAndroid Build Coastguard Worker         //
856*ec779b8eSAndroid Build Coastguard Worker         // Audio input Control functions
857*ec779b8eSAndroid Build Coastguard Worker         //
858*ec779b8eSAndroid Build Coastguard Worker 
859*ec779b8eSAndroid Build Coastguard Worker         // opens an audio input
860*ec779b8eSAndroid Build Coastguard Worker         virtual audio_io_handle_t openInput(audio_module_handle_t module,
861*ec779b8eSAndroid Build Coastguard Worker                                             audio_io_handle_t *input,
862*ec779b8eSAndroid Build Coastguard Worker                                             audio_config_t *config,
863*ec779b8eSAndroid Build Coastguard Worker                                             audio_devices_t *devices,
864*ec779b8eSAndroid Build Coastguard Worker                                             const String8& address,
865*ec779b8eSAndroid Build Coastguard Worker                                             audio_source_t source,
866*ec779b8eSAndroid Build Coastguard Worker                                             audio_input_flags_t flags);
867*ec779b8eSAndroid Build Coastguard Worker         // closes an audio input
868*ec779b8eSAndroid Build Coastguard Worker         virtual status_t closeInput(audio_io_handle_t input);
869*ec779b8eSAndroid Build Coastguard Worker         //
870*ec779b8eSAndroid Build Coastguard Worker         // misc control functions
871*ec779b8eSAndroid Build Coastguard Worker         //
872*ec779b8eSAndroid Build Coastguard Worker 
873*ec779b8eSAndroid Build Coastguard Worker         // set a stream volume for a particular output. For the same user setting, a given stream
874*ec779b8eSAndroid Build Coastguard Worker         // type can have different volumes for each output (destination device) it is attached to.
875*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setStreamVolume(audio_stream_type_t stream, float volume, bool muted,
876*ec779b8eSAndroid Build Coastguard Worker                 audio_io_handle_t output, int delayMs = 0);
877*ec779b8eSAndroid Build Coastguard Worker         /**
878*ec779b8eSAndroid Build Coastguard Worker          * Set a volume on port(s) for a particular output. For the same user setting, a volume
879*ec779b8eSAndroid Build Coastguard Worker          * group (and associated given port of the client's track) can have different volumes for
880*ec779b8eSAndroid Build Coastguard Worker          * each output (destination device) it is attached to.
881*ec779b8eSAndroid Build Coastguard Worker          *
882*ec779b8eSAndroid Build Coastguard Worker          * @param ports to consider
883*ec779b8eSAndroid Build Coastguard Worker          * @param volume to set
884*ec779b8eSAndroid Build Coastguard Worker          * @param muted to set
885*ec779b8eSAndroid Build Coastguard Worker          * @param output to consider
886*ec779b8eSAndroid Build Coastguard Worker          * @param delayMs to use
887*ec779b8eSAndroid Build Coastguard Worker          * @return NO_ERROR if successful
888*ec779b8eSAndroid Build Coastguard Worker          */
889*ec779b8eSAndroid Build Coastguard Worker         status_t setPortsVolume(const std::vector<audio_port_handle_t> &ports, float volume,
890*ec779b8eSAndroid Build Coastguard Worker                 bool muted, audio_io_handle_t output, int delayMs = 0) override;
891*ec779b8eSAndroid Build Coastguard Worker 
892*ec779b8eSAndroid Build Coastguard Worker         // function enabling to send proprietary informations directly from audio policy manager to audio hardware interface.
893*ec779b8eSAndroid Build Coastguard Worker         virtual void setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs, int delayMs = 0);
894*ec779b8eSAndroid Build Coastguard Worker         // function enabling to receive proprietary informations directly from audio hardware interface to audio policy manager.
895*ec779b8eSAndroid Build Coastguard Worker         virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys);
896*ec779b8eSAndroid Build Coastguard Worker 
897*ec779b8eSAndroid Build Coastguard Worker         // set down link audio volume.
898*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setVoiceVolume(float volume, int delayMs = 0);
899*ec779b8eSAndroid Build Coastguard Worker 
900*ec779b8eSAndroid Build Coastguard Worker         // move effect to the specified output
901*ec779b8eSAndroid Build Coastguard Worker         virtual status_t moveEffects(audio_session_t session,
902*ec779b8eSAndroid Build Coastguard Worker                                          audio_io_handle_t srcOutput,
903*ec779b8eSAndroid Build Coastguard Worker                                          audio_io_handle_t dstOutput);
904*ec779b8eSAndroid Build Coastguard Worker 
905*ec779b8eSAndroid Build Coastguard Worker                 void setEffectSuspended(int effectId,
906*ec779b8eSAndroid Build Coastguard Worker                                         audio_session_t sessionId,
907*ec779b8eSAndroid Build Coastguard Worker                                         bool suspended) override;
908*ec779b8eSAndroid Build Coastguard Worker 
909*ec779b8eSAndroid Build Coastguard Worker         /* Create a patch between several source and sink ports */
910*ec779b8eSAndroid Build Coastguard Worker         virtual status_t createAudioPatch(const struct audio_patch *patch,
911*ec779b8eSAndroid Build Coastguard Worker                                            audio_patch_handle_t *handle,
912*ec779b8eSAndroid Build Coastguard Worker                                            int delayMs);
913*ec779b8eSAndroid Build Coastguard Worker 
914*ec779b8eSAndroid Build Coastguard Worker         /* Release a patch */
915*ec779b8eSAndroid Build Coastguard Worker         virtual status_t releaseAudioPatch(audio_patch_handle_t handle,
916*ec779b8eSAndroid Build Coastguard Worker                                            int delayMs);
917*ec779b8eSAndroid Build Coastguard Worker 
918*ec779b8eSAndroid Build Coastguard Worker         /* Set audio port configuration */
919*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setAudioPortConfig(const struct audio_port_config *config, int delayMs);
920*ec779b8eSAndroid Build Coastguard Worker 
921*ec779b8eSAndroid Build Coastguard Worker         virtual void onAudioPortListUpdate();
922*ec779b8eSAndroid Build Coastguard Worker         virtual void onAudioPatchListUpdate();
923*ec779b8eSAndroid Build Coastguard Worker         virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state);
924*ec779b8eSAndroid Build Coastguard Worker         virtual void onRecordingConfigurationUpdate(int event,
925*ec779b8eSAndroid Build Coastguard Worker                                                     const record_client_info_t *clientInfo,
926*ec779b8eSAndroid Build Coastguard Worker                                                     const audio_config_base_t *clientConfig,
927*ec779b8eSAndroid Build Coastguard Worker                                                     std::vector<effect_descriptor_t> clientEffects,
928*ec779b8eSAndroid Build Coastguard Worker                                                     const audio_config_base_t *deviceConfig,
929*ec779b8eSAndroid Build Coastguard Worker                                                     std::vector<effect_descriptor_t> effects,
930*ec779b8eSAndroid Build Coastguard Worker                                                     audio_patch_handle_t patchHandle,
931*ec779b8eSAndroid Build Coastguard Worker                                                     audio_source_t source);
932*ec779b8eSAndroid Build Coastguard Worker 
933*ec779b8eSAndroid Build Coastguard Worker         virtual void onAudioVolumeGroupChanged(volume_group_t group, int flags);
934*ec779b8eSAndroid Build Coastguard Worker 
935*ec779b8eSAndroid Build Coastguard Worker         virtual void onRoutingUpdated();
936*ec779b8eSAndroid Build Coastguard Worker 
937*ec779b8eSAndroid Build Coastguard Worker         virtual void onVolumeRangeInitRequest();
938*ec779b8eSAndroid Build Coastguard Worker 
939*ec779b8eSAndroid Build Coastguard Worker         virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use);
940*ec779b8eSAndroid Build Coastguard Worker 
941*ec779b8eSAndroid Build Coastguard Worker         void setSoundTriggerCaptureState(bool active) override;
942*ec779b8eSAndroid Build Coastguard Worker 
943*ec779b8eSAndroid Build Coastguard Worker         status_t getAudioPort(struct audio_port_v7 *port) override;
944*ec779b8eSAndroid Build Coastguard Worker 
945*ec779b8eSAndroid Build Coastguard Worker         status_t updateSecondaryOutputs(
946*ec779b8eSAndroid Build Coastguard Worker                 const TrackSecondaryOutputsMap& trackSecondaryOutputs) override;
947*ec779b8eSAndroid Build Coastguard Worker 
948*ec779b8eSAndroid Build Coastguard Worker         status_t setDeviceConnectedState(
949*ec779b8eSAndroid Build Coastguard Worker                 const struct audio_port_v7 *port, media::DeviceConnectedState state) override;
950*ec779b8eSAndroid Build Coastguard Worker 
951*ec779b8eSAndroid Build Coastguard Worker         status_t invalidateTracks(const std::vector<audio_port_handle_t>& portIds) override;
952*ec779b8eSAndroid Build Coastguard Worker 
953*ec779b8eSAndroid Build Coastguard Worker         status_t getAudioMixPort(const struct audio_port_v7 *devicePort,
954*ec779b8eSAndroid Build Coastguard Worker                                  struct audio_port_v7 *port) override;
955*ec779b8eSAndroid Build Coastguard Worker 
956*ec779b8eSAndroid Build Coastguard Worker         status_t setTracksInternalMute(
957*ec779b8eSAndroid Build Coastguard Worker                 const std::vector<media::TrackInternalMuteInfo>& tracksInternalMute) override;
958*ec779b8eSAndroid Build Coastguard Worker 
959*ec779b8eSAndroid Build Coastguard Worker         status_t getMmapPolicyInfos(
960*ec779b8eSAndroid Build Coastguard Worker                 media::audio::common::AudioMMapPolicyType policyType,
961*ec779b8eSAndroid Build Coastguard Worker                 std::vector<media::audio::common::AudioMMapPolicyInfo> *policyInfos) override;
962*ec779b8eSAndroid Build Coastguard Worker 
963*ec779b8eSAndroid Build Coastguard Worker         error::BinderResult<bool> checkPermissionForInput(const AttributionSourceState& attr,
964*ec779b8eSAndroid Build Coastguard Worker                 const PermissionReqs& req) override;
965*ec779b8eSAndroid Build Coastguard Worker 
966*ec779b8eSAndroid Build Coastguard Worker      private:
967*ec779b8eSAndroid Build Coastguard Worker         AudioPolicyService *mAudioPolicyService;
968*ec779b8eSAndroid Build Coastguard Worker     };
969*ec779b8eSAndroid Build Coastguard Worker 
970*ec779b8eSAndroid Build Coastguard Worker     // --- Notification Client ---
971*ec779b8eSAndroid Build Coastguard Worker     class NotificationClient : public IBinder::DeathRecipient {
972*ec779b8eSAndroid Build Coastguard Worker     public:
973*ec779b8eSAndroid Build Coastguard Worker                             NotificationClient(const sp<AudioPolicyService>& service,
974*ec779b8eSAndroid Build Coastguard Worker                                                 const sp<media::IAudioPolicyServiceClient>& client,
975*ec779b8eSAndroid Build Coastguard Worker                                                 uid_t uid, pid_t pid);
976*ec779b8eSAndroid Build Coastguard Worker         virtual             ~NotificationClient();
977*ec779b8eSAndroid Build Coastguard Worker 
978*ec779b8eSAndroid Build Coastguard Worker                             void      onAudioPortListUpdate();
979*ec779b8eSAndroid Build Coastguard Worker                             void      onAudioPatchListUpdate();
980*ec779b8eSAndroid Build Coastguard Worker                             void      onDynamicPolicyMixStateUpdate(const String8& regId,
981*ec779b8eSAndroid Build Coastguard Worker                                                                     int32_t state);
982*ec779b8eSAndroid Build Coastguard Worker                             void      onAudioVolumeGroupChanged(volume_group_t group, int flags);
983*ec779b8eSAndroid Build Coastguard Worker                             void      onRecordingConfigurationUpdate(
984*ec779b8eSAndroid Build Coastguard Worker                                                     int event,
985*ec779b8eSAndroid Build Coastguard Worker                                                     const record_client_info_t *clientInfo,
986*ec779b8eSAndroid Build Coastguard Worker                                                     const audio_config_base_t *clientConfig,
987*ec779b8eSAndroid Build Coastguard Worker                                                     std::vector<effect_descriptor_t> clientEffects,
988*ec779b8eSAndroid Build Coastguard Worker                                                     const audio_config_base_t *deviceConfig,
989*ec779b8eSAndroid Build Coastguard Worker                                                     std::vector<effect_descriptor_t> effects,
990*ec779b8eSAndroid Build Coastguard Worker                                                     audio_patch_handle_t patchHandle,
991*ec779b8eSAndroid Build Coastguard Worker                                                     audio_source_t source);
992*ec779b8eSAndroid Build Coastguard Worker                             void      onRoutingUpdated();
993*ec779b8eSAndroid Build Coastguard Worker                             void      onVolumeRangeInitRequest();
994*ec779b8eSAndroid Build Coastguard Worker                             void      setAudioPortCallbacksEnabled(bool enabled);
995*ec779b8eSAndroid Build Coastguard Worker                             void setAudioVolumeGroupCallbacksEnabled(bool enabled);
996*ec779b8eSAndroid Build Coastguard Worker 
uid()997*ec779b8eSAndroid Build Coastguard Worker                             uid_t uid() {
998*ec779b8eSAndroid Build Coastguard Worker                                 return mUid;
999*ec779b8eSAndroid Build Coastguard Worker                             }
1000*ec779b8eSAndroid Build Coastguard Worker 
1001*ec779b8eSAndroid Build Coastguard Worker                 // IBinder::DeathRecipient
1002*ec779b8eSAndroid Build Coastguard Worker                 virtual     void        binderDied(const wp<IBinder>& who);
1003*ec779b8eSAndroid Build Coastguard Worker 
1004*ec779b8eSAndroid Build Coastguard Worker     private:
1005*ec779b8eSAndroid Build Coastguard Worker                             NotificationClient(const NotificationClient&);
1006*ec779b8eSAndroid Build Coastguard Worker                             NotificationClient& operator = (const NotificationClient&);
1007*ec779b8eSAndroid Build Coastguard Worker 
1008*ec779b8eSAndroid Build Coastguard Worker         const wp<AudioPolicyService>               mService;
1009*ec779b8eSAndroid Build Coastguard Worker         const uid_t                                mUid;
1010*ec779b8eSAndroid Build Coastguard Worker         const pid_t                                mPid;
1011*ec779b8eSAndroid Build Coastguard Worker         const sp<media::IAudioPolicyServiceClient> mAudioPolicyServiceClient;
1012*ec779b8eSAndroid Build Coastguard Worker               bool                                 mAudioPortCallbacksEnabled;
1013*ec779b8eSAndroid Build Coastguard Worker               bool                                 mAudioVolumeGroupCallbacksEnabled;
1014*ec779b8eSAndroid Build Coastguard Worker     };
1015*ec779b8eSAndroid Build Coastguard Worker 
1016*ec779b8eSAndroid Build Coastguard Worker     public:
1017*ec779b8eSAndroid Build Coastguard Worker     class AudioClient : public virtual RefBase {
1018*ec779b8eSAndroid Build Coastguard Worker     public:
AudioClient(const audio_attributes_t attributes,const audio_io_handle_t io,const AttributionSourceState & attributionSource,const audio_session_t session,audio_port_handle_t portId,const DeviceIdVector deviceIds)1019*ec779b8eSAndroid Build Coastguard Worker                 AudioClient(const audio_attributes_t attributes,
1020*ec779b8eSAndroid Build Coastguard Worker                             const audio_io_handle_t io,
1021*ec779b8eSAndroid Build Coastguard Worker                             const AttributionSourceState& attributionSource,
1022*ec779b8eSAndroid Build Coastguard Worker                             const audio_session_t session,  audio_port_handle_t portId,
1023*ec779b8eSAndroid Build Coastguard Worker                             const DeviceIdVector deviceIds) :
1024*ec779b8eSAndroid Build Coastguard Worker                                 attributes(attributes), io(io), attributionSource(
1025*ec779b8eSAndroid Build Coastguard Worker                                 attributionSource), session(session), portId(portId),
1026*ec779b8eSAndroid Build Coastguard Worker                                 deviceIds(deviceIds), active(false) {}
1027*ec779b8eSAndroid Build Coastguard Worker                 ~AudioClient() override = default;
1028*ec779b8eSAndroid Build Coastguard Worker 
1029*ec779b8eSAndroid Build Coastguard Worker 
1030*ec779b8eSAndroid Build Coastguard Worker         const audio_attributes_t attributes; // source, flags ...
1031*ec779b8eSAndroid Build Coastguard Worker         const audio_io_handle_t io;          // audio HAL stream IO handle
1032*ec779b8eSAndroid Build Coastguard Worker         const AttributionSourceState attributionSource; //client attributionsource
1033*ec779b8eSAndroid Build Coastguard Worker         const audio_session_t session;       // audio session ID
1034*ec779b8eSAndroid Build Coastguard Worker         const audio_port_handle_t portId;
1035*ec779b8eSAndroid Build Coastguard Worker         const DeviceIdVector deviceIds;  // selected input device port IDs
1036*ec779b8eSAndroid Build Coastguard Worker               bool active;                   // Playback/Capture is active or inactive
1037*ec779b8eSAndroid Build Coastguard Worker     };
1038*ec779b8eSAndroid Build Coastguard Worker     private:
1039*ec779b8eSAndroid Build Coastguard Worker 
1040*ec779b8eSAndroid Build Coastguard Worker 
1041*ec779b8eSAndroid Build Coastguard Worker 
1042*ec779b8eSAndroid Build Coastguard Worker     // --- AudioPlaybackClient ---
1043*ec779b8eSAndroid Build Coastguard Worker     // Information about each registered AudioTrack client
1044*ec779b8eSAndroid Build Coastguard Worker     // (between calls to getOutputForAttr() and releaseOutput())
1045*ec779b8eSAndroid Build Coastguard Worker     class AudioPlaybackClient : public AudioClient {
1046*ec779b8eSAndroid Build Coastguard Worker     public:
AudioPlaybackClient(const audio_attributes_t attributes,const audio_io_handle_t io,AttributionSourceState attributionSource,const audio_session_t session,audio_port_handle_t portId,DeviceIdVector deviceIds,audio_stream_type_t stream,bool isSpatialized,audio_channel_mask_t channelMask)1047*ec779b8eSAndroid Build Coastguard Worker                 AudioPlaybackClient(const audio_attributes_t attributes,
1048*ec779b8eSAndroid Build Coastguard Worker                       const audio_io_handle_t io, AttributionSourceState attributionSource,
1049*ec779b8eSAndroid Build Coastguard Worker                             const audio_session_t session, audio_port_handle_t portId,
1050*ec779b8eSAndroid Build Coastguard Worker                             DeviceIdVector deviceIds, audio_stream_type_t stream,
1051*ec779b8eSAndroid Build Coastguard Worker                             bool isSpatialized, audio_channel_mask_t channelMask) :
1052*ec779b8eSAndroid Build Coastguard Worker                     AudioClient(attributes, io, attributionSource, session, portId,
1053*ec779b8eSAndroid Build Coastguard Worker                         deviceIds), stream(stream), isSpatialized(isSpatialized),
1054*ec779b8eSAndroid Build Coastguard Worker                         channelMask(channelMask) {}
1055*ec779b8eSAndroid Build Coastguard Worker                 ~AudioPlaybackClient() override = default;
1056*ec779b8eSAndroid Build Coastguard Worker 
1057*ec779b8eSAndroid Build Coastguard Worker         const audio_stream_type_t stream;
1058*ec779b8eSAndroid Build Coastguard Worker         const bool isSpatialized;
1059*ec779b8eSAndroid Build Coastguard Worker         const audio_channel_mask_t channelMask;
1060*ec779b8eSAndroid Build Coastguard Worker     };
1061*ec779b8eSAndroid Build Coastguard Worker 
1062*ec779b8eSAndroid Build Coastguard Worker     void getPlaybackClientAndEffects(audio_port_handle_t portId,
1063*ec779b8eSAndroid Build Coastguard Worker                                      sp<AudioPlaybackClient>& client,
1064*ec779b8eSAndroid Build Coastguard Worker                                      sp<AudioPolicyEffects>& effects,
1065*ec779b8eSAndroid Build Coastguard Worker                                      const char *context);
1066*ec779b8eSAndroid Build Coastguard Worker 
1067*ec779b8eSAndroid Build Coastguard Worker 
1068*ec779b8eSAndroid Build Coastguard Worker     // A class automatically clearing and restoring binder caller identity inside
1069*ec779b8eSAndroid Build Coastguard Worker     // a code block (scoped variable)
1070*ec779b8eSAndroid Build Coastguard Worker     // Declare one systematically before calling AudioPolicyManager methods so that they are
1071*ec779b8eSAndroid Build Coastguard Worker     // executed with the same level of privilege as audioserver process.
1072*ec779b8eSAndroid Build Coastguard Worker     class AutoCallerClear {
1073*ec779b8eSAndroid Build Coastguard Worker     public:
AutoCallerClear()1074*ec779b8eSAndroid Build Coastguard Worker             AutoCallerClear() :
1075*ec779b8eSAndroid Build Coastguard Worker                 mToken(IPCThreadState::self()->clearCallingIdentity()) {}
~AutoCallerClear()1076*ec779b8eSAndroid Build Coastguard Worker             ~AutoCallerClear() {
1077*ec779b8eSAndroid Build Coastguard Worker                 IPCThreadState::self()->restoreCallingIdentity(mToken);
1078*ec779b8eSAndroid Build Coastguard Worker             }
1079*ec779b8eSAndroid Build Coastguard Worker 
1080*ec779b8eSAndroid Build Coastguard Worker     private:
1081*ec779b8eSAndroid Build Coastguard Worker         const   int64_t mToken;
1082*ec779b8eSAndroid Build Coastguard Worker     };
1083*ec779b8eSAndroid Build Coastguard Worker 
1084*ec779b8eSAndroid Build Coastguard Worker     // Internal dump utilities.
1085*ec779b8eSAndroid Build Coastguard Worker     status_t dumpPermissionDenial(int fd);
1086*ec779b8eSAndroid Build Coastguard Worker     void loadAudioPolicyManager();
1087*ec779b8eSAndroid Build Coastguard Worker     void unloadAudioPolicyManager();
1088*ec779b8eSAndroid Build Coastguard Worker 
1089*ec779b8eSAndroid Build Coastguard Worker     /**
1090*ec779b8eSAndroid Build Coastguard Worker      * Returns the channel masks for active audio tracks on the specified output mixer.
1091*ec779b8eSAndroid Build Coastguard Worker      * The query can be specified to only include spatialized audio tracks or consider
1092*ec779b8eSAndroid Build Coastguard Worker      * all tracks.
1093*ec779b8eSAndroid Build Coastguard Worker      * @param output the I/O handle of the output mixer to consider
1094*ec779b8eSAndroid Build Coastguard Worker      * @param spatializedOnly true if only spatialized tracks should be considered
1095*ec779b8eSAndroid Build Coastguard Worker      * @return a list of channel masks for all active tracks matching the condition.
1096*ec779b8eSAndroid Build Coastguard Worker      */
1097*ec779b8eSAndroid Build Coastguard Worker     std::vector<audio_channel_mask_t> getActiveTracksMasks_l(
1098*ec779b8eSAndroid Build Coastguard Worker             audio_io_handle_t output, bool spatializedOnly = true) REQUIRES(mMutex);
1099*ec779b8eSAndroid Build Coastguard Worker 
1100*ec779b8eSAndroid Build Coastguard Worker     mutable audio_utils::mutex mMutex{audio_utils::MutexOrder::kAudioPolicyService_Mutex};
1101*ec779b8eSAndroid Build Coastguard Worker     // prevents concurrent access to AudioPolicy manager functions changing
1102*ec779b8eSAndroid Build Coastguard Worker     // device connection state or routing.
1103*ec779b8eSAndroid Build Coastguard Worker     // mMutex protects AudioPolicyManager methods that can call into audio flinger
1104*ec779b8eSAndroid Build Coastguard Worker     // and possibly back in to audio policy service and acquire mEffectsLock.
1105*ec779b8eSAndroid Build Coastguard Worker     sp<AudioCommandThread> mAudioCommandThread;     // audio commands thread
1106*ec779b8eSAndroid Build Coastguard Worker     sp<AudioCommandThread> mOutputCommandThread;    // process stop and release output
1107*ec779b8eSAndroid Build Coastguard Worker     AudioPolicyInterface *mAudioPolicyManager;
1108*ec779b8eSAndroid Build Coastguard Worker     AudioPolicyClient *mAudioPolicyClient;
1109*ec779b8eSAndroid Build Coastguard Worker     std::vector<audio_usage_t> mSupportedSystemUsages;
1110*ec779b8eSAndroid Build Coastguard Worker 
1111*ec779b8eSAndroid Build Coastguard Worker     mutable audio_utils::mutex mNotificationClientsMutex{
1112*ec779b8eSAndroid Build Coastguard Worker             audio_utils::MutexOrder::kAudioPolicyService_NotificationClientsMutex};
1113*ec779b8eSAndroid Build Coastguard Worker     DefaultKeyedVector<int64_t, sp<NotificationClient>> mNotificationClients
1114*ec779b8eSAndroid Build Coastguard Worker             GUARDED_BY(mNotificationClientsMutex);
1115*ec779b8eSAndroid Build Coastguard Worker     // Manage all effects configured in audio_effects.conf
1116*ec779b8eSAndroid Build Coastguard Worker     // never hold AudioPolicyService::mMutex when calling AudioPolicyEffects methods as
1117*ec779b8eSAndroid Build Coastguard Worker     // those can call back into AudioPolicyService methods and try to acquire the mutex
1118*ec779b8eSAndroid Build Coastguard Worker     sp<AudioPolicyEffects> mAudioPolicyEffects GUARDED_BY(mMutex);
1119*ec779b8eSAndroid Build Coastguard Worker     audio_mode_t mPhoneState GUARDED_BY(mMutex);
1120*ec779b8eSAndroid Build Coastguard Worker     uid_t mPhoneStateOwnerUid GUARDED_BY(mMutex);
1121*ec779b8eSAndroid Build Coastguard Worker 
1122*ec779b8eSAndroid Build Coastguard Worker     sp<UidPolicy> mUidPolicy GUARDED_BY(mMutex);
1123*ec779b8eSAndroid Build Coastguard Worker     sp<SensorPrivacyPolicy> mSensorPrivacyPolicy GUARDED_BY(mMutex);
1124*ec779b8eSAndroid Build Coastguard Worker 
1125*ec779b8eSAndroid Build Coastguard Worker     DefaultKeyedVector<audio_port_handle_t, sp<AudioRecordClient>> mAudioRecordClients
1126*ec779b8eSAndroid Build Coastguard Worker             GUARDED_BY(mMutex);
1127*ec779b8eSAndroid Build Coastguard Worker     DefaultKeyedVector<audio_port_handle_t, sp<AudioPlaybackClient>> mAudioPlaybackClients
1128*ec779b8eSAndroid Build Coastguard Worker             GUARDED_BY(mMutex);
1129*ec779b8eSAndroid Build Coastguard Worker 
1130*ec779b8eSAndroid Build Coastguard Worker     MediaPackageManager mPackageManager; // To check allowPlaybackCapture
1131*ec779b8eSAndroid Build Coastguard Worker 
1132*ec779b8eSAndroid Build Coastguard Worker     CaptureStateNotifier mCaptureStateNotifier;
1133*ec779b8eSAndroid Build Coastguard Worker 
1134*ec779b8eSAndroid Build Coastguard Worker     // created in onFirstRef() and never cleared: does not need to be guarded by mMutex
1135*ec779b8eSAndroid Build Coastguard Worker     sp<Spatializer> mSpatializer;
1136*ec779b8eSAndroid Build Coastguard Worker 
1137*ec779b8eSAndroid Build Coastguard Worker     void *mLibraryHandle = nullptr;
1138*ec779b8eSAndroid Build Coastguard Worker     CreateAudioPolicyManagerInstance mCreateAudioPolicyManager;
1139*ec779b8eSAndroid Build Coastguard Worker     DestroyAudioPolicyManagerInstance mDestroyAudioPolicyManager;
1140*ec779b8eSAndroid Build Coastguard Worker     std::unique_ptr<media::UsecaseValidator> mUsecaseValidator;
1141*ec779b8eSAndroid Build Coastguard Worker     const sp<NativePermissionController> mPermissionController;
1142*ec779b8eSAndroid Build Coastguard Worker };
1143*ec779b8eSAndroid Build Coastguard Worker 
1144*ec779b8eSAndroid Build Coastguard Worker } // namespace android
1145*ec779b8eSAndroid Build Coastguard Worker 
1146*ec779b8eSAndroid Build Coastguard Worker #endif // ANDROID_AUDIOPOLICYSERVICE_H
1147