1

AsioOutで正弦波の例を実行しようとしましたが、歪んだ方形波のように聞こえます。AsioOutがPCMフォーマットのみをサポートする可能性はありますか?asio.wavファイルの再生は問題なく機能します...

もしそうなら、どうすれば私のバッファをIeeeフロートで満たしてPCMに変換できますか?または、ASIOでIeeeをパリーバックするための最良の方法は何ですか?不必要なサンプル変換は避けたいです。

これまでの私のコードでは、バッファサイズに適合する正弦波を生成しようとしました。連続値があることを確認するために、サンプルレート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;
    }
}
4

1 に答える 1

3

OK、バグを見つけました。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;
    }

}
于 2012-04-09T02:13:07.033 に答える