FFT要求您的缓冲区大小是2的幂,但是要解决这个问题,您应该只实现一个内部缓冲区并使用它。例如:
#define MY_NUM_CHANNELS 2
#define MY_FFT_BUFFER_SIZE 1024
class MyNiftyPlugin : public AudioEffectX {
private:
float internalBuffer[MY_NUM_CHANNELS][MY_FFT_BUFFER_SIZE];
long internalBufferIndex;
};
然后在流程循环中:
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(也称为“果味循环”)这样的主机来说,这也是一个很好的解决方法,这些主机每次都使用不同的块大小调用process()。