예제 #1
0
        /// <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);
                }
            }
        }