public void ResetPlayback(HLSProgram program, TimeSpan duration) { _program = program; _playlist = null; _duration = duration; _currentPosition = 0; }
/// <summary> /// Internal handler for playlist load event /// </summary> internal void PlaylistLoadEnded() { if (_pendingSubPlayListCount > 0) { lock (this) { _pendingSubPlayListCount --; if (0 == _pendingSubPlayListCount) { if (null != _allSubPlayListEvent) { _allSubPlayListEvent(); } } } } else { if (IsEndList || _playlist.PlaylistDuration > _liveDvrMinDuration) _duration = _playlist.PlaylistDuration; _LastSubPlaylistLoaded = _playlist; if (_asyncResult != null && _asyncResult.Purpose == HLSCallbackPurpose.WaitForPlaylist) { if (!IsEndList && ( CurrentMediaSequenceNumber > CurrentStream.SequenceNumber ) && !HLSPlaylist.IsSequenceNubmerRollback( CurrentStream.SequenceNumber, _playlist.Streams.Count, CurrentMediaSequenceNumber ) ) { _asyncResult.Purpose = HLSCallbackPurpose.WaitForPlaylist; _playlist.Reload(); } else if (!BeginLoadingNextStream()) { _asyncResult.CompleteWithAsyncState(null); } } } }
/// <summary> /// Asynchronous public API for getting next stream to play. /// </summary> /// <param name="callback"></param> /// <param name="state"></param> /// <returns></returns> public IAsyncResult BeginGetNextStream(AsyncCallback callback, Object state) { if (_program == null) throw new InvalidOperationException("program not set"); if ( IsWebRequestPending() ) throw new InvalidOperationException("operation is already in progress"); _asyncResult = new HLSCallbackImpl(callback); if (_playlist == null) { _playlist = SelectNextVariant(); _playlist.Playback = this; _currentPosition = 0; _currentMediaSequenceNumber = 0; _discontinuity = true; if (IsEndList || _playlist.PlaylistDuration > _liveDvrMinDuration) _duration = _playlist.PlaylistDuration; if (_downloadBitrateChanged != null) _downloadBitrateChanged(this, _playlist.Bitrate); } else { _currentPosition++; _currentMediaSequenceNumber++; HLSPlaylistImpl newPlaylist = SelectNextVariant(); if (newPlaylist != _playlist) { _discontinuity = true; if (_downloadBitrateChanged != null && newPlaylist.Bitrate != _playlist.Bitrate) _downloadBitrateChanged(this, newPlaylist.Bitrate); _playlist.Playback = null; _playlist = newPlaylist; _playlist.Playback = this; } else { _discontinuity = false; } } if (!_playlist.IsLoaded) { _asyncResult.Purpose = HLSCallbackPurpose.WaitForPlaylist; _playlist.Load(); return _asyncResult; } bool a = _playlist.IsDueForReload; if (!IsEndList && ((_currentPosition >= _playlist.Streams.Count) || a)) { _asyncResult.Purpose = HLSCallbackPurpose.WaitForPlaylist; _playlist.Reload(); return _asyncResult; } if (!BeginLoadingNextStream()) { _asyncResult.Dispose(); _asyncResult = null; } return _asyncResult; }