У меня есть простая программа аудио-тестирования в Kotlin, которая использует Clip
:
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()
}
Мой аудиофайл имеет длину 1,1 секунды. Я ожидал, что эта программа будет воспроизводить первые 0,5 секунды файла, делать паузу в течение 1 секунды, а затем заканчивать воспроизведение файла. Когда начинается воспроизведение, я ожидаю получить событие START
LineListener, а когда воспроизведение останавливается / приостанавливается, я ожидаю получить событие STOP
LineListener. Я также ожидаю получить еще одно событие START
, когда я сделаю паузу для клипа, и окончательное событие STOP
, когда будет достигнут конец файла. Тем не менее, мой вывод выглядит так:
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
.
Почему я не вижу событий LineListener после возобновления клипа?
EDIT:
Если я добавлю эту строку
clip.framePosition = clip.framePosition
сразу после clip.stop()
и до Thread.sleep(1000)
проблема исчезает, и LineListener получает ожидаемые события:
Getting clip...
Opening clip...
Adding line listener...
Starting clip...
[ line listener ] Start event from line com.sun.media.sound.DirectAudioDevice$DirectClip@3ddc3924
Stopping clip...
[ line listener ] Stop event from line com.sun.media.sound.DirectAudioDevice$DirectClip@3ddc3924
Restarting clip...
[ line listener ] Start event from line com.sun.media.sound.DirectAudioDevice$DirectClip@3ddc3924
[ line listener ] Stop event from line com.sun.media.sound.DirectAudioDevice$DirectClip@3ddc3924
Это ошибка в реализации Clip?