예제 #1
0
        public async Task <IEmulatorTaskResult> ExecuteEmulationAsync(IEmulatorTask task)
        {
            // IFileRecord fileToExecute = task.EmulatingGame.WithFiles().FirstOrDefault(f => this.Properties.Mimetypes.Contains(f.MimeType));
            IFileRecord fileToExecute = null;

            if (fileToExecute == null)
            {
                throw new FileNotFoundException(
                          $"Unable to find a compatible ROM for game {task.EmulatingGame.RecordId}.");
            }

            IEmulatorTaskResult result  = new RetroArchTaskResult(task.ProcessTaskRoot, task.GameSaveLocation);
            IProcessBuilder     builder = this.RetroArchExecutable.GetProcessBuilder();

            builder.WithArgument("--verbose")
            .WithArgument("-s", task.ProcessTaskRoot.SaveDirectory.FullName)
            .WithArgument("-c", Path.Combine(task.ProcessTaskRoot.ConfigurationDirectory.FullName, "retroarch.cfg"))
            .WithArgument("-L", Path.Combine(this.CoreDirectory.FullName, task.Pragmas["retroarch_core"]));

            //  .WithArgument(fileToExecute.);

            foreach (var cfg in this.BuildConfiguration(task.EmulatorConfiguration, task.ControllerConfiguration))
            {
                await File.WriteAllTextAsync(Path.Combine(task.ProcessTaskRoot.ConfigurationDirectory.FullName,
                                                          task.EmulatorConfiguration.Descriptor.Outputs[cfg.Key].Destination), cfg.Value);
            }

            var psi     = builder.ToProcessStartInfo();
            var process = Process.Start(psi);

            process.Exited += (s, e) => result.Closed();
            return(result);
        }
 public DirectoryInfo GetTaskRoot(IEmulatorTask task)
 {
     return(this.EmulatorTaskRoot.CreateSubdirectory(task.TaskIdentifier.ToString()));
 }