2023-03-17

Recording stopped after waveout is stopped naudio c#

I have a windows forms application that does multiple recording from multiple microphone inputs. I listen to the input one after the other, using a WaveInProvider and DirectSoundOut with a variable called waveOut, on using the waveOut.Play().

This works, but when I click the button to stop listening using waveOut.Stop() and Dispose, the recording stops too.

Please how can I stop this behaviour, so that the recording does not stop.

My code is below Thanks:

private List<Label> lblRecordingStatus = new List<Label>();
private DirectSoundOut waveOut = null;

void RecordMicNAudio(int deviceNum, IProgress<int> progress, string StationName, WaveFileWriter wfWriter, WaveInEvent waveSource, Label lblCurrentStatus)
    {
        try
        {
            //waveSource = new WaveInEvent();              
            SetControlText(lblCurrentStatus, "Recording...");

            waveSource.DeviceNumber = deviceNum;
            waveSource.WaveFormat = new WaveFormat(sampleRate, bits: 16, WaveIn.GetCapabilities(deviceNum).Channels);
            waveSource.DataAvailable += (_, e) =>
            {
                if (wfWriter == null)
                {
                    startTime = DateTime.Now;
                    wfWriter = new WaveFileWriter(StationName + " " + startTime.ToString("yyyy-MM-dd_HH-mm-ss") + ".wav", waveSource.WaveFormat);
                }
                else
                {
                    TimeSpan elapsed = DateTime.Now - startTime;
                    //elapsed.TotalHours >= 1
                    if (elapsed.TotalMinutes >= 5)
                    {
                        wfWriter.Dispose();
                        wfWriter = null;
                    }
                }
                if (wfWriter != null)
                {
                    wfWriter.Write(e.Buffer, 0, e.BytesRecorded);
                    wfWriter.Flush();
                }

                //Volume Meter
                if (progress != null)
                {
                    int bytesPerSample = waveSource.WaveFormat.BitsPerSample / 8;
                    int newSampleCount = e.BytesRecorded / bytesPerSample;
                    double[] buffer = new double[newSampleCount];

                    double peak = 0;
                    for (int i = 0; i < newSampleCount; i++)
                    {
                        buffer[i] = BitConverter.ToInt16(e.Buffer, i * bytesPerSample);
                        peak = Math.Max(peak, buffer[i]);
                    }

                    var prp = peak / (1 << 15);
                    var pVal = (int)(prp * 100);

                    if (IsHandleCreated)
                    {
                        if(InvokeRequired)
                        {
                            progress.Report(pVal);
                        }
                        else
                            progress.Report(pVal);
                    }
                        
                }
            };
            waveSource.RecordingStopped += (_, _) =>
            {
                if (waveSource != null)
                {                        
                    waveSource.Dispose();
                    waveSource = null;
                }

                if (wfWriter != null)
                {
                    wfWriter.Dispose();
                    wfWriter = null;
                }

                SetControlText(lblCurrentStatus, "Recording Stopped!!!");
            };

            waveSource.StartRecording();
        }
        catch (Exception ex)
        {
            SetControlText(lblCurrentStatus, "Error Occured!" + ex.Message);
        }
    }


private void btnSpeakerOn_Click(object sender, EventArgs e)
    {
        //Get Wavesource parameter, to determine which wavesource to listen to
        Button btn = sender as Button;
        var extractedString = Regex.Match(btn.Name, @"\d+").Value;
        var index = !string.IsNullOrEmpty(extractedString) ? Convert.ToInt32(extractedString) : 0;

        foreach (var item in btnSpeak)
        {
            if (item == btnSpeak[index])
            { 
                item.Visible = false;
                btnMute[index].Visible = true;
            }
            else
                item.Enabled = false;
        }

        //Start listening to waveSource
        _ = Task.Run(() =>
        {
            //producers[index] is the WaveInEvent waveSource currently passed into the method
            WaveInProvider waveIn = new WaveInProvider(producers[index]);
            waveOut = new DirectSoundOut();
            waveOut.Init(waveIn);

            waveOut.Play();
        });
    }

    private void btnSpeakerOff_Click(object sender, EventArgs e)
    {
        try
        {
            if (waveOut != null)
            {
                foreach (var item in btnSpeak)
                {
                    item.Visible = true;
                    item.Enabled = true;
                }

                waveOut.Stop();
                waveOut.Dispose();
                waveOut = null;
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }


No comments:

Post a Comment