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 "AudioPolicyEffects.h"
35 #include "managerdefault/AudioPolicyManager.h"
36 
37 #include <unordered_map>
38 
39 namespace android {
40 
41 using namespace std;
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     virtual audio_policy_dev_state_t getDeviceConnectionState(
67                                                                 audio_devices_t device,
68                                                                 const char *device_address);
69     virtual status_t handleDeviceConfigChange(audio_devices_t device,
70                                               const char *device_address,
71                                               const char *device_name);
72     virtual status_t setPhoneState(audio_mode_t state);
73     virtual status_t setForceUse(audio_policy_force_use_t usage, audio_policy_forced_cfg_t config);
74     virtual audio_policy_forced_cfg_t getForceUse(audio_policy_force_use_t usage);
75     virtual audio_io_handle_t getOutput(audio_stream_type_t stream);
76     virtual status_t getOutputForAttr(const audio_attributes_t *attr,
77                                       audio_io_handle_t *output,
78                                       audio_session_t session,
79                                       audio_stream_type_t *stream,
80                                       pid_t pid,
81                                       uid_t uid,
82                                       const audio_config_t *config,
83                                       audio_output_flags_t flags,
84                                       audio_port_handle_t *selectedDeviceId,
85                                       audio_port_handle_t *portId);
86     virtual status_t startOutput(audio_io_handle_t output,
87                                  audio_stream_type_t stream,
88                                  audio_session_t session);
89     virtual status_t stopOutput(audio_io_handle_t output,
90                                 audio_stream_type_t stream,
91                                 audio_session_t session);
92     virtual void releaseOutput(audio_io_handle_t output,
93                                audio_stream_type_t stream,
94                                audio_session_t session);
95     virtual status_t getInputForAttr(const audio_attributes_t *attr,
96                                      audio_io_handle_t *input,
97                                      audio_session_t session,
98                                      pid_t pid,
99                                      uid_t uid,
100                                      const String16& opPackageName,
101                                      const audio_config_base_t *config,
102                                      audio_input_flags_t flags,
103                                      audio_port_handle_t *selectedDeviceId = NULL,
104                                      audio_port_handle_t *portId = NULL);
105     virtual status_t startInput(audio_port_handle_t portId,
106                                 bool *silenced);
107     virtual status_t stopInput(audio_port_handle_t portId);
108     virtual void releaseInput(audio_port_handle_t portId);
109     virtual status_t initStreamVolume(audio_stream_type_t stream,
110                                       int indexMin,
111                                       int indexMax);
112     virtual status_t setStreamVolumeIndex(audio_stream_type_t stream,
113                                           int index,
114                                           audio_devices_t device);
115     virtual status_t getStreamVolumeIndex(audio_stream_type_t stream,
116                                           int *index,
117                                           audio_devices_t device);
118 
119     virtual uint32_t getStrategyForStream(audio_stream_type_t stream);
120     virtual audio_devices_t getDevicesForStream(audio_stream_type_t stream);
121 
122     virtual audio_io_handle_t getOutputForEffect(const effect_descriptor_t *desc);
123     virtual status_t registerEffect(const effect_descriptor_t *desc,
124                                     audio_io_handle_t io,
125                                     uint32_t strategy,
126                                     audio_session_t session,
127                                     int id);
128     virtual status_t unregisterEffect(int id);
129     virtual status_t setEffectEnabled(int id, bool enabled);
130     virtual bool isStreamActive(audio_stream_type_t stream, uint32_t inPastMs = 0) const;
131     virtual bool isStreamActiveRemotely(audio_stream_type_t stream, uint32_t inPastMs = 0) const;
132     virtual bool isSourceActive(audio_source_t source) const;
133 
134     virtual status_t queryDefaultPreProcessing(audio_session_t audioSession,
135                                               effect_descriptor_t *descriptors,
136                                               uint32_t *count);
137     virtual     status_t    onTransact(
138                                 uint32_t code,
139                                 const Parcel& data,
140                                 Parcel* reply,
141                                 uint32_t flags);
142 
143     // IBinder::DeathRecipient
144     virtual     void        binderDied(const wp<IBinder>& who);
145 
146     // RefBase
147     virtual     void        onFirstRef();
148 
149     //
150     // Helpers for the struct audio_policy_service_ops implementation.
151     // This is used by the audio policy manager for certain operations that
152     // are implemented by the policy service.
153     //
154     virtual void setParameters(audio_io_handle_t ioHandle,
155                                const char *keyValuePairs,
156                                int delayMs);
157 
158     virtual status_t setStreamVolume(audio_stream_type_t stream,
159                                      float volume,
160                                      audio_io_handle_t output,
161                                      int delayMs = 0);
162     virtual status_t startTone(audio_policy_tone_t tone, audio_stream_type_t stream);
163     virtual status_t stopTone();
164     virtual status_t setVoiceVolume(float volume, int delayMs = 0);
165     virtual bool isOffloadSupported(const audio_offload_info_t &config);
166 
167     virtual status_t listAudioPorts(audio_port_role_t role,
168                                     audio_port_type_t type,
169                                     unsigned int *num_ports,
170                                     struct audio_port *ports,
171                                     unsigned int *generation);
172     virtual status_t getAudioPort(struct audio_port *port);
173     virtual status_t createAudioPatch(const struct audio_patch *patch,
174                                        audio_patch_handle_t *handle);
175     virtual status_t releaseAudioPatch(audio_patch_handle_t handle);
176     virtual status_t listAudioPatches(unsigned int *num_patches,
177                                       struct audio_patch *patches,
178                                       unsigned int *generation);
179     virtual status_t setAudioPortConfig(const struct audio_port_config *config);
180 
181     virtual void registerClient(const sp<IAudioPolicyServiceClient>& client);
182 
183     virtual void setAudioPortCallbacksEnabled(bool enabled);
184 
185     virtual status_t acquireSoundTriggerSession(audio_session_t *session,
186                                            audio_io_handle_t *ioHandle,
187                                            audio_devices_t *device);
188 
189     virtual status_t releaseSoundTriggerSession(audio_session_t session);
190 
191     virtual audio_mode_t getPhoneState();
192 
193     virtual status_t registerPolicyMixes(const Vector<AudioMix>& mixes, bool registration);
194 
195     virtual status_t startAudioSource(const struct audio_port_config *source,
196                                       const audio_attributes_t *attributes,
197                                       audio_patch_handle_t *handle);
198     virtual status_t stopAudioSource(audio_patch_handle_t handle);
199 
200     virtual status_t setMasterMono(bool mono);
201     virtual status_t getMasterMono(bool *mono);
202 
203     virtual float    getStreamVolumeDB(
204                 audio_stream_type_t stream, int index, audio_devices_t device);
205 
206     virtual status_t getSurroundFormats(unsigned int *numSurroundFormats,
207                                         audio_format_t *surroundFormats,
208                                         bool *surroundFormatsEnabled,
209                                         bool reported);
210     virtual status_t setSurroundFormatEnabled(audio_format_t audioFormat, bool enabled);
211 
212             status_t doStopOutput(audio_io_handle_t output,
213                                   audio_stream_type_t stream,
214                                   audio_session_t session);
215             void doReleaseOutput(audio_io_handle_t output,
216                                  audio_stream_type_t stream,
217                                  audio_session_t session);
218 
219             status_t clientCreateAudioPatch(const struct audio_patch *patch,
220                                       audio_patch_handle_t *handle,
221                                       int delayMs);
222             status_t clientReleaseAudioPatch(audio_patch_handle_t handle,
223                                              int delayMs);
224             virtual status_t clientSetAudioPortConfig(const struct audio_port_config *config,
225                                                       int delayMs);
226 
227             void removeNotificationClient(uid_t uid);
228             void onAudioPortListUpdate();
229             void doOnAudioPortListUpdate();
230             void onAudioPatchListUpdate();
231             void doOnAudioPatchListUpdate();
232 
233             void onDynamicPolicyMixStateUpdate(const String8& regId, int32_t state);
234             void doOnDynamicPolicyMixStateUpdate(const String8& regId, int32_t state);
235             void onRecordingConfigurationUpdate(int event, const record_client_info_t *clientInfo,
236                     const audio_config_base_t *clientConfig,
237                     const audio_config_base_t *deviceConfig, audio_patch_handle_t patchHandle);
238             void doOnRecordingConfigurationUpdate(int event, const record_client_info_t *clientInfo,
239                     const audio_config_base_t *clientConfig,
240                     const audio_config_base_t *deviceConfig, audio_patch_handle_t patchHandle);
241 
242 private:
243                         AudioPolicyService() ANDROID_API;
244     virtual             ~AudioPolicyService();
245 
246             status_t dumpInternals(int fd);
247 
248     // Handles binder shell commands
249     virtual status_t shellCommand(int in, int out, int err, Vector<String16>& args);
250 
251     // Sets whether the given UID records only silence
252     virtual void setRecordSilenced(uid_t uid, bool silenced);
253 
254     // Overrides the UID state as if it is idle
255     status_t handleSetUidState(Vector<String16>& args, int err);
256 
257     // Clears the override for the UID state
258     status_t handleResetUidState(Vector<String16>& args, int err);
259 
260     // Gets the UID state
261     status_t handleGetUidState(Vector<String16>& args, int out, int err);
262 
263     // Prints the shell command help
264     status_t printHelp(int out);
265 
266     std::string getDeviceTypeStrForPortId(audio_port_handle_t portId);
267 
268     // If recording we need to make sure the UID is allowed to do that. If the UID is idle
269     // then it cannot record and gets buffers with zeros - silence. As soon as the UID
270     // transitions to an active state we will start reporting buffers with data. This approach
271     // transparently handles recording while the UID transitions between idle/active state
272     // avoiding to get stuck in a state receiving non-empty buffers while idle or in a state
273     // receiving empty buffers while active.
274     class UidPolicy : public BnUidObserver, public virtual IBinder::DeathRecipient {
275     public:
UidPolicy(wp<AudioPolicyService> service)276         explicit UidPolicy(wp<AudioPolicyService> service)
277                 : mService(service), mObserverRegistered(false) {}
278 
279         void registerSelf();
280         void unregisterSelf();
281 
282         // IBinder::DeathRecipient implementation
283         void binderDied(const wp<IBinder> &who) override;
284 
285         bool isUidActive(uid_t uid);
286 
287         // BnUidObserver implementation
288         void onUidActive(uid_t uid) override;
289         void onUidGone(uid_t uid, bool disabled) override;
290         void onUidIdle(uid_t uid, bool disabled) override;
291 
addOverrideUid(uid_t uid,bool active)292         void addOverrideUid(uid_t uid, bool active) { updateOverrideUid(uid, active, true); }
removeOverrideUid(uid_t uid)293         void removeOverrideUid(uid_t uid) { updateOverrideUid(uid, false, false); }
294 
295     private:
296         bool isServiceUid(uid_t uid) const;
297         void notifyService(uid_t uid, bool active);
298         void updateOverrideUid(uid_t uid, bool active, bool insert);
299         void updateUidCache(uid_t uid, bool active, bool insert);
300         void updateUidLocked(std::unordered_map<uid_t, bool> *uids,
301                 uid_t uid, bool active, bool insert, bool *wasThere, bool *wasActive);
302 
303         wp<AudioPolicyService> mService;
304         Mutex mLock;
305         bool mObserverRegistered;
306         std::unordered_map<uid_t, bool> mOverrideUids;
307         std::unordered_map<uid_t, bool> mCachedUids;
308     };
309 
310     // Thread used for tone playback and to send audio config commands to audio flinger
311     // For tone playback, using a separate thread is necessary to avoid deadlock with mLock because
312     // startTone() and stopTone() are normally called with mLock locked and requesting a tone start
313     // or stop will cause calls to AudioPolicyService and an attempt to lock mLock.
314     // For audio config commands, it is necessary because audio flinger requires that the calling
315     // process (user) has permission to modify audio settings.
316     class AudioCommandThread : public Thread {
317         class AudioCommand;
318     public:
319 
320         // commands for tone AudioCommand
321         enum {
322             START_TONE,
323             STOP_TONE,
324             SET_VOLUME,
325             SET_PARAMETERS,
326             SET_VOICE_VOLUME,
327             STOP_OUTPUT,
328             RELEASE_OUTPUT,
329             CREATE_AUDIO_PATCH,
330             RELEASE_AUDIO_PATCH,
331             UPDATE_AUDIOPORT_LIST,
332             UPDATE_AUDIOPATCH_LIST,
333             SET_AUDIOPORT_CONFIG,
334             DYN_POLICY_MIX_STATE_UPDATE,
335             RECORDING_CONFIGURATION_UPDATE
336         };
337 
338         AudioCommandThread (String8 name, const wp<AudioPolicyService>& service);
339         virtual             ~AudioCommandThread();
340 
341                     status_t    dump(int fd);
342 
343         // Thread virtuals
344         virtual     void        onFirstRef();
345         virtual     bool        threadLoop();
346 
347                     void        exit();
348                     void        startToneCommand(ToneGenerator::tone_type type,
349                                                  audio_stream_type_t stream);
350                     void        stopToneCommand();
351                     status_t    volumeCommand(audio_stream_type_t stream, float volume,
352                                             audio_io_handle_t output, int delayMs = 0);
353                     status_t    parametersCommand(audio_io_handle_t ioHandle,
354                                             const char *keyValuePairs, int delayMs = 0);
355                     status_t    voiceVolumeCommand(float volume, int delayMs = 0);
356                     void        stopOutputCommand(audio_io_handle_t output,
357                                                   audio_stream_type_t stream,
358                                                   audio_session_t session);
359                     void        releaseOutputCommand(audio_io_handle_t output,
360                                                      audio_stream_type_t stream,
361                                                      audio_session_t session);
362                     status_t    sendCommand(sp<AudioCommand>& command, int delayMs = 0);
363                     void        insertCommand_l(sp<AudioCommand>& command, int delayMs = 0);
364                     status_t    createAudioPatchCommand(const struct audio_patch *patch,
365                                                         audio_patch_handle_t *handle,
366                                                         int delayMs);
367                     status_t    releaseAudioPatchCommand(audio_patch_handle_t handle,
368                                                          int delayMs);
369                     void        updateAudioPortListCommand();
370                     void        updateAudioPatchListCommand();
371                     status_t    setAudioPortConfigCommand(const struct audio_port_config *config,
372                                                           int delayMs);
373                     void        dynamicPolicyMixStateUpdateCommand(const String8& regId, int32_t state);
374                     void        recordingConfigurationUpdateCommand(
375                                                         int event,
376                                                         const record_client_info_t *clientInfo,
377                                                         const audio_config_base_t *clientConfig,
378                                                         const audio_config_base_t *deviceConfig,
379                                                         audio_patch_handle_t patchHandle);
380                     void        insertCommand_l(AudioCommand *command, int delayMs = 0);
381     private:
382         class AudioCommandData;
383 
384         // descriptor for requested tone playback event
385         class AudioCommand: public RefBase {
386 
387         public:
AudioCommand()388             AudioCommand()
389             : mCommand(-1), mStatus(NO_ERROR), mWaitStatus(false) {}
390 
391             void dump(char* buffer, size_t size);
392 
393             int mCommand;   // START_TONE, STOP_TONE ...
394             nsecs_t mTime;  // time stamp
395             Mutex mLock;    // mutex associated to mCond
396             Condition mCond; // condition for status return
397             status_t mStatus; // command status
398             bool mWaitStatus; // true if caller is waiting for status
399             sp<AudioCommandData> mParam;     // command specific parameter data
400         };
401 
402         class AudioCommandData: public RefBase {
403         public:
~AudioCommandData()404             virtual ~AudioCommandData() {}
405         protected:
AudioCommandData()406             AudioCommandData() {}
407         };
408 
409         class ToneData : public AudioCommandData {
410         public:
411             ToneGenerator::tone_type mType; // tone type (START_TONE only)
412             audio_stream_type_t mStream;    // stream type (START_TONE only)
413         };
414 
415         class VolumeData : public AudioCommandData {
416         public:
417             audio_stream_type_t mStream;
418             float mVolume;
419             audio_io_handle_t mIO;
420         };
421 
422         class ParametersData : public AudioCommandData {
423         public:
424             audio_io_handle_t mIO;
425             String8 mKeyValuePairs;
426         };
427 
428         class VoiceVolumeData : public AudioCommandData {
429         public:
430             float mVolume;
431         };
432 
433         class StopOutputData : public AudioCommandData {
434         public:
435             audio_io_handle_t mIO;
436             audio_stream_type_t mStream;
437             audio_session_t mSession;
438         };
439 
440         class ReleaseOutputData : public AudioCommandData {
441         public:
442             audio_io_handle_t mIO;
443             audio_stream_type_t mStream;
444             audio_session_t mSession;
445         };
446 
447         class CreateAudioPatchData : public AudioCommandData {
448         public:
449             struct audio_patch mPatch;
450             audio_patch_handle_t mHandle;
451         };
452 
453         class ReleaseAudioPatchData : public AudioCommandData {
454         public:
455             audio_patch_handle_t mHandle;
456         };
457 
458         class SetAudioPortConfigData : public AudioCommandData {
459         public:
460             struct audio_port_config mConfig;
461         };
462 
463         class DynPolicyMixStateUpdateData : public AudioCommandData {
464         public:
465             String8 mRegId;
466             int32_t mState;
467         };
468 
469         class RecordingConfigurationUpdateData : public AudioCommandData {
470         public:
471             int mEvent;
472             record_client_info_t mClientInfo;
473             struct audio_config_base mClientConfig;
474             struct audio_config_base mDeviceConfig;
475             audio_patch_handle_t mPatchHandle;
476         };
477 
478         Mutex   mLock;
479         Condition mWaitWorkCV;
480         Vector < sp<AudioCommand> > mAudioCommands; // list of pending commands
481         ToneGenerator *mpToneGenerator;     // the tone generator
482         sp<AudioCommand> mLastCommand;      // last processed command (used by dump)
483         String8 mName;                      // string used by wake lock fo delayed commands
484         wp<AudioPolicyService> mService;
485     };
486 
487     class AudioPolicyClient : public AudioPolicyClientInterface
488     {
489      public:
AudioPolicyClient(AudioPolicyService * service)490         explicit AudioPolicyClient(AudioPolicyService *service) : mAudioPolicyService(service) {}
~AudioPolicyClient()491         virtual ~AudioPolicyClient() {}
492 
493         //
494         // Audio HW module functions
495         //
496 
497         // loads a HW module.
498         virtual audio_module_handle_t loadHwModule(const char *name);
499 
500         //
501         // Audio output Control functions
502         //
503 
504         // opens an audio output with the requested parameters. The parameter values can indicate to use the default values
505         // in case the audio policy manager has no specific requirements for the output being opened.
506         // When the function returns, the parameter values reflect the actual values used by the audio hardware output stream.
507         // The audio policy manager can check if the proposed parameters are suitable or not and act accordingly.
508         virtual status_t openOutput(audio_module_handle_t module,
509                                     audio_io_handle_t *output,
510                                     audio_config_t *config,
511                                     audio_devices_t *devices,
512                                     const String8& address,
513                                     uint32_t *latencyMs,
514                                     audio_output_flags_t flags);
515         // creates a special output that is duplicated to the two outputs passed as arguments. The duplication is performed by
516         // a special mixer thread in the AudioFlinger.
517         virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1, audio_io_handle_t output2);
518         // closes the output stream
519         virtual status_t closeOutput(audio_io_handle_t output);
520         // suspends the output. When an output is suspended, the corresponding audio hardware output stream is placed in
521         // standby and the AudioTracks attached to the mixer thread are still processed but the output mix is discarded.
522         virtual status_t suspendOutput(audio_io_handle_t output);
523         // restores a suspended output.
524         virtual status_t restoreOutput(audio_io_handle_t output);
525 
526         //
527         // Audio input Control functions
528         //
529 
530         // opens an audio input
531         virtual audio_io_handle_t openInput(audio_module_handle_t module,
532                                             audio_io_handle_t *input,
533                                             audio_config_t *config,
534                                             audio_devices_t *devices,
535                                             const String8& address,
536                                             audio_source_t source,
537                                             audio_input_flags_t flags);
538         // closes an audio input
539         virtual status_t closeInput(audio_io_handle_t input);
540         //
541         // misc control functions
542         //
543 
544         // set a stream volume for a particular output. For the same user setting, a given stream type can have different volumes
545         // for each output (destination device) it is attached to.
546         virtual status_t setStreamVolume(audio_stream_type_t stream, float volume, audio_io_handle_t output, int delayMs = 0);
547 
548         // invalidate a stream type, causing a reroute to an unspecified new output
549         virtual status_t invalidateStream(audio_stream_type_t stream);
550 
551         // function enabling to send proprietary informations directly from audio policy manager to audio hardware interface.
552         virtual void setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs, int delayMs = 0);
553         // function enabling to receive proprietary informations directly from audio hardware interface to audio policy manager.
554         virtual String8 getParameters(audio_io_handle_t ioHandle, const String8& keys);
555 
556         // request the playback of a tone on the specified stream: used for instance to replace notification sounds when playing
557         // over a telephony device during a phone call.
558         virtual status_t startTone(audio_policy_tone_t tone, audio_stream_type_t stream);
559         virtual status_t stopTone();
560 
561         // set down link audio volume.
562         virtual status_t setVoiceVolume(float volume, int delayMs = 0);
563 
564         // move effect to the specified output
565         virtual status_t moveEffects(audio_session_t session,
566                                          audio_io_handle_t srcOutput,
567                                          audio_io_handle_t dstOutput);
568 
569         /* Create a patch between several source and sink ports */
570         virtual status_t createAudioPatch(const struct audio_patch *patch,
571                                            audio_patch_handle_t *handle,
572                                            int delayMs);
573 
574         /* Release a patch */
575         virtual status_t releaseAudioPatch(audio_patch_handle_t handle,
576                                            int delayMs);
577 
578         /* Set audio port configuration */
579         virtual status_t setAudioPortConfig(const struct audio_port_config *config, int delayMs);
580 
581         virtual void onAudioPortListUpdate();
582         virtual void onAudioPatchListUpdate();
583         virtual void onDynamicPolicyMixStateUpdate(String8 regId, int32_t state);
584         virtual void onRecordingConfigurationUpdate(int event,
585                         const record_client_info_t *clientInfo,
586                         const audio_config_base_t *clientConfig,
587                         const audio_config_base_t *deviceConfig, audio_patch_handle_t patchHandle);
588 
589         virtual audio_unique_id_t newAudioUniqueId(audio_unique_id_use_t use);
590 
591      private:
592         AudioPolicyService *mAudioPolicyService;
593     };
594 
595     // --- Notification Client ---
596     class NotificationClient : public IBinder::DeathRecipient {
597     public:
598                             NotificationClient(const sp<AudioPolicyService>& service,
599                                                 const sp<IAudioPolicyServiceClient>& client,
600                                                 uid_t uid);
601         virtual             ~NotificationClient();
602 
603                             void      onAudioPortListUpdate();
604                             void      onAudioPatchListUpdate();
605                             void      onDynamicPolicyMixStateUpdate(const String8& regId, int32_t state);
606                             void      onRecordingConfigurationUpdate(
607                                         int event, const record_client_info_t *clientInfo,
608                                         const audio_config_base_t *clientConfig,
609                                         const audio_config_base_t *deviceConfig,
610                                         audio_patch_handle_t patchHandle);
611                             void      setAudioPortCallbacksEnabled(bool enabled);
612 
613                 // IBinder::DeathRecipient
614                 virtual     void        binderDied(const wp<IBinder>& who);
615 
616     private:
617                             NotificationClient(const NotificationClient&);
618                             NotificationClient& operator = (const NotificationClient&);
619 
620         const wp<AudioPolicyService>        mService;
621         const uid_t                         mUid;
622         const sp<IAudioPolicyServiceClient> mAudioPolicyServiceClient;
623               bool                          mAudioPortCallbacksEnabled;
624     };
625 
626     // --- AudioRecordClient ---
627     // Information about each registered AudioRecord client
628     // (between calls to getInputForAttr() and releaseInput())
629     class AudioRecordClient : public RefBase {
630     public:
AudioRecordClient(const audio_attributes_t attributes,const audio_io_handle_t input,uid_t uid,pid_t pid,const String16 & opPackageName,const audio_session_t session)631                 AudioRecordClient(const audio_attributes_t attributes,
632                                   const audio_io_handle_t input, uid_t uid, pid_t pid,
633                                   const String16& opPackageName, const audio_session_t session) :
634                                       attributes(attributes),
635                                       input(input), uid(uid), pid(pid),
636                                       opPackageName(opPackageName), session(session),
637                                       active(false), isConcurrent(false), isVirtualDevice(false) {}
~AudioRecordClient()638         virtual ~AudioRecordClient() {}
639 
640         const audio_attributes_t attributes; // source, flags ...
641         const audio_io_handle_t input;       // audio HAL input IO handle
642         const uid_t uid;                     // client UID
643         const pid_t pid;                     // client PID
644         const String16 opPackageName;        // client package name
645         const audio_session_t session;       // audio session ID
646         bool active;                   // Capture is active or inactive
647         bool isConcurrent;             // is allowed to concurrent capture
648         bool isVirtualDevice;          // uses virtual device: updated by APM::getInputForAttr()
649         audio_port_handle_t deviceId;  // selected input device port ID
650     };
651 
652     // A class automatically clearing and restoring binder caller identity inside
653     // a code block (scoped variable)
654     // Declare one systematically before calling AudioPolicyManager methods so that they are
655     // executed with the same level of privilege as audioserver process.
656     class AutoCallerClear {
657     public:
AutoCallerClear()658             AutoCallerClear() :
659                 mToken(IPCThreadState::self()->clearCallingIdentity()) {}
~AutoCallerClear()660             ~AutoCallerClear() {
661                 IPCThreadState::self()->restoreCallingIdentity(mToken);
662             }
663 
664     private:
665         const   int64_t mToken;
666     };
667 
668     // Internal dump utilities.
669     status_t dumpPermissionDenial(int fd);
670 
671 
672     mutable Mutex mLock;    // prevents concurrent access to AudioPolicy manager functions changing
673                             // device connection state  or routing
674     mutable Mutex mEffectsLock; // serialize access to Effect state within APM.
675     // Note: lock acquisition order is always mLock > mEffectsLock:
676     // mLock protects AudioPolicyManager methods that can call into audio flinger
677     // and possibly back in to audio policy service and acquire mEffectsLock.
678     sp<AudioCommandThread> mAudioCommandThread;     // audio commands thread
679     sp<AudioCommandThread> mTonePlaybackThread;     // tone playback thread
680     sp<AudioCommandThread> mOutputCommandThread;    // process stop and release output
681     struct audio_policy_device *mpAudioPolicyDev;
682     struct audio_policy *mpAudioPolicy;
683     AudioPolicyInterface *mAudioPolicyManager;
684     AudioPolicyClient *mAudioPolicyClient;
685 
686     DefaultKeyedVector< uid_t, sp<NotificationClient> >    mNotificationClients;
687     Mutex mNotificationClientsLock;  // protects mNotificationClients
688     // Manage all effects configured in audio_effects.conf
689     sp<AudioPolicyEffects> mAudioPolicyEffects;
690     audio_mode_t mPhoneState;
691 
692     sp<UidPolicy> mUidPolicy;
693     DefaultKeyedVector< audio_port_handle_t, sp<AudioRecordClient> >   mAudioRecordClients;
694 };
695 
696 } // namespace android
697 
698 #endif // ANDROID_AUDIOPOLICYSERVICE_H
699