多次播放后,Java Sound Clip无法播放

时间:2013-08-30 16:21:33

标签: java multithreading audio clip

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

  

线程中的异常“PulseAudio Eventloop Thread”java.lang.IllegalStateException:drain failed       at org.classpath.icedtea.pulseaudio.EventLoop.native_iterate(Native Method)       在org.classpath.icedtea.pulseaudio.EventLoop.run(EventLoop.java:133)       在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]);
}

2 个答案:

答案 0 :(得分:1)

所以我在OS X上遇到了类似的问题,如果你试图阻止它并从头开始重新启动,那么剪辑有时候不会播放。我在flush()之后调用了stop()来修复它:

if(clip.isActive() || clip.isRunning()) {
    clip.stop();
    clip.flush();
}

答案 1 :(得分: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的实现在这两个产品之间存在显着差异。