/// <summary> /// Handles the MediaChanged event of the _mediaPlayer control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="MediaChangeEventArgs"/> instance containing the event data.</param> async void _mediaPlayer_MediaChanged(object sender, MediaChangeEventArgs e) { if (e.PreviousMedia != null) { try { await _apiClient.ReportPlaybackStoppedAsync(e.PreviousMedia.Id, _apiClient.CurrentUserId, e.EndingPositionTicks); } catch (Exception ex) { _logger.ErrorException("Error sending playback stopped checking for {0}", ex, e.PreviousMedia.Name); } } if (e.NewMedia != null) { try { var queueTypes = _mediaPlayer.CanQueue ? new List <string> { e.NewMedia.MediaType } : new List <string> { }; await _apiClient.ReportPlaybackStartAsync(e.NewMedia.Id, _apiClient.CurrentUserId, _mediaPlayer.CanSeek, queueTypes); } catch (Exception ex) { _logger.ErrorException("Error sending playback start checking for {0}", ex, e.NewMedia.Name); } } }
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) ); } }
/// <summary> /// Handles the MediaChanged event of the _mediaPlayer control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="MediaChangeEventArgs"/> instance containing the event data.</param> async void _mediaPlayer_MediaChanged(object sender, MediaChangeEventArgs e) { if (e.PreviousMedia != null) { var info = new PlaybackStopInfo { ItemId = e.PreviousMedia.Id, PositionTicks = e.EndingPositionTicks }; var apiClient = _connectionManager.GetApiClient(e.PreviousMedia); try { await apiClient.ReportPlaybackStoppedAsync(info); } catch (Exception ex) { _logger.ErrorException("Error sending playback stopped checking for {0}", ex, e.PreviousMedia.Name); } } if (e.NewMedia != null) { try { var queueTypes = _mediaPlayer.CanQueue ? new List <string> { e.NewMedia.MediaType } : new List <string> { }; var info = new PlaybackStartInfo { ItemId = e.NewMedia.Id, CanSeek = _mediaPlayer.CanSeek, QueueableMediaTypes = queueTypes.ToList(), // TODO: Remove this hardcoding PlayMethod = PlayMethod.DirectPlay }; var apiClient = _connectionManager.GetApiClient(e.NewMedia); await apiClient.ReportPlaybackStartAsync(info); } catch (Exception ex) { _logger.ErrorException("Error sending playback start checking for {0}", ex, e.NewMedia.Name); } } }
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); } }
void player_MediaChanged(object sender, MediaChangeEventArgs e) { NowPlayingItem = e.NewMedia; }