public void Add(SoundBlockData soundBlockData) { soundBlocks.Add(soundBlockData); }
public void Load(string filename) { XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(filename); Clear(); XmlNodeList xmlSoundBlocks = xmldoc.SelectNodes("descendant::SoundBlocks/SoundBlock"); foreach(XmlNode xmlSB in xmlSoundBlocks) { SoundBlock srSoundBlock; string srClass = "",srName = ""; int srX,srY; foreach(XmlNode xmlAttr in xmlSB.Attributes) { if (xmlAttr.Name.Equals("class")) { srClass = xmlAttr.Value; } if (xmlAttr.Name.Equals("name")) { srName = xmlAttr.Value; } } //HACK TO LOAD pre-v.0.6 files if ((srClass == "H3.Sound.RandomMidiRender") || (srClass == "H3.Sound.MidiInRender") || (srClass == "H3.Sound.MidiFilterRender") || (srClass == "H3.Sound.NullMidiRender")) { string oldClass = srClass; srClass = srClass.Replace("H3.Sound.","H3.Sound.Midi.MidiRender."); Logger.Instance.Log("pre v0.6 class "+oldClass+" converted to "+srClass); } else if (srClass.StartsWith("H3.Sound.") && (!srClass.StartsWith("H3.Sound.Midi.MidiRender.")) && (!srClass.StartsWith("H3.Sound.Wave.SoundRender."))) { string oldClass = srClass; srClass = srClass.Replace("H3.Sound.","H3.Sound.Wave.SoundRender."); Logger.Instance.Log("pre v0.6 class "+oldClass+" converted to "+srClass); } //HACK END srX = int.Parse(xmlSB.SelectSingleNode("descendant::Location/@x").Value); srY = int.Parse(xmlSB.SelectSingleNode("descendant::Location/@y").Value); try { srSoundBlock = (SoundBlock) System.Activator.CreateInstance(null,srClass).Unwrap(); } catch (Exception) { Logger.Instance.Log("ERROR: Unknown class: "+srClass); continue; } srSoundBlock.Name = srName; Type classType = srSoundBlock.GetType(); PropertyInfo[] pInfos = classType.GetProperties( ); XmlNode xmlSettings = xmlSB.SelectSingleNode("Settings"); if (xmlSettings != null) foreach(XmlNode xmlProperty in xmlSettings.ChildNodes) { PropertyInfo foundPInfo = null; foreach(PropertyInfo pInfo in pInfos) { if (pInfo.Name.Equals(xmlProperty.Name)) { foundPInfo = pInfo; //Logger.Instance.Log("Setting: "+pInfo); break; } } if (foundPInfo == null) { Logger.Instance.Log("WARNING: \""+xmlProperty.Name+"\" not found!"); } else { object[] param = new object[1]; Type propertyType = foundPInfo.GetValue(srSoundBlock,new object[0]).GetType(); TypeConverter tc = TypeDescriptor.GetConverter(propertyType); if (tc.CanConvertFrom(typeof(string))) { param[0] = tc.ConvertFromInvariantString(xmlProperty.InnerXml); } else { Logger.Instance.Log("ERROR: can't deserialize \""+xmlProperty.Name+"\""); } MethodInfo method = foundPInfo.GetSetMethod(); if (method != null) method.Invoke(srSoundBlock,param); else Logger.Instance.Log("loading error: can't deserialize property "+xmlProperty.Name); } } SoundBlockData sbData = new SoundBlockData(srSoundBlock,srX,srY); XmlNode xmlSoundInputs = xmlSB.SelectSingleNode("SoundInputs"); if (xmlSoundInputs != null) foreach(XmlNode xmlSoundInput in xmlSoundInputs.ChildNodes) { int id = int.Parse(xmlSoundInput.SelectSingleNode("@id").Value); string val = xmlSoundInput.SelectSingleNode("@name").Value; //Console.WriteLine("SoundInput id: "+id+" name: "+val); sbData.SoundInputs.Insert(id,val); } XmlNode xmlMidiInputs = xmlSB.SelectSingleNode("MidiInputs"); if (xmlMidiInputs != null) foreach(XmlNode xmlMidiInput in xmlMidiInputs.ChildNodes) { int id = int.Parse(xmlMidiInput.SelectSingleNode("@id").Value); string val = xmlMidiInput.SelectSingleNode("@name").Value; //Console.WriteLine("MidiInput id: "+id+" name: "+val); sbData.MidiInputs.Insert(id,val); } Add(sbData); } }
public void SaveScenario() { ScenarioSave scenario = new ScenarioSave(); scenario.resources = new ResourceData[AppManager.Instance.ResourcesManager.Count()]; for (int i = 0; i < scenario.resources.Length; ++i) { ResourceData resourceData = new ResourceData(); resourceData.id = AppManager.Instance.ResourcesManager.Resources[i].Id; scenario.resources[i] = resourceData; } scenario.soundblocks = new SoundBlockData[blocks.Count]; int linkCount = 0; for (int i = 0; i < blocks.Count; i++) { SoundBlockData blockData = new SoundBlockData(); SoundBlock block = blocks[i]; blockData.blockId = block.soundblockId; if (block.source.clip != null) { blockData.clipId = AppManager.Instance.ResourcesManager.GetResource(block.source.clip.name).Id; } else { blockData.clipId = -1; } if (firstBlock == block) { blockData.isFirstBlock = true; } blockData.isLooping = block.source.loop; blockData.position = block.transform.localPosition; if (block.link != null) { linkCount++; } scenario.soundblocks[i] = blockData; } scenario.links = new LinkData[linkCount]; int nextLinkIndex = 0; for (int i = 0; i < blocks.Count; i++) { if (blocks[i].link != null) { LinkData link = new LinkData(); link.fromSoundblock = blocks[i].soundblockId; link.toSoundblock = blocks[i].nextBlock.soundblockId; link.linkType = blocks[i].link.linkType; link.isActive = blocks[i].link.IsActive; scenario.links[nextLinkIndex] = link; nextLinkIndex++; } } scenario.soundBlockNextId = nextID; scenario.resourceNextId = AppManager.Instance.ResourcesManager.nextResourceID; XmlSerializer writer = new XmlSerializer(scenario.GetType()); using (FileStream stream = File.Create("structure")) { writer.Serialize(stream, scenario); stream.Close(); } ZipFile zip = ZipFile.Read(scenarioUrl); zip.RemoveEntry("structure"); zip.AddFile("structure"); zip.Save(scenarioUrl); File.Delete("structure"); Debug.Log("Saved Project " + scenarioUrl); }