Мой звуковой буфер DirectX имеет статический шум

Поэтому мне нравится работать над заданиями в колледже (чтобы оттачивать некоторые из моих навыков), и я решил взяться за это:

http://introcs.cs.princeton.edu/java/assignments/dsp.html

Я запускаю приложение MSVS2015 C#/Console вместе с пакетом SharpDX, который дает мне доступ к некоторым базовым возможностям DirectSound. Я просто пытаюсь создать и сыграть 2-секундную ноту «ля», как они проходят в первом примере. Когда я запускаю следующий код, он воспроизводит 2 секунды, но он очень статичен. Я предполагаю, что с моими расчетами что-то не так, но я не могу понять, что именно. У кого-нибудь есть опыт написания собственных цифровых звуковых буферов?

Спасибо, - Джефф

public class Execution : IDisposable
{
    IntPtr Handle;
    DirectSound Device;
    SecondarySoundBuffer Buffer;
 
    public Execution()
    {
        Handle = System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle;
 
        Device = new DirectSound();
        Device.SetCooperativeLevel(Handle, CooperativeLevel.Priority);
 
        var rate = 44100;
        var bits = 16;
        var channels = 1;
        var waveFormat = new WaveFormat(rate, bits, channels);
 
        // Create a buffer with 2 seconds of sample data
        var seconds = 2;
 
        var bufferDescription = new SoundBufferDescription() { Format = waveFormat, BufferBytes = waveFormat.AverageBytesPerSecond * seconds };
        Buffer = new SecondarySoundBuffer(Device, bufferDescription);
 
        var noteFrequency = 440f;       // A
        var bufferData = new float[bufferDescription.BufferBytes];
 
        var count = 0;
        for (var sample = 0; sample < bufferDescription.BufferBytes; sample++)
        {
            var sampleInSeconds = (float)sample / (float)bufferDescription.BufferBytes * (float)seconds;
            var value = (float)Math.Sin(2f * Math.PI * noteFrequency * sampleInSeconds );
            bufferData[sample] = value;
        }
 
        Buffer.Write(bufferData, 0, LockFlags.EntireBuffer);
    }
 
    public void Execute()
    {
        Buffer.Play(0, 0);
    }
 
    public void Dispose()
    {
        Buffer.Dispose();
        Device.Dispose();
    }
}

person Jeffrey    schedule 01.12.2016    source источник


Ответы (1)


Из-за var bits = 16; ожидаемое значение должно быть коротким (-32768, +32767), поэтому простая замена bufferData на new short[bufferDescription.BufferBytes]; и окончательный расчет bufferData[sample] = (short)(value * short.MaxValue); должны исправить шум.

person xoofx    schedule 02.12.2016