public async Task RunTransferAsync(IProgress <float> progress, IProgress <string> log, CancellationToken cancel) { try { if (tracks.Count > 0) { log.Report("Generating glo files ..."); string tmpDir = Path.Combine(Path.GetDirectoryName(settings.AerotechAppExePath), GLO_SUBDIR_NAME); Directory.CreateDirectory(tmpDir); string versionId = GenerateRandomString(3); // clean up potential left-over files from previous runs Directory.EnumerateFiles(tmpDir, ".glo").ForEach(File.Delete); string sanitizedDocumentName = FileSerializer.SanitizeString(Path.GetFileNameWithoutExtension(documentName)); for (int i = 0; i < tracks.Count; i++) { await Task.Run(() => { string file = Path.Combine(tmpDir, string.Format("{0:000}_{1}_{2}_{3}.glo", i + 1, FileSerializer.SanitizeString(tracks[i].Label), versionId, sanitizedDocumentName)); FileSerializer.ExportTrack(tracks[i], file, (float)settings.ExportStartTime.TotalSeconds); }, cancel); ReportProgress(progress, TaskStage.ExportFiles, i + 1, tracks.Count); } } // close open instances of the Aerotech program Process[] runningPrograms = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(settings.AerotechAppExePath)); if (runningPrograms.Any()) { log.Report("Trying to close running instances of Glo Ultimate App ..."); foreach (var p in runningPrograms) { p.CloseMainWindow(); } } log.Report("Starting Glo Ultimate App ..."); aerotechProc = await Task.Run((Func <Process>) LaunchAerotechProgram, cancel); await Task.Delay(settings.DelayBeforeStart, cancel); ReportProgress(progress, TaskStage.OpenProgram); inputSim = new InputSimulator(); if (tracks.Count > 0) { log.Report("Navigating to directory ..."); Press(VirtualKeyCode.F8); await Task.Delay(settings.DelayBetweenKeys); Press(VirtualKeyCode.DOWN); await Task.Delay(settings.DelayBetweenKeys); Press(VirtualKeyCode.RETURN); await Task.Delay(settings.DelayBetweenKeys); Press(VirtualKeyCode.ESCAPE); await Task.Delay(settings.DelayBetweenKeys); ReportProgress(progress, TaskStage.UploadSequences, 1, tracks.Count + 1); for (int i = 0; i < tracks.Count; i++) { log.Report("Uploading track \"" + tracks[i].Label + "\" ..."); Press(VirtualKeyCode.F8); await Task.Delay(settings.DelayBetweenKeys, cancel); Press(VirtualKeyCode.DOWN); await Task.Delay(settings.DelayBetweenKeys, cancel); Press(VirtualKeyCode.RETURN); await Task.Delay(settings.DelayBetweenKeys + settings.DelayForUpload, cancel); Press(VirtualKeyCode.DOWN); await Task.Delay(settings.DelayBetweenKeys, cancel); ReportProgress(progress, TaskStage.UploadSequences, i + 2, tracks.Count + 1); } } if (settings.StartAutomagicallyAfterTransfer) { log.Report("Starting the sequence ..."); Press(VirtualKeyCode.F12); await Task.Delay(settings.DelayBetweenKeys, cancel); Press(VirtualKeyCode.F5); } if (settings.ExportStartTime < TimeSpan.Zero && (settings.StartInternalMusicAfterTransfer || settings.StartExternalMusicAfterTransfer)) { log.Report("Waiting " + -settings.ExportStartTime + " before starting music ..."); await Task.Delay(-settings.ExportStartTime, cancel); } if (settings.StartInternalMusicAfterTransfer) { log.Report("Starting internal music ..."); float time = (float)MathUtil.Max(settings.ExportStartTime, TimeSpan.Zero).TotalSeconds; bool result = playback.PlayAt(time); if (!result) { log.Report("Error: Could not start internal music!"); } } if (settings.StartExternalMusicAfterTransfer) { Process musicProc = settings.GetMusicProcess(); if (musicProc == null) { log.Report("Error: External music program not running, unable to start music!"); } else { log.Report("Starting music ..."); SetForegroundWindow(musicProc.MainWindowHandle); inputSim.Keyboard.KeyPress(VirtualKeyCode.SPACE); } } await Task.Delay(settings.DelayBetweenKeys, cancel); ReportProgress(progress, TaskStage.Completed); success = true; Cleanup(); log.Report("Done!" + Environment.NewLine); } catch (OperationCanceledException) { Cleanup(); progress.Report(0); log.Report("Transfer was canceled." + Environment.NewLine); } catch (InvalidOperationException e) { Cleanup(); progress.Report(0); log.Report("Error: Aerotech program was closed unexpectedly: " + e.Message); } }