javax.sound.sampled它是如何工作的?

时间:2011-11-25 16:33:47

标签: java audio javasound

我正在尝试用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) {

然后声音播放,程序正确退出,但仍然没有event.getLine()。close();被执行。

问题是:这是event.getLine()。close()的预期行为,还是我做错了什么?


解决方案:

LineListener实际上是基于一个过时的事实,即Java Sound中有一个bug,我们需要从vm中明确退出。没有监听器,代码就可以正常工作。

1 个答案:

答案 0 :(得分:0)

看看它是否引发异常:

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!");
  }
}