/**********************************************************************

  Audacity: A Digital Audio Editor

  TwoPassSimpleMono.h

  Dominic Mazzoni

  This bit by Martyn Shaw.

**********************************************************************/
#ifndef __AUDACITY_EFFECT_TWOPASSSIMPLEMONO__
#define __AUDACITY_EFFECT_TWOPASSSIMPLEMONO__

#include "SimpleMono.h"

class WaveTrack;

class EffectTwoPassSimpleMono:public Effect {

 public:
   virtual bool Process();

 private:
   bool ProcessOne(WaveTrack * t,
                   sampleCount start, sampleCount end);
   bool ProcessPass();

 protected:  

   // Override these methods if you need to initialize something
   // before each pass. Return None if processing should stop.
   // These should not depend on mOutputTracks having been set up via CopyInputTracks().
   virtual bool InitPass1();
   virtual bool InitPass2();
   
   // Override these methods if you need to do things
   // before every track (including the first one)
   virtual bool NewTrackPass1();
   virtual bool NewTrackPass2();

   // Override this method to actually process audio
   virtual bool ProcessPass1(float *buffer, sampleCount len) { return false; }
   virtual bool ProcessPass2(float *buffer, sampleCount len) { return false; }
   
   // Override this method to actually process audio with access to 2 sequential buffers at a time
   // Either buffer1 or buffer2 may be modified as needed
   // This allows implementation of processing with delays
   // The default just calls the one-buffer-at-a-time method
   virtual bool TwoBufferProcessPass1(float *buffer1, sampleCount len1, float *buffer2, sampleCount len2)
   { if(buffer1 != NULL) return ProcessPass1(buffer1, len1); else return true; }
   virtual bool TwoBufferProcessPass2(float *buffer1, sampleCount len1, float *buffer2, sampleCount len2)
   { if(buffer1 != NULL) return ProcessPass2(buffer1, len1); else return true; }

   // Call this if you know in advance that no second pass will be needed.
   // This is used as a hint for the progress bar
   void DisableSecondPass() { mSecondPassDisabled = true; }

   // Other useful information
   int    mCurTrackNum;
   double mCurRate;
   double mCurT0;
   double mCurT1;
   int    mCurChannel;
   int    mPass;
   bool   mSecondPassDisabled;

};

#endif
