1

楽器タイプのアプリを作ろうとしています。私が抱えている問題は、古いサウンドが終了した場合にのみ新しいサウンドが再生されることです。それらを同時に再生できるようにしたいと思います。

これは私のコードがどのように見えるかです:

まず、オーディオ バッファとその他の情報を保持するだけの MyWave クラスです。

class MyWave
{
    public AudioBuffer Buffer { get; set; }
    public uint[] DecodedPacketsInfo { get; set; }
    public WaveFormat WaveFormat { get; set; }
}

SoundPlayer クラス:

    private XAudio2 xaudio;
    private MasteringVoice mvoice;
    Dictionary<string, MyWave> sounds;

    // Constructor
    public SoundPlayer()
    {
        xaudio = new XAudio2();
        xaudio.StartEngine();
        mvoice = new MasteringVoice(xaudio);
        sounds = new Dictionary<string, MyWave>();
    }

    // Reads a sound and puts it in the dictionary
    public void AddWave(string key, string filepath)
    {
        MyWave wave = new MyWave();

        var nativeFileStream = new NativeFileStream(filepath, NativeFileMode.Open, NativeFileAccess.Read, NativeFileShare.Read);
        var soundStream = new SoundStream(nativeFileStream);
        var buffer = new AudioBuffer() { Stream = soundStream, AudioBytes = (int)soundStream.Length, Flags = BufferFlags.EndOfStream };

        wave.Buffer = buffer;
        wave.DecodedPacketsInfo = soundStream.DecodedPacketsInfo;
        wave.WaveFormat = soundStream.Format;

        this.sounds.Add(key, wave);
    }

    // Plays the sound
    public void Play(string key)
    {
        if (!this.sounds.ContainsKey(key)) return;
        MyWave w = this.sounds[key];

        var sourceVoice = new SourceVoice(this.xaudio, w.WaveFormat);
        sourceVoice.SubmitSourceBuffer(w.Buffer, w.DecodedPacketsInfo);
        sourceVoice.Start();
    }
}

Google はあまり役に立ちませんでした。役に立つものは何も見つかりませんでした。では、どうすれば複数のサウンドを同時に再生できますか?

4

2 に答える 2

3

複数のSourceVoiceインスタンスを作成(できればプール)して、それらを同時に再生する必要があります。

実際、現在のコードは機能するはずですよね?StreamEndイベントリスナーをSourceVoiceに追加して、再生の完了後にそれ自体を破棄し、SourceVoiceのコンストラクターを呼び出すときにコールバックを有効にすることを忘れないでください。

于 2013-02-07T14:55:17.557 に答える