(NAudio)如何使用缓冲区播放C#中不断变化的音频波的单个样本?

(NAudio)如何使用缓冲区播放C#中不断变化的音频波的单个样本?,c#,audio,stream,naudio,C#,Audio,Stream,Naudio,我正在写一个模拟“DCF77”信号改变无线电时钟时间的程序。 为了实现这一点,我必须使用不断变化的波(不断变化的音量水平)连续播放声音(没有破裂的声音;无缝播放) 我被告知使用NAudio和一个缓冲区,它存储样本/1个样本,将它们/它发送到声卡,并根据需要请求更多样本 但我如何实现这一点 我当前的代码有一个包含60个元素的数组,称为位,用于确定声音每秒的变化。 此数组每分钟重新计算一次 如果您不知道,DCF77信号对二进制信息进行如下编码: 0表示每秒前0.1秒的音量约为正常音量的15%。 A

我正在写一个模拟“DCF77”信号改变无线电时钟时间的程序。 为了实现这一点,我必须使用不断变化的波(不断变化的音量水平)连续播放声音(没有破裂的声音;无缝播放)

我被告知使用NAudio和一个缓冲区,它存储样本/1个样本,将它们/它发送到声卡,并根据需要请求更多样本

但我如何实现这一点

我当前的代码有一个包含60个元素的数组,称为位,用于确定声音每秒的变化。 此数组每分钟重新计算一次

如果您不知道,DCF77信号对二进制信息进行如下编码: 0表示每秒前0.1秒的音量约为正常音量的15%。 A 1表示相同,但持续0.2秒

现在,我有一个SineWaveProvider32类:

class SineWaveProvider32 : WaveProvider32
{
    int sample;

    public SineWaveProvider32()
    {
        Frequency = 1000;
        Amplitude = 0.25f;
    }

    public float Frequency { get; set; }
    public float Amplitude { get; set; }

    public override int Read(float[] buffer, int offset, int sampleCount)
    {
        int sampleRate = WaveFormat.SampleRate;

        for(int i = 0; i < sampleCount; i++)
        {
            buffer[i + offset] = (float)(Amplitude * Math.Sin((2 * Math.PI * sample * Frequency) / sampleRate));
            sample++;
            if(sample >= sampleRate)
            {
                sample = 0;
            }
        }

        return sampleCount;
    }
}
主代码有以下方法:

void StartStopSineWave()
{
    if (waveOut == null)
    {
        var sineWaveProvider = new SineWaveProvider32();
        sineWaveProvider.SetWaveFormat(192000, 1);
        sineWaveProvider.Frequency = 1000;
        sineWaveProvider.Amplitude = 0.25f;
        waveOut = new WaveOut();
        waveOut.Init(sineWaveProvider);
        waveOut.Play();
    }
    else
    {
        waveOut.Stop();
        waveOut.Dispose();
        waveOut = null;
    }
}
请注意,我对C#比较陌生,如果这是一个重复的问题,很抱歉,但我找不到任何有用的信息,或者至少我不理解它

编辑:对于任何可能有同样问题的人,我通过输出一个恒定的正弦波并使用

waveOut.Volume
我知道这并不完美,但它对我所做的工作有效

waveOut.Volume