diff --git a/source/SoundTouch/FIRFilter.cpp b/source/SoundTouch/FIRFilter.cpp index 5cc774f..54e2047 100644 --- a/source/SoundTouch/FIRFilter.cpp +++ b/source/SoundTouch/FIRFilter.cpp @@ -61,12 +61,15 @@ FIRFilter::FIRFilter() length = 0; lengthDiv8 = 0; filterCoeffs = NULL; + sum = NULL; + sumsize = 0; } FIRFilter::~FIRFilter() { delete[] filterCoeffs; + delete[] sum; } // Usual C-version of the filter routine for stereo sound @@ -167,10 +170,18 @@ uint FIRFilter::evaluateFilterMono(SAMPLETYPE *dest, const SAMPLETYPE *src, uint } -uint FIRFilter::evaluateFilterMulti(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples, uint numChannels) const +uint FIRFilter::evaluateFilterMulti(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples, uint numChannels) { uint i, j, end, c; - LONG_SAMPLETYPE *sum=(LONG_SAMPLETYPE*)alloca(numChannels*sizeof(*sum)); + + if (sumsize < numChannels) + { + // allocate large enough array for keeping sums + sumsize = numChannels; + delete[] sum; + sum = new LONG_SAMPLETYPE[numChannels]; + } + #ifdef SOUNDTOUCH_FLOAT_SAMPLES // when using floating point samples, use a scaler instead of a divider // because division is much slower operation than multiplying. @@ -253,7 +264,7 @@ uint FIRFilter::getLength() const // // Note : The amount of outputted samples is by value of 'filter_length' // smaller than the amount of input samples. -uint FIRFilter::evaluate(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples, uint numChannels) const +uint FIRFilter::evaluate(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples, uint numChannels) { assert(length > 0); assert(lengthDiv8 * 8 == length); diff --git a/source/SoundTouch/FIRFilter.h b/source/SoundTouch/FIRFilter.h index 622b9c4..6c213a6 100644 --- a/source/SoundTouch/FIRFilter.h +++ b/source/SoundTouch/FIRFilter.h @@ -65,13 +65,17 @@ protected: // Memory for filter coefficients SAMPLETYPE *filterCoeffs; + // Memory for keeping temporary sums in multichannel processing + LONG_SAMPLETYPE *sum; + uint sumsize; + virtual uint evaluateFilterStereo(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples) const; virtual uint evaluateFilterMono(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples) const; - virtual uint evaluateFilterMulti(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples, uint numChannels) const; + virtual uint evaluateFilterMulti(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples, uint numChannels); public: FIRFilter(); @@ -91,7 +95,7 @@ public: uint evaluate(SAMPLETYPE *dest, const SAMPLETYPE *src, uint numSamples, - uint numChannels) const; + uint numChannels); uint getLength() const; diff --git a/source/SoundTouch/SoundTouch.cpp b/source/SoundTouch/SoundTouch.cpp index ebca7ce..bbc46d7 100644 --- a/source/SoundTouch/SoundTouch.cpp +++ b/source/SoundTouch/SoundTouch.cpp @@ -348,8 +348,8 @@ void SoundTouch::flush() int i; int nUnprocessed; int nOut; - SAMPLETYPE *buff=(SAMPLETYPE*)alloca(64*channels*sizeof(SAMPLETYPE)); - + SAMPLETYPE *buff = new SAMPLETYPE[64 * channels]; + // check how many samples still await processing, and scale // that by tempo & rate to get expected output sample count nUnprocessed = numUnprocessedSamples(); @@ -378,6 +378,8 @@ void SoundTouch::flush() } } + delete[] buff; + // Clear working buffers pRateTransposer->clear(); pTDStretch->clearInput();