Ejemplo n.º 1
0
        public void Advance(int samples, int overrunThreshold, int advanceSamples, bool expectedUnderrun)
        {
            // Setup
            _audioBuffer.OverrunThreshold = overrunThreshold;
            _audioBuffer.ReadSpeed        = 1;

            for (int i = 0; i < samples; i++)
            {
                _audioBuffer.Write(1);
            }

            // Act
            _audioBuffer.Advance(advanceSamples);

            // Verify
            Assert.AreEqual(expectedUnderrun, _audioBuffer.WaitForUnderrun(0));
        }
Ejemplo n.º 2
0
        override protected bool FrameSchedule()
        {
            bool bVideoAdded = false;
            bool bAudioAdded = false;
            uint nVideoFramesBuffered = 0, nAudioSamplesBuffered = 0;
            long nAudioStreamTime = 0, nVideoStreamTime = 0;

            Frame.Audio cFrameAudio;
            Frame.Video cFrameVideo;
            _dtLastTimeFrameScheduleCalled = DateTime.Now;

            #region audio

            if (!NextFrameAttached)
            {
                return(false);
            }

            try
            {
                nAudioSamplesBuffered = uint.MinValue;

                if (
                    _nAudioBufferCapacity_InSamples >= nAudioSamplesBuffered + Preferences.nAudioSamplesPerFrame &&
                    null != (cFrameAudio = AudioFrameGet()) &&
                    null != cFrameAudio.aFrameBytes &&
                    0 < cFrameAudio.aFrameBytes.Length
                    )
                {
                    cFrameAudio.Dispose();

                    bAudioAdded            = true;
                    nAudioSamplesBuffered += Preferences.nAudioSamplesPerFrame;
                    _cAudioBuffer.Advance();

                    _nAudioQueueLength = (int)(nAudioSamplesBuffered / Preferences.nAudioSamplesPerFrame) + 1;                     //logging
                }
            }
            catch (Exception ex)
            {
                (new Logger("DeckLinkFake", sName)).WriteError(ex);
            }

            // bug
            //System.Threading.Thread.Sleep(20);


            #endregion
            #region video
            try
            {
                nVideoFramesBuffered = uint.MinValue;
                //BTL.Baetylus.nVideoFramesBuffered = nVideoFramesBuffered; //отладка
                while (Preferences.nQueueDeviceLength > nVideoFramesBuffered)                              // (_nVideoBufferCapacity > nVideoFramesBuffered)
                {
                    if (null == (cFrameVideo = VideoFrameGet()) || IntPtr.Zero == cFrameVideo.pFrameBytes) // _nFPS + _nVideoBufferExtraCapacity < nVideoFramesBuffered
                    {
                        (new Logger("DeckLinkFake", sName)).WriteDebug("got null instead of frame IN DECKLINK !!");
                        break;
                    }
                    bVideoAdded = true;
                    break;



                    lock (_ahFramesBuffersBinds)
                    {
                        if (!_ahFramesBuffersBinds.ContainsKey(cFrameVideo))
                        {
                            (new Logger("DeckLinkFake", sName)).WriteError(new Exception("полученный видео буфер не зарегистрирован [" + cFrameVideo.pFrameBytes.ToInt64() + "]"));
                            continue;
                        }

                        _cBugCatcherScheduleFrame.Enqueue(cFrameVideo, "FrameSchedule: [_ahFramesBuffersBinds.Count = " + _ahFramesBuffersBinds.Count + "]");



                        if (!Device._aCurrentFramesIDs.ContainsKey(cFrameVideo.nID))
                        {
                            (new Logger("DeckLinkFake", sName)).WriteDebug4("frame " + cFrameVideo.nID + " was added");
                            Device._aCurrentFramesIDs.Add(cFrameVideo.nID, _cStopWatch.ElapsedMilliseconds);
                        }
                        else if (0 < cFrameVideo.nID && _cVideoFrameEmpty.nID != cFrameVideo.nID)                         // && 0 < Baetylus.nVideoBufferCount
                        {
                            (new Logger("DeckLinkFake", sName)).WriteDebug("VERY STRANGE - 2   error  [id=" + cFrameVideo.nID + "]");
                        }
                    }
                    bVideoAdded = true;
                    n__PROBA__AudioFramesBuffered = _nAudioQueueLength;
                    n__PROBA__VideoFramesBuffered = (int)nVideoFramesBuffered + 1;

                    break;
                }
            }
            catch (Exception ex)
            {
                (new Logger("DeckLinkFake", sName)).WriteError(ex);
            }
            #endregion
            return(bVideoAdded || bAudioAdded);            //??
        }