[英]NAudio playing a sine wave for x milliseconds using C#
我正在使用NAudio播放给定频率的正弦波,如在NAudio的博客文章Playback of Sine Wave中 。 我只想让声音播放()x毫秒,然后停止。
我尝试了一个thread.sleep,但声音立即停止。 我尝试了一个计时器,但是当处理WaveOut时,会出现一个跨线程异常。
我尝试了这段代码,但是当我打电话给beep时,程序会冻结。
public class Beep
{
public Beep(int freq, int ms)
{
SineWaveProvider32 sineWaveProvider = new SineWaveProvider32();
sineWaveProvider.Amplitude = 0.25f;
sineWaveProvider.Frequency = freq;
NAudio.Wave.WaveOut waveOut = new NAudio.Wave.WaveOut(WaveCallbackInfo.FunctionCallback());
waveOut.Init(sineWaveProvider);
waveOut.Play();
Thread.Sleep(ms);
waveOut.Stop();
waveOut.Dispose();
}
}
public class SineWaveProvider32 : NAudio.Wave.WaveProvider32
{
int sample;
public SineWaveProvider32()
{
Frequency = 1000;
Amplitude = 0.25f; // Let's not hurt our ears
}
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 n = 0; n < sampleCount; n++)
{
buffer[n + offset] = (float)(Amplitude * Math.Sin((2 * Math.PI * sample * Frequency) / sampleRate));
sample++;
if (sample >= sampleRate)
sample = 0;
}
}
SineWaveProvider32类不需要无限期地提供音频。 如果您希望蜂鸣声的最大持续时间为一秒(比方说),那么对于单声道44.1 kHz,您需要提供44,100个样本。 当没有更多数据供应时,Read方法应该返回0。
要使你的GUI线程不被阻塞,你需要摆脱Thread.Sleep,waveOut.Stop和Dispose,然后开始播放音频(你可能会发现窗口回调比函数更可靠)。
然后,当音频播放完毕后,您可以关闭并清理WaveOut对象。
查看博客文章将变量传递给C#中的新线程,了解如何将变量传递给另一个线程。
我想你想要做的就是创建一个播放你的声音的线程,创建一个计时器,然后启动线程。 当计时器到期时,终止线程,当线程关闭时,它会进行所有清理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.