예제 #1
0
        private void ReadFrames()
        {
            while (true)
            {
                if (m_stopReadingFrames)
                {
                    return;
                }

                float queuedAudioDuration;
                lock (m_audioPlayer)
                    queuedAudioDuration = m_audioPlayer.GetQueuedAudioDuration(m_outputSampleRate);

                while (queuedAudioDuration < minimalBufferedAudioDuration)
                {
                    if (m_stopReadingFrames)
                    {
                        return;
                    }

                    MVCommon.SharedRef <MVGraphAPI.Frame> newFrame = null;
                    lock (m_mvxRunner)
                    {
                        if (!m_mvxRunner.ProcessNextFrame())
                        {
                            break;
                        }

                        newFrame = new MVCommon.SharedRef <MVGraphAPI.Frame>(m_frameAccess.GetRecentProcessedFrame());
                    }
                    if (newFrame.sharedObj == null)
                    {
                        break;
                    }

                    MvxAudioChunk newAudioChunk = ExtractAudioFromFrame(newFrame);
                    if (newAudioChunk == null)
                    {
                        newFrame.Dispose();
                        break;
                    }

                    lock (m_audioChunkFramesQueue)
                    {
                        m_audioChunkFramesQueue.Enqueue(new KeyValuePair <MvxAudioChunk, MVCommon.SharedRef <MVGraphAPI.Frame> >(newAudioChunk, newFrame));
                        m_allocatedAudioChunks.Add(newAudioChunk);
                    }

                    lock (m_audioPlayer)
                    {
                        m_audioPlayer.EnqueueAudioChunk(newAudioChunk);
                        queuedAudioDuration = m_audioPlayer.GetQueuedAudioDuration(m_outputSampleRate);
                    }
                }

                Thread.Sleep(10);
            }
        }
예제 #2
0
        protected void ReadFrame()
        {
            if (!m_mvxRunner.ProcessFrame(frameId))
            {
                return;
            }

            lastReceivedFrame = new MVCommon.SharedRef <MVGraphAPI.Frame>(m_frameAccess.GetRecentProcessedFrame());
            if (lastReceivedFrame.sharedObj != null)
            {
                onNextFrameReceived.Invoke(lastReceivedFrame);
            }
        }