/********************************************************************** 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 "Effect.h" class ShuttleGui; class wxChoice; class wxTextCtrl; class wxCheckBox; class RegionList; class EffectTruncSilence final : public Effect { public: static const ComponentInterfaceSymbol Symbol; EffectTruncSilence(); virtual ~EffectTruncSilence(); // ComponentInterface implementation ComponentInterfaceSymbol GetSymbol() override; TranslatableString GetDescription() override; ManualPageID 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