private async Task PlayTrack(int index, long?startPositionTicks) { var previousMedia = CurrentMedia; var previousIndex = CurrentPlaylistIndex; var endingTicks = CurrentPositionTicks; var options = CurrentPlayOptions; var playableItem = await GetPlayableItem(options.Items[index], startPositionTicks, CancellationToken.None); try { var enableMadVr = EnableMadvr(options); //var enableReclock = EnableReclock(options); InvokeOnPlayerThread(() => { //create a fresh DS Player everytime we want one DisposePlayer(); _mediaPlayer = new DirectShowPlayer(_logger, _hiddenWindow, this, _presentation.WindowHandle, _sessionManager, _config, _inputManager, _apiClient, _zipClient, _httpClient); _mediaPlayer.Play(playableItem, enableMadVr, false); }, true); } catch { OnPlaybackStopped(playableItem, null, TrackCompletionReason.Failure, null); throw; } CurrentPlaylistIndex = index; if (startPositionTicks.HasValue && startPositionTicks.Value > 0) { InvokeOnPlayerThread(() => _mediaPlayer.Seek(startPositionTicks.Value)); } if (previousMedia != null && MediaChanged != null) { var args = new MediaChangeEventArgs { Player = this, NewPlaylistIndex = index, NewMedia = CurrentMedia, PreviousMedia = previousMedia, PreviousPlaylistIndex = previousIndex, EndingPositionTicks = endingTicks }; _presentation.Window.Dispatcher.Invoke ( () => MediaChanged(this, args) ); } }
private async Task PlayTrack(int index, long?startPositionTicks) { var previousMedia = CurrentMedia; var previousIndex = CurrentPlaylistIndex; var endingTicks = CurrentPositionTicks; var options = CurrentPlayOptions; var playableItem = await GetPlayableItem(options.Items[index], CancellationToken.None); try { _currentPlaybackDispatcher.Invoke(() => _mediaPlayer.Play(playableItem, EnableReclock(options), EnableMadvr(options), _config.Configuration.InternalPlayerConfiguration.EnableXySubFilter)); } catch { DisposeMount(playableItem); throw; } CurrentPlaylistIndex = index; if (startPositionTicks.HasValue && startPositionTicks.Value > 0) { _currentPlaybackDispatcher.Invoke(() => _mediaPlayer.Seek(startPositionTicks.Value)); } if (previousMedia != null) { var args = new MediaChangeEventArgs { Player = this, NewPlaylistIndex = index, NewMedia = CurrentMedia, PreviousMedia = previousMedia, PreviousPlaylistIndex = previousIndex, EndingPositionTicks = endingTicks }; EventHelper.FireEventIfNotNull(MediaChanged, this, args, _logger); } }