From 6a882370a6c967d812eb730e53b1bac4c244b697 Mon Sep 17 00:00:00 2001 From: Mark Furneaux Date: Mon, 12 May 2014 18:15:00 -0400 Subject: [PATCH 1/2] Fix block analyzer framerate Block analyzer uses an internal variable m_step to determine how long to hold a bar up. This is dependant on framerate, however it is only set on creation or resize of the analyzer. This patch changes this value whenever the framerate is changed, preventing the analyzer from appearing wildly fast or extremely slow until a restart. --- src/analyzers/analyzercontainer.cpp | 5 +++++ src/analyzers/blockanalyzer.cpp | 4 +++- src/analyzers/blockanalyzer.h | 3 ++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/analyzers/analyzercontainer.cpp b/src/analyzers/analyzercontainer.cpp index e6bd00ec1..4289c5555 100644 --- a/src/analyzers/analyzercontainer.cpp +++ b/src/analyzers/analyzercontainer.cpp @@ -165,6 +165,11 @@ void AnalyzerContainer::ChangeFramerate(int new_framerate) { // Even if it is not supposed to happen, I don't want to get a dbz error new_framerate = new_framerate == 0 ? kMediumFramerate : new_framerate; current_analyzer_->changeTimeout(1000 / new_framerate); + + // the BlockAnalyzer needs to know when the framerate changes + if (strcmp(current_analyzer_->metaObject()->className(), "BlockAnalyzer") == 0) { + qobject_cast(current_analyzer_)->determineStep(); + } } SaveFramerate(new_framerate); } diff --git a/src/analyzers/blockanalyzer.cpp b/src/analyzers/blockanalyzer.cpp index 6b4d630f4..da2cf9b08 100644 --- a/src/analyzers/blockanalyzer.cpp +++ b/src/analyzers/blockanalyzer.cpp @@ -100,7 +100,9 @@ void BlockAnalyzer::determineStep() { // boxes/blocks of pixels) // I calculated the value 30 based on some trial and error - const double fallTime = 30 * m_rows; + // the fall time of 30 is too slow on framerates above 50fps + const double fallTime = timeout() < 20 ? 20 * m_rows : 30 * m_rows; + m_step = double(m_rows * timeout()) / fallTime; } diff --git a/src/analyzers/blockanalyzer.h b/src/analyzers/blockanalyzer.h index d6c6d4ac9..ab4372e58 100644 --- a/src/analyzers/blockanalyzer.h +++ b/src/analyzers/blockanalyzer.h @@ -31,6 +31,8 @@ class BlockAnalyzer : public Analyzer::Base { static const char* kName; + void determineStep(); + protected: virtual void transform(Scope&); virtual void analyze(QPainter& p, const Scope&, bool new_frame); @@ -38,7 +40,6 @@ class BlockAnalyzer : public Analyzer::Base { virtual void paletteChange(const QPalette&); void drawBackground(); - void determineStep(); private: QPixmap* bar() { return &m_barPixmap; } From 542dbe8d124faaa01de2c652676ff64be83f2282 Mon Sep 17 00:00:00 2001 From: Mark Furneaux Date: Tue, 13 May 2014 16:43:46 -0400 Subject: [PATCH 2/2] Make framerate notification less nasty Now uses a virtual function in Analyser::Base to notify any analyser which whishes to listen --- src/analyzers/analyzerbase.h | 2 ++ src/analyzers/analyzercontainer.cpp | 6 ++---- src/analyzers/blockanalyzer.cpp | 4 ++++ src/analyzers/blockanalyzer.h | 4 ++-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/analyzers/analyzerbase.h b/src/analyzers/analyzerbase.h index 1bc3bd90b..0bd554482 100755 --- a/src/analyzers/analyzerbase.h +++ b/src/analyzers/analyzerbase.h @@ -50,6 +50,8 @@ class Base : public QWidget { } } + virtual void framerateChanged() {} + protected: Base(QWidget*, uint scopeSize = 7); diff --git a/src/analyzers/analyzercontainer.cpp b/src/analyzers/analyzercontainer.cpp index 4289c5555..c7da4c9e9 100644 --- a/src/analyzers/analyzercontainer.cpp +++ b/src/analyzers/analyzercontainer.cpp @@ -166,10 +166,8 @@ void AnalyzerContainer::ChangeFramerate(int new_framerate) { new_framerate = new_framerate == 0 ? kMediumFramerate : new_framerate; current_analyzer_->changeTimeout(1000 / new_framerate); - // the BlockAnalyzer needs to know when the framerate changes - if (strcmp(current_analyzer_->metaObject()->className(), "BlockAnalyzer") == 0) { - qobject_cast(current_analyzer_)->determineStep(); - } + // notify the current analyzer that the framerate has changed + current_analyzer_->framerateChanged(); } SaveFramerate(new_framerate); } diff --git a/src/analyzers/blockanalyzer.cpp b/src/analyzers/blockanalyzer.cpp index da2cf9b08..eb4cc2e77 100644 --- a/src/analyzers/blockanalyzer.cpp +++ b/src/analyzers/blockanalyzer.cpp @@ -106,6 +106,10 @@ void BlockAnalyzer::determineStep() { m_step = double(m_rows * timeout()) / fallTime; } +void BlockAnalyzer::framerateChanged() { // virtual + determineStep(); +} + void BlockAnalyzer::transform(Analyzer::Scope& s) // pure virtual { for (uint x = 0; x < s.size(); ++x) s[x] *= 2; diff --git a/src/analyzers/blockanalyzer.h b/src/analyzers/blockanalyzer.h index ab4372e58..ca047922a 100644 --- a/src/analyzers/blockanalyzer.h +++ b/src/analyzers/blockanalyzer.h @@ -31,15 +31,15 @@ class BlockAnalyzer : public Analyzer::Base { static const char* kName; - void determineStep(); - protected: virtual void transform(Scope&); virtual void analyze(QPainter& p, const Scope&, bool new_frame); virtual void resizeEvent(QResizeEvent*); virtual void paletteChange(const QPalette&); + virtual void framerateChanged(); void drawBackground(); + void determineStep(); private: QPixmap* bar() { return &m_barPixmap; }