Пример #1
0
        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);
            }
        }