I want to play MP3 file downloaded from the web using NET provided System.Media.SoundPlayer mechanism. As it works with WAV formats, it requires the support of e.g. NAudio l
Based on Lee Harrison answer, I've created alternative code which is better.
(3) plays directly MP3 file from WEB without conversion to WAV and without usage of disk operations:
public void Speak(Uri mp3FileUri)
{
using (var client = new WebClient())
{
using (var networkStream = client.OpenRead(mp3FileUri))
{
if (networkStream != null)
{
using (var memStream = new MemoryStream())
{
networkStream.CopyTo(memStream);
memStream.Position = 0;
using (var waveOut = new WaveOut(WaveCallbackInfo.FunctionCallback()))
{
var waveEvent = new ManualResetEvent(false);
waveOut.PlaybackStopped += (sender, e) => waveEvent.Set();
waveEvent.Reset();
using (var rdr = new Mp3FileReader(memStream))
using (var waveStream = WaveFormatConversionStream.CreatePcmStream(rdr))
using (var baStream = new BlockAlignReductionStream(waveStream))
{
waveOut.Init(baStream);
waveOut.Play();
if (waveOut.PlaybackState != PlaybackState.Stopped)
{
waveEvent.WaitOne(); /* block thread for a while because I don't want async play back
(to be analogical as usage of SoundPlayer Play method) */
}
}
}
}
}
}
}
}
Nevertheless (despite this is quite good for me), I still don't know what's the problem with sample (2).
Why not skip using SoundPlayer and play the MP3 directly through NAudio? NAudio was designed to do this. Just download the MP3 into a temp file somewhere, and play it with NAudio, and delete the temp file once your finished with it. I don't think anything can be done to reduce a delay while downloading the file though.
http://naudio.codeplex.com/wikipage?title=MP3