javax.sound.sampled как это работает? - PullRequest
1 голос
/ 25 ноября 2011

Я пытаюсь воспроизвести звук на Java.Пока все идет хорошо, спасибо, но у меня проблемы с пониманием, как это работает.

Я написал функцию, которая выполняет воспроизведение:

    private static void PlaySound(String path) {
        try {
            final File SoundFile = new File(path);
            AudioInputStream Sound = AudioSystem.getAudioInputStream(SoundFile);

            DataLine.Info info = new DataLine.Info(Clip.class, Sound.getFormat());
            Clip clip = (Clip) AudioSystem.getLine(info);
            clip.open(Sound);

            clip.addLineListener(new LineListener() {
                public void update (LineEvent event) {
                    if (event.getType() == LineEvent.Type.STOP) {
                        event.getLine().close();
                        System.out.printf("Playback ended!");
                        System.exit(0);
                    }
                }
            });
            System.out.printf("This sound is %f seconds long.", (clip.getMicrosecondLength() / 1000.0d));
            clip.start();
        } catch (Exception e) {
            ErrorHandler(e);
        }
    }

Теперь эта функция работает почтихорошо: когда звук заканчивается, он вызывает event.getLine (). close ();функции, но он застрял в "бесконечном цикле" (не уверен, если это так), и ничего после того, как этот оператор выполняется, и программа работает, пока я не убью его вручную.

Если я поменяю строку

if (event.getType() == LineEvent.Type.STOP) {

на

if (event.getType() == LineEvent.Type.CLOSE) {

, то звук воспроизводится, и программа завершается правильно, но все равно ни один из операторов после события.getLine () близко ().

Вопрос в следующем: является ли это предполагаемым поведением event.getLine (). close (), или я делаю что-то не так?


Решение:

LineListener фактически основан на устаревшем факте, что в Java Sound есть ошибка, и нам нужно явно выйти из vm.Без слушателя код работает нормально.

1 Ответ

0 голосов
/ 25 ноября 2011

Посмотрите, вызывает ли оно исключение:

public void update (LineEvent event) {
  if (event.getType().equals(LineEvent.Type.STOP)) {
    try { 
      event.getLine().close();
    } catch (Throwable t) {
      t.printStackTrace();
    }
    System.out.printf("Playback ended!");
  }
}
...