From c29939b52371d848a1590f4edb98f3837a33eecc Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Tue, 28 Sep 2021 21:35:24 -0700 Subject: [PATCH] use audio waveform constants to determine min/max zoom levels --- app/audio/audiovisualwaveform.cpp | 16 +++++++--------- app/audio/audiovisualwaveform.h | 4 ++++ app/widget/nodeparamview/nodeparamview.cpp | 2 -- app/widget/timebased/timescaledobject.cpp | 6 ++---- app/widget/timebased/timescaledobject.h | 3 +-- app/widget/timelinewidget/tool/zoom.cpp | 2 +- 6 files changed, 15 insertions(+), 18 deletions(-) diff --git a/app/audio/audiovisualwaveform.cpp b/app/audio/audiovisualwaveform.cpp index ab590fe41..5130fe46a 100644 --- a/app/audio/audiovisualwaveform.cpp +++ b/app/audio/audiovisualwaveform.cpp @@ -27,13 +27,12 @@ namespace olive { +const rational AudioVisualWaveform::kMinimumSampleRate = rational(1, 8); +const rational AudioVisualWaveform::kMaximumSampleRate = 1024; + AudioVisualWaveform::AudioVisualWaveform() : channels_(0) { - // Must be a power of 2 - static const rational kMinimumSampleRate = rational(1, 8); - static const rational kMaximumSampleRate = 1024; - for (rational i=kMinimumSampleRate; i<=kMaximumSampleRate; i*=2) { mipmapped_data_.insert({i, Sample()}); } @@ -431,15 +430,14 @@ int AudioVisualWaveform::time_to_samples(const double &time, double sample_rate) std::map::const_iterator AudioVisualWaveform::GetMipmapForScale(double scale) const { // Find largest mipmap for this scale (or the largest if we don't find one sufficient) - auto using_mipmap = mipmapped_data_.cend(); - using_mipmap--; for (auto it=mipmapped_data_.cbegin(); it!=mipmapped_data_.cend(); it++) { if (it->first.toDouble() >= scale) { - using_mipmap = it; - break; + return it; } } - return using_mipmap; + + // We don't have a mipmap large enough for this scale, so just return the largest we have + return std::prev(mipmapped_data_.cend()); } void AudioVisualWaveform::ExpandMinMax(AudioVisualWaveform::SamplePerChannel &sum, float value) diff --git a/app/audio/audiovisualwaveform.h b/app/audio/audiovisualwaveform.h index 33cce0fdd..ce74f9b4a 100644 --- a/app/audio/audiovisualwaveform.h +++ b/app/audio/audiovisualwaveform.h @@ -107,6 +107,10 @@ public: static void DrawWaveform(QPainter* painter, const QRect &rect, const double &scale, const AudioVisualWaveform& samples, const rational &start_time); + // Must be a power of 2 + static const rational kMinimumSampleRate; + static const rational kMaximumSampleRate; + private: static void ExpandMinMax(SamplePerChannel &sum, float value); diff --git a/app/widget/nodeparamview/nodeparamview.cpp b/app/widget/nodeparamview/nodeparamview.cpp index a97c76b3a..9d3e77000 100644 --- a/app/widget/nodeparamview/nodeparamview.cpp +++ b/app/widget/nodeparamview/nodeparamview.cpp @@ -128,8 +128,6 @@ NodeParamView::NodeParamView(QWidget *parent) : // Set a default scale - FIXME: Hardcoded SetScale(120); - SetMaximumScale(TimeBasedView::kMaximumScale); - // Pickup on widget focus changes connect(qApp, &QApplication::focusChanged, diff --git a/app/widget/timebased/timescaledobject.cpp b/app/widget/timebased/timescaledobject.cpp index 93da7c171..85b154a48 100644 --- a/app/widget/timebased/timescaledobject.cpp +++ b/app/widget/timebased/timescaledobject.cpp @@ -23,19 +23,17 @@ #include #include +#include "audio/audiovisualwaveform.h" #include "common/clamp.h" namespace olive { -// Keep this aligned with the kMaximumSampleRate in AudioVisualWaveform -const double TimeScaledObject::kMaximumScale = 1024; - const int TimeScaledObject::kCalculateDimensionsPadding = 10; TimeScaledObject::TimeScaledObject() : scale_(1.0), min_scale_(0), - max_scale_(kMaximumScale) + max_scale_(AudioVisualWaveform::kMaximumSampleRate.toDouble()) { } diff --git a/app/widget/timebased/timescaledobject.h b/app/widget/timebased/timescaledobject.h index cf734fb60..8c858c8fc 100644 --- a/app/widget/timebased/timescaledobject.h +++ b/app/widget/timebased/timescaledobject.h @@ -44,6 +44,7 @@ public: static rational SceneToTime(const double &x, const double& x_scale, const rational& timebase, bool round = false); const double& GetScale() const; + const double &GetMaximumScale() const { return max_scale_; } void SetScale(const double& scale); @@ -54,8 +55,6 @@ public: double TimeToScene(const rational& time) const; rational SceneToTime(const double &x, bool round = false) const; - static const double kMaximumScale; - protected: virtual void TimebaseChangedEvent(const rational&){} diff --git a/app/widget/timelinewidget/tool/zoom.cpp b/app/widget/timelinewidget/tool/zoom.cpp index 60f85594f..9b6731fe2 100644 --- a/app/widget/timelinewidget/tool/zoom.cpp +++ b/app/widget/timelinewidget/tool/zoom.cpp @@ -68,7 +68,7 @@ void ZoomTool::MouseRelease(TimelineViewMouseEvent *event) // Normalize scale to 1.0 scale double scene_width = (scene_right - scene_left) / parent()->GetScale(); - double new_scale = qMin(TimeBasedView::kMaximumScale, static_cast(reference_view->viewport()->width()) / scene_width); + double new_scale = qMin(parent()->GetFirstTimelineView()->GetMaximumScale(), static_cast(reference_view->viewport()->width()) / scene_width); parent()->SetScale(new_scale);