为什么Java Sound Clip在暂停和恢复后不发送LineListener事件?

时间:2018-09-13 13:30:42

标签: kotlin audio-player javax.sound.sampled

我在Kotlin中有一个简单的音频测试程序,该程序使用AtomicMarkableReference

Clip

我的音频文件长1.1秒。我希望该程序播放文件的前0.5秒,暂停1秒,然后完成播放文件。播放开始时,我希望收到一个import java.io.File import java.util.concurrent.CountDownLatch import javax.sound.sampled.AudioSystem fun main(args: Array<String>) { println("Getting clip...") val clip = AudioSystem.getClip() println("Opening clip...") clip.open(AudioSystem.getAudioInputStream(File("/path/to/my/audio/file.wav"))) println("Adding line listener...") clip.addLineListener { println("[ line listener ] $it") } println("Starting clip...") clip.start() Thread.sleep(500) println("Stopping clip...") clip.stop() Thread.sleep(1000) println("Restarting clip...") clip.start() // wait forever so we can see any more line listener events val latch = CountDownLatch(1) latch.await() } LineListener事件,而播放停止/暂停时,我希望收到一个START LineListener事件。我还希望在取消暂停剪辑时收到另一个STOP事件,并在到达文件末尾时收到最后一个START事件。但是,我的输出如下:

STOP

我可以听到音频文件停止,暂停和完成播放的预期,但是重新启动剪辑后我没有收到任何LineListener事件。如果我不暂停并重新启动剪辑,则可以正确接收到文件结尾Getting clip... Opening clip... Adding line listener... Starting clip... [ line listener ] Start event from line com.sun.media.sound.DirectAudioDevice$DirectClip@6afa9656 Stopping clip... [ line listener ] Stop event from line com.sun.media.sound.DirectAudioDevice$DirectClip@6afa9656 Restarting clip... 事件。

为什么在恢复剪辑后我没有看到任何LineListener事件?

编辑:

如果我添加这一行

STOP

clip.framePosition = clip.framePosition 之后和clip.stop()之前,问题消失了,并且LineListener收到了预期的事件:

Thread.sleep(1000)

这是Clip实施中的错误吗?

0 个答案:

没有答案