MCPcopy Create free account
hub / github.com/LMMS/lmms / processAudioBuffer

Method processAudioBuffer

plugins/Delay/DelayEffect.cpp:78–145  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

76
77
78bool DelayEffect::processAudioBuffer( sampleFrame* buf, const fpp_t frames )
79{
80 if( !isEnabled() || !isRunning () )
81 {
82 return( false );
83 }
84 double outSum = 0.0;
85 const float sr = Engine::mixer()->processingSampleRate();
86 const float d = dryLevel();
87 const float w = wetLevel();
88 sample_t dryS[2];
89 float lPeak = 0.0;
90 float rPeak = 0.0;
91 float length = m_delayControls.m_delayTimeModel.value();
92 float amplitude = m_delayControls.m_lfoAmountModel.value() * sr;
93 float lfoTime = 1.0 / m_delayControls.m_lfoTimeModel.value();
94 float feedback = m_delayControls.m_feedbackModel.value();
95 ValueBuffer *lengthBuffer = m_delayControls.m_delayTimeModel.valueBuffer();
96 ValueBuffer *feedbackBuffer = m_delayControls.m_feedbackModel.valueBuffer();
97 ValueBuffer *lfoTimeBuffer = m_delayControls.m_lfoTimeModel.valueBuffer();
98 ValueBuffer *lfoAmountBuffer = m_delayControls.m_lfoAmountModel.valueBuffer();
99 int lengthInc = lengthBuffer ? 1 : 0;
100 int amplitudeInc = lfoAmountBuffer ? 1 : 0;
101 int lfoTimeInc = lfoTimeBuffer ? 1 : 0;
102 int feedbackInc = feedbackBuffer ? 1 : 0;
103 float *lengthPtr = lengthBuffer ? &( lengthBuffer->values()[ 0 ] ) : &length;
104 float *amplitudePtr = lfoAmountBuffer ? &( lfoAmountBuffer->values()[ 0 ] ) : &amplitude;
105 float *lfoTimePtr = lfoTimeBuffer ? &( lfoTimeBuffer->values()[ 0 ] ) : &lfoTime;
106 float *feedbackPtr = feedbackBuffer ? &( feedbackBuffer->values()[ 0 ] ) : &feedback;
107
108 if( m_delayControls.m_outGainModel.isValueChanged() )
109 {
110 m_outGain = dbfsToAmp( m_delayControls.m_outGainModel.value() );
111 }
112 int sampleLength;
113 for( fpp_t f = 0; f < frames; ++f )
114 {
115 dryS[0] = buf[f][0];
116 dryS[1] = buf[f][1];
117
118 m_delay->setFeedback( *feedbackPtr );
119 m_lfo->setFrequency( *lfoTimePtr );
120 sampleLength = *lengthPtr * Engine::mixer()->processingSampleRate();
121 m_currentLength = sampleLength;
122 m_delay->setLength( m_currentLength + ( *amplitudePtr * ( float )m_lfo->tick() ) );
123 m_delay->tick( buf[f] );
124
125 buf[f][0] *= m_outGain;
126 buf[f][1] *= m_outGain;
127
128 lPeak = buf[f][0] > lPeak ? buf[f][0] : lPeak;
129 rPeak = buf[f][1] > rPeak ? buf[f][1] : rPeak;
130
131 buf[f][0] = ( d * dryS[0] ) + ( w * buf[f][0] );
132 buf[f][1] = ( d * dryS[1] ) + ( w * buf[f][1] );
133 outSum += buf[f][0]*buf[f][0] + buf[f][1]*buf[f][1];
134
135 lengthPtr += lengthInc;

Callers

nothing calls this directly

Calls 14

isEnabledFunction · 0.85
mixerFunction · 0.85
dryLevelFunction · 0.85
wetLevelFunction · 0.85
dbfsToAmpFunction · 0.85
processingSampleRateMethod · 0.80
valuesMethod · 0.80
isRunningFunction · 0.50
valueMethod · 0.45
valueBufferMethod · 0.45
setFeedbackMethod · 0.45
setFrequencyMethod · 0.45

Tested by

no test coverage detected