我需要在我的应用程序中反复播放单个声音,例如,使用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()时,声音播放如下:
声音->声音->声音
所以它只是填充缓冲区并播放它。
但是,我需要能够播放相同的声音,而目前正在播放,所以有效地这两个或更多应该混合和播放在同一时间。
这里是否有我遗漏的东西,或者用我目前的解决方案(也许SubmixVoices可以帮助)?
我试图在文档中找到一些相关的东西,但是我没有成功,而且我可以参考的在线例子也不多。
谢谢。
发布于 2011-12-29 16:29:29
尽管为此使用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();
}
}https://stackoverflow.com/questions/8512413
复制相似问题