I am trying to figure out how to stream a WAV file. There are examples on stream MP3 files but nothing for a WAV file. I have managed to create a WaveStream and play it back. However, when I try to break it up the first set bytes plays but after that I get noise.
In the example below the ConcurrentQueue will simulate what I want to stream:
In the example below the ConcurrentQueue will simulate what I want to stream:
// Class member variables:
ConcurrentQueue<byte[]> _cq1 = new ConcurrentQueue<byte[]>();
private static WaveFormat _waveFormat = new WaveFormat(16000, 16, 2);
private static WaveOut _waveOut1 = new WaveOut();
private static BufferedWaveProvider _waveProvider1 =
new BufferedWaveProvider(_waveFormat);
// Class constructor
public MainWindow()
{
_waveOut1.Init(_waveProvider1);
_waveOut1.Play();
}
// These methods are executed on a seperate thread.
WaveStream convertedStream = GetAudio("MyFile.Wav");
AddAudio(convertedStream);
// This method is executed on a seperate thread.
PlayAudio();
private WaveStream GetAudio(string wavFile)
{
WaveFileReader reader = new WaveFileReader(wavFile);
WaveStream convertedStream =
new WaveFormatConversionStream(_waveFormat, reader);
return convertedStream;
}
private void AddAudio(WaveStream convertedStream)
{
int bufferSize = (int)convertedStream.Length / _audioSamples;
byte[] bytes = new byte[bufferSize];
int count = bufferSize;
convertedStream.Position = 0;
int offset = 0;
for (; ; )
{
count = convertedStream.Read(bytes, offset, bufferSize);
_cq1.Enqueue(bytes);
offset += bufferSize;
if (count == 0)
{
break;
}
}
}
private void PlayAudio()
{
byte[] buffer;
for (; ; )
{
if (_cq1.TryDequeue(out buffer))
{
_waveProvider1.AddSamples(buffer, 0, buffer.Length);
}
Thread.Sleep(_sleepMilliSeconds);
}
}