2013-08-30 34 views
1

我在遊戲中使用剪輯。在剪輯播放罰款,但經過一番「槍」,發生以下問題Java Sound Clip在多次播放後無法播放

異常在線程「的PulseAudio事件循環線程」 java.lang.IllegalStateException:排水管處org.classpath.icedtea.pulseaudio.EventLoop失敗 。 native_iterate(本機方法) 在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

java.lang.IllegalStateException通常是由於:我通過調用flush()stop()之後固定它。 – Malwaregeek

+1

不知道你的'getClip()'方法是如何實現的,但你應該儘量不要重用這些剪輯。 –

+0

@MoritzPetersen,但遊戲作爲小程序導出,我不想重新下載整個數據。 – pfoof

回答

0

您不應該需要派生後臺線程來與剪輯進行交互。最常用的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的實現明顯不同。

+0

我實際上找到了一個解決方案:使用AudioClip。從默認線程調用Clip方法導致滯後。 – pfoof

1

所以我在OS X上有類似的問題,如果你試圖阻止它並從頭開始重新啓動,剪輯有時不會播放。當一個線程多次啓動

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