• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_AUDIOPOLICYSERVICE_H
18 #define ANDROID_AUDIOPOLICYSERVICE_H
19 
20 #include <cutils/misc.h>
21 #include <cutils/config_utils.h>
22 #include <cutils/compiler.h>
23 #include <utils/String8.h>
24 #include <utils/Vector.h>
25 #include <utils/SortedVector.h>
26 #include <binder/BinderService.h>
27 #include <binder/IUidObserver.h>
28 #include <system/audio.h>
29 #include <system/audio_policy.h>
30 #include <media/IAudioPolicyService.h>
31 #include <media/ToneGenerator.h>
32 #include <media/AudioEffect.h>
33 #include <media/AudioPolicy.h>
34 #include <mediautils/ServiceUtilities.h>
35 #include "AudioPolicyEffects.h"
36 #include <AudioPolicyInterface.h>
37 #include <android/hardware/BnSensorPrivacyListener.h>
38 
39 #include <unordered_map>
40 
41 namespace android {
42 
43 // ----------------------------------------------------------------------------
44 
45 class AudioPolicyService :
46     public BinderService<AudioPolicyService>,
47     public BnAudioPolicyService,
48     public IBinder::DeathRecipient
49 {
50     friend class BinderService<AudioPolicyService>;
51 
52 public:
53     // for BinderService
getServiceName()54     static const char *getServiceName() ANDROID_API { return "media.audio_policy"; }
55 
56     virtual status_t    dump(int fd, const Vector<String16>& args);
57 
58     //
59     // BnAudioPolicyService (see AudioPolicyInterface for method descriptions)
60     //
61 
62     virtual status_t setDeviceConnectionState(audio_devices_t device,
63                                               audio_policy_dev_state_t state,
64                                               const char *device_address,
65                                               const char *device_name,
66                                               audio_format_t encodedFormat);
67     virtual audio_policy_dev_state_t getDeviceConnectionState(
68                                                                 audio_devices_t device,
69                                                                 const char *device_address);
70     virtual status_t handleDeviceConfigChange(audio_devices_t device,
71                                               const char *device_address,
72                                               const char *device_name,
73                                               audio_format_t encodedFormat);
74     virtual status_t setPhoneState(audio_mode_t state);
75     virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config);
76     virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage);
77     virtual audio_io_handle_t getOutput(audio_stream_type_t stream);
78     status_t getOutputForAttr(audio_attributes_t *attr,
79                               audio_io_handle_t *output,
80                               audio_session_t session,
81                               audio_stream_type_t *stream,
82                               pid_t pid,
83                               uid_t uid,
84                               const audio_config_t *config,
85                               audio_output_flags_t flags,
86                               audio_port_handle_t *selectedDeviceId,
87                               audio_port_handle_t *portId,
88                               std::vector<audio_io_handle_t> *secondaryOutputs) override;
89     virtual status_t startOutput(audio_port_handle_t portId);
90     virtual status_t stopOutput(audio_port_handle_t portId);
91     virtual void releaseOutput(audio_port_handle_t portId);
92     virtual status_t getInputForAttr(const audio_attributes_t *attr,
93                                      audio_io_handle_t *input,
94                                      audio_unique_id_t riid,
95                                      audio_session_t session,
96                                      pid_t pid,
97                                      uid_t uid,
98                                      const String16& opPackageName,
99                                      const audio_config_base_t *config,
100                                      audio_input_flags_t flags,
101                                      audio_port_handle_t *selectedDeviceId = NULL,
102                                      audio_port_handle_t *portId = NULL);
103     virtual status_t startInput(audio_port_handle_t portId);
104     virtual status_t stopInput(audio_port_handle_t portId);
105     virtual void releaseInput(audio_port_handle_t portId);
106     virtual status_t initStreamVolume(audio_stream_type_t stream,
107                                       int indexMin,
108                                       int indexMax);
109     virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
110                                           int index,
111                                           audio_devices_t device);
112     virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
113                                           int *index,
114                                           audio_devices_t device);
115 
116     virtual status_t setVolumeIndexForAttributes(const audio_attributes_t &attr,
117                                                  int index,
118                                                  audio_devices_t device);
119     virtual status_t getVolumeIndexForAttributes(const audio_attributes_t &attr,
120                                                  int &index,
121                                                  audio_devices_t device);
122     virtual status_t getMinVolumeIndexForAttributes(const audio_attributes_t &attr,
123                                                     int &index);
124     virtual status_t getMaxVolumeIndexForAttributes(const audio_attributes_t &attr,
125                                                     int &index);
126 
127     virtual uint32_t getStrategyForStream(audio_stream_type_t stream);
128     virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream);
129 
130     virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc);
131     virtual status_t registerEffect(const effect_descriptor_t *desc,
132                                     audio_io_handle_t io,
133                                     uint32_t strategy,
134                                     audio_session_t session,
135                                     int id);
136     virtual status_t unregisterEffect(int id);
137     virtual status_t setEffectEnabled(int id, bool enabled);
138     status_t moveEffectsToIo(const std::vector<int>& ids, audio_io_handle_t io) override;
139     virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const;
140     virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs = 0) const;
141     virtual bool isSourceActive(audio_source_t source) const;
142 
143     virtual status_t queryDefaultPreProcessing(audio_session_t audioSession,
144                                               effect_descriptor_t *descriptors,
145                                               uint32_t *count);
146     virtual status_t addSourceDefaultEffect(const effect_uuid_t *type,
147                                             const String16& opPackageName,
148                                             const effect_uuid_t *uuid,
149                                             int32_t priority,
150                                             audio_source_t source,
151                                             audio_unique_id_t* id);
152     virtual status_t addStreamDefaultEffect(const effect_uuid_t *type,
153                                             const String16& opPackageName,
154                                             const effect_uuid_t *uuid,
155                                             int32_t priority,
156                                             audio_usage_t usage,
157                                             audio_unique_id_t* id);
158     virtual status_t removeSourceDefaultEffect(audio_unique_id_t id);
159     virtual status_t removeStreamDefaultEffect(audio_unique_id_t id);
160 
161     virtual     status_t    onTransact(
162                                 uint32_t code,
163                                 const Parcel& data,
164                                 Parcel* reply,
165                                 uint32_t flags);
166 
167     // IBinder::DeathRecipient
168     virtual     void        binderDied(const wp<IBinder>& who);
169 
170     // RefBase
171     virtual     void        onFirstRef();
172 
173     //
174     // Helpers for the struct audio_policy_service_ops implementation.
175     // This is used by the audio policy manager for certain operations that
176     // are implemented by the policy service.
177     //
178     virtual void setParameters(audio_io_handle_t ioHandle,
179                                const char *keyValuePairs,
180                                int delayMs);
181 
182     virtual status_t setStreamVolume(audio_stream_type_t stream,
183                                      float volume,
184                                      audio_io_handle_t output,
185                                      int delayMs = 0);
186     virtual status_t setVoiceVolume(float volume, int delayMs = 0);
187     status_t setAllowedCapturePolicy(uint_t uid, audio_flags_mask_t capturePolicy) override;
188     virtual bool isOffloadSupported(const audio_offload_info_t &config);
189     virtual bool isDirectOutputSupported(const audio_config_base_t& config,
190                                          const audio_attributes_t& attributes);
191 
192     virtual status_t listAudioPorts(audio_port_role_t role,
193                                     audio_port_type_t type,
194                                     unsigned int *num_ports,
195                                     struct audio_port *ports,
196                                     unsigned int *generation);
197     virtual status_t getAudioPort(struct audio_port *port);
198     virtual status_t createAudioPatch(const struct audio_patch *patch,
199                                        audio_patch_handle_t *handle);
200     virtual status_t releaseAudioPatch(audio_patch_handle_t handle);
201     virtual status_t listAudioPatches(unsigned int *num_patches,
202                                       struct audio_patch *patches,
203                                       unsigned int *generation);
204     virtual status_t setAudioPortConfig(const struct audio_port_config *config);
205 
206     virtual void registerClient(const sp<IAudioPolicyServiceClient>& client);
207 
208     virtual void setAudioPortCallbacksEnabled(bool enabled);
209 
210     virtual void setAudioVolumeGroupCallbacksEnabled(bool enabled);
211 
212     virtual status_t acquireSoundTriggerSession(audio_session_t *session,
213                                            audio_io_handle_t *ioHandle,
214                                            audio_devices_t *device);
215 
216     virtual status_t releaseSoundTriggerSession(audio_session_t session);
217 
218     virtual audio_mode_t getPhoneState();
219 
220     virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration);
221 
222     virtual status_t setUidDeviceAffinities(uid_t uid, const Vector<AudioDeviceTypeAddr>& devices);
223 
224     virtual status_t removeUidDeviceAffinities(uid_t uid);
225 
226     virtual status_t startAudioSource(const struct audio_port_config *source,
227                                       const audio_attributes_t *attributes,
228                                       audio_port_handle_t *portId);
229     virtual status_t stopAudioSource(audio_port_handle_t portId);
230 
231     virtual status_t setMasterMono(bool mono);
232     virtual status_t getMasterMono(bool *mono);
233 
234     virtual float    getStreamVolumeDB(
235                 audio_stream_type_t stream, int index, audio_devices_t device);
236 
237     virtual status_t getSurroundFormats(unsigned int *numSurroundFormats,
238                                         audio_format_t *surroundFormats,
239                                         bool *surroundFormatsEnabled,
240                                         bool reported);
241     virtual status_t getHwOffloadEncodingFormatsSupportedForA2DP(
242                                         std::vector<audio_format_t> *formats);
243     virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled);
244 
245     virtual status_t setAssistantUid(uid_t uid);
246     virtual status_t setA11yServicesUids(const std::vector<uid_t>& uids);
247 
248     virtual bool     isHapticPlaybackSupported();
249 
250     virtual status_t listAudioProductStrategies(AudioProductStrategyVector &strategies);
251     virtual status_t getProductStrategyFromAudioAttributes(const AudioAttributes &aa,
252                                                            product_strategy_t &productStrategy);
253 
254     virtual status_t listAudioVolumeGroups(AudioVolumeGroupVector &groups);
255 
256     virtual status_t getVolumeGroupFromAudioAttributes(const AudioAttributes &aa,
257                                                        volume_group_t &volumeGroup);
258 
259     virtual status_t setRttEnabled(bool enabled);
260 
261             status_t doStopOutput(audio_port_handle_t portId);
262             void doReleaseOutput(audio_port_handle_t portId);
263 
264             status_t clientCreateAudioPatch(const struct audio_patch *patch,
265                                       audio_patch_handle_t *handle,
266                                       int delayMs);
267             status_t clientReleaseAudioPatch(audio_patch_handle_t handle,
268                                              int delayMs);
269             virtual status_t clientSetAudioPortConfig(const struct audio_port_config *config,
270                                                       int delayMs);
271 
272             void removeNotificationClient(uid_t uid, pid_t pid);
273             void onAudioPortListUpdate();
274             void doOnAudioPortListUpdate();
275             void onAudioPatchListUpdate();
276             void doOnAudioPatchListUpdate();
277 
278             void onDynamicPolicyMixStateUpdate(const String8& regId, int32_t state);
279             void doOnDynamicPolicyMixStateUpdate(const String8& regId, int32_t state);
280             void onRecordingConfigurationUpdate(int event,
281                                                 const record_client_info_t *clientInfo,
282                                                 const audio_config_base_t *clientConfig,
283                                                 std::vector<effect_descriptor_t> clientEffects,
284                                                 const audio_config_base_t *deviceConfig,
285                                                 std::vector<effect_descriptor_t> effects,
286                                                 audio_patch_handle_t patchHandle,
287                                                 audio_source_t source);
288             void doOnRecordingConfigurationUpdate(int event,
289                                                   const record_client_info_t *clientInfo,
290                                                   const audio_config_base_t *clientConfig,
291                                                   std::vector<effect_descriptor_t> clientEffects,
292                                                   const audio_config_base_t *deviceConfig,
293                                                   std::vector<effect_descriptor_t> effects,
294                                                   audio_patch_handle_t patchHandle,
295                                                   audio_source_t source);
296 
297             void onAudioVolumeGroupChanged(volume_group_t group, int flags);
298             void doOnAudioVolumeGroupChanged(volume_group_t group, int flags);
299             void setEffectSuspended(int effectId,
300                                     audio_session_t sessionId,
301                                     bool suspended);
302 
303 private:
304                         AudioPolicyService() ANDROID_API;
305     virtual             ~AudioPolicyService();
306 
307             status_t dumpInternals(int fd);
308 
309     // Handles binder shell commands
310     virtual status_t shellCommand(int in, int out, int err, Vector<String16>& args);
311 
312     // Sets whether the given UID records only silence
313     virtual void setAppState_l(uid_t uid, app_state_t state);
314 
315     // Overrides the UID state as if it is idle
316     status_t handleSetUidState(Vector<String16>& args, int err);
317 
318     // Clears the override for the UID state
319     status_t handleResetUidState(Vector<String16>& args, int err);
320 
321     // Gets the UID state
322     status_t handleGetUidState(Vector<String16>& args, int out, int err);
323 
324     // Prints the shell command help
325     status_t printHelp(int out);
326 
327     std::string getDeviceTypeStrForPortId(audio_port_handle_t portId);
328 
329     status_t getAudioPolicyEffects(sp<AudioPolicyEffects>& audioPolicyEffects);
330 
331     app_state_t apmStatFromAmState(int amState);
332 
333     void updateUidStates();
334     void updateUidStates_l();
335 
336     void silenceAllRecordings_l();
337 
338     static bool isPrivacySensitiveSource(audio_source_t source);
339     static bool isVirtualSource(audio_source_t source);
340 
341     // If recording we need to make sure the UID is allowed to do that. If the UID is idle
342     // then it cannot record and gets buffers with zeros - silence. As soon as the UID
343     // transitions to an active state we will start reporting buffers with data. This approach
344     // transparently handles recording while the UID transitions between idle/active state
345     // avoiding to get stuck in a state receiving non-empty buffers while idle or in a state
346     // receiving empty buffers while active.
347     class UidPolicy : public BnUidObserver, public virtual IBinder::DeathRecipient {
348     public:
UidPolicy(wp<AudioPolicyService> service)349         explicit UidPolicy(wp<AudioPolicyService> service)
350                 : mService(service), mObserverRegistered(false),
351                   mAssistantUid(0), mRttEnabled(false) {}
352 
353         void registerSelf();
354         void unregisterSelf();
355 
356         // IBinder::DeathRecipient implementation
357         void binderDied(const wp<IBinder> &who) override;
358 
359         bool isUidActive(uid_t uid);
360         int getUidState(uid_t uid);
setAssistantUid(uid_t uid)361         void setAssistantUid(uid_t uid) { mAssistantUid = uid; }
isAssistantUid(uid_t uid)362         bool isAssistantUid(uid_t uid) { return uid == mAssistantUid; }
setA11yUids(const std::vector<uid_t> & uids)363         void setA11yUids(const std::vector<uid_t>& uids) { mA11yUids.clear(); mA11yUids = uids; }
364         bool isA11yUid(uid_t uid);
365         bool isA11yOnTop();
setRttEnabled(bool enabled)366         void setRttEnabled(bool enabled) { mRttEnabled = enabled; }
isRttEnabled()367         bool isRttEnabled() { return mRttEnabled; }
368 
369         // BnUidObserver implementation
370         void onUidActive(uid_t uid) override;
371         void onUidGone(uid_t uid, bool disabled) override;
372         void onUidIdle(uid_t uid, bool disabled) override;
373         void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq);
374 
addOverrideUid(uid_t uid,bool active)375         void addOverrideUid(uid_t uid, bool active) { updateOverrideUid(uid, active, true); }
removeOverrideUid(uid_t uid)376         void removeOverrideUid(uid_t uid) { updateOverrideUid(uid, false, false); }
377 
378         void updateUid(std::unordered_map<uid_t, std::pair<bool, int>> *uids,
379                        uid_t uid, bool active, int state, bool insert);
380 
381      private:
382         void notifyService();
383         void updateOverrideUid(uid_t uid, bool active, bool insert);
384         void updateUidLocked(std::unordered_map<uid_t, std::pair<bool, int>> *uids,
385                              uid_t uid, bool active, int state, bool insert);
386         void checkRegistered();
387 
388         wp<AudioPolicyService> mService;
389         Mutex mLock;
390         bool mObserverRegistered;
391         std::unordered_map<uid_t, std::pair<bool, int>> mOverrideUids;
392         std::unordered_map<uid_t, std::pair<bool, int>> mCachedUids;
393         uid_t mAssistantUid;
394         std::vector<uid_t> mA11yUids;
395         bool mRttEnabled;
396     };
397 
398     // If sensor privacy is enabled then all apps, including those that are active, should be
399     // prevented from recording. This is handled similar to idle UIDs, any app that attempts
400     // to record while sensor privacy is enabled will receive buffers with zeros. As soon as
401     // sensor privacy is disabled active apps will receive the expected data when recording.
402     class SensorPrivacyPolicy : public hardware::BnSensorPrivacyListener {
403         public:
SensorPrivacyPolicy(wp<AudioPolicyService> service)404             explicit SensorPrivacyPolicy(wp<AudioPolicyService> service)
405                     : mService(service) {}
406 
407             void registerSelf();
408             void unregisterSelf();
409 
410             bool isSensorPrivacyEnabled();
411 
412             binder::Status onSensorPrivacyChanged(bool enabled);
413 
414         private:
415             wp<AudioPolicyService> mService;
416             std::atomic_bool mSensorPrivacyEnabled;
417     };
418 
419     // Thread used to send audio config commands to audio flinger
420     // For audio config commands, it is necessary because audio flinger requires that the calling
421     // process (user) has permission to modify audio settings.
422     class AudioCommandThread : public Thread {
423         class AudioCommand;
424     public:
425 
426         // commands for tone AudioCommand
427         enum {
428             SET_VOLUME,
429             SET_PARAMETERS,
430             SET_VOICE_VOLUME,
431             STOP_OUTPUT,
432             RELEASE_OUTPUT,
433             CREATE_AUDIO_PATCH,
434             RELEASE_AUDIO_PATCH,
435             UPDATE_AUDIOPORT_LIST,
436             UPDATE_AUDIOPATCH_LIST,
437             CHANGED_AUDIOVOLUMEGROUP,
438             SET_AUDIOPORT_CONFIG,
439             DYN_POLICY_MIX_STATE_UPDATE,
440             RECORDING_CONFIGURATION_UPDATE,
441             SET_EFFECT_SUSPENDED,
442         };
443 
444         AudioCommandThread (String8 name, const wp<AudioPolicyService>& service);
445         virtual             ~AudioCommandThread();
446 
447                     status_t    dump(int fd);
448 
449         // Thread virtuals
450         virtual     void        onFirstRef();
451         virtual     bool        threadLoop();
452 
453                     void        exit();
454                     status_t    volumeCommand(audio_stream_type_t stream, float volume,
455                                             audio_io_handle_t output, int delayMs = 0);
456                     status_t    parametersCommand(audio_io_handle_t ioHandle,
457                                             const char *keyValuePairs, int delayMs = 0);
458                     status_t    voiceVolumeCommand(float volume, int delayMs = 0);
459                     void        stopOutputCommand(audio_port_handle_t portId);
460                     void        releaseOutputCommand(audio_port_handle_t portId);
461                     status_t    sendCommand(sp<AudioCommand>& command, int delayMs = 0);
462                     void        insertCommand_l(sp<AudioCommand>& command, int delayMs = 0);
463                     status_t    createAudioPatchCommand(const struct audio_patch *patch,
464                                                         audio_patch_handle_t *handle,
465                                                         int delayMs);
466                     status_t    releaseAudioPatchCommand(audio_patch_handle_t handle,
467                                                          int delayMs);
468                     void        updateAudioPortListCommand();
469                     void        updateAudioPatchListCommand();
470                     void        changeAudioVolumeGroupCommand(volume_group_t group, int flags);
471                     status_t    setAudioPortConfigCommand(const struct audio_port_config *config,
472                                                           int delayMs);
473                     void        dynamicPolicyMixStateUpdateCommand(const String8& regId,
474                                                                    int32_t state);
475                     void        recordingConfigurationUpdateCommand(
476                                                     int event,
477                                                     const record_client_info_t *clientInfo,
478                                                     const audio_config_base_t *clientConfig,
479                                                     std::vector<effect_descriptor_t> clientEffects,
480                                                     const audio_config_base_t *deviceConfig,
481                                                     std::vector<effect_descriptor_t> effects,
482                                                     audio_patch_handle_t patchHandle,
483                                                     audio_source_t source);
484                     void        setEffectSuspendedCommand(int effectId,
485                                                           audio_session_t sessionId,
486                                                           bool suspended);
487                     void        insertCommand_l(AudioCommand *command, int delayMs = 0);
488     private:
489         class AudioCommandData;
490 
491         // descriptor for requested tone playback event
492         class AudioCommand: public RefBase {
493 
494         public:
AudioCommand()495             AudioCommand()
496             : mCommand(-1), mStatus(NO_ERROR), mWaitStatus(false) {}
497 
498             void dump(char* buffer, size_t size);
499 
500             int mCommand;   // SET_VOLUME, SET_PARAMETERS...
501             nsecs_t mTime;  // time stamp
502             Mutex mLock;    // mutex associated to mCond
503             Condition mCond; // condition for status return
504             status_t mStatus; // command status
505             bool mWaitStatus; // true if caller is waiting for status
506             sp<AudioCommandData> mParam;     // command specific parameter data
507         };
508 
509         class AudioCommandData: public RefBase {
510         public:
~AudioCommandData()511             virtual ~AudioCommandData() {}
512         protected:
AudioCommandData()513             AudioCommandData() {}
514         };
515 
516         class VolumeData : public AudioCommandData {
517         public:
518             audio_stream_type_t mStream;
519             float mVolume;
520             audio_io_handle_t mIO;
521         };
522 
523         class ParametersData : public AudioCommandData {
524         public:
525             audio_io_handle_t mIO;
526             String8 mKeyValuePairs;
527         };
528 
529         class VoiceVolumeData : public AudioCommandData {
530         public:
531             float mVolume;
532         };
533 
534         class StopOutputData : public AudioCommandData {
535         public:
536             audio_port_handle_t mPortId;
537         };
538 
539         class ReleaseOutputData : public AudioCommandData {
540         public:
541             audio_port_handle_t mPortId;
542         };
543 
544         class CreateAudioPatchData : public AudioCommandData {
545         public:
546             struct audio_patch mPatch;
547             audio_patch_handle_t mHandle;
548         };
549 
550         class ReleaseAudioPatchData : public AudioCommandData {
551         public:
552             audio_patch_handle_t mHandle;
553         };
554 
555         class AudioVolumeGroupData : public AudioCommandData {
556         public:
557             volume_group_t mGroup;
558             int mFlags;
559         };
560 
561         class SetAudioPortConfigData : public AudioCommandData {
562         public:
563             struct audio_port_config mConfig;
564         };
565 
566         class DynPolicyMixStateUpdateData : public AudioCommandData {
567         public:
568             String8 mRegId;
569             int32_t mState;
570         };
571 
572         class RecordingConfigurationUpdateData : public AudioCommandData {
573         public:
574             int mEvent;
575             record_client_info_t mClientInfo;
576             struct audio_config_base mClientConfig;
577             std::vector<effect_descriptor_t> mClientEffects;
578             struct audio_config_base mDeviceConfig;
579             std::vector<effect_descriptor_t> mEffects;
580             audio_patch_handle_t mPatchHandle;
581             audio_source_t mSource;
582         };
583 
584         class SetEffectSuspendedData : public AudioCommandData {
585         public:
586             int mEffectId;
587             audio_session_t mSessionId;
588             bool mSuspended;
589         };
590 
591         Mutex   mLock;
592         Condition mWaitWorkCV;
593         Vector < sp<AudioCommand> > mAudioCommands; // list of pending commands
594         sp<AudioCommand> mLastCommand;      // last processed command (used by dump)
595         String8 mName;                      // string used by wake lock fo delayed commands
596         wp<AudioPolicyService> mService;
597     };
598 
599     class AudioPolicyClient : public AudioPolicyClientInterface
600     {
601      public:
AudioPolicyClient(AudioPolicyService * service)602         explicit AudioPolicyClient(AudioPolicyService *service) : mAudioPolicyService(service) {}
~AudioPolicyClient()603         virtual ~AudioPolicyClient() {}
604 
605         //
606         // Audio HW module functions
607         //
608 
609         // loads a HW module.
610         virtual audio_module_handle_t loadHwModule(const char *name);
611 
612         //
613         // Audio output Control functions
614         //
615 
616         // opens an audio output with the requested parameters. The parameter values can indicate to use the default values
617         // in case the audio policy manager has no specific requirements for the output being opened.
618         // When the function returns, the parameter values reflect the actual values used by the audio hardware output stream.
619         // The audio policy manager can check if the proposed parameters are suitable or not and act accordingly.
620         virtual status_t openOutput(audio_module_handle_t module,
621                                     audio_io_handle_t *output,
622                                     audio_config_t *config,
623                                     audio_devices_t *devices,
624                                     const String8& address,
625                                     uint32_t *latencyMs,
626                                     audio_output_flags_t flags);
627         // creates a special output that is duplicated to the two outputs passed as arguments. The duplication is performed by
628         // a special mixer thread in the AudioFlinger.
629         virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, audio_io_handle_t output2);
630         // closes the output stream
631         virtual status_t closeOutput(audio_io_handle_t output);
632         // suspends the output. When an output is suspended, the corresponding audio hardware output stream is placed in
633         // standby and the AudioTracks attached to the mixer thread are still processed but the output mix is discarded.
634         virtual status_t suspendOutput(audio_io_handle_t output);
635         // restores a suspended output.
636         virtual status_t restoreOutput(audio_io_handle_t output);
637 
638         //
639         // Audio input Control functions
640         //
641 
642         // opens an audio input
643         virtual audio_io_handle_t openInput(audio_module_handle_t module,
644                                             audio_io_handle_t *input,
645                                             audio_config_t *config,
646                                             audio_devices_t *devices,
647                                             const String8& address,
648                                             audio_source_t source,
649                                             audio_input_flags_t flags);
650         // closes an audio input
651         virtual status_t closeInput(audio_io_handle_t input);
652         //
653         // misc control functions
654         //
655 
656         // set a stream volume for a particular output. For the same user setting, a given stream type can have different volumes
657         // for each output (destination device) it is attached to.
658         virtual status_t setStreamVolume(audio_stream_type_t stream, float volume, audio_io_handle_t output, int delayMs = 0);
659 
660         // invalidate a stream type, causing a reroute to an unspecified new output
661         virtual status_t invalidateStream(audio_stream_type_t stream);
662 
663         // function enabling to send proprietary informations directly from audio policy manager to audio hardware interface.
664         virtual void setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs, int delayMs = 0);
665         // function enabling to receive proprietary informations directly from audio hardware interface to audio policy manager.
666         virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys);
667 
668         // set down link audio volume.
669         virtual status_t setVoiceVolume(float volume, int delayMs = 0);
670 
671         // move effect to the specified output
672         virtual status_t moveEffects(audio_session_t session,
673                                          audio_io_handle_t srcOutput,
674                                          audio_io_handle_t dstOutput);
675 
676                 void setEffectSuspended(int effectId,
677                                         audio_session_t sessionId,
678                                         bool suspended) override;
679 
680         /* Create a patch between several source and sink ports */
681         virtual status_t createAudioPatch(const struct audio_patch *patch,
682                                            audio_patch_handle_t *handle,
683                                            int delayMs);
684 
685         /* Release a patch */
686         virtual status_t releaseAudioPatch(audio_patch_handle_t handle,
687                                            int delayMs);
688 
689         /* Set audio port configuration */
690         virtual status_t setAudioPortConfig(const struct audio_port_config *config, int delayMs);
691 
692         virtual void onAudioPortListUpdate();
693         virtual void onAudioPatchListUpdate();
694         virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state);
695         virtual void onRecordingConfigurationUpdate(int event,
696                                                     const record_client_info_t *clientInfo,
697                                                     const audio_config_base_t *clientConfig,
698                                                     std::vector<effect_descriptor_t> clientEffects,
699                                                     const audio_config_base_t *deviceConfig,
700                                                     std::vector<effect_descriptor_t> effects,
701                                                     audio_patch_handle_t patchHandle,
702                                                     audio_source_t source);
703 
704         virtual void onAudioVolumeGroupChanged(volume_group_t group, int flags);
705 
706         virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use);
707 
708      private:
709         AudioPolicyService *mAudioPolicyService;
710     };
711 
712     // --- Notification Client ---
713     class NotificationClient : public IBinder::DeathRecipient {
714     public:
715                             NotificationClient(const sp<AudioPolicyService>& service,
716                                                 const sp<IAudioPolicyServiceClient>& client,
717                                                 uid_t uid, pid_t pid);
718         virtual             ~NotificationClient();
719 
720                             void      onAudioPortListUpdate();
721                             void      onAudioPatchListUpdate();
722                             void      onDynamicPolicyMixStateUpdate(const String8& regId,
723                                                                     int32_t state);
724                             void      onAudioVolumeGroupChanged(volume_group_t group, int flags);
725                             void      onRecordingConfigurationUpdate(
726                                                     int event,
727                                                     const record_client_info_t *clientInfo,
728                                                     const audio_config_base_t *clientConfig,
729                                                     std::vector<effect_descriptor_t> clientEffects,
730                                                     const audio_config_base_t *deviceConfig,
731                                                     std::vector<effect_descriptor_t> effects,
732                                                     audio_patch_handle_t patchHandle,
733                                                     audio_source_t source);
734                             void      setAudioPortCallbacksEnabled(bool enabled);
735                             void setAudioVolumeGroupCallbacksEnabled(bool enabled);
736 
uid()737                             uid_t uid() {
738                                 return mUid;
739                             }
740 
741                 // IBinder::DeathRecipient
742                 virtual     void        binderDied(const wp<IBinder>& who);
743 
744     private:
745                             NotificationClient(const NotificationClient&);
746                             NotificationClient& operator = (const NotificationClient&);
747 
748         const wp<AudioPolicyService>        mService;
749         const uid_t                         mUid;
750         const pid_t                         mPid;
751         const sp<IAudioPolicyServiceClient> mAudioPolicyServiceClient;
752               bool                          mAudioPortCallbacksEnabled;
753               bool                          mAudioVolumeGroupCallbacksEnabled;
754     };
755 
756     class AudioClient : public virtual RefBase {
757     public:
AudioClient(const audio_attributes_t attributes,const audio_io_handle_t io,uid_t uid,pid_t pid,const audio_session_t session,const audio_port_handle_t deviceId)758                 AudioClient(const audio_attributes_t attributes,
759                             const audio_io_handle_t io, uid_t uid, pid_t pid,
760                             const audio_session_t session, const audio_port_handle_t deviceId) :
761                                 attributes(attributes), io(io), uid(uid), pid(pid),
762                                 session(session), deviceId(deviceId), active(false) {}
763                 ~AudioClient() override = default;
764 
765 
766         const audio_attributes_t attributes; // source, flags ...
767         const audio_io_handle_t io;          // audio HAL stream IO handle
768         const uid_t uid;                     // client UID
769         const pid_t pid;                     // client PID
770         const audio_session_t session;       // audio session ID
771         const audio_port_handle_t deviceId;  // selected input device port ID
772               bool active;                   // Playback/Capture is active or inactive
773     };
774 
775     // --- AudioRecordClient ---
776     // Information about each registered AudioRecord client
777     // (between calls to getInputForAttr() and releaseInput())
778     class AudioRecordClient : public AudioClient {
779     public:
AudioRecordClient(const audio_attributes_t attributes,const audio_io_handle_t io,uid_t uid,pid_t pid,const audio_session_t session,const audio_port_handle_t deviceId,const String16 & opPackageName,bool canCaptureOutput,bool canCaptureHotword)780                 AudioRecordClient(const audio_attributes_t attributes,
781                           const audio_io_handle_t io, uid_t uid, pid_t pid,
782                           const audio_session_t session, const audio_port_handle_t deviceId,
783                           const String16& opPackageName,
784                           bool canCaptureOutput, bool canCaptureHotword) :
785                     AudioClient(attributes, io, uid, pid, session, deviceId),
786                     opPackageName(opPackageName), startTimeNs(0),
787                     canCaptureOutput(canCaptureOutput), canCaptureHotword(canCaptureHotword) {}
788                 ~AudioRecordClient() override = default;
789 
790         const String16 opPackageName;        // client package name
791         nsecs_t startTimeNs;
792         const bool canCaptureOutput;
793         const bool canCaptureHotword;
794     };
795 
796     // --- AudioPlaybackClient ---
797     // Information about each registered AudioTrack client
798     // (between calls to getOutputForAttr() and releaseOutput())
799     class AudioPlaybackClient : public AudioClient {
800     public:
AudioPlaybackClient(const audio_attributes_t attributes,const audio_io_handle_t io,uid_t uid,pid_t pid,const audio_session_t session,audio_port_handle_t deviceId,audio_stream_type_t stream)801                 AudioPlaybackClient(const audio_attributes_t attributes,
802                       const audio_io_handle_t io, uid_t uid, pid_t pid,
803                             const audio_session_t session, audio_port_handle_t deviceId,
804                             audio_stream_type_t stream) :
805                     AudioClient(attributes, io, uid, pid, session, deviceId), stream(stream) {}
806                 ~AudioPlaybackClient() override = default;
807 
808         const audio_stream_type_t stream;
809     };
810 
811     void getPlaybackClientAndEffects(audio_port_handle_t portId,
812                                      sp<AudioPlaybackClient>& client,
813                                      sp<AudioPolicyEffects>& effects,
814                                      const char *context);
815 
816 
817     // A class automatically clearing and restoring binder caller identity inside
818     // a code block (scoped variable)
819     // Declare one systematically before calling AudioPolicyManager methods so that they are
820     // executed with the same level of privilege as audioserver process.
821     class AutoCallerClear {
822     public:
AutoCallerClear()823             AutoCallerClear() :
824                 mToken(IPCThreadState::self()->clearCallingIdentity()) {}
~AutoCallerClear()825             ~AutoCallerClear() {
826                 IPCThreadState::self()->restoreCallingIdentity(mToken);
827             }
828 
829     private:
830         const   int64_t mToken;
831     };
832 
833     // Internal dump utilities.
834     status_t dumpPermissionDenial(int fd);
835 
836 
837     mutable Mutex mLock;    // prevents concurrent access to AudioPolicy manager functions changing
838                             // device connection state  or routing
839     // Note: lock acquisition order is always mLock > mEffectsLock:
840     // mLock protects AudioPolicyManager methods that can call into audio flinger
841     // and possibly back in to audio policy service and acquire mEffectsLock.
842     sp<AudioCommandThread> mAudioCommandThread;     // audio commands thread
843     sp<AudioCommandThread> mOutputCommandThread;    // process stop and release output
844     struct audio_policy_device *mpAudioPolicyDev;
845     struct audio_policy *mpAudioPolicy;
846     AudioPolicyInterface *mAudioPolicyManager;
847     AudioPolicyClient *mAudioPolicyClient;
848 
849     DefaultKeyedVector< int64_t, sp<NotificationClient> >    mNotificationClients;
850     Mutex mNotificationClientsLock;  // protects mNotificationClients
851     // Manage all effects configured in audio_effects.conf
852     // never hold AudioPolicyService::mLock when calling AudioPolicyEffects methods as
853     // those can call back into AudioPolicyService methods and try to acquire the mutex
854     sp<AudioPolicyEffects> mAudioPolicyEffects;
855     audio_mode_t mPhoneState;
856 
857     sp<UidPolicy> mUidPolicy;
858     sp<SensorPrivacyPolicy> mSensorPrivacyPolicy;
859 
860     DefaultKeyedVector< audio_port_handle_t, sp<AudioRecordClient> >   mAudioRecordClients;
861     DefaultKeyedVector< audio_port_handle_t, sp<AudioPlaybackClient> >   mAudioPlaybackClients;
862 
863     MediaPackageManager mPackageManager; // To check allowPlaybackCapture
864 };
865 
866 } // namespace android
867 
868 #endif // ANDROID_AUDIOPOLICYSERVICE_H
869