| 76 | |
| 77 | |
| 78 | bool 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 ] ) : &litude; |
| 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; |
nothing calls this directly
no test coverage detected