public virtual void Evaluate(int SpreadMax) { var addresses = CreateAddresses(); // in proper spread order SpreadMax = FProtocol.CombineWith(FAddress).CombineWith(FPort); int i = 0; foreach (var address in addresses) { var enabled = WorkingSockets.Contains(address); var enable = FEnable[i]; var switchOn = false; if (enabled != enable) { // bind or connect switchOn = enabled = EnableSocket(enable, Sockets[address], address) && enable; } if (FOptions.IsChanged || switchOn) { var socket = Sockets[address]; var options = FOptions.SliceCount == 0 ? null : FOptions[i]; if (options != null) { options.CopyTo(socket); } // else Options.Default().CopyTo(socket); // TODO: Enable this do reset options on link disconnect } i++; } // null all non-working sockets now. var partiallyNulled = from socket in Sockets select WorkingSockets.Contains(socket.Key) ? socket.Value : null; FOutput.AssignFrom(partiallyNulled); var valid = from socket in Sockets select WorkingSockets.Contains(socket.Key); FValid.AssignFrom(valid.DefaultIfEmpty(false)); }
public void Evaluate(int spreadMax) { if (!SpreadUtils.AnyChanged(Name, Value, Childs, Attributes)) { return; } spreadMax = Name .CombineWith(Value) .CombineWith(Childs) .CombineWith(Attributes); Element.SliceCount = spreadMax; for (int i = 0; i < spreadMax; i++) { var element = new XElement(Name[i], Value[i]); // clone attributes on the fly if they are already rooted somewhere var attributes = Attributes[i] .Where(a => a != null) .Select(a => a.Parent != null ? new XAttribute(a) : a) .ToArray(); element.Add(attributes); // clone elements on the fly if they are already rooted somewhere var children = Childs[i] .Where(c => c != null) .Select(c => c.Parent != null ? new XElement(c) : c) .ToArray(); element.Add(children); Element[i] = element; } }
public void Evaluate(int spreadMax) { if (!FKeyIn.IsChanged && !FCapsIn.IsChanged && !FTimeIn.IsChanged) { return; } FOutput.SliceCount = FKeyIn.CombineWith(FTimeIn); for (int i = 0; i < FOutput.SliceCount; i++) { FOutput[i] = KeyboardStateNodes.Join(FKeyIn[i], FCapsIn[0], FTimeIn[i]); } }
#pragma warning restore #endregion fields & pins //called when data for any output pin is requested public void Evaluate(int SpreadMax) { FInput.Sync(); FBin.Sync(); if (FInput.IsChanged || FBin.IsChanged || FTogPhase.IsChanged || FPhase.IsChanged) { VecBinSpread <T> spread = new VecBinSpread <T>(FInput, 1, FBin, FPhase.CombineWith(FTogPhase)); FOutBin.Length = spread.Count; FOutput.Length = spread.ItemCount; using (var binWriter = FOutBin.GetWriter()) using (var dataWriter = FOutput.GetWriter()) { for (int b = 0; b < spread.Count; b++) { int phase = 0; if (FTogPhase[b]) { phase = (int)FPhase[b]; } else { phase = (int)Math.Round(FPhase[b] * spread[b].Length); } T[] src = spread[b]; phase = VMath.Zmod(phase, src.Length); if (phase != 0) { T[] dst = new T[src.Length]; Array.Copy(src, 0, dst, phase, src.Length - phase); Array.Copy(src, src.Length - phase, dst, 0, phase); dataWriter.Write(dst, 0, dst.Length); } else { dataWriter.Write(src, 0, src.Length); } binWriter.Write(spread[b].Length); } } } }
public void Evaluate(int spreadMax) { // SpreadMax is not correct (should be correct in streams branch). spreadMax = FDirectoryIn .CombineWith(FFilemaskIn) .CombineWith(FBufferSizeIn) .CombineWith(FVisibleFramesIn) .CombineWith(FPreloadFramesIn) .CombineWith(FReloadIn); FImagePlayers.Resize(spreadMax, CreateImagePlayer, DestroyImagePlayer); FImagePlayers.SliceCount = spreadMax; FTextureOut.SliceCount = spreadMax; FTextureWidthOut.SliceCount = spreadMax; FTextureHeightOut.SliceCount = spreadMax; FFrameCountOut.SliceCount = spreadMax; FDurationIOOut.SliceCount = spreadMax; FDurationTextureOut.SliceCount = spreadMax; FUnusedFramesOut.SliceCount = spreadMax; FLoadedOut.SliceCount = spreadMax; for (int i = 0; i < spreadMax; i++) { bool reload = FReloadIn[i] || FDirectoryIn.IsChanged || FFilemaskIn.IsChanged; var imagePlayer = FImagePlayers[i]; if (imagePlayer.ThreadsIO != FThreadsIOConfig[i] || imagePlayer.ThreadsTexture != FThreadsTextureConfig[i]) { DestroyImagePlayer(imagePlayer); imagePlayer = CreateImagePlayer(i); reload = true; FImagePlayers[i] = imagePlayer; } imagePlayer.Directories = FDirectoryIn[i]; imagePlayer.Filemasks = FFilemaskIn[i]; if (reload) { imagePlayer.Reload(); FMemoryPool.Clear(); } int frameCount = 0; double durationIO = 0.0; double durationTexture = 0.0; int unusedFrames = 0; var loadedFrames = FLoadedOut[i]; var frame = imagePlayer.Preload( FVisibleFramesIn[i], FPreloadFramesIn[i], FBufferSizeIn[i], out frameCount, out durationIO, out durationTexture, out unusedFrames, ref loadedFrames); FTextureOut[i] = frame; FTextureWidthOut[i] = frame.Select(f => f.Metadata.Width).ToSpread(); FTextureHeightOut[i] = frame.Select(f => f.Metadata.Height).ToSpread(); FFrameCountOut[i] = frameCount; FDurationIOOut[i] = durationIO; FDurationTextureOut[i] = durationTexture; FUnusedFramesOut[i] = unusedFrames; } }
#pragma warning restore #endregion fields & pins //called when data for any output pin is requested public void Evaluate(int SpreadMax) { FInput.Sync(); FVec.Sync(); FBin.Sync(); if (FInput.IsChanged || FVec.IsChanged || FBin.IsChanged || FTogPhase.IsChanged || FPhase.IsChanged) { if (FInput.Length > 0 && FVec.Length > 0 && FBin.Length > 0 && FTogPhase.SliceCount > 0 && FPhase.SliceCount > 0) { int vecSize = Math.Max(1, FVec.GetReader().Read()); VecBinSpread <double> spread = new VecBinSpread <double>(FInput, vecSize, FBin, FPhase.CombineWith(FTogPhase)); FOutBin.Length = spread.Count; FOutput.Length = spread.ItemCount; using (var binWriter = FOutBin.GetWriter()) using (var dataWriter = FOutput.GetWriter()) { int incr = 0; for (int b = 0; b < spread.Count; b++) { int phase = 0; if (FTogPhase[b]) { phase = (int)FPhase[b]; } else { phase = (int)Math.Round(FPhase[b] * (spread[b].Length / vecSize)); } if (spread[b].Length > 0) { for (int v = 0; v < vecSize; v++) { dataWriter.Position = incr + v; double[] src = spread.GetBinColumn(b, v).ToArray(); phase = VMath.Zmod(phase, src.Length); if (phase != 0) { double[] dst = new double[src.Length]; Array.Copy(src, 0, dst, phase, src.Length - phase); Array.Copy(src, src.Length - phase, dst, 0, phase); for (int s = 0; s < dst.Length; s++) { dataWriter.Write(dst[s], vecSize); } } else { for (int s = 0; s < src.Length; s++) { dataWriter.Write(src[s], vecSize); } } } incr += spread[b].Length; } binWriter.Write((spread[b].Length / vecSize), 1); } } } else { FOutput.Length = FOutBin.Length = 0; } } }
public void Evaluate(int spreadMax) { // SpreadMax is not correct (should be correct in streams branch). spreadMax = FDirectoryIn .CombineWith(FFilemaskIn) .CombineWith(FBufferSizeIn) .CombineWith(FFormatIn) .CombineWith(FVisibleFramesIn) .CombineWith(FPreloadFramesIn) .CombineWith(FReloadIn); FImagePlayers.Resize(spreadMax, CreateImagePlayer, DestroyImagePlayer); FImagePlayers.SliceCount = spreadMax; FTextureOut.SliceCount = spreadMax; FTextureWidthOut.SliceCount = spreadMax; FTextureHeightOut.SliceCount = spreadMax; FFrameCountOut.SliceCount = spreadMax; FDurationIOOut.SliceCount = spreadMax; FDurationTextureOut.SliceCount = spreadMax; FUnusedFramesOut.SliceCount = spreadMax; FLoadedOut.SliceCount = spreadMax; // Release unused resources // Textures are accessed by render thread only // -> if a texture is in the pool it's really not in use // -> release all FTexturePool.ReleaseUnused(0); // Memory is accessed by multiple threads // -> if memory is in the pool it could be used by one of them in just a moment // -> keep a little of it to avoid too many reallocations FMemoryPool.ReleaseUnused(Environment.ProcessorCount); for (int i = 0; i < spreadMax; i++) { var imagePlayer = FImagePlayers[i]; var reload = FReloadIn[i]; if (imagePlayer.ThreadsIO != FThreadsIOConfig[i] || imagePlayer.ThreadsTexture != FThreadsTextureConfig[i]) { DestroyImagePlayer(imagePlayer); imagePlayer = CreateImagePlayer(i); reload = true; FImagePlayers[i] = imagePlayer; } var rescan = false; // Make copies to check for slice wise change if (!imagePlayer.Directories.SpreadEqual(FDirectoryIn[i])) { imagePlayer.Directories = FDirectoryIn[i].ToSpread(); rescan = true; } if (!imagePlayer.Filemasks.SpreadEqual(FFilemaskIn[i])) { imagePlayer.Filemasks = FFilemaskIn[i].ToSpread(); rescan = true; } if (reload) { imagePlayer.Reload(); } else if (rescan) { imagePlayer.ScanDirectoriesAsync(); } int frameCount = 0; double durationIO = 0.0; double durationTexture = 0.0; int unusedFrames = 0; var loadedFrames = FLoadedOut[i]; var format = EnumEntryToEx9Format(FFormatIn[i]); var frame = imagePlayer.Preload( FVisibleFramesIn[i], FPreloadFramesIn[i], FBufferSizeIn[i], format, out frameCount, out durationIO, out durationTexture, out unusedFrames, ref loadedFrames); FTextureOut[i] = frame; FTextureWidthOut[i] = frame.Select(f => f.Metadata.Width).ToSpread(); FTextureHeightOut[i] = frame.Select(f => f.Metadata.Height).ToSpread(); FFrameCountOut[i] = frameCount; FDurationIOOut[i] = durationIO; FDurationTextureOut[i] = durationTexture; FUnusedFramesOut[i] = unusedFrames; } }
/// <summary> /// Override this in subclass if you want to set the number of output signals manually /// </summary> /// <param name="originalSpreadMax"></param> /// <returns></returns> protected virtual int GetSpreadMax(int originalSpreadMax) { return(FInputSignals.CombineWith(FFilename)); }
private void InputPinChanged(object _) { if (HandleIn != null && FEnabledIn != null && ModeIn != null) { int spreadMax = HandleIn.CombineWith(FEnabledIn).CombineWith(ModeIn); if (spreadMax > 0) { if (HandleIn.Any(i => i < 0)) //handle any window { if (FEnabledIn[0]) { foreach (var s in FWMService.Subclasses) { if (TryRegisterTouch(s, ModeIn[0])) { TouchEnabledWindows.Add(s); } } } else { var disabled = new List <Subclass>(); foreach (var s in TouchEnabledWindows) { if (TryUnregisterTouch(s)) { disabled.Add(s); } } foreach (var s in disabled) { TouchEnabledWindows.Remove(s); } } } else { var former = new HashSet <Subclass>(TouchEnabledWindows); TouchEnabledWindows.Clear(); for (int i = 0; i < spreadMax; i++) { var selected = FWMService.Subclasses.Where(s => s.HWnd.ToInt32() == HandleIn[i]).FirstOrDefault(); if (selected != null) { if (FEnabledIn[i]) { if (TryRegisterTouch(selected, ModeIn[i])) { TouchEnabledWindows.Add(selected); former.Remove(selected); } } } } foreach (var s in former) { if (!TryUnregisterTouch(s)) { TouchEnabledWindows.Add(s); } } } } } }