Почему Java Sound Clip не отправляет события LineListener после паузы и возобновления? - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть простая программа аудио-тестирования в 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?

...