2011-12-14 46 views
3

私は、XAudio2を使用して、銃声のように、私のアプリで繰り返し1つのサウンドを再生する必要があります。XAudio2で同じサウンドを繰り返し再生するには?

public sealed class X2SoundPlayer : IDisposable 
    { 
     private readonly WaveStream _stream; 
     private readonly AudioBuffer _buffer; 
     private readonly SourceVoice _voice; 

     public X2SoundPlayer(XAudio2 device, string pcmFile) 
     { 
      var fileStream = File.OpenRead(pcmFile); 
      _stream = new WaveStream(fileStream); 
      fileStream.Close(); 

      _buffer = new AudioBuffer 
          { 
           AudioData = _stream, 
           AudioBytes = (int) _stream.Length, 
           Flags = BufferFlags.EndOfStream 

          }; 

      _voice = new SourceVoice(device, _stream.Format); 
     } 

     public void Play() 
     { 
      _voice.SubmitSourceBuffer(_buffer); 
      _voice.Start(); 
     } 

     public void Dispose() 
     { 
      _stream.Close(); 
      _stream.Dispose(); 
      _buffer.Dispose(); 
      _voice.Dispose(); 
     } 
    } 

上記のコードは、実際にはSlimDXのサンプルに基づいています。

これは私がその目的のために書いたコードの一部です。私は繰り返し再生()を呼び出したときに

はそれが今何、音は次のように果たしている:

音 - >音 - >サウンド

だから、それだけでバッファや戯曲を埋めますそれ。

を再生する必要がありますが、は現在再生中ですので、効果的にこれらの2つ以上を同時にミックスして再生する必要があります。

私が見逃したことがあるか、私の現在の解決策では不可能です(SubmixVoicesが役立つかもしれません)?

私はドキュメントに関連するものを見つけようとしていますが、私は成功しておらず、参考にできるオンラインの例はあまりありません。

ありがとうございました。

答えて

3

サウンドキュー(私が必要としていたもの)をサポートしているので、この目的でXACTを使用する方がよいでしょうが、この方法で動作させることができました。

コードを変更して、常にストリームから新しいSourceVoiceオブジェクトを作成して再生するようにしました。

 // ------ code piece 

     /// <summary> 
     /// Gets the available voice. 
     /// </summary> 
     /// <returns>New SourceVoice object is always returned. </returns> 
     private SourceVoice GetAvailableVoice() 
     { 
      return new SourceVoice(_player.GetDevice(), _stream.Format); 
     } 

     /// <summary> 
     /// Plays this sound asynchronously. 
     /// </summary> 
     public void Play() 
     { 
      // get the next available voice 
      var voice = GetAvailableVoice(); 
      if (voice != null) 
      { 
       // submit new buffer and start playing. 
       voice.FlushSourceBuffers(); 
       voice.SubmitSourceBuffer(_buffer); 

       voice.Start(); 
      } 
     } 
関連する問題