2013-11-28 21 views
0

所以我試圖製作一個吉他模擬器,如果我打電話給某個方法,那個音符就會播放。但是,當我再次調用它時,以前的聲音停止播放。我如何在Java中使用方法播放音頻文件,但是當再次調用該方法時,以前的音頻文件停止播放?

public class ytst { 
     public static void main(String[] args)throws Exception { 
      Estring.play(1); 
      TimeUnit.SECONDS.sleep(3); 
    Estring.play(2); 
    } 
    ---------- 
    class Estring{ 
     public static play(int fret){ 
      String filename="E" + fret + ".wav" 
      File soundFile = new File(filename); 
      AudioInputStream audioIn = AudioSystem.getAudioInputStream(soundFile); 
      Clip clip = AudioSystem.getClip(); 
      clip.open(audioIn); 
      clip.start(); 
     } 
    } 

當我嘗試這個,第二個音頻文件只是重疊第一個。我怎麼能這樣做,當我再次調用這個方法時,以前的聲音文件停止播放?

回答

1

剪輯的目的是保存重複使用的聲音。在他們播放之前,整個.wav文件必須被加載到內存中。這可能會造成滯後問題。 SourceDataLines將開始播放得更快,因爲它們只在開始播放之前加載緩衝區的數據。

其中剪輯閃耀在啓動或重新啓動它們它們已被加載到內存中。由於它們是從內存中運行的,因此不會像SourceDataLines那樣發生代價高昂的文件加載。因此,如果您要使用剪輯,請考慮首先初始化所有剪輯。如果這消耗了太多的內存,我會堅持使用SourceDataLines,至少在應用程序的第一次傳遞中,在嘗試任何想要優化的東西之前。

要停止剪輯,您只需調用clip.stop()即可。我會考慮做一些事情,比如創建一個名爲currentClip的變量,然後用這個方法停止它,然後用你想播放的新音符的值重新賦值。如果currentClip是易失性的,即使各個音符在不同的線程上播放,它也應該快速響應。

使用SourceDataLine,你可以做同樣的事情,儘管關閉一個SourceDataLine會涉及更多一點。常見的策略是在最內層的while循環中有一個易變的「播放」布爾值作爲條件。你可以將「播放」變量設置爲false,假設你已經正確寫入了它,sourceDataLine線程將關閉 - 在Java Tutorials和Sound部分中有很好的例子。