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 <media/IAudioFlinger.h>
     28 #include <media/IAudioFlingerClient.h>
     29 #include <media/IAudioTrack.h>
     30 #include <media/IAudioRecord.h>
     31 #include <media/AudioSystem.h>
     32 #include <media/AudioTrack.h>
     33 
     34 #include <utils/Atomic.h>
     35 #include <utils/Errors.h>
     36 #include <utils/threads.h>
     37 #include <utils/SortedVector.h>
     38 #include <utils/TypeHelpers.h>
     39 #include <utils/Vector.h>
     40 
     41 #include <binder/BinderService.h>
     42 #include <binder/MemoryDealer.h>
     43 
     44 #include <system/audio.h>
     45 #include <hardware/audio.h>
     46 #include <hardware/audio_policy.h>
     47 
     48 #include <media/AudioBufferProvider.h>
     49 #include <media/ExtendedAudioBufferProvider.h>
     50 #include "FastMixer.h"
     51 #include <media/nbaio/NBAIO.h>
     52 #include "AudioWatchdog.h"
     53 
     54 #include <powermanager/IPowerManager.h>
     55 
     56 namespace android {
     57 
     58 class audio_track_cblk_t;
     59 class effect_param_cblk_t;
     60 class AudioMixer;
     61 class AudioBuffer;
     62 class AudioResampler;
     63 class FastMixer;
     64 
     65 // ----------------------------------------------------------------------------
     66 
     67 // AudioFlinger has a hard-coded upper limit of 2 channels for capture and playback.
     68 // There is support for > 2 channel tracks down-mixed to 2 channel output via a down-mix effect.
     69 // Adding full support for > 2 channel capture or playback would require more than simply changing
     70 // this #define.  There is an independent hard-coded upper limit in AudioMixer;
     71 // removing that AudioMixer limit would be necessary but insufficient to support > 2 channels.
     72 // The macro FCC_2 highlights some (but not all) places where there is are 2-channel assumptions.
     73 // Search also for "2", "left", "right", "[0]", "[1]", ">> 16", "<< 16", etc.
     74 #define FCC_2 2     // FCC_2 = Fixed Channel Count 2
     75 
     76 static const nsecs_t kDefaultStandbyTimeInNsecs = seconds(3);
     77 
     78 class AudioFlinger :
     79     public BinderService<AudioFlinger>,
     80     public BnAudioFlinger
     81 {
     82     friend class BinderService<AudioFlinger>;   // for AudioFlinger()
     83 public:
     84     static const char* getServiceName() { return "media.audio_flinger"; }
     85 
     86     virtual     status_t    dump(int fd, const Vector<String16>& args);
     87 
     88     // IAudioFlinger interface, in binder opcode order
     89     virtual sp<IAudioTrack> createTrack(
     90                                 pid_t pid,
     91                                 audio_stream_type_t streamType,
     92                                 uint32_t sampleRate,
     93                                 audio_format_t format,
     94                                 audio_channel_mask_t channelMask,
     95                                 int frameCount,
     96                                 IAudioFlinger::track_flags_t flags,
     97                                 const sp<IMemory>& sharedBuffer,
     98                                 audio_io_handle_t output,
     99                                 pid_t tid,
    100                                 int *sessionId,
    101                                 status_t *status);
    102 
    103     virtual sp<IAudioRecord> openRecord(
    104                                 pid_t pid,
    105                                 audio_io_handle_t input,
    106                                 uint32_t sampleRate,
    107                                 audio_format_t format,
    108                                 audio_channel_mask_t channelMask,
    109                                 int frameCount,
    110                                 IAudioFlinger::track_flags_t flags,
    111                                 pid_t tid,
    112                                 int *sessionId,
    113                                 status_t *status);
    114 
    115     virtual     uint32_t    sampleRate(audio_io_handle_t output) const;
    116     virtual     int         channelCount(audio_io_handle_t output) const;
    117     virtual     audio_format_t format(audio_io_handle_t output) const;
    118     virtual     size_t      frameCount(audio_io_handle_t output) const;
    119     virtual     uint32_t    latency(audio_io_handle_t output) const;
    120 
    121     virtual     status_t    setMasterVolume(float value);
    122     virtual     status_t    setMasterMute(bool muted);
    123 
    124     virtual     float       masterVolume() const;
    125     virtual     bool        masterMute() const;
    126 
    127     virtual     status_t    setStreamVolume(audio_stream_type_t stream, float value,
    128                                             audio_io_handle_t output);
    129     virtual     status_t    setStreamMute(audio_stream_type_t stream, bool muted);
    130 
    131     virtual     float       streamVolume(audio_stream_type_t stream,
    132                                          audio_io_handle_t output) const;
    133     virtual     bool        streamMute(audio_stream_type_t stream) const;
    134 
    135     virtual     status_t    setMode(audio_mode_t mode);
    136 
    137     virtual     status_t    setMicMute(bool state);
    138     virtual     bool        getMicMute() const;
    139 
    140     virtual     status_t    setParameters(audio_io_handle_t ioHandle, const String8& keyValuePairs);
    141     virtual     String8     getParameters(audio_io_handle_t ioHandle, const String8& keys) const;
    142 
    143     virtual     void        registerClient(const sp<IAudioFlingerClient>& client);
    144 
    145     virtual     size_t      getInputBufferSize(uint32_t sampleRate, audio_format_t format,
    146                                                audio_channel_mask_t channelMask) const;
    147 
    148     virtual audio_io_handle_t openOutput(audio_module_handle_t module,
    149                                          audio_devices_t *pDevices,
    150                                          uint32_t *pSamplingRate,
    151                                          audio_format_t *pFormat,
    152                                          audio_channel_mask_t *pChannelMask,
    153                                          uint32_t *pLatencyMs,
    154                                          audio_output_flags_t flags);
    155 
    156     virtual audio_io_handle_t openDuplicateOutput(audio_io_handle_t output1,
    157                                                   audio_io_handle_t output2);
    158 
    159     virtual status_t closeOutput(audio_io_handle_t output);
    160 
    161     virtual status_t suspendOutput(audio_io_handle_t output);
    162 
    163     virtual status_t restoreOutput(audio_io_handle_t output);
    164 
    165     virtual audio_io_handle_t openInput(audio_module_handle_t module,
    166                                         audio_devices_t *pDevices,
    167                                         uint32_t *pSamplingRate,
    168                                         audio_format_t *pFormat,
    169                                         audio_channel_mask_t *pChannelMask);
    170 
    171     virtual status_t closeInput(audio_io_handle_t input);
    172 
    173     virtual status_t setStreamOutput(audio_stream_type_t stream, audio_io_handle_t output);
    174 
    175     virtual status_t setVoiceVolume(float volume);
    176 
    177     virtual status_t getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames,
    178                                        audio_io_handle_t output) const;
    179 
    180     virtual     unsigned int  getInputFramesLost(audio_io_handle_t ioHandle) const;
    181 
    182     virtual int newAudioSessionId();
    183 
    184     virtual void acquireAudioSessionId(int audioSession);
    185 
    186     virtual void releaseAudioSessionId(int audioSession);
    187 
    188     virtual status_t queryNumberEffects(uint32_t *numEffects) const;
    189 
    190     virtual status_t queryEffect(uint32_t index, effect_descriptor_t *descriptor) const;
    191 
    192     virtual status_t getEffectDescriptor(const effect_uuid_t *pUuid,
    193                                          effect_descriptor_t *descriptor) const;
    194 
    195     virtual sp<IEffect> createEffect(pid_t pid,
    196                         effect_descriptor_t *pDesc,
    197                         const sp<IEffectClient>& effectClient,
    198                         int32_t priority,
    199                         audio_io_handle_t io,
    200                         int sessionId,
    201                         status_t *status,
    202                         int *id,
    203                         int *enabled);
    204 
    205     virtual status_t moveEffects(int sessionId, audio_io_handle_t srcOutput,
    206                         audio_io_handle_t dstOutput);
    207 
    208     virtual audio_module_handle_t loadHwModule(const char *name);
    209 
    210     virtual int32_t getPrimaryOutputSamplingRate();
    211     virtual int32_t getPrimaryOutputFrameCount();
    212 
    213     virtual     status_t    onTransact(
    214                                 uint32_t code,
    215                                 const Parcel& data,
    216                                 Parcel* reply,
    217                                 uint32_t flags);
    218 
    219     // end of IAudioFlinger interface
    220 
    221     class SyncEvent;
    222 
    223     typedef void (*sync_event_callback_t)(const wp<SyncEvent>& event) ;
    224 
    225     class SyncEvent : public RefBase {
    226     public:
    227         SyncEvent(AudioSystem::sync_event_t type,
    228                   int triggerSession,
    229                   int listenerSession,
    230                   sync_event_callback_t callBack,
    231                   void *cookie)
    232         : mType(type), mTriggerSession(triggerSession), mListenerSession(listenerSession),
    233           mCallback(callBack), mCookie(cookie)
    234         {}
    235 
    236         virtual ~SyncEvent() {}
    237 
    238         void trigger() { Mutex::Autolock _l(mLock); if (mCallback) mCallback(this); }
    239         bool isCancelled() const { Mutex::Autolock _l(mLock); return (mCallback == NULL); }
    240         void cancel() { Mutex::Autolock _l(mLock); mCallback = NULL; }
    241         AudioSystem::sync_event_t type() const { return mType; }
    242         int triggerSession() const { return mTriggerSession; }
    243         int listenerSession() const { return mListenerSession; }
    244         void *cookie() const { return mCookie; }
    245 
    246     private:
    247           const AudioSystem::sync_event_t mType;
    248           const int mTriggerSession;
    249           const int mListenerSession;
    250           sync_event_callback_t mCallback;
    251           void * const mCookie;
    252           mutable Mutex mLock;
    253     };
    254 
    255     sp<SyncEvent> createSyncEvent(AudioSystem::sync_event_t type,
    256                                         int triggerSession,
    257                                         int listenerSession,
    258                                         sync_event_callback_t callBack,
    259                                         void *cookie);
    260 
    261 private:
    262     class AudioHwDevice;    // fwd declaration for findSuitableHwDev_l
    263 
    264                audio_mode_t getMode() const { return mMode; }
    265 
    266                 bool        btNrecIsOff() const { return mBtNrecIsOff; }
    267 
    268                             AudioFlinger();
    269     virtual                 ~AudioFlinger();
    270 
    271     // call in any IAudioFlinger method that accesses mPrimaryHardwareDev
    272     status_t                initCheck() const { return mPrimaryHardwareDev == NULL ? NO_INIT : NO_ERROR; }
    273 
    274     // RefBase
    275     virtual     void        onFirstRef();
    276 
    277     AudioHwDevice*          findSuitableHwDev_l(audio_module_handle_t module, audio_devices_t devices);
    278     void                    purgeStaleEffects_l();
    279 
    280     // standby delay for MIXER and DUPLICATING playback threads is read from property
    281     // ro.audio.flinger_standbytime_ms or defaults to kDefaultStandbyTimeInNsecs
    282     static nsecs_t          mStandbyTimeInNsecs;
    283 
    284     // Internal dump utilities.
    285     void dumpPermissionDenial(int fd, const Vector<String16>& args);
    286     void dumpClients(int fd, const Vector<String16>& args);
    287     void dumpInternals(int fd, const Vector<String16>& args);
    288 
    289     // --- Client ---
    290     class Client : public RefBase {
    291     public:
    292                             Client(const sp<AudioFlinger>& audioFlinger, pid_t pid);
    293         virtual             ~Client();
    294         sp<MemoryDealer>    heap() const;
    295         pid_t               pid() const { return mPid; }
    296         sp<AudioFlinger>    audioFlinger() const { return mAudioFlinger; }
    297 
    298         bool reserveTimedTrack();
    299         void releaseTimedTrack();
    300 
    301     private:
    302                             Client(const Client&);
    303                             Client& operator = (const Client&);
    304         const sp<AudioFlinger> mAudioFlinger;
    305         const sp<MemoryDealer> mMemoryDealer;
    306         const pid_t         mPid;
    307 
    308         Mutex               mTimedTrackLock;
    309         int                 mTimedTrackCount;
    310     };
    311 
    312     // --- Notification Client ---
    313     class NotificationClient : public IBinder::DeathRecipient {
    314     public:
    315                             NotificationClient(const sp<AudioFlinger>& audioFlinger,
    316                                                 const sp<IAudioFlingerClient>& client,
    317                                                 pid_t pid);
    318         virtual             ~NotificationClient();
    319 
    320                 sp<IAudioFlingerClient> audioFlingerClient() const { return mAudioFlingerClient; }
    321 
    322                 // IBinder::DeathRecipient
    323                 virtual     void        binderDied(const wp<IBinder>& who);
    324 
    325     private:
    326                             NotificationClient(const NotificationClient&);
    327                             NotificationClient& operator = (const NotificationClient&);
    328 
    329         const sp<AudioFlinger>  mAudioFlinger;
    330         const pid_t             mPid;
    331         const sp<IAudioFlingerClient> mAudioFlingerClient;
    332     };
    333 
    334     class TrackHandle;
    335     class RecordHandle;
    336     class RecordThread;
    337     class PlaybackThread;
    338     class MixerThread;
    339     class DirectOutputThread;
    340     class DuplicatingThread;
    341     class Track;
    342     class RecordTrack;
    343     class EffectModule;
    344     class EffectHandle;
    345     class EffectChain;
    346     struct AudioStreamOut;
    347     struct AudioStreamIn;
    348 
    349     class ThreadBase : public Thread {
    350     public:
    351 
    352         enum type_t {
    353             MIXER,              // Thread class is MixerThread
    354             DIRECT,             // Thread class is DirectOutputThread
    355             DUPLICATING,        // Thread class is DuplicatingThread
    356             RECORD              // Thread class is RecordThread
    357         };
    358 
    359         ThreadBase (const sp<AudioFlinger>& audioFlinger, audio_io_handle_t id,
    360                     audio_devices_t outDevice, audio_devices_t inDevice, type_t type);
    361         virtual             ~ThreadBase();
    362 
    363         void dumpBase(int fd, const Vector<String16>& args);
    364         void dumpEffectChains(int fd, const Vector<String16>& args);
    365 
    366         void clearPowerManager();
    367 
    368         // base for record and playback
    369         class TrackBase : public ExtendedAudioBufferProvider, public RefBase {
    370 
    371         public:
    372             enum track_state {
    373                 IDLE,
    374                 TERMINATED,
    375                 FLUSHED,
    376                 STOPPED,
    377                 // next 2 states are currently used for fast tracks only
    378                 STOPPING_1,     // waiting for first underrun
    379                 STOPPING_2,     // waiting for presentation complete
    380                 RESUMING,
    381                 ACTIVE,
    382                 PAUSING,
    383                 PAUSED
    384             };
    385 
    386                                 TrackBase(ThreadBase *thread,
    387                                         const sp<Client>& client,
    388                                         uint32_t sampleRate,
    389                                         audio_format_t format,
    390                                         audio_channel_mask_t channelMask,
    391                                         int frameCount,
    392                                         const sp<IMemory>& sharedBuffer,
    393                                         int sessionId);
    394             virtual             ~TrackBase();
    395 
    396             virtual status_t    start(AudioSystem::sync_event_t event,
    397                                      int triggerSession) = 0;
    398             virtual void        stop() = 0;
    399                     sp<IMemory> getCblk() const { return mCblkMemory; }
    400                     audio_track_cblk_t* cblk() const { return mCblk; }
    401                     int         sessionId() const { return mSessionId; }
    402             virtual status_t    setSyncEvent(const sp<SyncEvent>& event);
    403 
    404         protected:
    405                                 TrackBase(const TrackBase&);
    406                                 TrackBase& operator = (const TrackBase&);
    407 
    408             // AudioBufferProvider interface
    409             virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer, int64_t pts) = 0;
    410             virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
    411 
    412             // ExtendedAudioBufferProvider interface is only needed for Track,
    413             // but putting it in TrackBase avoids the complexity of virtual inheritance
    414             virtual size_t  framesReady() const { return SIZE_MAX; }
    415 
    416             audio_format_t format() const {
    417                 return mFormat;
    418             }
    419 
    420             int channelCount() const { return mChannelCount; }
    421 
    422             audio_channel_mask_t channelMask() const { return mChannelMask; }
    423 
    424             int sampleRate() const; // FIXME inline after cblk sr moved
    425 
    426             // Return a pointer to the start of a contiguous slice of the track buffer.
    427             // Parameter 'offset' is the requested start position, expressed in
    428             // monotonically increasing frame units relative to the track epoch.
    429             // Parameter 'frames' is the requested length, also in frame units.
    430             // Always returns non-NULL.  It is the caller's responsibility to
    431             // verify that this will be successful; the result of calling this
    432             // function with invalid 'offset' or 'frames' is undefined.
    433             void* getBuffer(uint32_t offset, uint32_t frames) const;
    434 
    435             bool isStopped() const {
    436                 return (mState == STOPPED || mState == FLUSHED);
    437             }
    438 
    439             // for fast tracks only
    440             bool isStopping() const {
    441                 return mState == STOPPING_1 || mState == STOPPING_2;
    442             }
    443             bool isStopping_1() const {
    444                 return mState == STOPPING_1;
    445             }
    446             bool isStopping_2() const {
    447                 return mState == STOPPING_2;
    448             }
    449 
    450             bool isTerminated() const {
    451                 return mState == TERMINATED;
    452             }
    453 
    454             bool step();
    455             void reset();
    456 
    457             const wp<ThreadBase> mThread;
    458             /*const*/ sp<Client> mClient;   // see explanation at ~TrackBase() why not const
    459             sp<IMemory>         mCblkMemory;
    460             audio_track_cblk_t* mCblk;
    461             void*               mBuffer;    // start of track buffer, typically in shared memory
    462             void*               mBufferEnd; // &mBuffer[mFrameCount * frameSize], where frameSize
    463                                             //   is based on mChannelCount and 16-bit samples
    464             uint32_t            mFrameCount;
    465             // we don't really need a lock for these
    466             track_state         mState;
    467             const uint32_t      mSampleRate;    // initial sample rate only; for tracks which
    468                                 // support dynamic rates, the current value is in control block
    469             const audio_format_t mFormat;
    470             bool                mStepServerFailed;
    471             const int           mSessionId;
    472             uint8_t             mChannelCount;
    473             audio_channel_mask_t mChannelMask;
    474             Vector < sp<SyncEvent> >mSyncEvents;
    475         };
    476 
    477         enum {
    478             CFG_EVENT_IO,
    479             CFG_EVENT_PRIO
    480         };
    481 
    482         class ConfigEvent {
    483         public:
    484             ConfigEvent(int type) : mType(type) {}
    485             virtual ~ConfigEvent() {}
    486 
    487                      int type() const { return mType; }
    488 
    489             virtual  void dump(char *buffer, size_t size) = 0;
    490 
    491         private:
    492             const int mType;
    493         };
    494 
    495         class IoConfigEvent : public ConfigEvent {
    496         public:
    497             IoConfigEvent(int event, int param) :
    498                 ConfigEvent(CFG_EVENT_IO), mEvent(event), mParam(event) {}
    499             virtual ~IoConfigEvent() {}
    500 
    501                     int event() const { return mEvent; }
    502                     int param() const { return mParam; }
    503 
    504             virtual  void dump(char *buffer, size_t size) {
    505                 snprintf(buffer, size, "IO event: event %d, param %d\n", mEvent, mParam);
    506             }
    507 
    508         private:
    509             const int mEvent;
    510             const int mParam;
    511         };
    512 
    513         class PrioConfigEvent : public ConfigEvent {
    514         public:
    515             PrioConfigEvent(pid_t pid, pid_t tid, int32_t prio) :
    516                 ConfigEvent(CFG_EVENT_PRIO), mPid(pid), mTid(tid), mPrio(prio) {}
    517             virtual ~PrioConfigEvent() {}
    518 
    519                     pid_t pid() const { return mPid; }
    520                     pid_t tid() const { return mTid; }
    521                     int32_t prio() const { return mPrio; }
    522 
    523             virtual  void dump(char *buffer, size_t size) {
    524                 snprintf(buffer, size, "Prio event: pid %d, tid %d, prio %d\n", mPid, mTid, mPrio);
    525             }
    526 
    527         private:
    528             const pid_t mPid;
    529             const pid_t mTid;
    530             const int32_t mPrio;
    531         };
    532 
    533 
    534         class PMDeathRecipient : public IBinder::DeathRecipient {
    535         public:
    536                         PMDeathRecipient(const wp<ThreadBase>& thread) : mThread(thread) {}
    537             virtual     ~PMDeathRecipient() {}
    538 
    539             // IBinder::DeathRecipient
    540             virtual     void        binderDied(const wp<IBinder>& who);
    541 
    542         private:
    543                         PMDeathRecipient(const PMDeathRecipient&);
    544                         PMDeathRecipient& operator = (const PMDeathRecipient&);
    545 
    546             wp<ThreadBase> mThread;
    547         };
    548 
    549         virtual     status_t    initCheck() const = 0;
    550 
    551                     // static externally-visible
    552                     type_t      type() const { return mType; }
    553                     audio_io_handle_t id() const { return mId;}
    554 
    555                     // dynamic externally-visible
    556                     uint32_t    sampleRate() const { return mSampleRate; }
    557                     int         channelCount() const { return mChannelCount; }
    558                     audio_channel_mask_t channelMask() const { return mChannelMask; }
    559                     audio_format_t format() const { return mFormat; }
    560                     // Called by AudioFlinger::frameCount(audio_io_handle_t output) and effects,
    561                     // and returns the normal mix buffer's frame count.
    562                     size_t      frameCount() const { return mNormalFrameCount; }
    563                     // Return's the HAL's frame count i.e. fast mixer buffer size.
    564                     size_t      frameCountHAL() const { return mFrameCount; }
    565 
    566         // Should be "virtual status_t requestExitAndWait()" and override same
    567         // method in Thread, but Thread::requestExitAndWait() is not yet virtual.
    568                     void        exit();
    569         virtual     bool        checkForNewParameters_l() = 0;
    570         virtual     status_t    setParameters(const String8& keyValuePairs);
    571         virtual     String8     getParameters(const String8& keys) = 0;
    572         virtual     void        audioConfigChanged_l(int event, int param = 0) = 0;
    573                     void        sendIoConfigEvent(int event, int param = 0);
    574                     void        sendIoConfigEvent_l(int event, int param = 0);
    575                     void        sendPrioConfigEvent_l(pid_t pid, pid_t tid, int32_t prio);
    576                     void        processConfigEvents();
    577 
    578                     // see note at declaration of mStandby, mOutDevice and mInDevice
    579                     bool        standby() const { return mStandby; }
    580                     audio_devices_t outDevice() const { return mOutDevice; }
    581                     audio_devices_t inDevice() const { return mInDevice; }
    582 
    583         virtual     audio_stream_t* stream() const = 0;
    584 
    585                     sp<EffectHandle> createEffect_l(
    586                                         const sp<AudioFlinger::Client>& client,
    587                                         const sp<IEffectClient>& effectClient,
    588                                         int32_t priority,
    589                                         int sessionId,
    590                                         effect_descriptor_t *desc,
    591                                         int *enabled,
    592                                         status_t *status);
    593                     void disconnectEffect(const sp< EffectModule>& effect,
    594                                           EffectHandle *handle,
    595                                           bool unpinIfLast);
    596 
    597                     // return values for hasAudioSession (bit field)
    598                     enum effect_state {
    599                         EFFECT_SESSION = 0x1,   // the audio session corresponds to at least one
    600                                                 // effect
    601                         TRACK_SESSION = 0x2     // the audio session corresponds to at least one
    602                                                 // track
    603                     };
    604 
    605                     // get effect chain corresponding to session Id.
    606                     sp<EffectChain> getEffectChain(int sessionId);
    607                     // same as getEffectChain() but must be called with ThreadBase mutex locked
    608                     sp<EffectChain> getEffectChain_l(int sessionId) const;
    609                     // add an effect chain to the chain list (mEffectChains)
    610         virtual     status_t addEffectChain_l(const sp<EffectChain>& chain) = 0;
    611                     // remove an effect chain from the chain list (mEffectChains)
    612         virtual     size_t removeEffectChain_l(const sp<EffectChain>& chain) = 0;
    613                     // lock all effect chains Mutexes. Must be called before releasing the
    614                     // ThreadBase mutex before processing the mixer and effects. This guarantees the
    615                     // integrity of the chains during the process.
    616                     // Also sets the parameter 'effectChains' to current value of mEffectChains.
    617                     void lockEffectChains_l(Vector< sp<EffectChain> >& effectChains);
    618                     // unlock effect chains after process
    619                     void unlockEffectChains(const Vector< sp<EffectChain> >& effectChains);
    620                     // set audio mode to all effect chains
    621                     void setMode(audio_mode_t mode);
    622                     // get effect module with corresponding ID on specified audio session
    623                     sp<AudioFlinger::EffectModule> getEffect(int sessionId, int effectId);
    624                     sp<AudioFlinger::EffectModule> getEffect_l(int sessionId, int effectId);
    625                     // add and effect module. Also creates the effect chain is none exists for
    626                     // the effects audio session
    627                     status_t addEffect_l(const sp< EffectModule>& effect);
    628                     // remove and effect module. Also removes the effect chain is this was the last
    629                     // effect
    630                     void removeEffect_l(const sp< EffectModule>& effect);
    631                     // detach all tracks connected to an auxiliary effect
    632         virtual     void detachAuxEffect_l(int effectId) {}
    633                     // returns either EFFECT_SESSION if effects on this audio session exist in one
    634                     // chain, or TRACK_SESSION if tracks on this audio session exist, or both
    635                     virtual uint32_t hasAudioSession(int sessionId) const = 0;
    636                     // the value returned by default implementation is not important as the
    637                     // strategy is only meaningful for PlaybackThread which implements this method
    638                     virtual uint32_t getStrategyForSession_l(int sessionId) { return 0; }
    639 
    640                     // suspend or restore effect according to the type of effect passed. a NULL
    641                     // type pointer means suspend all effects in the session
    642                     void setEffectSuspended(const effect_uuid_t *type,
    643                                             bool suspend,
    644                                             int sessionId = AUDIO_SESSION_OUTPUT_MIX);
    645                     // check if some effects must be suspended/restored when an effect is enabled
    646                     // or disabled
    647                     void checkSuspendOnEffectEnabled(const sp<EffectModule>& effect,
    648                                                      bool enabled,
    649                                                      int sessionId = AUDIO_SESSION_OUTPUT_MIX);
    650                     void checkSuspendOnEffectEnabled_l(const sp<EffectModule>& effect,
    651                                                        bool enabled,
    652                                                        int sessionId = AUDIO_SESSION_OUTPUT_MIX);
    653 
    654                     virtual status_t    setSyncEvent(const sp<SyncEvent>& event) = 0;
    655                     virtual bool        isValidSyncEvent(const sp<SyncEvent>& event) const = 0;
    656 
    657 
    658         mutable     Mutex                   mLock;
    659 
    660     protected:
    661 
    662                     // entry describing an effect being suspended in mSuspendedSessions keyed vector
    663                     class SuspendedSessionDesc : public RefBase {
    664                     public:
    665                         SuspendedSessionDesc() : mRefCount(0) {}
    666 
    667                         int mRefCount;          // number of active suspend requests
    668                         effect_uuid_t mType;    // effect type UUID
    669                     };
    670 
    671                     void        acquireWakeLock();
    672                     void        acquireWakeLock_l();
    673                     void        releaseWakeLock();
    674                     void        releaseWakeLock_l();
    675                     void setEffectSuspended_l(const effect_uuid_t *type,
    676                                               bool suspend,
    677                                               int sessionId);
    678                     // updated mSuspendedSessions when an effect suspended or restored
    679                     void        updateSuspendedSessions_l(const effect_uuid_t *type,
    680                                                           bool suspend,
    681                                                           int sessionId);
    682                     // check if some effects must be suspended when an effect chain is added
    683                     void checkSuspendOnAddEffectChain_l(const sp<EffectChain>& chain);
    684 
    685         virtual     void        preExit() { }
    686 
    687         friend class AudioFlinger;      // for mEffectChains
    688 
    689                     const type_t            mType;
    690 
    691                     // Used by parameters, config events, addTrack_l, exit
    692                     Condition               mWaitWorkCV;
    693 
    694                     const sp<AudioFlinger>  mAudioFlinger;
    695                     uint32_t                mSampleRate;
    696                     size_t                  mFrameCount;       // output HAL, direct output, record
    697                     size_t                  mNormalFrameCount; // normal mixer and effects
    698                     audio_channel_mask_t    mChannelMask;
    699                     uint16_t                mChannelCount;
    700                     size_t                  mFrameSize;
    701                     audio_format_t          mFormat;
    702 
    703                     // Parameter sequence by client: binder thread calling setParameters():
    704                     //  1. Lock mLock
    705                     //  2. Append to mNewParameters
    706                     //  3. mWaitWorkCV.signal
    707                     //  4. mParamCond.waitRelative with timeout
    708                     //  5. read mParamStatus
    709                     //  6. mWaitWorkCV.signal
    710                     //  7. Unlock
    711                     //
    712                     // Parameter sequence by server: threadLoop calling checkForNewParameters_l():
    713                     // 1. Lock mLock
    714                     // 2. If there is an entry in mNewParameters proceed ...
    715                     // 2. Read first entry in mNewParameters
    716                     // 3. Process
    717                     // 4. Remove first entry from mNewParameters
    718                     // 5. Set mParamStatus
    719                     // 6. mParamCond.signal
    720                     // 7. mWaitWorkCV.wait with timeout (this is to avoid overwriting mParamStatus)
    721                     // 8. Unlock
    722                     Condition               mParamCond;
    723                     Vector<String8>         mNewParameters;
    724                     status_t                mParamStatus;
    725 
    726                     Vector<ConfigEvent *>     mConfigEvents;
    727 
    728                     // These fields are written and read by thread itself without lock or barrier,
    729                     // and read by other threads without lock or barrier via standby() , outDevice()
    730                     // and inDevice().
    731                     // Because of the absence of a lock or barrier, any other thread that reads
    732                     // these fields must use the information in isolation, or be prepared to deal
    733                     // with possibility that it might be inconsistent with other information.
    734                     bool                    mStandby;   // Whether thread is currently in standby.
    735                     audio_devices_t         mOutDevice;   // output device
    736                     audio_devices_t         mInDevice;    // input device
    737                     audio_source_t          mAudioSource; // (see audio.h, audio_source_t)
    738 
    739                     const audio_io_handle_t mId;
    740                     Vector< sp<EffectChain> > mEffectChains;
    741 
    742                     static const int        kNameLength = 16;   // prctl(PR_SET_NAME) limit
    743                     char                    mName[kNameLength];
    744                     sp<IPowerManager>       mPowerManager;
    745                     sp<IBinder>             mWakeLockToken;
    746                     const sp<PMDeathRecipient> mDeathRecipient;
    747                     // list of suspended effects per session and per type. The first vector is
    748                     // keyed by session ID, the second by type UUID timeLow field
    749                     KeyedVector< int, KeyedVector< int, sp<SuspendedSessionDesc> > >  mSuspendedSessions;
    750     };
    751 
    752     struct  stream_type_t {
    753         stream_type_t()
    754             :   volume(1.0f),
    755                 mute(false)
    756         {
    757         }
    758         float       volume;
    759         bool        mute;
    760     };
    761 
    762     // --- PlaybackThread ---
    763     class PlaybackThread : public ThreadBase {
    764     public:
    765 
    766         enum mixer_state {
    767             MIXER_IDLE,             // no active tracks
    768             MIXER_TRACKS_ENABLED,   // at least one active track, but no track has any data ready
    769             MIXER_TRACKS_READY      // at least one active track, and at least one track has data
    770             // standby mode does not have an enum value
    771             // suspend by audio policy manager is orthogonal to mixer state
    772         };
    773 
    774         // playback track
    775         class Track : public TrackBase, public VolumeProvider {
    776         public:
    777                                 Track(  PlaybackThread *thread,
    778                                         const sp<Client>& client,
    779                                         audio_stream_type_t streamType,
    780                                         uint32_t sampleRate,
    781                                         audio_format_t format,
    782                                         audio_channel_mask_t channelMask,
    783                                         int frameCount,
    784                                         const sp<IMemory>& sharedBuffer,
    785                                         int sessionId,
    786                                         IAudioFlinger::track_flags_t flags);
    787             virtual             ~Track();
    788 
    789             static  void        appendDumpHeader(String8& result);
    790                     void        dump(char* buffer, size_t size);
    791             virtual status_t    start(AudioSystem::sync_event_t event = AudioSystem::SYNC_EVENT_NONE,
    792                                      int triggerSession = 0);
    793             virtual void        stop();
    794                     void        pause();
    795 
    796                     void        flush();
    797                     void        destroy();
    798                     void        mute(bool);
    799                     int         name() const { return mName; }
    800 
    801                     audio_stream_type_t streamType() const {
    802                         return mStreamType;
    803                     }
    804                     status_t    attachAuxEffect(int EffectId);
    805                     void        setAuxBuffer(int EffectId, int32_t *buffer);
    806                     int32_t     *auxBuffer() const { return mAuxBuffer; }
    807                     void        setMainBuffer(int16_t *buffer) { mMainBuffer = buffer; }
    808                     int16_t     *mainBuffer() const { return mMainBuffer; }
    809                     int         auxEffectId() const { return mAuxEffectId; }
    810 
    811         // implement FastMixerState::VolumeProvider interface
    812             virtual uint32_t    getVolumeLR();
    813             virtual status_t    setSyncEvent(const sp<SyncEvent>& event);
    814 
    815         protected:
    816             // for numerous
    817             friend class PlaybackThread;
    818             friend class MixerThread;
    819             friend class DirectOutputThread;
    820 
    821                                 Track(const Track&);
    822                                 Track& operator = (const Track&);
    823 
    824             // AudioBufferProvider interface
    825             virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer, int64_t pts = kInvalidPTS);
    826             // releaseBuffer() not overridden
    827 
    828             virtual size_t framesReady() const;
    829 
    830             bool isMuted() const { return mMute; }
    831             bool isPausing() const {
    832                 return mState == PAUSING;
    833             }
    834             bool isPaused() const {
    835                 return mState == PAUSED;
    836             }
    837             bool isResuming() const {
    838                 return mState == RESUMING;
    839             }
    840             bool isReady() const;
    841             void setPaused() { mState = PAUSED; }
    842             void reset();
    843 
    844             bool isOutputTrack() const {
    845                 return (mStreamType == AUDIO_STREAM_CNT);
    846             }
    847 
    848             sp<IMemory> sharedBuffer() const { return mSharedBuffer; }
    849 
    850             bool presentationComplete(size_t framesWritten, size_t audioHalFrames);
    851 
    852         public:
    853             void triggerEvents(AudioSystem::sync_event_t type);
    854             virtual bool isTimedTrack() const { return false; }
    855             bool isFastTrack() const { return (mFlags & IAudioFlinger::TRACK_FAST) != 0; }
    856 
    857         protected:
    858 
    859             // written by Track::mute() called by binder thread(s), without a mutex or barrier.
    860             // read by Track::isMuted() called by playback thread, also without a mutex or barrier.
    861             // The lack of mutex or barrier is safe because the mute status is only used by itself.
    862             bool                mMute;
    863 
    864             // FILLED state is used for suppressing volume ramp at begin of playing
    865             enum {FS_INVALID, FS_FILLING, FS_FILLED, FS_ACTIVE};
    866             mutable uint8_t     mFillingUpStatus;
    867             int8_t              mRetryCount;
    868             const sp<IMemory>   mSharedBuffer;
    869             bool                mResetDone;
    870             const audio_stream_type_t mStreamType;
    871             int                 mName;      // track name on the normal mixer,
    872                                             // allocated statically at track creation time,
    873                                             // and is even allocated (though unused) for fast tracks
    874                                             // FIXME don't allocate track name for fast tracks
    875             int16_t             *mMainBuffer;
    876             int32_t             *mAuxBuffer;
    877             int                 mAuxEffectId;
    878             bool                mHasVolumeController;
    879             size_t              mPresentationCompleteFrames; // number of frames written to the audio HAL
    880                                                        // when this track will be fully rendered
    881         private:
    882             IAudioFlinger::track_flags_t mFlags;
    883 
    884             // The following fields are only for fast tracks, and should be in a subclass
    885             int                 mFastIndex; // index within FastMixerState::mFastTracks[];
    886                                             // either mFastIndex == -1 if not isFastTrack()
    887                                             // or 0 < mFastIndex < FastMixerState::kMaxFast because
    888                                             // index 0 is reserved for normal mixer's submix;
    889                                             // index is allocated statically at track creation time
    890                                             // but the slot is only used if track is active
    891             FastTrackUnderruns  mObservedUnderruns; // Most recently observed value of
    892                                             // mFastMixerDumpState.mTracks[mFastIndex].mUnderruns
    893             uint32_t            mUnderrunCount; // Counter of total number of underruns, never reset
    894             volatile float      mCachedVolume;  // combined master volume and stream type volume;
    895                                                 // 'volatile' means accessed without lock or
    896                                                 // barrier, but is read/written atomically
    897         };  // end of Track
    898 
    899         class TimedTrack : public Track {
    900           public:
    901             static sp<TimedTrack> create(PlaybackThread *thread,
    902                                          const sp<Client>& client,
    903                                          audio_stream_type_t streamType,
    904                                          uint32_t sampleRate,
    905                                          audio_format_t format,
    906                                          audio_channel_mask_t channelMask,
    907                                          int frameCount,
    908                                          const sp<IMemory>& sharedBuffer,
    909                                          int sessionId);
    910             virtual ~TimedTrack();
    911 
    912             class TimedBuffer {
    913               public:
    914                 TimedBuffer();
    915                 TimedBuffer(const sp<IMemory>& buffer, int64_t pts);
    916                 const sp<IMemory>& buffer() const { return mBuffer; }
    917                 int64_t pts() const { return mPTS; }
    918                 uint32_t position() const { return mPosition; }
    919                 void setPosition(uint32_t pos) { mPosition = pos; }
    920               private:
    921                 sp<IMemory> mBuffer;
    922                 int64_t     mPTS;
    923                 uint32_t    mPosition;
    924             };
    925 
    926             // Mixer facing methods.
    927             virtual bool isTimedTrack() const { return true; }
    928             virtual size_t framesReady() const;
    929 
    930             // AudioBufferProvider interface
    931             virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer,
    932                                            int64_t pts);
    933             virtual void releaseBuffer(AudioBufferProvider::Buffer* buffer);
    934 
    935             // Client/App facing methods.
    936             status_t    allocateTimedBuffer(size_t size,
    937                                             sp<IMemory>* buffer);
    938             status_t    queueTimedBuffer(const sp<IMemory>& buffer,
    939                                          int64_t pts);
    940             status_t    setMediaTimeTransform(const LinearTransform& xform,
    941                                               TimedAudioTrack::TargetTimeline target);
    942 
    943           private:
    944             TimedTrack(PlaybackThread *thread,
    945                        const sp<Client>& client,
    946                        audio_stream_type_t streamType,
    947                        uint32_t sampleRate,
    948                        audio_format_t format,
    949                        audio_channel_mask_t channelMask,
    950                        int frameCount,
    951                        const sp<IMemory>& sharedBuffer,
    952                        int sessionId);
    953 
    954             void timedYieldSamples_l(AudioBufferProvider::Buffer* buffer);
    955             void timedYieldSilence_l(uint32_t numFrames,
    956                                      AudioBufferProvider::Buffer* buffer);
    957             void trimTimedBufferQueue_l();
    958             void trimTimedBufferQueueHead_l(const char* logTag);
    959             void updateFramesPendingAfterTrim_l(const TimedBuffer& buf,
    960                                                 const char* logTag);
    961 
    962             uint64_t            mLocalTimeFreq;
    963             LinearTransform     mLocalTimeToSampleTransform;
    964             LinearTransform     mMediaTimeToSampleTransform;
    965             sp<MemoryDealer>    mTimedMemoryDealer;
    966 
    967             Vector<TimedBuffer> mTimedBufferQueue;
    968             bool                mQueueHeadInFlight;
    969             bool                mTrimQueueHeadOnRelease;
    970             uint32_t            mFramesPendingInQueue;
    971 
    972             uint8_t*            mTimedSilenceBuffer;
    973             uint32_t            mTimedSilenceBufferSize;
    974             mutable Mutex       mTimedBufferQueueLock;
    975             bool                mTimedAudioOutputOnTime;
    976             CCHelper            mCCHelper;
    977 
    978             Mutex               mMediaTimeTransformLock;
    979             LinearTransform     mMediaTimeTransform;
    980             bool                mMediaTimeTransformValid;
    981             TimedAudioTrack::TargetTimeline mMediaTimeTransformTarget;
    982         };
    983 
    984 
    985         // playback track
    986         class OutputTrack : public Track {
    987         public:
    988 
    989             class Buffer: public AudioBufferProvider::Buffer {
    990             public:
    991                 int16_t *mBuffer;
    992             };
    993 
    994                                 OutputTrack(PlaybackThread *thread,
    995                                         DuplicatingThread *sourceThread,
    996                                         uint32_t sampleRate,
    997                                         audio_format_t format,
    998                                         audio_channel_mask_t channelMask,
    999                                         int frameCount);
   1000             virtual             ~OutputTrack();
   1001 
   1002             virtual status_t    start(AudioSystem::sync_event_t event = AudioSystem::SYNC_EVENT_NONE,
   1003                                      int triggerSession = 0);
   1004             virtual void        stop();
   1005                     bool        write(int16_t* data, uint32_t frames);
   1006                     bool        bufferQueueEmpty() const { return mBufferQueue.size() == 0; }
   1007                     bool        isActive() const { return mActive; }
   1008             const wp<ThreadBase>& thread() const { return mThread; }
   1009 
   1010         private:
   1011 
   1012             enum {
   1013                 NO_MORE_BUFFERS = 0x80000001,   // same in AudioTrack.h, ok to be different value
   1014             };
   1015 
   1016             status_t            obtainBuffer(AudioBufferProvider::Buffer* buffer, uint32_t waitTimeMs);
   1017             void                clearBufferQueue();
   1018 
   1019             // Maximum number of pending buffers allocated by OutputTrack::write()
   1020             static const uint8_t kMaxOverFlowBuffers = 10;
   1021 
   1022             Vector < Buffer* >          mBufferQueue;
   1023             AudioBufferProvider::Buffer mOutBuffer;
   1024             bool                        mActive;
   1025             DuplicatingThread* const mSourceThread; // for waitTimeMs() in write()
   1026         };  // end of OutputTrack
   1027 
   1028         PlaybackThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
   1029                         audio_io_handle_t id, audio_devices_t device, type_t type);
   1030         virtual             ~PlaybackThread();
   1031 
   1032                     void        dump(int fd, const Vector<String16>& args);
   1033 
   1034         // Thread virtuals
   1035         virtual     status_t    readyToRun();
   1036         virtual     bool        threadLoop();
   1037 
   1038         // RefBase
   1039         virtual     void        onFirstRef();
   1040 
   1041 protected:
   1042         // Code snippets that were lifted up out of threadLoop()
   1043         virtual     void        threadLoop_mix() = 0;
   1044         virtual     void        threadLoop_sleepTime() = 0;
   1045         virtual     void        threadLoop_write();
   1046         virtual     void        threadLoop_standby();
   1047         virtual     void        threadLoop_removeTracks(const Vector< sp<Track> >& tracksToRemove);
   1048 
   1049                     // prepareTracks_l reads and writes mActiveTracks, and returns
   1050                     // the pending set of tracks to remove via Vector 'tracksToRemove'.  The caller
   1051                     // is responsible for clearing or destroying this Vector later on, when it
   1052                     // is safe to do so. That will drop the final ref count and destroy the tracks.
   1053         virtual     mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove) = 0;
   1054 
   1055         // ThreadBase virtuals
   1056         virtual     void        preExit();
   1057 
   1058 public:
   1059 
   1060         virtual     status_t    initCheck() const { return (mOutput == NULL) ? NO_INIT : NO_ERROR; }
   1061 
   1062                     // return estimated latency in milliseconds, as reported by HAL
   1063                     uint32_t    latency() const;
   1064                     // same, but lock must already be held
   1065                     uint32_t    latency_l() const;
   1066 
   1067                     void        setMasterVolume(float value);
   1068                     void        setMasterMute(bool muted);
   1069 
   1070                     void        setStreamVolume(audio_stream_type_t stream, float value);
   1071                     void        setStreamMute(audio_stream_type_t stream, bool muted);
   1072 
   1073                     float       streamVolume(audio_stream_type_t stream) const;
   1074 
   1075                     sp<Track>   createTrack_l(
   1076                                     const sp<AudioFlinger::Client>& client,
   1077                                     audio_stream_type_t streamType,
   1078                                     uint32_t sampleRate,
   1079                                     audio_format_t format,
   1080                                     audio_channel_mask_t channelMask,
   1081                                     int frameCount,
   1082                                     const sp<IMemory>& sharedBuffer,
   1083                                     int sessionId,
   1084                                     IAudioFlinger::track_flags_t flags,
   1085                                     pid_t tid,
   1086                                     status_t *status);
   1087 
   1088                     AudioStreamOut* getOutput() const;
   1089                     AudioStreamOut* clearOutput();
   1090                     virtual audio_stream_t* stream() const;
   1091 
   1092                     // a very large number of suspend() will eventually wraparound, but unlikely
   1093                     void        suspend() { (void) android_atomic_inc(&mSuspended); }
   1094                     void        restore()
   1095                                     {
   1096                                         // if restore() is done without suspend(), get back into
   1097                                         // range so that the next suspend() will operate correctly
   1098                                         if (android_atomic_dec(&mSuspended) <= 0) {
   1099                                             android_atomic_release_store(0, &mSuspended);
   1100                                         }
   1101                                     }
   1102                     bool        isSuspended() const
   1103                                     { return android_atomic_acquire_load(&mSuspended) > 0; }
   1104 
   1105         virtual     String8     getParameters(const String8& keys);
   1106         virtual     void        audioConfigChanged_l(int event, int param = 0);
   1107                     status_t    getRenderPosition(uint32_t *halFrames, uint32_t *dspFrames);
   1108                     int16_t     *mixBuffer() const { return mMixBuffer; };
   1109 
   1110         virtual     void detachAuxEffect_l(int effectId);
   1111                     status_t attachAuxEffect(const sp<AudioFlinger::PlaybackThread::Track> track,
   1112                             int EffectId);
   1113                     status_t attachAuxEffect_l(const sp<AudioFlinger::PlaybackThread::Track> track,
   1114                             int EffectId);
   1115 
   1116                     virtual status_t addEffectChain_l(const sp<EffectChain>& chain);
   1117                     virtual size_t removeEffectChain_l(const sp<EffectChain>& chain);
   1118                     virtual uint32_t hasAudioSession(int sessionId) const;
   1119                     virtual uint32_t getStrategyForSession_l(int sessionId);
   1120 
   1121 
   1122                     virtual status_t setSyncEvent(const sp<SyncEvent>& event);
   1123                     virtual bool     isValidSyncEvent(const sp<SyncEvent>& event) const;
   1124                             void     invalidateTracks(audio_stream_type_t streamType);
   1125 
   1126 
   1127     protected:
   1128         int16_t*                        mMixBuffer;
   1129 
   1130         // suspend count, > 0 means suspended.  While suspended, the thread continues to pull from
   1131         // tracks and mix, but doesn't write to HAL.  A2DP and SCO HAL implementations can't handle
   1132         // concurrent use of both of them, so Audio Policy Service suspends one of the threads to
   1133         // workaround that restriction.
   1134         // 'volatile' means accessed via atomic operations and no lock.
   1135         volatile int32_t                mSuspended;
   1136 
   1137         int                             mBytesWritten;
   1138     private:
   1139         // mMasterMute is in both PlaybackThread and in AudioFlinger.  When a
   1140         // PlaybackThread needs to find out if master-muted, it checks it's local
   1141         // copy rather than the one in AudioFlinger.  This optimization saves a lock.
   1142         bool                            mMasterMute;
   1143                     void        setMasterMute_l(bool muted) { mMasterMute = muted; }
   1144     protected:
   1145         SortedVector< wp<Track> >       mActiveTracks;  // FIXME check if this could be sp<>
   1146 
   1147         // Allocate a track name for a given channel mask.
   1148         //   Returns name >= 0 if successful, -1 on failure.
   1149         virtual int             getTrackName_l(audio_channel_mask_t channelMask, int sessionId) = 0;
   1150         virtual void            deleteTrackName_l(int name) = 0;
   1151 
   1152         // Time to sleep between cycles when:
   1153         virtual uint32_t        activeSleepTimeUs() const;      // mixer state MIXER_TRACKS_ENABLED
   1154         virtual uint32_t        idleSleepTimeUs() const = 0;    // mixer state MIXER_IDLE
   1155         virtual uint32_t        suspendSleepTimeUs() const = 0; // audio policy manager suspended us
   1156         // No sleep when mixer state == MIXER_TRACKS_READY; relies on audio HAL stream->write()
   1157         // No sleep in standby mode; waits on a condition
   1158 
   1159         // Code snippets that are temporarily lifted up out of threadLoop() until the merge
   1160                     void        checkSilentMode_l();
   1161 
   1162         // Non-trivial for DUPLICATING only
   1163         virtual     void        saveOutputTracks() { }
   1164         virtual     void        clearOutputTracks() { }
   1165 
   1166         // Cache various calculated values, at threadLoop() entry and after a parameter change
   1167         virtual     void        cacheParameters_l();
   1168 
   1169         virtual     uint32_t    correctLatency(uint32_t latency) const;
   1170 
   1171     private:
   1172 
   1173         friend class AudioFlinger;      // for numerous
   1174 
   1175         PlaybackThread(const Client&);
   1176         PlaybackThread& operator = (const PlaybackThread&);
   1177 
   1178         status_t    addTrack_l(const sp<Track>& track);
   1179         void        destroyTrack_l(const sp<Track>& track);
   1180         void        removeTrack_l(const sp<Track>& track);
   1181 
   1182         void        readOutputParameters();
   1183 
   1184         virtual void dumpInternals(int fd, const Vector<String16>& args);
   1185         void        dumpTracks(int fd, const Vector<String16>& args);
   1186 
   1187         SortedVector< sp<Track> >       mTracks;
   1188         // mStreamTypes[] uses 1 additional stream type internally for the OutputTrack used by DuplicatingThread
   1189         stream_type_t                   mStreamTypes[AUDIO_STREAM_CNT + 1];
   1190         AudioStreamOut                  *mOutput;
   1191 
   1192         float                           mMasterVolume;
   1193         nsecs_t                         mLastWriteTime;
   1194         int                             mNumWrites;
   1195         int                             mNumDelayedWrites;
   1196         bool                            mInWrite;
   1197 
   1198         // FIXME rename these former local variables of threadLoop to standard "m" names
   1199         nsecs_t                         standbyTime;
   1200         size_t                          mixBufferSize;
   1201 
   1202         // cached copies of activeSleepTimeUs() and idleSleepTimeUs() made by cacheParameters_l()
   1203         uint32_t                        activeSleepTime;
   1204         uint32_t                        idleSleepTime;
   1205 
   1206         uint32_t                        sleepTime;
   1207 
   1208         // mixer status returned by prepareTracks_l()
   1209         mixer_state                     mMixerStatus; // current cycle
   1210                                                       // previous cycle when in prepareTracks_l()
   1211         mixer_state                     mMixerStatusIgnoringFastTracks;
   1212                                                       // FIXME or a separate ready state per track
   1213 
   1214         // FIXME move these declarations into the specific sub-class that needs them
   1215         // MIXER only
   1216         uint32_t                        sleepTimeShift;
   1217 
   1218         // same as AudioFlinger::mStandbyTimeInNsecs except for DIRECT which uses a shorter value
   1219         nsecs_t                         standbyDelay;
   1220 
   1221         // MIXER only
   1222         nsecs_t                         maxPeriod;
   1223 
   1224         // DUPLICATING only
   1225         uint32_t                        writeFrames;
   1226 
   1227     private:
   1228         // The HAL output sink is treated as non-blocking, but current implementation is blocking
   1229         sp<NBAIO_Sink>          mOutputSink;
   1230         // If a fast mixer is present, the blocking pipe sink, otherwise clear
   1231         sp<NBAIO_Sink>          mPipeSink;
   1232         // The current sink for the normal mixer to write it's (sub)mix, mOutputSink or mPipeSink
   1233         sp<NBAIO_Sink>          mNormalSink;
   1234         // For dumpsys
   1235         sp<NBAIO_Sink>          mTeeSink;
   1236         sp<NBAIO_Source>        mTeeSource;
   1237         uint32_t                mScreenState;   // cached copy of gScreenState
   1238     public:
   1239         virtual     bool        hasFastMixer() const = 0;
   1240         virtual     FastTrackUnderruns getFastTrackUnderruns(size_t fastIndex) const
   1241                                     { FastTrackUnderruns dummy; return dummy; }
   1242 
   1243     protected:
   1244                     // accessed by both binder threads and within threadLoop(), lock on mutex needed
   1245                     unsigned    mFastTrackAvailMask;    // bit i set if fast track [i] is available
   1246 
   1247     };
   1248 
   1249     class MixerThread : public PlaybackThread {
   1250     public:
   1251         MixerThread (const sp<AudioFlinger>& audioFlinger,
   1252                      AudioStreamOut* output,
   1253                      audio_io_handle_t id,
   1254                      audio_devices_t device,
   1255                      type_t type = MIXER);
   1256         virtual             ~MixerThread();
   1257 
   1258         // Thread virtuals
   1259 
   1260         virtual     bool        checkForNewParameters_l();
   1261         virtual     void        dumpInternals(int fd, const Vector<String16>& args);
   1262 
   1263     protected:
   1264         virtual     mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove);
   1265         virtual     int         getTrackName_l(audio_channel_mask_t channelMask, int sessionId);
   1266         virtual     void        deleteTrackName_l(int name);
   1267         virtual     uint32_t    idleSleepTimeUs() const;
   1268         virtual     uint32_t    suspendSleepTimeUs() const;
   1269         virtual     void        cacheParameters_l();
   1270 
   1271         // threadLoop snippets
   1272         virtual     void        threadLoop_write();
   1273         virtual     void        threadLoop_standby();
   1274         virtual     void        threadLoop_mix();
   1275         virtual     void        threadLoop_sleepTime();
   1276         virtual     void        threadLoop_removeTracks(const Vector< sp<Track> >& tracksToRemove);
   1277         virtual     uint32_t    correctLatency(uint32_t latency) const;
   1278 
   1279                     AudioMixer* mAudioMixer;    // normal mixer
   1280     private:
   1281                     // one-time initialization, no locks required
   1282                     FastMixer*  mFastMixer;         // non-NULL if there is also a fast mixer
   1283                     sp<AudioWatchdog> mAudioWatchdog; // non-0 if there is an audio watchdog thread
   1284 
   1285                     // contents are not guaranteed to be consistent, no locks required
   1286                     FastMixerDumpState mFastMixerDumpState;
   1287 #ifdef STATE_QUEUE_DUMP
   1288                     StateQueueObserverDump mStateQueueObserverDump;
   1289                     StateQueueMutatorDump  mStateQueueMutatorDump;
   1290 #endif
   1291                     AudioWatchdogDump mAudioWatchdogDump;
   1292 
   1293                     // accessible only within the threadLoop(), no locks required
   1294                     //          mFastMixer->sq()    // for mutating and pushing state
   1295                     int32_t     mFastMixerFutex;    // for cold idle
   1296 
   1297     public:
   1298         virtual     bool        hasFastMixer() const { return mFastMixer != NULL; }
   1299         virtual     FastTrackUnderruns getFastTrackUnderruns(size_t fastIndex) const {
   1300                                   ALOG_ASSERT(fastIndex < FastMixerState::kMaxFastTracks);
   1301                                   return mFastMixerDumpState.mTracks[fastIndex].mUnderruns;
   1302                                 }
   1303     };
   1304 
   1305     class DirectOutputThread : public PlaybackThread {
   1306     public:
   1307 
   1308         DirectOutputThread (const sp<AudioFlinger>& audioFlinger, AudioStreamOut* output,
   1309                             audio_io_handle_t id, audio_devices_t device);
   1310         virtual                 ~DirectOutputThread();
   1311 
   1312         // Thread virtuals
   1313 
   1314         virtual     bool        checkForNewParameters_l();
   1315 
   1316     protected:
   1317         virtual     int         getTrackName_l(audio_channel_mask_t channelMask, int sessionId);
   1318         virtual     void        deleteTrackName_l(int name);
   1319         virtual     uint32_t    activeSleepTimeUs() const;
   1320         virtual     uint32_t    idleSleepTimeUs() const;
   1321         virtual     uint32_t    suspendSleepTimeUs() const;
   1322         virtual     void        cacheParameters_l();
   1323 
   1324         // threadLoop snippets
   1325         virtual     mixer_state prepareTracks_l(Vector< sp<Track> > *tracksToRemove);
   1326         virtual     void        threadLoop_mix();
   1327         virtual     void        threadLoop_sleepTime();
   1328 
   1329         // volumes last sent to audio HAL with stream->set_volume()
   1330         float mLeftVolFloat;
   1331         float mRightVolFloat;
   1332 
   1333 private:
   1334         // prepareTracks_l() tells threadLoop_mix() the name of the single active track
   1335         sp<Track>               mActiveTrack;
   1336     public:
   1337         virtual     bool        hasFastMixer() const { return false; }
   1338     };
   1339 
   1340     class DuplicatingThread : public MixerThread {
   1341     public:
   1342         DuplicatingThread (const sp<AudioFlinger>& audioFlinger, MixerThread* mainThread,
   1343                            audio_io_handle_t id);
   1344         virtual                 ~DuplicatingThread();
   1345 
   1346         // Thread virtuals
   1347                     void        addOutputTrack(MixerThread* thread);
   1348                     void        removeOutputTrack(MixerThread* thread);
   1349                     uint32_t    waitTimeMs() const { return mWaitTimeMs; }
   1350     protected:
   1351         virtual     uint32_t    activeSleepTimeUs() const;
   1352 
   1353     private:
   1354                     bool        outputsReady(const SortedVector< sp<OutputTrack> > &outputTracks);
   1355     protected:
   1356         // threadLoop snippets
   1357         virtual     void        threadLoop_mix();
   1358         virtual     void        threadLoop_sleepTime();
   1359         virtual     void        threadLoop_write();
   1360         virtual     void        threadLoop_standby();
   1361         virtual     void        cacheParameters_l();
   1362 
   1363     private:
   1364         // called from threadLoop, addOutputTrack, removeOutputTrack
   1365         virtual     void        updateWaitTime_l();
   1366     protected:
   1367         virtual     void        saveOutputTracks();
   1368         virtual     void        clearOutputTracks();
   1369     private:
   1370 
   1371                     uint32_t    mWaitTimeMs;
   1372         SortedVector < sp<OutputTrack> >  outputTracks;
   1373         SortedVector < sp<OutputTrack> >  mOutputTracks;
   1374     public:
   1375         virtual     bool        hasFastMixer() const { return false; }
   1376     };
   1377 
   1378               PlaybackThread *checkPlaybackThread_l(audio_io_handle_t output) const;
   1379               MixerThread *checkMixerThread_l(audio_io_handle_t output) const;
   1380               RecordThread *checkRecordThread_l(audio_io_handle_t input) const;
   1381               // no range check, AudioFlinger::mLock held
   1382               bool streamMute_l(audio_stream_type_t stream) const
   1383                                 { return mStreamTypes[stream].mute; }
   1384               // no range check, doesn't check per-thread stream volume, AudioFlinger::mLock held
   1385               float streamVolume_l(audio_stream_type_t stream) const
   1386                                 { return mStreamTypes[stream].volume; }
   1387               void audioConfigChanged_l(int event, audio_io_handle_t ioHandle, const void *param2);
   1388 
   1389               // allocate an audio_io_handle_t, session ID, or effect ID
   1390               uint32_t nextUniqueId();
   1391 
   1392               status_t moveEffectChain_l(int sessionId,
   1393                                      PlaybackThread *srcThread,
   1394                                      PlaybackThread *dstThread,
   1395                                      bool reRegister);
   1396               // return thread associated with primary hardware device, or NULL
   1397               PlaybackThread *primaryPlaybackThread_l() const;
   1398               audio_devices_t primaryOutputDevice_l() const;
   1399 
   1400               sp<PlaybackThread> getEffectThread_l(int sessionId, int EffectId);
   1401 
   1402     // server side of the client's IAudioTrack
   1403     class TrackHandle : public android::BnAudioTrack {
   1404     public:
   1405                             TrackHandle(const sp<PlaybackThread::Track>& track);
   1406         virtual             ~TrackHandle();
   1407         virtual sp<IMemory> getCblk() const;
   1408         virtual status_t    start();
   1409         virtual void        stop();
   1410         virtual void        flush();
   1411         virtual void        mute(bool);
   1412         virtual void        pause();
   1413         virtual status_t    attachAuxEffect(int effectId);
   1414         virtual status_t    allocateTimedBuffer(size_t size,
   1415                                                 sp<IMemory>* buffer);
   1416         virtual status_t    queueTimedBuffer(const sp<IMemory>& buffer,
   1417                                              int64_t pts);
   1418         virtual status_t    setMediaTimeTransform(const LinearTransform& xform,
   1419                                                   int target);
   1420         virtual status_t onTransact(
   1421             uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
   1422     private:
   1423         const sp<PlaybackThread::Track> mTrack;
   1424     };
   1425 
   1426                 void        removeClient_l(pid_t pid);
   1427                 void        removeNotificationClient(pid_t pid);
   1428 
   1429 
   1430     // record thread
   1431     class RecordThread : public ThreadBase, public AudioBufferProvider
   1432                             // derives from AudioBufferProvider interface for use by resampler
   1433     {
   1434     public:
   1435 
   1436         // record track
   1437         class RecordTrack : public TrackBase {
   1438         public:
   1439                                 RecordTrack(RecordThread *thread,
   1440                                         const sp<Client>& client,
   1441                                         uint32_t sampleRate,
   1442                                         audio_format_t format,
   1443                                         audio_channel_mask_t channelMask,
   1444                                         int frameCount,
   1445                                         int sessionId);
   1446             virtual             ~RecordTrack();
   1447 
   1448             virtual status_t    start(AudioSystem::sync_event_t event, int triggerSession);
   1449             virtual void        stop();
   1450 
   1451                     void        destroy();
   1452 
   1453                     // clear the buffer overflow flag
   1454                     void        clearOverflow() { mOverflow = false; }
   1455                     // set the buffer overflow flag and return previous value
   1456                     bool        setOverflow() { bool tmp = mOverflow; mOverflow = true; return tmp; }
   1457 
   1458             static  void        appendDumpHeader(String8& result);
   1459                     void        dump(char* buffer, size_t size);
   1460 
   1461         private:
   1462             friend class AudioFlinger;  // for mState
   1463 
   1464                                 RecordTrack(const RecordTrack&);
   1465                                 RecordTrack& operator = (const RecordTrack&);
   1466 
   1467             // AudioBufferProvider interface
   1468             virtual status_t getNextBuffer(AudioBufferProvider::Buffer* buffer, int64_t pts = kInvalidPTS);
   1469             // releaseBuffer() not overridden
   1470 
   1471             bool                mOverflow;  // overflow on most recent attempt to fill client buffer
   1472         };
   1473 
   1474                 RecordThread(const sp<AudioFlinger>& audioFlinger,
   1475                         AudioStreamIn *input,
   1476                         uint32_t sampleRate,
   1477                         audio_channel_mask_t channelMask,
   1478                         audio_io_handle_t id,
   1479                         audio_devices_t device);
   1480                 virtual     ~RecordThread();
   1481 
   1482         // no addTrack_l ?
   1483         void        destroyTrack_l(const sp<RecordTrack>& track);
   1484         void        removeTrack_l(const sp<RecordTrack>& track);
   1485 
   1486         void        dumpInternals(int fd, const Vector<String16>& args);
   1487         void        dumpTracks(int fd, const Vector<String16>& args);
   1488 
   1489         // Thread virtuals
   1490         virtual bool        threadLoop();
   1491         virtual status_t    readyToRun();
   1492 
   1493         // RefBase
   1494         virtual void        onFirstRef();
   1495 
   1496         virtual status_t    initCheck() const { return (mInput == NULL) ? NO_INIT : NO_ERROR; }
   1497                 sp<AudioFlinger::RecordThread::RecordTrack>  createRecordTrack_l(
   1498                         const sp<AudioFlinger::Client>& client,
   1499                         uint32_t sampleRate,
   1500                         audio_format_t format,
   1501                         audio_channel_mask_t channelMask,
   1502                         int frameCount,
   1503                         int sessionId,
   1504                         IAudioFlinger::track_flags_t flags,
   1505                         pid_t tid,
   1506                         status_t *status);
   1507 
   1508                 status_t    start(RecordTrack* recordTrack,
   1509                                   AudioSystem::sync_event_t event,
   1510                                   int triggerSession);
   1511 
   1512                 // ask the thread to stop the specified track, and
   1513                 // return true if the caller should then do it's part of the stopping process
   1514                 bool        stop_l(RecordTrack* recordTrack);
   1515 
   1516                 void        dump(int fd, const Vector<String16>& args);
   1517                 AudioStreamIn* clearInput();
   1518                 virtual audio_stream_t* stream() const;
   1519 
   1520         // AudioBufferProvider interface
   1521         virtual status_t    getNextBuffer(AudioBufferProvider::Buffer* buffer, int64_t pts);
   1522         virtual void        releaseBuffer(AudioBufferProvider::Buffer* buffer);
   1523 
   1524         virtual bool        checkForNewParameters_l();
   1525         virtual String8     getParameters(const String8& keys);
   1526         virtual void        audioConfigChanged_l(int event, int param = 0);
   1527                 void        readInputParameters();
   1528         virtual unsigned int  getInputFramesLost();
   1529 
   1530         virtual status_t addEffectChain_l(const sp<EffectChain>& chain);
   1531         virtual size_t removeEffectChain_l(const sp<EffectChain>& chain);
   1532         virtual uint32_t hasAudioSession(int sessionId) const;
   1533 
   1534                 // Return the set of unique session IDs across all tracks.
   1535                 // The keys are the session IDs, and the associated values are meaningless.
   1536                 // FIXME replace by Set [and implement Bag/Multiset for other uses].
   1537                 KeyedVector<int, bool> sessionIds() const;
   1538 
   1539         virtual status_t setSyncEvent(const sp<SyncEvent>& event);
   1540         virtual bool     isValidSyncEvent(const sp<SyncEvent>& event) const;
   1541 
   1542         static void syncStartEventCallback(const wp<SyncEvent>& event);
   1543                void handleSyncStartEvent(const sp<SyncEvent>& event);
   1544 
   1545     private:
   1546                 void clearSyncStartEvent();
   1547 
   1548                 // Enter standby if not already in standby, and set mStandby flag
   1549                 void standby();
   1550 
   1551                 // Call the HAL standby method unconditionally, and don't change mStandby flag
   1552                 void inputStandBy();
   1553 
   1554                 AudioStreamIn                       *mInput;
   1555                 SortedVector < sp<RecordTrack> >    mTracks;
   1556                 // mActiveTrack has dual roles:  it indicates the current active track, and
   1557                 // is used together with mStartStopCond to indicate start()/stop() progress
   1558                 sp<RecordTrack>                     mActiveTrack;
   1559                 Condition                           mStartStopCond;
   1560                 AudioResampler                      *mResampler;
   1561                 int32_t                             *mRsmpOutBuffer;
   1562                 int16_t                             *mRsmpInBuffer;
   1563                 size_t                              mRsmpInIndex;
   1564                 size_t                              mInputBytes;
   1565                 const int                           mReqChannelCount;
   1566                 const uint32_t                      mReqSampleRate;
   1567                 ssize_t                             mBytesRead;
   1568                 // sync event triggering actual audio capture. Frames read before this event will
   1569                 // be dropped and therefore not read by the application.
   1570                 sp<SyncEvent>                       mSyncStartEvent;
   1571                 // number of captured frames to drop after the start sync event has been received.
   1572                 // when < 0, maximum frames to drop before starting capture even if sync event is
   1573                 // not received
   1574                 ssize_t                             mFramestoDrop;
   1575     };
   1576 
   1577     // server side of the client's IAudioRecord
   1578     class RecordHandle : public android::BnAudioRecord {
   1579     public:
   1580         RecordHandle(const sp<RecordThread::RecordTrack>& recordTrack);
   1581         virtual             ~RecordHandle();
   1582         virtual sp<IMemory> getCblk() const;
   1583         virtual status_t    start(int /*AudioSystem::sync_event_t*/ event, int triggerSession);
   1584         virtual void        stop();
   1585         virtual status_t onTransact(
   1586             uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
   1587     private:
   1588         const sp<RecordThread::RecordTrack> mRecordTrack;
   1589 
   1590         // for use from destructor
   1591         void                stop_nonvirtual();
   1592     };
   1593 
   1594     //--- Audio Effect Management
   1595 
   1596     // EffectModule and EffectChain classes both have their own mutex to protect
   1597     // state changes or resource modifications. Always respect the following order
   1598     // if multiple mutexes must be acquired to avoid cross deadlock:
   1599     // AudioFlinger -> ThreadBase -> EffectChain -> EffectModule
   1600 
   1601     // The EffectModule class is a wrapper object controlling the effect engine implementation
   1602     // in the effect library. It prevents concurrent calls to process() and command() functions
   1603     // from different client threads. It keeps a list of EffectHandle objects corresponding
   1604     // to all client applications using this effect and notifies applications of effect state,
   1605     // control or parameter changes. It manages the activation state machine to send appropriate
   1606     // reset, enable, disable commands to effect engine and provide volume
   1607     // ramping when effects are activated/deactivated.
   1608     // When controlling an auxiliary effect, the EffectModule also provides an input buffer used by
   1609     // the attached track(s) to accumulate their auxiliary channel.
   1610     class EffectModule: public RefBase {
   1611     public:
   1612         EffectModule(ThreadBase *thread,
   1613                         const wp<AudioFlinger::EffectChain>& chain,
   1614                         effect_descriptor_t *desc,
   1615                         int id,
   1616                         int sessionId);
   1617         virtual ~EffectModule();
   1618 
   1619         enum effect_state {
   1620             IDLE,
   1621             RESTART,
   1622             STARTING,
   1623             ACTIVE,
   1624             STOPPING,
   1625             STOPPED,
   1626             DESTROYED
   1627         };
   1628 
   1629         int         id() const { return mId; }
   1630         void process();
   1631         void updateState();
   1632         status_t command(uint32_t cmdCode,
   1633                          uint32_t cmdSize,
   1634                          void *pCmdData,
   1635                          uint32_t *replySize,
   1636                          void *pReplyData);
   1637 
   1638         void reset_l();
   1639         status_t configure();
   1640         status_t init();
   1641         effect_state state() const {
   1642             return mState;
   1643         }
   1644         uint32_t status() {
   1645             return mStatus;
   1646         }
   1647         int sessionId() const {
   1648             return mSessionId;
   1649         }
   1650         status_t    setEnabled(bool enabled);
   1651         status_t    setEnabled_l(bool enabled);
   1652         bool isEnabled() const;
   1653         bool isProcessEnabled() const;
   1654 
   1655         void        setInBuffer(int16_t *buffer) { mConfig.inputCfg.buffer.s16 = buffer; }
   1656         int16_t     *inBuffer() { return mConfig.inputCfg.buffer.s16; }
   1657         void        setOutBuffer(int16_t *buffer) { mConfig.outputCfg.buffer.s16 = buffer; }
   1658         int16_t     *outBuffer() { return mConfig.outputCfg.buffer.s16; }
   1659         void        setChain(const wp<EffectChain>& chain) { mChain = chain; }
   1660         void        setThread(const wp<ThreadBase>& thread) { mThread = thread; }
   1661         const wp<ThreadBase>& thread() { return mThread; }
   1662 
   1663         status_t addHandle(EffectHandle *handle);
   1664         size_t disconnect(EffectHandle *handle, bool unpinIfLast);
   1665         size_t removeHandle(EffectHandle *handle);
   1666 
   1667         const effect_descriptor_t& desc() const { return mDescriptor; }
   1668         wp<EffectChain>&     chain() { return mChain; }
   1669 
   1670         status_t         setDevice(audio_devices_t device);
   1671         status_t         setVolume(uint32_t *left, uint32_t *right, bool controller);
   1672         status_t         setMode(audio_mode_t mode);
   1673         status_t         setAudioSource(audio_source_t source);
   1674         status_t         start();
   1675         status_t         stop();
   1676         void             setSuspended(bool suspended);
   1677         bool             suspended() const;
   1678 
   1679         EffectHandle*    controlHandle_l();
   1680 
   1681         bool             isPinned() const { return mPinned; }
   1682         void             unPin() { mPinned = false; }
   1683         bool             purgeHandles();
   1684         void             lock() { mLock.lock(); }
   1685         void             unlock() { mLock.unlock(); }
   1686 
   1687         void             dump(int fd, const Vector<String16>& args);
   1688 
   1689     protected:
   1690         friend class AudioFlinger;      // for mHandles
   1691         bool                mPinned;
   1692 
   1693         // Maximum time allocated to effect engines to complete the turn off sequence
   1694         static const uint32_t MAX_DISABLE_TIME_MS = 10000;
   1695 
   1696         EffectModule(const EffectModule&);
   1697         EffectModule& operator = (const EffectModule&);
   1698 
   1699         status_t start_l();
   1700         status_t stop_l();
   1701 
   1702 mutable Mutex               mLock;      // mutex for process, commands and handles list protection
   1703         wp<ThreadBase>      mThread;    // parent thread
   1704         wp<EffectChain>     mChain;     // parent effect chain
   1705         const int           mId;        // this instance unique ID
   1706         const int           mSessionId; // audio session ID
   1707         const effect_descriptor_t mDescriptor;// effect descriptor received from effect engine
   1708         effect_config_t     mConfig;    // input and output audio configuration
   1709         effect_handle_t  mEffectInterface; // Effect module C API
   1710         status_t            mStatus;    // initialization status
   1711         effect_state        mState;     // current activation state
   1712         Vector<EffectHandle *> mHandles;    // list of client handles
   1713                     // First handle in mHandles has highest priority and controls the effect module
   1714         uint32_t mMaxDisableWaitCnt;    // maximum grace period before forcing an effect off after
   1715                                         // sending disable command.
   1716         uint32_t mDisableWaitCnt;       // current process() calls count during disable period.
   1717         bool     mSuspended;            // effect is suspended: temporarily disabled by framework
   1718     };
   1719 
   1720     // The EffectHandle class implements the IEffect interface. It provides resources
   1721     // to receive parameter updates, keeps track of effect control
   1722     // ownership and state and has a pointer to the EffectModule object it is controlling.
   1723     // There is one EffectHandle object for each application controlling (or using)
   1724     // an effect module.
   1725     // The EffectHandle is obtained by calling AudioFlinger::createEffect().
   1726     class EffectHandle: public android::BnEffect {
   1727     public:
   1728 
   1729         EffectHandle(const sp<EffectModule>& effect,
   1730                 const sp<AudioFlinger::Client>& client,
   1731                 const sp<IEffectClient>& effectClient,
   1732                 int32_t priority);
   1733         virtual ~EffectHandle();
   1734 
   1735         // IEffect
   1736         virtual status_t enable();
   1737         virtual status_t disable();
   1738         virtual status_t command(uint32_t cmdCode,
   1739                                  uint32_t cmdSize,
   1740                                  void *pCmdData,
   1741                                  uint32_t *replySize,
   1742                                  void *pReplyData);
   1743         virtual void disconnect();
   1744     private:
   1745                 void disconnect(bool unpinIfLast);
   1746     public:
   1747         virtual sp<IMemory> getCblk() const { return mCblkMemory; }
   1748         virtual status_t onTransact(uint32_t code, const Parcel& data,
   1749                 Parcel* reply, uint32_t flags);
   1750 
   1751 
   1752         // Give or take control of effect module
   1753         // - hasControl: true if control is given, false if removed
   1754         // - signal: true client app should be signaled of change, false otherwise
   1755         // - enabled: state of the effect when control is passed
   1756         void setControl(bool hasControl, bool signal, bool enabled);
   1757         void commandExecuted(uint32_t cmdCode,
   1758                              uint32_t cmdSize,
   1759                              void *pCmdData,
   1760                              uint32_t replySize,
   1761                              void *pReplyData);
   1762         void setEnabled(bool enabled);
   1763         bool enabled() const { return mEnabled; }
   1764 
   1765         // Getters
   1766         int id() const { return mEffect->id(); }
   1767         int priority() const { return mPriority; }
   1768         bool hasControl() const { return mHasControl; }
   1769         sp<EffectModule> effect() const { return mEffect; }
   1770         // destroyed_l() must be called with the associated EffectModule mLock held
   1771         bool destroyed_l() const { return mDestroyed; }
   1772 
   1773         void dump(char* buffer, size_t size);
   1774 
   1775     protected:
   1776         friend class AudioFlinger;          // for mEffect, mHasControl, mEnabled
   1777         EffectHandle(const EffectHandle&);
   1778         EffectHandle& operator =(const EffectHandle&);
   1779 
   1780         sp<EffectModule> mEffect;           // pointer to controlled EffectModule
   1781         sp<IEffectClient> mEffectClient;    // callback interface for client notifications
   1782         /*const*/ sp<Client> mClient;       // client for shared memory allocation, see disconnect()
   1783         sp<IMemory>         mCblkMemory;    // shared memory for control block
   1784         effect_param_cblk_t* mCblk;         // control block for deferred parameter setting via shared memory
   1785         uint8_t*            mBuffer;        // pointer to parameter area in shared memory
   1786         int mPriority;                      // client application priority to control the effect
   1787         bool mHasControl;                   // true if this handle is controlling the effect
   1788         bool mEnabled;                      // cached enable state: needed when the effect is
   1789                                             // restored after being suspended
   1790         bool mDestroyed;                    // Set to true by destructor. Access with EffectModule
   1791                                             // mLock held
   1792     };
   1793 
   1794     // the EffectChain class represents a group of effects associated to one audio session.
   1795     // There can be any number of EffectChain objects per output mixer thread (PlaybackThread).
   1796     // The EffecChain with session ID 0 contains global effects applied to the output mix.
   1797     // Effects in this chain can be insert or auxiliary. Effects in other chains (attached to tracks)
   1798     // are insert only. The EffectChain maintains an ordered list of effect module, the order corresponding
   1799     // in the effect process order. When attached to a track (session ID != 0), it also provide it's own
   1800     // input buffer used by the track as accumulation buffer.
   1801     class EffectChain: public RefBase {
   1802     public:
   1803         EffectChain(const wp<ThreadBase>& wThread, int sessionId);
   1804         EffectChain(ThreadBase *thread, int sessionId);
   1805         virtual ~EffectChain();
   1806 
   1807         // special key used for an entry in mSuspendedEffects keyed vector
   1808         // corresponding to a suspend all request.
   1809         static const int        kKeyForSuspendAll = 0;
   1810 
   1811         // minimum duration during which we force calling effect process when last track on
   1812         // a session is stopped or removed to allow effect tail to be rendered
   1813         static const int        kProcessTailDurationMs = 1000;
   1814 
   1815         void process_l();
   1816 
   1817         void lock() {
   1818             mLock.lock();
   1819         }
   1820         void unlock() {
   1821             mLock.unlock();
   1822         }
   1823 
   1824         status_t addEffect_l(const sp<EffectModule>& handle);
   1825         size_t removeEffect_l(const sp<EffectModule>& handle);
   1826 
   1827         int sessionId() const { return mSessionId; }
   1828         void setSessionId(int sessionId) { mSessionId = sessionId; }
   1829 
   1830         sp<EffectModule> getEffectFromDesc_l(effect_descriptor_t *descriptor);
   1831         sp<EffectModule> getEffectFromId_l(int id);
   1832         sp<EffectModule> getEffectFromType_l(const effect_uuid_t *type);
   1833         bool setVolume_l(uint32_t *left, uint32_t *right);
   1834         void setDevice_l(audio_devices_t device);
   1835         void setMode_l(audio_mode_t mode);
   1836         void setAudioSource_l(audio_source_t source);
   1837 
   1838         void setInBuffer(int16_t *buffer, bool ownsBuffer = false) {
   1839             mInBuffer = buffer;
   1840             mOwnInBuffer = ownsBuffer;
   1841         }
   1842         int16_t *inBuffer() const {
   1843             return mInBuffer;
   1844         }
   1845         void setOutBuffer(int16_t *buffer) {
   1846             mOutBuffer = buffer;
   1847         }
   1848         int16_t *outBuffer() const {
   1849             return mOutBuffer;
   1850         }
   1851 
   1852         void incTrackCnt() { android_atomic_inc(&mTrackCnt); }
   1853         void decTrackCnt() { android_atomic_dec(&mTrackCnt); }
   1854         int32_t trackCnt() const { return android_atomic_acquire_load(&mTrackCnt); }
   1855 
   1856         void incActiveTrackCnt() { android_atomic_inc(&mActiveTrackCnt);
   1857                                    mTailBufferCount = mMaxTailBuffers; }
   1858         void decActiveTrackCnt() { android_atomic_dec(&mActiveTrackCnt); }
   1859         int32_t activeTrackCnt() const { return android_atomic_acquire_load(&mActiveTrackCnt); }
   1860 
   1861         uint32_t strategy() const { return mStrategy; }
   1862         void setStrategy(uint32_t strategy)
   1863                 { mStrategy = strategy; }
   1864 
   1865         // suspend effect of the given type
   1866         void setEffectSuspended_l(const effect_uuid_t *type,
   1867                                   bool suspend);
   1868         // suspend all eligible effects
   1869         void setEffectSuspendedAll_l(bool suspend);
   1870         // check if effects should be suspend or restored when a given effect is enable or disabled
   1871         void checkSuspendOnEffectEnabled(const sp<EffectModule>& effect,
   1872                                               bool enabled);
   1873 
   1874         void clearInputBuffer();
   1875 
   1876         void dump(int fd, const Vector<String16>& args);
   1877 
   1878     protected:
   1879         friend class AudioFlinger;  // for mThread, mEffects
   1880         EffectChain(const EffectChain&);
   1881         EffectChain& operator =(const EffectChain&);
   1882 
   1883         class SuspendedEffectDesc : public RefBase {
   1884         public:
   1885             SuspendedEffectDesc() : mRefCount(0) {}
   1886 
   1887             int mRefCount;
   1888             effect_uuid_t mType;
   1889             wp<EffectModule> mEffect;
   1890         };
   1891 
   1892         // get a list of effect modules to suspend when an effect of the type
   1893         // passed is enabled.
   1894         void                       getSuspendEligibleEffects(Vector< sp<EffectModule> > &effects);
   1895 
   1896         // get an effect module if it is currently enable
   1897         sp<EffectModule> getEffectIfEnabled(const effect_uuid_t *type);
   1898         // true if the effect whose descriptor is passed can be suspended
   1899         // OEMs can modify the rules implemented in this method to exclude specific effect
   1900         // types or implementations from the suspend/restore mechanism.
   1901         bool isEffectEligibleForSuspend(const effect_descriptor_t& desc);
   1902 
   1903         void clearInputBuffer_l(sp<ThreadBase> thread);
   1904 
   1905         wp<ThreadBase> mThread;     // parent mixer thread
   1906         Mutex mLock;                // mutex protecting effect list
   1907         Vector< sp<EffectModule> > mEffects; // list of effect modules
   1908         int mSessionId;             // audio session ID
   1909         int16_t *mInBuffer;         // chain input buffer
   1910         int16_t *mOutBuffer;        // chain output buffer
   1911 
   1912         // 'volatile' here means these are accessed with atomic operations instead of mutex
   1913         volatile int32_t mActiveTrackCnt;    // number of active tracks connected
   1914         volatile int32_t mTrackCnt;          // number of tracks connected
   1915 
   1916         int32_t mTailBufferCount;   // current effect tail buffer count
   1917         int32_t mMaxTailBuffers;    // maximum effect tail buffers
   1918         bool mOwnInBuffer;          // true if the chain owns its input buffer
   1919         int mVolumeCtrlIdx;         // index of insert effect having control over volume
   1920         uint32_t mLeftVolume;       // previous volume on left channel
   1921         uint32_t mRightVolume;      // previous volume on right channel
   1922         uint32_t mNewLeftVolume;       // new volume on left channel
   1923         uint32_t mNewRightVolume;      // new volume on right channel
   1924         uint32_t mStrategy; // strategy for this effect chain
   1925         // mSuspendedEffects lists all effects currently suspended in the chain.
   1926         // Use effect type UUID timelow field as key. There is no real risk of identical
   1927         // timeLow fields among effect type UUIDs.
   1928         // Updated by updateSuspendedSessions_l() only.
   1929         KeyedVector< int, sp<SuspendedEffectDesc> > mSuspendedEffects;
   1930     };
   1931 
   1932     class AudioHwDevice {
   1933     public:
   1934         enum Flags {
   1935             AHWD_CAN_SET_MASTER_VOLUME  = 0x1,
   1936             AHWD_CAN_SET_MASTER_MUTE    = 0x2,
   1937         };
   1938 
   1939         AudioHwDevice(const char *moduleName,
   1940                       audio_hw_device_t *hwDevice,
   1941                       Flags flags)
   1942             : mModuleName(strdup(moduleName))
   1943             , mHwDevice(hwDevice)
   1944             , mFlags(flags) { }
   1945         /*virtual*/ ~AudioHwDevice() { free((void *)mModuleName); }
   1946 
   1947         bool canSetMasterVolume() const {
   1948             return (0 != (mFlags & AHWD_CAN_SET_MASTER_VOLUME));
   1949         }
   1950 
   1951         bool canSetMasterMute() const {
   1952             return (0 != (mFlags & AHWD_CAN_SET_MASTER_MUTE));
   1953         }
   1954 
   1955         const char *moduleName() const { return mModuleName; }
   1956         audio_hw_device_t *hwDevice() const { return mHwDevice; }
   1957     private:
   1958         const char * const mModuleName;
   1959         audio_hw_device_t * const mHwDevice;
   1960         Flags mFlags;
   1961     };
   1962 
   1963     // AudioStreamOut and AudioStreamIn are immutable, so their fields are const.
   1964     // For emphasis, we could also make all pointers to them be "const *",
   1965     // but that would clutter the code unnecessarily.
   1966 
   1967     struct AudioStreamOut {
   1968         AudioHwDevice* const audioHwDev;
   1969         audio_stream_out_t* const stream;
   1970 
   1971         audio_hw_device_t* hwDev() const { return audioHwDev->hwDevice(); }
   1972 
   1973         AudioStreamOut(AudioHwDevice *dev, audio_stream_out_t *out) :
   1974             audioHwDev(dev), stream(out) {}
   1975     };
   1976 
   1977     struct AudioStreamIn {
   1978         AudioHwDevice* const audioHwDev;
   1979         audio_stream_in_t* const stream;
   1980 
   1981         audio_hw_device_t* hwDev() const { return audioHwDev->hwDevice(); }
   1982 
   1983         AudioStreamIn(AudioHwDevice *dev, audio_stream_in_t *in) :
   1984             audioHwDev(dev), stream(in) {}
   1985     };
   1986 
   1987     // for mAudioSessionRefs only
   1988     struct AudioSessionRef {
   1989         AudioSessionRef(int sessionid, pid_t pid) :
   1990             mSessionid(sessionid), mPid(pid), mCnt(1) {}
   1991         const int   mSessionid;
   1992         const pid_t mPid;
   1993         int         mCnt;
   1994     };
   1995 
   1996     mutable     Mutex                               mLock;
   1997 
   1998                 DefaultKeyedVector< pid_t, wp<Client> >     mClients;   // see ~Client()
   1999 
   2000                 mutable     Mutex                   mHardwareLock;
   2001                 // NOTE: If both mLock and mHardwareLock mutexes must be held,
   2002                 // always take mLock before mHardwareLock
   2003 
   2004                 // These two fields are immutable after onFirstRef(), so no lock needed to access
   2005                 AudioHwDevice*                      mPrimaryHardwareDev; // mAudioHwDevs[0] or NULL
   2006                 DefaultKeyedVector<audio_module_handle_t, AudioHwDevice*>  mAudioHwDevs;
   2007 
   2008     // for dump, indicates which hardware operation is currently in progress (but not stream ops)
   2009     enum hardware_call_state {
   2010         AUDIO_HW_IDLE = 0,              // no operation in progress
   2011         AUDIO_HW_INIT,                  // init_check
   2012         AUDIO_HW_OUTPUT_OPEN,           // open_output_stream
   2013         AUDIO_HW_OUTPUT_CLOSE,          // unused
   2014         AUDIO_HW_INPUT_OPEN,            // unused
   2015         AUDIO_HW_INPUT_CLOSE,           // unused
   2016         AUDIO_HW_STANDBY,               // unused
   2017         AUDIO_HW_SET_MASTER_VOLUME,     // set_master_volume
   2018         AUDIO_HW_GET_ROUTING,           // unused
   2019         AUDIO_HW_SET_ROUTING,           // unused
   2020         AUDIO_HW_GET_MODE,              // unused
   2021         AUDIO_HW_SET_MODE,              // set_mode
   2022         AUDIO_HW_GET_MIC_MUTE,          // get_mic_mute
   2023         AUDIO_HW_SET_MIC_MUTE,          // set_mic_mute
   2024         AUDIO_HW_SET_VOICE_VOLUME,      // set_voice_volume
   2025         AUDIO_HW_SET_PARAMETER,         // set_parameters
   2026         AUDIO_HW_GET_INPUT_BUFFER_SIZE, // get_input_buffer_size
   2027         AUDIO_HW_GET_MASTER_VOLUME,     // get_master_volume
   2028         AUDIO_HW_GET_PARAMETER,         // get_parameters
   2029         AUDIO_HW_SET_MASTER_MUTE,       // set_master_mute
   2030         AUDIO_HW_GET_MASTER_MUTE,       // get_master_mute
   2031     };
   2032 
   2033     mutable     hardware_call_state                 mHardwareStatus;    // for dump only
   2034 
   2035 
   2036                 DefaultKeyedVector< audio_io_handle_t, sp<PlaybackThread> >  mPlaybackThreads;
   2037                 stream_type_t                       mStreamTypes[AUDIO_STREAM_CNT];
   2038 
   2039                 // member variables below are protected by mLock
   2040                 float                               mMasterVolume;
   2041                 bool                                mMasterMute;
   2042                 // end of variables protected by mLock
   2043 
   2044                 DefaultKeyedVector< audio_io_handle_t, sp<RecordThread> >    mRecordThreads;
   2045 
   2046                 DefaultKeyedVector< pid_t, sp<NotificationClient> >    mNotificationClients;
   2047                 volatile int32_t                    mNextUniqueId;  // updated by android_atomic_inc
   2048                 audio_mode_t                        mMode;
   2049                 bool                                mBtNrecIsOff;
   2050 
   2051                 // protected by mLock
   2052                 Vector<AudioSessionRef*> mAudioSessionRefs;
   2053 
   2054                 float       masterVolume_l() const;
   2055                 bool        masterMute_l() const;
   2056                 audio_module_handle_t loadHwModule_l(const char *name);
   2057 
   2058                 Vector < sp<SyncEvent> > mPendingSyncEvents; // sync events awaiting for a session
   2059                                                              // to be created
   2060 
   2061 private:
   2062     sp<Client>  registerPid_l(pid_t pid);    // always returns non-0
   2063 
   2064     // for use from destructor
   2065     status_t    closeOutput_nonvirtual(audio_io_handle_t output);
   2066     status_t    closeInput_nonvirtual(audio_io_handle_t input);
   2067 };
   2068 
   2069 
   2070 // ----------------------------------------------------------------------------
   2071 
   2072 }; // namespace android
   2073 
   2074 #endif // ANDROID_AUDIO_FLINGER_H
   2075