/// <summary>
        /// Handles the MediaCenterEnvironment.PropertyChanged event
        /// </summary>
        protected void MediaCenterEnvironment_PropertyChanged(IPropertyObject sender, string property)
        {
            Logger.ReportVerbose("MediaCenterEnvironment_PropertyChanged: " + property);

            MediaCenterEnvironment env = sender as MediaCenterEnvironment;

            MediaExperience exp = env.MediaExperience;

            if (exp != null)
            {
                MediaTransport transport = exp.Transport;

                if (transport != null)
                {
                    transport.PropertyChanged -= MediaTransport_PropertyChanged;
                    transport.PropertyChanged += MediaTransport_PropertyChanged;

                    HandlePropertyChange(env, exp, transport, property);
                }
                else
                {
                    Logger.ReportWarning("MediaCenterEnvironment_PropertyChanged: MediaTransport is null");
                }
            }
            else
            {
                Logger.ReportWarning("MediaCenterEnvironment_PropertyChanged: MediaExperience is null");
            }
        }
        /// <summary>
        /// Handles a change of Playstate by firing various events and post play processes
        /// </summary>
        private void HandleStoppedState(MediaCenterEnvironment env, MediaExperience exp, MediaTransport transport, PlaybackStateEventArgs e)
        {
            // Stop listening to the events
            env.PropertyChanged       -= MediaCenterEnvironment_PropertyChanged;
            transport.PropertyChanged -= MediaTransport_PropertyChanged;

            // This will prevent us from getting in here twice after playback stops and calling post-play processes more than once.
            _HasStartedPlaying = false;

            _CurrentMediaCollection = null;

            var mediaType = exp.MediaType;

            // Check if internal wmc player is still playing, which could happen if the user launches live tv while playing something
            if (mediaType != Microsoft.MediaCenter.Extensibility.MediaType.TV)
            {
                Application.CurrentInstance.ShowNowPlaying = false;

                if (mediaType == Microsoft.MediaCenter.Extensibility.MediaType.Audio || mediaType == Microsoft.MediaCenter.Extensibility.MediaType.DVD)
                {
                    PlaybackControllerHelper.ReturnToApplication(true);
                }
            }

            // Fire the OnFinished event for each item
            OnPlaybackFinished(e);
        }
Esempio n. 3
0
        /// <summary>
        /// Handles the MediaCenterEnvironment.PropertyChanged event
        /// </summary>
        protected void MediaCenterEnvironment_PropertyChanged(IPropertyObject sender, string property)
        {
            System.Diagnostics.Debug.Assert(Microsoft.MediaCenter.UI.Application.ApplicationThread == System.Threading.Thread.CurrentThread);

            Logger.ReportVerbose("MediaCenterEnvironment_PropertyChanged: " + property);

            MediaCenterEnvironment env = sender as MediaCenterEnvironment;

            MediaExperience exp = env.MediaExperience;

            if (exp != null)
            {
                MediaTransport transport = exp.Transport;

                if (transport != null)
                {
                    transport.PropertyChanged -= MediaTransport_PropertyChanged;
                    transport.PropertyChanged += MediaTransport_PropertyChanged;

                    HandlePropertyChange(env, exp, transport, property);
                }
                else
                {
                    Logger.ReportWarning("MediaCenterEnvironment_PropertyChanged: MediaTransport is null");
                }
            }
            else
            {
                Logger.ReportWarning("MediaCenterEnvironment_PropertyChanged: MediaExperience is null");
            }
        }
        /// <summary>
        /// Handles the MediaTransport.PropertyChanged event, which most of the time will be due to Position
        /// </summary>
        protected void MediaTransport_PropertyChanged(IPropertyObject sender, string property)
        {
            MediaTransport transport = sender as MediaTransport;

            MediaCenterEnvironment env = AddInHost.Current.MediaCenterEnvironment;

            MediaExperience exp = env.MediaExperience;

            HandlePropertyChange(env, exp, transport, property);
        }
Esempio n. 5
0
        public static void WaitForStream(MediaExperience mce)
        {
            Debug.Assert(Microsoft.MediaCenter.UI.Application.ApplicationThread == Thread.CurrentThread);
            int i = 0;

            while ((i++ < 15) && (mce.Transport.PlayState != Microsoft.MediaCenter.PlayState.Playing))
            {
                // settng the position only works once it is playing and on fast multicore machines we can get here too quick!
                Thread.Sleep(100);
            }
        }
Esempio n. 6
0
        /// <summary>
        /// Handles the MediaTransport.PropertyChanged event, which most of the time will be due to Position
        /// </summary>
        protected void MediaTransport_PropertyChanged(IPropertyObject sender, string property)
        {
            System.Diagnostics.Debug.Assert(Microsoft.MediaCenter.UI.Application.ApplicationThread == System.Threading.Thread.CurrentThread);
            MediaTransport transport = sender as MediaTransport;

            MediaCenterEnvironment env = Application.MediaCenterEnvironment;

            MediaExperience exp = env.MediaExperience;

            HandlePropertyChange(env, exp, transport, property);
        }
Esempio n. 7
0
        public static Microsoft.MediaCenter.Extensibility.MediaType GetCurrentMediaType()
        {
            // Otherwise see if another app within wmc is currently playing (such as live tv)
            MediaExperience mce = Application.MediaExperience;

            // Try to access MediaExperience.Transport and get PlayState from there
            if (mce != null)
            {
                return(mce.MediaType);
            }

            // At this point nothing worked, so return false
            return(Microsoft.MediaCenter.Extensibility.MediaType.Unknown);
        }
Esempio n. 8
0
 public void Launch(AddInHost host)
 {
     try
     {
         if (this.executionInfo.Media != null && this.executionInfo.Media.Count > 0)
         {
             bool flag = true;
             foreach (MediaInfo mediaInfo in this.executionInfo.Media)
             {
                 MediaCenterEnvironment centerEnvironment = AddInHost.Current.MediaCenterEnvironment;
                 MediaType?mediaType = mediaInfo.MediaType;
                 int       num1      = mediaType.HasValue ? (int)mediaType.GetValueOrDefault() : -1;
                 string    url       = mediaInfo.Url;
                 int       num2      = !flag ? 1 : 0;
                 centerEnvironment.PlayMedia((MediaType)num1, (object)url, num2 != 0);
                 flag = false;
             }
             MediaExperience mediaExperience = AddInHost.Current.MediaCenterEnvironment.MediaExperience;
             if (mediaExperience != null)
             {
                 mediaExperience.GoToFullScreen();
             }
         }
         if (VmcExecuteAddIn.ExecutionEngine != null)
         {
             VmcExecuteAddIn.session = new HistoryOrientedPageSession();
             ((PageSession)VmcExecuteAddIn.session).GoToPage("resx://Advent.VmcExecute/Advent.VmcExecute.Resources/MainPage");
             VmcExecuteAddIn.ExecutionEngine.BeginExecute();
         }
         else
         {
             if (!this.executionInfo.Page.HasValue)
             {
                 return;
             }
             AddInHost.Current.MediaCenterEnvironment.NavigateToPage(this.executionInfo.Page.Value, (object)null);
         }
     }
     catch (Exception ex)
     {
         VmcExecuteAddIn.LogError(ex.ToString());
         throw;
     }
 }
Esempio n. 9
0
        public static MediaTransport GetCurrentMediaTransport()
        {
            MediaExperience mce = Application.MediaExperience;

            if (mce != null)
            {
                try
                {
                    return(mce.Transport);
                }
                catch (InvalidOperationException e)
                {
                    // well if we are inactive we are not allowed to get media experience ...
                    Logger.ReportException("GetCurrentMediaTransport : ", e);
                }
            }

            return(null);
        }
Esempio n. 10
0
        /// <summary>
        /// Handles a change of Playstate by firing various events and post play processes
        /// </summary>
        private void HandleStoppedState(MediaCenterEnvironment env, MediaExperience exp, MediaTransport transport, PlaybackStateEventArgs e)
        {
            Logger.ReportVerbose("In HandleStoppedState");
            // Stop listening to the events
            env.PropertyChanged       -= MediaCenterEnvironment_PropertyChanged;
            transport.PropertyChanged -= MediaTransport_PropertyChanged;

            Logger.ReportVerbose("Events unhooked");

            // This will prevent us from getting in here twice after playback stops and calling post-play processes more than once.
            _HasStartedPlaying = false;

            CurrentMediaCollection = null;

            var mediaType = exp.MediaType;


            // Check if internal wmc player is still playing, which could happen if the user launches live tv while playing something
            if (mediaType != Microsoft.MediaCenter.Extensibility.MediaType.TV)
            {
                Logger.ReportVerbose("Turning off NPV");
                Application.CurrentInstance.ShowNowPlaying = false;

                if (mediaType == Microsoft.MediaCenter.Extensibility.MediaType.Audio || mediaType == Microsoft.MediaCenter.Extensibility.MediaType.DVD)
                {
                    PlaybackControllerHelper.ReturnToApplication(true);
                }
            }
            else
            {
                Logger.ReportVerbose("Not turning off NPV because Live TV is playing.");
            }

            Helper.AllowSleep();

            // Fire the OnFinished event for each item
            Async.Queue(Async.ThreadPoolName.PlaybackFinished, () => OnPlaybackFinished(e));
        }
Esempio n. 11
0
        public static PlayState GetCurrentPlayState()
        {
            MediaExperience mce = Application.MediaExperience;

            // Try to access MediaExperience.Transport and get PlayState from there
            if (mce != null)
            {
                try
                {
                    MediaTransport transport = mce.Transport;

                    if (transport != null)
                    {
                        return(transport.PlayState);
                    }
                }
                catch (InvalidOperationException ex)
                {
                    // We may not have access to the Transport if another application is playing media
                    Logger.ReportException("GetCurrentPlayState", ex);
                }

                // If we weren't able to access MediaExperience.Transport, it's likely due to another application playing media
                Microsoft.MediaCenter.Extensibility.MediaType mediaType = mce.MediaType;

                if (mediaType != Microsoft.MediaCenter.Extensibility.MediaType.Unknown)
                {
                    Logger.ReportVerbose("MediaExperience.MediaType is {0}. Assume content is playing.", mediaType);

                    return(Microsoft.MediaCenter.PlayState.Playing);
                }
            }

            // At this point nothing worked, so return Undefined
            return(PlayState.Undefined);
        }
        /// <summary>
        /// Handles a change of Playstate by firing various events and post play processes
        /// </summary>
        private void HandleStoppedState(MediaCenterEnvironment env, MediaExperience exp, MediaTransport transport, PlaybackStateEventArgs e)
        {
            Logger.ReportVerbose("In HandleStoppedState");
            // Stop listening to the events
            env.PropertyChanged -= MediaCenterEnvironment_PropertyChanged;
            transport.PropertyChanged -= MediaTransport_PropertyChanged;

            Logger.ReportVerbose("Events unhooked");

            // This will prevent us from getting in here twice after playback stops and calling post-play processes more than once.
            _HasStartedPlaying = false;

            _CurrentMediaCollection = null;

            var mediaType = exp.MediaType;


            // Check if internal wmc player is still playing, which could happen if the user launches live tv while playing something
            if (mediaType != Microsoft.MediaCenter.Extensibility.MediaType.TV)
            {
                Logger.ReportVerbose("Turning off NPV");
                Application.CurrentInstance.ShowNowPlaying = false;

                if (mediaType == Microsoft.MediaCenter.Extensibility.MediaType.Audio || mediaType == Microsoft.MediaCenter.Extensibility.MediaType.DVD)
                {
                    PlaybackControllerHelper.ReturnToApplication(true);
                }
            }
            else
            {
                Logger.ReportVerbose("Not turning off NPV because Live TV is playing.");
            }

            // Fire the OnFinished event for each item
            Async.Queue("Playback Finished", () => OnPlaybackFinished(e));
        }
        private void HandlePropertyChange(MediaCenterEnvironment env, MediaExperience exp, MediaTransport transport, string property)
        {
            PlayState state;
            long positionTicks = 0;

            // If another application is playing the content, such as the WMC autoplay handler, we will
            // not have permission to access Transport properties
            // But we can look at MediaExperience.MediaType to determine if something is playing
            try
            {
                state = transport.PlayState;
                positionTicks = transport.Position.Ticks;
            }
            catch (InvalidOperationException)
            {
                Logger.ReportVerbose("HandlePropertyChange was not able to access MediaTransport. Defaulting values.");
                state = exp.MediaType == Microsoft.MediaCenter.Extensibility.MediaType.Unknown ? Microsoft.MediaCenter.PlayState.Undefined : Microsoft.MediaCenter.PlayState.Playing;
            }

            bool playstateChanged = state != _CurrentPlayState;

            _CurrentPlayState = state;

            // Determine if playback has stopped. Per MSDN documentation, Finished is no longer used with Windows 7
            bool isStopped = state == Microsoft.MediaCenter.PlayState.Finished || state == Microsoft.MediaCenter.PlayState.Stopped || state == Microsoft.MediaCenter.PlayState.Undefined;

            // Don't get tripped up at the initial state of Stopped with position 0
            if (!_HasStartedPlaying)
            {
                if (!isStopped)
                {
                    Logger.ReportVerbose("HandlePropertyChange has recognized that playback has started");
                    _HasStartedPlaying = true;
                    if (Playable.HasMediaItems) Application.CurrentInstance.ReportPlaybackStart(Playable.CurrentMedia.ApiId);
                }
                else
                {
                    return;
                }
            }

            // protect against really agressive calls
            if (property == "Position")
            {
                var diff = (DateTime.Now - _LastTransportUpdateTime).TotalMilliseconds;

                // Only cancel out Position reports
                if (diff < 5000 && diff >= 0)
                {
                    return;
                }
            }

            _LastTransportUpdateTime = DateTime.Now;

            // Get metadata from player
            MediaMetadata metadata = exp.MediaMetadata;

            string metadataTitle = PlaybackControllerHelper.GetTitleOfCurrentlyPlayingMedia(metadata);
            long metadataDuration = PlaybackControllerHelper.GetDurationOfCurrentlyPlayingMedia(metadata);

            PlaybackStateEventArgs eventArgs = GetCurrentPlaybackState(metadataTitle, metadataDuration, positionTicks);

            // Only fire the progress handler while playback is still active, because once playback stops position will be reset to 0
            OnProgress(eventArgs);

            Application.CurrentInstance.ShowNowPlaying = eventArgs.Item == null || eventArgs.Item.ShowNowPlayingView;

            if (playstateChanged)
            {
                // Get the title from the PlayableItem, if it's available. Otherwise use MediaMetadata
                string title = eventArgs.Item == null ? metadataTitle : (eventArgs.Item.HasMediaItems ? eventArgs.Item.MediaItems.ElementAt(eventArgs.CurrentMediaIndex).Name : eventArgs.Item.Files.ElementAt(eventArgs.CurrentFileIndex));

                Logger.ReportVerbose("Playstate changed to {0} for {1}, PositionTicks:{2}, Playlist Index:{3}", state, title, positionTicks, eventArgs.CurrentFileIndex);

                PlayStateChanged();
                Logger.ReportVerbose("Back from PlayStateChanged");
            }

            if (isStopped)
            {
                Logger.ReportVerbose("Calling HandleStopedState");
                HandleStoppedState(env, exp, transport, eventArgs);
            }
        }
 public static void WaitForStream(MediaExperience mce)
 {
     Debug.Assert(Microsoft.MediaCenter.UI.Application.ApplicationThread == Thread.CurrentThread);
     int i = 0;
     while ((i++ < 15) && (mce.Transport.PlayState != Microsoft.MediaCenter.PlayState.Playing))
     {
         // settng the position only works once it is playing and on fast multicore machines we can get here too quick!
         Thread.Sleep(100);
     }
 }
        /// <summary>
        /// Plays or queues Media
        /// </summary>
        protected virtual void PlayPlayableItem(PlayableItem playable)
        {
            this.Playable      = playable;
            _HasStartedPlaying = false;

            // Get this now since we'll be using it frequently
            MediaCenterEnvironment mediaCenterEnvironment = AddInHost.Current.MediaCenterEnvironment;

            try
            {
                // Attach event handler to MediaCenterEnvironment
                // We need this because if you press stop on a dvd menu without ever playing, Transport.PropertyChanged will never fire
                mediaCenterEnvironment.PropertyChanged -= MediaCenterEnvironment_PropertyChanged;
                mediaCenterEnvironment.PropertyChanged += MediaCenterEnvironment_PropertyChanged;

                if (!CallPlayMediaForPlayableItem(mediaCenterEnvironment, playable))
                {
                    mediaCenterEnvironment.PropertyChanged -= MediaCenterEnvironment_PropertyChanged;

                    OnErrorPlayingItem(playable, "PlayMedia returned false");
                    return;
                }

                MediaExperience exp = mediaCenterEnvironment.MediaExperience ?? PlaybackControllerHelper.GetMediaExperienceUsingReflection();

                if (exp != null)
                {
                    MediaTransport transport = exp.Transport;

                    if (transport != null)
                    {
                        transport.PropertyChanged -= MediaTransport_PropertyChanged;
                        transport.PropertyChanged += MediaTransport_PropertyChanged;

                        // If using the legacy api we have to resume manually
                        if (_CurrentMediaCollection == null)
                        {
                            long startPosition = playable.StartPositionTicks;

                            if (startPosition > 0)
                            {
                                TimeSpan startPos = TimeSpan.FromTicks(startPosition);

                                Logger.ReportVerbose("Seeking to " + startPos.ToString());

                                transport.Position = startPos;
                            }
                        }
                    }
                    else
                    {
                        Logger.ReportWarning("PlayPlayableItem: MediaTransport is null");
                    }

                    if (playable.GoFullScreen)
                    {
                        Logger.ReportVerbose("Going fullscreen");
                        exp.GoToFullScreen();
                    }
                }
                else
                {
                    Logger.ReportWarning("PlayPlayableItem: MediaExperience is null");
                }
            }
            catch (Exception ex)
            {
                OnErrorPlayingItem(playable, ex);
            }
        }
Esempio n. 16
0
        private void HandlePropertyChange(MediaCenterEnvironment env, MediaExperience exp, MediaTransport transport, string property)
        {
            PlayState state;
            long      positionTicks = 0;

            // If another application is playing the content, such as the WMC autoplay handler, we will
            // not have permission to access Transport properties
            // But we can look at MediaExperience.MediaType to determine if something is playing
            try
            {
                state         = transport.PlayState;
                positionTicks = transport.Position.Ticks;
            }
            catch (InvalidOperationException)
            {
                Logger.ReportVerbose("HandlePropertyChange was not able to access MediaTransport. Defaulting values.");
                state = exp.MediaType == Microsoft.MediaCenter.Extensibility.MediaType.Unknown ? Microsoft.MediaCenter.PlayState.Undefined : Microsoft.MediaCenter.PlayState.Playing;
            }

            bool playstateChanged = state != _CurrentPlayState;

            _CurrentPlayState = state;

            // Determine if playback has stopped. Per MSDN documentation, Finished is no longer used with Windows 7
            bool isStopped = state == Microsoft.MediaCenter.PlayState.Finished || state == Microsoft.MediaCenter.PlayState.Stopped || state == Microsoft.MediaCenter.PlayState.Undefined;

            // Don't get tripped up at the initial state of Stopped with position 0
            if (!_HasStartedPlaying)
            {
                if (!isStopped)
                {
                    Logger.ReportVerbose("HandlePropertyChange has recognized that playback has started");
                    _HasStartedPlaying = true;
                    IsStreaming        = Playable.CurrentFile.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ||
                                         Playable.CurrentFile.StartsWith("https://", StringComparison.OrdinalIgnoreCase);
                    if (Playable.HasMediaItems)
                    {
                        Application.CurrentInstance.CurrentlyPlayingItemId = lastItemId = Playable.CurrentMedia.Id;
                        Application.CurrentInstance.ReportPlaybackStart(Playable.CurrentMedia.ApiId, IsStreaming);
                    }
                }
                else
                {
                    return;
                }
            }

            // protect against really agressive calls
            if (property == "Position")
            {
                Application.CurrentInstance.CurrentlyPlayingItem.CurrentPlaybackPosition = positionTicks;
                var diff = (DateTime.Now - _LastTransportUpdateTime).TotalMilliseconds;

                // Only cancel out Position reports
                if (diff < 5000 && diff >= 0)
                {
                    return;
                }
            }

            _LastTransportUpdateTime = DateTime.Now;

            // Get metadata from player
            MediaMetadata metadata = exp.MediaMetadata;

            string metadataTitle    = PlaybackControllerHelper.GetTitleOfCurrentlyPlayingMedia(metadata);
            long   metadataDuration = PlaybackControllerHelper.GetDurationOfCurrentlyPlayingMedia(metadata);

            PlaybackStateEventArgs eventArgs = GetCurrentPlaybackState(metadataTitle, metadataDuration, positionTicks);

            // Only fire the progress handler while playback is still active, because once playback stops position will be reset to 0
            OnProgress(eventArgs);

            if (eventArgs.Item != null && eventArgs.Item.HasMediaItems && eventArgs.Item.CurrentMedia.Id != lastItemId)
            {
                // started playing a new item - update
                Application.CurrentInstance.CurrentlyPlayingItemId = lastItemId = eventArgs.Item.MediaItems.ElementAt(eventArgs.CurrentMediaIndex).Id;
            }


            Application.CurrentInstance.ShowNowPlaying = eventArgs.Item == null || eventArgs.Item.ShowNowPlayingView;

            if (playstateChanged)
            {
                FirePropertyChanged("IsPaused");

                if (state == Microsoft.MediaCenter.PlayState.Paused)
                {
                    // allow screensavers/sleep
                    Helper.AllowSleep();
                }
                else if (state == Microsoft.MediaCenter.PlayState.Playing || state == Microsoft.MediaCenter.PlayState.Buffering)
                {
                    // disallow again
                    Helper.PreventSleep();
                }

                // Get the title from the PlayableItem, if it's available. Otherwise use MediaMetadata
                string title = eventArgs.Item == null ? metadataTitle : (eventArgs.Item.HasMediaItems ? eventArgs.Item.MediaItems.ElementAt(eventArgs.CurrentMediaIndex).Name : eventArgs.Item.Files.ElementAt(eventArgs.CurrentFileIndex));

                Logger.ReportVerbose("Playstate changed to {0} for {1}, PositionTicks:{2}, Playlist Index:{3}", state, title, positionTicks, eventArgs.CurrentFileIndex);
                //Logger.ReportVerbose("Refresh rate is {0}", DisplayUtil.GetCurrentRefreshRate());

                PlayStateChanged();
                Logger.ReportVerbose("Back from PlayStateChanged");
            }

            if (isStopped)
            {
                Logger.ReportVerbose("Calling HandleStopedState");
                HandleStoppedState(env, exp, transport, eventArgs);
            }
        }
Esempio n. 17
0
        /// <summary>
        /// Plays or queues Media
        /// </summary>
        protected virtual void PlayPlayableItem(PlayableItem playable)
        {
            System.Diagnostics.Debug.Assert(Microsoft.MediaCenter.UI.Application.ApplicationThread == System.Threading.Thread.CurrentThread);
            // Prevent sleep/screen saver
            Helper.PreventSleep();

            this.Playable      = playable;
            _HasStartedPlaying = false;

            // Get this now since we'll be using it frequently
            MediaCenterEnvironment mediaCenterEnvironment = Application.MediaCenterEnvironment;

            try
            {
                // Attach event handler to MediaCenterEnvironment
                // We need this because if you press stop on a dvd menu without ever playing, Transport.PropertyChanged will never fire
                mediaCenterEnvironment.PropertyChanged -= MediaCenterEnvironment_PropertyChanged;
                mediaCenterEnvironment.PropertyChanged += MediaCenterEnvironment_PropertyChanged;

                if (!CallPlayMediaForPlayableItem(mediaCenterEnvironment, playable))
                {
                    mediaCenterEnvironment.PropertyChanged -= MediaCenterEnvironment_PropertyChanged;

                    OnErrorPlayingItem(playable, "PlayMedia returned false");
                    return;
                }

                MediaExperience exp = Application.MediaExperience;

                if (exp != null)
                {
                    MediaTransport transport = exp.Transport;

                    if (transport != null)
                    {
                        transport.PropertyChanged -= MediaTransport_PropertyChanged;
                        transport.PropertyChanged += MediaTransport_PropertyChanged;

                        // If using the legacy api we have to resume manually
                        if (CurrentMediaCollection == null)
                        {
                            long startPosition = playable.StartPositionTicks;

                            if (startPosition > 0)
                            {
                                TimeSpan startPos = TimeSpan.FromTicks(startPosition);

                                Logger.ReportVerbose("Seeking to " + startPos.ToString());

                                transport.Position = startPos;
                            }
                        }
                    }
                    else
                    {
                        Logger.ReportWarning("PlayPlayableItem: MediaTransport is null");
                    }

                    if (playable.GoFullScreen || (!playable.HasMediaItems && !playable.PlayInBackground) ||
                        (Config.Instance.DisableCustomPlayerForDvd && playable.CurrentMedia.MediaType == Library.MediaType.DVD))
                    {
                        Logger.ReportVerbose("Going fullscreen");
                        exp.GoToFullScreen();
                    }
                    else if (playable.UseCustomPlayer)
                    {
                        Logger.ReportVerbose("Using custom player interface");
                        Application.CurrentInstance.OpenCustomPlayerUi();
                    }
                }
                else
                {
                    Logger.ReportWarning("PlayPlayableItem: MediaExperience is null");
                }
            }
            catch (Exception ex)
            {
                OnErrorPlayingItem(playable, ex);
            }
        }