Search code examples
c#naudiomemorystream

NAudio don't play RawSourceWaveStream


I want to play wave audio stream while recording to a file. I tried to achieve this result using MemoryStream and RawSourceWaveStream. It seems to work, audio is correctly recorded in file, but when I play the audio from stream nothing is played.

Here is my source code, would be someone so nice to tell me where can be the problem?

Thanks.

using System;
using System.Windows.Forms;
using NAudio.Wave;
using NAudio.Wave.SampleProviders;
using static System.Environment;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        WaveFileWriter fileWriter;
        WaveOut outputSound;
        WaveIn waveSource;
        RawSourceWaveStream RSS;
        OffsetSampleProvider offsetSampleProvider;
        Stream sourceStream;

        string fileName = GetFolderPath(SpecialFolder.CommonApplicationData) + "\\temp.wav";

        public Form1()
        {
            InitializeComponent();

            outputSound = new WaveOut();
            waveSource = new WaveIn();
            waveSource.WaveFormat = new WaveFormat(8000, 16, 1);
            waveSource.DataAvailable += new EventHandler<WaveInEventArgs>(waveSource_DataAvailable);
            fileWriter = new WaveFileWriter(fileName, waveSource.WaveFormat);
            sourceStream = new MemoryStream();

            waveSource.StartRecording();
        }

        private void waveSource_DataAvailable(object sender, WaveInEventArgs e)
        {
            fileWriter.Write(e.Buffer, 0, e.BytesRecorded);
            sourceStream.Write(e.Buffer, 0, e.BytesRecorded);
        }

        private void btnPlay_Click(object sender, EventArgs e)
        {
            RSS = new RawSourceWaveStream(sourceStream, waveSource.WaveFormat);
            offsetSampleProvider = new OffsetSampleProvider(RSS.ToSampleProvider());
            offsetSampleProvider.SkipOver = TimeSpan.FromMilliseconds(0);
            offsetSampleProvider.Take = TimeSpan.FromMilliseconds(3000);
            outputSound.Init(offsetSampleProvider);
            outputSound.Play();
        }
    }
}

Solution

  • I found where is the problem.

    After the line:

    RSS = new RawSourceWaveStream(sourceStream, waveSource.WaveFormat);
    

    I have to set the position of RawSourceWaveStream to 0.

    RSS.Position = 0;