SharpDX:循环播放多个wav文件一个接一个

本文关键字:一个 文件 wav 循环 播放 SharpDX | 更新日期: 2023-09-27 18:11:03

我目前正在使用SharpDX sourcvoice在WP8应用程序中播放wav文件,它可以很好地播放单个文件。

然而,我找不到一种方法来播放多个文件一个接一个的循环,而不注册事件上的sourcvoice和排队下一个文件。这似乎引入了一点口吃,并不是很无缝,所以我希望有一些方法将两个文件排队一次,只是循环它们。

关于同时播放两个文件有一些问题(比如:在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,

我确实尝试调用SubmitSourceBuffer方法两次不同的AudioBuffers,都有LoopCount设置为LoopInfinite,但只有第一个播放。

SharpDX:循环播放多个wav文件一个接一个

我不能让这个工作的方式,我想,即队列两个AudioBuffers,并让他们重复。如果你把两个audiobuffer放到队列中并分别设置Loop = x第一个循环x次,第二个循环x次。此外,看起来缓冲区一旦播放就会从队列中删除,所以无论如何都不能将两个缓冲区循环在一起。

我还尝试通过将两个单独的AudioBuffers的单个字节复制到MemoryStream中来创建一个"合并"的AudioBuffer,但所产生的流无效,无法播放(可能是由于在每个单独的流中都有某种头或EOF标记)。

最终,我确定了使用连续ThreadPoolTimer每隔x毫秒向sourcvoice提交AudioBuffer的解决方案,这达到了预期的结果。

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

我仍然不确定这是否应该这样做,如果有人知道相反的情况,我很乐意接受他们的答案。