gpt4 book ai didi

c# - 如何使用 XAudio2 重复播放相同的声音?

转载 作者:行者123 更新时间:2023-11-30 16:26:46 24 4
gpt4 key购买 nike

我需要使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com