/// <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); }
/// <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); }
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> /// 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); }
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); }
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; } }
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); }
/// <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)); }
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); } }
/// <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); } }
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); } }
/// <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); } }