diff --git a/CUERipper/CUERipper.csproj b/CUERipper/CUERipper.csproj
index 3c51530..b4fec35 100644
--- a/CUERipper/CUERipper.csproj
+++ b/CUERipper/CUERipper.csproj
@@ -79,6 +79,7 @@
+
Form
diff --git a/CUERipper/CUERipperConfig.cs b/CUERipper/CUERipperConfig.cs
new file mode 100644
index 0000000..2987c45
--- /dev/null
+++ b/CUERipper/CUERipperConfig.cs
@@ -0,0 +1,103 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Text;
+using System.Xml.Serialization;
+
+namespace CUERipper
+{
+ [XmlRoot("dictionary")]
+ public class SerializableDictionary
+ : Dictionary, IXmlSerializable
+ {
+ #region IXmlSerializable Members
+ public System.Xml.Schema.XmlSchema GetSchema()
+ {
+ return null;
+ }
+
+ public void ReadXml(System.Xml.XmlReader reader)
+ {
+ XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
+ XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
+
+ bool wasEmpty = reader.IsEmptyElement;
+ reader.Read();
+
+ if (wasEmpty)
+ return;
+
+ while (reader.NodeType != System.Xml.XmlNodeType.EndElement)
+ {
+ reader.ReadStartElement("item");
+
+ reader.ReadStartElement("key");
+ TKey key = (TKey)keySerializer.Deserialize(reader);
+ reader.ReadEndElement();
+
+ reader.ReadStartElement("value");
+ TValue value = (TValue)valueSerializer.Deserialize(reader);
+ reader.ReadEndElement();
+
+ this.Add(key, value);
+
+ reader.ReadEndElement();
+ reader.MoveToContent();
+ }
+ reader.ReadEndElement();
+ }
+
+ public void WriteXml(System.Xml.XmlWriter writer)
+ {
+ XmlSerializer keySerializer = new XmlSerializer(typeof(TKey));
+ XmlSerializer valueSerializer = new XmlSerializer(typeof(TValue));
+
+ foreach (TKey key in this.Keys)
+ {
+ writer.WriteStartElement("item");
+
+ writer.WriteStartElement("key");
+ keySerializer.Serialize(writer, key);
+ writer.WriteEndElement();
+
+ writer.WriteStartElement("value");
+ TValue value = this[key];
+ valueSerializer.Serialize(writer, value);
+ writer.WriteEndElement();
+
+ writer.WriteEndElement();
+ }
+ }
+ #endregion
+ }
+
+ [Serializable]
+ public class CUERipperConfig
+ {
+ public CUERipperConfig()
+ {
+ // Iterate through each property and call ResetValue()
+ foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(this))
+ {
+ property.ResetValue(this);
+ }
+
+ this.DriveOffsets = new SerializableDictionary();
+ }
+
+ internal static XmlSerializer serializer = new XmlSerializer(typeof(CUERipperConfig));
+
+ [DefaultValue("flac")]
+ public string DefaultLosslessFormat { get; set; }
+
+ [DefaultValue("mp3")]
+ public string DefaultLossyFormat { get; set; }
+
+ [DefaultValue("lossy.flac")]
+ public string DefaultHybridFormat { get; set; }
+
+ public string DefaultDrive { get; set; }
+
+ public SerializableDictionary DriveOffsets { get; set; }
+ }
+}
diff --git a/CUERipper/frmCUERipper.Designer.cs b/CUERipper/frmCUERipper.Designer.cs
index 4785dd6..bdd1853 100644
--- a/CUERipper/frmCUERipper.Designer.cs
+++ b/CUERipper/frmCUERipper.Designer.cs
@@ -274,6 +274,7 @@ namespace CUERipper
0,
-2147483648});
this.numericWriteOffset.Name = "numericWriteOffset";
+ this.numericWriteOffset.ValueChanged += new System.EventHandler(this.numericWriteOffset_ValueChanged);
//
// lblWriteOffset
//
diff --git a/CUERipper/frmCUERipper.cs b/CUERipper/frmCUERipper.cs
index 194772e..604d66a 100644
--- a/CUERipper/frmCUERipper.cs
+++ b/CUERipper/frmCUERipper.cs
@@ -15,6 +15,8 @@ using CUETools.Processor.Settings;
using CUETools.Ripper;
using Freedb;
using CUETools.Codecs;
+using System.Xml;
+using System.Xml.Serialization;
namespace CUERipper
{
@@ -23,21 +25,23 @@ namespace CUERipper
private Thread _workThread = null;
private StartStop _startStop;
private CUEConfig _config;
+ private CUERipperConfig cueRipperConfig;
private CUESheet cueSheet;
private DriveInfo selectedDriveInfo;
private string _pathOut;
- string _defaultLosslessFormat, _defaultLossyFormat, _defaultHybridFormat;
private CUEControls.ShellIconMgr m_icon_mgr;
- private string defaultDrive;
private bool testAndCopy = false;
internal CUERipperData data = new CUERipperData();
+ public readonly static XmlSerializerNamespaces xmlEmptyNamespaces = new XmlSerializerNamespaces(new XmlQualifiedName[] { XmlQualifiedName.Empty });
+ public readonly static XmlWriterSettings xmlEmptySettings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true };
public frmCUERipper()
{
InitializeComponent();
_config = new CUEConfig();
_startStop = new StartStop();
- m_icon_mgr = new CUEControls.ShellIconMgr();
+ cueRipperConfig = new CUERipperConfig();
+ m_icon_mgr = new CUEControls.ShellIconMgr();
m_icon_mgr.SetExtensionIcon(".flac", Properties.Resources.flac);
m_icon_mgr.SetExtensionIcon(".wv", Properties.Resources.wv);
m_icon_mgr.SetExtensionIcon(".ape", Properties.Resources.ape);
@@ -141,9 +145,6 @@ namespace CUERipper
SettingsReader sr = new SettingsReader("CUERipper", "settings.txt", Application.ExecutablePath);
_config.Load(sr);
- _defaultLosslessFormat = sr.Load("DefaultLosslessFormat") ?? "flac";
- _defaultLossyFormat = sr.Load("DefaultLossyFormat") ?? "mp3";
- _defaultHybridFormat = sr.Load("DefaultHybridFormat") ?? "lossy.flac";
//_config.createEACLOG = sr.LoadBoolean("CreateEACLOG") ?? true;
//_config.preserveHTOA = sr.LoadBoolean("PreserveHTOA") ?? false;
//_config.createM3U = sr.LoadBoolean("CreateM3U") ?? true;
@@ -151,7 +152,19 @@ namespace CUERipper
bindingSourceCR.DataSource = data;
bnComboBoxDrives.ImageList = m_icon_mgr.ImageList;
bnComboBoxFormat.ImageList = m_icon_mgr.ImageList;
- SetupControls();
+
+ try
+ {
+ using (TextReader reader = new StringReader(sr.Load("CUERipper")))
+ cueRipperConfig = CUERipperConfig.serializer.Deserialize(reader) as CUERipperConfig;
+ }
+ catch (Exception ex)
+ {
+ System.Diagnostics.Trace.WriteLine(ex.Message);
+ }
+
+
+ SetupControls();
int iFormat, nFormats = sr.LoadInt32("OutputPathUseTemplates", 0, 10) ?? 0;
for (iFormat = 0; iFormat < OutputPathUseTemplates.Length; iFormat++)
@@ -164,7 +177,6 @@ namespace CUERipper
bnComboBoxImage.SelectedIndex = sr.LoadInt32("ComboImage", 0, bnComboBoxImage.Items.Count - 1) ?? 0;
trackBarSecureMode.Value = sr.LoadInt32("SecureMode", 0, trackBarSecureMode.Maximum - 1) ?? 1;
trackBarSecureMode_Scroll(this, new EventArgs());
- defaultDrive = sr.Load("DefaultDrive");
this.checkBoxTestAndCopy.Checked = this.testAndCopy = sr.LoadBoolean("TestAndCopy") ?? this.testAndCopy;
Size SizeIncrement = new Size(sr.LoadInt32("WidthIncrement", 0, null) ?? 0, sr.LoadInt32("HeightIncrement", 0, null) ?? 0);
@@ -228,8 +240,10 @@ namespace CUERipper
reader.Close();
if (reader.ARName != null)
{
- int driveOffset;
- if (AccurateRipVerify.FindDriveReadOffset(reader.ARName, out driveOffset))
+ int driveOffset;
+ if (cueRipperConfig.DriveOffsets.ContainsKey(reader.ARName))
+ reader.DriveOffset = cueRipperConfig.DriveOffsets[reader.ARName];
+ else if (AccurateRipVerify.FindDriveReadOffset(reader.ARName, out driveOffset))
reader.DriveOffset = driveOffset;
else
reader.DriveOffset = 0;
@@ -241,7 +255,7 @@ namespace CUERipper
data.Drives.RaiseListChangedEvents = true;
data.Drives.ResetBindings();
for(int i = 0; i < bnComboBoxDrives.Items.Count; i++)
- if ((bnComboBoxDrives.Items[i] as DriveInfo).Path == defaultDrive)
+ if ((bnComboBoxDrives.Items[i] as DriveInfo).Path == cueRipperConfig.DefaultDrive)
bnComboBoxDrives.SelectedIndex = i;
_workThread = null;
SetupControls();
@@ -824,7 +838,7 @@ namespace CUERipper
selectedDriveInfo.drive.Close();
selectedDriveInfo = bnComboBoxDrives.SelectedItem as DriveInfo;
- defaultDrive = selectedDriveInfo.Path;
+ cueRipperConfig.DefaultDrive = selectedDriveInfo.Path;
toolStripStatusAr.Enabled = false;
toolStripStatusAr.Text = "";
@@ -851,7 +865,8 @@ namespace CUERipper
cueSheet.Close();
cueSheet = null;
}
- numericWriteOffset.Value = selectedDriveInfo.drive.DriveOffset;
+
+ numericWriteOffset.Value = selectedDriveInfo.drive.DriveOffset;
try
{
selectedDriveInfo.drive.Open(selectedDriveInfo.drive.Path[0]);
@@ -907,9 +922,6 @@ namespace CUERipper
{
SettingsWriter sw = new SettingsWriter("CUERipper", "settings.txt", Application.ExecutablePath);
_config.Save(sw);
- sw.Save("DefaultLosslessFormat", _defaultLosslessFormat);
- sw.Save("DefaultLossyFormat", _defaultLossyFormat);
- sw.Save("DefaultHybridFormat", _defaultHybridFormat);
//sw.Save("CreateEACLOG", _config.createEACLOG);
//sw.Save("PreserveHTOA", _config.preserveHTOA);
//sw.Save("CreateM3U", _config.createM3U);
@@ -925,8 +937,13 @@ namespace CUERipper
for (int iFormat = bnComboBoxOutputFormat.Items.Count - 1; iFormat >= OutputPathUseTemplates.Length; iFormat--)
sw.Save(string.Format("OutputPathUseTemplate{0}", iFormat - OutputPathUseTemplates.Length), bnComboBoxOutputFormat.Items[iFormat].ToString());
- if (defaultDrive != null)
- sw.Save("DefaultDrive", defaultDrive);
+ using (TextWriter tw = new StringWriter())
+ using (XmlWriter xw = XmlTextWriter.Create(tw, xmlEmptySettings))
+ {
+ CUERipperConfig.serializer.Serialize(xw, cueRipperConfig, xmlEmptyNamespaces);
+ sw.SaveText("CUERipper", tw.ToString());
+ }
+
sw.Close();
}
@@ -1084,13 +1101,13 @@ namespace CUERipper
switch (SelectedOutputAudioType)
{
case AudioEncoderType.Lossless:
- _defaultLosslessFormat = SelectedOutputAudioFormat;
+ cueRipperConfig.DefaultLosslessFormat = SelectedOutputAudioFormat;
break;
case AudioEncoderType.Lossy:
- _defaultLossyFormat = SelectedOutputAudioFormat;
+ cueRipperConfig.DefaultLossyFormat = SelectedOutputAudioFormat;
break;
case AudioEncoderType.Hybrid:
- _defaultHybridFormat = SelectedOutputAudioFormat;
+ cueRipperConfig.DefaultHybridFormat = SelectedOutputAudioFormat;
break;
}
@@ -1150,13 +1167,13 @@ namespace CUERipper
switch (SelectedOutputAudioType)
{
case AudioEncoderType.Lossless:
- select = _defaultLosslessFormat;
+ select = cueRipperConfig.DefaultLosslessFormat;
break;
case AudioEncoderType.Lossy:
- select = _defaultLossyFormat;
+ select = cueRipperConfig.DefaultLossyFormat;
break;
case AudioEncoderType.Hybrid:
- select = _defaultHybridFormat;
+ select = cueRipperConfig.DefaultHybridFormat;
break;
}
data.Formats.RaiseListChangedEvents = true;
@@ -1563,6 +1580,14 @@ namespace CUERipper
ResizeList(listTracks, Title);
ResizeList(listMetadata, columnHeaderValue);
}
+
+ private void numericWriteOffset_ValueChanged(object sender, EventArgs e)
+ {
+ if (selectedDriveInfo != null && selectedDriveInfo.drive.ARName != null)
+ {
+ cueRipperConfig.DriveOffsets[selectedDriveInfo.drive.ARName] = (int)numericWriteOffset.Value;
+ }
+ }
}
internal class BackgroundWorkerArtworkArgs
diff --git a/CUERipper/frmCUERipper.resx b/CUERipper/frmCUERipper.resx
index f896baf..db2af26 100644
--- a/CUERipper/frmCUERipper.resx
+++ b/CUERipper/frmCUERipper.resx
@@ -789,7 +789,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABy
- CQAAAk1TRnQBSQFMAgEBBAEAAdQBAQHUAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+ CQAAAk1TRnQBSQFMAgEBBAEAAdwBAQHcAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA
@@ -939,7 +939,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj0yLjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAY
- EgAAAk1TRnQBSQFMAgEBCwEAAdQBAQHUAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
+ EgAAAk1TRnQBSQFMAgEBCwEAAdwBAQHcAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAATADAAEBAQABCAYAAQwYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA