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;
                }
            });
        }
示例#2
0
        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;
                }
            });
        }