DirectSound: «Значение не попадает в ожидаемый диапазон». при инициализации уведомления - PullRequest
2 голосов
/ 16 сентября 2011

Я получаю это исключение, когда пытаюсь запустить простую программу 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);).

Не уверен, что пошло не так. Буфер был инициализирован правильно.

Ответы [ 2 ]

0 голосов
/ 22 мая 2016

" Объект SecondaryBuffer будет поддерживать события уведомлений только , если для BufferDescription.ControlPositionNotify установлено значение true. "

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

У меня было то же исключение, но это решило проблему!

0 голосов
/ 16 сентября 2011

Мне не ясно, что вы пытаетесь сделать со своими outputLatency и frameSize переменными или со свойством BufferBytes, но я думаю, что здесь есть ваша проблема.

...