Modify BassBooster to show how to replace signals/slots in DSP

This commit is contained in:
Vesa
2014-11-16 14:51:50 +02:00
parent 3e19bc8ddb
commit f8c618b0ed
5 changed files with 47 additions and 40 deletions

View File

@@ -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 );

View File

@@ -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() );
}

View File

@@ -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<DspEffectLibrary::FastBassBoost> m_bbFX;
BassBoosterControls m_bbControls;

View File

@@ -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" );

View File

@@ -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