Как l oop аудиофайл: воспроизвести снова после его окончания javax.sound.sampled - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь проигрывать звук снова и снова. У меня есть этот код:

public void play()  {
        try  {
            URL defaultSound = getClass().getResource(filename);
            AudioInputStream audioInputStream =
                    AudioSystem.getAudioInputStream(defaultSound);
            Clip clip = AudioSystem.getClip();
            clip.open(audioInputStream);
            clip.start( );
            System.out.println(clip.getMicrosecondLength());
            Thread.sleep(clip.getMicrosecondLength() / 1000);
            clip.addLineListener(new LineListener() {
                @Override
                public void update(LineEvent event) {
                    try {
                        clip.start();
                        Thread.sleep(clip.getMicrosecondLength() / 1000);
                    }
                    catch (Exception e)  {
                        e.printStackTrace();
                    }
                }
            });

        }
        catch (Exception e)  {
            e.printStackTrace();
        }
    }

, но он воспроизводит звук только один раз.

Ответы [ 2 ]

1 голос
/ 05 августа 2020
clip.open(audioInputStream);
clip.start( );

Должно быть:

clip.open(audioInputStream);
clip.loop(Clip.LOOP_CONTINUOUSLY); // <- NEW!
clip.start( );

См. Clip.loop(int):

Параметры:
count - количество раз, когда воспроизведение должно быть l oop назад от конечной позиции l oop к начальной позиции l oop, или LOOP_CONTINUOUSLY, чтобы указать, что цикл должен продолжаться до тех пор, пока не будет прерван

0 голосов
/ 04 августа 2020

Вероятно, вы захотите установить frame position клипа, используя Clip # setFramePosition , равным 0. Вы захотите вызвать это перед Clip#start. Вам также необходимо проверить, является ли тип LineEvent значением LineEvent.Type # STOP , чтобы убедиться, что событие является событием обновления или закрытием, и это действительно так, когда оно останавливается.

@Override
public void update(LineEvent event) {
    try {
        if (event.getType() == LineEvent.Type.STOP) {
            clip.setFramePosition(0);
            clip.start();
            Thread.sleep(clip.getMicrosecondLength() / 1000);
        }
    } catch (InterruptedException e)  {
        Thread.currentThread().interrupt();
    }
}
...