2016-12-01 18 views
0

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

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

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

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

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

ответ

0

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