Update 6: Better support for different cue sheet encodings, ape output

This commit is contained in:
chudov
2008-10-17 18:21:59 +00:00
parent ab94a4f25e
commit cf87cc9bd2
9 changed files with 476 additions and 244 deletions

View File

@@ -150,24 +150,16 @@ namespace APEDotNet {
sampleCount = nBlocksRetrieved;
array<Int32,2>^ _sampleBuffer = gcnew array<Int32,2> (nBlocksRetrieved, 2);
interior_ptr<Int32> pMyBuffer = &_sampleBuffer[0, 0];
{
interior_ptr<Int32> pMyBuffer = &_sampleBuffer[0, 0];
unsigned short * pAPEBuffer = (unsigned short *) pBuffer;
unsigned short * pAPEBufferEnd = (unsigned short *) pBuffer + 2 * nBlocksRetrieved;
unsigned short * pAPEBuffer = (unsigned short *) pBuffer;
unsigned short * pAPEBufferEnd = (unsigned short *) pBuffer + 2 * nBlocksRetrieved;
while (pAPEBuffer < pAPEBufferEnd) {
*(pMyBuffer++) = *(pAPEBuffer++);
*(pMyBuffer++) = *(pAPEBuffer++);
}
while (pAPEBuffer < pAPEBufferEnd) {
*(pMyBuffer++) = *(pAPEBuffer++);
*(pMyBuffer++) = *(pAPEBuffer++);
}
}
#if 0
for (int i = 0; i < nBlocksRetrieved; i++)
{
_sampleBuffer[i,0] = pBuffer[i*4] + (pBuffer[i*4+1] << 8);
_sampleBuffer[i,1] = pBuffer[i*4+2] + (pBuffer[i*4+3] << 8);
}
#endif
sampleBuffer = _sampleBuffer;
_sampleOffset += nBlocksRetrieved;
_samplesWaiting = false;
@@ -209,4 +201,126 @@ namespace APEDotNet {
#endif
};
public ref class APEWriter {
public:
APEWriter(String^ path, Int32 bitsPerSample, Int32 channelCount, Int32 sampleRate) {
if ((channelCount != 1) && (channelCount != 2)) {
throw gcnew Exception("Only stereo and mono audio formats are allowed.");
}
_path = path;
_tags = gcnew NameValueCollection();
_compressionLevel = COMPRESSION_LEVEL_NORMAL;
_bitsPerSample = bitsPerSample;
_channelCount = channelCount;
_sampleRate = sampleRate;
int nRetVal;
pAPECompress = CreateIAPECompress (&nRetVal);
if (!pAPECompress) {
throw gcnew Exception("Unable to open file.");
}
}
void Close() {
if (pAPECompress)
{
pAPECompress->Finish (NULL, 0, 0);
delete pAPECompress;
pAPECompress = NULL;
}
if ((_finalSampleCount != 0) && (_samplesWritten != _finalSampleCount)) {
throw gcnew Exception("Samples written differs from the expected sample count.");
}
if (_tags->Count > 0)
{
APETagDotNet^ apeTag = gcnew APETagDotNet (_path, true, false);
apeTag->SetStringTags (_tags, true);
apeTag->Save();
apeTag->Close();
_tags->Clear ();
}
}
property Int32 FinalSampleCount {
Int32 get() {
return _finalSampleCount;
}
void set(Int32 value) {
if (value < 0) {
throw gcnew Exception("Invalid final sample count.");
}
if (_initialized) {
throw gcnew Exception("Final sample count cannot be changed after encoding begins.");
}
_finalSampleCount = value;
}
}
property Int32 CompressionLevel {
Int32 get() {
return _compressionLevel;
}
void set(Int32 value) {
if ((value < 1) || (value > 5)) {
throw gcnew Exception("Invalid compression mode.");
}
_compressionLevel = value * 1000;
}
}
void Write(array<unsigned char>^ sampleBuffer, UInt32 sampleCount) {
if (!_initialized) Initialize();
pin_ptr<unsigned char> pSampleBuffer = &sampleBuffer[0];
if (pAPECompress->AddData (pSampleBuffer, sampleCount * sizeof (int)))
{
throw gcnew Exception("An error occurred while encoding.");
}
_samplesWritten += sampleCount;
}
void SetTags (NameValueCollection^ tags) {
_tags = tags;
}
private:
IAPECompress * pAPECompress;
bool _initialized;
Int32 _finalSampleCount, _samplesWritten;
Int32 _bitsPerSample, _channelCount, _sampleRate;
Int32 _compressionLevel;
NameValueCollection^ _tags;
String^ _path;
void Initialize() {
IntPtr pathChars;
int res;
WAVEFORMATEX waveFormat;
pathChars = Marshal::StringToHGlobalUni(_path);
FillWaveFormatEx (&waveFormat, _sampleRate, _bitsPerSample, _channelCount);
res = pAPECompress->Start ((const wchar_t*)pathChars.ToPointer(),
&waveFormat,
(_finalSampleCount == 0) ? MAX_AUDIO_BYTES_UNKNOWN : _finalSampleCount * sizeof (int),
_compressionLevel,
NULL,
CREATE_WAV_HEADER_ON_DECOMPRESSION);
Marshal::FreeHGlobal(pathChars);
if (res)
{
throw gcnew Exception("Unable to create the encoder.");
}
_initialized = true;
}
};
}

View File

@@ -51,6 +51,8 @@ namespace JDP {
dest = new FLACWriter(path, bitsPerSample, channelCount, sampleRate); break;
case ".wv":
dest = new WavPackWriter(path, bitsPerSample, channelCount, sampleRate); break;
case ".ape":
dest = new APEWriter(path, bitsPerSample, channelCount, sampleRate); break;
case ".dummy":
dest = new DummyWriter(path, bitsPerSample, channelCount, sampleRate); break;
default:
@@ -708,6 +710,81 @@ namespace JDP {
}
}
class APEWriter : IAudioDest
{
APEDotNet.APEWriter _apeWriter;
//int[,] _sampleBuffer;
int _bitsPerSample;
int _channelCount;
int _sampleRate;
public APEWriter(string path, int bitsPerSample, int channelCount, int sampleRate)
{
if (bitsPerSample != 16)
{
throw new Exception("Bits per sample must be 16.");
}
_bitsPerSample = bitsPerSample;
_channelCount = channelCount;
_sampleRate = sampleRate;
_apeWriter = new APEDotNet.APEWriter(path, bitsPerSample, channelCount, sampleRate);
}
public long FinalSampleCount
{
get { return _apeWriter.FinalSampleCount; }
set { _apeWriter.FinalSampleCount = (int) value; }
}
public int CompressionLevel
{
get { return _apeWriter.CompressionLevel; }
set { _apeWriter.CompressionLevel = value; }
}
public bool SetTags(NameValueCollection tags)
{
_apeWriter.SetTags(tags);
return true;
}
public void Close()
{
_apeWriter.Close();
}
private unsafe void BytesToAPESamples_16(byte[] inSamples, int inByteOffset,
int[,] outSamples, int outSampleOffset, uint sampleCount, int channelCount)
{
uint loopCount = sampleCount * (uint)channelCount;
if ((inSamples.Length - inByteOffset < loopCount * 2) ||
(outSamples.GetLength(0) - outSampleOffset < sampleCount))
{
throw new IndexOutOfRangeException();
}
fixed (byte* pInSamplesFixed = &inSamples[inByteOffset])
{
fixed (int* pOutSamplesFixed = &outSamples[outSampleOffset, 0])
{
short* pInSamples = (short*)pInSamplesFixed;
int* pOutSamples = pOutSamplesFixed;
for (int i = 0; i < loopCount; i++)
{
*(pOutSamples++) = (int)*(pInSamples++);
}
}
}
}
public void Write(byte[] buff, uint sampleCount)
{
//if ((_sampleBuffer == null) || (_sampleBuffer.GetLength(0) < sampleCount))
//{
// _sampleBuffer = new int[sampleCount, _channelCount];
//}
//BytesToAPESamples_16(buff, 0, _sampleBuffer, 0, sampleCount, _channelCount);
//_apeWriter.Write(_sampleBuffer, (int)sampleCount);
_apeWriter.Write (buff, sampleCount);
}
}
class WavPackReader : IAudioSource {
WavPackDotNet.WavPackReader _wavPackReader;

View File

@@ -34,6 +34,7 @@ namespace JDP {
WAV,
FLAC,
WavPack,
APE,
NoAudio
}
@@ -44,6 +45,7 @@ namespace JDP {
{
case OutputAudioFormat.FLAC: return ".flac";
case OutputAudioFormat.WavPack: return ".wv";
case OutputAudioFormat.APE: return ".ape";
case OutputAudioFormat.WAV: return ".wav";
case OutputAudioFormat.NoAudio: return ".dummy";
}
@@ -214,8 +216,7 @@ namespace JDP {
public string specialExceptions;
public bool replaceSpaces;
public bool embedLog;
private string[] _charMap;
public bool fillUpCUE;
public CUEConfig()
{
@@ -237,11 +238,11 @@ namespace JDP {
keepOriginalFilenames = true;
trackFilenameFormat = "%N-%A-%T";
singleFilenameFormat = "%F";
removeSpecial = true;
removeSpecial = false;
specialExceptions = "-()";
replaceSpaces = true;
embedLog = true;
BuildCharMap();
fillUpCUE = true;
}
public void Save (SettingsWriter sw)
@@ -268,6 +269,7 @@ namespace JDP {
sw.Save("SpecialCharactersExceptions", specialExceptions);
sw.Save("ReplaceSpaces", replaceSpaces ? "1" : "0");
sw.Save("EmbedLog", embedLog ? "1" : "0");
sw.Save("FillUpCUE", fillUpCUE ? "1" : "0");
}
public void Load(SettingsReader sr)
@@ -351,59 +353,30 @@ namespace JDP {
val = sr.Load("EmbedLog");
embedLog = (val != null) ? (val != "0") : true;
BuildCharMap();
val = sr.Load("FillUpCUE");
fillUpCUE = (val != null) ? (val != "0") : true;
}
public void BuildCharMap()
{
System.Collections.BitArray allowed = new System.Collections.BitArray(256, true);
char[] invalid = Path.GetInvalidFileNameChars();
int i;
if (removeSpecial)
{
byte[] exceptions = CUESheet.Encoding.GetBytes(specialExceptions);
for (i = 0; i <= 255; i++)
{
allowed[i] = ((i >= 'a') && (i <= 'z')) ||
((i >= 'A') && (i <= 'Z')) ||
((i >= '0') && (i <= '9')) ||
(i == ' ') || (i == '_');
}
for (i = 0; i < exceptions.Length; i++)
{
allowed[exceptions[i]] = true;
}
}
for (i = 0; i < invalid.Length; i++)
{
allowed[invalid[i]] = false;
}
_charMap = new string[256];
for (i = 0; i <= 255; i++)
{
if (allowed[i])
{
_charMap[i] = CUESheet.Encoding.GetString(new byte[] { (byte)i });
}
else
{
_charMap[i] = String.Empty;
}
}
}
public string CleanseString (string s)
{
StringBuilder sb = new StringBuilder();
byte[] b = CUESheet.Encoding.GetBytes(s);
char[] invalid = Path.GetInvalidFileNameChars();
for (int i = 0; i < b.Length; i++)
s = Encoding.Default.GetString(Encoding.Default.GetBytes(s));
for (int i = 0; i < s.Length; i++)
{
sb.Append(_charMap[b[i]]);
char ch = s[i];
if (removeSpecial && specialExceptions.IndexOf(ch) < 0 && !(
((ch >= 'a') && (ch <= 'z')) ||
((ch >= 'A') && (ch <= 'Z')) ||
((ch >= '0') && (ch <= '9')) ||
(ch == ' ') || (ch == '_')))
ch = '_';
if (Array.IndexOf(invalid, ch) >= 0)
sb.Append("_");
else
sb.Append (ch);
}
return sb.ToString();
@@ -473,8 +446,6 @@ namespace JDP {
accDisks = new List<AccDisk>();
_hasEmbeddedCUESheet = false;
_config.BuildCharMap();
TextReader sr;
if (Path.GetExtension(pathIn).ToLower() != ".cue")
@@ -710,18 +681,21 @@ namespace JDP {
_albumTags = _tracks[0]._trackTags;
_tracks[0]._trackTags = new NameValueCollection();
}
if (General.FindCUELine(_attributes, "PERFORMER") == null && GetCommonTag("ALBUM ARTIST") != null)
General.SetCUELine(_attributes, "PERFORMER", GetCommonTag("ALBUM ARTIST"), true);
if (General.FindCUELine(_attributes, "PERFORMER") == null && GetCommonTag("ARTIST") != null)
General.SetCUELine(_attributes, "PERFORMER", GetCommonTag("ARTIST"), true);
if (General.FindCUELine(_attributes, "TITLE") == null && GetCommonTag("ALBUM") != null)
General.SetCUELine(_attributes, "TITLE", GetCommonTag("ALBUM"), true);
if (General.FindCUELine(_attributes, "REM", "DATE") == null && GetCommonTag("DATE") != null)
General.SetCUELine(_attributes, "REM", "DATE", GetCommonTag("DATE"), false);
if (General.FindCUELine(_attributes, "REM", "DATE") == null && GetCommonTag("YEAR") != null)
General.SetCUELine(_attributes, "REM", "DATE", GetCommonTag("YEAR"), false);
if (General.FindCUELine(_attributes, "REM", "GENRE") == null && GetCommonTag("GENRE") != null)
General.SetCUELine(_attributes, "REM", "GENRE", GetCommonTag("GENRE"), true);
if (_config.fillUpCUE)
{
if (General.FindCUELine(_attributes, "PERFORMER") == null && GetCommonTag("ALBUM ARTIST") != null)
General.SetCUELine(_attributes, "PERFORMER", GetCommonTag("ALBUM ARTIST"), true);
if (General.FindCUELine(_attributes, "PERFORMER") == null && GetCommonTag("ARTIST") != null)
General.SetCUELine(_attributes, "PERFORMER", GetCommonTag("ARTIST"), true);
if (General.FindCUELine(_attributes, "TITLE") == null && GetCommonTag("ALBUM") != null)
General.SetCUELine(_attributes, "TITLE", GetCommonTag("ALBUM"), true);
if (General.FindCUELine(_attributes, "REM", "DATE") == null && GetCommonTag("DATE") != null)
General.SetCUELine(_attributes, "REM", "DATE", GetCommonTag("DATE"), false);
if (General.FindCUELine(_attributes, "REM", "DATE") == null && GetCommonTag("YEAR") != null)
General.SetCUELine(_attributes, "REM", "DATE", GetCommonTag("YEAR"), false);
if (General.FindCUELine(_attributes, "REM", "GENRE") == null && GetCommonTag("GENRE") != null)
General.SetCUELine(_attributes, "REM", "GENRE", GetCommonTag("GENRE"), true);
}
if (_accurateRipId == null)
_accurateRipId = GetCommonTag("ACCURATERIPID");
@@ -762,7 +736,7 @@ namespace JDP {
public static Encoding Encoding {
get {
return Encoding.GetEncoding(1252);
return Encoding.Default;
}
}
@@ -932,8 +906,13 @@ namespace JDP {
}
public void Write(string path, CUEStyle style) {
StreamWriter sw = new StreamWriter(path, false, CUESheet.Encoding);
Write (sw, style);
StringWriter sw = new StringWriter();
Write(sw, style);
sw.Close();
bool utf8Required = CUESheet.Encoding.GetString(CUESheet.Encoding.GetBytes(sw.ToString())) != sw.ToString();
StreamWriter sw1 = new StreamWriter(path, false, utf8Required?Encoding.UTF8:CUESheet.Encoding);
sw1.Write(sw.ToString());
sw1.Close();
}
public void Write(TextWriter sw, CUEStyle style) {
@@ -1602,7 +1581,7 @@ namespace JDP {
{
iDest++;
audioDest = GetAudioDest(destPaths[iDest], destLengths[iDest], noOutput);
if (audioDest is FLACWriter || audioDest is WavPackWriter)
if (!(audioDest is WAVWriter))
{
NameValueCollection destTags = new NameValueCollection();

View File

@@ -68,6 +68,7 @@ namespace JDP {
this.toolStripProgressBar2 = new System.Windows.Forms.ToolStripProgressBar();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.btnCUECreator = new System.Windows.Forms.Button();
this.rbAPE = new System.Windows.Forms.RadioButton();
this.grpCUEPaths.SuspendLayout();
this.grpOutputStyle.SuspendLayout();
this.grpOutputPathGeneration.SuspendLayout();
@@ -256,6 +257,7 @@ namespace JDP {
//
// grpAudioOutput
//
this.grpAudioOutput.Controls.Add(this.rbAPE);
this.grpAudioOutput.Controls.Add(this.rbNoAudio);
this.grpAudioOutput.Controls.Add(this.rbWavPack);
this.grpAudioOutput.Controls.Add(this.rbFLAC);
@@ -409,6 +411,14 @@ namespace JDP {
this.btnCUECreator.UseVisualStyleBackColor = true;
this.btnCUECreator.Click += new System.EventHandler(this.btnCUECreator_Click);
//
// rbAPE
//
resources.ApplyResources(this.rbAPE, "rbAPE");
this.rbAPE.Name = "rbAPE";
this.rbAPE.TabStop = true;
this.rbAPE.UseVisualStyleBackColor = true;
this.rbAPE.CheckedChanged += new System.EventHandler(this.rbAPE_CheckedChanged);
//
// frmCUETools
//
resources.ApplyResources(this, "$this");
@@ -492,6 +502,7 @@ namespace JDP {
private System.Windows.Forms.Button btnCUECreator;
private System.Windows.Forms.MaskedTextBox txtDataTrackLength;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.RadioButton rbAPE;
}
}

View File

@@ -44,8 +44,8 @@ namespace JDP {
OpenFileDialog fileDlg = new OpenFileDialog();
DialogResult dlgRes;
fileDlg.Title = "Input CUE Sheet or FLAC image";
fileDlg.Filter = "CUE Sheets (*.cue)|*.cue|FLAC images (*.flac)|*.flac";
fileDlg.Title = "Input CUE Sheet or album image";
fileDlg.Filter = "CUE Sheets (*.cue)|*.cue|FLAC images (*.flac)|*.flac|WavPack images (*.wv)|*.wv|APE images (*.ape)|*.ape";
dlgRes = fileDlg.ShowDialog();
if (dlgRes == DialogResult.OK) {
@@ -113,7 +113,6 @@ namespace JDP {
_writeOffset = settingsForm.WriteOffset;
_config = settingsForm.Config;
_config.BuildCharMap();
UpdateOutputPath();
}
}
@@ -124,7 +123,7 @@ namespace JDP {
StringWriter sw = new StringWriter();
sw.WriteLine("CUE Tools v1.9.2");
sw.WriteLine("Copyright 2006-2007 Moitah http://www.moitah.net/.");
sw.WriteLine("AccurateRip, Monkey's Audio (APE) input and FLAC embedded CUE sheet support added in 2008 by Greg Chudov, gchudov@gmail.com.");
sw.WriteLine("AccurateRip, Monkey's Audio and embedded CUE sheet support added in 2008 by Greg Chudov, gchudov@gmail.com.");
sw.WriteLine("Thanks go out to Christopher Key and Whitehobbit for insight on AccurateRip functionality and to Mr Spoon for permission to use the database.");
sw.WriteLine("Monkey's Audio library by Matthew T. Ashland.");
reportForm.Message = sw.ToString();
@@ -397,7 +396,7 @@ namespace JDP {
btnFilenameCorrector.Enabled = !running;
btnCUECreator.Enabled = !running;
btnBatch.Enabled = !running;
btnConvert.Text = running ? "&Stop" : "&Convert";
btnConvert.Text = running ? "&Stop" : "&Go";
toolStripStatusLabel1.Text = String.Empty;
toolStripProgressBar1.Value = 0;
toolStripProgressBar2.Value = 0;
@@ -680,6 +679,7 @@ namespace JDP {
get {
if (rbFLAC.Checked) return OutputAudioFormat.FLAC;
if (rbWavPack.Checked) return OutputAudioFormat.WavPack;
if (rbAPE.Checked) return OutputAudioFormat.APE;
if (rbNoAudio.Checked) return OutputAudioFormat.NoAudio;
return OutputAudioFormat.WAV;
}
@@ -687,7 +687,8 @@ namespace JDP {
switch (value) {
case OutputAudioFormat.FLAC: rbFLAC.Checked = true; break;
case OutputAudioFormat.WavPack: rbWavPack.Checked = true; break;
case OutputAudioFormat.WAV: rbWAV.Checked = true; break;
case OutputAudioFormat.APE: rbAPE.Checked = true; break;
case OutputAudioFormat.WAV: rbWAV.Checked = true; break;
case OutputAudioFormat.NoAudio: rbNoAudio.Checked = true; break;
}
}
@@ -803,7 +804,7 @@ namespace JDP {
private void updateOutputStyles()
{
rbEmbedCUE.Enabled = rbFLAC.Checked || rbWavPack.Checked;
rbEmbedCUE.Enabled = rbFLAC.Checked || rbWavPack.Checked || rbAPE.Checked;
rbNoAudio.Enabled = rbWAV.Enabled = !rbEmbedCUE.Checked;
}
@@ -890,6 +891,11 @@ namespace JDP {
}
}
}
private void rbAPE_CheckedChanged(object sender, EventArgs e)
{
updateOutputStyles();
}
}
enum OutputPathGeneration {

View File

@@ -129,7 +129,7 @@
<value>5</value>
</data>
<data name="btnConvert.Text" xml:space="preserve">
<value>&amp;Convert</value>
<value>&amp;Go</value>
</data>
<data name="&gt;&gt;btnConvert.Name" xml:space="preserve">
<value>btnConvert</value>
@@ -383,93 +383,6 @@
<data name="&gt;&gt;txtInputPath.ZOrder" xml:space="preserve">
<value>5</value>
</data>
<data name="&gt;&gt;rbEmbedCUE.Name" xml:space="preserve">
<value>rbEmbedCUE</value>
</data>
<data name="&gt;&gt;rbEmbedCUE.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;rbEmbedCUE.Parent" xml:space="preserve">
<value>grpOutputStyle</value>
</data>
<data name="&gt;&gt;rbEmbedCUE.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;rbGapsLeftOut.Name" xml:space="preserve">
<value>rbGapsLeftOut</value>
</data>
<data name="&gt;&gt;rbGapsLeftOut.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;rbGapsLeftOut.Parent" xml:space="preserve">
<value>grpOutputStyle</value>
</data>
<data name="&gt;&gt;rbGapsLeftOut.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="&gt;&gt;rbGapsPrepended.Name" xml:space="preserve">
<value>rbGapsPrepended</value>
</data>
<data name="&gt;&gt;rbGapsPrepended.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;rbGapsPrepended.Parent" xml:space="preserve">
<value>grpOutputStyle</value>
</data>
<data name="&gt;&gt;rbGapsPrepended.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="&gt;&gt;rbGapsAppended.Name" xml:space="preserve">
<value>rbGapsAppended</value>
</data>
<data name="&gt;&gt;rbGapsAppended.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;rbGapsAppended.Parent" xml:space="preserve">
<value>grpOutputStyle</value>
</data>
<data name="&gt;&gt;rbGapsAppended.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="&gt;&gt;rbSingleFile.Name" xml:space="preserve">
<value>rbSingleFile</value>
</data>
<data name="&gt;&gt;rbSingleFile.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;rbSingleFile.Parent" xml:space="preserve">
<value>grpOutputStyle</value>
</data>
<data name="&gt;&gt;rbSingleFile.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="grpOutputStyle.Location" type="System.Drawing.Point, System.Drawing">
<value>114, 211</value>
</data>
<data name="grpOutputStyle.Size" type="System.Drawing.Size, System.Drawing">
<value>119, 118</value>
</data>
<data name="grpOutputStyle.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="grpOutputStyle.Text" xml:space="preserve">
<value>CUE Style</value>
</data>
<data name="&gt;&gt;grpOutputStyle.Name" xml:space="preserve">
<value>grpOutputStyle</value>
</data>
<data name="&gt;&gt;grpOutputStyle.Type" xml:space="preserve">
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;grpOutputStyle.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;grpOutputStyle.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>153, 8</value>
</metadata>
<data name="rbEmbedCUE.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
@@ -481,16 +394,19 @@
<value>12, 19</value>
</data>
<data name="rbEmbedCUE.Size" type="System.Drawing.Size, System.Drawing">
<value>57, 17</value>
<value>75, 17</value>
</data>
<data name="rbEmbedCUE.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
</data>
<data name="rbEmbedCUE.Text" xml:space="preserve">
<value>&amp;Embed</value>
<value>&amp;Embedded</value>
</data>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>153, 8</value>
</metadata>
<data name="rbEmbedCUE.ToolTip" xml:space="preserve">
<value>Create single file with embedded CUE sheet. Currently supported only for FLAC output</value>
<value>Create single file with embedded CUE sheet.</value>
</data>
<data name="&gt;&gt;rbEmbedCUE.Name" xml:space="preserve">
<value>rbEmbedCUE</value>
@@ -624,6 +540,30 @@
<data name="&gt;&gt;rbSingleFile.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="grpOutputStyle.Location" type="System.Drawing.Point, System.Drawing">
<value>114, 211</value>
</data>
<data name="grpOutputStyle.Size" type="System.Drawing.Size, System.Drawing">
<value>119, 118</value>
</data>
<data name="grpOutputStyle.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
</data>
<data name="grpOutputStyle.Text" xml:space="preserve">
<value>CUE Style</value>
</data>
<data name="&gt;&gt;grpOutputStyle.Name" xml:space="preserve">
<value>grpOutputStyle</value>
</data>
<data name="&gt;&gt;grpOutputStyle.Type" xml:space="preserve">
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;grpOutputStyle.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;grpOutputStyle.ZOrder" xml:space="preserve">
<value>9</value>
</data>
<data name="btnAbout.Location" type="System.Drawing.Point, System.Drawing">
<value>410, 135</value>
</data>
@@ -936,6 +876,18 @@
<data name="&gt;&gt;txtAppendFilename.ZOrder" xml:space="preserve">
<value>6</value>
</data>
<data name="&gt;&gt;rbAPE.Name" xml:space="preserve">
<value>rbAPE</value>
</data>
<data name="&gt;&gt;rbAPE.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;rbAPE.Parent" xml:space="preserve">
<value>grpAudioOutput</value>
</data>
<data name="&gt;&gt;rbAPE.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;rbNoAudio.Name" xml:space="preserve">
<value>rbNoAudio</value>
</data>
@@ -946,7 +898,7 @@
<value>grpAudioOutput</value>
</data>
<data name="&gt;&gt;rbNoAudio.ZOrder" xml:space="preserve">
<value>0</value>
<value>1</value>
</data>
<data name="&gt;&gt;rbWavPack.Name" xml:space="preserve">
<value>rbWavPack</value>
@@ -958,7 +910,7 @@
<value>grpAudioOutput</value>
</data>
<data name="&gt;&gt;rbWavPack.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="&gt;&gt;rbFLAC.Name" xml:space="preserve">
<value>rbFLAC</value>
@@ -970,7 +922,7 @@
<value>grpAudioOutput</value>
</data>
<data name="&gt;&gt;rbFLAC.ZOrder" xml:space="preserve">
<value>2</value>
<value>3</value>
</data>
<data name="&gt;&gt;rbWAV.Name" xml:space="preserve">
<value>rbWAV</value>
@@ -982,7 +934,7 @@
<value>grpAudioOutput</value>
</data>
<data name="&gt;&gt;rbWAV.ZOrder" xml:space="preserve">
<value>3</value>
<value>4</value>
</data>
<data name="grpAudioOutput.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 211</value>
@@ -1012,7 +964,7 @@
<value>True</value>
</data>
<data name="rbNoAudio.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 71</value>
<value>11, 85</value>
</data>
<data name="rbNoAudio.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 17</value>
@@ -1036,13 +988,13 @@
<value>grpAudioOutput</value>
</data>
<data name="&gt;&gt;rbNoAudio.ZOrder" xml:space="preserve">
<value>0</value>
<value>1</value>
</data>
<data name="rbWavPack.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="rbWavPack.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 54</value>
<value>11, 34</value>
</data>
<data name="rbWavPack.Size" type="System.Drawing.Size, System.Drawing">
<value>69, 17</value>
@@ -1063,13 +1015,13 @@
<value>grpAudioOutput</value>
</data>
<data name="&gt;&gt;rbWavPack.ZOrder" xml:space="preserve">
<value>1</value>
<value>2</value>
</data>
<data name="rbFLAC.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="rbFLAC.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 37</value>
<value>11, 17</value>
</data>
<data name="rbFLAC.Size" type="System.Drawing.Size, System.Drawing">
<value>50, 17</value>
@@ -1090,13 +1042,13 @@
<value>grpAudioOutput</value>
</data>
<data name="&gt;&gt;rbFLAC.ZOrder" xml:space="preserve">
<value>2</value>
<value>3</value>
</data>
<data name="rbWAV.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="rbWAV.Location" type="System.Drawing.Point, System.Drawing">
<value>12, 20</value>
<value>11, 68</value>
</data>
<data name="rbWAV.Size" type="System.Drawing.Size, System.Drawing">
<value>48, 17</value>
@@ -1117,7 +1069,7 @@
<value>grpAudioOutput</value>
</data>
<data name="&gt;&gt;rbWAV.ZOrder" xml:space="preserve">
<value>3</value>
<value>4</value>
</data>
<data name="btnBatch.Location" type="System.Drawing.Point, System.Drawing">
<value>410, 259</value>
@@ -1191,6 +1143,90 @@
<data name="&gt;&gt;btnSettings.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="&gt;&gt;label1.Name" xml:space="preserve">
<value>label1</value>
</data>
<data name="&gt;&gt;label1.Type" xml:space="preserve">
<value>System.Windows.Forms.Label, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;label1.Parent" xml:space="preserve">
<value>grpAccurateRip</value>
</data>
<data name="&gt;&gt;label1.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="&gt;&gt;txtDataTrackLength.Name" xml:space="preserve">
<value>txtDataTrackLength</value>
</data>
<data name="&gt;&gt;txtDataTrackLength.Type" xml:space="preserve">
<value>System.Windows.Forms.MaskedTextBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;txtDataTrackLength.Parent" xml:space="preserve">
<value>grpAccurateRip</value>
</data>
<data name="&gt;&gt;txtDataTrackLength.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="&gt;&gt;rbArApplyOffset.Name" xml:space="preserve">
<value>rbArApplyOffset</value>
</data>
<data name="&gt;&gt;rbArApplyOffset.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;rbArApplyOffset.Parent" xml:space="preserve">
<value>grpAccurateRip</value>
</data>
<data name="&gt;&gt;rbArApplyOffset.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="&gt;&gt;rbArVerify.Name" xml:space="preserve">
<value>rbArVerify</value>
</data>
<data name="&gt;&gt;rbArVerify.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;rbArVerify.Parent" xml:space="preserve">
<value>grpAccurateRip</value>
</data>
<data name="&gt;&gt;rbArVerify.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="&gt;&gt;rbArNone.Name" xml:space="preserve">
<value>rbArNone</value>
</data>
<data name="&gt;&gt;rbArNone.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;rbArNone.Parent" xml:space="preserve">
<value>grpAccurateRip</value>
</data>
<data name="&gt;&gt;rbArNone.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="grpAccurateRip.Location" type="System.Drawing.Point, System.Drawing">
<value>238, 211</value>
</data>
<data name="grpAccurateRip.Size" type="System.Drawing.Size, System.Drawing">
<value>144, 118</value>
</data>
<data name="grpAccurateRip.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
</data>
<data name="grpAccurateRip.Text" xml:space="preserve">
<value>AccurateRip</value>
</data>
<data name="&gt;&gt;grpAccurateRip.Name" xml:space="preserve">
<value>grpAccurateRip</value>
</data>
<data name="&gt;&gt;grpAccurateRip.Type" xml:space="preserve">
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;grpAccurateRip.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;grpAccurateRip.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
@@ -1252,7 +1288,7 @@
<value>True</value>
</data>
<data name="rbArApplyOffset.Location" type="System.Drawing.Point, System.Drawing">
<value>11, 52</value>
<value>8, 20</value>
</data>
<data name="rbArApplyOffset.Size" type="System.Drawing.Size, System.Drawing">
<value>120, 17</value>
@@ -1263,9 +1299,6 @@
<data name="rbArApplyOffset.Text" xml:space="preserve">
<value>Verify, &amp;then encode</value>
</data>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>153, 8</value>
</metadata>
<data name="rbArApplyOffset.ToolTip" xml:space="preserve">
<value>On the first pass, verify and try to find an offset correction which makes the rip accurate according to the AccurateRip database. On the second pass, convert, possibly applying offset correction.</value>
</data>
@@ -1285,16 +1318,16 @@
<value>True</value>
</data>
<data name="rbArVerify.Location" type="System.Drawing.Point, System.Drawing">
<value>11, 35</value>
<value>8, 54</value>
</data>
<data name="rbArVerify.Size" type="System.Drawing.Size, System.Drawing">
<value>53, 17</value>
<value>122, 17</value>
</data>
<data name="rbArVerify.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
</data>
<data name="rbArVerify.Text" xml:space="preserve">
<value>&amp;Verify</value>
<value>&amp;Verify, don't encode</value>
</data>
<data name="rbArVerify.ToolTip" xml:space="preserve">
<value>Contact the AccurateRip databse for validation and compare the image against database</value>
@@ -1315,16 +1348,16 @@
<value>True</value>
</data>
<data name="rbArNone.Location" type="System.Drawing.Point, System.Drawing">
<value>11, 18</value>
<value>8, 37</value>
</data>
<data name="rbArNone.Size" type="System.Drawing.Size, System.Drawing">
<value>81, 17</value>
<value>123, 17</value>
</data>
<data name="rbArNone.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
</data>
<data name="rbArNone.Text" xml:space="preserve">
<value>&amp;Don't verify</value>
<value>&amp;Don't verify, encode</value>
</data>
<data name="rbArNone.ToolTip" xml:space="preserve">
<value>Don't contact the AccurateRip database for validation</value>
@@ -1341,30 +1374,6 @@
<data name="&gt;&gt;rbArNone.ZOrder" xml:space="preserve">
<value>4</value>
</data>
<data name="grpAccurateRip.Location" type="System.Drawing.Point, System.Drawing">
<value>238, 211</value>
</data>
<data name="grpAccurateRip.Size" type="System.Drawing.Size, System.Drawing">
<value>144, 118</value>
</data>
<data name="grpAccurateRip.TabIndex" type="System.Int32, mscorlib">
<value>11</value>
</data>
<data name="grpAccurateRip.Text" xml:space="preserve">
<value>AccurateRip</value>
</data>
<data name="&gt;&gt;grpAccurateRip.Name" xml:space="preserve">
<value>grpAccurateRip</value>
</data>
<data name="&gt;&gt;grpAccurateRip.Type" xml:space="preserve">
<value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;grpAccurateRip.Parent" xml:space="preserve">
<value>$this</value>
</data>
<data name="&gt;&gt;grpAccurateRip.ZOrder" xml:space="preserve">
<value>2</value>
</data>
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>0, 339</value>
</metadata>
@@ -1437,6 +1446,33 @@
<data name="&gt;&gt;btnCUECreator.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="rbAPE.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="rbAPE.Location" type="System.Drawing.Point, System.Drawing">
<value>11, 51</value>
</data>
<data name="rbAPE.Size" type="System.Drawing.Size, System.Drawing">
<value>44, 17</value>
</data>
<data name="rbAPE.TabIndex" type="System.Int32, mscorlib">
<value>7</value>
</data>
<data name="rbAPE.Text" xml:space="preserve">
<value>APE</value>
</data>
<data name="&gt;&gt;rbAPE.Name" xml:space="preserve">
<value>rbAPE</value>
</data>
<data name="&gt;&gt;rbAPE.Type" xml:space="preserve">
<value>System.Windows.Forms.RadioButton, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;rbAPE.Parent" xml:space="preserve">
<value>grpAudioOutput</value>
</data>
<data name="&gt;&gt;rbAPE.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>

View File

@@ -26,6 +26,7 @@ namespace JDP {
this.components = new System.ComponentModel.Container();
System.Windows.Forms.Button btnCancel;
this.grpGeneral = new System.Windows.Forms.GroupBox();
this.chkEmbedLog = new System.Windows.Forms.CheckBox();
this.numericWriteOffset = new System.Windows.Forms.NumericUpDown();
this.chkAutoCorrectFilenames = new System.Windows.Forms.CheckBox();
this.chkPreserveHTOA = new System.Windows.Forms.CheckBox();
@@ -65,7 +66,7 @@ namespace JDP {
this.lblTrackFilenameFormat = new System.Windows.Forms.Label();
this.lblSingleFilenameFormat = new System.Windows.Forms.Label();
this.txtSingleFilenameFormat = new System.Windows.Forms.TextBox();
this.chkEmbedLog = new System.Windows.Forms.CheckBox();
this.chkFillUpCUE = new System.Windows.Forms.CheckBox();
btnCancel = new System.Windows.Forms.Button();
this.grpGeneral.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.numericWriteOffset)).BeginInit();
@@ -93,6 +94,7 @@ namespace JDP {
//
// grpGeneral
//
this.grpGeneral.Controls.Add(this.chkFillUpCUE);
this.grpGeneral.Controls.Add(this.chkEmbedLog);
this.grpGeneral.Controls.Add(this.numericWriteOffset);
this.grpGeneral.Controls.Add(this.chkAutoCorrectFilenames);
@@ -105,6 +107,17 @@ namespace JDP {
this.grpGeneral.TabStop = false;
this.grpGeneral.Text = "General";
//
// chkEmbedLog
//
this.chkEmbedLog.AutoSize = true;
this.chkEmbedLog.Location = new System.Drawing.Point(12, 78);
this.chkEmbedLog.Name = "chkEmbedLog";
this.chkEmbedLog.Size = new System.Drawing.Size(134, 17);
this.chkEmbedLog.TabIndex = 6;
this.chkEmbedLog.Text = "Embed log file as a tag";
this.toolTip1.SetToolTip(this.chkEmbedLog, "File should be in the same directory as source file and have a .log extension");
this.chkEmbedLog.UseVisualStyleBackColor = true;
//
// numericWriteOffset
//
this.numericWriteOffset.Location = new System.Drawing.Point(133, 20);
@@ -600,16 +613,15 @@ namespace JDP {
this.txtSingleFilenameFormat.TabIndex = 2;
this.txtSingleFilenameFormat.Text = "%F";
//
// chkEmbedLog
// chkFillUpCUE
//
this.chkEmbedLog.AutoSize = true;
this.chkEmbedLog.Location = new System.Drawing.Point(12, 78);
this.chkEmbedLog.Name = "chkEmbedLog";
this.chkEmbedLog.Size = new System.Drawing.Size(134, 17);
this.chkEmbedLog.TabIndex = 6;
this.chkEmbedLog.Text = "Embed log file as a tag";
this.toolTip1.SetToolTip(this.chkEmbedLog, "File should be in the same directory as source file and have a .log extension");
this.chkEmbedLog.UseVisualStyleBackColor = true;
this.chkFillUpCUE.AutoSize = true;
this.chkFillUpCUE.Location = new System.Drawing.Point(12, 95);
this.chkFillUpCUE.Name = "chkFillUpCUE";
this.chkFillUpCUE.Size = new System.Drawing.Size(187, 17);
this.chkFillUpCUE.TabIndex = 7;
this.chkFillUpCUE.Text = "Fill up missing CUE data from tags";
this.chkFillUpCUE.UseVisualStyleBackColor = true;
//
// frmSettings
//
@@ -697,6 +709,7 @@ namespace JDP {
private System.Windows.Forms.CheckBox chkArFixOffset;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.CheckBox chkEmbedLog;
private System.Windows.Forms.CheckBox chkFillUpCUE;
}
}

View File

@@ -42,6 +42,7 @@ namespace JDP {
chkArNoUnverifiedAudio.Checked = _config.noUnverifiedOutput;
chkArFixOffset.Checked = _config.fixOffset;
chkEmbedLog.Checked = _config.embedLog;
chkFillUpCUE.Checked = _config.fillUpCUE;
}
private void frmSettings_FormClosing(object sender, FormClosingEventArgs e) {
@@ -94,6 +95,7 @@ namespace JDP {
_config.noUnverifiedOutput = chkArNoUnverifiedAudio.Checked;
_config.fixOffset = chkArFixOffset.Checked;
_config.embedLog = chkEmbedLog.Checked;
_config.fillUpCUE = chkFillUpCUE.Checked;
}
private void chkArFixOffset_CheckedChanged(object sender, EventArgs e)

View File

@@ -123,10 +123,4 @@
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root>