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(() => _mediaPlayer.Play(playableItem, enableReclock, enableMadVr, false)); } catch { DisposeMount(playableItem); throw; } CurrentPlaylistIndex = index; if (startPositionTicks.HasValue && startPositionTicks.Value > 0) { InvokeOnPlayerThread(() => _mediaPlayer.Seek(startPositionTicks.Value)); } if (previousMedia != null) { var args = new MediaChangeEventArgs { Player = this, NewPlaylistIndex = index, NewMedia = CurrentMedia, PreviousMedia = previousMedia, PreviousPlaylistIndex = previousIndex, EndingPositionTicks = endingTicks }; // can't InvokeOnPlayerThread because InvokeRequired returns false _presentation.MainApplicationWindow.Dispatcher.Invoke ( () => EventHelper.FireEventIfNotNull(MediaChanged, this, args, _logger) ); } }
private void player_MediaChanged(object sender, MediaChangeEventArgs e) { NowPlayingItem = e.NewMedia; }
/// <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, UserId = _apiClient.CurrentUserId, PositionTicks = e.EndingPositionTicks }; 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, UserId = _apiClient.CurrentUserId, IsSeekable = _mediaPlayer.CanSeek, QueueableMediaTypes = queueTypes.ToArray() }; await _apiClient.ReportPlaybackStartAsync(info); } catch (Exception ex) { _logger.ErrorException("Error sending playback start checking for {0}", ex, e.NewMedia.Name); } } }