diff --git a/src/engine/audio/Audio_WavFile.cpp b/src/engine/audio/Audio_WavFile.cpp index 63e030a5..54d6f840 100644 --- a/src/engine/audio/Audio_WavFile.cpp +++ b/src/engine/audio/Audio_WavFile.cpp @@ -207,7 +207,13 @@ size_t WavFileReader::read(short* buffer, size_t samples) // Get number of samples that must be read from source file size_t requiredBytes = mResampler.getSourceLength(samples) * mChannels * mBits / 8; - void* temp = alloca(requiredBytes); + bool useHeap = requiredBytes > sizeof mTempBuffer; + void* temp; + if (useHeap) + temp = malloc(requiredBytes); + else + temp = mTempBuffer; + memset(temp, 0, requiredBytes); // Find required size of input buffer @@ -226,6 +232,8 @@ size_t WavFileReader::read(short* buffer, size_t samples) size_t result = mResampler.processBuffer(temp, readBytes, processedBytes, buffer, samples * 2 * AUDIO_CHANNELS); + if (useHeap) + free(temp); return result / 2 / AUDIO_CHANNELS; } diff --git a/src/engine/audio/Audio_WavFile.h b/src/engine/audio/Audio_WavFile.h index 9eae3877..4d342241 100644 --- a/src/engine/audio/Audio_WavFile.h +++ b/src/engine/audio/Audio_WavFile.h @@ -32,6 +32,7 @@ protected: Resampler mResampler; unsigned mLastError = 0; std::unique_ptr mInput; + uint8_t mTempBuffer[16384]; std::string readChunk(); void readBuffer(void* buffer, size_t sz); // This raises an exception if sz bytes are not read