2012-04-09 11 views
1

Ich habe versucht, die sine wave example läuft auf einem AsioOut, aber es klingt eher wie eine verzerrte Rechteckwelle. ist es möglich, dass der AsioOut nur PCM-Formate unterstützt? die asio .wav-Datei-Wiedergabe funktioniert gut ...NAudio Asio und IeeeFloat Format

Wenn ja, wie kann ich meine Puffer mit Ieee Schwimmer füllen und in PCM konvertieren? oder was ist der beste Weg, Ieee auf ASIO zu palyieren? ich würde lieben, unnötige Beispielumwandlungen zu vermeiden.

in meinem Code bis jetzt, habe ich versucht, eine Sinuswelle zu erzeugen, die die Puffergröße passt, um sicherzustellen, dass ich ununterbrochene Werte habe, initialisiere ich es mit Beispielrate 44100 und 1 Kanal. Ich gehe dann eine Instanz der Klasse in die Init() meines AsioOut:

public class SineWaveProvider32 : IWaveProvider 
{ 
    private WaveFormat waveFormat; 
    public WaveFormat WaveFormat 
    { 
     get 
     { 
      return this.waveFormat; 
     } 
    } 

    public SineWaveProvider32() : this(44100, 1) 
    { 
    } 

    public SineWaveProvider32(int sampleRate, int channels) 
    { 
     this.SetWaveFormat(sampleRate, channels); 
    } 

    public void SetWaveFormat(int sampleRate, int channels) 
    { 
     this.waveFormat = WaveFormat.CreateIeeeFloatWaveFormat(sampleRate, channels); 
    } 

      public unsafe int Read(byte[] buffer, int offset, int count) 
    { 
     var samples = count/4; 
     fixed(byte* buff = buffer) 
     { 
      for (int n = 0; n < samples; n++) 
      { 
       var num = (float)(Math.Sin((2 * Math.PI * n)/ samples)); 
       ((float*)buff)[n] = num; 
      } 
     } 

     return count; 
    } 
} 

Antwort

3

Ok ich den Fehler gefunden. Asio ist irgendwie Stereo von Design. so funktioniert dieser Code:

public class SineWaveProvider32 : IWaveProvider 
{ 
    private WaveFormat waveFormat; 
    public WaveFormat WaveFormat 
    { 
     get 
     { 
      return this.waveFormat; 
     } 
    } 

    public SineWaveProvider32() : this(44100, 2) 
    { 
    } 

    public SineWaveProvider32(int sampleRate, int channels) 
    { 
     this.SetWaveFormat(sampleRate, channels); 
    } 

    public void SetWaveFormat(int sampleRate, int channels) 
    { 
     this.waveFormat = WaveFormat.CreateIeeeFloatWaveFormat(sampleRate, channels); 
    } 

    public unsafe int Read(byte[] buffer, int offset, int count) 
    { 
     var samples = count/4; 
     fixed(byte* buff = buffer) 
     { 
      for (int n = 0; n < samples; n+=2) 
      { 
       var num = (float)(Math.Sin((2 * Math.PI * n * 3)/ samples)); 
       ((float*)buff)[n] = 0; 
       ((float*)buff)[n+1] = num; 
      } 
     } 

     return count; 
    } 

}