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)); }
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); //?? }