我目前正在使用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,但只播放了第一个。
答案 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));
我仍然不确定这是不是应该怎么做,如果有人知道相反,我会高兴地接受他们的回答。