3

学校のプロジェクト用に AudioManager クラスを書き直していますが、問題が発生しました。私の教授は、try/catch を使用する代わりに、Try-with-resources ブロックを使用してすべてのリソースをロードするように私に言いました (以下のコードを参照)。javax.sound.sampled.Clip の Clip クラスを使用しています。Clip を close() しなければ、try/catch/ を使用する PlaySound(String path) メソッドですべてが完全に機能します。クリップを close() すると、もう使用できないことはわかっています。Clip と Try-with-resources の Oracle Docs を読みましたが、解決策が見つかりませんでした。だから私が知りたいのは:

Try-with-resource ブロックを使用して、クリップを閉じる前にクリップのサウンドを再生/聞くことはできますか?

// Uses Try- with resources. This does not work.
public static void playSound(String path) {
try {
    URL url = AudioTestManager.class.getResource(path);
    try (Clip clip = AudioSystem.getClip()){
    AudioInputStream ais = AudioSystem.getAudioInputStream(url);
    clip.open(ais);
    clip.start();
    }
} catch( LineUnavailableException | UnsupportedAudioFileException  | IOException  e) {
    e.printStackTrace();}
}

// Does not use Try- with resources. This works.

public static void playSound2(String path) {
Clip clip = null;
try {
    URL url = AudioTestManager.class.getResource(path);
    clip = AudioSystem.getClip();
    AudioInputStream ais = AudioSystem.getAudioInputStream(url);
    clip.open(ais);
    clip.start();

}
catch( LineUnavailableException | UnsupportedAudioFileException  | IOException  e) {
    e.printStackTrace();}
finally {
   // if (clip != null) clip.close();
}
}

前もって感謝します!

4

1 に答える 1

5

問題は、ブロックが終了すると、try-with-resourcesブロックが自動的にClip作成されたブロックを閉じ、再生が停止することです。

他の例では、手動で閉じないため、再生を続行できます。

Clip再生が終了したときにを閉じたい場合は、 で を追加LineListenerし、次のようなイベントaddLineListener()を受け取ったときに閉じることができます。STOP

final Clip clip = AudioSystem.getClip();
// Configure clip: clip.open();
clip.start();

clip.addLineListener(new LineListener() {
    @Override
    public void update(LineEvent event) {
        if (event.getType() == LineEvent.Type.STOP)
            clip.close();
    }
});
于 2014-08-29T09:06:02.850 に答える