From f8c618b0edaca3bf0b1106ca4350cfdf79cf047a Mon Sep 17 00:00:00 2001 From: Vesa Date: Sun, 16 Nov 2014 14:51:50 +0200 Subject: [PATCH] Modify BassBooster to show how to replace signals/slots in DSP --- include/AutomatableModel.h | 4 +++ plugins/BassBooster/BassBooster.cpp | 33 +++++++++++++++++++++ plugins/BassBooster/BassBooster.h | 8 +++-- plugins/BassBooster/BassBoosterControls.cpp | 33 +-------------------- plugins/BassBooster/BassBoosterControls.h | 9 ++---- 5 files changed, 47 insertions(+), 40 deletions(-) diff --git a/include/AutomatableModel.h b/include/AutomatableModel.h index e8acac390..27c40ef82 100644 --- a/include/AutomatableModel.h +++ b/include/AutomatableModel.h @@ -240,6 +240,9 @@ public: return m_hasLinkedModels; } + // a way to track changed values in the model and avoid using signals/slots - useful for speed-critical code. + // note that this method should only be called once per period since it resets the state of the variable - so if your model + // has to be accessed by more than one object, then this function shouldn't be used. bool isValueChanged() { if( m_valueChanged ) @@ -247,6 +250,7 @@ public: m_valueChanged = false; return true; } + return false; } float globalAutomationValueAt( const MidiTime& time ); diff --git a/plugins/BassBooster/BassBooster.cpp b/plugins/BassBooster/BassBooster.cpp index dbbde8ff0..38a9bced3 100644 --- a/plugins/BassBooster/BassBooster.cpp +++ b/plugins/BassBooster/BassBooster.cpp @@ -52,6 +52,9 @@ BassBoosterEffect::BassBoosterEffect( Model* parent, const Descriptor::SubPlugin m_bbFX( DspEffectLibrary::FastBassBoost( 70.0f, 1.0f, 2.8f ) ), m_bbControls( this ) { + changeFrequency(); + changeGain(); + changeRatio(); } @@ -70,6 +73,10 @@ bool BassBoosterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames { return( false ); } + // check out changed controls + if( m_bbControls.m_freqModel.isValueChanged() ) { changeFrequency(); } + if( m_bbControls.m_gainModel.isValueChanged() ) { changeGain(); } + if( m_bbControls.m_ratioModel.isValueChanged() ) { changeRatio(); } double outSum = 0.0; const float d = dryLevel(); @@ -91,6 +98,32 @@ bool BassBoosterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames } +inline void BassBoosterEffect::changeFrequency() +{ + const sample_t fac = engine::mixer()->processingSampleRate() / 44100.0f; + + m_bbFX.leftFX().setFrequency( m_bbControls.m_freqModel.value() * fac ); + m_bbFX.rightFX().setFrequency( m_bbControls.m_freqModel.value() * fac ); +} + + + + +inline void BassBoosterEffect::changeGain() +{ + m_bbFX.leftFX().setGain( m_bbControls.m_gainModel.value() ); + m_bbFX.rightFX().setGain( m_bbControls.m_gainModel.value() ); +} + + + + +inline void BassBoosterEffect::changeRatio() +{ + m_bbFX.leftFX().setRatio( m_bbControls.m_ratioModel.value() ); + m_bbFX.rightFX().setRatio( m_bbControls.m_ratioModel.value() ); +} + diff --git a/plugins/BassBooster/BassBooster.h b/plugins/BassBooster/BassBooster.h index b52302465..ad7c6c457 100644 --- a/plugins/BassBooster/BassBooster.h +++ b/plugins/BassBooster/BassBooster.h @@ -23,8 +23,8 @@ */ -#ifndef _BASS_BOOSTER_H -#define _BASS_BOOSTER_H +#ifndef BASS_BOOSTER_H +#define BASS_BOOSTER_H #include "Effect.h" #include "DspEffectLibrary.h" @@ -45,6 +45,10 @@ public: private: + void changeFrequency(); + void changeGain(); + void changeRatio(); + DspEffectLibrary::MonoToStereoAdaptor m_bbFX; BassBoosterControls m_bbControls; diff --git a/plugins/BassBooster/BassBoosterControls.cpp b/plugins/BassBooster/BassBoosterControls.cpp index ea8614143..28d1a8f83 100644 --- a/plugins/BassBooster/BassBoosterControls.cpp +++ b/plugins/BassBooster/BassBoosterControls.cpp @@ -37,48 +37,17 @@ BassBoosterControls::BassBoosterControls( BassBoosterEffect* effect ) : m_gainModel( 1.0f, 0.1f, 5.0f, 0.05f, this, tr( "Gain" ) ), m_ratioModel( 2.0f, 0.1f, 10.0f, 0.1f, this, tr( "Ratio" ) ) { - connect( &m_freqModel, SIGNAL( dataChanged() ), this, SLOT( changeFrequency() ) ); - connect( &m_gainModel, SIGNAL( dataChanged() ), this, SLOT( changeGain() ) ); - connect( &m_ratioModel, SIGNAL( dataChanged() ), this, SLOT( changeRatio() ) ); connect( engine::mixer(), SIGNAL( sampleRateChanged() ), this, SLOT( changeFrequency() ) ); - - changeFrequency(); - changeGain(); - changeRatio(); } - - void BassBoosterControls::changeFrequency() { - const sample_t fac = engine::mixer()->processingSampleRate() / 44100.0f; - - m_effect->m_bbFX.leftFX().setFrequency( m_freqModel.value() * fac ); - m_effect->m_bbFX.rightFX().setFrequency( m_freqModel.value() * fac ); + m_effect->changeFrequency(); } - -void BassBoosterControls::changeGain() -{ - m_effect->m_bbFX.leftFX().setGain( m_gainModel.value() ); - m_effect->m_bbFX.rightFX().setGain( m_gainModel.value() ); -} - - - - -void BassBoosterControls::changeRatio() -{ - m_effect->m_bbFX.leftFX().setRatio( m_ratioModel.value() ); - m_effect->m_bbFX.rightFX().setRatio( m_ratioModel.value() ); -} - - - - void BassBoosterControls::loadSettings( const QDomElement& _this ) { m_freqModel.loadSettings( _this, "freq" ); diff --git a/plugins/BassBooster/BassBoosterControls.h b/plugins/BassBooster/BassBoosterControls.h index b26a31e18..5df888bc1 100644 --- a/plugins/BassBooster/BassBoosterControls.h +++ b/plugins/BassBooster/BassBoosterControls.h @@ -22,8 +22,8 @@ * */ -#ifndef _BASSBOOSTER_CONTROLS_H -#define _BASSBOOSTER_CONTROLS_H +#ifndef BASSBOOSTER_CONTROLS_H +#define BASSBOOSTER_CONTROLS_H #include "EffectControls.h" #include "BassBoosterControlDialog.h" @@ -62,9 +62,6 @@ public: private slots: void changeFrequency(); - void changeGain(); - void changeRatio(); - private: BassBoosterEffect* m_effect; @@ -73,7 +70,7 @@ private: FloatModel m_ratioModel; friend class BassBoosterControlDialog; - + friend class BassBoosterEffect; } ; #endif