我需要使用 XAudio2 在我的应用中重复播放单个声音,例如枪声。
这是我为此目的编写的部分代码:
public sealed class X2SoundPlayer : IDisposable
{
private readonly WaveStream _stream;
private readonly AudioBuffer _buffer;
private readonly SourceVoice _voice;
public X2SoundPlayer(XAudio2 device, string pcmFile)
{
var fileStream = File.OpenRead(pcmFile);
_stream = new WaveStream(fileStream);
fileStream.Close();
_buffer = new AudioBuffer
{
AudioData = _stream,
AudioBytes = (int) _stream.Length,
Flags = BufferFlags.EndOfStream
};
_voice = new SourceVoice(device, _stream.Format);
}
public void Play()
{
_voice.SubmitSourceBuffer(_buffer);
_voice.Start();
}
public void Dispose()
{
_stream.Close();
_stream.Dispose();
_buffer.Dispose();
_voice.Dispose();
}
}
上面的代码实际上是基于SlimDX示例。
它现在所做的是,当我重复调用 Play() 时,声音播放如下:
sound -> sound -> sound
所以它只是填充缓冲区并播放它。
但是,我需要能够在当前正在播放的声音时播放相同的声音,因此有效地,这两个或更多应该同时混合和播放。
这里是否有我遗漏的东西,或者我当前的解决方案无法实现(也许 SubmixVoices 可以提供帮助)?
我试图在文档中找到相关的东西,但我没有成功,而且我可以引用的在线示例也不多。
谢谢。
最佳答案
虽然为此目的使用 XACT 是更好的选择,因为它支持声音提示(正是我所需要的),但我确实设法让它以这种方式工作。
我已经更改了代码,因此它总是会从流中创建新的 SourceVoice 对象并播放它。
// ------ code piece
/// <summary>
/// Gets the available voice.
/// </summary>
/// <returns>New SourceVoice object is always returned. </returns>
private SourceVoice GetAvailableVoice()
{
return new SourceVoice(_player.GetDevice(), _stream.Format);
}
/// <summary>
/// Plays this sound asynchronously.
/// </summary>
public void Play()
{
// get the next available voice
var voice = GetAvailableVoice();
if (voice != null)
{
// submit new buffer and start playing.
voice.FlushSourceBuffers();
voice.SubmitSourceBuffer(_buffer);
voice.Start();
}
}
关于c# - 如何使用 XAudio2 重复播放相同的声音?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8512413/