From 59233f51927efbac37d31bd8bb89fd6c6827054a Mon Sep 17 00:00:00 2001 From: John Maguire Date: Fri, 20 Aug 2010 12:14:43 +0000 Subject: [PATCH] Disable FFT when no analyzer in use. --- src/analyzers/analyzercontainer.cpp | 14 +++++++++++++- src/engines/enginebase.h | 2 ++ src/engines/gstengine.cpp | 13 +++++++++++-- src/engines/gstengine.h | 4 ++++ src/engines/gstenginepipeline.cpp | 8 +++++++- src/engines/gstenginepipeline.h | 2 ++ 6 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/analyzers/analyzercontainer.cpp b/src/analyzers/analyzercontainer.cpp index f1c67c22e..611c55c6a 100644 --- a/src/analyzers/analyzercontainer.cpp +++ b/src/analyzers/analyzercontainer.cpp @@ -15,10 +15,11 @@ */ #include "analyzercontainer.h" -#include "glblockanalyzer.h" #include "baranalyzer.h" #include "blockanalyzer.h" #include "boomanalyzer.h" +#include "engines/enginebase.h" +#include "glblockanalyzer.h" #include "sonogram.h" #include "turbine.h" @@ -104,12 +105,19 @@ void AnalyzerContainer::SetEngine(EngineBase *engine) { if (current_analyzer_) QMetaObject::invokeMethod(current_analyzer_, "set_engine", Qt::DirectConnection, Q_ARG(Engine::Base*, engine)); engine_ = engine; + if (engine_) { + engine_->SetSpectrum(current_analyzer_); + } } void AnalyzerContainer::DisableAnalyzer() { delete current_analyzer_; current_analyzer_ = NULL; + if (engine_) { + engine_->SetSpectrum(false); + } + Save(); } @@ -130,6 +138,10 @@ void AnalyzerContainer::ChangeAnalyzer(int id) { layout()->addWidget(current_analyzer_); + if (engine_) { + engine_->SetSpectrum(true); + } + Save(); } diff --git a/src/engines/enginebase.h b/src/engines/enginebase.h index c98daabc4..f6f3c8d50 100644 --- a/src/engines/enginebase.h +++ b/src/engines/enginebase.h @@ -71,6 +71,8 @@ class Base : public QObject, boost::noncopyable { bool is_crossfade_enabled() const { return crossfade_enabled_; } bool is_autocrossfade_enabled() const { return autocrossfade_enabled_; } + virtual void SetSpectrum(bool) {} + static const char* kSettingsGroup; static const int kScopeSize = 1024; diff --git a/src/engines/gstengine.cpp b/src/engines/gstengine.cpp index 81386d3ea..8f413ead9 100644 --- a/src/engines/gstengine.cpp +++ b/src/engines/gstengine.cpp @@ -74,7 +74,8 @@ GstEngine::GstEngine() rg_compression_(true), seek_timer_(new QTimer(this)), timer_id_(-1), - next_element_id_(0) + next_element_id_(0), + spectrum_enabled_(false) { seek_timer_->setSingleShot(true); seek_timer_->setInterval(kSeekDelay); @@ -468,7 +469,6 @@ bool GstEngine::Load(const QUrl& url, Engine::TrackChangeType change) { current_pipeline_ = pipeline; preload_pipeline_.reset(); - qDebug() << current_pipeline_.get(); connect(current_pipeline_.get(), SIGNAL(SpectrumAvailable(const QVector&)), this, SIGNAL(SpectrumAvailable(const QVector&))); @@ -537,6 +537,8 @@ void GstEngine::PlayDone() { Seek(watcher->data()); } + SetSpectrum(spectrum_enabled_); + emit StateChanged(Engine::Playing); } @@ -857,3 +859,10 @@ int GstEngine::AllGloryToTheHypnotoad() { pipeline->SetVolume(5); // Hypnotoad is *loud*. return AddBackgroundStream(pipeline); } + +void GstEngine::SetSpectrum(bool enable) { + spectrum_enabled_ = enable; + if (current_pipeline_) { + current_pipeline_->SetSpectrum(enable); + } +} diff --git a/src/engines/gstengine.h b/src/engines/gstengine.h index b17e73c34..70a896df0 100644 --- a/src/engines/gstengine.h +++ b/src/engines/gstengine.h @@ -103,6 +103,8 @@ class GstEngine : public Engine::Base, public BufferConsumer { void AddBufferConsumer(BufferConsumer* consumer); void RemoveBufferConsumer(BufferConsumer* consumer); + void SetSpectrum(bool enable); + protected: void SetVolumeSW(uint percent); void timerEvent(QTimerEvent*); @@ -184,6 +186,8 @@ class GstEngine : public Engine::Base, public BufferConsumer { int next_element_id_; QHash > background_streams_; + + bool spectrum_enabled_; }; diff --git a/src/engines/gstenginepipeline.cpp b/src/engines/gstenginepipeline.cpp index 5c00bcaf3..5d087811d 100644 --- a/src/engines/gstenginepipeline.cpp +++ b/src/engines/gstenginepipeline.cpp @@ -168,8 +168,8 @@ bool GstEnginePipeline::Init() { g_object_set(G_OBJECT(spectrum_), "bands", kSpectrumBands, "threshold", kSpectrumThreshold, - "interval", kSpectrumIntervalns, NULL); + SetSpectrum(false); // Spectrum disabled by default. GstPad* pad = gst_element_get_pad(audioconvert_, "sink"); gst_element_add_pad(audiobin_, gst_ghost_pad_new("sink", pad)); @@ -604,3 +604,9 @@ void GstEnginePipeline::RemoveAllBufferConsumers() { QMutexLocker l(&buffer_consumers_mutex_); buffer_consumers_.clear(); } + +void GstEnginePipeline::SetSpectrum(bool enable) { + g_object_set(spectrum_, + "interval", enable ? kSpectrumIntervalns : std::numeric_limits::max(), + NULL); +} diff --git a/src/engines/gstenginepipeline.h b/src/engines/gstenginepipeline.h index f5b186494..c4afce1f5 100644 --- a/src/engines/gstenginepipeline.h +++ b/src/engines/gstenginepipeline.h @@ -78,6 +78,8 @@ class GstEnginePipeline : public QObject { QUrl redirect_url() const { return redirect_url_; } + void SetSpectrum(bool enable); + public slots: void SetVolumeModifier(qreal mod);