Merge pull request #1307 from diizy/model

Add a method to AutomatableModel that allows tracking changes without using signals/slots
This commit is contained in:
Vesa V
2014-11-16 14:54:38 +02:00
6 changed files with 65 additions and 42 deletions

View File

@@ -25,7 +25,7 @@
#ifndef AUTOMATABLE_MODEL_H
#define AUTOMATABLE_MODEL_H
#include <math.h>
#include "lmms_math.h"
#include "JournallingObject.h"
#include "Model.h"
@@ -70,7 +70,8 @@ public:
enum ScaleType
{
Linear,
Logarithmic
Logarithmic,
Decibel
};
enum DataType
@@ -239,6 +240,19 @@ 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 )
{
m_valueChanged = false;
return true;
}
return false;
}
float globalAutomationValueAt( const MidiTime& time );
public slots:
@@ -288,6 +302,8 @@ private:
float m_step;
float m_range;
float m_centerValue;
bool m_valueChanged;
// most objects will need this temporarily (until sampleExact is
// standard)

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

View File

@@ -47,6 +47,7 @@ AutomatableModel::AutomatableModel( DataType type,
m_step( step ),
m_range( max - min ),
m_centerValue( m_minValue ),
m_valueChanged( false ),
m_setValueDepth( 0 ),
m_hasLinkedModels( false ),
m_controllerConnection( NULL )
@@ -234,6 +235,7 @@ void AutomatableModel::setValue( const float value )
(*it)->setJournalling( journalling );
}
}
m_valueChanged = true;
emit dataChanged();
}
else
@@ -327,6 +329,7 @@ void AutomatableModel::setAutomatedValue( const float value )
(*it)->setAutomatedValue( value );
}
}
m_valueChanged = true;
emit dataChanged();
}
--m_setValueDepth;
@@ -471,6 +474,7 @@ void AutomatableModel::setControllerConnection( ControllerConnection* c )
{
QObject::connect( m_controllerConnection, SIGNAL( valueChanged() ), this, SIGNAL( dataChanged() ) );
QObject::connect( m_controllerConnection, SIGNAL( destroyed() ), this, SLOT( unlinkControllerConnection() ) );
m_valueChanged = true;
emit dataChanged();
}
}