SharpDX:循环播放多个wav文件

时间:2014-07-02 12:18:25

标签: c# audio windows-phone-8 sharpdx

我目前正在使用SharpDX SourceVoice在WP8应用程序中播放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,但只播放了第一个。

1 个答案:

答案 0 :(得分:0)

我无法按照我想要的方式工作,即排队两个AudioBuffers并重复它们。事实证明,如果你排队两个AudioBuffers并在每个上设置Loop = x,第一个循环x次,然后第二个循环x次。 Aslo,看起来缓冲区一旦被播放就会从队列中删除,所以无论如何你都可以将两个缓冲区循环在一起。

我还尝试通过将它们各自的字节复制到MemoryStream中,从两个单独的AudioBuffers创建一个'合并'的AudioBuffer,但结果流无效且无法播放(可能是因为有类型的标题或EOF标记在每个单独的流中)。

最后,我决定使用连续的ThreadPoolTimer来每隔x毫秒将AudioBuffer提交给SourceVoice,从而实现所需的结果。

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

}, TimeSpan.FromMilliseconds(1500));

我仍然不确定这是不是应该怎么做,如果有人知道相反,我会高兴地接受他们的回答。