Split Equalization into GraphicEq and FilterCurve effects.

First step in https://wiki.audacityteam.org/wiki/Proposal_Equalization
We still have Equalization as an effect, but if the split works well, will remove it for 2.3.2
This commit is contained in:
James Crook 2019-03-22 11:10:41 +00:00
parent bedd4f1f3f
commit de427da4c8
3 changed files with 96 additions and 51 deletions

View File

@ -213,11 +213,14 @@ BEGIN_EVENT_TABLE(EffectEqualization, wxEvtHandler)
#endif
END_EVENT_TABLE()
EffectEqualization::EffectEqualization()
EffectEqualization::EffectEqualization(int Options)
: mFFTBuffer{ windowSize }
, mFilterFuncR{ windowSize }
, mFilterFuncI{ windowSize }
{
mOptions = Options;
mGraphic = NULL;
mDraw = NULL;
mCurve = NULL;
mPanel = NULL;
@ -288,6 +291,10 @@ EffectEqualization::~EffectEqualization()
ComponentInterfaceSymbol EffectEqualization::GetSymbol()
{
if( mOptions == kEqOptionGraphic )
return GRAPHICEQ_PLUGIN_SYMBOL;
if( mOptions == kEqOptionCurve )
return FILTERCURVE_PLUGIN_SYMBOL;
return EQUALIZATION_PLUGIN_SYMBOL;
}
@ -360,6 +367,11 @@ bool EffectEqualization::LoadFactoryDefaults()
mDrawMode = DEF_DrawMode;
mDrawGrid = DEF_DrawGrid;
if( mOptions == kEqOptionCurve)
mDrawMode = true;
if( mOptions == kEqOptionGraphic)
mDrawMode = false;
return Effect::LoadFactoryDefaults();
}
@ -412,9 +424,20 @@ bool EffectEqualization::ValidateUI()
// Effect implementation
bool EffectEqualization::Startup()
wxString EffectEqualization::GetPrefsPrefix()
{
wxString base = wxT("/Effects/Equalization/");
if( mOptions == kEqOptionGraphic )
base = wxT("/Effects/GraphicEq/");
else if( mOptions == kEqOptionCurve )
base = wxT("/Effects/FilterCurve/");
return base;
}
bool EffectEqualization::Startup()
{
wxString base = GetPrefsPrefix();
// Migrate settings from 2.1.0 or before
@ -741,19 +764,21 @@ void EffectEqualization::PopulateOrExchange(ShuttleGui & S)
}
S.EndHorizontalLay();
S.StartHorizontalLay(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 1);
{
if( mOptions == kEqLegacy ){
S.StartHorizontalLay(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 1);
{
mDraw = S.Id(ID_Draw).AddRadioButton(_("&Draw"));
mDraw->SetName(_("Draw Curves"));
S.StartHorizontalLay(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 1);
{
mDraw = S.Id(ID_Draw).AddRadioButton(_("&Draw"));
mDraw->SetName(_("Draw Curves"));
mGraphic = S.Id(ID_Graphic).AddRadioButtonToGroup(_("&Graphic"));
mGraphic->SetName(_("Graphic EQ"));
mGraphic = S.Id(ID_Graphic).AddRadioButtonToGroup(_("&Graphic"));
mGraphic->SetName(_("Graphic EQ"));
}
S.EndHorizontalLay();
}
S.EndHorizontalLay();
}
S.EndHorizontalLay();
S.StartHorizontalLay(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 1);
{
@ -844,7 +869,9 @@ void EffectEqualization::PopulateOrExchange(ShuttleGui & S)
S.EndHorizontalLay();
}
S.EndHorizontalLay();
S.Id(ID_Manage).AddButton(_("S&ave/Manage Curves..."));
if( mOptions == kEqLegacy )
S.Id(ID_Manage).AddButton(_("S&ave/Manage Curves..."));
S.StartHorizontalLay(wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, 1);
{
@ -964,17 +991,25 @@ bool EffectEqualization::TransferDataToWindow()
// Set graphic interpolation mode
mInterpChoice->SetSelection(mInterp);
// Override draw mode, if we're not displaying the radio buttons.
if( mOptions == kEqOptionCurve)
mDrawMode = true;
if( mOptions == kEqOptionGraphic)
mDrawMode = false;
// Set Graphic (Fader) or Draw mode
if (mDrawMode)
{
mDraw->SetValue(true);
if( mDraw )
mDraw->SetValue(true);
szrV->Show(szrG,false); // eq sliders
szrH->Show(szrI,false); // interpolation choice
szrH->Show(szrL,true); // linear freq checkbox
}
else
{
mGraphic->SetValue(true);
if( mGraphic)
mGraphic->SetValue(true);
UpdateGraphic();
}
@ -1348,7 +1383,7 @@ void EffectEqualization::LoadCurves(const wxString &fileName, bool append)
// Check if presets are up to date.
wxString eqCurvesCurrentVersion = wxString::Format(wxT("%d.%d"), EQCURVES_VERSION, EQCURVES_REVISION);
wxString eqCurvesInstalledVersion;
gPrefs->Read(wxT("/Effects/Equalization/PresetVersion"), &eqCurvesInstalledVersion, wxT(""));
gPrefs->Read(GetPrefsPrefix() + "PresetVersion", &eqCurvesInstalledVersion, wxT(""));
bool needUpdate = (eqCurvesCurrentVersion != eqCurvesInstalledVersion);
@ -1531,7 +1566,7 @@ void EffectEqualization::UpdateDefaultCurves(bool updateAll /* false */)
// Write current EqCurve version number
// TODO: Probably better if we used pluginregistry.cfg
wxString eqCurvesCurrentVersion = wxString::Format(wxT("%d.%d"), EQCURVES_VERSION, EQCURVES_REVISION);
gPrefs->Write(wxT("/Effects/Equalization/PresetVersion"), eqCurvesCurrentVersion);
gPrefs->Write(GetPrefsPrefix()+"PresetVersion", eqCurvesCurrentVersion);
gPrefs->Flush();
return;
@ -2632,7 +2667,8 @@ void EffectEqualization::OnSlider(wxCommandEvent & event)
void EffectEqualization::OnInterp(wxCommandEvent & WXUNUSED(event))
{
if (mGraphic->GetValue())
bool bIsGraphic = !mDrawMode;
if (bIsGraphic)
{
GraphicEQ(mLogEnvelope.get());
EnvelopeUpdated();
@ -2642,16 +2678,14 @@ void EffectEqualization::OnInterp(wxCommandEvent & WXUNUSED(event))
void EffectEqualization::OnDrawMode(wxCommandEvent & WXUNUSED(event))
{
UpdateDraw();
mDrawMode = true;
UpdateDraw();
}
void EffectEqualization::OnGraphicMode(wxCommandEvent & WXUNUSED(event))
{
UpdateGraphic();
mDrawMode = false;
UpdateGraphic();
}
void EffectEqualization::OnSliderM(wxCommandEvent & WXUNUSED(event))
@ -3050,7 +3084,7 @@ void EqualizationPanel::OnPaint(wxPaintEvent & WXUNUSED(event))
}
memDC.SetPen(*wxBLACK_PEN);
if( mEffect->mDraw->GetValue() )
if( mEffect->mDrawMode )
{
ZoomInfo zoomInfo( 0.0, mEnvRect.width-1 );

View File

@ -45,7 +45,14 @@
#include "../SampleFormat.h"
#define EQUALIZATION_PLUGIN_SYMBOL ComponentInterfaceSymbol{ XO("Equalization") }
#define GRAPHICEQ_PLUGIN_SYMBOL ComponentInterfaceSymbol{ XO("Graphic EQ") }
#define FILTERCURVE_PLUGIN_SYMBOL ComponentInterfaceSymbol{ XO("Filter Curve") }
// Flags to specialise the UI
const int kEqOptionGraphic =1;
const int kEqOptionCurve =1<<1;
// The legacy version offers both Graphic and curve on the same UI.
const int kEqLegacy = kEqOptionGraphic + kEqOptionCurve;
class Envelope;
class EnvelopeEditor;
@ -101,7 +108,7 @@ class EffectEqualization final : public Effect,
public XMLTagHandler
{
public:
EffectEqualization();
EffectEqualization(int Options);
virtual ~EffectEqualization();
// ComponentInterface implementation
@ -139,6 +146,7 @@ public:
private:
// EffectEqualization implementation
wxString GetPrefsPrefix();
// Number of samples in an FFT window
static const size_t windowSize = 16384u; //MJS - work out the optimum for this at run time? Have a dialog box for it?
@ -205,6 +213,7 @@ private:
#endif
private:
int mOptions;
HFFT hFFT;
Floats mFFTBuffer, mFilterFuncR, mFilterFuncI;
size_t mM;

View File

@ -109,36 +109,38 @@
// Define the list of effects that will be autoregistered and how to instantiate each
//
#define EFFECT_LIST \
EFFECT( CHIRP, EffectToneGen, (true) ) \
EFFECT( DTMFTONES, EffectDtmf, () ) \
EFFECT( NOISE, EffectNoise, () ) \
EFFECT( SILENCE, EffectSilence, () ) \
EFFECT( TONE, EffectToneGen, (false) ) \
EFFECT( AMPLIFY, EffectAmplify, () ) \
EFFECT( BASSTREBLE, EffectBassTreble, () ) \
EFFECT( CHANGESPEED, EffectChangeSpeed, () ) \
EFFECT( CLICKREMOVAL, EffectClickRemoval, () ) \
EFFECT( COMPRESSOR, EffectCompressor, () ) \
EFFECT( DISTORTION, EffectDistortion, () ) \
EFFECT( ECHO, EffectEcho, () ) \
EFFECT( EQUALIZATION, EffectEqualization, () ) \
EFFECT( FADEIN, EffectFade, (true) ) \
EFFECT( FADEOUT, EffectFade, (false) ) \
EFFECT( INVERT, EffectInvert, () ) \
EFFECT( NORMALIZE, EffectNormalize, () ) \
EFFECT( PHASER, EffectPhaser, () ) \
EFFECT( REPAIR, EffectRepair, () ) \
EFFECT( REPEAT, EffectRepeat, () ) \
EFFECT( REVERB, EffectReverb, () ) \
EFFECT( REVERSE, EffectReverse, () ) \
EFFECT( STEREOTOMONO, EffectStereoToMono, () ) \
EFFECT( TRUNCATESILENCE, EffectTruncSilence, () ) \
EFFECT( WAHWAH, EffectWahwah, () ) \
EFFECT( FINDCLIPPING, EffectFindClipping, () ) \
NOISEREDUCTION_EFFECT \
SOUNDTOUCH_EFFECTS \
EFFECT( AUTODUCK, EffectAutoDuck, () ) \
EFFECT( PAULSTRETCH, EffectPaulstretch, () ) \
EFFECT( CHIRP, EffectToneGen, (true) ) \
EFFECT( DTMFTONES, EffectDtmf, () ) \
EFFECT( NOISE, EffectNoise, () ) \
EFFECT( SILENCE, EffectSilence, () ) \
EFFECT( TONE, EffectToneGen, (false) ) \
EFFECT( AMPLIFY, EffectAmplify, () ) \
EFFECT( BASSTREBLE, EffectBassTreble, () ) \
EFFECT( CHANGESPEED, EffectChangeSpeed, () ) \
EFFECT( CLICKREMOVAL, EffectClickRemoval, () ) \
EFFECT( COMPRESSOR, EffectCompressor, () ) \
EFFECT( DISTORTION, EffectDistortion, () ) \
EFFECT( ECHO, EffectEcho, () ) \
EFFECT( EQUALIZATION, EffectEqualization, (kEqLegacy) ) \
EFFECT( FADEIN, EffectFade, (true) ) \
EFFECT( FADEOUT, EffectFade, (false) ) \
EFFECT( FILTERCURVE, EffectEqualization, (kEqOptionCurve) ) \
EFFECT( GRAPHICEQ, EffectEqualization, (kEqOptionGraphic) ) \
EFFECT( INVERT, EffectInvert, () ) \
EFFECT( NORMALIZE, EffectNormalize, () ) \
EFFECT( PHASER, EffectPhaser, () ) \
EFFECT( REPAIR, EffectRepair, () ) \
EFFECT( REPEAT, EffectRepeat, () ) \
EFFECT( REVERB, EffectReverb, () ) \
EFFECT( REVERSE, EffectReverse, () ) \
EFFECT( STEREOTOMONO, EffectStereoToMono, () ) \
EFFECT( TRUNCATESILENCE, EffectTruncSilence, () ) \
EFFECT( WAHWAH, EffectWahwah, () ) \
EFFECT( FINDCLIPPING, EffectFindClipping, () ) \
NOISEREDUCTION_EFFECT \
SOUNDTOUCH_EFFECTS \
EFFECT( AUTODUCK, EffectAutoDuck, () ) \
EFFECT( PAULSTRETCH, EffectPaulstretch, () ) \
SBSMS_EFFECTS
//