/// <summary> /// Buffering process /// </summary> private void BufferThreadle() { bool Running = true; while (Running) { if (m_BufferSeekRequested) { Thread.Sleep(10); continue; } if (m_StopRequested) { Running = false; continue; } if (m_ReachedEOF) { Running = false; continue; } if (m_PlayerState == OggPlayerStatus.Error) { Running = false; continue; } if (m_PauseRequested && m_PauseBuffer) { Thread.Sleep(10); continue; } if (m_BufferedSizeHeap.Total > m_MaxTotalBufferSize) { Thread.Sleep(10); continue; } OggBufferSegment obs; obs = m_CurrentFile.GetBufferSegment((int)m_BufferSize); if (obs.ReturnValue == 0) { // EOF SendMessage(OggPlayerMessageType.BufferEndOfFile); m_ReachedEOF = true; } else if (obs.ReturnValue < 0) { // Error! SendMessage(OggPlayerMessageType.FileReadError); StateChange(OggPlayerStatus.Error, OggPlayerStateChanger.Error); AL.SourceStop(m_Source); } else { // Read was OK, Buffer this data lock (OALLocker) { // Create a buffer reference uint BufferRef; AL.GenBuffer(out BufferRef); // Stick it on the end of the buffer ref heap m_BufferRefs.Enqueue(BufferRef); // Popuplate the buffer AL.BufferData((int)BufferRef, m_CurrentFile.Format, obs.Buffer, obs.ReturnValue, obs.RateHz); // Add it to the queue AL.SourceQueueBuffers(m_Source, 1, ref BufferRef); // Update counts m_BufferedSizeHeap.Push(obs.ReturnValue); float m_NewBufferOffset = m_CurrentFile.GetTime(); m_BufferedTimeHeap.Push(m_NewBufferOffset - m_BufferOffset); m_BufferOffset = m_NewBufferOffset; } } // Check for errors m_LastError = AL.GetError(); if (m_LastError != ALError.NoError) { StateChange(OggPlayerStatus.Error, OggPlayerStateChanger.Error); lock (OALLocker) { AL.SourceStop(m_Source); } SendMessage(OggPlayerMessageType.OpenALError, m_LastError); Running = false; } if (m_UpdateDelay > 0) { Thread.Sleep(m_UpdateDelay); } } }