From 3f1d42028fe7dd5c238346b226344a4be7451e72 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Wed, 17 Jun 2020 18:46:26 +0200 Subject: [PATCH] Ensure to pass FFT an even-sized buffer --- src/sfizz/AudioBuffer.h | 4 +++- src/sfizz/Wavetables.cpp | 8 ++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/sfizz/AudioBuffer.h b/src/sfizz/AudioBuffer.h index 0c47ba0a..4c104e35 100644 --- a/src/sfizz/AudioBuffer.h +++ b/src/sfizz/AudioBuffer.h @@ -28,7 +28,7 @@ namespace sfz */ template + size_t PaddingLeft_ = 0, size_t PaddingRight_ = 0> class AudioBuffer { public: using value_type = typename std::remove_cv::type; @@ -40,6 +40,8 @@ public: enum { //! Increased left padding to preserve required alignment PaddingLeft = PaddingLeft_ + (Alignment - (PaddingLeft_ % Alignment)) % Alignment, + //! Padding to the right + PaddingRight = PaddingRight_, //! Total padding left and right PaddingTotal = PaddingLeft + PaddingRight, }; diff --git a/src/sfizz/Wavetables.cpp b/src/sfizz/Wavetables.cpp index c1a4448b..e8995b69 100644 --- a/src/sfizz/Wavetables.cpp +++ b/src/sfizz/Wavetables.cpp @@ -7,6 +7,7 @@ #include "Wavetables.h" #include "FilePool.h" #include "MathHelpers.h" +#include "absl/meta/type_traits.h" #include namespace sfz { @@ -373,6 +374,13 @@ bool WavetablePool::createFileWave(FilePool& filePool, const std::string& filena DBG("[sfizz] Only the first channel of " << filename << " will be used to create the wavetable"); auto audioData = fileHandle->preloadedData->getConstSpan(0); + + // an even size is required for FFT + static_assert(absl::remove_reference_tpreloadedData)>::PaddingRight > 0, + "Right padding is required on the audio file buffer"); + if (audioData.size() & 1) + audioData = absl::MakeConstSpan(audioData.data(), audioData.size() + 1); + size_t fftSize = audioData.size(); size_t specSize = fftSize / 2 + 1;