diff options
Diffstat (limited to 'intern/audaspace/FX/AUD_EnvelopeFactory.cpp')
-rw-r--r-- | intern/audaspace/FX/AUD_EnvelopeFactory.cpp | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/intern/audaspace/FX/AUD_EnvelopeFactory.cpp b/intern/audaspace/FX/AUD_EnvelopeFactory.cpp index 1c625067f1c..4777da70404 100644 --- a/intern/audaspace/FX/AUD_EnvelopeFactory.cpp +++ b/intern/audaspace/FX/AUD_EnvelopeFactory.cpp @@ -24,7 +24,31 @@ */ #include "AUD_EnvelopeFactory.h" -#include "AUD_EnvelopeReader.h" +#include "AUD_CallbackIIRFilterReader.h" + +#include <cmath> + +struct EnvelopeParameters +{ + float attack; + float release; + float threshold; + float arthreshold; +}; + +sample_t envelopeFilter(AUD_CallbackIIRFilterReader* reader, EnvelopeParameters* param) +{ + float in = fabs(reader->x(0)); + float out = reader->y(-1); + if(in < param->threshold) + in = 0.0f; + return (in > out ? param->attack : param->release) * (out - in) + in; +} + +void endEnvelopeFilter(EnvelopeParameters* param) +{ + delete param; +} AUD_EnvelopeFactory::AUD_EnvelopeFactory(AUD_IFactory* factory, float attack, float release, float threshold, @@ -39,6 +63,16 @@ AUD_EnvelopeFactory::AUD_EnvelopeFactory(AUD_IFactory* factory, float attack, AUD_IReader* AUD_EnvelopeFactory::createReader() const { - return new AUD_EnvelopeReader(getReader(), m_attack, m_release, m_threshold, - m_arthreshold); + AUD_IReader* reader = getReader(); + + EnvelopeParameters* param = new EnvelopeParameters(); + param->arthreshold = m_arthreshold; + param->attack = pow(m_arthreshold, 1.0f/(reader->getSpecs().rate * m_attack)); + param->release = pow(m_arthreshold, 1.0f/(reader->getSpecs().rate * m_release)); + param->threshold = m_threshold; + + return new AUD_CallbackIIRFilterReader(reader, 1, 2, + (doFilterIIR) envelopeFilter, + (endFilterIIR) endEnvelopeFilter, + param); } |