diff --git a/plugins/BassBooster/BassBooster.cpp b/plugins/BassBooster/BassBooster.cpp index d75fa2c66..54fa9e98e 100644 --- a/plugins/BassBooster/BassBooster.cpp +++ b/plugins/BassBooster/BassBooster.cpp @@ -83,18 +83,45 @@ bool BassBoosterEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames if( m_bbControls.m_gainModel.isValueChanged() ) { changeGain(); } if( m_bbControls.m_ratioModel.isValueChanged() ) { changeRatio(); } + float gain = m_bbControls.m_gainModel.value(); + ValueBuffer *gainBuffer = m_bbControls.m_gainModel.valueBuffer(); + int gainInc = gainBuffer ? 1 : 0; + float *gainPtr = gainBuffer ? &( gainBuffer->values()[ 0 ] ) : &gain; + double outSum = 0.0; const float d = dryLevel(); const float w = wetLevel(); - for( fpp_t f = 0; f < frames; ++f ) + if( gainBuffer ) { - outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1]; + //process period using sample exact data + for( fpp_t f = 0; f < frames; ++f ) + { + m_bbFX.leftFX().setGain( *gainPtr ); + m_bbFX.rightFX().setGain( *gainPtr ); + outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1]; - sample_t s[2] = { buf[f][0], buf[f][1] }; - m_bbFX.nextSample( s[0], s[1] ); + sample_t s[2] = { buf[f][0], buf[f][1] }; + m_bbFX.nextSample( s[0], s[1] ); - buf[f][0] = d * buf[f][0] + w * s[0]; - buf[f][1] = d * buf[f][1] + w * s[1]; + buf[f][0] = d * buf[f][0] + w * s[0]; + buf[f][1] = d * buf[f][1] + w * s[1]; + gainPtr += gainInc; + } + } else + { + //process period without sample exact data + m_bbFX.leftFX().setGain( *gainPtr ); + m_bbFX.rightFX().setGain( *gainPtr ); + for( fpp_t f = 0; f < frames; ++f ) + { + outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1]; + + sample_t s[2] = { buf[f][0], buf[f][1] }; + m_bbFX.nextSample( s[0], s[1] ); + + buf[f][0] = d * buf[f][0] + w * s[0]; + buf[f][1] = d * buf[f][1] + w * s[1]; + } } checkGate( outSum / frames );