diff --git a/src/TrackArtist.cpp b/src/TrackArtist.cpp index 355466b27..61f3ff38b 100644 --- a/src/TrackArtist.cpp +++ b/src/TrackArtist.cpp @@ -708,6 +708,7 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & rect) { // do a translation into the linear space wt->SetLastScaleType(); + wt->SetLastdBRange(); float sign = (min >= 0 ? 1 : -1); if (min != 0.) { min = DB_TO_LINEAR(fabs(min) * dBRange - dBRange); @@ -742,12 +743,14 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & rect) float min, max; wt->GetDisplayBounds(&min, &max); + float lastdBRange; if (wt->GetLastScaleType() != scaleType && wt->GetLastScaleType() != -1) { // do a translation into the dB space wt->SetLastScaleType(); + wt->SetLastdBRange(); float sign = (min >= 0 ? 1 : -1); if (min != 0.) { min = (LINEAR_TO_DB(fabs(min)) + dBRange) / dBRange; @@ -765,6 +768,30 @@ void TrackArtist::UpdateVRuler(Track *t, wxRect & rect) } wt->SetDisplayBounds(min, max); } + else if (dBRange != (lastdBRange = wt->GetLastdBRange())) { + wt->SetLastdBRange(); + // Remap the max of the scale + const float sign = (max >= 0 ? 1 : -1); + float newMax = max; + if (max != 0.) { + +// Ugh, duplicating from TrackPanel.cpp +#define ZOOMLIMIT 0.001f + + const float extreme = LINEAR_TO_DB(2); + // recover dB value of max + const float dB = std::min(extreme, (fabs(max) * lastdBRange - lastdBRange)); + // find new scale position, but old max may get trimmed if the db limit rises + // Don't trim it to zero though, but leave max and limit distinct + newMax = sign * std::max(ZOOMLIMIT, (dBRange + dB) / dBRange); + // Adjust the min of the scale if we can, + // so the db Limit remains where it was on screen, but don't violate extremes + if (min != 0.) + min = std::max(-extreme, newMax * min / max); + } + + wt->SetDisplayBounds(min, newMax); + } if (max > 0) { int top = 0; diff --git a/src/WaveTrack.cpp b/src/WaveTrack.cpp index 9daee4877..16eecb496 100644 --- a/src/WaveTrack.cpp +++ b/src/WaveTrack.cpp @@ -109,6 +109,7 @@ WaveTrack::WaveTrack(DirManager *projDirManager, sampleFormat format, double rat mDisplayLocations = NULL; mDisplayNumLocationsAllocated = 0; mLastScaleType = -1; + mLastdBRange = -1; mAutoSaveIdent = 0; } @@ -121,6 +122,7 @@ WaveTrack::WaveTrack(WaveTrack &orig): ? new WaveformSettings(*orig.mpWaveformSettings) : 0) { mLastScaleType = -1; + mLastdBRange = -1; mLegacyProjectFileOffset = 0; @@ -288,6 +290,11 @@ void WaveTrack::SetLastScaleType() mLastScaleType = GetWaveformSettings().scaleType; } +void WaveTrack::SetLastdBRange() +{ + mLastdBRange = GetWaveformSettings().dBRange; +} + void WaveTrack::GetDisplayBounds(float *min, float *max) { *min = mDisplayMin; diff --git a/src/WaveTrack.h b/src/WaveTrack.h index c21d7399e..b545c48c2 100644 --- a/src/WaveTrack.h +++ b/src/WaveTrack.h @@ -435,6 +435,9 @@ class AUDACITY_DLL_API WaveTrack : public Track { int GetLastScaleType() { return mLastScaleType; } void SetLastScaleType(); + int GetLastdBRange() { return mLastdBRange; } + void SetLastdBRange(); + WaveTrackDisplay GetDisplay() const { return mDisplay; } void SetDisplay(WaveTrackDisplay display) { mDisplay = display; } @@ -463,6 +466,7 @@ class AUDACITY_DLL_API WaveTrack : public Track { float mDisplayMax; WaveTrackDisplay mDisplay; int mLastScaleType; // last scale type choice + int mLastdBRange; int mDisplayNumLocations; int mDisplayNumLocationsAllocated; Location* mDisplayLocations;