Merge pull request #279 from jpcima/fft-odd-fix

Ensure to pass FFT an even-sized buffer
This commit is contained in:
JP Cimalando 2020-06-17 19:43:46 +02:00 committed by GitHub
commit d365c6953c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 1 deletions

View file

@ -28,7 +28,7 @@ namespace sfz
*/
template <class Type, size_t MaxChannels = sfz::config::numChannels,
unsigned int Alignment = SIMDConfig::defaultAlignment,
size_t PaddingLeft_ = 0, size_t PaddingRight = 0>
size_t PaddingLeft_ = 0, size_t PaddingRight_ = 0>
class AudioBuffer {
public:
using value_type = typename std::remove_cv<Type>::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,
};

View file

@ -7,6 +7,7 @@
#include "Wavetables.h"
#include "FilePool.h"
#include "MathHelpers.h"
#include "absl/meta/type_traits.h"
#include <kiss_fftr.h>
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_t<decltype(*fileHandle->preloadedData)>::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;