1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-22 15:20:15 +02:00

Added dB - linear amplitude conversion macros.

This commit is contained in:
Steve Daulton 2015-07-24 21:59:34 +01:00
parent da060228eb
commit df8ddde874
16 changed files with 58 additions and 58 deletions

View File

@ -152,8 +152,11 @@ void QuitAudacity();
#endif #endif
#endif #endif
// This macro is used widely, so declared here. // These macros are used widely, so declared here.
#define QUANTIZED_TIME(time, rate) ((double)((sampleCount)floor(((double)(time) * (rate)) + 0.5))) / (rate) #define QUANTIZED_TIME(time, rate) ((double)((sampleCount)floor(((double)(time) * (rate)) + 0.5))) / (rate)
// dB - linear amplitude convesions
#define DB_TO_LINEAR(x) pow(10.0, x / 20.0)
#define LINEAR_TO_DB(x) 20.0 * log10(x)
// Marks strings for extraction only...must use wxGetTranslation() to translate. // Marks strings for extraction only...must use wxGetTranslation() to translate.
#define XO(s) wxT(s) #define XO(s) wxT(s)

View File

@ -185,7 +185,7 @@ double Envelope::toDB(double value)
double sign = (value >= 0 ? 1 : -1); double sign = (value >= 0 ? 1 : -1);
wxASSERT( dBRange > 0 ); wxASSERT( dBRange > 0 );
double db = 20 * log10(fabs(value)); double db = LINEAR_TO_DB(fabs(value));
double val = (db + dBRange) / dBRange; double val = (db + dBRange) / dBRange;
val = Limit( 0.0, val, 1.0 ); val = Limit( 0.0, val, 1.0 );

View File

@ -706,7 +706,7 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & rect)
wt->SetDisplay(WaveTrack::WaveformDisplay); // this makes the last display not WaveformDBDisplay wt->SetDisplay(WaveTrack::WaveformDisplay); // this makes the last display not WaveformDBDisplay
float sign = (min >= 0 ? 1 : -1); float sign = (min >= 0 ? 1 : -1);
if (min != 0.) { if (min != 0.) {
min = pow(10., (fabs(min)*mdBrange - mdBrange)/20.0); min = DB_TO_LINEAR(fabs(min)*mdBrange - mdBrange);
if (min < 0.0) if (min < 0.0)
min = 0.0; min = 0.0;
min *= sign; min *= sign;
@ -714,7 +714,7 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & rect)
sign = (max >= 0 ? 1 : -1); sign = (max >= 0 ? 1 : -1);
if (max != 0.) { if (max != 0.) {
max = pow(10., (fabs(max)*mdBrange - mdBrange)/20.0); max = DB_TO_LINEAR(fabs(max)*mdBrange - mdBrange);
if (max < 0.0) if (max < 0.0)
max = 0.0; max = 0.0;
max *= sign; max *= sign;
@ -744,7 +744,7 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & rect)
wt->SetDisplay(WaveTrack::WaveformDBDisplay); // this makes the last display not WaveformDisplay wt->SetDisplay(WaveTrack::WaveformDBDisplay); // this makes the last display not WaveformDisplay
float sign = (min >= 0 ? 1 : -1); float sign = (min >= 0 ? 1 : -1);
if (min != 0.) { if (min != 0.) {
min = (20.0 * log10(fabs(min)) + mdBrange) / mdBrange; min = (LINEAR_TO_DB(fabs(min)) + mdBrange) / mdBrange;
if (min < 0.0) if (min < 0.0)
min = 0.0; min = 0.0;
min *= sign; min *= sign;
@ -752,7 +752,7 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & rect)
sign = (max >= 0 ? 1 : -1); sign = (max >= 0 ? 1 : -1);
if (max != 0.) { if (max != 0.) {
max = (20.0 * log10(fabs(max)) + mdBrange) / mdBrange; max = (LINEAR_TO_DB(fabs(max)) + mdBrange) / mdBrange;
if (max < 0.0) if (max < 0.0)
max = 0.0; max = 0.0;
max *= sign; max *= sign;
@ -900,7 +900,7 @@ int GetWaveYPos(float value, float min, float max,
float sign = (value >= 0 ? 1 : -1); float sign = (value >= 0 ? 1 : -1);
if (value != 0.) { if (value != 0.) {
float db = 20.0 * log10(fabs(value)); float db = LINEAR_TO_DB(fabs(value));
value = (db + dBr) / dBr; value = (db + dBr) / dBr;
if (!outer) { if (!outer) {
value -= 0.5; value -= 0.5;
@ -941,7 +941,7 @@ float FromDB(float value, double dBRange)
return 0; return 0;
double sign = (value >= 0 ? 1 : -1); double sign = (value >= 0 ? 1 : -1);
return pow(10.0, ((fabs(value) * dBRange) - dBRange) / 20.0)*sign; return DB_TO_LINEAR((fabs(value) * dBRange) - dBRange) * sign;
} }
float ValueOfPixel(int yy, int height, bool offset, float ValueOfPixel(int yy, int height, bool offset,
@ -3188,8 +3188,8 @@ void TrackArtist::DrawTimeTrack(TimeTrack *track,
if(track->GetDisplayLog()) { if(track->GetDisplayLog()) {
// MB: silly way to undo the work of GetWaveYPos while still getting a logarithmic scale // MB: silly way to undo the work of GetWaveYPos while still getting a logarithmic scale
double dBRange = gPrefs->Read(wxT("/GUI/EnvdBRange"), ENV_DB_RANGE); double dBRange = gPrefs->Read(wxT("/GUI/EnvdBRange"), ENV_DB_RANGE);
lower = 20.0 * log10(std::max(1.0e-7, lower)) / dBRange + 1.0; lower = LINEAR_TO_DB(std::max(1.0e-7, lower)) / dBRange + 1.0;
upper = 20.0 * log10(std::max(1.0e-7, upper)) / dBRange + 1.0; upper = LINEAR_TO_DB(std::max(1.0e-7, upper)) / dBRange + 1.0;
} }
track->GetEnvelope()->DrawPoints(dc, envRect, zoomInfo, track->GetEnvelope()->DrawPoints(dc, envRect, zoomInfo,
track->GetDisplayLog(), lower, upper); track->GetDisplayLog(), lower, upper);

View File

@ -3810,8 +3810,8 @@ void TrackPanel::ForwardEventToTimeTrackEnvelope(wxMouseEvent & event)
if(ptimetrack->GetDisplayLog()) { if(ptimetrack->GetDisplayLog()) {
// MB: silly way to undo the work of GetWaveYPos while still getting a logarithmic scale // MB: silly way to undo the work of GetWaveYPos while still getting a logarithmic scale
double dBRange = gPrefs->Read(wxT("/GUI/EnvdBRange"), ENV_DB_RANGE); double dBRange = gPrefs->Read(wxT("/GUI/EnvdBRange"), ENV_DB_RANGE);
lower = 20.0 * log10(std::max(1.0e-7, lower)) / dBRange + 1.0; lower = LINEAR_TO_DB(std::max(1.0e-7, lower)) / dBRange + 1.0;
upper = 20.0 * log10(std::max(1.0e-7, upper)) / dBRange + 1.0; upper = LINEAR_TO_DB(std::max(1.0e-7, upper)) / dBRange + 1.0;
} }
bool needUpdate = bool needUpdate =
pspeedenvelope->MouseEvent( pspeedenvelope->MouseEvent(

View File

@ -65,7 +65,7 @@ END_EVENT_TABLE()
EffectAmplify::EffectAmplify() EffectAmplify::EffectAmplify()
{ {
mAmp = DEF_Amp; mAmp = DEF_Amp;
mRatio = pow(10.0, mAmp / 20.0); mRatio = DB_TO_LINEAR(mAmp);
mRatioClip = 0.0; mRatioClip = 0.0;
mCanClip = false; mCanClip = false;
mPeak = 0.0; mPeak = 0.0;
@ -235,8 +235,8 @@ void EffectAmplify::PopulateOrExchange(ShuttleGui & S)
S.StartMultiColumn(2, wxCENTER); S.StartMultiColumn(2, wxCENTER);
{ {
FloatingPointValidator<double> vldNewPeak(precission, &mNewPeak, NUM_VAL_ONE_TRAILING_ZERO); FloatingPointValidator<double> vldNewPeak(precission, &mNewPeak, NUM_VAL_ONE_TRAILING_ZERO);
double minAmp = MIN_Amp + (20.0 * log10(mPeak)); double minAmp = MIN_Amp + LINEAR_TO_DB(mPeak);
double maxAmp = MAX_Amp + (20.0 * log10(mPeak)); double maxAmp = MAX_Amp + LINEAR_TO_DB(mPeak);
// min and max need same precision as what we're validating (bug 963) // min and max need same precision as what we're validating (bug 963)
minAmp = Internat::CompatibleToDouble(Internat::ToString(minAmp, precission)); minAmp = Internat::CompatibleToDouble(Internat::ToString(minAmp, precission));
@ -268,17 +268,17 @@ void EffectAmplify::PopulateOrExchange(ShuttleGui & S)
bool EffectAmplify::TransferDataToWindow() bool EffectAmplify::TransferDataToWindow()
{ {
// limit range of gain // limit range of gain
double dBInit = 20.0*log10(mRatio); double dBInit = LINEAR_TO_DB(mRatio);
double dB = TrapDouble(dBInit, MIN_Amp, MAX_Amp); double dB = TrapDouble(dBInit, MIN_Amp, MAX_Amp);
if (dB != dBInit) if (dB != dBInit)
mRatio = pow(10.0, dB / 20.0); mRatio = DB_TO_LINEAR(dB);
mAmp = 20.0 * log10(mRatio); mAmp = LINEAR_TO_DB(mRatio);
mAmpT->GetValidator()->TransferToWindow(); mAmpT->GetValidator()->TransferToWindow();
mAmpS->SetValue((int) (mAmp * SCL_Amp + 0.5f)); mAmpS->SetValue((int) (mAmp * SCL_Amp + 0.5f));
mNewPeak = 20.0 * log10(mRatio * mPeak); mNewPeak = LINEAR_TO_DB(mRatio * mPeak);
mNewPeakT->GetValidator()->TransferToWindow(); mNewPeakT->GetValidator()->TransferToWindow();
mClip->SetValue(mCanClip); mClip->SetValue(mCanClip);
@ -295,7 +295,7 @@ bool EffectAmplify::TransferDataFromWindow()
return false; return false;
} }
mRatio = pow(10.0, TrapDouble(mAmp * SCL_Amp, MIN_Amp * SCL_Amp, MAX_Amp * SCL_Amp) / (20.0 * SCL_Amp)); mRatio = DB_TO_LINEAR(TrapDouble(mAmp * SCL_Amp, MIN_Amp * SCL_Amp, MAX_Amp * SCL_Amp) / SCL_Amp);
mCanClip = mClip->GetValue(); mCanClip = mClip->GetValue();
@ -322,11 +322,11 @@ void EffectAmplify::OnAmpText(wxCommandEvent & WXUNUSED(evt))
return; return;
} }
mRatio = pow(10.0, TrapDouble(mAmp * SCL_Amp, MIN_Amp * SCL_Amp, MAX_Amp * SCL_Amp) / (20.0 * SCL_Amp)); mRatio = DB_TO_LINEAR(TrapDouble(mAmp * SCL_Amp, MIN_Amp * SCL_Amp, MAX_Amp * SCL_Amp) / SCL_Amp);
mAmpS->SetValue((int) (20.0 * log10(mRatio) * SCL_Amp + 0.5)); mAmpS->SetValue((int) (LINEAR_TO_DB(mRatio) * SCL_Amp + 0.5));
mNewPeak = 20.0 * log10(mRatio * mPeak); mNewPeak = LINEAR_TO_DB(mRatio * mPeak);
mNewPeakT->GetValidator()->TransferToWindow(); mNewPeakT->GetValidator()->TransferToWindow();
CheckClip(); CheckClip();
@ -343,12 +343,12 @@ void EffectAmplify::OnPeakText(wxCommandEvent & WXUNUSED(evt))
if (mNewPeak == 0.0) if (mNewPeak == 0.0)
mRatio = mRatioClip; mRatio = mRatioClip;
else else
mRatio = pow(10.0, mNewPeak / 20.0) / mPeak; mRatio = DB_TO_LINEAR(mNewPeak) / mPeak;
double ampInit = 20.0 * log10(mRatio); double ampInit = LINEAR_TO_DB(mRatio);
mAmp = TrapDouble(ampInit, MIN_Amp, MAX_Amp); mAmp = TrapDouble(ampInit, MIN_Amp, MAX_Amp);
if (mAmp != ampInit) if (mAmp != ampInit)
mRatio = pow(10.0, mAmp / 20.0); mRatio = DB_TO_LINEAR(mAmp);
mAmpT->GetValidator()->TransferToWindow(); mAmpT->GetValidator()->TransferToWindow();
@ -360,20 +360,20 @@ void EffectAmplify::OnPeakText(wxCommandEvent & WXUNUSED(evt))
void EffectAmplify::OnAmpSlider(wxCommandEvent & evt) void EffectAmplify::OnAmpSlider(wxCommandEvent & evt)
{ {
double dB = evt.GetInt() / SCL_Amp; double dB = evt.GetInt() / SCL_Amp;
mRatio = pow(10.0, TrapDouble(dB, MIN_Amp, MAX_Amp) / 20.0); mRatio = DB_TO_LINEAR(TrapDouble(dB, MIN_Amp, MAX_Amp));
double dB2 = (evt.GetInt() - 1) / SCL_Amp; double dB2 = (evt.GetInt() - 1) / SCL_Amp;
double ratio2 = pow(10.0, TrapDouble(dB2, MIN_Amp, MAX_Amp) / 20.0); double ratio2 = DB_TO_LINEAR(TrapDouble(dB2, MIN_Amp, MAX_Amp));
if (!mClip->GetValue() && mRatio * mPeak > 1.0 && ratio2 * mPeak < 1.0) if (!mClip->GetValue() && mRatio * mPeak > 1.0 && ratio2 * mPeak < 1.0)
{ {
mRatio = 1.0 / mPeak; mRatio = 1.0 / mPeak;
} }
mAmp = 20.0 * log10(mRatio); mAmp = LINEAR_TO_DB(mRatio);
mAmpT->GetValidator()->TransferToWindow(); mAmpT->GetValidator()->TransferToWindow();
mNewPeak = 20.0 * log10(mRatio * mPeak); mNewPeak = LINEAR_TO_DB(mRatio * mPeak);
mNewPeakT->GetValidator()->TransferToWindow(); mNewPeakT->GetValidator()->TransferToWindow();
CheckClip(); CheckClip();

View File

@ -278,7 +278,7 @@ bool EffectAutoDuck::Process()
sampleCount minSamplesPause = sampleCount minSamplesPause =
mControlTrack->TimeToLongSamples(maxPause); mControlTrack->TimeToLongSamples(maxPause);
double threshold = pow(10.0, mThresholdDb/20); double threshold = DB_TO_LINEAR(mThresholdDb);
// adjust the threshold so we can compare it to the rmsSum value // adjust the threshold so we can compare it to the rmsSum value
threshold = threshold * threshold * kRMSWindowSize; threshold = threshold * threshold * kRMSWindowSize;
@ -553,7 +553,7 @@ bool EffectAutoDuck::ApplyDuckFade(int trackNumber, WaveTrack* t,
if (gain < mDuckAmountDb) if (gain < mDuckAmountDb)
gain = mDuckAmountDb; gain = mDuckAmountDb;
buf[i - pos] *= pow(10.0, gain / 20.0); buf[i - pos] *= DB_TO_LINEAR(gain);
} }
t->Set((samplePtr)buf, floatSample, pos, len); t->Set((samplePtr)buf, floatSample, pos, len);

View File

@ -155,7 +155,7 @@ sampleCount EffectBassTreble::ProcessBlock(float **inBlock, float **outBlock, sa
} }
else else
{ {
float gain = (pow(10.0, dB_level / 20.0f)) / mMax; float gain = DB_TO_LINEAR(dB_level) / mMax;
for (sampleCount i = 0; i < blockLen; i++) for (sampleCount i = 0; i < blockLen; i++)
{ {
// Normalize to specified level // Normalize to specified level

View File

@ -328,8 +328,8 @@ bool EffectCompressor::TransferDataFromWindow()
bool EffectCompressor::NewTrackPass1() bool EffectCompressor::NewTrackPass1()
{ {
mThreshold = pow(10.0, mThresholdDB/20); // factor of 20 because it's power mThreshold = DB_TO_LINEAR(mThresholdDB);
mNoiseFloor = pow(10.0, mNoiseFloorDB/20); mNoiseFloor = DB_TO_LINEAR(mNoiseFloorDB);
mNoiseCounter = 100; mNoiseCounter = 100;
mAttackInverseFactor = exp(log(mThreshold) / (mCurRate * mAttackTime + 0.5)); mAttackInverseFactor = exp(log(mThreshold) / (mCurRate * mAttackTime + 0.5));

View File

@ -112,7 +112,7 @@ float ContrastDialog::GetDB()
{ {
if( rms < 1.0E-30 ) if( rms < 1.0E-30 )
return -60.0; return -60.0;
return 20.0*log10(rms); return LINEAR_TO_DB(rms);
} }
else else
{ {

View File

@ -1182,13 +1182,13 @@ bool EffectEqualization::CalcFilter()
} }
mFilterFuncR[mWindowSize/2] = val1; mFilterFuncR[mWindowSize/2] = val1;
mFilterFuncR[0] = (float)(pow(10., mFilterFuncR[0]/20.)); mFilterFuncR[0] = DB_TO_LINEAR(mFilterFuncR[0]);
for(i=1;i<mWindowSize/2;i++) for(i=1;i<mWindowSize/2;i++)
{ {
mFilterFuncR[i] = (float)(pow(10., mFilterFuncR[i]/20.)); mFilterFuncR[i] = DB_TO_LINEAR(mFilterFuncR[i]);
mFilterFuncR[mWindowSize-i]=mFilterFuncR[i]; //Fill entire array mFilterFuncR[mWindowSize-i]=mFilterFuncR[i]; //Fill entire array
} }
mFilterFuncR[i] = (float)(pow(10., mFilterFuncR[i]/20.)); //do last one mFilterFuncR[i] = DB_TO_LINEAR(mFilterFuncR[i]); //do last one
//transfer to time domain to do the padding and windowing //transfer to time domain to do the padding and windowing
float *outr = new float[mWindowSize]; float *outr = new float[mWindowSize];
@ -2773,7 +2773,7 @@ void EqualizationPanel::OnPaint(wxPaintEvent & WXUNUSED(event))
yF += mOutr[halfM]; yF += mOutr[halfM];
yF = fabs(yF); yF = fabs(yF);
if(yF!=0.) if(yF!=0.)
yF = 20.0*log10(yF); //20 here as an amplitude yF = LINEAR_TO_DB(yF);
else else
yF = mEffect->mdBMin; yF = mEffect->mdBMin;
} }

View File

@ -765,10 +765,10 @@ EffectNoiseReduction::Worker::Worker
const int nAttackBlocks = 1 + (int)(settings.mAttackTime * sampleRate / mStepSize); const int nAttackBlocks = 1 + (int)(settings.mAttackTime * sampleRate / mStepSize);
const int nReleaseBlocks = 1 + (int)(settings.mReleaseTime * sampleRate / mStepSize); const int nReleaseBlocks = 1 + (int)(settings.mReleaseTime * sampleRate / mStepSize);
// Applies to amplitudes, divide by 20: // Applies to amplitudes, divide by 20:
mNoiseAttenFactor = pow(10.0, noiseGain / 20.0); mNoiseAttenFactor = DB_TO_LINEAR(noiseGain);
// Apply to gain factors which apply to amplitudes, divide by 20: // Apply to gain factors which apply to amplitudes, divide by 20:
mOneBlockAttack = pow(10.0, (noiseGain / (20.0 * nAttackBlocks))); mOneBlockAttack = DB_TO_LINEAR(noiseGain / nAttackBlocks);
mOneBlockRelease = pow(10.0, (noiseGain / (20.0 * nReleaseBlocks))); mOneBlockRelease = DB_TO_LINEAR(noiseGain / nReleaseBlocks);
// Applies to power, divide by 10: // Applies to power, divide by 10:
mOldSensitivityFactor = pow(10.0, settings.mOldSensitivity / 10.0); mOldSensitivityFactor = pow(10.0, settings.mOldSensitivity / 10.0);

View File

@ -275,10 +275,8 @@ void EffectNoiseRemoval::Initialize()
mFreqSmoothingBins = (int)(mFreqSmoothingHz * mWindowSize / mSampleRate); mFreqSmoothingBins = (int)(mFreqSmoothingHz * mWindowSize / mSampleRate);
mAttackDecayBlocks = 1 + mAttackDecayBlocks = 1 +
(int)(mAttackDecayTime * mSampleRate / (mWindowSize / 2)); (int)(mAttackDecayTime * mSampleRate / (mWindowSize / 2));
// Applies to amplitudes, divide by 20: mNoiseAttenFactor = DB_TO_LINEAR(mNoiseGain);
mNoiseAttenFactor = pow(10.0, mNoiseGain/20.0); mOneBlockAttackDecay = DB_TO_LINEAR(mNoiseGain / mAttackDecayBlocks);
// Applies to gain factors which apply to amplitudes, divide by 20:
mOneBlockAttackDecay = pow(10.0, (mNoiseGain / (20.0 * mAttackDecayBlocks)));
// Applies to power, divide by 10: // Applies to power, divide by 10:
mSensitivityFactor = pow(10.0, mSensitivity/10.0); mSensitivityFactor = pow(10.0, mSensitivity/10.0);
mMinSignalBlocks = mMinSignalBlocks =

View File

@ -152,9 +152,8 @@ bool EffectNormalize::Process()
float ratio; float ratio;
if( mGain ) if( mGain )
ratio = pow(10.0,TrapDouble(mLevel, // same value used for all tracks // same value used for all tracks
MIN_Level, ratio = DB_TO_LINEAR(TrapDouble(mLevel, MIN_Level, MAX_Level));
MAX_Level)/20.0);
else else
ratio = 1.0; ratio = 1.0;

View File

@ -725,7 +725,7 @@ bool EffectScienFilter::CalcFilter()
} }
if ((mOrder & 1) == 0) if ((mOrder & 1) == 0)
{ {
float fTemp = pow (10.0, -wxMax(0.001, mRipple) / 20.0); // at DC the response is down R dB (for even-order) float fTemp = DB_TO_LINEAR(-wxMax(0.001, mRipple)); // at DC the response is down R dB (for even-order)
mpBiquad[0].fNumerCoeffs [0] *= fTemp; mpBiquad[0].fNumerCoeffs [0] *= fTemp;
mpBiquad[0].fNumerCoeffs [1] *= fTemp; mpBiquad[0].fNumerCoeffs [1] *= fTemp;
mpBiquad[0].fNumerCoeffs [2] *= fTemp; mpBiquad[0].fNumerCoeffs [2] *= fTemp;
@ -761,7 +761,7 @@ bool EffectScienFilter::CalcFilter()
case kChebyshevTypeII: // Chebyshev Type 2 case kChebyshevTypeII: // Chebyshev Type 2
float fSZeroX, fSZeroY; float fSZeroX, fSZeroY;
float fSPoleX, fSPoleY; float fSPoleX, fSPoleY;
eps = pow (10.0, -wxMax(0.001, mStopbandRipple) / 20.0); eps = DB_TO_LINEAR(-wxMax(0.001, mStopbandRipple));
a = log (1 / eps + sqrt(1 / square(eps) + 1)) / mOrder; a = log (1 / eps + sqrt(1 / square(eps) + 1)) / mOrder;
// Assume even order // Assume even order
@ -1131,7 +1131,7 @@ void EffectScienFilterPanel::OnPaint(wxPaintEvent & WXUNUSED(evt))
x = mEnvRect.x + i; x = mEnvRect.x + i;
freq = pow(10.0, loLog + i * step); //Hz freq = pow(10.0, loLog + i * step); //Hz
yF = mEffect->FilterMagnAtFreq (freq); yF = mEffect->FilterMagnAtFreq (freq);
yF = 20.0 * log10(yF); yF = LINEAR_TO_DB(yF);
if (yF < mDbMin) if (yF < mDbMin)
{ {

View File

@ -292,7 +292,7 @@ bool SliderDialog::TransferDataFromWindow()
mTextCtrl->GetValue().ToDouble(&value); mTextCtrl->GetValue().ToDouble(&value);
if (mStyle == DB_SLIDER) if (mStyle == DB_SLIDER)
value = pow(10.0, value / 20.0); value = DB_TO_LINEAR(value);
mSlider->Set(value); mSlider->Set(value);
return true; return true;
@ -1330,7 +1330,7 @@ float LWSlider::DragPositionToValue(int fromPos, bool shiftDown)
float LWSlider::Get( bool convert ) float LWSlider::Get( bool convert )
{ {
if (mStyle == DB_SLIDER) if (mStyle == DB_SLIDER)
return ( convert ? pow(10.0f, mCurrentValue / 20.0f) : mCurrentValue ); return (convert ? DB_TO_LINEAR(mCurrentValue) : mCurrentValue);
else else
return mCurrentValue; return mCurrentValue;
} }
@ -1340,7 +1340,7 @@ void LWSlider::Set(float value)
if (mIsDragging) if (mIsDragging)
return; return;
if (mStyle == DB_SLIDER) if (mStyle == DB_SLIDER)
mCurrentValue = 20.0f*log10(value); mCurrentValue = LINEAR_TO_DB(value);
else else
mCurrentValue = value; mCurrentValue = value;

View File

@ -864,7 +864,7 @@ static float ToDB(float v, float range)
{ {
double db; double db;
if (v > 0) if (v > 0)
db = 20 * log10(fabs(v)); db = LINEAR_TO_DB(fabs(v));
else else
db = -999; db = -999;
return ClipZeroToOne((db + range) / range); return ClipZeroToOne((db + range) / range);
@ -995,7 +995,7 @@ void Meter::OnMeterUpdate(wxTimerEvent & WXUNUSED(event))
} }
else { else {
double decayAmount = mDecayRate * deltaT; double decayAmount = mDecayRate * deltaT;
double decayFactor = pow(10.0, -decayAmount/20); double decayFactor = DB_TO_LINEAR(-decayAmount);
mBar[j].peak = floatMax(msg.peak[j], mBar[j].peak = floatMax(msg.peak[j],
mBar[j].peak * decayFactor); mBar[j].peak * decayFactor);
} }