public async Task <PlaybackService> InitializeAsync() { // Initialize Setting //Setting.InitializeSettingBinary(RepeatMode, nameof(RepeatMode), MediaRepeatMode.None); //Setting.InitializeSetting(EnableShuffle, nameof(EnableShuffle), false); Player = new MediaPlayer(); _playlistContainer = new PlaylistContainer(); Setting.Playback.Volume .Subscribe(x => Player.Volume = x / 100d); Observable.FromEventPattern <TypedEventHandler <MediaPlayer, object>, object>( h => Player.MediaEnded += h, h => Player.MediaEnded -= h) .Subscribe(async _ => { IsPlaying.OnNext(false); if (_playlistContainer.RepeatMode == MediaRepeatMode.Track) { await PlayAsyncInner(_playlistContainer.CurrentTrack); return; } if (_playlistContainer.HasNext()) { await PlayAsyncInner(_playlistContainer.Next()); } }); Observable.Timer(TimeSpan.Zero, TimeSpan.FromMilliseconds(500)) .SkipUntil(IsPlaying.DistinctUntilChanged().Where(x => x)) .TakeUntil(IsPlaying.DistinctUntilChanged().Where(x => !x)) .Repeat() .Subscribe(_ => { PlaybackPosition.OnNext(Player.PlaybackSession); }); NewTrackPlayed .Do(x => WriteSmtcThumbnail(x.PlaybackItem, x.Track)) .ObserveOnCoreDispatcher() .Subscribe(x => { if (_previousTrack != null) { _previousTrack.IsPlaying = false; } x.Track.IsPlaying = true; _previousTrack = x.Track; }); return(await Task.FromResult(this)); }
private void updateFrameIndex() { switch (PlaybackPosition.CompareTo(frameData[CurrentFrameIndex].DisplayStartTime)) { case -1: while (CurrentFrameIndex > 0 && PlaybackPosition < frameData[CurrentFrameIndex].DisplayStartTime) { CurrentFrameIndex--; currentFrameCache.Invalidate(); } break; case 1: while (CurrentFrameIndex < frameData.Count - 1 && PlaybackPosition >= frameData[CurrentFrameIndex].DisplayEndTime) { CurrentFrameIndex++; currentFrameCache.Invalidate(); } break; } }
protected override void PlaybackPositionChanged(TimeSpan playbackPosition) { Debug.WriteLine(nameof(MockMediaSession) + ": Playback Position - " + PlaybackPosition.ToString("hh\\:mm\\:ss")); }