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

标签 c# audio directx xaudio2

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

相关文章:

actionscript-3 - 如何从列表中选择音频源Flash + ActionScript 3

c++ - 访问冲突写入位置 0xCCCCCCCC

c++ - 带有 DirectX 部分的 Metro 风格应用程序

c# - 如何交换两个子实体值

c# - 获取在线文件 [http] 大小的最快方法是什么

javascript - 在 jquery 中随机播放音频时如何运行函数?

c++ - 如何在 Direct2D 中创建透明位图

c# - 如何将 PC 中的本地文件路径转换为 ​​Network Relative 或 UNC 路径?

c# - 什么是基于实例的成员

audio - fft 数据的分贝结果错误