我正在尝试使用SourceDataLine
. 打开SourceDataLine
with 时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 的块大多少,如果有的话。有什么技巧可以让这个顺利吗?我很确定我的程序生成音频的速度足够快,所以这不应该是问题。