public void StartProcessingPluginChain(IProcessingPluginChain processingPluginChain) { cancellationTokenSource = new CancellationTokenSource(); Task.Run(() => { RunProcessingPluginChain(processingPluginChain, cancellationTokenSource.Token); }); }
private void RunProcessingPluginChain(IProcessingPluginChain processingPluginChain, CancellationToken cancellationToken) { foreach (var inputDevice in processingPluginChain.InputDevices) { inputDevice.Plugin.Run(inputDevice.Context); } foreach (var effect in processingPluginChain.EffectPluginChain.Effects) { ((EffectPluginContext)effect.Context).FixInitialPointsCollection(); } var processingStopwatch = new Stopwatch(); processingStopwatch.Start(); var throttleMilliseconds = 100; long timeOfLastUpdateMilliseconds = 0; while (!cancellationToken.IsCancellationRequested) { PointsCollection effectChange = null; var chainedOutputContexts = new List <Tuple <IPluginDependency, IPluginContext> >(); foreach (var effect in processingPluginChain.EffectPluginChain.Effects) { var context = (EffectPluginContext)effect.Context; context.ResetToInitialPointsCollection(); foreach (var chainedOutputContext in chainedOutputContexts.Where(coc => coc.Item1.DependentPlugin == effect.Plugin)) { var output = chainedOutputContext.Item2.GetOutput(chainedOutputContext.Item1.SourcePluginOutputName); effect.Context.SetInput(chainedOutputContext.Item1.DependentPluginInputName, output); } if (effectChange != null) { context.PointsCollection = effectChange; } context.ElapsedMilliseconds = processingStopwatch.ElapsedMilliseconds; effect.Plugin.Run(context); foreach (var chainedOutput in processingPluginChain.PluginDependencies.Where(pd => pd.DependentPlugin == effect.Plugin)) { chainedOutputContexts.Add(new Tuple <IPluginDependency, IPluginContext>(chainedOutput, context)); } effectChange = context.PointsCollection; } effectChange.CompletePointOperations(); foreach (var outputDevice in processingPluginChain.OutputDevices) { var context = (OutputDevicePluginContext)outputDevice.Context; context.SetPointsCollection(effectChange); outputDevice.Plugin.Run(context); } while (processingStopwatch.ElapsedMilliseconds < timeOfLastUpdateMilliseconds + throttleMilliseconds) { continue; } timeOfLastUpdateMilliseconds = processingStopwatch.ElapsedMilliseconds; } }