コード例 #1
0
        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));
        }
コード例 #2
0
        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;
            }
        }
コード例 #3
0
 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]);
     }
 }
コード例 #4
0
                #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);
                        }
                    }
            }
        }
コード例 #5
0
ファイル: PlayerNode.cs プロジェクト: m4d-vvvv/vvvv-sdk
        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;
            }
        }
コード例 #6
0
                #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;
                }
            }
        }
コード例 #7
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;
            }
        }
コード例 #8
0
ファイル: VSTHostNode.cs プロジェクト: nnikos123/VVVV.Audio
 /// <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));
 }
コード例 #9
0
 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);
                     }
                 }
             }
         }
     }
 }