2016-07-13 7 views
0

私のプログラムの一部は、サウンドの読み込みとプロンプトが表示されたらそれらを再生する必要があります。 現在、プロジェクト内のリソースとして「埋め込まれた」.wavファイルの読み込みをサポートしています。これを行うには、私はこのようなコードの行を使用します。ファイルからロードされたJava AudioInputStreamをリセットする

sounds[i+1] = AudioSystem.getAudioInputStream(MyProject.class.getResource("filename.wav")); 

私の次の目標は、ユーザーが再生するために、独自の.wavファイルをロードできるようにすることです。これを行うには、次のようなコードを使用します:

今すぐ問題が発生します。自然に私はこれらの音を複数回再生できるようにしたいと考えています。私の最初のアプローチでは、私は使用した:

sound.markSupported(); 
sound.mark(Integer.MAX_VALUE); 
/* do stuff with it */ 
sound.reset(); 

これは完全に正常に働いた。しかし、私は(上記の2番目の方法で)ファイルを "定期的に"読み込むことで作成したオーディオストリームに対しては、動作しません(reset()の呼び出し時にクラッシュします)。

つまり、なぜ私が受けていますエラーが

java.io.IOException: mark/reset not supported 
at java.io.InputStream.reset(InputStream.java:348) 
at javax.sound.sampled.AudioInputStream.reset(AudioInputStream.java:427).... 

のですか? これを修正するにはどうすればよいですか?

+0

'mark()'を使用できない場合、 'sound.markSupported()'が 'true'を返すかどうかチェックする必要があります。 – mariusz2108

答えて

1

なぜストリームをsounds[]アレイに格納しますか?ストリームの作成方法を保存するだけです。これを行うためのオブジェクト指向の方法は、以下のようになります:

public abstract class AudioSource { 
    public abstract InputStream getStream() throws IOException; 
} 

public class FileAudioSource extends AudioSource { 

    private final File audioFile; 

    public FileAudioSource(File audioFile) { 
     this.audioFile = audioFile; 
    } 

    @Override 
    public InputStream getStream() throws FileNotFoundException { 
     return new FileInputStream(audioFile); 
    } 
} 

public class ResourceAudioSource extends AudioSource { 

    private final String resourceName; 

    public ResourceAudioSource(String resourceName) { 
     this.resourceName = resourceName; 
    } 

    @Override 
    public InputStream getStream() { 
     return this.getClass().getResourceAsStream(resourceName) 
    } 
} 

最後に、あなたのリストを作成できます。

sounds[i+1] = new ResourceAudioSource("resource_filename.wav"); 
sounds[i+1] = new FileAudioSource(new File("filename.wav")); 

をそして、あなたは、ストリームが必要な場合だけsounds[j].getStream()を呼び出します。

+0

ありがとうございます。私がしなければならなかったのは、ファイルリソースの場合に純粋な 'FileInputstream'の代わりに' BufferedInputStream'を返すことでした。さもなければ、 'AudioInputStream'にキャストできず、結果としてクリップで再生できませんでした現在選択されている方法。他の誰かがこれに遭遇した場合に備えて私はそれを書いていたと思った。 好奇心の疎外感から、これは複雑さの面で無駄に見えますが、これらのストリームを作成して再作成します。パフォーマンスが重要な時代には「安い」方法がありますか? – TheFooBarWay

関連する問題