private void PieceAvailabilityOnProgressChanged(object sender, PieceAvailability pieceAvailability) { DispatcherHelper.CheckBeginInvokeOnUI(async() => { if (!Media.NaturalDuration.HasTimeSpan) { return; } if (!(DataContext is MediaPlayerViewModel vm)) { return; } double minBuffer; switch (vm.MediaType) { case MediaType.Movie: minBuffer = Constants.MinimumMovieBuffering / 100d; break; case MediaType.Show: minBuffer = Constants.MinimumShowBuffering / 100d; break; default: minBuffer = 0.03d; break; } vm.MediaLength = Media.NaturalDuration.TimeSpan.TotalSeconds; vm.PlayerTime = PositionSlider.Value; _pieceAvailability = pieceAvailability; var startPieceAvailabilityPercentage = (double)_pieceAvailability.StartAvailablePiece / (double)_pieceAvailability.TotalPieces; var endPieceAvailabilityPercentage = (double)_pieceAvailability.EndAvailablePiece / (double)_pieceAvailability.TotalPieces; var playPercentage = PositionSlider.Value / Media.NaturalDuration.TimeSpan.TotalSeconds; var end = 1 - endPieceAvailabilityPercentage <= minBuffer ? endPieceAvailabilityPercentage == 1d : playPercentage + minBuffer < endPieceAvailabilityPercentage; if (_isPausedForBuffering && playPercentage > startPieceAvailabilityPercentage && end) { _isPausedForBuffering = false; Buffering.Visibility = Visibility.Collapsed; Media.Position = TimeSpan.FromSeconds(PositionSlider.Value); await PlayMedia(); } else if (!_isPausedForBuffering) { PositionSlider.Value = Media.Position.TotalSeconds; } }); }
private void PieceAvailabilityOnProgressChanged(object sender, PieceAvailability pieceAvailability) { DispatcherHelper.CheckBeginInvokeOnUI(() => { if (!Media.NaturalDuration.HasTimeSpan) { return; } if (!(DataContext is MediaPlayerViewModel vm)) { return; } vm.MediaLength = Media.NaturalDuration.TimeSpan.TotalSeconds; vm.PlayerTime = PositionSlider.Value; _pieceAvailability = pieceAvailability; double startPieceAvailabilityPercentage = (double)_pieceAvailability.StartAvailablePiece / (double)_pieceAvailability.TotalPieces; double endPieceAvailabilityPercentage = (double)_pieceAvailability.EndAvailablePiece / (double)_pieceAvailability.TotalPieces; var playPercentage = PositionSlider.Value / Media.NaturalDuration.TimeSpan.TotalSeconds; if (_isPausedForBuffering && playPercentage > startPieceAvailabilityPercentage && playPercentage < endPieceAvailabilityPercentage) { _isPausedForBuffering = false; Buffering.Visibility = Visibility.Collapsed; Media.Position = TimeSpan.FromSeconds(PositionSlider.Value); PlayMedia(); } else if (!_isPausedForBuffering) { PositionSlider.Value = Media.Position.TotalSeconds; } }); }