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