NAudio воспроизводит синусоидальную волну в течение x миллисекунд с использованием C #

Я использую NAudio для воспроизведения синусоиды заданной частоты, как в сообщении блога Воспроизведение синусоидальной волны в NAudio . Я просто хочу, чтобы звук воспроизводился () в течение x миллисекунд, а затем останавливался.

Я пробовал thread.sleep, но звук сразу прекращается. Я пробовал использовать таймер, но когда WaveOut удаляется, возникает исключение между потоками.

Я пробовал этот код, но когда я вызываю звуковой сигнал, программа зависает.

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;
        }
   }

6
задан Peter Mortensen 22 March 2015 в 14:03
поделиться