Пример #1
0
        public Stream ToOSC()
        {
            OSCBundle bundle = new OSCBundle(this.TimeStamp.ToFileTime());

            foreach (string name in MessageData.Keys)
            {
                string oscAddress = "";

                foreach (string part in Address.Split('.'))
                {
                    if (part.Trim() != "")
                    {
                        oscAddress += "/" + part;
                    }
                }

                foreach (string part in name.Split('.'))
                {
                    if (part.Trim() != "")
                    {
                        oscAddress += "/" + part;
                    }
                }

                OSCMessage m  = new OSCMessage(oscAddress);
                SpreadList bl = MessageData[name];
                for (int i = 0; i < bl.Count; i++)
                {
                    m.Append(bl[i]);
                }
                bundle.Append(m);
            }
            return(new MemoryStream(bundle.BinaryData));            // packs implicitly
        }
Пример #2
0
        public XElement ToXElement()
        {
            XElement xml = new XElement("Message");

            xml.Add(new XAttribute("address", this.Address));

            foreach (var key in MessageData.Keys)
            {
                SpreadList data = MessageData[key];

                var spread = new XElement("Spread");

                spread.Add(new XAttribute("name", key));
                spread.Add(new XAttribute("type", TypeIdentity.Instance[data.SpreadType].ToString()));

                for (int i = 0; i < MessageData[key].Count; i++)
                {
                    spread.Add(new XElement(TypeIdentity.Instance[data.SpreadType].ToString(), MessageData[key][i].ToString()));
                }


                xml.Add(spread);
            }

            return(xml);
        }
Пример #3
0
        public object Clone()
        {
            Message m = new Message();

            m.Address   = Address;
            m.TimeStamp = TimeStamp;

            foreach (string name in MessageData.Keys)
            {
                SpreadList list = MessageData[name];
                m.Add(name, list.Clone());

                // really deep cloning
                try {
                    for (int i = 0; i < list.Count; i++)
                    {
                        list[i] = ((ICloneable)list[i]).Clone();
                    }
                } catch (Exception err) {
                    err.ToString();                     // no warning
                    // not cloneble. so keep it
                }
            }

            return(m);
        }
Пример #4
0
        #pragma warning restore

        public void Evaluate(int SpreadMax)
        {
            SpreadMax = FInput.SliceCount;

            if (FInput.SliceCount == 0 || FInput[0] == null)
            {
                FOutput.SliceCount = 0;
                return;
            }

            FOutput.SliceCount = SpreadMax;


            for (int i = 0; i < SpreadMax; i++)
            {
                Message message = FInput[i];

                if (Update[i])
                {
                    for (int keyCount = 0; keyCount < FKey.SliceCount; keyCount++)
                    {
                        SpreadList attr = message[FKey[keyCount]];
                        if (attr != null)
                        {
                            var typeOld = attr[0].GetType();
                            var typeNew = FValue[keyCount][0].GetType();
                            if (!(typeOld == typeNew))
                            {
                                attr.Clear();
                                for (int j = 0; j < FValue[i].SliceCount; j++)
                                {
                                    attr.Add(Convert.ChangeType(FValue[keyCount][j], typeOld));
                                }
                            }
                            else
                            {
                                attr.Clear();
                                attr.AssignFrom(FValue[i]);
                            }
                        }
                    }
                }
                FOutput[i] = message;
            }

            FOutput.Flush();
        }
Пример #5
0
        public static Message FromOSC(Stream stream, string messagePrefix = "OSC", int contractAddress = 1)
        {
            MemoryStream ms = new MemoryStream();

            stream.Position = 0;
            stream.CopyTo(ms);
            byte[]    bytes  = ms.ToArray();
            int       start  = 0;
            OSCBundle bundle = OSCBundle.Unpack(bytes, ref start, (int)stream.Length);

            Message message = new Message();

//			yet unsupported:
//			Message.TimeStamp = DateTime.FromFileTime(bundle.getTimeStamp());


            foreach (OSCMessage m in bundle.Values)
            {
                SpreadList sl = new SpreadList();
                sl.AssignFrom(m.Values);                 // does not clone implicitly

                string oldAddress = m.Address;
                while (oldAddress.StartsWith("/"))
                {
                    oldAddress = oldAddress.Substring(1);
                }
                while (oldAddress.EndsWith("/"))
                {
                    oldAddress = oldAddress.Substring(0, oldAddress.Length - 1);
                }

                string[] address = oldAddress.Split('/');

                contractAddress = address.Length > contractAddress ? contractAddress : address.Length - ((messagePrefix.Trim() == "")? 1 : 0);
                string attribName = "";
                for (int i = address.Length - contractAddress; i < address.Length; i++)
                {
                    attribName += ".";
                    attribName += address[i];
                    address[i]  = "";
                }
                attribName = attribName.Substring(1);


                string messageAddress = "";
                foreach (string part in address)
                {
                    if (part.Trim() != "")
                    {
                        messageAddress += "." + part;
                    }
                }
                if (messagePrefix.Trim() == "")
                {
                    message.Address = messageAddress.Substring(1);
                }
                else
                {
                    message.Address = messagePrefix + messageAddress;
                }

                message[attribName] = sl;
            }
            return(message);
        }
Пример #6
0
        public override void Evaluate(int SpreadMax)
        {
            TypeUpdate();

            SpreadMax = (FSelect[0] != SelectEnum.First) ? FInput.SliceCount : 1;

            if (!FInput.IsChanged)
            {
                //				FLogger.Log(LogType.Debug, "skip split");
                return;
            }

            bool empty = (FInput.SliceCount == 0) || (FInput[0] == null);

            if (empty && (FHold[0] == HoldEnum.Off))
            {
                foreach (string name in FPins.Keys)
                {
                    var pin = ToISpread(FPins[name]);
                    pin.SliceCount = 0;
                    pin.Flush();
                }
                FAddress.SliceCount   = 0;
                FTimeStamp.SliceCount = 0;

                FAddress.Flush();
                FTimeStamp.Flush();

                return;
            }

            if (!empty)
            {
                foreach (string pinName in FPins.Keys)
                {
                    if (FSelect[0] == SelectEnum.All)
                    {
                        ToISpread(FPins[pinName]).SliceCount = SpreadMax;
                        FTimeStamp.SliceCount = SpreadMax;
                        FAddress.SliceCount   = SpreadMax;
                    }
                    else
                    {
                        ToISpread(FPins[pinName]).SliceCount = 1;
                        FTimeStamp.SliceCount = 1;
                        FAddress.SliceCount   = 1;
                    }
                }

                for (int i = (FSelect[0] == SelectEnum.Last) ? SpreadMax - 1 : 0; i < SpreadMax; i++)
                {
                    Message message = FInput[i];

                    FAddress[i]   = message.Address;
                    FTimeStamp[i] = message.TimeStamp.ToString();
                    FAddress.Flush();
                    FTimeStamp.Flush();

                    foreach (string name in FPins.Keys)
                    {
                        var bin = (VVVV.PluginInterfaces.V2.NonGeneric.ISpread)ToISpread(FPins[name])[i];

                        SpreadList attrib = message[name];
                        int        count  = 0;

                        if (attrib == null)
                        {
                            if (FVerbose[0])
                            {
                                FLogger.Log(LogType.Debug, "\"" + FTypes[name] + " " + name + "\" is not defined in Message.");
                            }
                        }
                        else
                        {
                            count = attrib.Count;
                        }

                        if ((count > 0) || (FHold[0] != HoldEnum.Pin))
                        {
                            bin.SliceCount = count;
                            for (int j = 0; j < count; j++)
                            {
                                bin[j] = attrib[j];
                            }
                            ToISpread(FPins[name]).Flush();
                        }
                        else
                        {
                            // keep old values in pin. do not flush
                        }
                    }
                }
            }
        }