我正在尝试使用SourceDataLine
在我的应用程序中实时播放我创建的音频。使用SourceDataLine
打开sdl.open(format)
时,会创建一个32000(我的采样率)的默认缓冲区,因此有效一秒。但由于我的应用程序应该是低延迟,我尝试使用较小的缓冲区。 (sdl.open(format, buffer);
)
在生成声音时,我现在使用512个样本的缓冲区(没有找到最佳值,如果你有任何见解,我将不胜感激)
我算法的一些伪代码:
int pos = 0;
int max = 512;
byte sampleBuffer[] = new byte[max];
while(active) {
sampleBuffer[pos++] = generateSample(); // actually I generate doubles and make bytes out of em later, but who cares
if (pos == max) {
sdl.write(sampleBuffer, 0, pos);
pos = 0;
}
}
当我尝试使用自己的缓冲区大小时(我尝试了从max
到max * 2 // * 4; * 8; * 16
的所有内容),我得到了大量的点击和噪音。
如果你们对正确的方式有任何见解,我会非常感激。我不知道我的SourceDataLine缓冲区应该比我写入Line的块多大,如果有的话。是否有任何技巧让这个顺利?我很确定我的程序能够足够快地生成音频,所以这不应该是问题。