1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-01 16:19:43 +02:00

This should fix the init problem and make it usable in chains

This commit is contained in:
Leland Lucius 2015-04-27 03:44:10 -05:00
parent 841a392f1a
commit cb147e5605
2 changed files with 60 additions and 54 deletions

View File

@ -45,10 +45,9 @@ enum
// Define keys, defaults, minimums, and maximums for the effect parameters
//
// Name Type Key Def Min Max Scale
Param( Ratio, float, XO("Ratio"), 0.9f, -FLT_MAX, FLT_MAX, 1.0f );
Param( NoClip, bool, XO("Allow Clipping"), false, false, true, 1.0f );
Param( Amp, float, wxT(""), -0.91515f, -50.0, 50.0, 10.0f );
// Name Type Key Def Min Max Scale
Param( Ratio, float, XO("Ratio"), 0.9f, 0.003162f, 316.227766f, 1.0f );
Param( Amp, float, wxT(""), -0.91515f, -50.0f, 50.0f, 10.0f );
//
// EffectAmplify
@ -64,9 +63,9 @@ END_EVENT_TABLE()
EffectAmplify::EffectAmplify()
{
mAmp = DEF_Amp;
mNoClip = DEF_NoClip;
mRatio = pow(10.0, mAmp * 20.0);
mPeak = 0.0;
mRatio = powf(10.0f, mAmp / 20.0f);
mCanClip = false;
mPeak = 0.0f;
}
EffectAmplify::~EffectAmplify()
@ -118,26 +117,15 @@ sampleCount EffectAmplify::ProcessBlock(float **inBlock, float **outBlock, sampl
bool EffectAmplify::GetAutomationParameters(EffectAutomationParameters & parms)
{
parms.WriteFloat(KEY_Ratio, mRatio);
parms.Write(KEY_NoClip, !mNoClip);
return true;
}
bool EffectAmplify::SetAutomationParameters(EffectAutomationParameters & parms)
{
float Ratio;
float def = pow(10.0, DEF_Amp / 20.0);
float min = pow(10.0, MIN_Amp / 20.0);
float max = pow(10.0, MAX_Amp / 20.0);
if (!parms.ReadAndVerify(KEY_Ratio, &Ratio, def, min, max))
{
return false;
}
ReadAndVerifyBool(NoClip);
ReadAndVerifyFloat(Ratio);
mRatio = Ratio;
mNoClip = !NoClip;
return true;
}
@ -146,7 +134,7 @@ bool EffectAmplify::SetAutomationParameters(EffectAutomationParameters & parms)
bool EffectAmplify::Init()
{
mPeak = 0.0;
mPeak = 0.0f;
SelectedTrackListOfKindIterator iter(Track::Wave, mTracks);
@ -167,6 +155,23 @@ bool EffectAmplify::Init()
void EffectAmplify::PopulateOrExchange(ShuttleGui & S)
{
if (IsBatchProcessing())
{
mPeak = 1.0f;
}
else
{
if (mPeak > 0.0)
{
mRatio = 1.0 / mPeak;
}
else
{
mRatio = 1.0;
}
}
S.AddSpace(0, 5);
S.StartVerticalLay(0);
@ -194,8 +199,8 @@ void EffectAmplify::PopulateOrExchange(ShuttleGui & S)
S.StartMultiColumn(2, wxCENTER);
{
FloatingPointValidator<float> vldNewPeak(1, &mNewPeak);
vldNewPeak.SetRange(20.0 * log10(pow(10.0, MIN_Amp / 20.0) * mPeak),
20.0 * log10(pow(10.0, MAX_Amp / 20.0) * mPeak));
vldNewPeak.SetRange(20.0f * log10f(powf(10.0f, MIN_Amp / 20.0f) * mPeak),
20.0f * log10f(powf(10.0f, MAX_Amp / 20.0f) * mPeak));
mNewPeakT = S.Id(ID_Peak).AddTextBox(_("New Peak Amplitude (dB):"), wxT(""), 12);
mNewPeakT->SetValidator(vldNewPeak);
}
@ -205,9 +210,13 @@ void EffectAmplify::PopulateOrExchange(ShuttleGui & S)
S.StartHorizontalLay(wxCENTER);
{
mClip = S.Id(ID_Clip).AddCheckBox(_("Allow clipping"), wxT("false"));
if (IsBatchProcessing())
{
mClip->Enable(false);
mCanClip = true;
}
}
S.EndHorizontalLay();
}
S.EndVerticalLay();
@ -216,24 +225,21 @@ void EffectAmplify::PopulateOrExchange(ShuttleGui & S)
bool EffectAmplify::TransferDataToWindow()
{
if (mPeak > 0.0)
mRatio = 1.0 / mPeak;
else
mRatio = 1.0;
// limit range of gain
double dB = TrapDouble(20.0 * log10(mRatio), MIN_Amp, MAX_Amp);
float dB = TrapFloat(20.0f * log10f(mRatio) * SCL_Amp, MIN_Amp * SCL_Amp, MAX_Amp * SCL_Amp) / SCL_Amp;
mRatio = pow(10.0, dB / 20.0);
mRatio = powf(10.0f, dB / 20.0f);
mAmp = 20.0 * log10(mRatio);
mAmp = 20.0f * log10f(mRatio);
mAmpT->GetValidator()->TransferToWindow();
mAmpS->SetValue((int) (mAmp * SCL_Amp + 0.5));
mAmpS->SetValue((int) (mAmp * SCL_Amp + 0.5f));
mNewPeak = 20.0 * log10(mRatio * mPeak);
mNewPeak = 20.0f * log10f(mRatio * mPeak);
mNewPeakT->GetValidator()->TransferToWindow();
mClip->SetValue(mCanClip);
CheckClip();
return true;
@ -246,13 +252,13 @@ bool EffectAmplify::TransferDataFromWindow()
return false;
}
mRatio = pow(10.0, TrapDouble(mAmp, MIN_Amp, MAX_Amp) / 20.0);
mRatio = powf(10.0f, TrapFloat(mAmp * SCL_Amp, MIN_Amp * SCL_Amp, MAX_Amp * SCL_Amp) / (20.0f * SCL_Amp));
mNoClip = !mClip->GetValue();
mCanClip = mClip->GetValue();
if (mNoClip && mRatio * mPeak > 1.0)
if (!mCanClip && mRatio * mPeak > 1.0f)
{
mRatio = 1.0 / mPeak;
mRatio = 1.0f / mPeak;
}
return true;
@ -262,8 +268,8 @@ bool EffectAmplify::TransferDataFromWindow()
void EffectAmplify::CheckClip()
{
double peak = mRatio * mPeak;
EnableApply(mClip->GetValue() || (peak > 0.0 && peak <= 1.0));
float peak = mRatio * mPeak;
EnableApply(mClip->GetValue() || (peak > 0.0f && peak <= 1.0f));
}
void EffectAmplify::OnAmpText(wxCommandEvent & WXUNUSED(evt))
@ -274,11 +280,11 @@ void EffectAmplify::OnAmpText(wxCommandEvent & WXUNUSED(evt))
return;
}
mRatio = pow(10.0, TrapDouble(mAmp, MIN_Amp, MAX_Amp) / 20.0);
mRatio = powf(10.0f, TrapFloat(mAmp * SCL_Amp, MIN_Amp * SCL_Amp, MAX_Amp * SCL_Amp) / (20.0f * SCL_Amp));
mAmpS->SetValue((int) (mAmp * SCL_Amp + 0.5));
mAmpS->SetValue((int) (20.0f * log10f(mRatio) * SCL_Amp + 0.5f));
mNewPeak = 20.0 * log10(mRatio * mPeak);
mNewPeak = 20.0f * log10f(mRatio * mPeak);
mNewPeakT->GetValidator()->TransferToWindow();
CheckClip();
@ -292,35 +298,35 @@ void EffectAmplify::OnPeakText(wxCommandEvent & WXUNUSED(evt))
return;
}
double r = pow(10.0, mNewPeak / 20.0) / mPeak;
float r = powf(10.0f, mNewPeak / 20.0f) / mPeak;
mAmp = TrapDouble(20.0 * log10(r), MIN_Amp, MAX_Amp);
mRatio = pow(10.0, mAmp / 20.0);
mAmp = TrapFloat(20.0f * log10f(r) * SCL_Amp, MIN_Amp * SCL_Amp, MAX_Amp * SCL_Amp) / SCL_Amp;
mRatio = powf(10.0f, mAmp / 20.0f);
mAmpT->GetValidator()->TransferToWindow();
mAmpS->SetValue((int) (mAmp * SCL_Amp + 0.5));
mAmpS->SetValue((int) (mAmp * SCL_Amp + 0.5f));
CheckClip();
}
void EffectAmplify::OnAmpSlider(wxCommandEvent & evt)
{
double dB = evt.GetInt() / SCL_Amp;
mRatio = pow(10.0, TrapDouble(dB, MIN_Amp, MAX_Amp) / 20.0);
float dB = evt.GetInt() / SCL_Amp;
mRatio = powf(10.0f, TrapFloat(dB, MIN_Amp, MAX_Amp) / 20.0f);
double dB2 = (evt.GetInt() - 1) / SCL_Amp;
double ratio2 = pow(10.0, TrapDouble(dB2, MIN_Amp, MAX_Amp) / 20.0);
float dB2 = (evt.GetInt() - 1) / SCL_Amp;
float ratio2 = powf(10.0f, TrapFloat(dB2, MIN_Amp, MAX_Amp) / 20.0f);
if (!mClip->GetValue() && mRatio * mPeak > 1.0 && ratio2 * mPeak < 1.0)
if (!mClip->GetValue() && mRatio * mPeak > 1.0f && ratio2 * mPeak < 1.0f)
{
mRatio = 1.0 / mPeak;
}
mAmp = 20.0 * log10(mRatio);
mAmp = 20.0f * log10f(mRatio);
mAmpT->GetValidator()->TransferToWindow();
mNewPeak = 20.0 * log10(mRatio * mPeak);
mNewPeak = 20.0f * log10f(mRatio * mPeak);
mNewPeakT->GetValidator()->TransferToWindow();
CheckClip();

View File

@ -72,7 +72,7 @@ private:
float mRatio;
float mAmp;
float mNewPeak;
bool mNoClip;
bool mCanClip;
wxSlider *mAmpS;
wxTextCtrl *mAmpT;