1

我在游戏中使用 Clips。剪辑播放正常,但经过一些“镜头”后,出现以下问题

线程“PulseAudio Eventloop Thread”java.lang.IllegalStateException 中的异常:在 org.classpath.icedtea.pulseaudio.EventLoop.run(EventLoop.java:133) 的 org.classpath.icedtea.pulseaudio.EventLoop.native_iterate(Native Method) ) 在 java.lang.Thread.run(Thread.java:724)

我的代码:

public static Clip[] sounds;
...
sounds = new Clip[3];
sounds[0] = getClip("gun.wav");
sounds[1] = getClip("click.wav");
sounds[2] = getClip("over.wav");
...
private void playSound(Clip clp) {
        final Clip clip = clp;
        Runnable soundPlayer = new Runnable() {

            @Override
            public void run() {
                try {
                    if(clip.isActive() || clip.isRunning()) clip.stop();
                    clip.setMicrosecondPosition(0);
                    clip.start();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        new Thread(soundPlayer).start();
}
public void shoot() { //runs when space is clicked 
if(canShoot) playSound(sounds[0]);
}
4

2 回答 2

1

所以我在 OS X 上遇到了类似的问题,如果您尝试停止剪辑并从头开始重新启动,剪辑有时无法播放。flush()我通过在之后调用来修复它stop()

if(clip.isActive() || clip.isRunning()) {
    clip.stop();
    clip.flush();
}
于 2014-10-21T23:28:19.570 回答
0

您不需要生成后台线程来与 Clip 进行交互。Clip 最常用的方法,如“start”和“stop”都是异步操作的,这意味着它们不会阻塞,所以应该可以从 GUI/AWT/Swing 线程调用它们。

这个页面有一些合理的例子: http ://www3.ntu.edu.sg/home/ehchua/programming/java/J8c_PlayingSound.html

我看到你正在使用 IcedTea 和 PulseAudio。在此 JVM 中使用 javax.sound 时,您可能会遇到与 Oracle JVM 不同的行为,因为 javax.sound 的实现在这两个产品之间存在显着差异。

于 2013-08-30T17:59:33.837 回答