我在游戏中使用剪辑。剪辑播放正常,但经过一些“镜头”后,会出现以下问题
线程中的异常“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]);
}
答案 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的实现在这两个产品之间存在显着差异。