2012-04-09 10 views
1

나는 AsioOut에서 실행되는 sine wave example을 얻으려고했지만 왜곡 된 구형파처럼 들립니다. AsioOut은 PCM 형식 만 지원할 수 있습니까? asio .wav 파일 재생이 제대로 작동합니다 ...NAudio Asio 및 IeeeFloat 형식

그렇다면 어떻게 버퍼를 Ieee 부동으로 채우고 PCM으로 변환 할 수 있습니까? 또는 ASIO에서 Ieee를 palyback하는 가장 좋은 방법은 무엇입니까? 불필요한 샘플 변환을 피하려고합니다.

내 코드까지 지금까지 연속 값이 있는지 확인하기 위해 버퍼 크기에 맞는 사인파를 생성하려고했지만 샘플 속도 44100으로 초기화했습니다. 1 채널. 그런 다음 클래스의 인스턴스를 내 AsioOut의 Init()에 전달합니다.

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

답변

3

나는 버그를 발견했습니다. Asio는 어떻게 든 스테레오 디자인입니다. 그래서이 코드는 작동합니다 :

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

}