audacia/src/effects/Compressor.h

152 lines
3.5 KiB
C++

/**********************************************************************
Audacity: A Digital Audio Editor
Compressor.h
Dominic Mazzoni
**********************************************************************/
#ifndef __AUDACITY_EFFECT_COMPRESSOR__
#define __AUDACITY_EFFECT_COMPRESSOR__
#include "TwoPassSimpleMono.h"
class wxCheckBox;
class wxSlider;
class wxStaticText;
class EffectCompressorPanel;
class ShuttleGui;
class EffectCompressor final : public EffectTwoPassSimpleMono
{
public:
static const ComponentInterfaceSymbol Symbol;
EffectCompressor();
virtual ~EffectCompressor();
// 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
bool Startup() override;
void PopulateOrExchange(ShuttleGui & S) override;
bool TransferDataToWindow() override;
bool TransferDataFromWindow() override;
protected:
// EffectTwoPassSimpleMono implementation
bool InitPass1() override;
bool InitPass2() override;
bool NewTrackPass1() override;
bool ProcessPass2(float *buffer, size_t len) override;
bool TwoBufferProcessPass1
(float *buffer1, size_t len1, float *buffer2, size_t len2) override;
private:
// EffectCompressor implementation
void FreshenCircle();
float AvgCircle(float x);
void Follow(float *buffer, float *env, size_t len, float *previous, size_t previous_len);
float DoCompression(float x, double env);
void OnSlider(wxCommandEvent & evt);
void UpdateUI();
private:
double mRMSSum;
size_t mCircleSize;
size_t mCirclePos;
Doubles mCircle;
double mAttackTime;
double mThresholdDB;
double mNoiseFloorDB;
double mRatio;
bool mNormalize; //MJS
bool mUsePeak;
double mDecayTime; // The "Release" time.
double mAttackFactor;
double mAttackInverseFactor;
double mDecayFactor;
double mThreshold;
double mCompression;
double mNoiseFloor;
int mNoiseCounter;
double mGain;
double mLastLevel;
Floats mFollow1, mFollow2;
size_t mFollowLen;
double mMax; //MJS
EffectCompressorPanel *mPanel;
wxStaticText *mThresholdLabel;
wxSlider *mThresholdSlider;
wxStaticText *mThresholdText;
wxStaticText *mNoiseFloorLabel;
wxSlider *mNoiseFloorSlider;
wxStaticText *mNoiseFloorText;
wxStaticText *mRatioLabel;
wxSlider *mRatioSlider;
wxStaticText *mRatioText;
wxStaticText *mAttackLabel;
wxSlider *mAttackSlider;
wxStaticText *mAttackText;
wxStaticText *mDecayLabel;
wxSlider *mDecaySlider;
wxStaticText *mDecayText;
wxCheckBox *mGainCheckBox;
wxCheckBox *mPeakCheckBox;
DECLARE_EVENT_TABLE()
};
class EffectCompressorPanel final : public wxPanelWrapper
{
public:
EffectCompressorPanel(wxWindow *parent, wxWindowID winid,
double & threshold,
double & noiseFloor,
double & ratio);
private:
void OnPaint(wxPaintEvent & evt);
void OnSize(wxSizeEvent & evt);
private:
double & threshold;
double & noiseFloor;
double & ratio;
DECLARE_EVENT_TABLE()
};
#endif