Exemplo n.º 1
0
        /// <summary>
        ///     Runs the current MAME game.
        /// </summary>
        public void RunGame()
        {
            // Don't attempt to start MAME process if we are exiting
            if (_cancellationTokenSource.IsCancellationRequested)
            {
                return;
            }

            var game = CurrentGame();

            Log.Information("Running game {description} {year} {manufacturer} on display {display}",
                            game.Description,
                            game.Year, game.Manufacturer, _screen.DeviceName);

            // Create layout and run game
            var arguments = new List <string>
            {
                game.Name,
                _settings.CommandLineOptions,
                "-screen",
                $"\"{_screen.DeviceName}\""
            };

            // Enable in-game titles if required
            if (_settings.LayoutSettings.InGameTitles.Enabled)
            {
                var artPath = _layoutBuilder.EnsureLayout(game, _screen.Bounds.Width, _screen.Bounds.Height);
                arguments.Add("-artpath");
                arguments.Add(artPath);
            }

            try
            {
                // Start MAME, verifying that we aren't in the process of shutting down
                if (_cancellationTokenSource.IsCancellationRequested)
                {
                    return;
                }

                _mameProcess         = _invoker.Run(false, arguments.ToArray());
                _mameProcess.Exited += OnMameExited;
                _mameProcess.Start();

                Log.Debug("MAME started; pid: {pid}", _mameProcess.Id);

                OnGameStarted?.Invoke(this, null);
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Unable to start game");
                _cancellationTokenSource.Cancel();

                throw;
            }
        }