FFT требует, чтобы размер вашего буфера был степенью двойки, но чтобы обойти это, вы должны просто реализовать внутренний буфер и работать с ним вместо этого. Так, например:
// MyNiftyPlugin.h
#define MY_NUM_CHANNELS 2
#define MY_FFT_BUFFER_SIZE 1024
class MyNiftyPlugin : public AudioEffectX {
// ... stuff ...
private:
float internalBuffer[MY_NUM_CHANNELS][MY_FFT_BUFFER_SIZE];
long internalBufferIndex;
};
А потом в вашем цикле процесса:
// MyNiftyPlugin.cpp
void process(float **input, float **output, long sampleFrames) {
for(int frame = 0; frame < sampleFrames; ++frame) {
for(int channel = 0; channel < MY_NUM_CHANNELS; ++channel) {
internalBuffer[channel][internalBufferIndex] = inputs[channel][frame];
}
if(++internalBufferIndex > MY_FFT_BUFFER_SIZE) {
doFftStuff(...);
internalBufferIndex = 0;
}
}
}
Это приведет к некоторой задержке в вашем плагине, но повышение производительности, которого вы можете достичь, зная размер буфера для FFT во время компиляции, делает его стоящим.
Кроме того, это хороший обходной путь для хостов, таких как FL Studio (также называемых "Fruity Loops"), которые, как известно, каждый раз вызывают process () с разными размерами блоков.