2009-07-28 78 views
0

我使用Java的SourceDataLine播放声音,但每当我尝试调整音量(增益)时,动作与扬声器中的响应之间会有0.2-0.5秒的延迟。音频数据以4k-16k块(16bit单声道,22kHz〜44k/s)写入。实时Java音量调整

如何使此音量调整更实时?

write(byte[], int, int)是否锁定了FloatControl的增益调整?

我是否需要恢复到DSP并行调整声音缓冲区数据量的方式或提交更小的块?

JDK7,体面的Windows PC

+0

不是我一直在寻找的答案,但似乎我不得不回到Java解决方案的Java游戏开发书籍。 – akarnokd 2009-08-11 21:31:42

回答

2

音响系统从SourceDataLine的数据在数(百元... ...)千字节的块和缓冲它们。如果您更改参数,它将不会生效,直到系统播放缓冲区为空,并从SDL读取新数据。

你需要做的是绕着改变系统播放音量(它立即生效)而不是对你提供给它的数据进行调试。

+0

与系统的主音量混淆似乎不是一个好方法,因为我想我会需要JNI/JNA来做到这一点。我个人讨厌这样做的应用程序。另外,我必须在不同的音量设置下同时播放音乐和其他声音。 – akarnokd 2009-07-29 10:41:56

0

如果您可以以某种方式影响/创建您的调音台为Line包含的Line.Info类,则可以更改其最小和最大缓冲区。然后,你可以将缓冲区设置为你正在喂它的块的大小,然后你的延迟将减少到无(据推测)

0

当你调用SourceDataLine.open()时,你是否尝试过使用自定义(较低)缓冲区大小)?

SourceDataLine.open(AudioFormat format, int bufferSize) 

这应该会减少延迟。主播放音量解决方案仍然可能会更快。