2014-07-02 79 views
0

我目前使用SharpDX SourceVoice播放WP8應用程序中的wav文件,該文件適用於播放單個文件。SharpDX:循環播放多個wav文件

但是,我找不到在循環中一個接一個地播放多個文件的方法,無需註冊SourceVoice上的事件並排隊下一個文件。這似乎引入了一些口吃,並不是非常無縫,所以我希望有一種方法可以將兩個文件排隊一次,然後循環播放它們。

關於同時播放兩個文件有幾個問題(比如這個:Best way to play two audio files simultaneously in Windows Phone 8),但是我想在一個循環中一個接一個地播放它們。

我要扮演一個文件的代碼如下所示:

xaudio = new XAudio2(); 
masteringVoice = new MasteringVoice(xaudio); 

var nativefilestream = new NativeFileStream(String.Format(@"{0}", soundfile),NativeFileMode.Open,NativeFileAccess.Read,NativeFileShare.Read); 
var soundstream = new SoundStream(nativefilestream); 
var waveFormat = soundstream.Format; 
var buffer = new AudioBuffer 
{ 
    Stream = soundstream.ToDataStream(),   
    AudioBytes = (int)soundstream.Length, 
    Flags = BufferFlags.EndOfStream 
}; 

sourceVoice = new SourceVoice(xaudio, waveFormat, true); 
sourceVoice.SubmitSourceBuffer(buffer, soundstream.DecodedPacketsInfo); 
sourceVoice.Start(); 

如果我想循環單片音頻的,我設置了AudioBuffer無限循環計數,如下所示:

LoopCount = AudioBuffer.LoopInfinite, 

我曾嘗試使用不同的AudioBuffers調用兩次SubmitSourceBuffer方法,並將LoopCount設置爲LoopInfinite,但只有第一個播放。

回答

0

我無法按照我想要的方式工作,即將兩個AudioBuffers排隊並讓它們重複。事實證明,如果你排隊了兩個AudioBuffers,並在它們的每一個上設置Loop = x,第一個循環x次,然後第二個循環x次。另外,它看起來像一個緩衝區從隊列中刪除後,一旦它被播放,所以你懷疑你可以循環兩個緩衝區無論如何。

我也嘗試從兩個單獨的AudioBuffers創建一個'合併的'AudioBuffer,通過將它們各自的字節拷貝到MemoryStream中,但是生成的流無效並且無法播放(可能是由於頭部或EOF標記在每個單獨的流中)。

最後,我決定使用一個連續的ThreadPoolTimer每隔x毫秒將AudioBuffer提交給SourceVoice,從而達到所需的結果。

ThreadPoolTimer timer = ThreadPoolTimer.CreatePeriodicTimer(
(timer) => 
{ 
    sourceVoice.SubmitSourceBuffer(buffer, soundstream.DecodedPacketsInfo); 
    sourceVoice.Start(); 

}, TimeSpan.FromMilliseconds(1500)); 

我仍然不知道這是怎麼了應該做的事,如果有人知道與此相反,我會高興地接受他們的答案。