public void Play(IPlayable wave)
{
lock (mutex)
{
if (wave == current)
{
if (isPaused)
{
sourceVoice.Start();
isPaused = false;
return;
}
}
DisposeWave();
xaudio.CommitChanges();
isPaused = false;
current = wave;
currentStream = wave as IPlayableStream;
if (decodeThread != null)
{
System.Threading.Monitor.Pulse(mutex);
decodeThread = null;
}
if (currentStream == null)
{
sourceVoice = new SourceVoice(xaudio, wave.WaveFormat);
dataStream = new SlimDX.DataStream(wave.WaveData, true, false);
audioBuffer = new SlimDX.XAudio2.AudioBuffer();
audioBuffer.AudioData = dataStream;
audioBuffer.AudioBytes = wave.WaveData.Length;
audioBuffer.Flags = BufferFlags.EndOfStream;
sourceVoice.SubmitSourceBuffer(audioBuffer);
sourceVoice.Start();
}
else
{
streamLength = currentStream.StreamLength;
streamBuffered = 0;
sourceVoice = new SourceVoice(xaudio, wave.WaveFormat);
sourceVoice.BufferEnd += bufferEndCallback;
// Fill buffers initially
bool isDone = false;
for (var i = 0; i < NumStreamingBuffers; i++)
{
isDone = FillBuffer(i, currentStream);
if (isDone)
{
break;
}
}
sourceVoice.Start();
if (!isDone)
{
System.Threading.ParameterizedThreadStart threadProc = DecoderThread;
decodeThread = new System.Threading.Thread(threadProc);
decodeThread.Name = "Vorbis Decoder Thread";
decodeThread.Start(currentStream);
}
}
}
}