I need complete code in c# that uses NAudio in web app. All examples I found so far use winform.
I tried visoForge.NAudio in webform page. But I was not able to figure out how to plumb it out.
First I want to be able to record my voice and paly it back to make sure I did right.
using System;
using System.Web.UI;
using VisioForge.Shared.NAudio.Wave;
namespace NAudiWebApp
{
class SavingWaveProvider : IWaveProvider, IDisposable
{
private readonly IWaveProvider sourceWaveProvider;
private readonly WaveFileWriter writer;
private bool isWriterDisposed;
public SavingWaveProvider(IWaveProvider sourceWaveProvider, string wavFilePath)
{
this.sourceWaveProvider = sourceWaveProvider;
writer = new WaveFileWriter(wavFilePath, sourceWaveProvider.WaveFormat);
}
public WaveFormat WaveFormat { get { return sourceWaveProvider.WaveFormat; } }
public void Dispose()
{
if (!isWriterDisposed)
{
isWriterDisposed = true;
writer.Dispose();
}
}
public int Read(byte[] buffer, int offset, int count)
{
var read = sourceWaveProvider.Read(buffer, offset, count);
if (count > 0 && !isWriterDisposed)
{
writer.Write(buffer, offset, read);
}
if (count == 0)
{
Dispose(); // auto-dispose in case users forget
}
return read;
}
}
public partial class About : Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
private WaveIn recorder;
private BufferedWaveProvider bufferedWaveProvider;
private SavingWaveProvider savingWaveProvider;
private WaveOut player;
IWavePlayer waveOut;
WaveRecorder recorder1;
protected void OnStartRecordingClick(object sender, EventArgs e)
{
// set up the recorder
recorder = new WaveIn();
recorder.DataAvailable += RecorderOnDataAvailable;
// set up our signal chain
bufferedWaveProvider = new BufferedWaveProvider(recorder.WaveFormat);
savingWaveProvider = new SavingWaveProvider(bufferedWaveProvider, "temp.wav");
// set up playback
player = new WaveOut();
player.Init(savingWaveProvider);
// begin playback & record
player.Play();
recorder.StartRecording();
}
private void RecorderOnDataAvailable(object sender, WaveInEventArgs waveInEventArgs)
{
bufferedWaveProvider.AddSamples(waveInEventArgs.Buffer, 0, waveInEventArgs.BytesRecorded);
}
protected void OnStopRecordingClick(object sender, EventArgs e)
{
// stop recording
recorder.StopRecording();
// stop playback
player.Stop();
// finalise the WAV file
savingWaveProvider.Dispose();
}
}
/// <summary>
/// Utility class to intercept audio from an IWaveProvider and
/// save it to disk
/// </summary>
public class WaveRecorder : IWaveProvider, IDisposable
{
private WaveFileWriter writer;
private IWaveProvider source;
/// <summary>
/// Constructs a new WaveRecorder
/// </summary>
/// <param name="destination">The location to write the WAV file to</param>
/// <param name="source">The source Wave Provider</param>
public WaveRecorder(IWaveProvider source, string destination)
{
this.source = source;
this.writer = new WaveFileWriter(destination, source.WaveFormat);
}
/// <summary>
/// Read simply returns what the source returns, but writes to disk along the way
/// </summary>
public int Read(byte[] buffer, int offset, int count)
{
int bytesRead = source.Read(buffer, offset, count);
writer.WriteData(buffer, offset, bytesRead);
return bytesRead;
}
/// <summary>
/// The WaveFormat
/// </summary>
public WaveFormat WaveFormat
{
get { return source.WaveFormat; }
}
/// <summary>
/// Closes the WAV file
/// </summary>
public void Dispose()
{
if (writer != null)
{
writer.Dispose();
writer = null;
}
}
}
}