Index: CardManagement/CardHandler/CardTuner.cs =================================================================== --- CardManagement/CardHandler/CardTuner.cs (revision 26725) +++ CardManagement/CardHandler/CardTuner.cs (working copy) @@ -139,8 +139,9 @@ _cardHandler.Card.FreeSubChannel(user.SubChannel); } } - + _cardHandler.TimeShifter.OnBeforeTune(); result = _cardHandler.Card.Tune(user.SubChannel, channel); + _cardHandler.TimeShifter.OnAfterTune(); bool isLocked = _cardHandler.Card.IsTunerLocked; Log.Debug("card: Tuner locked: {0}", isLocked); Index: CardManagement/CardHandler/TimeShifter.cs =================================================================== --- CardManagement/CardHandler/TimeShifter.cs (revision 26725) +++ CardManagement/CardHandler/TimeShifter.cs (working copy) @@ -66,8 +66,8 @@ _waitForTimeshifting = Int32.Parse(layer.GetSetting("timeshiftWaitForTimeshifting", "15").Value); - _timeAudioEvent = DateTime.Now; - _timeVideoEvent = DateTime.Now; + _timeAudioEvent = DateTime.MinValue; + _timeVideoEvent = DateTime.MinValue; } @@ -278,18 +278,28 @@ } private void AudioVideoEventHandler(PidType pidType) - { + { + if (_tuneInProgress) + { + Log.Info("audioVideoEventHandler - tune in progress"); + return; + } + // we are only interested in video and audio PIDs if (pidType == PidType.Audio) - { - TimeSpan ts = DateTime.Now - _timeAudioEvent; - if (ts.TotalMilliseconds > 1000) - { - // Avoid repetitive events that are kept for next channel change, so trig only once. - Log.Info("audioVideoEventHandler {0}", pidType); - _eventAudio.Set(); - } - _timeAudioEvent = DateTime.Now; + { + TimeSpan ts = DateTime.Now - _timeAudioEvent; + if (ts.TotalMilliseconds > 1000) + { + // Avoid repetitive events that are kept for next channel change, so trig only once. + Log.Info("audioVideoEventHandler {0}", pidType); + _eventAudio.Set(); + } + else + { + Log.Info("audio last seen at {0}", _timeAudioEvent); + } + _timeAudioEvent = DateTime.Now; } if (pidType == PidType.Video) @@ -301,6 +311,10 @@ Log.Info("audioVideoEventHandler {0}", pidType); _eventVideo.Set(); } + else + { + Log.Info("video last seen at {0}", _timeVideoEvent); + } _timeVideoEvent = DateTime.Now; } } @@ -428,7 +442,8 @@ { Stop(ref user); return TvResult.UnableToStartGraph; - } + } + fileName += ".tsbuffer"; if (!WaitForTimeShiftFile(ref user, out isScrambled)) { @@ -657,7 +672,7 @@ } else { - Log.Write("card: WaitForTimeShiftFile - waiting _eventAudio & _eventVideo"); + Log.Write("card: WaitForTimeShiftFile - waiting _eventAudio & _eventVideo"); // block until video & audio PIDs are seen or the timeout is reached if (_eventAudio.WaitOne(waitForEvent, true)) { @@ -701,5 +716,20 @@ } return false; } + + private bool _tuneInProgress = false; + public void OnBeforeTune() + { + _tuneInProgress = true; + } + + public void OnAfterTune() + { + Log.Debug("resetting audio/video time"); + _timeAudioEvent = DateTime.MinValue; + _timeVideoEvent = DateTime.MinValue; + + _tuneInProgress = false; + } } } \ No newline at end of file