private void PositionChanged(MediaPlaybackSession sender, object args)
 {
     if (sender.Position >= sender.NaturalDuration && playbackList.CurrentItemIndex == playbackList.Items.Count - 1)
     {
         IsCurrentlyPlaying = false;
     }
 }
 private async void PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
 {
     await AssociatedObject.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
     {
         CurrentPlaybackState = AssociatedObject.MediaPlayer.PlaybackSession.PlaybackState;
     });
 }
        private static void GetMinMaxRates(MediaPlaybackSession sender, out double minRate, out double maxRate)
        {
            minRate = -256.0;
            bool foundMinRate = false;

            for (; !foundMinRate; minRate = minRate / 2.0)
            {
                foundMinRate = sender.IsSupportedPlaybackRateRange(minRate, 1);
                if (-0.25 < minRate)
                {
                    foundMinRate = true;
                    minRate      = 0;
                }
            }
            maxRate = 256.0;
            bool foundMaxRate = false;

            for (; !foundMaxRate; maxRate = maxRate / 2.0)
            {
                foundMaxRate = sender.IsSupportedPlaybackRateRange(1, maxRate);
                if (maxRate < 1.0)
                {
                    foundMaxRate = true;
                    maxRate      = 1;
                }
            }
        }
        private void MediaPlayer_PlaybackSession_SupportedPlaybackRatesChanged(MediaPlaybackSession sender, object args)
        {
            double minRate, maxRate;

            GetMinMaxRates(sender, out minRate, out maxRate);
            logView.Log($"MediaPlayer_PlaybackSession_SupportedPlaybackRatesChanged, MinRate: {minRate}, MaxRate: {maxRate}", LogViewLoggingLevel.Information);
        }
        private void PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
        {
            switch (sender.PlaybackState)
            {
            case MediaPlaybackState.Buffering:
            case MediaPlaybackState.Opening:
                //show pause
                IsPlaying = true;
                MediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Changing;
                break;

            case MediaPlaybackState.Paused:
            case MediaPlaybackState.None:
                //show play
                IsPlaying = false;
                MediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Paused;
                break;

            case MediaPlaybackState.Playing:
                //show pause
                IsPlaying = true;
                MediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Playing;
                break;
            }

            IsPlayingChanged?.Invoke(this, new NepAppMediaPlayerManagerIsPlayingEventArgs(IsPlaying));
        }
        public AudioController()
        {
            App.Startup();

            #region Rpc
            _acRpcServer = new AudioControllerRpcServer(this);
            _achRpcClient = new AudioControllerHandlerRpcClient();
            _audioControllerHandler = _achRpcClient.Service;
            #endregion

            _stateMachine = BuildStateMachine();
            _mediaEnvironment.RegisterDefaultCodecs();
            _playModeManager = IoC.Get<IPlayModeManager>();

            _mediaPlayer = BackgroundMediaPlayer.Current;
            _mediaPlayer.AutoPlay = false;
            _mediaPlayer.MediaOpened += mediaPlayer_MediaOpened;
            _mediaPlayer.MediaFailed += mediaPlayer_MediaFailed;
            _mediaPlayer.MediaEnded += mediaPlayer_MediaEnded;
            _playbackSession = _mediaPlayer.PlaybackSession;
            _playbackSession.PlaybackStateChanged += playbackSession_PlaybackStateChanged;
            _playbackSession.NaturalDurationChanged += playbackSession_NaturalDurationChanged;
            _playbackSession.SeekCompleted += playbackSession_SeekCompleted;

            _mtService = new MediaTransportService(_mediaPlayer.SystemMediaTransportControls);
            _mtService.IsEnabled = _mtService.IsPauseEnabled = _mtService.IsPlayEnabled = true;
            _mtService.ButtonPressed += _mtService_ButtonPressed;

            NotifyReady();
        }
        private async void PlaybackSession_PositionChanged(MediaPlaybackSession sender, object o)
        {
            if (_soundPosList == null)
            {
                //Dbg.d("_soundPosList == null " + (_soundPosList == null));
                return;
            }

            int par = paragraphBySoundPos(sender.Position.TotalMilliseconds);

            if (par < 0 || par == _curParagraph)
            {
                //Dbg.d("par " + par + " _curParagraph " + _curParagraph);
                return;
            }

            _curParagraph      = par;
            _chapter.Paragraph = par;
            //Dbg.d("_curParagraph " + _curParagraph);

            //if (AppData.Settings.ScrollMode != Settings.Scroll.None)
            scrollToPar(par);

            if (AppData.Settings.AudioPlayMode == Settings.AudioPlayModeType.None ||
                AppData.Settings.AudioPlayMode == Settings.AudioPlayModeType.Paragraph)
            {
                await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    MyPlayer.MediaPlayer.Pause();
                });
            }
        }
Exemple #8
0
        private void PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
        {
            switch (sender.PlaybackState)
            {
            case MediaPlaybackState.None:
                CurrentState.Value = MediaElementState.Closed;
                break;

            case MediaPlaybackState.Opening:
                CurrentState.Value = MediaElementState.Opening;
                break;

            case MediaPlaybackState.Buffering:
                CurrentState.Value = MediaElementState.Buffering;
                break;

            case MediaPlaybackState.Playing:
                CurrentState.Value = MediaElementState.Playing;
                break;

            case MediaPlaybackState.Paused:
                CurrentState.Value = MediaElementState.Paused;
                break;

            default:
                break;
            }
        }
Exemple #9
0
 private async void PlaybackSession_PositionChanged(MediaPlaybackSession sender, object args)
 {
     await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
     {
         MediaPlayerViewModel.UpdatePosition();
     });
 }
Exemple #10
0
        private async void MediaPlayer_PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
        {
            Log($"PlaybackSession_PlaybackStateChanged, PlaybackState: {sender.PlaybackState}");

            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                switch (sender.PlaybackState)
                {
                case MediaPlaybackState.None:
                case MediaPlaybackState.Opening:
                case MediaPlaybackState.Buffering:
                    PlayButton.IsEnabled  = false;
                    PauseButton.IsEnabled = false;
                    break;

                case MediaPlaybackState.Playing:
                    PlayButton.IsEnabled  = false;
                    PauseButton.IsEnabled = true;
                    break;

                case MediaPlaybackState.Paused:
                    PlayButton.IsEnabled  = true;
                    PauseButton.IsEnabled = false;
                    break;

                default:
                    break;
                }
            });
        }
 private void MediaPlayer_PlaybackSession_PositionChanged(MediaPlaybackSession sender, object args)
 {
     if (logPositionChanged)
     {
         logView.Log("PlaybackSession_PositionChanged, Position: " + sender.Position, LogViewLoggingLevel.Verbose);
     }
 }
Exemple #12
0
        private async void OnPlaybackStateChanged(MediaPlaybackSession sender, object args)
        {
            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                switch (sender.PlaybackState)
                {
                case MediaPlaybackState.Opening:
                case MediaPlaybackState.Buffering:
                case MediaPlaybackState.Playing:
                    if (_request == null)
                    {
                        _request = new DisplayRequest();
                        _request.RequestActive();
                    }
                    break;

                default:
                    if (_request != null)
                    {
                        _request.RequestRelease();
                        _request = null;
                    }
                    break;
                }
            });
        }
 private async void PlaybackSession_BufferingProgressChanged(MediaPlaybackSession sender, object args)
 {
     await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
     {
         PlayerLoadText.Text = sender.BufferingProgress.ToString("p");
     });
 }
 private async void PlaybackSession_BufferingEnded(MediaPlaybackSession sender, object args)
 {
     await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
     {
         PlayerLoading.Visibility = Visibility.Collapsed;
     });
 }
        private async void PlaybackSession_PositionChangedAsync(MediaPlaybackSession sender, object args)
        {
            if (Math.Abs((state.Position - sender.Position).TotalMilliseconds) < 200)
            {
                return;
            }

            try
            {
                state.Position = sender.Position;
                await state.Save(((App)Application.Current).ApplicationStateFile);
            }
            catch { }

            if (isUpdatingPosition)
            {
                return;
            }
            isUpdatingPosition = true;

            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                sldPosition.Value = sender.Position.TotalSeconds;
                tblPosition.Text  = ApplicationState.ConvertToString(sender.Position);
            });

            isUpdatingPosition = false;
        }
        private void OnPlaybackStateChanged(MediaPlaybackSession sender, object args)
        {
            if (sender.PlaybackState == MediaPlaybackState.Playing && sender.PlaybackRate != _playbackRate)
            {
                sender.PlaybackRate = _playbackRate;
            }

            switch (sender.PlaybackState)
            {
            case MediaPlaybackState.Playing:
                _transport.PlaybackStatus = MediaPlaybackStatus.Playing;
                break;

            case MediaPlaybackState.Paused:
                _transport.PlaybackStatus = MediaPlaybackStatus.Paused;
                break;

            case MediaPlaybackState.None:
                _transport.PlaybackStatus = MediaPlaybackStatus.Stopped;
                break;
            }

            //else if (sender.PlaybackState == MediaPlaybackState.Paused && sender.Position == sender.NaturalDuration && _playlist.CurrentItem == _playlist.Items.LastOrDefault())
            //{
            //    Clear();
            //}
            //else
            //{
            //    Debugger.Break();
            //}

            PlaybackStateChanged?.Invoke(this, args);
        }
Exemple #17
0
        /**
         * シークが完了したときの処理
         * - フレームサムネイルを作成
         */
        private async void PBS_SeekCompletedForExtractFrames(MediaPlaybackSession session, object args)
        {
            if (mSpan == 0 || !mGettingFrame)
            {
                return;
            }

            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                var mediaPlayer = session.MediaPlayer;
                extractFrame(mediaPlayer);

                if (mFrame < mFrameCount - 1)
                {
                    mFrame++;
                    session.Position = TimeSpan.FromMilliseconds(mOffset + mSpan *mFrame);
                }
                else
                {
                    // OK, Movie is ready now!
                    mGettingFrame            = false;
                    PlaybackSession.Position = TimeSpan.FromMilliseconds(0);
                    MediaPlayer.IsVideoFrameServerEnabled = CTX.CustomDrawing;
                    mSlider.Value     = 0;
                    CTX.TotalRange    = session.NaturalDuration.TotalMilliseconds;
                    CTX.MoviePrepared = true;
                }
            });
        }
Exemple #18
0
 private async void PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
 {
     if (sender is MediaPlaybackSession playbackSession && playbackSession.NaturalVideoHeight != 0)
     {
         if (playbackSession.PlaybackState == MediaPlaybackState.Playing)
         {
             if (!_isRequestActive)
             {
                 await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                 {
                     _displayRequest.RequestActive();
                     _isRequestActive = true;
                 });
             }
         }
         else
         {
             if (_isRequestActive)
             {
                 await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                 {
                     _displayRequest.RequestRelease();
                     _isRequestActive = false;
                 });
             }
         }
     }
 }
Exemple #19
0
        private void MediaPlayerElement_CurrentStateChanged(object sender, RoutedEventArgs e)
        {
            MediaPlaybackSession playbackSession = sender as MediaPlaybackSession;

            if (playbackSession != null && playbackSession.NaturalVideoHeight != 0)
            {
                if (playbackSession.PlaybackState == MediaPlaybackState.Playing)
                {
                    if (appDisplayRequest == null)
                    {
                        // This call creates an instance of the DisplayRequest object
                        appDisplayRequest = new DisplayRequest();
                        appDisplayRequest.RequestActive();
                    }
                }
                else // PlaybackState is Buffering, None, Opening or Paused
                {
                    if (appDisplayRequest != null)
                    {
                        // Deactivate the displayr request and set the var to null
                        appDisplayRequest.RequestRelease();
                        appDisplayRequest = null;
                    }
                }
            }
        }
 private async void Player_PositionChanged(MediaPlaybackSession sender, object args)
 {
     await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
     {
         WatchTime = (int)sender.Position.TotalSeconds;
     });
 }
Exemple #21
0
 // <SnippetBufferingProgressChanged>
 private async void PlaybackSession_BufferingProgressChanged(MediaPlaybackSession sender, object args)
 {
     await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
     {
         bufferingProgressBar.Value = sender.BufferingProgress;
     });
 }
 private void OnBufferingProgressChanged(MediaPlaybackSession sender, object args)
 {
     Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
     {
         _downloadProgressIndicator.Maybe(p => p.Value = (double)args);
     });
 }
Exemple #23
0
        private async void mediaPlayer_PlaybackStateChanged(MediaPlaybackSession sender, object e)
        {
            // UI updates must happen on dispatcher thread
            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                if (!isThisPageActive)
                {
                    return;
                }

                // For the design of this sample, the general idea is that if user is playing
                // media when Next/Previous is invoked, we will automatically start playing
                // the new item once it has loaded.  Whereas if the user has paused or stopped
                // media playback when Next/Previous is invoked, we won't automatically start
                // playing the new item.  In other words, we maintain the user's intent to
                // play or not play across changing the media.  This is most easily handled
                // using the AutoPlay property of the MediaPlayer.
                if (mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Playing)
                {
                    mediaPlayer.AutoPlay = true;
                }
                else if (mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.None ||
                         mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Paused)
                {
                    mediaPlayer.AutoPlay = false;
                }

                // Update the playback status tracked by SystemMediaTransportControls.  See comments
                // in SyncPlaybackStatusToMediaPlayerState()'s body for why this is important.
                SyncPlaybackStatusToMediaPlayerState();
            });
        }
 private void PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
 {
     _scheduler.Schedule(() =>
     {
         SetKeepDisplayWithCurrentState(sender.PlaybackState);
     });
 }
Exemple #25
0
        /**
         * 再生状態が変化した
         * - CTX.IsPlaying の更新
         */
        private async void PBS_PlaybackStateChanged(MediaPlaybackSession session, object args)
        {
            if (mGettingFrame)
            {
                return;
            }
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                switch (session.PlaybackState)
                {
                case MediaPlaybackState.None:
                case MediaPlaybackState.Buffering:
                case MediaPlaybackState.Opening:
                    CTX.MoviePrepared = false;
                    CTX.IsPlaying     = false;
                    break;

                case MediaPlaybackState.Paused:
                default:
                    CTX.IsPlaying = false;
                    updateSliderPosition(session.Position.TotalMilliseconds);
                    break;

                case MediaPlaybackState.Playing:
                    CTX.IsPlaying = true;
                    break;
                }
            });
        }
Exemple #26
0
 private void PlaybackSession_SeekCompleted(MediaPlaybackSession sender, object args)
 {
     OnPlaybackPositionChanged(new PlaybackPositionChangedEventArgs()
     {
         Time = _mediaPlayer.PlaybackSession.Position
     });
 }
Exemple #27
0
        private void PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
        {
            switch (sender.PlaybackState)
            {
            case MediaPlaybackState.Playing:
                PlayerState = PlaybackState.Playing;
                break;

            case MediaPlaybackState.Paused:
                PlayerState = PlaybackState.Paused;
                break;

            default:
                PlayerState = PlaybackState.Other;
                Position    = 0;
                Duration    = 0;
                break;
            }

            if (CloudService.Instance.State == ServiceState.Connected &&
                CloudService.Instance.ParticipationType == ParticipationType.Host)
            {
                CloudService.Instance.SendStatusUpdate(GetStatus());
            }
        }
 private void PlaybackSession_PositionChanged(MediaPlaybackSession sender, object args)
 {
     _ = _dispatcherQueue.TryEnqueue(() =>
     {
         VideoPosition = sender.Position;
     });
 }
        private async void PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
        {
            await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                switch (sender.PlaybackState)
                {
                case MediaPlaybackState.None:
                    break;

                case MediaPlaybackState.Opening:
                    PlayerLoading.Visibility = Visibility.Visible;
                    PlayerLoadText.Text      = "加载中";
                    break;

                case MediaPlaybackState.Buffering:
                    PlayerLoading.Visibility = Visibility.Visible;
                    break;

                case MediaPlaybackState.Playing:
                    BottomBtnPlay.Visibility  = Visibility.Collapsed;
                    BottomBtnPause.Visibility = Visibility.Visible;
                    break;

                case MediaPlaybackState.Paused:
                    BottomBtnPlay.Visibility  = Visibility.Visible;
                    BottomBtnPause.Visibility = Visibility.Collapsed;
                    break;

                default:
                    break;
                }
            });
        }
Exemple #30
0
        private void PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
        {
            switch (sender.PlaybackState)
            {
            case MediaPlaybackState.None:
                showPasue = false;
                showPlay  = true;
                break;

            case MediaPlaybackState.Opening:
                showPasue = false;
                showPlay  = true;
                break;

            case MediaPlaybackState.Buffering:
                showPasue = false;
                showPlay  = true;
                break;

            case MediaPlaybackState.Playing:
                showPasue = true;
                showPlay  = false;
                break;

            case MediaPlaybackState.Paused:
                showPasue = false;
                showPlay  = true;
                break;

            default:
                break;
            }
        }
Exemple #31
0
        private void OnPlaybackStateChanged(MediaPlaybackSession sender, object args)
        {
            var state = (MediaPlaybackState)args;

            switch (state)
            {
            case MediaPlaybackState.Opening:
            case MediaPlaybackState.Paused:
            case MediaPlaybackState.None:
                CancelControlsVisibilityTimer();
                VisualStateManager.GoToState(this, "PlayState", false);
                VisualStateManager.GoToState(this, "Normal", false);
                break;

            case MediaPlaybackState.Playing:
                ResetControlsVisibilityTimer();
                VisualStateManager.GoToState(this, "PauseState", false);
                VisualStateManager.GoToState(this, "Normal", false);
                break;

            case MediaPlaybackState.Buffering:
                VisualStateManager.GoToState(this, "Buffering", false);
                break;
            }
        }
        public PlaybackSessionViewModel(MediaPlaybackSession playbackSession, CoreDispatcher dispatcher)
        {
            this.player = playbackSession.MediaPlayer;
            this.playbackSession = playbackSession;
            this.dispatcher = dispatcher;

            playbackSession.PlaybackStateChanged += PlaybackSession_PlaybackStateChanged;
        }
 private async void PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
 {
     if (disposed) return;
     await dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
     {
         if (disposed) return;
         RaisePropertyChanged("PlaybackState");
     });
 }
 private void playbackSession_NaturalDurationChanged(MediaPlaybackSession sender, object args)
 {
     _audioControllerHandler.OnNaturalDurationChanged(_playbackSession.NaturalDuration);
 }
 private void playbackSession_SeekCompleted(MediaPlaybackSession sender, object args)
 {
     var taskComp = Interlocked.Exchange(ref _seekTaskCompletion, null);
     if (taskComp != null)
         taskComp.SetResult(null);
 }
        private async void mediaPlayer_PlaybackStateChanged(MediaPlaybackSession sender, object e)
        {
            // UI updates must happen on dispatcher thread
            await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                if (!isThisPageActive)
                {
                    return;
                }

                // For the design of this sample, the general idea is that if user is playing
                // media when Next/Previous is invoked, we will automatically start playing
                // the new item once it has loaded.  Whereas if the user has paused or stopped
                // media playback when Next/Previous is invoked, we won't automatically start
                // playing the new item.  In other words, we maintain the user's intent to
                // play or not play across changing the media.  This is most easily handled
                // using the AutoPlay property of the MediaPlayer.
                if (mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Playing)
                {
                    mediaPlayer.AutoPlay = true;
                }
                else if (mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.None ||
                         mediaPlayer.PlaybackSession.PlaybackState == MediaPlaybackState.Paused)
                {
                    mediaPlayer.AutoPlay = false;
                }

                // Update the playback status tracked by SystemMediaTransportControls.  See comments
                // in SyncPlaybackStatusToMediaPlayerState()'s body for why this is important.
                SyncPlaybackStatusToMediaPlayerState();
            });
        }
 private void playbackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
 {
     Execute.BeginOnUIThread(OnPlaybackStateChanged);
 }
 private void MediaPlayer_PlaybackSession_BufferingStarted(MediaPlaybackSession sender, object args)
 {
     Log("PlaybackSession_BufferingStarted");
 }
 private void MediaPlayer_PlaybackSession_BufferingProgressChanged(MediaPlaybackSession sender, object args)
 {
     Log($"PlaybackSession_BufferingProgressChanged, BufferingProgress: {sender.BufferingProgress}");
 }
        // private void MediaPlayer_PlaybackSession.PositionChanged(MediaPlaybackSession sender, object args)
        // {
        //     LogOnUI("PlaybackSession_PositionChanged, Position: " + sender.Position);
        // }

        private void MediaPlayer_PlaybackSession_SeekCompleted(MediaPlaybackSession sender, object args)
        {
            Log($"PlaybackSession_SeekCompleted, Position: {sender.Position}");
        }
 private void MediaPlayer_PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
 {
     Log($"PlaybackSession_PlaybackStateChanged, PlaybackState: {sender.PlaybackState}");
 }
 private void MediaPlayer_PlaybackSession_NaturalVideoSizeChanged(MediaPlaybackSession sender, object args)
 {
     Log($"PlaybackSession_NaturalVideoSizeChanged,  NaturalVideoWidth: {sender.NaturalVideoWidth}, NaturalVideoHeight: {sender.NaturalVideoHeight}");
 }
 private void MediaPlayer_PlaybackSession_NaturalDurationChanged(MediaPlaybackSession sender, object args)
 {
     Log($"PlaybackSession_NaturalDurationChanged, NaturalDuration: {sender.NaturalDuration}");
 }
 private void MediaPlayer_PlaybackSession_DownloadProgressChanged(MediaPlaybackSession sender, object args)
 {
     Log($"PlaybackSession_DownloadProgressChanged, DownloadProgress: {sender.DownloadProgress}");
 }
 private void PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
 {
     CurrentState = sender.PlaybackState;
     StateChanged?.Invoke(this, CurrentState);
 }
        /// <summary>
        /// MediaPlayer state changed event handlers.
        /// Note that we can subscribe to events even if Media Player is playing media in background
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="args"></param>
        ///
        private async void PlaybackSession_PlaybackStateChanged(MediaPlaybackSession sender, object args)
        {
            await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                var currentState = sender.PlaybackState;

                // Update state label
                txtCurrentState.Text = currentState.ToString();

                // Update controls
                UpdateTransportControls(currentState);
            });
        }