public static void Apply(string name, string gameDataFile, int videoBitRate, string destFile, bool highlights, Action <long, long> progressReporter, CancellationToken token)
        {
            var domain = AppDomain.CreateDomain(name, null, new AppDomainSetup());

            try
            {
                var hostArgs = new TranscodeAndOverlayArguments(progressReporter, () => token.IsCancellationRequested);

                var arg = (TranscodeAndOverlayArguments)domain.CreateInstanceFromAndUnwrap(
                    typeof(TranscodeAndOverlayArguments).Assembly.Location,
                    typeof(TranscodeAndOverlayArguments).FullName,
                    false,
                    BindingFlags.CreateInstance,
                    null,
                    new object[] { gameDataFile, videoBitRate, destFile, highlights, (Action <long, long>)hostArgs.ProgressReporter, (Func <bool>)hostArgs.IsAborted, hostArgs.LogRepeater, Settings.Default.PluginName },
                    null,
                    null);
                arg.Apply();
            }
            catch (Exception e)
            {
                TraceError.WriteLine(e.Message);
                TraceError.WriteLine(e.StackTrace);
                throw e;
            }
            finally
            {
                AppDomain.Unload(domain);
            }
        }
        private void CaptureNewFileNames(object sender, ElapsedEventArgs e)
        {
            try
            {
                var guessedFileName = Directory.GetFiles(workingFolder, "*.avi")
                    .Concat(Directory.GetFiles(workingFolder, "*.mp4"))
                    .Select(fn => new { FileName = fn, CreationTime = File.GetCreationTime(fn) })
                    .Where(f => f.CreationTime >= started)
                    .OrderByDescending(f => f.CreationTime)
                    .FirstOrDefault();

                if (guessedFileName != null && !captureFileNames.Any(c => c.FileName == guessedFileName.FileName))
                {
                    TraceInfo.WriteLine("Found video file {0}", guessedFileName.FileName);
                    captureFileNames.Add(new CapturedVideoFile { FileName = guessedFileName.FileName });
                }
            }
            catch (Exception ee)
            {
                TraceError.WriteLine(ee.Message);
                TraceError.WriteLine(ee.StackTrace);
            }
            finally
            {
                if (timer != null)
                    timer.Start();
            }
        }
        public void Process(DataSample data, TimeSpan relativeTime)
        {
            try
            {
                var cameraGroupName = "";
                var cameraName      = "";

                var cameraGroup = data.SessionData.CameraInfo.Groups.FirstOrDefault(g => g.GroupNum == data.Telemetry.CamGroupNumber);
                if (cameraGroup != null)
                {
                    cameraGroupName = cameraGroup.GroupName;
                    var camera = cameraGroup.Cameras.FirstOrDefault(c => c.CameraNum == data.Telemetry.CamCameraNumber);
                    if (camera != null)
                    {
                        cameraName = camera.CameraName;
                    }
                }

                TraceDebug.WriteLine("{0} Camera: Driver: {1}, GroupNumber: {2}, Number: {3}, State: {4}, GroupName: {5}, Name: {6}",
                                     data.Telemetry.SessionTimeSpan,
                                     data.Telemetry.CamCar.Details.Driver.UserName,
                                     data.Telemetry.CamGroupNumber,
                                     data.Telemetry.CamCameraNumber,
                                     data.Telemetry.CamCameraState,
                                     cameraGroupName,
                                     cameraName);
            }
            catch (Exception e)
            {
                TraceError.WriteLine(e.Message);
                TraceError.WriteLine(e.StackTrace);
            }
        }
Ejemplo n.º 4
0
        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            var ex = e.ExceptionObject as Exception;

            if (ex != null)
            {
                TraceError.WriteLine(ex.Message);
                TraceError.WriteLine(ex.StackTrace);
            }
            else
            {
                Trace.WriteLine("An unknown error occured. {0}, {1}".F(e.ExceptionObject.GetType().Name, e.ExceptionObject.ToString()));
            }
        }
 void RunTest(string filename, SynchronizationContext context)
 {
     try
     {
         TranscodeVideoTest(filename);
     }
     catch (Exception e)
     {
         TraceError.WriteLine(e.Message);
         TraceError.WriteLine(e.StackTrace);
     }
     finally
     {
         context.Post(ignored => testVideoCaptureButton.Enabled = true, null);
     }
 }
        void Process(Transcoder transcoder, bool highlights, Action <long, long> monitorProgress, Func <bool> isAborted)
        {
            try
            {
                TraceInfo.WriteLineIf(highlights, "Transcoding highlights to {0}", transcoder.DestinationFile);
                TraceInfo.WriteLineIf(!highlights, "Transcoding full replay to {0}", transcoder.DestinationFile);

                transcoder.ProcessVideo((readers, saveToSink) =>
                {
                    var writeToSink = monitorProgress == null ? saveToSink : MonitorProgress(saveToSink);

                    var fadeSegments     = AVOperations.FadeIn(AVOperations.FadeOut(writeToSink));
                    var edits            = highlights ? ApplyEdits(writeToSink) : writeToSink;
                    var mainBodyOverlays = AVOperations.Overlay(applyRaceDataOverlay, edits);
                    var introOverlay     = AVOperations.Overlay(applyIntroOverlay, fadeSegments);

                    var sourceReaderExtra = readers.FirstOrDefault(r => ((CapturedVideoFile)r.State).isIntroVideo);
                    if (sourceReaderExtra != null)
                    {
                        var introSourceReader = sourceReaderExtra.SourceReader;
                        var mainReaders       = AVOperations.Combine(readers.Skip(1).Select(r => r.SourceReader).ToArray(), Settings.Default.VideoSplitGap);

                        totalDuration += introSourceReader.Duration + mainReaders.Duration;

                        AVOperations.StartConcat(introSourceReader, introOverlay,
                                                 AVOperations.Concat(mainReaders, mainBodyOverlays, isAborted), isAborted);
                    }
                    else
                    {
                        var mainReaders = AVOperations.Combine(readers.Select(r => r.SourceReader).ToArray(), Settings.Default.VideoSplitGap);

                        totalDuration += mainReaders.Duration;

                        AVOperations.Concat(mainReaders, mainBodyOverlays, isAborted)(0, 0);
                    }
                });

                TraceInfo.WriteLineIf(highlights, "Done Transcoding highlights to {0}", transcoder.DestinationFile);
                TraceInfo.WriteLineIf(!highlights, "Done Transcoding full replay to {0}", transcoder.DestinationFile);
            }
            catch (Exception e)
            {
                TraceError.WriteLine(e.Message);
                TraceError.WriteLine(e.StackTrace);
                throw e;
            }
        }
Ejemplo n.º 7
0
        public IRacingReplay InTheBackground(Action <string> onComplete)
        {
            requestAbort = false;
            var context = SynchronizationContext.Current;

            cancellationTokenSource = new CancellationTokenSource();
            token = cancellationTokenSource.Token;

            backgrounTask = new Task(() => {
                try
                {
                    foreach (var action in actions)
                    {
                        action();
                        if (token.IsCancellationRequested)
                        {
                            break;
                        }
                    }

                    context.Post(() => onComplete(null));
                }
                catch (Exception e)
                {
                    TraceError.WriteLine(e.Message);
                    TraceError.WriteLine(e.StackTrace);
                    TraceInfo.WriteLine("Process aborted");
                    var message = e.InnerException != null ? e.InnerException.Message : e.Message;
                    context.Post(() => onComplete("There was an error - details in Log Messages\n{0}".F(message)));
                }
                finally
                {
                    backgrounTask = null;
                    actions       = new List <Action>();
                }
            });

            backgrounTask.Start();

            return(this);
        }
Ejemplo n.º 8
0
        SessionData ReadSessionInfo(iRSDKHeader header)
        {
            if (header.sessionInfoUpdate == sessionLastInfoUpdate)
            {
                return(lastSessionInfo);
            }

            sessionLastInfoUpdate = header.sessionInfoUpdate;
            Trace.WriteLine("New Session data retrieved from iRacing. {0}".F(sessionLastInfoUpdate), "DEBUG");

            var t = Task.Factory.StartNew(() => {
                try {
                    var sessionInfoData = new byte[header.sessionInfoLen];
                    accessor.ReadArray <byte>(header.sessionInfoOffset, sessionInfoData, 0, header.sessionInfoLen);
                    var sessionInfoString = System.Text.Encoding.Default.GetString(sessionInfoData);

                    var length = sessionInfoString.IndexOf('\0');
                    if (length == -1)
                    {
                        lastSessionInfo = null;
                        return;
                    }

                    sessionInfoString = sessionInfoString.Substring(0, sessionInfoString.IndexOf('\0'));
                    Trace.WriteLine(sessionInfoString, "DEBUG");
                    lastSessionInfo = DeserialiseSessionInfo(sessionInfoString, header.sessionInfoUpdate);
                }
                catch (Exception e)
                {
                    TraceError.WriteLine(e.Message);
                    TraceError.WriteLine(e.StackTrace);
                }
            });

            if (lastSessionInfo == null)
            {
                t.Wait();
            }

            return(lastSessionInfo);
        }
        public static void Apply(string gameDataFile, int videoBitRate, string destFile, bool highlights, Action <long, long> progressReporter, Func <bool> isAborted, string pluginName)
        {
            try
            {
                var leaderBoard = new LeaderBoard {
                    OverlayData = OverlayData.FromFile(gameDataFile), PluginName = pluginName
                };

                var transcoder = new Transcoder
                {
                    VideoFiles      = leaderBoard.OverlayData.VideoFiles.ToSourceReaderExtra(),
                    DestinationFile = destFile,
                    VideoBitRate    = videoBitRate
                };

                new TranscodeAndOverlay(leaderBoard, progressReporter).Process(transcoder, highlights, progressReporter, isAborted);
            }
            catch (Exception e)
            {
                TraceError.WriteLine(e.Message);
                TraceError.WriteLine(e.StackTrace);
                throw e;
            }
        }
Ejemplo n.º 10
0
        void RunTest(string workingFolder, SynchronizationContext context)
        {
            try
            {
                TraceInfo.WriteLine("Switching to iRacing ....");

                var hwnd = Win32.Messages.FindWindow(null, "iRacing.com Simulator");
                Win32.Messages.ShowWindow(hwnd, Win32.Messages.SW_SHOWNORMAL);
                Win32.Messages.SetForegroundWindow(hwnd);
                Thread.Sleep(2000);

                TraceInfo.WriteLine("Begining Test....");
                var videoCapture = new VideoCapture();

                TraceInfo.WriteLine("Broadcasting keypress ALT+F9 to activate your video capture software");
                videoCapture.Activate(workingFolder);

                TraceInfo.WriteLine("Expecting video file to be written in folder: {0}", workingFolder);

                TraceInfo.WriteLine("Waiting for 5 seconds");

                for (var i = 5; i >= 0; i--)
                {
                    Thread.Sleep(1.Seconds());
                    TraceInfo.WriteLine("{0} Seconds...", i);
                }

                TraceInfo.WriteLine("Broadcasting keypress ALT+F9 to deactivate your video capture software");
                var filenames = videoCapture.Deactivate();


                TraceInfo.WriteLine("Minimising iRacing");

                AltTabBackToApp();

                if (filenames.Count == 0)
                {
                    TraceInfo.WriteLine("\nFailure - Did not find any video files");
                    return;
                }

                if (filenames.Count != 1)
                {
                    TraceInfo.WriteLine("\nFailure - Found more than 1 video file!");
                    return;
                }

                var filename = filenames[0];

                if (filename != null)
                {
                    TraceInfo.WriteLine("");
                    TraceInfo.WriteLine("Found your video file {0}.", filename);

                    TranscodeVideoTest(filename.FileName);
                }
                else
                {
                    TraceInfo.WriteLine("");
                    TraceInfo.WriteLine("Failure!");
                }
            }
            catch (Exception e)
            {
                TraceError.WriteLine(e.Message);
                TraceError.WriteLine(e.StackTrace);
            }
            finally
            {
                context.Post(ignored => testVideoCaptureButton.Enabled = true, null);
            }
        }
Ejemplo n.º 11
0
        async void Main_Load(object sender, EventArgs e)
        {
            changeVersionButton.Visible = File.Exists(Settings.Default.MainExecPath);

            Settings.Default.SettingChanging += Default_SettingChanging;
            iracingEvents.NewSessionData     += iracingEvents_NewSessionData;
            iracingEvents.Connected          += iracingEvents_Connected;
            iracingEvents.Disconnected       += iracingEvents_Disconnected;
            iracingEvents.StartListening();

            workingFolderTextBox.Text = Settings.Default.WorkingFolder;

            logMessagges = new LogMessages();
            Trace.Listeners.Add(new MyListener(logMessagges.TraceMessage));

            LogListener.ToFile(GetDefaultLogFileName());
            AwsLogListener.SetPhaseGeneral();

            new Task(LogSystemInformation).Start();

            fileWatchTimer          = new System.Windows.Forms.Timer();
            fileWatchTimer.Interval = 10;
            fileWatchTimer.Tick    += (s, a) => OnGameDataFileChanged();
            fileWatchTimer.Start();

            videoBitRate.Text       = Settings.Default.videoBitRate.ToString();
            sourceVideoTextBox.Text = Settings.Default.lastVideoFile;

            BeginProcessButton.Enabled = false;

            iRacingProcess = new IRacingReplay()
                             .WhenIRacingStarts(() =>
            {
                BeginProcessButton.Enabled = true;
                workingFolderTextBox_TextChanged(null, null);
                ProcessErrorMessageLabel.Visible = false;
                WaitingForIRacingLabel.Visible   = false;
            })
                             .InTheBackground(errorMessage => { });

            try
            {
                var items = await GitHubAccess.GetVersions("vipoo", "iRacingReplayOverlay.net");

                var currentVersionItem    = items.FirstOrDefault(r => r.VersionStamp == AboutBox1.AssemblyVersion);
                var isNewVersionAvailable = false;

                if (currentVersionItem.VersionStamp == null)
                {
                    isNewVersionAvailable = true;
                }
                else
                {
                    var isPreRelease = currentVersionItem.Prerelease;

                    var latestVersion = items.OrderByDescending(r => new Version(r.VersionStamp)).Where(r => r.Prerelease == isPreRelease).First();
                    isNewVersionAvailable = new Version(latestVersion.VersionStamp) > AboutBox1.AssemblyVersionStamp;
                }

                if (isNewVersionAvailable)
                {
                    newVersionMessage.Visible = true;
                }
            }
            catch (Exception ee)
            {
                TraceError.WriteLine(ee.Message);
                TraceError.WriteLine(ee.StackTrace);
            }
        }
Ejemplo n.º 12
0
 static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
 {
     MessageBox.Show("An error occured.  Details have been logged.\n\n{0}".F(e.Exception.Message), "Error");
     TraceError.WriteLine(e.Exception.Message);
     TraceError.WriteLine(e.Exception.StackTrace);
 }
        void Listen()
        {
            var isConnected           = false;
            var isDisconnected        = true;
            var lastSessionInfoUpdate = -1;

            var periodCount   = this.period;
            var lastTimeStamp = DateTime.Now;

            try
            {
                foreach (var d in instance.GetDataFeed(logging: false))
                {
                    if (requestCancel)
                    {
                        return;
                    }

                    if (!isConnected && d.IsConnected)
                    {
                        isConnected    = true;
                        isDisconnected = false;
                        connected.Invoke();
                    }

                    if (!isDisconnected && !d.IsConnected)
                    {
                        isConnected    = false;
                        isDisconnected = true;
                        disconnected.Invoke();
                    }

                    if (period >= (DateTime.Now - lastTimeStamp))
                    {
                        continue;
                    }

                    lastTimeStamp = DateTime.Now;

                    if (d.IsConnected)
                    {
                        newData.Invoke(d);
                    }

                    if (d.IsConnected && d.SessionData.InfoUpdate != lastSessionInfoUpdate)
                    {
                        lastSessionInfoUpdate = d.SessionData.InfoUpdate;
                        newSessionData.Invoke(d);
                    }
                }
            }
            catch (Exception e)
            {
                TraceError.WriteLine(e.Message);
                TraceError.WriteLine(e.StackTrace);
            }
            finally
            {
                backListener = null;
            }
        }