Exemplo n.º 1
0
        public async Task Seek(TimeSpan time)
        {
            logger.Info(time.ToString());
            var token = activeTaskCts.Token;

            try
            {
                var resumeNeeded = player.GetState() == ESPlayer.ESPlayerState.Paused;
                if (resumeNeeded)
                {
                    await stateChangedSubject
                    .AsObservable()
                    .FirstAsync(state => state == PlayerState.Playing)
                    .ToTask(token);

                    token.ThrowIfCancellationRequested();
                }

                using (await asyncOpSerializer.LockAsync(token))
                {
                    // Set suspend clock. Clock is not available during seek, but required during Suspend/Resume
                    _suspendClock = time;

                    token.ThrowIfCancellationRequested();

                    await SeekStreamInitialize(token);

                    var seekToTime = await Client.Seek(time, token);

                    _dataClock.SetClock(time, token);
                    EnableInput();
                    _dataClock.Start();

                    await StreamSeek(seekToTime, resumeNeeded, token);

                    // Invalidate _suspendClock
                    _suspendClock = PlayerClockProviderConfig.InvalidClock;
                }
            }
            catch (SeekException e)
            {
                logger.Error(e);
                playbackErrorSubject.OnNext($"Seek Failed, reason \"{e.Message}\"");
                throw;
            }
            catch (OperationCanceledException)
            {
                logger.Info("Operation Cancelled");
            }
            catch (Exception e)
            {
                logger.Error(e);
                playbackErrorSubject.OnNext("Seek Failed");
            }
        }
Exemplo n.º 2
0
 private void ResumePlayback()
 {
     player.Resume();
     StartClockGenerator();
     _dataClock.Start();
     logger.Info("");
 }
Exemplo n.º 3
0
        public void Initialize(StreamType stream)
        {
            logger.Info(stream.ToString());

            if (esStreams[(int)stream] != null)
            {
                throw new ArgumentException($"Stream {stream} already initialized");
            }

            dataSynchronizer.Initialize(stream);

            var esStream = new EsStream(stream, packetStorage, dataSynchronizer, _playerClock);

            esStream.SetPlayer(player);

            playbackErrorSubs[(int)stream] = esStream.PlaybackError()
                                             .Subscribe(OnEsStreamError, _syncCtx);

            esStreams[(int)stream] = esStream;

            _dataClock.Start();
        }