2

単純なDirectSoundプログラムを実行しようとすると、その例外が発生します。コードは次のとおりです。

using System;
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft.DirectX.DirectSound;

namespace AudioDemo
{
    class Program
    {
        [DllImport("user32.dll")]
        private static extern IntPtr GetDesktopWindow();

        static void Main(string[] args)
        {
            // output device

            var device = new Device();
            device.SetCooperativeLevel(GetDesktopWindow(), CooperativeLevel.Normal);

            // format description

            var format = new WaveFormat
            {
                BitsPerSample = 8,
                Channels = 1,
                FormatTag = WaveFormatTag.Pcm,
                SamplesPerSecond = 8000
            };

            format.BlockAlign = (short)(format.BitsPerSample / 8 * format.Channels);
            format.AverageBytesPerSecond = format.SamplesPerSecond * format.BlockAlign;

            var outputLatency = 20;
            var frameSize = format.AverageBytesPerSecond * outputLatency / 1000;

            // buffer 

            var description = new BufferDescription
            {
                BufferBytes = frameSize,
                Format = format,
                DeferLocation = true,
                GlobalFocus = true
            };

            var outputBuffer = new SecondaryBuffer(description, device);

            // buffer notifications

            var notify = new Notify(outputBuffer);

            // ...
        }
    }
}

最後の行(var notify = new Notify(outputBuffer);)で例外が発生します。

何が悪かったのかわからない。バッファが正しく初期化されました。

4

2 に答える 2

0

あなたがあなたoutputLatencyframeSize変数、またはBufferBytesプロパティで何をしようとしているのかは私にはわかりませんが、私の推測では、あなたの問題はどこにあるのでしょうか。

于 2011-09-16T13:00:06.773 に答える
0

SecondaryBufferオブジェクトは、に設定されている場合にのみ通知イベントをサポートします。BufferDescription.ControlPositionNotifytrue

https://msdn.microsoft.com/en-us/library/windows/desktop/ms812460.aspx

だからこれを試してみてください:

        var description = new BufferDescription
        {
            BufferBytes = frameSize,
            Format = format,
            DeferLocation = true,
            GlobalFocus = true,
            ControlPositionNotify = true
        };

同じ例外がありましたが、これで問題は解決しました。

于 2016-05-22T05:38:56.773 に答える