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