private void VideoService_VideoStateChanged(object sender, VideoStateChangedEventArgs e)
        {
            switch (e.NewState)
            {
            case VideoState.Configured:
                videoService.ShowDefaultControls = false;
                videoService.Load("http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8");
                break;

            case VideoState.Playing:
                isPlaying = true;
                break;

            case VideoState.Paused:
                isPlaying = false;
                break;
            }
        }
        private void Video_VideoStateChanged(object sender, VideoStateChangedEventArgs e)
        {
            var theaterDays  = Game.AsTheaterDays();
            var helpOverlay  = theaterDays.FindSingleElement <HelpOverlay>();
            var debugOverlay = theaterDays.FindSingleElement <DebugOverlay>();
            var video        = theaterDays.FindSingleElement <BackgroundVideo>();

            switch (e.NewState)
            {
            case MediaEngineEvent.Play:
            case MediaEngineEvent.Playing:
                if (helpOverlay != null)
                {
                    helpOverlay.Hide();
                }
                break;

            case MediaEngineEvent.CanPlay:
            case MediaEngineEvent.Pause:
            case MediaEngineEvent.Ended:
                if (helpOverlay != null)
                {
                    helpOverlay.Show();
                }
                break;

            case MediaEngineEvent.Error:
                if (debugOverlay != null)
                {
                    if (video != null)
                    {
                        var error   = video.GetError();
                        var errCode = (MediaEngineErr)error.GetErrorCode();
                        var hr      = error.ExtendedErrorCode;
                        debugOverlay.AddLine($"ERROR: MediaEngine reported an error (Type: {errCode}, {hr})");
                    }
                    else
                    {
                        // Not reachable.
                        debugOverlay.AddLine("ERROR: MediaEngine reported an error.");
                    }
                    debugOverlay.Show();
                }
                if (helpOverlay != null)
                {
                    helpOverlay.Hide();
                }
                break;

            case MediaEngineEvent.Abort:
                if (debugOverlay != null)
                {
                    debugOverlay.AddLine("Warning: MediaEngine aborted.");
                    debugOverlay.Show();
                }
                if (helpOverlay != null)
                {
                    helpOverlay.Hide();
                }
                break;
            }

            var audio = theaterDays.FindSingleElement <AudioController>();
            var music = audio?.Music;

            if (music != null)
            {
                switch (e.NewState)
                {
                case MediaEngineEvent.Play:
                    music.Play();
                    if (e.OldValidState == MediaEngineEvent.Pause)
                    {
                        if (video != null)
                        {
                            // Force seeking to music time to avoid the lag.
                            // The lag appears when you pause for too many times (about 5 times) during playback.
                            video.CurrentTime = music.CurrentTime;
                        }
                    }
                    break;

                case MediaEngineEvent.Playing:
                    music.Play();
                    break;

                case MediaEngineEvent.Pause:
                    music.Pause();
                    break;

                case MediaEngineEvent.CanPlay:
                case MediaEngineEvent.Ended:
                case MediaEngineEvent.Error:
                case MediaEngineEvent.Abort:
                    music.Stop();
                    theaterDays.AudioManager.Sfx.StopAll();
                    break;
                }
            }

            var tapPoints = theaterDays.FindSingleElement <TapPoints>();

            if (tapPoints != null)
            {
                switch (e.NewState)
                {
                case MediaEngineEvent.Play:
                case MediaEngineEvent.Playing:
                    tapPoints.FadeIn(TimeSpan.FromSeconds(1.5));
                    break;

                case MediaEngineEvent.Pause:
                case MediaEngineEvent.Ended:
                case MediaEngineEvent.Error:
                case MediaEngineEvent.Abort:
                    tapPoints.FadeOut(TimeSpan.FromSeconds(1.5));
                    break;
                }
            }
        }