我在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实施中的错误吗?