Ok and on my previous note, if someone need output driven using WaveFormatConversion this should also work
public class ConverterProviderToWaveStream : WaveStream
{
public IWaveProvider source;
//public BufferedWaveProvider source; //alternative
public bool reached_end = false;
private object sourceLock = new object();
public WaveFormat WaveFormat
{
get;// { return this.WaveFormat; }
set;// { this.WaveFormat = var; }
}
//public WaveFormat WaveFormat { get { return this.WaveFormat; } }
public ConverterProviderToWaveStream(IWaveProvider sourceStream)
//public ConverterProviderToWaveStream(BufferedWaveProvider sourceStream) //alternative
{
this.source = sourceStream;
WaveFormat = source.WaveFormat;
}
//public override long Length
//{
//get { return source.Length; }
//}
//public override long Position
//{
//get { return source.Position; }
//set { lock (sourceLock) { source.Position = value; } }
//}
public int Read(byte[] buffer, int offset, int count)
{
int read;
//int available_bytes = source.BufferedBytes; //alternative
lock (sourceLock)
{
try
{
read = source.Read(buffer, offset, count);
//read = source.Read(buffer, offset, available_bytes); //alternative if source is BufferedWaveProvider and you dont want silence inserted
}
catch
{
read = 0;
}
}
if (read <= 0) reached_end = true; else reached_end = false;//alternative
return read;
}
}
WaveFormatConversionStream converter = new WaveFormatConversionStream(new WaveFormat(8000, 1), new ConverterProviderToWaveStream(MicBufferedWaveProvider));
int read = converter.Read(my_8000_16_mono_buf, 0, count_that_you_need_to_calculate_first);//you might need to be carefull when calculating count based on MicBufferedWaveProvider.BufferedBytes and reduce it by few samples due to different block align
//then num read form my_8000_16_mono_buf send to where you want