Search code examples
c#audio-recordingnaudio

Stop audio recorder on its own after time delay in c# ( using NAudio)


I am making an audio recorded using NAudio in C# and i need to remove the stop button used and simply stop the recording on its own after some time delay.

The code for the record event is

     private void cmbRecord_Click(object sender, EventArgs e)
     {
            outputFilename = "file address";

            waveInStream = new WaveIn(44100,2);
            writer = new WaveFileWriter(outputFilename, waveInStream.WaveFormat);

            waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable);
            waveInStream.StartRecording();


            // Just controling the objects on the screen.
            cmbRecord.Enabled = false;
            cmbStop.Enabled = true;

    } 


     void waveInStream_DataAvailable(object sender, WaveInEventArgs e)
    {
        writer.WriteData(e.Buffer, 0, e.BytesRecorded);
        int secondsRecorded = (int)(writer.Length / writer.WaveFormat.AverageBytesPerSecond);

    }

The stop button is given as

      private void cmbStop_Click(object sender, EventArgs e)
    {
        waveInStream.StopRecording();
        waveInStream.Dispose();
        waveInStream = null;
        writer.Close();
        writer = null;

        cmbRecord.Enabled = true;
        cmbStop.Enabled = false;
    }

I need to stop the recording automatically inside the cmbRecord_Click event. Thanks in advance.


Solution

  • use a Timer, set the Interval and copy the code in cmbStop_Click event over to timer's OnTick event. Enable the timer in the mbRecord_Click event and & remember to disable the timer in cmbStop_Click event

    Edit:

    Create a new timer and set its value

    //put this line in your form class level

      System.Windows.Forms.Timer mytimer=new System.Windows.Forms.Timer(); //create a new Timer
    

    //put these two into your form constructor just after InitializeComponent();

    mytimer.Interval=1000; //set the interval to 1 second.
    mytimer.Tick += new EventHandler(mytimer_Tick);
    

    Enable the timer in the mbRecord_Click event

    private void cmbRecord_Click(object sender, EventArgs e)
    {
                outputFilename = "file address";
    
                waveInStream = new WaveIn(44100,2);
                writer = new WaveFileWriter(outputFilename, waveInStream.WaveFormat);
    
                waveInStream.DataAvailable += new EventHandler<WaveInEventArgs>(waveInStream_DataAvailable);
                waveInStream.StartRecording();
    
    
                // Just controling the objects on the screen.
                cmbRecord.Enabled = false;
                cmbStop.Enabled = true;
    
                //Enable the timer to fire
                mytimer.Enabled = true;
    
    }
    

    Stop recording after 1 second..

    void mytimer_Tick(object sender, EventArgs e)
    {       
            waveInStream.StopRecording();
            waveInStream.Dispose();
            waveInStream = null;
            writer.Close();
            writer = null;
    
            cmbRecord.Enabled = true;
            cmbStop.Enabled = false;
    //disable the timer here so it won't fire again...
            mytimer.Enabled = false;
    }