2012-04-27 45 views
2

我在SlimDX上使用XAudio2,並設法讓它在循環中播放一個短的(〜8秒)wav文件,但是當它接近第一個循環的末尾時,音頻開始口吃和口吃繼續進入下一個循環,隨着時間的推移變得越來越糟。XAudio2 OnVoiceProcessingPassStart回調口吃回放

我打開調試配置文件,在輸出窗口,我得到這些錯誤:

XAUDIO2: WARNING: Spent 5.63ms in the OnVoiceProcessingPassStart callback 
XAUDIO2: WARNING: Spent 5.60ms in the OnVoiceProcessingPassStart callback 
XAUDIO2: WARNING: Spent 5.59ms in the OnVoiceProcessingPassStart callback 
XAUDIO2: WARNING: Spent 5.69ms in the OnVoiceProcessingPassStart callback 

而這些當口吃發生不謀而合。我在這些回調中沒有做任何事情(我甚至沒有添加任何事件),但是它正在放緩。我下面將我的代碼以供參考:

波類保持數據流和緩衝:

public class Wave 
    { 
     public WaveStream Data { get; private set; } 

     public AudioBuffer Buffer { get; private set; } 

     public Wave(string path, bool repeating) 
     { 
      Data = new WaveStream(path); 
      Buffer = new AudioBuffer(); 
      Buffer.AudioBytes = (int)Data.Length; 
      Buffer.AudioData = Data; 
      if (repeating) 
      { 
       Buffer.Flags = BufferFlags.EndOfStream; 
      } 
      else 
      { 
       Buffer.Flags = BufferFlags.None; 
      } 
      Buffer.PlayBegin = 0; 
      Buffer.PlayLength = 0; 
      Buffer.LoopBegin = 0; 
      Buffer.LoopCount = 100; 
      Buffer.LoopLength = 0; 
     } 
    } 

Sound類用於固定XAudio發動機的聲音,並覆蓋添加/刪除聲音:

public class Sound 
    { 
     private XAudio2 audio; 
     private MasteringVoice master; 
     private List<SourceVoice> sources; 

     public Sound() 
     { 
      audio = new XAudio2(XAudio2Flags.DebugEngine, ProcessorSpecifier.AnyProcessor); 
      master = new MasteringVoice(audio); 
      sources = new List<SourceVoice>(); 
     } 

     public void AddSound(Wave wave) 
     { 
      SlimDX.Multimedia.WaveFormat format = wave.Data.Format; 
      SourceVoice source = new SourceVoice(audio, format); 
      source.Start(); 
      source.SubmitSourceBuffer(wave.Buffer); 
      sources.Add(source); 
     } 
    } 

並運行它,我用:

Wave wave = new Wave("Music2/untitled.wav", true); 
      Sound sound = new Sound(); 
      sound.AddSound(wave); 

回答

0

而是令人尷尬的這一個我自己的錯。我有一個D3D緩衝區被重新創建並銷燬了每一幀,我忘記更改爲動態緩衝區。這導致我的內存使用膨脹到幾千兆字節,這意味着可能沒有足夠的音樂分配。

一旦我刪除了內存泄漏,音樂聽起來很好。

我不確定XAudio2異常的措辭是否很好......