/// <summary> /// Stops playback on all initialized streams. /// </summary> public void Stop() { logger.Info(""); var state = player.GetState(); if (state != ESPlayer.ESPlayerState.Paused && state != ESPlayer.ESPlayerState.Playing) { return; } try { _dataClock.Stop(); DisableTransfer(); StopClockGenerator(); player.Stop(); stateChangedSubject.OnNext(PlayerState.Idle); } catch (InvalidOperationException ioe) { logger.Error(ioe); } }
private async Task <bool> ExecuteSeek(TimeSpan time, CancellationToken token) { dataSynchronizer.Prepare(); _dataClock.Start(); var(needDataTcs, asyncHandler) = PrepareStreamStart(ESPlayer.StreamType.Audio, ESPlayer.StreamType.Video); using (token.Register(TerminateStreamStart, needDataTcs)) { logger.Info($"Player.SeekAsync({time})"); var seekTask = player.SeekAsync(time, (s, _) => asyncHandler(s)); logger.Info($"Player.SeekAsync({time}) Waiting for ready to seek"); await needDataTcs.Task; logger.Info($"Player.SeekAsync({time}) Starting transfer"); if (false == await StartTransfer(token)) { _dataClock.Stop(); return(false); } logger.Info($"Player.SeekAsync({time}) Waiting for seek completion"); await seekTask.WithCancellation(token); logger.Info($"Player.SeekAsync({time}) Done"); StartClockGenerator(); } return(true); }
/// <summary> /// Terminates clock generation task /// </summary> private void StopClockGenerator() { logger.Info(""); _dataClock.Stop(); _playerClock.Stop(); }