簡體   English   中英

NAudio使用C#播放正弦波x毫秒

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM