2

私はSlimDXでXAudio2を使用しており、ループで短い(〜8秒)wavファイルを再生することができましたが、最初のループの終わりに近づくと、オーディオが途切れ始め、途切れが次のループに続きますループし、時間が経つにつれて悪化します。

デバッグ プロファイルをオンにすると、出力ウィンドウに次のエラーが表示されます。

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 クラス:

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;
        }
    }

XAudio エンジンとボイスを保持し、ボイスの追加/削除をカバーするためのサウンド クラス:

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);
        }
    }

それを実行するには、次を使用します。

Wave wave = new Wave("Music2/untitled.wav", true);
            Sound sound = new Sound();
            sound.AddSound(wave);
4

1 に答える 1

0

むしろ恥ずかしいことに、これは私自身のせいです。D3D バッファーを再作成し、動的バッファーに変更するのを忘れていたすべてのフレームを破棄しました。これにより、メモリ使用量が数ギガバイトのサイズに膨れ上がり、おそらく音楽に割り当てるのに十分ではなかった.

メモリリークを取り除くと、音楽は問題なく聞こえました。

ただし、XAudio2 例外が適切に表現されているかどうかはわかりません...

于 2012-04-27T16:10:09.117 に答える