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