2012-04-10 71 views
3

我可能接近這個錯誤,但我需要找出如何停止循環javax.sound.sampled剪輯。我有9種不同的聲音。當用戶按下增加幅度按鈕時,我想要播放不同的聲音。此刻,我每次點擊按鈕時都會調用pl​​aySound方法,但它並不會停止正在播放的聲音。聲音只是互相播放。關閉一個循環javax.sound.sampled剪輯

當用戶按下按鈕時,有沒有辦法關閉所有現有的聲音?

這裏是我的playSound代碼:

public void playSound(){ 
    try { 
     audio = AudioSystem.getAudioInputStream(soundFile[activeSound]); 
     clip = AudioSystem.getClip(); 
     clip.open(audio); 
     clip.start(); 
     clip.loop(Clip.LOOP_CONTINUOUSLY);   
    } 

    catch (IOException ex){ 
     System.out.println("Sorry but there has been a problem reading your file."); 
     ex.printStackTrace(); 
    } 

    catch (UnsupportedAudioFileException ex1){ 
     System.out.println("Sorry but the audio file format you are using is not supported."); 
     ex1.printStackTrace(); 
    } 

    catch (LineUnavailableException ex2){ 
     System.out.println("Sorry but there are audio line problems."); 
     ex2.printStackTrace(); 
    } 
} 

我已經在這兩天現在和它的駕駛我瘋了。任何幫助將非常感激。

+0

很好的異常處理。 +1另外,歡迎來到SO。 :) – 2012-04-10 12:22:41

回答

1

你想要的是停止播放所有現有剪輯。這可以使用Dataline.stop()方法完成。所有你需要的是能夠訪問所有現有的剪輯。以下是我的建議。請注意,我只使用一個引用來鏈接到當前循環剪輯。如果您有多個,請使用ArrayList<Clip>而不是僅使用一個。

private Clip activeClip; 
public void playSound(){ 
    activeClip.stop(); 
    try { 
     audio = AudioSystem.getAudioInputStream(soundFile[activeSound]); 
     clip = AudioSystem.getClip(); 
     clip.open(audio); 
     clip.start(); 
     clip.loop(Clip.LOOP_CONTINUOUSLY); 
     activeClip = clip; 
    } 

    catch (IOException ex){ 
     System.out.println("Sorry but there has been a problem reading your file."); 
     ex.printStackTrace(); 
     } 

    catch (UnsupportedAudioFileException ex1){ 
     System.out.println("Sorry but the audio file format you are using is not  supported."); 
     ex1.printStackTrace(); 
    } 

    catch (LineUnavailableException ex2){ 
     System.out.println("Sorry but there are audio line problems."); 
     ex2.printStackTrace(); 
    } 
} 
+0

+1,但有一個小建議。走你的路線,'clip'屬性可以在本地聲明爲方法。 – 2012-04-10 12:24:21

+0

可以嗎?我的印象是變量的生命週期僅限於該方法完成執行所需的時間。 – Honoki 2012-04-10 12:29:16

+0

感謝您的答覆小組,但NetBeans在activeClip.stop()處發生錯誤;線。我認爲這是因爲第一次調用方法時,沒有剪輯播放? – 2012-04-10 13:00:54