首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用XAudio2反复播放相同的声音?

如何用XAudio2反复播放相同的声音?
EN

Stack Overflow用户
提问于 2011-12-14 22:10:17
回答 1查看 2.3K关注 0票数 3

我需要在我的应用程序中反复播放单个声音,例如,使用XAudio2的枪声。

这是我为此目的编写的代码的一部分:

代码语言:javascript
复制
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可以帮助)?

我试图在文档中找到一些相关的东西,但是我没有成功,而且我可以参考的在线例子也不多。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-29 16:29:29

尽管为此使用XACT是更好的选择,因为它支持声音提示(正是我所需要的),但我还是设法让它以这种方式工作。

我已经更改了代码,所以它总是从流中创建新的SourceVoice对象并播放它。

代码语言:javascript
复制
        // ------ 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();
            }
        }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8512413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档