diff --git a/Cavern.QuickEQ.Format/ConfigurationFile/CavernFilterStudioConfigurationFile.cs b/Cavern.QuickEQ.Format/ConfigurationFile/CavernFilterStudioConfigurationFile.cs index 3a80ab4..933c72f 100644 --- a/Cavern.QuickEQ.Format/ConfigurationFile/CavernFilterStudioConfigurationFile.cs +++ b/Cavern.QuickEQ.Format/ConfigurationFile/CavernFilterStudioConfigurationFile.cs @@ -7,6 +7,7 @@ using Cavern.Channels; using Cavern.Filters; using Cavern.Filters.Utilities; +using Cavern.Format.ConfigurationFile.Helpers; using Cavern.QuickEQ.Equalization; namespace Cavern.Format.ConfigurationFile { @@ -25,7 +26,7 @@ public CavernFilterStudioConfigurationFile(ConfigurationFile other) : base(other /// /// Import a Cavern Filter Studio configuration file from a . /// - public CavernFilterStudioConfigurationFile(string path) : base(ParseSplitPoints(path)) { } + public CavernFilterStudioConfigurationFile(string path) : base(ParseSplitPoints(path)) => FinishLazySetup(131072); /// /// Create an empty file for a standard layout. @@ -104,7 +105,7 @@ public CavernFilterStudioConfigurationFile(string name, params ReferenceChannel[ static Filter ParseFilter(XmlReader reader) { switch (reader.Name) { case nameof(GraphicEQ): - GraphicEQ graphicEQ = new GraphicEQ(new Equalizer(), Listener.DefaultSampleRate); + LazyGraphicEQ graphicEQ = new LazyGraphicEQ(new Equalizer(), Listener.DefaultSampleRate); graphicEQ.ReadXml(reader); return graphicEQ; case nameof(InputChannel): @@ -117,7 +118,7 @@ static Filter ParseFilter(XmlReader reader) { return outputChannel; default: return Filter.FromXml(reader); - }; + } } /// @@ -137,7 +138,7 @@ public override void Export(string path) { (FilterGraphNode node, int channel)[] exportOrder = GetExportOrder(); ValidateForExport(exportOrder); - XmlWriterSettings settings = new XmlWriterSettings() { + XmlWriterSettings settings = new XmlWriterSettings { Indent = true }; using XmlWriter writer = XmlWriter.Create(path, settings); @@ -162,7 +163,7 @@ public override void Export(string path) { return j; } } - throw new IndexOutOfRangeException(); + throw new DataMisalignedException(); }))); writer.WriteEndElement(); } diff --git a/Cavern.QuickEQ.Format/ConfigurationFile/Helpers/LazyGraphicEQ.cs b/Cavern.QuickEQ.Format/ConfigurationFile/Helpers/LazyGraphicEQ.cs index 7120e40..4df42d9 100644 --- a/Cavern.QuickEQ.Format/ConfigurationFile/Helpers/LazyGraphicEQ.cs +++ b/Cavern.QuickEQ.Format/ConfigurationFile/Helpers/LazyGraphicEQ.cs @@ -1,4 +1,8 @@ -using Cavern.Filters; +using System.Xml; +using System.Xml.Schema; +using System.Xml.Serialization; + +using Cavern.Filters; using Cavern.QuickEQ.Equalization; using Cavern.Utilities; @@ -6,16 +10,16 @@ namespace Cavern.Format.ConfigurationFile.Helpers { /// /// Placeholder where a should be created. /// - public sealed class LazyGraphicEQ : Filter, ILazyLoadableFilter { + public sealed class LazyGraphicEQ : Filter, ILazyLoadableFilter, IXmlSerializable { /// /// Desired frequency response change. /// - readonly Equalizer equalizer; + Equalizer equalizer; /// /// Sample rate at which this EQ is converted to a minimum-phase FIR filter. /// - readonly int sampleRate; + int sampleRate; /// /// Placeholder where a should be created. @@ -38,5 +42,30 @@ public Filter CreateFilter(FFTCachePool cachePool) { /// public override object Clone() => new LazyGraphicEQ(equalizer, sampleRate); + + /// + public XmlSchema GetSchema() => null; + + /// + public void ReadXml(XmlReader reader) { + while (reader.MoveToNextAttribute()) { + switch (reader.Name) { + case nameof(GraphicEQ.SampleRate): + sampleRate = int.Parse(reader.Value); + break; + case nameof(GraphicEQ.Equalizer): + equalizer = EQGenerator.FromEqualizerAPO(reader.Value); + break; + } + } + } + + /// + public void WriteXml(XmlWriter writer) { + writer.WriteStartElement(nameof(GraphicEQ)); + writer.WriteAttributeString(nameof(GraphicEQ.SampleRate), sampleRate.ToString()); + writer.WriteAttributeString(nameof(GraphicEQ.Equalizer), equalizer.ExportToEqualizerAPO()); + writer.WriteEndElement(); + } } } \ No newline at end of file