text: /**********************************************************************
  
    Audacity: A Digital Audio Editor
  
    TruncSilence.h
  
    Lynn Allan (from DM's Normalize)
    //ToDo ... put BlendFrames in Effects, Project, or other class
    //ToDo ... Use ZeroCrossing logic to improve blend
    //ToDo ... BlendFrames on "fade-out"
    //ToDo ... BlendFrameCount is a user-selectable parameter
    //ToDo ... Detect transient signals that are too short to interrupt the TruncatableSilence
    Philip Van Baren (more options and boundary fixes)
  
  **********************************************************************/
  
  #ifndef __AUDACITY_EFFECT_TRUNC_SILENCE__
  #define __AUDACITY_EFFECT_TRUNC_SILENCE__
  
  #include <wx/arrstr.h>
  #include <wx/event.h>
  #include <wx/list.h>
  #include <wx/string.h>
  
  #include "Effect.h"
  
  class ShuttleGui;
  class wxChoice;
  class wxTextCtrl;
  class wxCheckBox;
  
  #define TRUNCATESILENCE_PLUGIN_SYMBOL IdentInterfaceSymbol{ XO("Truncate Silence") }
  
  class RegionList;
  
  class EffectTruncSilence final : public Effect
  {
  public:
     EffectTruncSilence();
     virtual ~EffectTruncSilence();
  
     // IdentInterface implementation
  
     IdentInterfaceSymbol GetSymbol() override;
     wxString GetDescription() override;
     wxString ManualPage() override;
  
     // EffectDefinitionInterface implementation
  
     EffectType GetType() override;
  
     // EffectClientInterface implementation
  
     bool DefineParams( ShuttleParams & S ) override;
     bool GetAutomationParameters(CommandParameters & parms) override;
     bool SetAutomationParameters(CommandParameters & parms) override;
  
     // Effect implementation
  
     double CalcPreviewInputLength(double previewLength) override;
     bool Startup() override;
  
     // Analyze a single track to find silences
     // If inputLength is not NULL we are calculating the minimum
     // amount of input for previewing.
     bool Analyze(RegionList &silenceList,
                          RegionList &trackSilences,
                          const WaveTrack *wt,
                          sampleCount* silentFrame,
                          sampleCount* index,
                          int whichTrack,
                          double* inputLength = NULL,
                          double* minInputLength = NULL);
  
     bool Process() override;
     void PopulateOrExchange(ShuttleGui & S) override;
     bool TransferDataToWindow() override;
     bool TransferDataFromWindow() override;
  
  private:
     // EffectTruncSilence implementation
  
     //ToDo ... put BlendFrames in Effects, Project, or other class
     // void BlendFrames(float* buffer, int leftIndex, int rightIndex, int blendFrameCount);
     void Intersect(RegionList &dest, const RegionList & src);
  
     void OnControlChange(wxCommandEvent & evt);
     void UpdateUI();
  
     bool ProcessIndependently();
     bool ProcessAll();
     bool FindSilences
        (RegionList &silences, const TrackList *list,
         const Track *firstTrack, const Track *lastTrack);
     bool DoRemoval
        (const RegionList &silences, unsigned iGroup, unsigned nGroups, Track *firstTrack, Track *lastTrack,
         double &totalCutLen);
  
  private:
  
     double mThresholdDB {} ;
     int mActionIndex;
     double mInitialAllowedSilence;
     double mTruncLongestAllowedSilence;
     double mSilenceCompressPercent;
     bool mbIndependent;
  
     size_t mBlendFrameCount;
  
     wxTextCtrl *mThresholdText;
     wxChoice *mActionChoice;
     wxTextCtrl *mInitialAllowedSilenceT;
     wxTextCtrl *mTruncLongestAllowedSilenceT;
     wxTextCtrl *mSilenceCompressPercentT;
     wxCheckBox *mIndependent;
  
     DECLARE_EVENT_TABLE()
  };
  
  #endif
  