Home | History | Annotate | Download | only in audioflinger
      1 /*
      2 **
      3 ** Copyright 2007, The Android Open Source Project
      4 **
      5 ** Licensed under the Apache License, Version 2.0 (the "License");
      6 ** you may not use this file except in compliance with the License.
      7 ** You may obtain a copy of the License at
      8 **
      9 **     http://www.apache.org/licenses/LICENSE-2.0
     10 **
     11 ** Unless required by applicable law or agreed to in writing, software
     12 ** distributed under the License is distributed on an "AS IS" BASIS,
     13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 ** See the License for the specific language governing permissions and
     15 ** limitations under the License.
     16 */
     17 
     18 #ifndef ANDROID_AUDIO_FLINGER_H
     19 #define ANDROID_AUDIO_FLINGER_H
     20 
     21 #include <stdint.h>
     22 #include <sys/types.h>
     23 #include <limits.h>
     24 
     25 #include <common_time/cc_helper.h>
     26 
     27 #include <cutils/compiler.h>
     28 
     29 #include <media/IAudioFlinger.h>
     30 #include <media/IAudioFlingerClient.h>
     31 #include <media/IAudioTrack.h>
     32 #include <media/IAudioRecord.h>
     33 #include <media/AudioSystem.h>
     34 #include <media/AudioTrack.h>
     35 
     36 #include <utils/Atomic.h>
     37 #include <utils/Errors.h>
     38 #include <utils/threads.h>
     39 #include <utils/SortedVector.h>
     40 #include <utils/TypeHelpers.h>
     41 #include <utils/Vector.h>
     42 
     43 #include <binder/BinderService.h>
     44 #include <binder/MemoryDealer.h>
     45 
     46 #include <system/audio.h>
     47 #include <hardware/audio.h>
     48 #include <hardware/audio_policy.h>
     49 
     50 #include <media/AudioBufferProvider.h>
     51 #include <media/ExtendedAudioBufferProvider.h>
     52 #include "FastMixer.h"
     53 #include <media/nbaio/NBAIO.h>
     54 #include "AudioWatchdog.h"
     55 
     56 #include <powermanager/IPowerManager.h>
     57 
     58 #include <media/nbaio/NBLog.h>
     59 #include <private/media/AudioTrackShared.h>
     60 
     61 namespace android {
     62 
     63 class audio_track_cblk_t;
     64 class effect_param_cblk_t;
     65 class AudioMixer;
     66 class AudioBuffer;
     67 class AudioResampler;
     68 class FastMixer;
     69 class ServerProxy;
     70 
     71 // ----------------------------------------------------------------------------
     72 
     73 // AudioFlinger has a hard-coded upper limit of 2 channels for capture and playback.
     74 // There is support for > 2 channel tracks down-mixed to 2 channel output via a down-mix effect.
     75 // Adding full support for > 2 channel capture or playback would require more than simply changing
     76 // this #define.  There is an independent hard-coded upper limit in AudioMixer;
     77 // removing that AudioMixer limit would be necessary but insufficient to support > 2 channels.
     78 // The macro FCC_2 highlights some (but not all) places where there is are 2-channel assumptions.
     79 // Search also for "2", "left", "right", "[0]", "[1]", ">> 16", "<< 16", etc.
     80 #define FCC_2 2     // FCC_2 = Fixed Channel Count 2
     81 
     82 static const nsecs_t kDefaultStandbyTimeInNsecs = seconds(3);
     83 
     84 #define MAX_GAIN 4096.0f
     85 #define MAX_GAIN_INT 0x1000
     86 
     87 #define INCLUDING_FROM_AUDIOFLINGER_H
     88 
     89 class AudioFlinger :
     90     public BinderService<AudioFlinger>,
     91     public BnAudioFlinger
     92 {
     93     friend class BinderService<AudioFlinger>;   // for AudioFlinger()
     94 public:
     95     static const char* getServiceName() ANDROID_API { return "media.audio_flinger"; }
     96 
     97     virtual     status_t    dump(int fd, const Vector<String16>& args);
     98 
     99     // IAudioFlinger interface, in binder opcode order
    100     virtual sp<IAudioTrack> createTrack(
    101                                 audio_stream_type_t streamType,
    102                                 uint32_t sampleRate,
    103                                 audio_format_t format,
    104                                 audio_channel_mask_t channelMask,
    105                                 size_t frameCount,
    106                                 IAudioFlinger::track_flags_t *flags,
    107                                 const sp<IMemory>& sharedBuffer,
    108                                 audio_io_handle_t output,
    109                                 pid_t tid,
    110                                 int *sessionId,
    111                                 String8& name,
    112                                 status_t *status);
    113 
    114     virtual sp<IAudioRecord> openRecord(
    115                                 audio_io_handle_t input,
    116                                 uint32_t sampleRate,
    117                                 audio_format_t format,
    118                                 audio_channel_mask_t channelMask,
    119                                 size_t frameCount,
    120                                 IAudioFlinger::track_flags_t *flags,
    121                                 pid_t tid,
    122                                 int *sessionId,
    123                                 status_t *status);
    124 
    125     virtual     uint32_t    sampleRate(audio_io_handle_t output) const;
    126     virtual     int         channelCount(audio_io_handle_t output) const;
    127     virtual     audio_format_t format(audio_io_handle_t output) const;
    128     virtual     size_t      frameCount(audio_io_handle_t output) const;
    129     virtual     uint32_t    latency(audio_io_handle_t output) const;
    130 
    131     virtual     status_t    setMasterVolume(float value);
    132     virtual     status_t    setMasterMute(bool muted);
    133 
    134     virtual     float       masterVolume() const;
    135     virtual     bool        masterMute() const;
    136 
    137     virtual     status_t    setStreamVolume(audio_stream_type_t stream, float value,
    138                                             audio_io_handle_t output);
    139     virtual     status_t    setStreamMute(audio_stream_type_t stream, bool muted);
    140 
    141     virtual     float       streamVolume(audio_stream_type_t stream,
    142                                          audio_io_handle_t output) const;
    143     virtual     bool        streamMute(audio_stream_type_t stream) const;
    144 
    145     virtual     status_t    setMode(audio_mode_t mode);
    146 
    147     virtual     status_t    setMicMute(bool state);
    148     virtual     bool        getMicMute() const;
    149 
    150     virtual     status_t    setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs);
    151     virtual     String8     getParameters(audio_io_handle_t ioHandle, const String8& keys) const;
    152 
    153     virtual     void        registerClient(const sp<IAudioFlingerClient>& client);
    154 
    155     virtual     size_t      getInputBufferSize(uint32_t sampleRate, audio_format_t format,
    156                                                audio_channel_mask_t channelMask) const;
    157 
    158     virtual audio_io_handle_t openOutput(audio_module_handle_t module,
    159                                          audio_devices_t *pDevices,
    160                                          uint32_t *pSamplingRate,
    161                                          audio_format_t *pFormat,
    162                                          audio_channel_mask_t *pChannelMask,
    163                                          uint32_t *pLatencyMs,
    164                                          audio_output_flags_t flags,
    165                                          const audio_offload_info_t *offloadInfo);
    166 
    167     virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
    168                                                   audio_io_handle_t output2);
    169 
    170     virtual status_t closeOutput(audio_io_handle_t output);
    171 
    172     virtual status_t suspendOutput(audio_io_handle_t output);
    173 
    174     virtual status_t restoreOutput(audio_io_handle_t output);
    175 
    176     virtual audio_io_handle_t openInput(audio_module_handle_t module,
    177                                         audio_devices_t *pDevices,
    178                                         uint32_t *pSamplingRate,
    179                                         audio_format_t *pFormat,
    180                                         audio_channel_mask_t *pChannelMask);
    181 
    182     virtual status_t closeInput(audio_io_handle_t input);
    183 
    184     virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output);
    185 
    186     virtual status_t setVoiceVolume(float volume);
    187 
    188     virtual status_t getRenderPosition(size_t *halFrames, size_t *dspFrames,
    189                                        audio_io_handle_t output) const;
    190 
    191     virtual     unsigned int  getInputFramesLost(audio_io_handle_t ioHandle) const;
    192 
    193     virtual int newAudioSessionId();
    194 
    195     virtual void acquireAudioSessionId(int audioSession);
    196 
    197     virtual void releaseAudioSessionId(int audioSession);
    198 
    199     virtual status_t queryNumberEffects(uint32_t *numEffects) const;
    200 
    201     virtual status_t queryEffect(uint32_t index, effect_descriptor_t *descriptor) const;
    202 
    203     virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
    204                                          effect_descriptor_t *descriptor) const;
    205 
    206     virtual sp<IEffect> createEffect(
    207                         effect_descriptor_t *pDesc,
    208                         const sp<IEffectClient>& effectClient,
    209                         int32_t priority,
    210                         audio_io_handle_t io,
    211                         int sessionId,
    212                         status_t *status,
    213                         int *id,
    214                         int *enabled);
    215 
    216     virtual status_t moveEffects(int sessionId, audio_io_handle_t srcOutput,
    217                         audio_io_handle_t dstOutput);
    218 
    219     virtual audio_module_handle_t loadHwModule(const char *name);
    220 
    221     virtual uint32_t getPrimaryOutputSamplingRate();
    222     virtual size_t getPrimaryOutputFrameCount();
    223 
    224     virtual status_t setLowRamDevice(bool isLowRamDevice);
    225 
    226     virtual     status_t    onTransact(
    227                                 uint32_t code,
    228                                 const Parcel& data,
    229                                 Parcel* reply,
    230                                 uint32_t flags);
    231 
    232     // end of IAudioFlinger interface
    233 
    234     sp<NBLog::Writer>   newWriter_l(size_t size, const char *name);
    235     void                unregisterWriter(const sp<NBLog::Writer>& writer);
    236 private:
    237     static const size_t kLogMemorySize = 10 * 1024;
    238     sp<MemoryDealer>    mLogMemoryDealer;   // == 0 when NBLog is disabled
    239 public:
    240 
    241     class SyncEvent;
    242 
    243     typedef void (*sync_event_callback_t)(const wp<SyncEvent>& event) ;
    244 
    245     class SyncEvent : public RefBase {
    246     public:
    247         SyncEvent(AudioSystem::sync_event_t type,
    248                   int triggerSession,
    249                   int listenerSession,
    250                   sync_event_callback_t callBack,
    251                   void *cookie)
    252         : mType(type), mTriggerSession(triggerSession), mListenerSession(listenerSession),
    253           mCallback(callBack), mCookie(cookie)
    254         {}
    255 
    256         virtual ~SyncEvent() {}
    257 
    258         void trigger() { Mutex::Autolock _l(mLock); if (mCallback) mCallback(this); }
    259         bool isCancelled() const { Mutex::Autolock _l(mLock); return (mCallback == NULL); }
    260         void cancel() { Mutex::Autolock _l(mLock); mCallback = NULL; }
    261         AudioSystem::sync_event_t type() const { return mType; }
    262         int triggerSession() const { return mTriggerSession; }
    263         int listenerSession() const { return mListenerSession; }
    264         void *cookie() const { return mCookie; }
    265 
    266     private:
    267           const AudioSystem::sync_event_t mType;
    268           const int mTriggerSession;
    269           const int mListenerSession;
    270           sync_event_callback_t mCallback;
    271           void * const mCookie;
    272           mutable Mutex mLock;
    273     };
    274 
    275     sp<SyncEvent> createSyncEvent(AudioSystem::sync_event_t type,
    276                                         int triggerSession,
    277                                         int listenerSession,
    278                                         sync_event_callback_t callBack,
    279                                         void *cookie);
    280 
    281 private:
    282     class AudioHwDevice;    // fwd declaration for findSuitableHwDev_l
    283 
    284                audio_mode_t getMode() const { return mMode; }
    285 
    286                 bool        btNrecIsOff() const { return mBtNrecIsOff; }
    287 
    288                             AudioFlinger() ANDROID_API;
    289     virtual                 ~AudioFlinger();
    290 
    291     // call in any IAudioFlinger method that accesses mPrimaryHardwareDev
    292     status_t                initCheck() const { return mPrimaryHardwareDev == NULL ?
    293                                                         NO_INIT : NO_ERROR; }
    294 
    295     // RefBase
    296     virtual     void        onFirstRef();
    297 
    298     AudioHwDevice*          findSuitableHwDev_l(audio_module_handle_t module,
    299                                                 audio_devices_t devices);
    300     void                    purgeStaleEffects_l();
    301 
    302     // standby delay for MIXER and DUPLICATING playback threads is read from property
    303     // ro.audio.flinger_standbytime_ms or defaults to kDefaultStandbyTimeInNsecs
    304     static nsecs_t          mStandbyTimeInNsecs;
    305 
    306     // incremented by 2 when screen state changes, bit 0 == 1 means "off"
    307     // AudioFlinger::setParameters() updates, other threads read w/o lock
    308     static uint32_t         mScreenState;
    309 
    310     // Internal dump utilities.
    311     static const int kDumpLockRetries = 50;
    312     static const int kDumpLockSleepUs = 20000;
    313     static bool dumpTryLock(Mutex& mutex);
    314     void dumpPermissionDenial(int fd, const Vector<String16>& args);
    315     void dumpClients(int fd, const Vector<String16>& args);
    316     void dumpInternals(int fd, const Vector<String16>& args);
    317 
    318     // --- Client ---
    319     class Client : public RefBase {
    320     public:
    321                             Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
    322         virtual             ~Client();
    323         sp<MemoryDealer>    heap() const;
    324         pid_t               pid() const { return mPid; }
    325         sp<AudioFlinger>    audioFlinger() const { return mAudioFlinger; }
    326 
    327         bool reserveTimedTrack();
    328         void releaseTimedTrack();
    329 
    330     private:
    331                             Client(const Client&);
    332                             Client& operator = (const Client&);
    333         const sp<AudioFlinger> mAudioFlinger;
    334         const sp<MemoryDealer> mMemoryDealer;
    335         const pid_t         mPid;
    336 
    337         Mutex               mTimedTrackLock;
    338         int                 mTimedTrackCount;
    339     };
    340 
    341     // --- Notification Client ---
    342     class NotificationClient : public IBinder::DeathRecipient {
    343     public:
    344                             NotificationClient(const sp<AudioFlinger>& audioFlinger,
    345                                                 const sp<IAudioFlingerClient>& client,
    346                                                 pid_t pid);
    347         virtual             ~NotificationClient();
    348 
    349                 sp<IAudioFlingerClient> audioFlingerClient() const { return mAudioFlingerClient; }
    350 
    351                 // IBinder::DeathRecipient
    352                 virtual     void        binderDied(const wp<IBinder>& who);
    353 
    354     private:
    355                             NotificationClient(const NotificationClient&);
    356                             NotificationClient& operator = (const NotificationClient&);
    357 
    358         const sp<AudioFlinger>  mAudioFlinger;
    359         const pid_t             mPid;
    360         const sp<IAudioFlingerClient> mAudioFlingerClient;
    361     };
    362 
    363     class TrackHandle;
    364     class RecordHandle;
    365     class RecordThread;
    366     class PlaybackThread;
    367     class MixerThread;
    368     class DirectOutputThread;
    369     class OffloadThread;
    370     class DuplicatingThread;
    371     class AsyncCallbackThread;
    372     class Track;
    373     class RecordTrack;
    374     class EffectModule;
    375     class EffectHandle;
    376     class EffectChain;
    377     struct AudioStreamOut;
    378     struct AudioStreamIn;
    379 
    380     struct  stream_type_t {
    381         stream_type_t()
    382             :   volume(1.0f),
    383                 mute(false)
    384         {
    385         }
    386         float       volume;
    387         bool        mute;
    388     };
    389 
    390     // --- PlaybackThread ---
    391 
    392 #include "Threads.h"
    393 
    394 #include "Effects.h"
    395 
    396     // server side of the client's IAudioTrack
    397     class TrackHandle : public android::BnAudioTrack {
    398     public:
    399                             TrackHandle(const sp<PlaybackThread::Track>& track);
    400         virtual             ~TrackHandle();
    401         virtual sp<IMemory> getCblk() const;
    402         virtual status_t    start();
    403         virtual void        stop();
    404         virtual void        flush();
    405         virtual void        pause();
    406         virtual status_t    attachAuxEffect(int effectId);
    407         virtual status_t    allocateTimedBuffer(size_t size,
    408                                                 sp<IMemory>* buffer);
    409         virtual status_t    queueTimedBuffer(const sp<IMemory>& buffer,
    410                                              int64_t pts);
    411         virtual status_t    setMediaTimeTransform(const LinearTransform& xform,
    412                                                   int target);
    413         virtual status_t    setParameters(const String8& keyValuePairs);
    414         virtual status_t    getTimestamp(AudioTimestamp& timestamp);
    415         virtual void        signal(); // signal playback thread for a change in control block
    416 
    417         virtual status_t onTransact(
    418             uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
    419 
    420     private:
    421         const sp<PlaybackThread::Track> mTrack;
    422     };
    423 
    424     // server side of the client's IAudioRecord
    425     class RecordHandle : public android::BnAudioRecord {
    426     public:
    427         RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
    428         virtual             ~RecordHandle();
    429         virtual sp<IMemory> getCblk() const;
    430         virtual status_t    start(int /*AudioSystem::sync_event_t*/ event, int triggerSession);
    431         virtual void        stop();
    432         virtual status_t onTransact(
    433             uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
    434     private:
    435         const sp<RecordThread::RecordTrack> mRecordTrack;
    436 
    437         // for use from destructor
    438         void                stop_nonvirtual();
    439     };
    440 
    441 
    442               PlaybackThread *checkPlaybackThread_l(audio_io_handle_t output) const;
    443               MixerThread *checkMixerThread_l(audio_io_handle_t output) const;
    444               RecordThread *checkRecordThread_l(audio_io_handle_t input) const;
    445               // no range check, AudioFlinger::mLock held
    446               bool streamMute_l(audio_stream_type_t stream) const
    447                                 { return mStreamTypes[stream].mute; }
    448               // no range check, doesn't check per-thread stream volume, AudioFlinger::mLock held
    449               float streamVolume_l(audio_stream_type_t stream) const
    450                                 { return mStreamTypes[stream].volume; }
    451               void audioConfigChanged_l(int event, audio_io_handle_t ioHandle, const void *param2);
    452 
    453               // allocate an audio_io_handle_t, session ID, or effect ID
    454               uint32_t nextUniqueId();
    455 
    456               status_t moveEffectChain_l(int sessionId,
    457                                      PlaybackThread *srcThread,
    458                                      PlaybackThread *dstThread,
    459                                      bool reRegister);
    460               // return thread associated with primary hardware device, or NULL
    461               PlaybackThread *primaryPlaybackThread_l() const;
    462               audio_devices_t primaryOutputDevice_l() const;
    463 
    464               sp<PlaybackThread> getEffectThread_l(int sessionId, int EffectId);
    465 
    466 
    467                 void        removeClient_l(pid_t pid);
    468                 void        removeNotificationClient(pid_t pid);
    469 
    470                 bool isNonOffloadableGlobalEffectEnabled_l();
    471                 void onNonOffloadableGlobalEffectEnable();
    472 
    473     class AudioHwDevice {
    474     public:
    475         enum Flags {
    476             AHWD_CAN_SET_MASTER_VOLUME  = 0x1,
    477             AHWD_CAN_SET_MASTER_MUTE    = 0x2,
    478         };
    479 
    480         AudioHwDevice(const char *moduleName,
    481                       audio_hw_device_t *hwDevice,
    482                       Flags flags)
    483             : mModuleName(strdup(moduleName))
    484             , mHwDevice(hwDevice)
    485             , mFlags(flags) { }
    486         /*virtual*/ ~AudioHwDevice() { free((void *)mModuleName); }
    487 
    488         bool canSetMasterVolume() const {
    489             return (0 != (mFlags & AHWD_CAN_SET_MASTER_VOLUME));
    490         }
    491 
    492         bool canSetMasterMute() const {
    493             return (0 != (mFlags & AHWD_CAN_SET_MASTER_MUTE));
    494         }
    495 
    496         const char *moduleName() const { return mModuleName; }
    497         audio_hw_device_t *hwDevice() const { return mHwDevice; }
    498     private:
    499         const char * const mModuleName;
    500         audio_hw_device_t * const mHwDevice;
    501         Flags mFlags;
    502     };
    503 
    504     // AudioStreamOut and AudioStreamIn are immutable, so their fields are const.
    505     // For emphasis, we could also make all pointers to them be "const *",
    506     // but that would clutter the code unnecessarily.
    507 
    508     struct AudioStreamOut {
    509         AudioHwDevice* const audioHwDev;
    510         audio_stream_out_t* const stream;
    511         audio_output_flags_t flags;
    512 
    513         audio_hw_device_t* hwDev() const { return audioHwDev->hwDevice(); }
    514 
    515         AudioStreamOut(AudioHwDevice *dev, audio_stream_out_t *out, audio_output_flags_t flags) :
    516             audioHwDev(dev), stream(out), flags(flags) {}
    517     };
    518 
    519     struct AudioStreamIn {
    520         AudioHwDevice* const audioHwDev;
    521         audio_stream_in_t* const stream;
    522 
    523         audio_hw_device_t* hwDev() const { return audioHwDev->hwDevice(); }
    524 
    525         AudioStreamIn(AudioHwDevice *dev, audio_stream_in_t *in) :
    526             audioHwDev(dev), stream(in) {}
    527     };
    528 
    529     // for mAudioSessionRefs only
    530     struct AudioSessionRef {
    531         AudioSessionRef(int sessionid, pid_t pid) :
    532             mSessionid(sessionid), mPid(pid), mCnt(1) {}
    533         const int   mSessionid;
    534         const pid_t mPid;
    535         int         mCnt;
    536     };
    537 
    538     mutable     Mutex                               mLock;
    539 
    540                 DefaultKeyedVector< pid_t, wp<Client> >     mClients;   // see ~Client()
    541 
    542                 mutable     Mutex                   mHardwareLock;
    543                 // NOTE: If both mLock and mHardwareLock mutexes must be held,
    544                 // always take mLock before mHardwareLock
    545 
    546                 // These two fields are immutable after onFirstRef(), so no lock needed to access
    547                 AudioHwDevice*                      mPrimaryHardwareDev; // mAudioHwDevs[0] or NULL
    548                 DefaultKeyedVector<audio_module_handle_t, AudioHwDevice*>  mAudioHwDevs;
    549 
    550     // for dump, indicates which hardware operation is currently in progress (but not stream ops)
    551     enum hardware_call_state {
    552         AUDIO_HW_IDLE = 0,              // no operation in progress
    553         AUDIO_HW_INIT,                  // init_check
    554         AUDIO_HW_OUTPUT_OPEN,           // open_output_stream
    555         AUDIO_HW_OUTPUT_CLOSE,          // unused
    556         AUDIO_HW_INPUT_OPEN,            // unused
    557         AUDIO_HW_INPUT_CLOSE,           // unused
    558         AUDIO_HW_STANDBY,               // unused
    559         AUDIO_HW_SET_MASTER_VOLUME,     // set_master_volume
    560         AUDIO_HW_GET_ROUTING,           // unused
    561         AUDIO_HW_SET_ROUTING,           // unused
    562         AUDIO_HW_GET_MODE,              // unused
    563         AUDIO_HW_SET_MODE,              // set_mode
    564         AUDIO_HW_GET_MIC_MUTE,          // get_mic_mute
    565         AUDIO_HW_SET_MIC_MUTE,          // set_mic_mute
    566         AUDIO_HW_SET_VOICE_VOLUME,      // set_voice_volume
    567         AUDIO_HW_SET_PARAMETER,         // set_parameters
    568         AUDIO_HW_GET_INPUT_BUFFER_SIZE, // get_input_buffer_size
    569         AUDIO_HW_GET_MASTER_VOLUME,     // get_master_volume
    570         AUDIO_HW_GET_PARAMETER,         // get_parameters
    571         AUDIO_HW_SET_MASTER_MUTE,       // set_master_mute
    572         AUDIO_HW_GET_MASTER_MUTE,       // get_master_mute
    573     };
    574 
    575     mutable     hardware_call_state                 mHardwareStatus;    // for dump only
    576 
    577 
    578                 DefaultKeyedVector< audio_io_handle_t, sp<PlaybackThread> >  mPlaybackThreads;
    579                 stream_type_t                       mStreamTypes[AUDIO_STREAM_CNT];
    580 
    581                 // member variables below are protected by mLock
    582                 float                               mMasterVolume;
    583                 bool                                mMasterMute;
    584                 // end of variables protected by mLock
    585 
    586                 DefaultKeyedVector< audio_io_handle_t, sp<RecordThread> >    mRecordThreads;
    587 
    588                 DefaultKeyedVector< pid_t, sp<NotificationClient> >    mNotificationClients;
    589                 volatile int32_t                    mNextUniqueId;  // updated by android_atomic_inc
    590                 audio_mode_t                        mMode;
    591                 bool                                mBtNrecIsOff;
    592 
    593                 // protected by mLock
    594                 Vector<AudioSessionRef*> mAudioSessionRefs;
    595 
    596                 float       masterVolume_l() const;
    597                 bool        masterMute_l() const;
    598                 audio_module_handle_t loadHwModule_l(const char *name);
    599 
    600                 Vector < sp<SyncEvent> > mPendingSyncEvents; // sync events awaiting for a session
    601                                                              // to be created
    602 
    603 private:
    604     sp<Client>  registerPid_l(pid_t pid);    // always returns non-0
    605 
    606     // for use from destructor
    607     status_t    closeOutput_nonvirtual(audio_io_handle_t output);
    608     status_t    closeInput_nonvirtual(audio_io_handle_t input);
    609 
    610 #ifdef TEE_SINK
    611     // all record threads serially share a common tee sink, which is re-created on format change
    612     sp<NBAIO_Sink>   mRecordTeeSink;
    613     sp<NBAIO_Source> mRecordTeeSource;
    614 #endif
    615 
    616 public:
    617 
    618 #ifdef TEE_SINK
    619     // tee sink, if enabled by property, allows dumpsys to write most recent audio to .wav file
    620     static void dumpTee(int fd, const sp<NBAIO_Source>& source, audio_io_handle_t id = 0);
    621 
    622     // whether tee sink is enabled by property
    623     static bool mTeeSinkInputEnabled;
    624     static bool mTeeSinkOutputEnabled;
    625     static bool mTeeSinkTrackEnabled;
    626 
    627     // runtime configured size of each tee sink pipe, in frames
    628     static size_t mTeeSinkInputFrames;
    629     static size_t mTeeSinkOutputFrames;
    630     static size_t mTeeSinkTrackFrames;
    631 
    632     // compile-time default size of tee sink pipes, in frames
    633     // 0x200000 stereo 16-bit PCM frames = 47.5 seconds at 44.1 kHz, 8 megabytes
    634     static const size_t kTeeSinkInputFramesDefault = 0x200000;
    635     static const size_t kTeeSinkOutputFramesDefault = 0x200000;
    636     static const size_t kTeeSinkTrackFramesDefault = 0x1000;
    637 #endif
    638 
    639     // This method reads from a variable without mLock, but the variable is updated under mLock.  So
    640     // we might read a stale value, or a value that's inconsistent with respect to other variables.
    641     // In this case, it's safe because the return value isn't used for making an important decision.
    642     // The reason we don't want to take mLock is because it could block the caller for a long time.
    643     bool    isLowRamDevice() const { return mIsLowRamDevice; }
    644 
    645 private:
    646     bool    mIsLowRamDevice;
    647     bool    mIsDeviceTypeKnown;
    648     nsecs_t mGlobalEffectEnableTime;  // when a global effect was last enabled
    649 };
    650 
    651 #undef INCLUDING_FROM_AUDIOFLINGER_H
    652 
    653 // ----------------------------------------------------------------------------
    654 
    655 }; // namespace android
    656 
    657 #endif // ANDROID_AUDIO_FLINGER_H
    658