2012-04-10 10 views
3

おそらくこれは間違っていると思われますが、ループするjavax.sound.sampledクリップを停止する方法を知る必要があります。私は9種類の音があります。ユーザーが振幅の増加ボタンを押すと、別のサウンドを再生したい。現時点では、ボタンをクリックするたびにplaySoundメソッドが呼び出されて動作していますが、すでに再生中のサウンドは停止していません。音はちょうどお互いに再生されます。ループする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にようこそ。 :) –

答えて

1

既存のクリップをすべて再生しないようにします。これはDataline.stop()メソッドを使用して行うことができます。既存のすべてのクリップにアクセスするだけで済みます。以下は私の提案です。現在のループするクリップにリンクする参照は1つのみです。複数ある場合は、1つではなく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'属性はメソッドに対してローカルに宣言できます。 –

+0

それはありますか?変数の寿命は、メソッドが実行を完了するのにかかる時間に制限されているという印象を受けました。 – Honoki

+0

あなたの回答者のおかげでNetBeansはactiveClip.stop();でエラーを出しています。ライン。最初にメソッドが呼び出されるとクリップが再生されないためです –

関連する問題