internal static void ChangeRefreshRateToMatchedFps(double matchedFps, string file) { Log.Instance.Info("Changing RefreshRate for matching configured FPS: {0}", matchedFps); RefreshRateChanger.SetRefreshRateBasedOnFPS(matchedFps, file, RefreshRateChanger.MediaType.Video); if (RefreshRateChanger.RefreshRateChangePending) { TimeSpan ts = DateTime.Now - RefreshRateChanger.RefreshRateChangeExecutionTime; if (ts.TotalSeconds > RefreshRateChanger.WAIT_FOR_REFRESHRATE_RESET_MAX) { Log.Instance.Info("RefreshRateChanger.DelayedRefreshrateChanger: waited {0}s for refreshrate change, but it never took place (check your config). Proceeding with playback.", RefreshRateChanger.WAIT_FOR_REFRESHRATE_RESET_MAX); RefreshRateChanger.ResetRefreshRateState(); } else { Log.Instance.Info("RefreshRateChanger.DelayedRefreshrateChanger: waited {0}s for refreshrate change. Proceeding with playback.", ts.TotalSeconds); } } }
private void OnHDPlayerExited(object obj, EventArgs e) { // Restore refresh rate if it was changed if (MovingPicturesCore.Settings.UseDynamicRefreshRateChangerWithExternalPlayer && RefreshRateChanger.RefreshRateChangePending) { RefreshRateChanger.AdaptRefreshRate(); } // enable mediaportal input devices InputDevices.InputDevices.Init(); // show mediaportal and start rendering GUIGraphicsContext.BlankScreen = false; GUIGraphicsContext.form.Show(); GUIGraphicsContext.ResetLastActivity(); GUIMessage msg = new GUIMessage(GUIMessage.MessageType.GUI_MSG_GETFOCUS, 0, 0, 0, 0, 0, null); GUIWindowManager.SendThreadMessage(msg); GUIGraphicsContext.CurrentState = GUIGraphicsContext.State.RUNNING; logger.Info("HD Playback: The external player has exited."); // call the logic for when an external player exits onExternalExit(); }
// This method launches an external HD player controlled by Moving Pictures // Eventually when Mediaportal has a native solution for HD video disc formats // this will be not needed anymore. private void LaunchHDPlayer(string videoPath) { logger.Info("HD Playback: Launching external player."); // First check if the user supplied executable for the external player is valid string execPath = MovingPicturesCore.Settings.ExternalPlayerExecutable; if (!File.Exists(execPath)) { // if it's not show a dialog explaining the error _gui.ShowMessage("Error", Translation.MissingExternalPlayerExe); logger.Info("HD Playback: The external player executable '{0}' is missing.", execPath); // do nothing resetPlayer(); return; } // process the argument string and replace the 'filename' variable string arguments = MovingPicturesCore.Settings.ExternalPlayerArguements; string videoRoot = Utility.GetMovieBaseDirectory(new FileInfo(videoPath).Directory).FullName; string filename = Utility.IsDriveRoot(videoRoot) ? videoRoot : videoPath; string fps = ((int)(queuedMedia.VideoFrameRate + 0.5f)).ToString(); arguments = arguments.Replace("%filename%", filename); arguments = arguments.Replace("%fps%", fps); arguments = arguments.Replace("%root%", videoRoot); logger.Debug("External Player: Video='{0}', Root={1}, FPS={2}, ExecCommandLine={3} {4}", filename, videoRoot, fps, execPath, arguments); // Set Refresh Rate Based On FPS if needed if (MovingPicturesCore.Settings.UseDynamicRefreshRateChangerWithExternalPlayer) { double framerate = double.Parse(queuedMedia.VideoFrameRate.ToString(NumberFormatInfo.InvariantInfo), NumberFormatInfo.InvariantInfo); logger.Info("Requesting new refresh rate: FPS={0}", framerate.ToString()); RefreshRateChanger.SetRefreshRateBasedOnFPS(framerate, filename, RefreshRateChanger.MediaType.Video); if (RefreshRateChanger.RefreshRateChangePending) { TimeSpan ts = DateTime.Now - RefreshRateChanger.RefreshRateChangeExecutionTime; if (ts.TotalSeconds > RefreshRateChanger.WAIT_FOR_REFRESHRATE_RESET_MAX) { logger.Info("Refresh rate change failed. Please check your mediaportal log and configuration", RefreshRateChanger.WAIT_FOR_REFRESHRATE_RESET_MAX); RefreshRateChanger.ResetRefreshRateState(); } } } // Setup the external player process ProcessStartInfo processinfo = new ProcessStartInfo(); processinfo.FileName = execPath; processinfo.Arguments = arguments; Process hdPlayer = new Process(); hdPlayer.StartInfo = processinfo; hdPlayer.Exited += OnHDPlayerExited; hdPlayer.EnableRaisingEvents = true; try { // start external player process hdPlayer.Start(); // disable mediaportal input devices InputDevices.InputDevices.Stop(); // hide mediaportal and suspend rendering to save resources for the external player GUIGraphicsContext.BlankScreen = true; GUIGraphicsContext.form.Hide(); GUIGraphicsContext.CurrentState = GUIGraphicsContext.State.SUSPENDING; logger.Info("HD Playback: External player started."); onMediaStarted(queuedMedia); } catch (Exception e) { logger.ErrorException("HD Playback: Could not start the external player process.", e); resetPlayer(); } }