首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XAudio2 OnVoiceProcessingPassStart回调卡顿播放

XAudio2 OnVoiceProcessingPassStart回调卡顿播放
EN

Stack Overflow用户
提问于 2012-04-27 18:51:01
回答 1查看 780关注 0票数 2

我正在使用XAudio2和SlimDX,我已经设法让它在循环中播放一个很短(~8秒)的wav文件,然而当它接近第一个循环的末尾时,音频开始卡顿,卡顿继续进入下一个循环,随着时间的推移变得越来越糟。

我打开了调试配置文件,在输出窗口中得到以下错误:

代码语言:javascript
复制
XAUDIO2: WARNING: Spent 5.63ms in the OnVoiceProcessingPassStart callback
XAUDIO2: WARNING: Spent 5.60ms in the OnVoiceProcessingPassStart callback
XAUDIO2: WARNING: Spent 5.59ms in the OnVoiceProcessingPassStart callback
XAUDIO2: WARNING: Spent 5.69ms in the OnVoiceProcessingPassStart callback

这些与口吃发生的时间不谋而合。我在这些回调中什么也没做(我甚至没有在事件中添加任何东西),但它正在变慢。我添加了下面的代码以供参考:

用于保存数据流和缓冲区的Wave类:

代码语言:javascript
复制
public class Wave
    {
        public WaveStream Data { get; private set; }

        public AudioBuffer Buffer { get; private set; }

        public Wave(string path, bool repeating)
        {
            Data = new WaveStream(path);
            Buffer = new AudioBuffer();
            Buffer.AudioBytes = (int)Data.Length;
            Buffer.AudioData = Data;
            if (repeating)
            {
                Buffer.Flags = BufferFlags.EndOfStream;
            }
            else
            {
                Buffer.Flags = BufferFlags.None;
            }
            Buffer.PlayBegin = 0;
            Buffer.PlayLength = 0;
            Buffer.LoopBegin = 0;
            Buffer.LoopCount = 100;
            Buffer.LoopLength = 0;
        }
    }

Sound类,用于保存XAudio引擎和声音,并涵盖添加/删除声音:

代码语言:javascript
复制
public class Sound
    {
        private XAudio2 audio;
        private MasteringVoice master;
        private List<SourceVoice> sources;

        public Sound()
        {
            audio = new XAudio2(XAudio2Flags.DebugEngine, ProcessorSpecifier.AnyProcessor);
            master = new MasteringVoice(audio);
            sources = new List<SourceVoice>();
        }

        public void AddSound(Wave wave)
        {
            SlimDX.Multimedia.WaveFormat format = wave.Data.Format;
            SourceVoice source = new SourceVoice(audio, format);
            source.Start();
            source.SubmitSourceBuffer(wave.Buffer);
            sources.Add(source);
        }
    }

要运行它,我使用:

代码语言:javascript
复制
Wave wave = new Wave("Music2/untitled.wav", true);
            Sound sound = new Sound();
            sound.AddSound(wave);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-28 00:10:09

相当尴尬的是,这是我自己的错。我有一个D3D缓冲区被重新创建,并销毁了我忘记更改为动态缓冲区的每一帧。这导致我的内存使用量膨胀到了几千兆字节,这意味着可能没有足够的内存分配给音乐。

一旦我移除了内存泄漏,音乐听起来就很好。

不过,我不确定XAudio2异常是否写得很好……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10349281

复制
相关文章

相似问题

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