mirror of
https://github.com/claunia/cuetools.net.git
synced 2025-12-16 18:14:25 +00:00
CD parity information database
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.50727</ProductVersion>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{CA4D64E6-6544-4A29-8BA5-7DB08D50D072}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
@@ -19,7 +19,7 @@
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<OutputPath>..\bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
|
||||
@@ -11,8 +11,9 @@ namespace CUETools.AccurateRip
|
||||
{
|
||||
public class AccurateRipVerify : IAudioDest
|
||||
{
|
||||
public AccurateRipVerify(CDImageLayout toc)
|
||||
public AccurateRipVerify(CDImageLayout toc, IWebProxy proxy)
|
||||
{
|
||||
this.proxy = proxy;
|
||||
_toc = toc;
|
||||
_accDisks = new List<AccDisk>();
|
||||
_crc32 = new Crc32();
|
||||
@@ -302,7 +303,7 @@ namespace CUETools.AccurateRip
|
||||
/// <param name="count"></param>
|
||||
/// <param name="currentOffset"></param>
|
||||
/// <param name="offs"></param>
|
||||
public unsafe void CalculateCRCs(int* pSampleBuff, int count, int currentOffset, int offs)
|
||||
public unsafe void CalculateCRCs(uint* pSampleBuff, int count, int currentOffset, int offs)
|
||||
{
|
||||
uint crcar = _CRCAR[_currentTrack, 0];
|
||||
uint crcsm = _CRCSM[_currentTrack, 0];
|
||||
@@ -322,7 +323,11 @@ namespace CUETools.AccurateRip
|
||||
_CRCNL[_currentTrack, offs + i] = crcnl;
|
||||
}
|
||||
|
||||
uint lo = (uint)*(pSampleBuff++);
|
||||
uint sample = *(pSampleBuff++);
|
||||
crcsm += sample;
|
||||
crcar += sample * (uint)(currentOffset + i + 1);
|
||||
|
||||
uint lo = sample & 0xffff;
|
||||
crc32 = (crc32 >> 8) ^ t[(byte)(crc32 ^ lo)];
|
||||
crc32 = (crc32 >> 8) ^ t[(byte)(crc32 ^ (lo >> 8))];
|
||||
if (lo != 0)
|
||||
@@ -332,7 +337,7 @@ namespace CUETools.AccurateRip
|
||||
}
|
||||
else crcnl++;
|
||||
|
||||
uint hi = (uint)*(pSampleBuff++);
|
||||
uint hi = sample >> 16;
|
||||
crc32 = (crc32 >> 8) ^ t[(byte)(crc32 ^ hi)];
|
||||
crc32 = (crc32 >> 8) ^ t[(byte)(crc32 ^ (hi >> 8))];
|
||||
if (hi != 0)
|
||||
@@ -341,10 +346,6 @@ namespace CUETools.AccurateRip
|
||||
crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ (hi >> 8))];
|
||||
}
|
||||
else crcnl++;
|
||||
|
||||
uint sampleValue = (lo & 0xffff) + (hi << 16);
|
||||
crcsm += sampleValue;
|
||||
crcar += sampleValue * (uint)(currentOffset + i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -371,17 +372,17 @@ namespace CUETools.AccurateRip
|
||||
|
||||
unsafe
|
||||
{
|
||||
fixed (int* pSampleBuff = &sampleBuffer.Samples[pos, 0])
|
||||
//fixed (byte* pByteBuff = &sampleBuffer.Bytes[pos * sampleBuffer.BlockAlign])
|
||||
fixed (byte* pSampleBuff = &sampleBuffer.Bytes[pos * 4])
|
||||
{
|
||||
uint* samples = (uint*)pSampleBuff;
|
||||
if (currentSector < 10)
|
||||
CalculateCRCs(pSampleBuff, copyCount, currentOffset, currentOffset);
|
||||
CalculateCRCs(samples, copyCount, currentOffset, currentOffset);
|
||||
else if (remaingSectors < 10)
|
||||
CalculateCRCs(pSampleBuff, copyCount, currentOffset, 20 * 588 - (int)_samplesRemTrack);
|
||||
CalculateCRCs(samples, copyCount, currentOffset, 20 * 588 - (int)_samplesRemTrack);
|
||||
else if (currentSector >= 445 && currentSector <= 455)
|
||||
CalculateCRCs(pSampleBuff, copyCount, currentOffset, 20 * 588 + currentOffset - 445 * 588);
|
||||
CalculateCRCs(samples, copyCount, currentOffset, 20 * 588 + currentOffset - 445 * 588);
|
||||
else
|
||||
CalculateCRCs(pSampleBuff, copyCount, currentOffset, -1);
|
||||
CalculateCRCs(samples, copyCount, currentOffset, -1);
|
||||
}
|
||||
}
|
||||
pos += copyCount;
|
||||
@@ -442,6 +443,7 @@ namespace CUETools.AccurateRip
|
||||
|
||||
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
|
||||
req.Method = "GET";
|
||||
req.Proxy = proxy;
|
||||
|
||||
try
|
||||
{
|
||||
@@ -896,6 +898,7 @@ namespace CUETools.AccurateRip
|
||||
private uint[,] _CacheCRCWN;
|
||||
private uint[,] _CacheCRC32;
|
||||
private uint[] _CRCLOG;
|
||||
private IWebProxy proxy;
|
||||
|
||||
Crc32 _crc32;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.50727</ProductVersion>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{5802C7E9-157E-4124-946D-70B5AE48A5A1}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
@@ -19,7 +19,7 @@
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<OutputPath>..\bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.50727</ProductVersion>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{1DD41038-D885-46C5-8DDE-E0B82F066584}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
@@ -19,7 +19,7 @@
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<OutputPath>..\bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace CUETools.CDRepair
|
||||
galois = Galois16.instance;
|
||||
rs = new RsDecode16(npar, galois);
|
||||
crc32 = new Crc32();
|
||||
crc = 0xffffffff;
|
||||
//crc = 0xffffffff;
|
||||
encodeGx = galois.makeEncodeGxLog(npar);
|
||||
laststride = stride + (finalSampleCount * 2) % stride;
|
||||
stridecount = (finalSampleCount * 2) / stride - 2; // minus one for leadin and one for leadout
|
||||
@@ -97,11 +97,19 @@ namespace CUETools.CDRepair
|
||||
get { throw new Exception("unsupported"); }
|
||||
}
|
||||
|
||||
public int NPAR
|
||||
{
|
||||
get
|
||||
{
|
||||
return npar;
|
||||
}
|
||||
}
|
||||
|
||||
public uint CRC
|
||||
{
|
||||
get
|
||||
{
|
||||
return crc ^ 0xffffffff;
|
||||
return crc32.Combine(0xffffffff, crc, stride * 2 * stridecount) ^ 0xffffffff;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -113,19 +121,14 @@ namespace CUETools.CDRepair
|
||||
protected ushort[] leadin;
|
||||
protected ushort[] leadout;
|
||||
protected bool verify;
|
||||
protected bool hasErrors = false, canRecover = true;
|
||||
protected int actualOffset = 0;
|
||||
protected bool encode;
|
||||
protected uint crcA, crcB;
|
||||
|
||||
internal int[,] sigma;
|
||||
internal int[,] omega;
|
||||
internal int[,] errpos;
|
||||
internal int[,] erroff;
|
||||
internal int[] errors;
|
||||
|
||||
public CDRepairEncode(int finalSampleCount, int stride, int npar, bool verify)
|
||||
public CDRepairEncode(int finalSampleCount, int stride, int npar, bool verify, bool encode)
|
||||
: base (finalSampleCount, stride, npar)
|
||||
{
|
||||
this.verify = verify;
|
||||
this.encode = encode;
|
||||
parity = new byte[stride * npar * 2];
|
||||
if (verify)
|
||||
{
|
||||
@@ -136,45 +139,64 @@ namespace CUETools.CDRepair
|
||||
syndrome = new ushort[1, npar];
|
||||
}
|
||||
|
||||
new public unsafe void Write(AudioBuffer sampleBuffer)
|
||||
private unsafe void ProcessStride(int currentStride, int currentPart, int count, ushort* data)
|
||||
{
|
||||
sampleBuffer.Prepare(this);
|
||||
|
||||
if ((sampleBuffer.ByteLength & 1) != 0)
|
||||
throw new Exception("never happens");
|
||||
|
||||
int firstPos = Math.Max(0, stride - sampleCount * 2);
|
||||
int lastPos = Math.Min(sampleBuffer.ByteLength >> 1, (finalSampleCount - sampleCount) * 2 - laststride);
|
||||
|
||||
fixed (byte* bytes = sampleBuffer.Bytes, par = parity)
|
||||
fixed (int* gx = encodeGx)
|
||||
fixed (uint* t = crc32.table)
|
||||
fixed (uint* crct = crc32.table)
|
||||
fixed (byte* bpar = parity)
|
||||
fixed (ushort* exp = galois.ExpTbl, log = galois.LogTbl, synptr = syndrome)
|
||||
{
|
||||
ushort* data = (ushort*)bytes;
|
||||
fixed (int* gx = encodeGx)
|
||||
for (int pos = 0; pos < count; pos++)
|
||||
{
|
||||
ushort* par = (ushort*)bpar;
|
||||
int part = currentPart + pos;
|
||||
ushort* wr = ((ushort*)par) + part * npar;
|
||||
ushort dd = data[pos];
|
||||
|
||||
if (verify)
|
||||
for (int pos = 0; pos < (sampleBuffer.ByteLength >> 1); pos++)
|
||||
crc = (crc >> 8) ^ crct[(byte)(crc ^ dd)];
|
||||
crc = (crc >> 8) ^ crct[(byte)(crc ^ (dd >> 8))];
|
||||
|
||||
if (verify)
|
||||
{
|
||||
ushort dd = data[pos];
|
||||
if (sampleCount * 2 + pos < 2 * stride)
|
||||
leadin[sampleCount * 2 + pos] = dd;
|
||||
int remaining = (finalSampleCount - sampleCount) * 2 - pos - 1;
|
||||
if (remaining < stride + laststride)
|
||||
leadout[remaining] = dd;
|
||||
ushort* syn = synptr + part * npar;
|
||||
syn[0] ^= dd; // wk += data
|
||||
for (int i = 1; i < npar; i++)
|
||||
syn[i] = (ushort)(dd ^ galois.mulExp(syn[i], i)); // wk = data + wk * α^i
|
||||
}
|
||||
|
||||
if (npar == 8)
|
||||
{
|
||||
for (int pos = firstPos; pos < lastPos; pos++)
|
||||
int ib = wr[0] ^ dd;
|
||||
if (ib != 0)
|
||||
{
|
||||
int part = (sampleCount * 2 + pos) % stride;
|
||||
ushort* wr = ((ushort*)par) + part * 8;
|
||||
ushort dd = data[pos];
|
||||
ushort* myexp = exp + log[ib];
|
||||
for (int i = 0; i < npar - 1; i++)
|
||||
wr[i] = (ushort)(wr[i + 1] ^ myexp[gx[i]]);
|
||||
wr[npar - 1] = myexp[gx[npar - 1]];
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < npar - 1; i++)
|
||||
wr[i] = wr[i + 1];
|
||||
wr[npar - 1] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
crc = (crc >> 8) ^ t[(byte)(crc ^ dd)];
|
||||
crc = (crc >> 8) ^ t[(byte)(crc ^ (dd >> 8))];
|
||||
private unsafe void ProcessStride8(int currentStride, int currentPart, int count, ushort* data)
|
||||
{
|
||||
fixed (uint* crct = crc32.table)
|
||||
fixed (byte* bpar = parity)
|
||||
fixed (ushort* exp = galois.ExpTbl, log = galois.LogTbl, synptr = syndrome)
|
||||
for (int pos = 0; pos < count; pos++)
|
||||
{
|
||||
ushort* par = (ushort*)bpar;
|
||||
int part = currentPart + pos;
|
||||
ushort* wr = par + part * 8;
|
||||
ushort dd = data[pos];
|
||||
|
||||
crc = (crc >> 8) ^ crct[(byte)(crc ^ dd)];
|
||||
crc = (crc >> 8) ^ crct[(byte)(crc ^ (dd >> 8))];
|
||||
|
||||
if (encode)
|
||||
{
|
||||
int ib = wr[0] ^ dd;
|
||||
if (ib != 0)
|
||||
{
|
||||
@@ -199,161 +221,299 @@ namespace CUETools.CDRepair
|
||||
wr[6] = wr[7];
|
||||
wr[7] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// syn[i] += data[pos] * α^(pos*i)
|
||||
if (verify && dd != 0)
|
||||
{
|
||||
ushort* syn = synptr + part * 8;
|
||||
ushort* myexp = exp + log[dd];
|
||||
int offs = stridecount - (sampleCount * 2 + pos) / stride;
|
||||
syn[0] ^= dd;
|
||||
syn[1] ^= myexp[offs];
|
||||
syn[2] ^= myexp[(offs * 2) % 65535];
|
||||
syn[3] ^= myexp[(offs * 3) % 65535];
|
||||
syn[4] ^= myexp[(offs * 4) % 65535];
|
||||
syn[5] ^= myexp[(offs * 5) % 65535];
|
||||
syn[6] ^= myexp[(offs * 6) % 65535];
|
||||
syn[7] ^= myexp[(offs * 7) % 65535];
|
||||
//ushort logdd = log[dd];
|
||||
//syn[1] ^= exp[(logdd + offs) % 65535];
|
||||
//syn[2] ^= exp[(logdd + offs * 2) % 65535];
|
||||
//syn[3] ^= exp[(logdd + offs * 3) % 65535];
|
||||
//syn[4] ^= exp[(logdd + offs * 4) % 65535];
|
||||
//syn[5] ^= exp[(logdd + offs * 5) % 65535];
|
||||
//syn[6] ^= exp[(logdd + offs * 6) % 65535];
|
||||
//syn[7] ^= exp[(logdd + offs * 7) % 65535];
|
||||
}
|
||||
// syn[i] += data[pos] * α^(n*i)
|
||||
if (verify && dd != 0)
|
||||
{
|
||||
int n = stridecount - currentStride;
|
||||
ushort* syn = synptr + part * 8;
|
||||
syn[0] ^= dd;
|
||||
int idx = log[dd];
|
||||
idx += n; syn[1] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[2] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[3] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[4] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[5] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[6] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[7] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
}
|
||||
}
|
||||
else
|
||||
}
|
||||
|
||||
private unsafe void ProcessStride16(int currentStride, int currentPart, int count, ushort* data)
|
||||
{
|
||||
fixed (uint* crct = crc32.table)
|
||||
fixed (byte* bpar = parity)
|
||||
fixed (ushort* exp = galois.ExpTbl, log = galois.LogTbl, synptr = syndrome)
|
||||
for (int pos = 0; pos < count; pos++)
|
||||
{
|
||||
for (int pos = firstPos; pos < lastPos; pos++)
|
||||
ushort* par = (ushort*)bpar;
|
||||
int part = currentPart + pos;
|
||||
ushort* wr = par + part * 16;
|
||||
ushort dd = data[pos];
|
||||
|
||||
crc = (crc >> 8) ^ crct[(byte)(crc ^ dd)];
|
||||
crc = (crc >> 8) ^ crct[(byte)(crc ^ (dd >> 8))];
|
||||
|
||||
int ib = wr[0] ^ dd;
|
||||
if (ib != 0)
|
||||
{
|
||||
int part = (sampleCount * 2 + pos) % stride;
|
||||
ushort* wr = ((ushort*)par) + part * npar;
|
||||
ushort dd = data[pos];
|
||||
|
||||
crc = (crc >> 8) ^ t[(byte)(crc ^ dd)];
|
||||
crc = (crc >> 8) ^ t[(byte)(crc ^ (dd >> 8))];
|
||||
|
||||
if (verify)
|
||||
{
|
||||
ushort* syn = synptr + part * npar;
|
||||
syn[0] ^= dd; // wk += data
|
||||
for (int i = 1; i < npar; i++)
|
||||
syn[i] = (ushort)(dd ^ galois.mulExp(syn[i], i)); // wk = data + wk * α^i
|
||||
}
|
||||
|
||||
int ib = wr[0] ^ dd;
|
||||
if (ib != 0)
|
||||
{
|
||||
ushort* myexp = exp + log[ib];
|
||||
for (int i = 0; i < npar - 1; i++)
|
||||
wr[i] = (ushort)(wr[i + 1] ^ myexp[gx[i]]);
|
||||
wr[npar - 1] = myexp[gx[npar - 1]];
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < npar - 1; i++)
|
||||
wr[i] = wr[i + 1];
|
||||
wr[npar - 1] = 0;
|
||||
}
|
||||
ushort* myexp = exp + log[ib];
|
||||
wr[0] = (ushort)(wr[1] ^ myexp[0x000059f1]);
|
||||
wr[1] = (ushort)(wr[2] ^ myexp[0x0000608f]);
|
||||
wr[2] = (ushort)(wr[3] ^ myexp[0x0000918b]);
|
||||
wr[3] = (ushort)(wr[4] ^ myexp[0x00004487]);
|
||||
wr[4] = (ushort)(wr[5] ^ myexp[0x0000a151]);
|
||||
wr[5] = (ushort)(wr[6] ^ myexp[0x0000c074]);
|
||||
wr[6] = (ushort)(wr[7] ^ myexp[0x00004178]);
|
||||
wr[7] = (ushort)(wr[8] ^ myexp[0x00004730]);
|
||||
wr[8] = (ushort)(wr[9] ^ myexp[0x00004187]);
|
||||
wr[9] = (ushort)(wr[10] ^ myexp[0x0000c092]);
|
||||
wr[10] = (ushort)(wr[11] ^ myexp[0x0000a17e]);
|
||||
wr[11] = (ushort)(wr[12] ^ myexp[0x000044c3]);
|
||||
wr[12] = (ushort)(wr[13] ^ myexp[0x000091d6]);
|
||||
wr[13] = (ushort)(wr[14] ^ myexp[0x000060e9]);
|
||||
wr[14] = (ushort)(wr[15] ^ myexp[0x00005a5a]);
|
||||
wr[15] = myexp[0x00000078];
|
||||
}
|
||||
else
|
||||
{
|
||||
wr[0] = wr[1];
|
||||
wr[1] = wr[2];
|
||||
wr[2] = wr[3];
|
||||
wr[3] = wr[4];
|
||||
wr[4] = wr[5];
|
||||
wr[5] = wr[6];
|
||||
wr[6] = wr[7];
|
||||
wr[7] = wr[8];
|
||||
wr[8] = wr[9];
|
||||
wr[9] = wr[10];
|
||||
wr[10] = wr[11];
|
||||
wr[11] = wr[12];
|
||||
wr[12] = wr[13];
|
||||
wr[13] = wr[14];
|
||||
wr[14] = wr[15];
|
||||
wr[15] = 0;
|
||||
}
|
||||
|
||||
// syn[i] += data[pos] * α^(n*i)
|
||||
if (verify && dd != 0)
|
||||
{
|
||||
int n = stridecount - currentStride;
|
||||
ushort* syn = synptr + part * 16;
|
||||
syn[0] ^= dd;
|
||||
int idx = log[dd];
|
||||
idx += n; syn[1] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[2] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[3] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[4] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[5] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[6] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[7] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[8] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[9] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[10] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[11] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[12] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[13] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[14] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
idx += n; syn[15] ^= exp[(idx & 0xffff) + (idx >> 16)];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
new public unsafe void Write(AudioBuffer sampleBuffer)
|
||||
{
|
||||
sampleBuffer.Prepare(this);
|
||||
|
||||
if ((sampleBuffer.ByteLength & 1) != 0)
|
||||
throw new Exception("never happens");
|
||||
|
||||
fixed (byte* bytes = sampleBuffer.Bytes)
|
||||
{
|
||||
int offs = 0;
|
||||
while (offs < sampleBuffer.Length)
|
||||
{
|
||||
int currentPart = (sampleCount * 2) % stride;
|
||||
int currentStride = (sampleCount * 2) / stride;
|
||||
// Process no more than there is in the buffer, and no more than up to a stride boundary.
|
||||
int copyCount = Math.Min((sampleBuffer.Length - offs) * 2, stride - currentPart);
|
||||
ushort* data = ((ushort*)bytes) + offs * 2;
|
||||
|
||||
if (verify)
|
||||
{
|
||||
// remember CRC after leadin
|
||||
if (sampleCount * 2 == stride * 2)
|
||||
crcA = crc;
|
||||
|
||||
// remember CRC before leadout
|
||||
if ((finalSampleCount - sampleCount) * 2 == stride + laststride)
|
||||
crcB = crc;
|
||||
|
||||
if (currentStride < 2)
|
||||
for (int pos = 0; pos < copyCount; pos++)
|
||||
leadin[sampleCount * 2 + pos] = data[pos];
|
||||
|
||||
if (currentStride >= stridecount)
|
||||
for (int pos = 0; pos < copyCount; pos++)
|
||||
{
|
||||
int remaining = (finalSampleCount - sampleCount) * 2 - pos - 1;
|
||||
if (remaining < stride + laststride)
|
||||
leadout[remaining] = data[pos];
|
||||
}
|
||||
}
|
||||
|
||||
if (currentStride >= 1 && currentStride <= stridecount)
|
||||
{
|
||||
if (npar == 8)
|
||||
ProcessStride8(currentStride, currentPart, copyCount, data);
|
||||
else if (npar == 16)
|
||||
ProcessStride16(currentStride, currentPart, copyCount, data);
|
||||
else
|
||||
ProcessStride(currentStride, currentPart, copyCount, data);
|
||||
}
|
||||
|
||||
sampleCount += copyCount >> 1;
|
||||
offs += copyCount >> 1;
|
||||
}
|
||||
}
|
||||
sampleCount += sampleBuffer.Length;
|
||||
}
|
||||
|
||||
public unsafe bool VerifyParity(byte[] parity2)
|
||||
public unsafe CDRepairFix VerifyParity(byte[] parity2, int actualOffset)
|
||||
{
|
||||
return VerifyParity(parity2, 0, parity2.Length);
|
||||
return VerifyParity(npar, parity2, 0, parity2.Length, actualOffset);
|
||||
}
|
||||
|
||||
public unsafe bool VerifyParity(byte[] parity2, int pos, int len)
|
||||
private unsafe uint OffsettedCRC(int actualOffset)
|
||||
{
|
||||
fixed (uint* crct = crc32.table)
|
||||
{
|
||||
// calculate leadin CRC
|
||||
uint crc0 = 0;
|
||||
for (int off = stride - 2 * actualOffset; off < 2 * stride; off++)
|
||||
{
|
||||
ushort dd = leadin[off];
|
||||
crc0 = (crc0 >> 8) ^ crct[(byte)(crc0 ^ dd)];
|
||||
crc0 = (crc0 >> 8) ^ crct[(byte)(crc0 ^ (dd >> 8))];
|
||||
}
|
||||
// calculate leadout CRC
|
||||
uint crc2 = 0;
|
||||
for (int off = laststride + stride - 1; off >= laststride + 2 * actualOffset; off--)
|
||||
{
|
||||
ushort dd = leadout[off];
|
||||
crc2 = (crc2 >> 8) ^ crct[(byte)(crc2 ^ dd)];
|
||||
crc2 = (crc2 >> 8) ^ crct[(byte)(crc2 ^ (dd >> 8))];
|
||||
}
|
||||
|
||||
// calculate middle CRC
|
||||
uint crc1 = crc32.Combine(crcA, crcB, (stridecount - 2) * stride * 2);
|
||||
// calculate offsettedCRC as sum of 0xffffffff, crc0, crc1, crc2;
|
||||
return crc32.Combine(
|
||||
0xffffffff,
|
||||
crc32.Combine(
|
||||
crc32.Combine(
|
||||
crc0,
|
||||
crc1,
|
||||
(stridecount - 2) * stride * 2),
|
||||
crc2,
|
||||
(stride - 2 * actualOffset) * 2),
|
||||
stridecount * stride * 2) ^ 0xffffffff;
|
||||
}
|
||||
}
|
||||
|
||||
public unsafe bool FindOffset(int npar2, byte[] parity2, int pos, uint expectedCRC, out int actualOffset, out bool hasErrors)
|
||||
{
|
||||
if (npar2 != npar)
|
||||
throw new Exception("npar mismatch");
|
||||
if (!verify)
|
||||
throw new Exception("verify was not enabled");
|
||||
if (sampleCount != finalSampleCount)
|
||||
throw new Exception("sampleCount != finalSampleCount");
|
||||
if (len != stride * npar * 2)
|
||||
throw new Exception("wrong size");
|
||||
|
||||
sigma = new int[stride, npar / 2 + 2];
|
||||
omega = new int[stride, npar / 2 + 1];
|
||||
errpos = new int[stride, npar / 2];
|
||||
erroff = new int[stride, npar / 2];
|
||||
errors = new int[stride];
|
||||
|
||||
actualOffset = 0;
|
||||
|
||||
// find offset
|
||||
fixed (byte* par2ptr = &parity2[pos])
|
||||
{
|
||||
ushort* par2 = (ushort*)par2ptr;
|
||||
int* syn = stackalloc int[npar];
|
||||
int* _sigma = stackalloc int[npar];
|
||||
int* _omega = stackalloc int[npar];
|
||||
int* _errpos = stackalloc int[npar];
|
||||
int bestErrors = npar;
|
||||
bool foundOffset = false;
|
||||
|
||||
// We can only use offset if Abs(offset * 2) < stride,
|
||||
// else we might need to add/remove more than one sample
|
||||
// from syndrome calculations, and that would be too difficult
|
||||
// and will probably require longer leadin/leadout.
|
||||
for (int offset = 1 - stride / 2; offset < stride / 2; offset++)
|
||||
for (int allowed_errors = 0; allowed_errors < npar / 2 && !foundOffset; allowed_errors++)
|
||||
{
|
||||
int err = 0;
|
||||
int part2 = 0;
|
||||
ushort* wr = par2 + part2 * npar;
|
||||
|
||||
for (int i = 0; i < npar; i++)
|
||||
// We can only use offset if Abs(offset * 2) < stride,
|
||||
// else we might need to add/remove more than one sample
|
||||
// from syndrome calculations, and that would be too difficult
|
||||
// and will probably require longer leadin/leadout.
|
||||
for (int offset = 1 - stride / 2; offset < stride / 2; offset++)
|
||||
{
|
||||
int part = (stride - 1) % stride;
|
||||
int part2 = (part + offset * 2 + stride) % stride;
|
||||
ushort* wr = par2 + part2 * npar;
|
||||
int err = 0;
|
||||
int part = (part2 + stride - offset * 2) % stride;
|
||||
int* syn = stackalloc int[npar];
|
||||
|
||||
syn[i] = syndrome[part, i];
|
||||
|
||||
// offset < 0
|
||||
if (part < -offset * 2)
|
||||
for (int i = 0; i < npar; i++)
|
||||
{
|
||||
syn[i] ^= galois.mulExp(leadin[stride + part], (i * (stridecount - 1)) % galois.Max);
|
||||
syn[i] = leadout[laststride - part - 1] ^ galois.mulExp(syn[i], i);
|
||||
}
|
||||
// offset > 0
|
||||
if (part >= stride - offset * 2)
|
||||
{
|
||||
syn[i] = galois.divExp(syn[i] ^ leadout[laststride + stride - part - 1], i);
|
||||
syn[i] ^= galois.mulExp(leadin[part], (i * (stridecount - 1)) % galois.Max);
|
||||
}
|
||||
int synI = syndrome[part, i];
|
||||
|
||||
for (int j = 0; j < npar; j++)
|
||||
syn[i] = wr[j] ^ galois.mulExp(syn[i], i);
|
||||
// offset < 0
|
||||
if (part < -offset * 2)
|
||||
{
|
||||
synI ^= galois.mulExp(leadin[stride + part], (i * (stridecount - 1)) % galois.Max);
|
||||
synI = leadout[laststride - part - 1] ^ galois.mulExp(synI, i);
|
||||
}
|
||||
// offset > 0
|
||||
if (part >= stride - offset * 2)
|
||||
{
|
||||
synI = galois.divExp(synI ^ leadout[laststride + stride - part - 1], i);
|
||||
synI ^= galois.mulExp(leadin[part], (i * (stridecount - 1)) % galois.Max);
|
||||
}
|
||||
|
||||
err |= syn[i];
|
||||
}
|
||||
if (err == 0)
|
||||
{
|
||||
actualOffset = offset;
|
||||
bestErrors = 0;
|
||||
break;
|
||||
}
|
||||
int err_count = rs.calcSigmaMBM(_sigma, _omega, syn);
|
||||
if (err_count > 0 && rs.chienSearch(_errpos, stridecount + npar, err_count, _sigma))
|
||||
{
|
||||
if (err_count < bestErrors)
|
||||
for (int j = 0; j < npar; j++)
|
||||
synI = wr[j] ^ galois.mulExp(synI, i);
|
||||
|
||||
syn[i] = synI;
|
||||
err |= synI;
|
||||
}
|
||||
int err_count = err == 0 ? 0 : rs.calcSigmaMBM(_sigma, syn);
|
||||
if (err_count == allowed_errors && (err_count == 0 || rs.chienSearch(_errpos, stridecount + npar, err_count, _sigma)))
|
||||
{
|
||||
actualOffset = offset;
|
||||
bestErrors = err_count;
|
||||
hasErrors = err_count != 0 || OffsettedCRC(offset) != expectedCRC;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
actualOffset = 0;
|
||||
hasErrors = true;
|
||||
return false;
|
||||
}
|
||||
|
||||
public unsafe CDRepairFix VerifyParity(int npar2, byte[] parity2, int pos, int len, int actualOffset)
|
||||
{
|
||||
if (len != stride * npar * 2)
|
||||
throw new Exception("wrong size");
|
||||
|
||||
CDRepairFix fix = new CDRepairFix(this);
|
||||
fix.actualOffset = actualOffset;
|
||||
fix.correctableErrors = 0;
|
||||
fix.hasErrors = false;
|
||||
fix.canRecover = true;
|
||||
|
||||
fix.sigma = new int[stride, npar / 2 + 2];
|
||||
fix.omega = new int[stride, npar / 2 + 1];
|
||||
fix.errpos = new int[stride, npar / 2];
|
||||
fix.erroff = new int[stride, npar / 2];
|
||||
fix.errors = new int[stride];
|
||||
|
||||
hasErrors = false;
|
||||
fixed (byte* par = &parity2[pos])
|
||||
fixed (ushort* exp = galois.ExpTbl, log = galois.LogTbl)
|
||||
{
|
||||
int* syn = stackalloc int[npar];
|
||||
int offset = actualOffset;
|
||||
int offset = fix.actualOffset;
|
||||
|
||||
for (int part = 0; part < stride; part++)
|
||||
{
|
||||
@@ -400,25 +560,27 @@ namespace CUETools.CDRepair
|
||||
|
||||
if (err != 0)
|
||||
{
|
||||
hasErrors = true;
|
||||
fixed (int* s = &sigma[part, 0], o = &omega[part, 0], e = &errpos[part, 0], f = &erroff[part, 0])
|
||||
fixed (int* s = &fix.sigma[part, 0], o = &fix.omega[part, 0], e = &fix.errpos[part, 0], f = &fix.erroff[part, 0])
|
||||
{
|
||||
errors[part] = rs.calcSigmaMBM(s, o, syn);
|
||||
if (errors[part] <= 0 || !rs.chienSearch(e, stridecount + npar, errors[part], s))
|
||||
canRecover = false;
|
||||
fix.errors[part] = rs.calcSigmaMBM(s, syn);
|
||||
fix.hasErrors = true;
|
||||
fix.correctableErrors += fix.errors[part];
|
||||
if (fix.errors[part] <= 0 || !rs.chienSearch(e, stridecount + npar, fix.errors[part], s))
|
||||
fix.canRecover = false;
|
||||
else
|
||||
{
|
||||
for (int i = 0; i < errors[part]; i++)
|
||||
galois.mulPoly(o, s, syn, npar / 2 + 1, npar, npar);
|
||||
for (int i = 0; i < fix.errors[part]; i++)
|
||||
f[i] = galois.toPos(stridecount + npar, e[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
errors[part] = 0;
|
||||
fix.errors[part] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return !hasErrors;
|
||||
return fix;
|
||||
}
|
||||
|
||||
public byte[] Parity
|
||||
@@ -428,6 +590,55 @@ namespace CUETools.CDRepair
|
||||
return parity;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class CDRepairFix : CDRepair
|
||||
{
|
||||
internal bool hasErrors = false, canRecover = true;
|
||||
internal int actualOffset = 0;
|
||||
internal int correctableErrors = 0;
|
||||
internal int[,] sigma;
|
||||
internal int[,] omega;
|
||||
internal int[,] errpos;
|
||||
internal int[,] erroff;
|
||||
internal int[] errors;
|
||||
|
||||
public CDRepairFix(CDRepairEncode decode)
|
||||
: base(decode)
|
||||
{
|
||||
}
|
||||
|
||||
new public unsafe void Write(AudioBuffer sampleBuffer)
|
||||
{
|
||||
sampleBuffer.Prepare(this);
|
||||
|
||||
if ((sampleBuffer.ByteLength & 1) != 0)
|
||||
throw new Exception("never happens");
|
||||
|
||||
int firstPos = Math.Max(0, stride - sampleCount * 2 - ActualOffset * 2);
|
||||
int lastPos = Math.Min(sampleBuffer.ByteLength >> 1, (finalSampleCount - sampleCount) * 2 - laststride - ActualOffset * 2);
|
||||
|
||||
fixed (byte* bytes = sampleBuffer.Bytes)
|
||||
fixed (uint* t = crc32.table)
|
||||
{
|
||||
ushort* data = (ushort*)bytes;
|
||||
for (int pos = firstPos; pos < lastPos; pos++)
|
||||
{
|
||||
int part = (sampleCount * 2 + pos) % stride;
|
||||
int nerrors = errors[part];
|
||||
fixed (int* s = &sigma[part, 0], o = &omega[part, 0], f = &erroff[part, 0])
|
||||
for (int i = 0; i < nerrors; i++)
|
||||
if (f[i] == (sampleCount * 2 + ActualOffset * 2 + pos) / stride - 1)
|
||||
data[pos] ^= (ushort)rs.doForney(nerrors, errpos[part, i], s, o);
|
||||
|
||||
ushort dd = data[pos];
|
||||
|
||||
crc = (crc >> 8) ^ t[(byte)(crc ^ dd)];
|
||||
crc = (crc >> 8) ^ t[(byte)(crc ^ (dd >> 8))];
|
||||
}
|
||||
}
|
||||
sampleCount += sampleBuffer.Length;
|
||||
}
|
||||
|
||||
public bool HasErrors
|
||||
{
|
||||
@@ -445,6 +656,14 @@ namespace CUETools.CDRepair
|
||||
}
|
||||
}
|
||||
|
||||
public int CorrectableErrors
|
||||
{
|
||||
get
|
||||
{
|
||||
return correctableErrors;
|
||||
}
|
||||
}
|
||||
|
||||
public int ActualOffset
|
||||
{
|
||||
get
|
||||
@@ -453,47 +672,4 @@ namespace CUETools.CDRepair
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class CDRepairFix : CDRepair
|
||||
{
|
||||
CDRepairEncode decode;
|
||||
|
||||
public CDRepairFix(CDRepairEncode decode)
|
||||
: base(decode)
|
||||
{
|
||||
this.decode = decode;
|
||||
}
|
||||
|
||||
new public unsafe void Write(AudioBuffer sampleBuffer)
|
||||
{
|
||||
sampleBuffer.Prepare(this);
|
||||
|
||||
if ((sampleBuffer.ByteLength & 1) != 0)
|
||||
throw new Exception("never happens");
|
||||
|
||||
int firstPos = Math.Max(0, stride - sampleCount * 2 - decode.ActualOffset * 2);
|
||||
int lastPos = Math.Min(sampleBuffer.ByteLength >> 1, (finalSampleCount - sampleCount) * 2 - laststride - decode.ActualOffset * 2);
|
||||
|
||||
fixed (byte* bytes = sampleBuffer.Bytes)
|
||||
fixed (uint* t = crc32.table)
|
||||
{
|
||||
ushort* data = (ushort*)bytes;
|
||||
for (int pos = firstPos; pos < lastPos; pos++)
|
||||
{
|
||||
int part = (sampleCount * 2 + pos) % stride;
|
||||
int errors = decode.errors[part];
|
||||
fixed (int* s = &decode.sigma[part, 0], o = &decode.omega[part, 0], f = &decode.erroff[part, 0])
|
||||
for (int i = 0; i < errors; i++)
|
||||
if (f[i] == (sampleCount * 2 + decode.ActualOffset * 2 + pos) / stride - 1)
|
||||
data[pos] ^= (ushort)rs.doForney(errors, decode.errpos[part, i], s, o);
|
||||
|
||||
ushort dd = data[pos];
|
||||
|
||||
crc = (crc >> 8) ^ t[(byte)(crc ^ dd)];
|
||||
crc = (crc >> 8) ^ t[(byte)(crc ^ (dd >> 8))];
|
||||
}
|
||||
}
|
||||
sampleCount += sampleBuffer.Length;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Management" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
||||
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Management;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using CUETools.CDImage;
|
||||
@@ -17,17 +18,22 @@ namespace CUETools.CTDB
|
||||
private CDImageLayout toc;
|
||||
private HttpStatusCode accResult;
|
||||
private string id;
|
||||
private string subResult;
|
||||
private byte[] contents;
|
||||
private int pos;
|
||||
private int length;
|
||||
private int confidence;
|
||||
private int total;
|
||||
List<DBEntry> entries = new List<DBEntry>();
|
||||
DBEntry selectedEntry;
|
||||
IWebProxy proxy;
|
||||
HttpUploadHelper uploadHelper;
|
||||
|
||||
public CUEToolsDB(CDImageLayout toc)
|
||||
public CUEToolsDB(CDImageLayout toc, IWebProxy proxy)
|
||||
{
|
||||
this.toc = toc;
|
||||
this.length = (int)toc.AudioLength * 588;
|
||||
this.proxy = proxy;
|
||||
this.uploadHelper = new HttpUploadHelper();
|
||||
}
|
||||
|
||||
public void ContactDB(string id)
|
||||
@@ -51,7 +57,7 @@ namespace CUETools.CTDB
|
||||
|
||||
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
|
||||
req.Method = "GET";
|
||||
req.Proxy = WebRequest.GetSystemWebProxy();
|
||||
req.Proxy = proxy;
|
||||
|
||||
try
|
||||
{
|
||||
@@ -76,6 +82,8 @@ namespace CUETools.CTDB
|
||||
}
|
||||
}
|
||||
Parse();
|
||||
if (entries.Count == 0)
|
||||
accResult = HttpStatusCode.NoContent;
|
||||
}
|
||||
catch (WebException ex)
|
||||
{
|
||||
@@ -86,22 +94,23 @@ namespace CUETools.CTDB
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Database entry format:
|
||||
/// 'CTDB' version(0x00000100) size
|
||||
/// 'HEAD' version(0x00000100) size disc-count total-submissions
|
||||
/// 'DISC' version(0x00000100) size
|
||||
/// 'TOC ' version(0x00000100) size track-count preGap
|
||||
/// 'TRAK' ersion(0x00000100) size flags(1==isAudio) length(frames)
|
||||
/// .... track-count
|
||||
/// 'ARDB' version(0x00000100) size pressings-count
|
||||
/// 'ARCD' version(0x00000100) size CRC1 ... CRCN
|
||||
/// .... pressings-count
|
||||
/// 'PAR8' version(0x00000100) size parity-data
|
||||
/// 'CONF' version(0x00000100) size confidence
|
||||
/// 'CRC ' version(0x00000100) size CRC32 min-offset max-offset ...
|
||||
/// .... disc-count
|
||||
/// </summary>
|
||||
static string cpuInfo = null;
|
||||
|
||||
public static string GetCPUID()
|
||||
{
|
||||
if (cpuInfo == null)
|
||||
{
|
||||
ManagementClass mc = new ManagementClass("win32_processor");
|
||||
foreach (ManagementObject mo in mc.GetInstances())
|
||||
{
|
||||
//Get only the first CPU's ID
|
||||
cpuInfo = mo.Properties["processorID"].Value.ToString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
return cpuInfo ?? "unknown";
|
||||
}
|
||||
|
||||
public string Submit(int confidence, int total)
|
||||
{
|
||||
if (id == null)
|
||||
@@ -120,75 +129,72 @@ namespace CUETools.CTDB
|
||||
|
||||
UploadFile[] files = new UploadFile[1];
|
||||
MemoryStream newcontents = new MemoryStream();
|
||||
using (DBHDR CTDB = new DBHDR(newcontents, "CTDB", 0x100))
|
||||
using (DBHDR FTYP = new DBHDR(newcontents, "ftyp"))
|
||||
FTYP.Write("CTDB");
|
||||
using (DBHDR CTDB = new DBHDR(newcontents, "CTDB"))
|
||||
{
|
||||
using (DBHDR HEAD = new DBHDR(newcontents, "HEAD", 0x100))
|
||||
using (DBHDR HEAD = CTDB.HDR("HEAD"))
|
||||
{
|
||||
DBHDR.WriteInt(newcontents, 1); // disc count
|
||||
DBHDR.WriteInt(newcontents, total);
|
||||
HEAD.Write(0x100); // version
|
||||
HEAD.Write(1); // disc count
|
||||
HEAD.Write(total); // total submissions
|
||||
HEAD.Write(DateTime.Now); // date
|
||||
}
|
||||
using (DBHDR DISC = new DBHDR(newcontents, "DISC", 0x100))
|
||||
using (DBHDR DISC = CTDB.HDR("DISC"))
|
||||
{
|
||||
using (DBHDR TOC = new DBHDR(newcontents, "TOC ", 0x100))
|
||||
using (DBHDR TOC = DISC.HDR("TOC "))
|
||||
{
|
||||
DBHDR.WriteInt(newcontents, toc.TrackCount);
|
||||
DBHDR.WriteInt(newcontents, toc.Pregap);
|
||||
using (DBHDR INFO = TOC.HDR("INFO"))
|
||||
{
|
||||
INFO.Write(toc.TrackCount);
|
||||
INFO.Write(toc.Pregap);
|
||||
}
|
||||
for (int i = 1; i <= toc.TrackCount; i++)
|
||||
using (DBHDR TRAK = new DBHDR(newcontents, "TRAK", 0x100))
|
||||
using (DBHDR TRAK = TOC.HDR("TRAK"))
|
||||
{
|
||||
DBHDR.WriteInt(newcontents, toc[i].IsAudio ? 1 : 0);
|
||||
DBHDR.WriteInt(newcontents, toc[i].Length);
|
||||
TRAK.Write(toc[i].IsAudio ? 1 : 0);
|
||||
TRAK.Write(toc[i].Length);
|
||||
}
|
||||
}
|
||||
using (DBHDR PAR8 = new DBHDR(newcontents, "CONF", 0x100))
|
||||
{
|
||||
DBHDR.WriteInt(newcontents, confidence);
|
||||
}
|
||||
using (DBHDR PAR8 = new DBHDR(newcontents, "CRC ", 0x100))
|
||||
{
|
||||
DBHDR.WriteInt(newcontents, verify.CRC);
|
||||
}
|
||||
using (DBHDR PAR8 = new DBHDR(newcontents, "PAR8", 0x100))
|
||||
{
|
||||
newcontents.Write(verify.Parity, 0, verify.Parity.Length);
|
||||
}
|
||||
using (DBHDR USER = DISC.HDR("USER")) USER.Write(GetCPUID());
|
||||
using (DBHDR TOOL = DISC.HDR("TOOL")) TOOL.Write("CUETools 205");
|
||||
using (DBHDR DATE = DISC.HDR("DATE")) DATE.Write(DateTime.Now);
|
||||
using (DBHDR CONF = DISC.HDR("CONF")) CONF.Write(confidence);
|
||||
using (DBHDR NPAR = DISC.HDR("NPAR")) NPAR.Write(verify.NPAR);
|
||||
using (DBHDR CRC_ = DISC.HDR("CRC ")) CRC_.Write(verify.CRC);
|
||||
using (DBHDR PAR_ = DISC.HDR("PAR ")) PAR_.Write(verify.Parity);
|
||||
}
|
||||
}
|
||||
newcontents.Position = 0;
|
||||
files[0] = new UploadFile(newcontents, "uploadedfile", "data.bin", "image/binary");
|
||||
HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://db.cuetools.net/uploader.php");
|
||||
req.Proxy = WebRequest.GetSystemWebProxy();
|
||||
req.Proxy = proxy;
|
||||
req.UserAgent = "CUETools 205";
|
||||
NameValueCollection form = new NameValueCollection();
|
||||
form.Add("id", String.Format("{0:d3}-{1:x8}-{2:x8}-{3:x8}", toc.AudioTracks, discId1, discId2, cddbDiscId));
|
||||
HttpWebResponse resp = HttpUploadHelper.Upload(req, files, form);
|
||||
string errtext;
|
||||
HttpWebResponse resp = uploadHelper.Upload(req, files, form);
|
||||
using (Stream s = resp.GetResponseStream())
|
||||
using (StreamReader sr = new StreamReader(s))
|
||||
{
|
||||
errtext = sr.ReadToEnd();
|
||||
}
|
||||
return errtext;
|
||||
subResult = sr.ReadToEnd();
|
||||
return subResult;
|
||||
}
|
||||
|
||||
private string ReadHDR(out int end)
|
||||
{
|
||||
int size = ReadInt();
|
||||
string res = Encoding.ASCII.GetString(contents, pos, 4);
|
||||
pos += 4;
|
||||
int version = ReadInt();
|
||||
if (version >= 0x200)
|
||||
throw new Exception("unsupported CTDB version");
|
||||
int size = ReadInt();
|
||||
end = pos + size;
|
||||
end = pos + size - 8;
|
||||
return res;
|
||||
}
|
||||
|
||||
private int ReadInt()
|
||||
{
|
||||
int value =
|
||||
(contents[pos] +
|
||||
(contents[pos + 1] << 8) +
|
||||
(contents[pos + 2] << 16) +
|
||||
(contents[pos + 3] << 24));
|
||||
(contents[pos + 3] +
|
||||
(contents[pos + 2] << 8) +
|
||||
(contents[pos + 1] << 16) +
|
||||
(contents[pos + 0] << 24));
|
||||
pos += 4;
|
||||
return value;
|
||||
}
|
||||
@@ -196,10 +202,10 @@ namespace CUETools.CTDB
|
||||
private uint ReadUInt()
|
||||
{
|
||||
uint value =
|
||||
((uint)contents[pos] +
|
||||
((uint)contents[pos + 1] << 8) +
|
||||
((uint)contents[pos + 2] << 16) +
|
||||
((uint)contents[pos + 3] << 24));
|
||||
((uint)contents[pos + 3] +
|
||||
((uint)contents[pos + 2] << 8) +
|
||||
((uint)contents[pos + 1] << 16) +
|
||||
((uint)contents[pos + 0] << 24));
|
||||
pos += 4;
|
||||
return value;
|
||||
}
|
||||
@@ -212,12 +218,21 @@ namespace CUETools.CTDB
|
||||
pos = 0;
|
||||
int end;
|
||||
string hdr = ReadHDR(out end);
|
||||
if (hdr != "CTDB") throw new Exception("invalid CTDB file");
|
||||
if (end != contents.Length) throw new Exception("incomplete CTDB file");
|
||||
uint magic = ReadUInt();
|
||||
if (hdr != "ftyp" || magic != 0x43544442 || end != pos)
|
||||
throw new Exception("invalid CTDB file");
|
||||
hdr = ReadHDR(out end);
|
||||
if (hdr != "HEAD") throw new Exception("invalid CTDB file");
|
||||
if (hdr != "CTDB" || end != contents.Length)
|
||||
throw new Exception("invalid CTDB file");
|
||||
hdr = ReadHDR(out end);
|
||||
if (hdr != "HEAD")
|
||||
throw new Exception("invalid CTDB file");
|
||||
uint version = ReadUInt();
|
||||
int discCount = ReadInt();
|
||||
total = ReadInt();
|
||||
if (discCount <= 0 || version >= 0x200)
|
||||
throw new Exception("invalid CTDB file");
|
||||
// date
|
||||
pos = end;
|
||||
while (pos < contents.Length)
|
||||
{
|
||||
@@ -229,11 +244,11 @@ namespace CUETools.CTDB
|
||||
}
|
||||
int endDisc = end;
|
||||
uint crc = 0;
|
||||
int parPos = 0, parLen = 0, conf = 0;
|
||||
int parPos = 0, parLen = 0, conf = 0, npar = 0;
|
||||
while (pos < endDisc)
|
||||
{
|
||||
hdr = ReadHDR(out end);
|
||||
if (hdr == "PAR8")
|
||||
if (hdr == "PAR ")
|
||||
{
|
||||
parPos = pos;
|
||||
parLen = end - pos;
|
||||
@@ -242,10 +257,13 @@ namespace CUETools.CTDB
|
||||
crc = ReadUInt();
|
||||
else if (hdr == "CONF")
|
||||
conf = ReadInt();
|
||||
else if (hdr == "NPAR")
|
||||
npar = ReadInt();
|
||||
pos = end;
|
||||
}
|
||||
if (parPos != 0)
|
||||
entries.Add(new DBEntry(parPos, parLen, conf, crc));
|
||||
if (parPos != 0 && npar >= 2 && npar <= 16 && conf >= 0)
|
||||
//if (parPos != 0 && npar >= 2 && npar <= 16 && conf != 0)
|
||||
entries.Add(new DBEntry(parPos, parLen, conf, npar, crc));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -253,16 +271,22 @@ namespace CUETools.CTDB
|
||||
{
|
||||
foreach (DBEntry entry in entries)
|
||||
{
|
||||
verify.VerifyParity(contents, entry.pos, entry.len);
|
||||
if (!verify.HasErrors || verify.CanRecover)
|
||||
confidence = entry.conf;
|
||||
break;
|
||||
if (!verify.FindOffset(entry.npar, contents, entry.pos, entry.crc, out entry.offset, out entry.hasErrors))
|
||||
entry.canRecover = false;
|
||||
else if (entry.hasErrors)
|
||||
{
|
||||
entry.repair = verify.VerifyParity(entry.npar, contents, entry.pos, entry.len, entry.offset);
|
||||
entry.canRecover = entry.repair.CanRecover;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Init()
|
||||
public void Init(bool encode)
|
||||
{
|
||||
verify = new CDRepairEncode(length, 10 * 588 * 2, 8, accResult == HttpStatusCode.OK);
|
||||
int npar = 8;
|
||||
foreach (DBEntry entry in entries)
|
||||
npar = Math.Max(npar, entry.npar);
|
||||
verify = new CDRepairEncode(length, 10 * 588 * 2, npar, entries.Count > 0, encode);
|
||||
}
|
||||
|
||||
public int Total
|
||||
@@ -299,35 +323,95 @@ namespace CUETools.CTDB
|
||||
}
|
||||
}
|
||||
|
||||
public DBEntry SelectedEntry
|
||||
{
|
||||
set
|
||||
{
|
||||
selectedEntry = value;
|
||||
}
|
||||
get
|
||||
{
|
||||
return selectedEntry;
|
||||
}
|
||||
}
|
||||
|
||||
public string Status
|
||||
{
|
||||
get
|
||||
{
|
||||
//sw.WriteLine("CUETools DB CRC: {0:x8}", Verify.CRC);
|
||||
string res = null;
|
||||
if (DBStatus != null)
|
||||
return DBStatus;
|
||||
if (!verify.HasErrors)
|
||||
return string.Format("verified OK, confidence {0}/{1}", confidence, total);
|
||||
if (verify.CanRecover)
|
||||
return string.Format("contains correctable errors, confidence {0}/{1}", confidence, total);
|
||||
return "could not be verified";
|
||||
res = DBStatus;
|
||||
else
|
||||
{
|
||||
DBEntry popular = null;
|
||||
foreach (DBEntry entry in entries)
|
||||
if (!entry.hasErrors || entry.canRecover)
|
||||
if (popular == null || entry.conf > popular.conf)
|
||||
popular = entry;
|
||||
if (popular != null)
|
||||
res = popular.Status;
|
||||
foreach (DBEntry entry in entries)
|
||||
if (entry != popular && (!entry.hasErrors || entry.canRecover))
|
||||
res += ", or " + entry.Status;
|
||||
if (res == null)
|
||||
res = "could not be verified";
|
||||
}
|
||||
if (subResult != null)
|
||||
res += ", " + subResult;
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
public IEnumerable<DBEntry> Entries
|
||||
{
|
||||
get
|
||||
{
|
||||
return entries;
|
||||
}
|
||||
}
|
||||
|
||||
public HttpUploadHelper UploadHelper
|
||||
{
|
||||
get
|
||||
{
|
||||
return uploadHelper;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal class DBEntry
|
||||
public class DBEntry
|
||||
{
|
||||
public int pos;
|
||||
public int len;
|
||||
public int conf;
|
||||
public int npar;
|
||||
public int offset;
|
||||
public uint crc;
|
||||
public bool hasErrors;
|
||||
public bool canRecover;
|
||||
public CDRepairFix repair;
|
||||
|
||||
public DBEntry(int pos, int len, int conf, uint crc)
|
||||
public DBEntry(int pos, int len, int conf, int npar, uint crc)
|
||||
{
|
||||
this.pos = pos;
|
||||
this.len = len;
|
||||
this.conf = conf;
|
||||
this.crc = crc;
|
||||
this.npar = npar;
|
||||
}
|
||||
|
||||
public string Status
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!hasErrors)
|
||||
return string.Format("verified OK, confidence {0}", conf);
|
||||
if (canRecover)
|
||||
return string.Format("contains {1} correctable errors, confidence {0}", conf, repair.CorrectableErrors);
|
||||
return "could not be verified";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -336,41 +420,74 @@ namespace CUETools.CTDB
|
||||
private long lenOffs;
|
||||
private MemoryStream stream;
|
||||
|
||||
public DBHDR(MemoryStream stream, string name, int version)
|
||||
public DBHDR(MemoryStream stream, string name)
|
||||
{
|
||||
this.stream = stream;
|
||||
stream.Write(Encoding.ASCII.GetBytes(name), 0, 4);
|
||||
WriteInt(stream, version);
|
||||
lenOffs = stream.Position;
|
||||
WriteInt(stream, 0);
|
||||
Write(0);
|
||||
Write(name);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
long fin = stream.Position;
|
||||
stream.Position = lenOffs;
|
||||
WriteInt(stream, (int)(fin - lenOffs - 4));
|
||||
Write((int)(fin - lenOffs));
|
||||
stream.Position = fin;
|
||||
}
|
||||
|
||||
public static void WriteInt(MemoryStream stream, int value)
|
||||
public void Write(int value)
|
||||
{
|
||||
byte[] temp = new byte[4];
|
||||
temp[0] = (byte)(value & 0xff);
|
||||
temp[1] = (byte)((value >> 8) & 0xff);
|
||||
temp[2] = (byte)((value >> 16) & 0xff);
|
||||
temp[3] = (byte)((value >> 24) & 0xff);
|
||||
stream.Write(temp, 0, 4);
|
||||
temp[3] = (byte)(value & 0xff);
|
||||
temp[2] = (byte)((value >> 8) & 0xff);
|
||||
temp[1] = (byte)((value >> 16) & 0xff);
|
||||
temp[0] = (byte)((value >> 24) & 0xff);
|
||||
Write(temp);
|
||||
}
|
||||
|
||||
public static void WriteInt(MemoryStream stream, uint value)
|
||||
public void Write(uint value)
|
||||
{
|
||||
byte[] temp = new byte[4];
|
||||
temp[0] = (byte)(value & 0xff);
|
||||
temp[1] = (byte)((value >> 8) & 0xff);
|
||||
temp[2] = (byte)((value >> 16) & 0xff);
|
||||
temp[3] = (byte)((value >> 24) & 0xff);
|
||||
stream.Write(temp, 0, 4);
|
||||
temp[3] = (byte)(value & 0xff);
|
||||
temp[2] = (byte)((value >> 8) & 0xff);
|
||||
temp[1] = (byte)((value >> 16) & 0xff);
|
||||
temp[0] = (byte)((value >> 24) & 0xff);
|
||||
Write(temp);
|
||||
}
|
||||
|
||||
public void Write(long value)
|
||||
{
|
||||
byte[] temp = new byte[8];
|
||||
temp[7] = (byte)((value) & 0xff);
|
||||
temp[6] = (byte)((value >> 8) & 0xff);
|
||||
temp[5] = (byte)((value >> 16) & 0xff);
|
||||
temp[4] = (byte)((value >> 24) & 0xff);
|
||||
temp[3] = (byte)((value >> 32) & 0xff);
|
||||
temp[2] = (byte)((value >> 40) & 0xff);
|
||||
temp[1] = (byte)((value >> 48) & 0xff);
|
||||
temp[0] = (byte)((value >> 56) & 0xff);
|
||||
Write(temp);
|
||||
}
|
||||
|
||||
public void Write(string value)
|
||||
{
|
||||
Write(Encoding.UTF8.GetBytes(value));
|
||||
}
|
||||
|
||||
public void Write(DateTime value)
|
||||
{
|
||||
Write(value.ToFileTimeUtc());
|
||||
}
|
||||
|
||||
public void Write(byte[] value)
|
||||
{
|
||||
stream.Write(value, 0, value.Length);
|
||||
}
|
||||
|
||||
public DBHDR HDR(string name)
|
||||
{
|
||||
return new DBHDR(stream, name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,10 +15,12 @@ namespace Krystalware.UploadHelper
|
||||
{
|
||||
public class HttpUploadHelper
|
||||
{
|
||||
private HttpUploadHelper()
|
||||
public EventHandler<UploadProgressEventArgs> onProgress;
|
||||
|
||||
public HttpUploadHelper()
|
||||
{ }
|
||||
|
||||
public static string Upload(string url, UploadFile[] files, NameValueCollection form)
|
||||
public string Upload(string url, UploadFile[] files, NameValueCollection form)
|
||||
{
|
||||
HttpWebResponse resp = Upload((HttpWebRequest)WebRequest.Create(url), files, form);
|
||||
|
||||
@@ -29,7 +31,7 @@ namespace Krystalware.UploadHelper
|
||||
}
|
||||
}
|
||||
|
||||
public static HttpWebResponse Upload(HttpWebRequest req, UploadFile[] files, NameValueCollection form)
|
||||
public HttpWebResponse Upload(HttpWebRequest req, UploadFile[] files, NameValueCollection form)
|
||||
{
|
||||
List<MimePart> mimeParts = new List<MimePart>();
|
||||
|
||||
@@ -84,16 +86,25 @@ namespace Krystalware.UploadHelper
|
||||
|
||||
using (Stream s = req.GetRequestStream())
|
||||
{
|
||||
long pos = 0;
|
||||
foreach (MimePart part in mimeParts)
|
||||
{
|
||||
s.Write(part.Header, 0, part.Header.Length);
|
||||
pos += part.Header.Length;
|
||||
|
||||
while ((read = part.Data.Read(buffer, 0, buffer.Length)) > 0)
|
||||
s.Write(buffer, 0, read);
|
||||
while ((read = part.Data.Read(buffer, 0, buffer.Length)) > 0)
|
||||
{
|
||||
if (onProgress != null)
|
||||
onProgress(part,
|
||||
new UploadProgressEventArgs(req.RequestUri.AbsoluteUri, ((double)pos)/contentLength));
|
||||
s.Write(buffer, 0, read);
|
||||
pos += read;
|
||||
}
|
||||
|
||||
part.Data.Dispose();
|
||||
|
||||
s.Write(afterFile, 0, afterFile.Length);
|
||||
pos += afterFile.Length;
|
||||
}
|
||||
|
||||
s.Write(_footer, 0, _footer.Length);
|
||||
@@ -111,4 +122,16 @@ namespace Krystalware.UploadHelper
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class UploadProgressEventArgs: EventArgs
|
||||
{
|
||||
public string uri;
|
||||
public double percent;
|
||||
|
||||
public UploadProgressEventArgs(string uri, double percent)
|
||||
{
|
||||
this.uri = uri;
|
||||
this.percent = percent;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -43,6 +43,61 @@ function filesize_h($size, $dec = 1)
|
||||
return round($size, $dec) . ' ' . $sizes[$i];
|
||||
}
|
||||
|
||||
function BigEndian2Int($byte_word, $signed = false) {
|
||||
|
||||
$int_value = 0;
|
||||
$byte_wordlen = strlen($byte_word);
|
||||
|
||||
for ($i = 0; $i < $byte_wordlen; $i++) {
|
||||
$int_value += ord($byte_word{$i}) * pow(256, ($byte_wordlen - 1 - $i));
|
||||
}
|
||||
|
||||
if ($signed) {
|
||||
$sign_mask_bit = 0x80 << (8 * ($byte_wordlen - 1));
|
||||
if ($int_value & $sign_mask_bit) {
|
||||
$int_value = 0 - ($int_value & ($sign_mask_bit - 1));
|
||||
}
|
||||
}
|
||||
|
||||
return $int_value;
|
||||
}
|
||||
|
||||
function get_chunk_offset($fp, $offset, $filelen, $names, $namepos)
|
||||
{
|
||||
// echo $offset, ":", $filelen, ":", $names, ":", $namepos, ":", count($names), "<br>";
|
||||
if ($namepos >= count($names))
|
||||
return $offset;
|
||||
while ($offset < $filelen) {
|
||||
fseek($fp, $offset, SEEK_SET);
|
||||
$atom_header = fread($fp, 8);
|
||||
$atom_size = BigEndian2Int(substr($atom_header, 0, 4));
|
||||
$atom_name = substr($atom_header, 4, 4);
|
||||
// echo $atom_size, ":", $atom_name, ":", $names[$namepos], '<br>';
|
||||
if ($names[$namepos] == $atom_name)
|
||||
return get_chunk_offset($fp, $offset + 8, $filelen, $names, $namepos + 1);
|
||||
$offset += $atom_size;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
function chunk_offset($fp, $offset, $filelen, $path)
|
||||
{
|
||||
$names = explode(".", $path);
|
||||
return get_chunk_offset($fp, $offset, $filelen, $names, 0);
|
||||
}
|
||||
|
||||
function read_chunk($fp, $offset, $filelen, $path, $len)
|
||||
{
|
||||
$offset = chunk_offset($fp, $offset, $filelen, $path);
|
||||
if ($offset < 0) return;
|
||||
fseek($fp, $offset, SEEK_SET);
|
||||
return fread($fp, $len);
|
||||
}
|
||||
|
||||
function read_int($fp, $offset, $filelen, $path)
|
||||
{
|
||||
return BigEndian2Int(read_chunk($fp, $offset, $filelen, $path, 4));
|
||||
}
|
||||
|
||||
$file = $_FILES['uploadedfile'];
|
||||
|
||||
@@ -61,17 +116,43 @@ $file = $_FILES['uploadedfile'];
|
||||
echo "Error ", $file['error'];
|
||||
}
|
||||
|
||||
//if ($_SERVER['HTTP_USER_AGENT'] != "CUETools 205") {
|
||||
// echo "user agent ", $_SERVER['HTTP_USER_AGENT'], " is not allowed";
|
||||
// return;
|
||||
//}
|
||||
|
||||
$tmpname = $file['tmp_name'];
|
||||
$size = (@file_exists($tmpname)) ? filesize($tmpname) : 0;
|
||||
if ($size == 0) {
|
||||
echo "no file uploaded";
|
||||
return;
|
||||
}
|
||||
|
||||
$fp = fopen($tmpname, 'rb');
|
||||
$head = read_chunk($fp, 0, $size, 'CTDB.HEAD', 20);
|
||||
$npar = read_int($fp, 0, $size, 'CTDB.DISC.NPAR');
|
||||
$version = BigEndian2Int(substr($head,0,4));
|
||||
$disccount = BigEndian2Int(substr($head,4,4));
|
||||
$total = BigEndian2Int(substr($head,8,4));
|
||||
printf("npar=%d, disccount=%d, total=%d,", $npar, $disccount, $total);
|
||||
fclose($fp);
|
||||
|
||||
$id = $_POST['id'];
|
||||
$err = sscanf($id, "%d-%x-%x-%x", $tracks, $id1, $id2, $cddbid);
|
||||
$target_path = sprintf("parity/%x/%x/%x", $id1 & 15, ($id1 >> 4) & 15, ($id1 >> 8) & 15);
|
||||
$target_file = sprintf("%s/dBCT-%03d-%08x-%08x-%08x.bin", $target_path, $tracks, $id1, $id2, $cddbid);
|
||||
$err = sscanf($id, "%03d-%04x%04x-%04x%04x-%04x%04x", $tracks, $id1a, $id1b, $id2a, $id2b, $cddbida, $cddbidb);
|
||||
$parsedid = sprintf("%03d-%04x%04x-%04x%04x-%04x%04x", $tracks, $id1a, $id1b, $id2a, $id2b, $cddbida, $cddbidb);
|
||||
if ($id != $parsedid) {
|
||||
echo "bad id ", $id;
|
||||
return;
|
||||
}
|
||||
$target_path = sprintf("parity/%x/%x/%x", $id1b & 15, ($id1b >> 4) & 15, ($id1b >> 8) & 15);
|
||||
$target_file = sprintf("%s/dBCT-%s.bin", $target_path, $parsedid);
|
||||
|
||||
@mkdir($target_path, 0777, true);
|
||||
|
||||
if(move_uploaded_file($file['tmp_name'], $target_file)) {
|
||||
echo "The file ". $target_file. " has been uploaded";
|
||||
printf("%s has been uploaded", $parsedid);
|
||||
} else{
|
||||
echo "There was an error uploading the file, please try again!";
|
||||
echo "there was an error uploading the file, please try again!";
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
@@ -268,7 +268,7 @@ namespace CUETools { namespace Codecs { namespace FLAC {
|
||||
_sampleOffset += _bufferLength;
|
||||
}
|
||||
Int32 copyCount = Math::Min(samplesNeeded, SamplesInBuffer);
|
||||
Array::Copy(_sampleBuffer, _bufferOffset * pcm->ChannelCount, buff->Samples, buffOffset * pcm->ChannelCount, copyCount * pcm->ChannelCount);
|
||||
Array::Copy(_sampleBuffer->Bytes, _bufferOffset * pcm->BlockAlign, buff->Bytes, buffOffset * pcm->BlockAlign, copyCount * pcm->BlockAlign);
|
||||
samplesNeeded -= copyCount;
|
||||
buffOffset += copyCount;
|
||||
_bufferOffset += copyCount;
|
||||
@@ -288,7 +288,7 @@ namespace CUETools { namespace Codecs { namespace FLAC {
|
||||
FLAC__StreamDecoder *_decoder;
|
||||
Int64 _sampleCount, _sampleOffset;
|
||||
AudioPCMConfig^ pcm;
|
||||
array<Int32, 2>^ _sampleBuffer;
|
||||
AudioBuffer^ _sampleBuffer;
|
||||
array<unsigned char>^ _readBuffer;
|
||||
String^ _path;
|
||||
bool _decoderActive;
|
||||
@@ -318,23 +318,31 @@ namespace CUETools { namespace Codecs { namespace FLAC {
|
||||
throw gcnew Exception("Format changes within a file are not allowed.");
|
||||
}
|
||||
|
||||
if ((_sampleBuffer == nullptr) || (_sampleBuffer->GetLength(0) < sampleCount)) {
|
||||
_sampleBuffer = gcnew array<Int32, 2>(sampleCount, pcm->ChannelCount);
|
||||
if (_bufferOffset != 0)
|
||||
throw gcnew Exception("Internal buffer error.");
|
||||
|
||||
if (_sampleBuffer == nullptr || _sampleBuffer->Size < sampleCount)
|
||||
_sampleBuffer = gcnew AudioBuffer(pcm, sampleCount);
|
||||
_sampleBuffer->Length = sampleCount;
|
||||
|
||||
if (pcm->ChannelCount == 2)
|
||||
_sampleBuffer->Interlace(0, (int*)buffer[0], (int*)buffer[1], sampleCount);
|
||||
else
|
||||
{
|
||||
int _channelCount = pcm->ChannelCount;
|
||||
for (Int32 iChan = 0; iChan < _channelCount; iChan++)
|
||||
{
|
||||
interior_ptr<Int32> pMyBuffer = &_sampleBuffer->Samples[0, iChan];
|
||||
const FLAC__int32 *pFLACBuffer = buffer[iChan];
|
||||
const FLAC__int32 *pFLACBufferEnd = pFLACBuffer + sampleCount;
|
||||
|
||||
while (pFLACBuffer < pFLACBufferEnd) {
|
||||
*pMyBuffer = *pFLACBuffer;
|
||||
pMyBuffer += _channelCount;
|
||||
pFLACBuffer++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int _channelCount = pcm->ChannelCount;
|
||||
for (Int32 iChan = 0; iChan < _channelCount; iChan++) {
|
||||
interior_ptr<Int32> pMyBuffer = &_sampleBuffer[0, iChan];
|
||||
const FLAC__int32 *pFLACBuffer = buffer[iChan];
|
||||
const FLAC__int32 *pFLACBufferEnd = pFLACBuffer + sampleCount;
|
||||
|
||||
while (pFLACBuffer < pFLACBufferEnd) {
|
||||
*pMyBuffer = *pFLACBuffer;
|
||||
pMyBuffer += _channelCount;
|
||||
pFLACBuffer++;
|
||||
}
|
||||
}
|
||||
|
||||
_bufferLength = sampleCount;
|
||||
return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;
|
||||
}
|
||||
|
||||
@@ -211,17 +211,17 @@ namespace CUETools.Codecs.FLAKE
|
||||
}
|
||||
}
|
||||
|
||||
unsafe void interlace(int [,] buff, int offset, int count)
|
||||
unsafe void interlace(AudioBuffer buff, int offset, int count)
|
||||
{
|
||||
if (PCM.ChannelCount == 2)
|
||||
{
|
||||
fixed (int* res = &buff[offset, 0], src = &samplesBuffer[_samplesBufferOffset])
|
||||
AudioSamples.Interlace(res, src, src + Flake.MAX_BLOCKSIZE, count);
|
||||
fixed (int* src = &samplesBuffer[_samplesBufferOffset])
|
||||
buff.Interlace(offset, src, src + Flake.MAX_BLOCKSIZE, count);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (int ch = 0; ch < PCM.ChannelCount; ch++)
|
||||
fixed (int* res = &buff[offset, ch], src = &samplesBuffer[_samplesBufferOffset + ch * Flake.MAX_BLOCKSIZE])
|
||||
fixed (int* res = &buff.Samples[offset, ch], src = &samplesBuffer[_samplesBufferOffset + ch * Flake.MAX_BLOCKSIZE])
|
||||
{
|
||||
int* psrc = src;
|
||||
for (int i = 0; i < count; i++)
|
||||
@@ -241,7 +241,7 @@ namespace CUETools.Codecs.FLAKE
|
||||
{
|
||||
if (_samplesInBuffer > 0)
|
||||
{
|
||||
interlace(buff.Samples, offset, _samplesInBuffer);
|
||||
interlace(buff, offset, _samplesInBuffer);
|
||||
sampleCount -= _samplesInBuffer;
|
||||
offset += _samplesInBuffer;
|
||||
_samplesInBuffer = 0;
|
||||
@@ -261,7 +261,7 @@ namespace CUETools.Codecs.FLAKE
|
||||
_sampleOffset += _samplesInBuffer;
|
||||
}
|
||||
|
||||
interlace(buff.Samples, offset, sampleCount);
|
||||
interlace(buff, offset, sampleCount);
|
||||
_samplesInBuffer -= sampleCount;
|
||||
_samplesBufferOffset += sampleCount;
|
||||
if (_samplesInBuffer == 0)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.50727</ProductVersion>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
@@ -19,7 +19,7 @@
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<OutputPath>..\bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
|
||||
@@ -300,6 +300,8 @@ namespace CUETools.Codecs
|
||||
samples = _samples;
|
||||
dataInSamples = true;
|
||||
dataInBytes = false;
|
||||
if (length > size)
|
||||
throw new Exception("Invalid length");
|
||||
}
|
||||
|
||||
public void Prepare(byte[] _bytes, int _length)
|
||||
@@ -309,6 +311,8 @@ namespace CUETools.Codecs
|
||||
bytes = _bytes;
|
||||
dataInSamples = false;
|
||||
dataInBytes = true;
|
||||
if (length > size)
|
||||
throw new Exception("Invalid length");
|
||||
}
|
||||
|
||||
public unsafe void Prepare(AudioBuffer _src, int _offset, int _length)
|
||||
@@ -344,6 +348,18 @@ namespace CUETools.Codecs
|
||||
buffer.dataInBytes = false;
|
||||
}
|
||||
|
||||
unsafe public void Interlace(int pos, int* src1, int* src2, int n)
|
||||
{
|
||||
if (PCM.ChannelCount != 2 || PCM.BitsPerSample != 16)
|
||||
throw new Exception("");
|
||||
fixed (byte* bs = Bytes)
|
||||
{
|
||||
int* res = ((int*)bs) + pos;
|
||||
for (int i = n; i > 0; i--)
|
||||
*(res++) = (*(src1++) & 0xffff) ^ (*(src2++) << 16);
|
||||
}
|
||||
}
|
||||
|
||||
//public void Clear()
|
||||
//{
|
||||
// length = 0;
|
||||
@@ -1517,7 +1533,6 @@ namespace CUETools.Codecs
|
||||
public class UserDefinedReader : IAudioSource
|
||||
{
|
||||
string _path, _decoder, _decoderParams;
|
||||
private AudioPCMConfig pcm;
|
||||
Process _decoderProcess;
|
||||
WAVReader rdr;
|
||||
|
||||
@@ -1603,7 +1618,7 @@ namespace CUETools.Codecs
|
||||
get
|
||||
{
|
||||
Initialize();
|
||||
return pcm;
|
||||
return rdr.PCM;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1651,7 +1666,7 @@ namespace CUETools.Codecs
|
||||
while (_haveData && !_close)
|
||||
Monitor.Wait(this);
|
||||
if (_close)
|
||||
throw new Exception("Decompression aborted");
|
||||
break;
|
||||
AudioBuffer temp = _writeBuffer;
|
||||
_writeBuffer = _readBuffer;
|
||||
_readBuffer = temp;
|
||||
@@ -1659,6 +1674,7 @@ namespace CUETools.Codecs
|
||||
Monitor.Pulse(this);
|
||||
}
|
||||
} while (!done);
|
||||
_source.Close();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.50727</ProductVersion>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{14EE067E-C218-4625-9540-2361AB27C4A6}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
@@ -19,7 +19,7 @@
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<OutputPath>..\bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
|
||||
Binary file not shown.
@@ -61,7 +61,7 @@ namespace CUETools.Processor
|
||||
return new LossyWAVReader(lossySource, lwcdfSource);
|
||||
}
|
||||
|
||||
public static IAudioDest GetAudioDest(AudioEncoderType audioEncoderType, string path, AudioPCMConfig pcm, long finalSampleCount, int padding, string extension, CUEConfig config)
|
||||
public static IAudioDest GetAudioDest(AudioEncoderType audioEncoderType, string path, AudioPCMConfig pcm, long finalSampleCount, int padding, string extension, CUEConfig config)
|
||||
{
|
||||
IAudioDest dest;
|
||||
if (audioEncoderType == AudioEncoderType.NoAudio || extension == ".dummy")
|
||||
@@ -73,7 +73,7 @@ namespace CUETools.Processor
|
||||
CUEToolsFormat fmt;
|
||||
if (!extension.StartsWith(".") || !config.formats.TryGetValue(extension.Substring(1), out fmt))
|
||||
throw new Exception("Unsupported audio type: " + path);
|
||||
CUEToolsUDC encoder = audioEncoderType == AudioEncoderType.Lossless ? fmt.encoderLossless :
|
||||
CUEToolsUDC encoder = audioEncoderType == AudioEncoderType.Lossless ? fmt.encoderLossless :
|
||||
audioEncoderType == AudioEncoderType.Lossy ? fmt.encoderLossy :
|
||||
null;
|
||||
if (encoder == null)
|
||||
@@ -86,37 +86,39 @@ namespace CUETools.Processor
|
||||
if (o == null || !(o is IAudioDest))
|
||||
throw new Exception("Unsupported audio type: " + path + ": " + encoder.type.FullName);
|
||||
dest = o as IAudioDest;
|
||||
} else
|
||||
}
|
||||
else
|
||||
throw new Exception("Unsupported audio type: " + path);
|
||||
dest.CompressionLevel = encoder.DefaultModeIndex;
|
||||
dest.FinalSampleCount = finalSampleCount;
|
||||
switch (encoder.type.FullName)
|
||||
{
|
||||
case "CUETools.Codecs.ALAC.ALACWriter":
|
||||
dest.Options = string.Format("--padding-length {0}", padding);
|
||||
break;
|
||||
case "CUETools.Codecs.FLAKE.FlakeWriter":
|
||||
dest.Options = string.Format("--padding-length {0}", padding);
|
||||
break;
|
||||
case "CUETools.Codecs.FlaCuda.FlaCudaWriter":
|
||||
dest.Options = string.Format("{0}{1}--padding-length {2} --cpu-threads {3}",
|
||||
config.flaCudaVerify ? "--verify " : "",
|
||||
config.flaCudaGPUOnly ? "--gpu-only " : "",
|
||||
padding,
|
||||
config.FlaCudaThreads ? 1 : 0);
|
||||
break;
|
||||
case "CUETools.Codecs.FLAC.FLACWriter":
|
||||
dest.Options = string.Format("{0}{1}--padding-length {2}",
|
||||
config.disableAsm ? "--disable-asm " : "",
|
||||
config.flacVerify ? "--verify " : "",
|
||||
padding);
|
||||
break;
|
||||
case "CUETools.Codecs.WavPack.WavPackWriter":
|
||||
dest.Options = string.Format("{0}--extra-mode {1}",
|
||||
config.wvStoreMD5 ? "--md5 " : "",
|
||||
config.wvExtraMode);
|
||||
break;
|
||||
}
|
||||
if (encoder.type != null)
|
||||
switch (encoder.type.FullName)
|
||||
{
|
||||
case "CUETools.Codecs.ALAC.ALACWriter":
|
||||
dest.Options = string.Format("--padding-length {0}", padding);
|
||||
break;
|
||||
case "CUETools.Codecs.FLAKE.FlakeWriter":
|
||||
dest.Options = string.Format("--padding-length {0}", padding);
|
||||
break;
|
||||
case "CUETools.Codecs.FlaCuda.FlaCudaWriter":
|
||||
dest.Options = string.Format("{0}{1}--padding-length {2} --cpu-threads {3}",
|
||||
config.flaCudaVerify ? "--verify " : "",
|
||||
config.flaCudaGPUOnly ? "--gpu-only " : "",
|
||||
padding,
|
||||
config.FlaCudaThreads ? 1 : 0);
|
||||
break;
|
||||
case "CUETools.Codecs.FLAC.FLACWriter":
|
||||
dest.Options = string.Format("{0}{1}--padding-length {2}",
|
||||
config.disableAsm ? "--disable-asm " : "",
|
||||
config.flacVerify ? "--verify " : "",
|
||||
padding);
|
||||
break;
|
||||
case "CUETools.Codecs.WavPack.WavPackWriter":
|
||||
dest.Options = string.Format("{0}--extra-mode {1}",
|
||||
config.wvStoreMD5 ? "--md5 " : "",
|
||||
config.wvExtraMode);
|
||||
break;
|
||||
}
|
||||
return dest;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>..\bin\win32\Debug\</OutputPath>
|
||||
<OutputPath>..\bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
@@ -74,6 +74,10 @@
|
||||
<Compile Include="UserDefined.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\CUETools.CDRepair\CUETools.CDRepair.csproj">
|
||||
<Project>{C4869B37-EBB1-47BB-9406-B1209BEAB84B}</Project>
|
||||
<Name>CUETools.CDRepair</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\CUETools.Codecs\CUETools.Codecs.csproj">
|
||||
<Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project>
|
||||
<Name>CUETools.Codecs</Name>
|
||||
@@ -90,6 +94,10 @@
|
||||
<Project>{14EE067E-C218-4625-9540-2361AB27C4A6}</Project>
|
||||
<Name>CUETools.Compression</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\CUETools.CTDB\CUETools.CTDB.csproj">
|
||||
<Project>{AA2A9A7E-45FB-4632-AD85-85B0E556F818}</Project>
|
||||
<Name>CUETools.CTDB</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\CUETools.Ripper\CUETools.Ripper.csproj">
|
||||
<Project>{D2700165-3E77-4B28-928D-551F5FC11954}</Project>
|
||||
<Name>CUETools.Ripper</Name>
|
||||
|
||||
@@ -41,6 +41,8 @@ using System.Runtime.InteropServices;
|
||||
using CUETools.Codecs;
|
||||
using CUETools.CDImage;
|
||||
using CUETools.AccurateRip;
|
||||
//using CUETools.CDRepair;
|
||||
using CUETools.CTDB;
|
||||
using CUETools.Ripper;
|
||||
using CUETools.Compression;
|
||||
using MusicBrainz;
|
||||
@@ -928,6 +930,8 @@ namespace CUETools.Processor
|
||||
public int maxAlbumArtSize;
|
||||
public string arLogFilenameFormat, alArtFilenameFormat;
|
||||
public CUEStyle gapsHandling;
|
||||
public bool separateDecodingThread;
|
||||
public bool useSystemProxySettings;
|
||||
|
||||
public bool CopyAlbumArt { get { return copyAlbumArt; } set { copyAlbumArt = value; } }
|
||||
public bool FlaCudaThreads { get { return flaCudaThreads; } set { flaCudaThreads = value; } }
|
||||
@@ -1004,6 +1008,9 @@ namespace CUETools.Processor
|
||||
arLogFilenameFormat = "%filename%.accurip";
|
||||
alArtFilenameFormat = "folder.jpg";
|
||||
|
||||
separateDecodingThread = true;
|
||||
useSystemProxySettings = true;
|
||||
|
||||
gapsHandling = CUEStyle.GapsAppended;
|
||||
|
||||
language = Thread.CurrentThread.CurrentUICulture.Name;
|
||||
@@ -1090,6 +1097,29 @@ if (tracksMatch * 100 < processor.Config.encodeWhenPercent * processor.TrackCoun
|
||||
processor.Action = CUEAction.Encode;
|
||||
return processor.Go();
|
||||
"));
|
||||
scripts.Add("repair", new CUEToolsScript("repair", true,
|
||||
new CUEAction[] { CUEAction.Encode },
|
||||
@"
|
||||
processor.UseCUEToolsDB();
|
||||
processor.Action = CUEAction.Verify;
|
||||
if (processor.CTDB.DBStatus != null)
|
||||
return CTDB.DBStatus;
|
||||
processor.Go();
|
||||
processor.CTDB.DoVerify();
|
||||
if (!processor.CTDB.Verify.HasErrors)
|
||||
return ""nothing to fix"";
|
||||
if (!processor.CTDB.Verify.CanRecover)
|
||||
return ""cannot fix"";
|
||||
processor._useCUEToolsDBFix = true;
|
||||
processor.Action = CUEAction.Encode;
|
||||
return processor.Go();
|
||||
"));
|
||||
scripts.Add("submit", new CUEToolsScript("submit", true,
|
||||
new CUEAction[] { CUEAction.Verify },
|
||||
@"
|
||||
string status = processor.Go();
|
||||
"));
|
||||
|
||||
defaultVerifyScript = "default";
|
||||
defaultEncodeScript = "default";
|
||||
}
|
||||
@@ -1145,6 +1175,9 @@ return processor.Go();
|
||||
sw.Save("CheckForUpdates", checkForUpdates);
|
||||
sw.Save("Language", language);
|
||||
|
||||
sw.Save("SeparateDecodingThread", separateDecodingThread);
|
||||
sw.Save("UseSystemProxySettings", useSystemProxySettings);
|
||||
|
||||
sw.Save("WriteBasicTagsFromCUEData", writeBasicTagsFromCUEData);
|
||||
sw.Save("CopyBasicTags", copyBasicTags);
|
||||
sw.Save("CopyUnknownTags", copyUnknownTags);
|
||||
@@ -1289,6 +1322,9 @@ return processor.Go();
|
||||
arLogFilenameFormat = sr.Load("ArLogFilenameFormat") ?? arLogFilenameFormat;
|
||||
alArtFilenameFormat = sr.Load("AlArtFilenameFormat") ?? alArtFilenameFormat;
|
||||
|
||||
separateDecodingThread = sr.LoadBoolean("SeparateDecodingThread") ?? separateDecodingThread;
|
||||
useSystemProxySettings = sr.LoadBoolean("UseSystemProxySettings") ?? useSystemProxySettings;
|
||||
|
||||
int totalEncoders = sr.LoadInt32("ExternalEncoders", 0, null) ?? 0;
|
||||
for (int nEncoders = 0; nEncoders < totalEncoders; nEncoders++)
|
||||
{
|
||||
@@ -1477,6 +1513,7 @@ return processor.Go();
|
||||
_useFreeDb = sr.LoadBoolean("FreedbLookup") ?? _useFreeDb;
|
||||
_useMusicBrainz = sr.LoadBoolean("MusicBrainzLookup") ?? _useMusicBrainz;
|
||||
_useAccurateRip = sr.LoadBoolean("AccurateRipLookup") ?? _useAccurateRip;
|
||||
_useCUEToolsDB = sr.LoadBoolean("CUEToolsDBLookup") ?? _useCUEToolsDB;
|
||||
_outputAudioType = (AudioEncoderType?)sr.LoadInt32("OutputAudioType", null, null) ?? _outputAudioType;
|
||||
_outputAudioFormat = sr.Load("OutputAudioFmt") ?? _outputAudioFormat;
|
||||
_action = (CUEAction?)sr.LoadInt32("AccurateRipMode", (int)CUEAction.Encode, (int)CUEAction.CorrectFilenames) ?? _action;
|
||||
@@ -1493,6 +1530,7 @@ return processor.Go();
|
||||
sw.Save("FreedbLookup", _useFreeDb);
|
||||
sw.Save("MusicBrainzLookup", _useMusicBrainz);
|
||||
sw.Save("AccurateRipLookup", _useAccurateRip);
|
||||
sw.Save("CUEToolsDBLookup", _useCUEToolsDB);
|
||||
sw.Save("OutputAudioType", (int)_outputAudioType);
|
||||
sw.Save("OutputAudioFmt", _outputAudioFormat);
|
||||
sw.Save("AccurateRipMode", (int)_action);
|
||||
@@ -1508,7 +1546,7 @@ return processor.Go();
|
||||
public CUEAction _action = CUEAction.Encode;
|
||||
public CUEStyle _CUEStyle = CUEStyle.SingleFileWithCUE;
|
||||
public int _writeOffset = 0;
|
||||
public bool _useFreeDb = true, _useMusicBrainz = true, _useAccurateRip = true;
|
||||
public bool _useFreeDb = true, _useMusicBrainz = true, _useAccurateRip = true, _useCUEToolsDB = true;
|
||||
|
||||
public string _name;
|
||||
}
|
||||
@@ -1533,9 +1571,9 @@ return processor.Go();
|
||||
{
|
||||
public string path;
|
||||
public string contents;
|
||||
public bool isEAC;
|
||||
public object data;
|
||||
|
||||
public CUEToolsSourceFile(string _path, StreamReader reader)
|
||||
public CUEToolsSourceFile(string _path, TextReader reader)
|
||||
{
|
||||
path = _path;
|
||||
contents = reader.ReadToEnd();
|
||||
@@ -1556,6 +1594,10 @@ return processor.Go();
|
||||
private int _writeOffset;
|
||||
private CUEAction _action;
|
||||
private bool _useAccurateRip = false;
|
||||
private bool _useCUEToolsDB = false;
|
||||
private bool _useCUEToolsDBFix = false;
|
||||
private bool _useCUEToolsDBSibmit = false;
|
||||
private bool _processed = false;
|
||||
private uint? _minDataTrackLength;
|
||||
private string _accurateRipId;
|
||||
private string _eacLog;
|
||||
@@ -1581,10 +1623,12 @@ return processor.Go();
|
||||
private string _archivePassword;
|
||||
private CUEToolsProgressEventArgs _progress;
|
||||
private AccurateRipVerify _arVerify;
|
||||
private CUEToolsDB _CUEToolsDB;
|
||||
private CDImageLayout _toc;
|
||||
private string _arLogFileName, _alArtFileName;
|
||||
private TagLib.IPicture[] _albumArt;
|
||||
private int _padding = 8192;
|
||||
private IWebProxy proxy;
|
||||
|
||||
public event EventHandler<CompressionPasswordRequiredEventArgs> PasswordRequired;
|
||||
public event EventHandler<CUEToolsProgressEventArgs> CUEToolsProgress;
|
||||
@@ -1614,6 +1658,7 @@ return processor.Go();
|
||||
_isArchive = false;
|
||||
_isCD = false;
|
||||
_albumArt = null;
|
||||
proxy = _config.useSystemProxySettings ? WebRequest.GetSystemWebProxy() : null;
|
||||
}
|
||||
|
||||
public void OpenCD(ICDRipper ripper)
|
||||
@@ -1625,7 +1670,9 @@ return processor.Go();
|
||||
_trackFilenames.Add(string.Format("{0:00}.wav", iTrack + 1));
|
||||
_tracks.Add(new TrackInfo());
|
||||
}
|
||||
_arVerify = new AccurateRipVerify(_toc);
|
||||
_arVerify = new AccurateRipVerify(_toc, proxy);
|
||||
_CUEToolsDB = new CUEToolsDB(_toc, proxy);
|
||||
_CUEToolsDB.UploadHelper.onProgress += new EventHandler<Krystalware.UploadHelper.UploadProgressEventArgs>(UploadProgress);
|
||||
_isCD = true;
|
||||
SourceInfo cdInfo;
|
||||
cdInfo.Path = _ripper.ARName;
|
||||
@@ -1653,6 +1700,14 @@ return processor.Go();
|
||||
}
|
||||
}
|
||||
|
||||
public CUEToolsDB CTDB
|
||||
{
|
||||
get
|
||||
{
|
||||
return _CUEToolsDB;
|
||||
}
|
||||
}
|
||||
|
||||
public ICDRipper CDRipper
|
||||
{
|
||||
get
|
||||
@@ -2533,7 +2588,9 @@ return processor.Go();
|
||||
}
|
||||
}
|
||||
|
||||
_arVerify = new AccurateRipVerify(_toc);
|
||||
_arVerify = new AccurateRipVerify(_toc, proxy);
|
||||
_CUEToolsDB = new CUEToolsDB(_toc, proxy);
|
||||
_CUEToolsDB.UploadHelper.onProgress += new EventHandler<Krystalware.UploadHelper.UploadProgressEventArgs>(UploadProgress);
|
||||
|
||||
if (_eacLog != null)
|
||||
{
|
||||
@@ -2578,6 +2635,16 @@ return processor.Go();
|
||||
_padding += _eacLog.Length;
|
||||
}
|
||||
|
||||
public void UseCUEToolsDB()
|
||||
{
|
||||
ShowProgress((string)"Contacting CUETools database...", 0, 0, null, null);
|
||||
|
||||
_CUEToolsDB.ContactDB(_accurateRipId ?? AccurateRipVerify.CalculateAccurateRipId(_toc));
|
||||
|
||||
ShowProgress("", 0.0, 0.0, null, null);
|
||||
_useCUEToolsDB = true;
|
||||
}
|
||||
|
||||
public void UseAccurateRip()
|
||||
{
|
||||
ShowProgress((string)"Contacting AccurateRip database...", 0, 0, null, null);
|
||||
@@ -2685,6 +2752,18 @@ return processor.Go();
|
||||
this.CUEToolsProgress(this, _progress);
|
||||
}
|
||||
|
||||
private void UploadProgress(object sender, Krystalware.UploadHelper.UploadProgressEventArgs e)
|
||||
{
|
||||
CheckStop();
|
||||
if (this.CUEToolsProgress == null)
|
||||
return;
|
||||
_progress.percentDisk = 1.0;
|
||||
_progress.percentTrck = e.percent;
|
||||
_progress.offset = 0;
|
||||
_progress.status = e.uri;
|
||||
this.CUEToolsProgress(this, _progress);
|
||||
}
|
||||
|
||||
private void CDReadProgress(object sender, ReadProgressArgs e)
|
||||
{
|
||||
CheckStop();
|
||||
@@ -3016,7 +3095,8 @@ return processor.Go();
|
||||
if (Path.GetExtension(path) == ".dummy" || Path.GetExtension(path) == ".bin")
|
||||
{
|
||||
fileInfo = null;
|
||||
} else
|
||||
}
|
||||
else
|
||||
{
|
||||
TagLib.UserDefined.AdditionalFileTypes.Config = _config;
|
||||
TagLib.File.IFileAbstraction file = _isArchive
|
||||
@@ -3026,15 +3106,18 @@ return processor.Go();
|
||||
}
|
||||
|
||||
IAudioSource audioSource = AudioReadWrite.GetAudioSource(path, _isArchive ? OpenArchive(path, true) : null, _config);
|
||||
if (!audioSource.PCM.IsRedBook ||
|
||||
audioSource.Length <= 0 ||
|
||||
audioSource.Length >= Int32.MaxValue)
|
||||
try
|
||||
{
|
||||
if (!audioSource.PCM.IsRedBook ||
|
||||
audioSource.Length <= 0 ||
|
||||
audioSource.Length >= Int32.MaxValue)
|
||||
throw new Exception("Audio format is invalid.");
|
||||
return (int)audioSource.Length;
|
||||
}
|
||||
finally
|
||||
{
|
||||
audioSource.Close();
|
||||
throw new Exception("Audio format is invalid.");
|
||||
}
|
||||
audioSource.Close();
|
||||
return (int)audioSource.Length;
|
||||
}
|
||||
|
||||
public static void WriteText(string path, string text, Encoding encoding)
|
||||
@@ -3122,6 +3205,48 @@ return processor.Go();
|
||||
logWriter.WriteLine();
|
||||
logWriter.WriteLine(" Pre-gap length 0:{0}.{1:00}", CDImageLayout.TimeToString("{0:00}:{1:00}", _toc[track + _toc.FirstAudio].Pregap + (track + _toc.FirstAudio == 1 ? 150U : 0U)), (_toc[track + _toc.FirstAudio].Pregap % 75) * 100 / 75);
|
||||
}
|
||||
|
||||
int errCount = 0;
|
||||
uint tr_start = _toc[track + _toc.FirstAudio].Start;
|
||||
uint tr_end = (_toc[track + _toc.FirstAudio].Length + 74) / 75;
|
||||
for (uint iSecond = 0; iSecond < tr_end; iSecond ++)
|
||||
{
|
||||
uint sec_start = tr_start + iSecond * 75;
|
||||
uint sec_end = Math.Min(sec_start + 74, _toc[track + _toc.FirstAudio].End);
|
||||
bool fError = false;
|
||||
for (uint iSector = sec_start; iSector <= sec_end; iSector++)
|
||||
if (_ripper.Errors[(int)iSector])
|
||||
fError = true;
|
||||
if (fError)
|
||||
{
|
||||
uint end = iSecond;
|
||||
for (uint jSecond = iSecond + 1; jSecond < tr_end; jSecond++)
|
||||
{
|
||||
uint jsec_start = tr_start + jSecond * 75;
|
||||
uint jsec_end = Math.Min(jsec_start + 74, _toc[track + _toc.FirstAudio].End);
|
||||
bool jfError = false;
|
||||
for (uint jSector = jsec_start; jSector <= jsec_end; jSector++)
|
||||
if (_ripper.Errors[(int)jSector])
|
||||
jfError = true;
|
||||
if (jfError)
|
||||
end = jSecond;
|
||||
}
|
||||
if (errCount == 0)
|
||||
logWriter.WriteLine();
|
||||
if (errCount++ > 20)
|
||||
break;
|
||||
//"Suspicious position 0:02:20"
|
||||
//" Suspicious position 0:02:23 - 0:02:24"
|
||||
string s1 = CDImageLayout.TimeToString("0:{0:00}:{1:00}", iSecond * 75);
|
||||
string s2 = CDImageLayout.TimeToString("0:{0:00}:{1:00}", end * 75);
|
||||
if (iSecond == end)
|
||||
logWriter.WriteLine(" Suspicious position {0}", s1);
|
||||
else
|
||||
logWriter.WriteLine(" Suspicious position {0} - {1}", s1, s2);
|
||||
iSecond = end;
|
||||
}
|
||||
}
|
||||
|
||||
logWriter.WriteLine();
|
||||
logWriter.WriteLine(" Peak level {0:F1} %", (Tracks[track].PeakLevel * 1000 / 32768) * 0.1);
|
||||
logWriter.WriteLine(" Track quality 100.0 %");
|
||||
@@ -3391,6 +3516,8 @@ return processor.Go();
|
||||
|
||||
public void GenerateAccurateRipLog(TextWriter sw)
|
||||
{
|
||||
if (!_processed)
|
||||
throw new Exception("not processed");
|
||||
sw.WriteLine("[Verification date: {0}]", DateTime.Now);
|
||||
sw.WriteLine("[Disc ID: {0}]", _accurateRipId ?? AccurateRipVerify.CalculateAccurateRipId(_toc));
|
||||
if (PreGapLength != 0)
|
||||
@@ -3414,6 +3541,10 @@ return processor.Go();
|
||||
sw.WriteLine("HDCD: {0:f}", hdcdDecoder);
|
||||
if (0 != _writeOffset)
|
||||
sw.WriteLine("Offset applied: {0}", _writeOffset);
|
||||
if (_useCUEToolsDBFix)// && _CUEToolsDB.SelectedEntry != null)
|
||||
sw.WriteLine("CUETools DB: corrected {0} errors.", _CUEToolsDB.SelectedEntry.repair.CorrectableErrors);
|
||||
else if (_useCUEToolsDB)
|
||||
sw.WriteLine("CUETools DB: {0}.", _CUEToolsDB.Status);
|
||||
_arVerify.GenerateFullLog(sw, _config.arLogVerbose);
|
||||
}
|
||||
|
||||
@@ -3550,6 +3681,14 @@ return processor.Go();
|
||||
if (_audioEncoderType != AudioEncoderType.NoAudio || _action == CUEAction.Verify)
|
||||
WriteAudioFilesPass(OutputDir, OutputStyle, destLengths, htoaToFile, _action == CUEAction.Verify);
|
||||
|
||||
if (_useCUEToolsDB && CTDB.AccResult == HttpStatusCode.OK)
|
||||
{
|
||||
if (!_useCUEToolsDBFix)
|
||||
CTDB.DoVerify();
|
||||
}
|
||||
|
||||
_processed = true;
|
||||
|
||||
CreateRipperLOG();
|
||||
|
||||
if (_action == CUEAction.Encode)
|
||||
@@ -4097,6 +4236,8 @@ return processor.Go();
|
||||
|
||||
if (_useAccurateRip)
|
||||
_arVerify.Init();
|
||||
if (_useCUEToolsDB && !_useCUEToolsDBFix)
|
||||
_CUEToolsDB.Init(_useCUEToolsDBSibmit);
|
||||
|
||||
ShowProgress(String.Format("{2} track {0:00} ({1:00}%)...", 0, 0, noOutput ? "Verifying" : "Writing"), 0, 0.0, null, null);
|
||||
|
||||
@@ -4179,6 +4320,13 @@ return processor.Go();
|
||||
}
|
||||
|
||||
copyCount = audioSource.Read(sampleBuffer, copyCount);
|
||||
if (_useCUEToolsDB)
|
||||
{
|
||||
if (_useCUEToolsDBFix)
|
||||
_CUEToolsDB.SelectedEntry.repair.Write(sampleBuffer);
|
||||
else
|
||||
_CUEToolsDB.Verify.Write(sampleBuffer);
|
||||
}
|
||||
if (!discardOutput)
|
||||
{
|
||||
if (!_config.detectHDCD || !_config.decodeHDCD)
|
||||
@@ -4208,7 +4356,7 @@ return processor.Go();
|
||||
{
|
||||
_arVerify.Write(sampleBuffer);
|
||||
if (iTrack > 0 || iIndex > 0)
|
||||
Tracks[iTrack + (iIndex == 0 ? -1 : 0)].MeasurePeakLevel(sampleBuffer.Samples, copyCount);
|
||||
Tracks[iTrack + (iIndex == 0 ? -1 : 0)].MeasurePeakLevel(sampleBuffer, copyCount);
|
||||
}
|
||||
|
||||
currentOffset += copyCount;
|
||||
@@ -4550,7 +4698,9 @@ return processor.Go();
|
||||
if (sourceInfo.Offset != 0)
|
||||
audioSource.Position = sourceInfo.Offset;
|
||||
|
||||
//audioSource = new AudioPipe(audioSource, 0x10000);
|
||||
//if (!(audioSource is AudioPipe) && !(audioSource is UserDefinedReader) && _config.separateDecodingThread)
|
||||
if (!(audioSource is AudioPipe) && _config.separateDecodingThread)
|
||||
audioSource = new AudioPipe(audioSource, 0x10000);
|
||||
|
||||
return audioSource;
|
||||
}
|
||||
@@ -4902,6 +5052,14 @@ return processor.Go();
|
||||
}
|
||||
}
|
||||
|
||||
public bool Processed
|
||||
{
|
||||
get
|
||||
{
|
||||
return _processed;
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsCD
|
||||
{
|
||||
get
|
||||
@@ -5039,6 +5197,56 @@ return processor.Go();
|
||||
return Go();
|
||||
case "only if found":
|
||||
return ArVerify.AccResult != HttpStatusCode.OK ? WriteReport() : Go();
|
||||
case "submit":
|
||||
{
|
||||
if (!_useCUEToolsDB)
|
||||
return "CUETools DB not enabled";
|
||||
if (ArVerify.ARStatus != null)
|
||||
return "AccurateRip: " + ArVerify.ARStatus;
|
||||
if (ArVerify.WorstTotal() < 3)
|
||||
return "AccurateRip: confidence too low";
|
||||
//if (CTDB.AccResult == HttpStatusCode.OK)
|
||||
//return "CUEToolsDB: disc already present in database";
|
||||
if (CTDB.AccResult != HttpStatusCode.NotFound && CTDB.AccResult != HttpStatusCode.OK)
|
||||
return "CUEToolsDB: " + CTDB.DBStatus;
|
||||
_useCUEToolsDBSibmit = true;
|
||||
string status = Go();
|
||||
if (CTDB.AccResult == HttpStatusCode.OK)
|
||||
foreach (DBEntry entry in CTDB.Entries)
|
||||
if (!entry.hasErrors)
|
||||
return "CUEToolsDB: " + CTDB.Status;
|
||||
if (ArVerify.WorstConfidence() < 3)
|
||||
return status + ": confidence too low";
|
||||
return CTDB.Submit((int)ArVerify.WorstConfidence(), (int)ArVerify.WorstTotal());
|
||||
}
|
||||
case "repair":
|
||||
{
|
||||
UseCUEToolsDB();
|
||||
Action = CUEAction.Verify;
|
||||
if (CTDB.DBStatus != null)
|
||||
return CTDB.DBStatus;
|
||||
bool useAR = _useAccurateRip;
|
||||
_useAccurateRip = false;
|
||||
Go();
|
||||
_useAccurateRip = useAR;
|
||||
List<CUEToolsSourceFile> choices = new List<CUEToolsSourceFile>();
|
||||
foreach (DBEntry entry in CTDB.Entries)
|
||||
if (!entry.hasErrors || entry.canRecover)
|
||||
{
|
||||
CUEToolsSourceFile choice = new CUEToolsSourceFile(entry.Status, new StringReader(""));
|
||||
choice.data = entry;
|
||||
choices.Add(choice);
|
||||
}
|
||||
CUEToolsSourceFile selectedEntry = ChooseFile(choices, null, true);
|
||||
if (selectedEntry == null)
|
||||
return CTDB.Status;
|
||||
CTDB.SelectedEntry = (DBEntry)selectedEntry.data;
|
||||
if (!CTDB.SelectedEntry.hasErrors)
|
||||
return CTDB.Status;
|
||||
_useCUEToolsDBFix = true;
|
||||
Action = CUEAction.Encode;
|
||||
return Go();
|
||||
}
|
||||
case "fix offset":
|
||||
{
|
||||
if (ArVerify.AccResult != HttpStatusCode.OK)
|
||||
@@ -5276,12 +5484,15 @@ return processor.Go();
|
||||
_peakLevel = 0;
|
||||
}
|
||||
|
||||
public unsafe void MeasurePeakLevel(int[,] samplesBuffer, int sampleCount)
|
||||
public unsafe void MeasurePeakLevel(AudioBuffer buff, int sampleCount)
|
||||
{
|
||||
fixed (int* s = samplesBuffer)
|
||||
if (!buff.PCM.IsRedBook)
|
||||
throw new Exception();
|
||||
fixed (byte* bb = buff.Bytes)
|
||||
{
|
||||
short* ss = (short*)bb;
|
||||
for (int i = 0; i < sampleCount * 2; i++)
|
||||
_peakLevel = Math.Max(_peakLevel, Math.Abs(s[i]));
|
||||
_peakLevel = Math.Max(_peakLevel, Math.Abs((int)ss[i]));
|
||||
}
|
||||
//for (uint i = 0; i < sampleCount; i++)
|
||||
// for (uint j = 0; j < 2; j++)
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
using CUETools.Ripper;
|
||||
@@ -172,8 +173,8 @@ namespace CUETools.ConsoleRipper
|
||||
Console.Write(readCmd);
|
||||
return;
|
||||
}
|
||||
|
||||
AccurateRipVerify arVerify = new AccurateRipVerify(audioSource.TOC);
|
||||
|
||||
AccurateRipVerify arVerify = new AccurateRipVerify(audioSource.TOC, WebRequest.GetSystemWebProxy());
|
||||
AudioBuffer buff = new AudioBuffer(audioSource, 0x10000);
|
||||
string CDDBId = AccurateRipVerify.CalculateCDDBId(audioSource.TOC);
|
||||
string ArId = AccurateRipVerify.CalculateAccurateRipId(audioSource.TOC);
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.50727</ProductVersion>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
@@ -39,9 +39,6 @@
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Galois.cs" />
|
||||
<Compile Include="RsDecode.cs" />
|
||||
<Compile Include="RsEncode.cs" />
|
||||
<Compile Include="SCSIDrive.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -46,7 +46,6 @@ namespace CUETools.Ripper.SCSI
|
||||
int _correctionQuality = 1;
|
||||
int _currentStart = -1, _currentEnd = -1, _currentErrorsCount = 0;
|
||||
const int CB_AUDIO = 4 * 588 + 2 + 294 + 16;
|
||||
const int MAXSCANS = 20;
|
||||
const int NSECTORS = 16;
|
||||
//const int MSECTORS = 5*1024*1024 / (4 * 588);
|
||||
const int MSECTORS = 2400;
|
||||
@@ -58,11 +57,10 @@ namespace CUETools.Ripper.SCSI
|
||||
int m_max_sectors;
|
||||
int _timeout = 10;
|
||||
Crc16Ccitt _crc;
|
||||
int _currentScan;
|
||||
public byte[,,] UserData;
|
||||
public byte[,,] C2Data;
|
||||
public byte[,,] QData;
|
||||
public long[] Quality;
|
||||
public long[,] UserData;
|
||||
public long[,] C2Data;
|
||||
public byte[,] QData;
|
||||
public long[] byte2long;
|
||||
BitArray _errors;
|
||||
int _errorsCount;
|
||||
int _crcErrorsCount = 0;
|
||||
@@ -185,10 +183,17 @@ namespace CUETools.Ripper.SCSI
|
||||
{
|
||||
m_logger = new Logger();
|
||||
_crc = new Crc16Ccitt(InitialCrcValue.Zeros);
|
||||
UserData = new byte[MAXSCANS, MSECTORS, 4 * 588];
|
||||
C2Data = new byte[MAXSCANS, MSECTORS, 294];
|
||||
QData = new byte[MAXSCANS, MSECTORS, 16];
|
||||
Quality = new long[MAXSCANS];
|
||||
UserData = new long[MSECTORS, 4 * 588];
|
||||
C2Data = new long[MSECTORS, 588 / 2];
|
||||
QData = new byte[MSECTORS, 16];
|
||||
byte2long = new long[256];
|
||||
for (long i = 0; i < 256; i++)
|
||||
{
|
||||
long bl = 0;
|
||||
for (int b = 0; b < 8; b++)
|
||||
bl += ((i >> b) & 1) << (b << 3);
|
||||
byte2long[i] = bl;
|
||||
}
|
||||
}
|
||||
|
||||
public bool Open(char Drive)
|
||||
@@ -303,13 +308,13 @@ namespace CUETools.Ripper.SCSI
|
||||
for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
{
|
||||
int q_pos = (sector - _currentStart + iSector);
|
||||
int ctl = QData[_currentScan, q_pos, 0] >> 4;
|
||||
int adr = QData[_currentScan, q_pos, 0] & 7;
|
||||
int ctl = QData[q_pos, 0] >> 4;
|
||||
int adr = QData[q_pos, 0] & 7;
|
||||
bool preemph = (ctl & 1) == 1;
|
||||
bool dcp = (ctl & 2) == 2;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
_subchannelBuffer[i] = QData[_currentScan, q_pos, i];
|
||||
_subchannelBuffer[i] = QData[ q_pos, i];
|
||||
if (!_qChannelInBCD && adr == 1)
|
||||
{
|
||||
_subchannelBuffer[3] = toBCD(_subchannelBuffer[3]);
|
||||
@@ -321,8 +326,8 @@ namespace CUETools.Ripper.SCSI
|
||||
}
|
||||
ushort crc = _crc.ComputeChecksum(_subchannelBuffer, 0, 10);
|
||||
crc ^= 0xffff;
|
||||
if ((QData[_currentScan, q_pos, 10] != 0 || QData[_currentScan, q_pos, 11] != 0) &&
|
||||
((byte)(crc & 0xff) != QData[_currentScan, q_pos, 11] || (byte)(crc >> 8) != QData[_currentScan, q_pos, 10])
|
||||
if ((QData[q_pos, 10] != 0 || QData[q_pos, 11] != 0) &&
|
||||
((byte)(crc & 0xff) != QData[q_pos, 11] || (byte)(crc >> 8) != QData[q_pos, 10])
|
||||
)
|
||||
{
|
||||
if (!updateMap)
|
||||
@@ -332,7 +337,7 @@ namespace CUETools.Ripper.SCSI
|
||||
{
|
||||
StringBuilder st = new StringBuilder();
|
||||
for (int i = 0; i < 12; i++)
|
||||
st.AppendFormat(",0x{0:X2}", QData[_currentScan, q_pos, i]);
|
||||
st.AppendFormat(",0x{0:X2}", QData[q_pos, i]);
|
||||
System.Console.WriteLine("\rCRC error@{0}{1};", CDImageLayout.TimeToString((uint)(sector + iSector)), st.ToString());
|
||||
}
|
||||
continue;
|
||||
@@ -341,11 +346,11 @@ namespace CUETools.Ripper.SCSI
|
||||
{
|
||||
case 1: // current position
|
||||
{
|
||||
int iTrack = fromBCD(QData[_currentScan, q_pos, 1]);
|
||||
int iIndex = fromBCD(QData[_currentScan, q_pos, 2]);
|
||||
int mm = _qChannelInBCD ? fromBCD(QData[_currentScan, q_pos, 7]) : QData[_currentScan, q_pos, 7];
|
||||
int ss = _qChannelInBCD ? fromBCD(QData[_currentScan, q_pos, 8]) : QData[_currentScan, q_pos, 8];
|
||||
int ff = _qChannelInBCD ? fromBCD(QData[_currentScan, q_pos, 9]) : QData[_currentScan, q_pos, 9];
|
||||
int iTrack = fromBCD(QData[q_pos, 1]);
|
||||
int iIndex = fromBCD(QData[q_pos, 2]);
|
||||
int mm = _qChannelInBCD ? fromBCD(QData[q_pos, 7]) : QData[q_pos, 7];
|
||||
int ss = _qChannelInBCD ? fromBCD(QData[q_pos, 8]) : QData[q_pos, 8];
|
||||
int ff = _qChannelInBCD ? fromBCD(QData[q_pos, 9]) : QData[q_pos, 9];
|
||||
//if (sec != sector + iSector)
|
||||
// System.Console.WriteLine("\rLost sync: {0} vs {1} ({2:X} vs {3:X})", CDImageLayout.TimeToString((uint)(sector + iSector)), CDImageLayout.TimeToString((uint)sec), sector + iSector, sec);
|
||||
if (iTrack == 110)
|
||||
@@ -413,7 +418,7 @@ namespace CUETools.Ripper.SCSI
|
||||
{
|
||||
StringBuilder catalog = new StringBuilder();
|
||||
for (int i = 1; i < 8; i++)
|
||||
catalog.AppendFormat("{0:x2}", QData[_currentScan, q_pos, i]);
|
||||
catalog.AppendFormat("{0:x2}", QData[q_pos, i]);
|
||||
_toc.Catalog = catalog.ToString(0, 13);
|
||||
}
|
||||
break;
|
||||
@@ -421,16 +426,16 @@ namespace CUETools.Ripper.SCSI
|
||||
if (updateMap && _toc[_currentTrack].ISRC == null)
|
||||
{
|
||||
StringBuilder isrc = new StringBuilder();
|
||||
isrc.Append(from6bit(QData[_currentScan, q_pos, 1] >> 2));
|
||||
isrc.Append(from6bit(((QData[_currentScan, q_pos, 1] & 0x3) << 4) + (0x0f & (QData[_currentScan, q_pos, 2] >> 4))));
|
||||
isrc.Append(from6bit(((QData[_currentScan, q_pos, 2] & 0xf) << 2) + (0x03 & (QData[_currentScan, q_pos, 3] >> 6))));
|
||||
isrc.Append(from6bit((QData[_currentScan, q_pos, 3] & 0x3f)));
|
||||
isrc.Append(from6bit(QData[_currentScan, q_pos, 4] >> 2));
|
||||
isrc.Append(from6bit(((QData[_currentScan, q_pos, 4] & 0x3) << 4) + (0x0f & (QData[_currentScan, q_pos, 5] >> 4))));
|
||||
isrc.AppendFormat("{0:x}", QData[_currentScan, q_pos, 5] & 0xf);
|
||||
isrc.AppendFormat("{0:x2}", QData[_currentScan, q_pos, 6]);
|
||||
isrc.AppendFormat("{0:x2}", QData[_currentScan, q_pos, 7]);
|
||||
isrc.AppendFormat("{0:x}", QData[_currentScan, q_pos, 8] >> 4);
|
||||
isrc.Append(from6bit(QData[q_pos, 1] >> 2));
|
||||
isrc.Append(from6bit(((QData[q_pos, 1] & 0x3) << 4) + (0x0f & (QData[q_pos, 2] >> 4))));
|
||||
isrc.Append(from6bit(((QData[q_pos, 2] & 0xf) << 2) + (0x03 & (QData[q_pos, 3] >> 6))));
|
||||
isrc.Append(from6bit((QData[q_pos, 3] & 0x3f)));
|
||||
isrc.Append(from6bit(QData[q_pos, 4] >> 2));
|
||||
isrc.Append(from6bit(((QData[q_pos, 4] & 0x3) << 4) + (0x0f & (QData[q_pos, 5] >> 4))));
|
||||
isrc.AppendFormat("{0:x}", QData[q_pos, 5] & 0xf);
|
||||
isrc.AppendFormat("{0:x2}", QData[q_pos, 6]);
|
||||
isrc.AppendFormat("{0:x2}", QData[q_pos, 7]);
|
||||
isrc.AppendFormat("{0:x}", QData[q_pos, 8] >> 4);
|
||||
if (!isrc.ToString().Contains("#") && isrc.ToString() != "0000000000")
|
||||
_toc[_currentTrack].ISRC = isrc.ToString();
|
||||
}
|
||||
@@ -449,7 +454,6 @@ namespace CUETools.Ripper.SCSI
|
||||
Device.MainChannelSelection[] mainmode = { Device.MainChannelSelection.UserData, Device.MainChannelSelection.F8h };
|
||||
bool found = false;
|
||||
_currentStart = 0;
|
||||
_currentScan = 0;
|
||||
_currentTrack = -1;
|
||||
_currentIndex = -1;
|
||||
m_max_sectors = Math.Min(NSECTORS, m_device.MaximumTransferLength / CB_AUDIO - 1);
|
||||
@@ -507,27 +511,34 @@ namespace CUETools.Ripper.SCSI
|
||||
return found;
|
||||
}
|
||||
|
||||
private unsafe void ReorganiseSectors(int sector, int Sectors2Read)
|
||||
private unsafe void ReorganiseSectors(int sector, int Sectors2Read)
|
||||
{
|
||||
int c2Size = _c2ErrorMode == Device.C2ErrorMode.None ? 0 : _c2ErrorMode == Device.C2ErrorMode.Mode294 ? 294 : 296;
|
||||
int oldSize = 4 * 588 + c2Size + (_subChannelMode == Device.SubChannelMode.None ? 0 : 16);
|
||||
fixed (byte* readBuf = _readBuffer, qBuf = _subchannelBuffer, userData = UserData, c2Data = C2Data, qData = QData)
|
||||
int oldSize = 4 * 588 + c2Size + (_subChannelMode == Device.SubChannelMode.None ? 0 : 16);
|
||||
fixed (byte* readBuf = _readBuffer, qBuf = _subchannelBuffer, qData = QData)
|
||||
fixed (long* userData = UserData, c2Data = C2Data)
|
||||
{
|
||||
for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
{
|
||||
byte* sectorPtr = readBuf + iSector * oldSize;
|
||||
byte* userDataPtr = userData + (_currentScan * MSECTORS + sector - _currentStart + iSector) * 4 * 588;
|
||||
byte* c2DataPtr = c2Data + (_currentScan * MSECTORS + sector - _currentStart + iSector) * 294;
|
||||
byte* qDataPtr = qData + (_currentScan * MSECTORS + sector - _currentStart + iSector) * 16;
|
||||
long* userDataPtr = userData + (sector - _currentStart + iSector) * 4 * 588;
|
||||
long* c2DataPtr = c2Data + (sector - _currentStart + iSector) * 294;
|
||||
byte* qDataPtr = qData + (sector - _currentStart + iSector) * 16;
|
||||
|
||||
for (int sample = 0; sample < 4 * 588; sample++)
|
||||
userDataPtr[sample] = sectorPtr[sample];
|
||||
userDataPtr[sample] += byte2long[sectorPtr[sample]] * 3;
|
||||
if (_c2ErrorMode != Device.C2ErrorMode.None)
|
||||
{
|
||||
for (int c2 = 0; c2 < 294; c2++)
|
||||
c2DataPtr[c2] = sectorPtr[4 * 588 + c2Size - 294 + c2];
|
||||
else
|
||||
for (int c2 = 0; c2 < 294; c2++)
|
||||
c2DataPtr[c2] = 0; // 0xff??
|
||||
{
|
||||
byte c2val = sectorPtr[4 * 588 + c2Size - 294 + c2];
|
||||
c2DataPtr[c2] += byte2long[c2val];
|
||||
if (c2val != 0)
|
||||
for (int b = 0; b < 8; b++)
|
||||
if (((c2val >> b) & 1) != 0)
|
||||
userDataPtr[c2 * 8 + b] += 0x0101010101010101 - byte2long[sectorPtr[c2 * 8 + b]] * 2;
|
||||
}
|
||||
}
|
||||
if (_subChannelMode != Device.SubChannelMode.None)
|
||||
for (int qi = 0; qi < 16; qi++)
|
||||
qDataPtr[qi] = sectorPtr[4 * 588 + c2Size + qi];
|
||||
@@ -538,6 +549,15 @@ namespace CUETools.Ripper.SCSI
|
||||
}
|
||||
}
|
||||
|
||||
private unsafe void ClearSectors(int sector, int Sectors2Read)
|
||||
{
|
||||
fixed (long* userData = &UserData[sector - _currentStart, 0], c2Data = &C2Data[sector - _currentStart, 0])
|
||||
{
|
||||
ZeroMemory((byte*)userData, 8 * 4 * 588 * Sectors2Read);
|
||||
ZeroMemory((byte*)c2Data, 4 * 588 * Sectors2Read);
|
||||
}
|
||||
}
|
||||
|
||||
private unsafe Device.CommandStatus FetchSectors(int sector, int Sectors2Read, bool abort, bool subchannel)
|
||||
{
|
||||
Device.CommandStatus st;
|
||||
@@ -579,11 +599,11 @@ namespace CUETools.Ripper.SCSI
|
||||
{
|
||||
iErrors ++;
|
||||
for (int i = 0; i < 4 * 588; i++)
|
||||
UserData[_currentScan, sector + iSector - _currentStart, i] = 0;
|
||||
UserData[sector + iSector - _currentStart, i] += 0x0101010101010101;
|
||||
for (int i = 0; i < 294; i++)
|
||||
C2Data[_currentScan, sector + iSector - _currentStart, i] = 0xff;
|
||||
C2Data[sector + iSector - _currentStart, i] += 0x0101010101010101;
|
||||
for (int i = 0; i < 16; i++)
|
||||
QData[_currentScan, sector + iSector - _currentStart, i] = 0;
|
||||
QData[ sector + iSector - _currentStart, i] = 0;
|
||||
if (_debugMessages)
|
||||
System.Console.WriteLine("\nSector lost");
|
||||
}
|
||||
@@ -666,23 +686,24 @@ namespace CUETools.Ripper.SCSI
|
||||
|
||||
private void PrintErrors(int pass, int sector, int Sectors2Read, byte[] realData)
|
||||
{
|
||||
for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
{
|
||||
int pos = sector - _currentStart + iSector;
|
||||
if (_debugMessages)
|
||||
{
|
||||
StringBuilder st = new StringBuilder();
|
||||
for (int i = 0; i < 294; i++)
|
||||
if (C2Data[_currentScan, pos, i] != 0)
|
||||
{
|
||||
for (int j = i; j < i + 23; j++)
|
||||
if (j < 294)
|
||||
st.AppendFormat("{0:X2}", C2Data[_currentScan, pos, j]);
|
||||
else
|
||||
st.Append(" ");
|
||||
System.Console.WriteLine("\rC2 error @{0}[{1:000}]{2};", CDImageLayout.TimeToString((uint)(sector + iSector)), i, st.ToString());
|
||||
return;
|
||||
}
|
||||
//for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
//{
|
||||
// int pos = sector - _currentStart + iSector;
|
||||
// if (_debugMessages)
|
||||
// {
|
||||
// StringBuilder st = new StringBuilder();
|
||||
// for (int i = 0; i < 294; i++)
|
||||
// if (C2Data[pos, i] != 0)
|
||||
// {
|
||||
// for (int j = i; j < i + 23; j++)
|
||||
// if (j < 294)
|
||||
// st.AppendFormat("{0:X2}", C2Data[_currentScan, pos, j]);
|
||||
// else
|
||||
// st.Append(" ");
|
||||
// System.Console.WriteLine("\rC2 error @{0}[{1:000}]{2};", CDImageLayout.TimeToString((uint)(sector + iSector)), i, st.ToString());
|
||||
// return;
|
||||
// }
|
||||
|
||||
//for (int i = 0; i < 4 * 588; i++)
|
||||
// if (_currentData[pos * 4 * 588 + i] != realData[pos * 4 * 588 + i])
|
||||
// {
|
||||
@@ -714,100 +735,50 @@ namespace CUETools.Ripper.SCSI
|
||||
// // st.Append(' ');
|
||||
// //System.Console.WriteLine("\rReal error @{0}[{1:000}]{2};", CDImageLayout.TimeToString((uint)(sector + iSector)), i, st.ToString());
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
private unsafe void CorrectSectors0(int sector, int Sectors2Read)
|
||||
private unsafe void CorrectSectors(int pass, int sector, int Sectors2Read, bool markErrors)
|
||||
{
|
||||
for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
{
|
||||
int pos = sector - _currentStart + iSector;
|
||||
int avg = (pass + 1) * 3 / 2;
|
||||
int er_limit = 2 + pass / 2; // allow 25% minority
|
||||
// avg - pass + 1
|
||||
// p a l o
|
||||
// 0 1 1 2
|
||||
// 2 4 3 3
|
||||
// 4 7 2 4
|
||||
// 6 10 5
|
||||
//16 25 10
|
||||
bool fError = false;
|
||||
for (int iPar = 0; iPar < 4 * 588; iPar++)
|
||||
{
|
||||
byte bestValue = UserData[0, pos, iPar];
|
||||
_currentErrorsCount += (C2Data[0, pos, iPar >> 3] >> (iPar & 7)) & 1;
|
||||
_currentData[pos * 4 * 588 + iPar] = bestValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private unsafe void CorrectSectors1(int sector, int Sectors2Read)
|
||||
{
|
||||
for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
{
|
||||
int pos = sector - _currentStart + iSector;
|
||||
for (int iPar = 0; iPar < 4 * 588; iPar++)
|
||||
{
|
||||
byte val1 = UserData[0, pos, iPar];
|
||||
byte val2 = UserData[1, pos, iPar];
|
||||
int err1 = (C2Data[0, pos, iPar >> 3] >> (iPar & 7)) & 1;
|
||||
int err2 = (C2Data[1, pos, iPar >> 3] >> (iPar & 7)) & 1;
|
||||
_currentErrorsCount += err1 | err2 | (val1 != val2 ? 1 : 0);
|
||||
_currentData[pos * 4 * 588 + iPar] = err1 != 0 ? val2 : val1;
|
||||
//if (_debugMessages && ((C2Data[_currentScan, pos, iPar >> 3] >> (iPar & 7)) & 1) != 0 && _currentErrorsCount < 10)
|
||||
// System.Console.WriteLine("\rC2 error @{0}, byte {1:0000} ", CDImageLayout.TimeToString((uint)(sector + iSector)), iPar);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private unsafe void CorrectSectors(int pass, int sector, int Sectors2Read, bool findWorst, bool markErrors)
|
||||
{
|
||||
if (pass == 0)
|
||||
{
|
||||
CorrectSectors0(sector, Sectors2Read);
|
||||
return;
|
||||
}
|
||||
if (pass == 1)
|
||||
{
|
||||
CorrectSectors1(sector, Sectors2Read);
|
||||
return;
|
||||
}
|
||||
short c2Score = 10;
|
||||
fixed (short* valueScore = _valueScore)
|
||||
{
|
||||
fixed (byte* userData = UserData, c2Data = C2Data, qData = QData)
|
||||
{
|
||||
for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
long val = UserData[pos, iPar];
|
||||
byte c2 = (byte)(C2Data[pos, iPar >> 3] >> ((iPar & 7) * 8));
|
||||
int bestValue = 0;
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
int pos = sector - _currentStart + iSector;
|
||||
for (int iPar = 0; iPar < 4 * 588; iPar++)
|
||||
{
|
||||
int c2Bit = 0x80 >> (iPar % 8);
|
||||
|
||||
ZeroMemory(valueScore, 256);
|
||||
byte bestValue = 0;
|
||||
short totalScore = 0;
|
||||
for (int result = 0; result <= pass; result++)
|
||||
{
|
||||
int offs = (result * MSECTORS + pos) * 4 * 588 + iPar;
|
||||
byte value = userData[offs];
|
||||
short score = (short)(1 + (((c2Data[offs >> 3] & c2Bit) == 0) ? c2Score : (short)0));
|
||||
valueScore[value] += score;
|
||||
totalScore += score;
|
||||
if (valueScore[value] > valueScore[bestValue])
|
||||
bestValue = value;
|
||||
}
|
||||
// if (_debugMessages && ((C2Data[_currentScan, pos, iPar >> 3] >> (iPar & 7)) & 1) != 0 && _currentErrorsCount < 10)
|
||||
// System.Console.WriteLine("\rC2 error @{0}, byte {1:0000} ", CDImageLayout.TimeToString((uint)(sector + iSector)), iPar);
|
||||
bool fError = valueScore[bestValue] <= _correctionQuality + c2Score + totalScore / 2;
|
||||
if (fError)
|
||||
_currentErrorsCount++;
|
||||
_currentData[(sector - _currentStart + iSector) * 4 * 588 + iPar] = bestValue;
|
||||
if (findWorst)
|
||||
{
|
||||
for (int result = 0; result <= pass; result++)
|
||||
Quality[result] += Math.Min(0, valueScore[userData[(result * MSECTORS + pos) * 4 * 588 + iPar]] - c2Score - 2);
|
||||
}
|
||||
if (markErrors)
|
||||
{
|
||||
_errors[sector + iSector] |= fError;
|
||||
_errorsCount += fError ? 1 : 0;
|
||||
}
|
||||
}
|
||||
int sum = avg - ((int)(val & 0xff));
|
||||
int sig = sum >> 31; // bit value
|
||||
fError |= (sum ^ sig) < er_limit;
|
||||
bestValue += sig & (1 << i);
|
||||
val >>= 8;
|
||||
}
|
||||
_currentData[pos * 4 * 588 + iPar] = (byte)bestValue;
|
||||
}
|
||||
if (fError)
|
||||
_currentErrorsCount++;
|
||||
if (markErrors)
|
||||
{
|
||||
_errors[sector + iSector] |= fError;
|
||||
_errorsCount += fError ? 1 : 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//private unsafe int CorrectSectorsTest(int start, int end, int c2Score, byte[] realData, int worstScan)
|
||||
@@ -866,8 +837,6 @@ namespace CUETools.Ripper.SCSI
|
||||
|
||||
public unsafe void PrefetchSector(int iSector)
|
||||
{
|
||||
int nExtraPasses = MAXSCANS / 2 + _correctionQuality;
|
||||
|
||||
if (_currentStart == MSECTORS * (iSector / MSECTORS))
|
||||
return;
|
||||
|
||||
@@ -884,80 +853,44 @@ namespace CUETools.Ripper.SCSI
|
||||
// throw new Exception("read");
|
||||
//correctFile.Close();
|
||||
|
||||
fixed (byte* userData = UserData, c2Data = C2Data, qData = QData)
|
||||
int max_scans = 64;
|
||||
for (int pass = 0; pass <= max_scans; pass++)
|
||||
{
|
||||
for (int pass = 0; pass < MAXSCANS + nExtraPasses; pass++)
|
||||
DateTime PassTime = DateTime.Now, LastFetch = DateTime.Now;
|
||||
_currentErrorsCount = 0;
|
||||
|
||||
for (int sector = _currentStart; sector < _currentEnd; sector += m_max_sectors)
|
||||
{
|
||||
DateTime PassTime = DateTime.Now, LastFetch = DateTime.Now;
|
||||
if (pass < MAXSCANS)
|
||||
_currentScan = pass;
|
||||
else
|
||||
{
|
||||
_currentScan = 0;
|
||||
for (int result = 1; result < MAXSCANS; result++)
|
||||
if (Quality[result] < Quality[_currentScan])
|
||||
_currentScan = result;
|
||||
//if (worstPass < 0)
|
||||
// System.Console.WriteLine("bad scan");
|
||||
//else
|
||||
// System.Console.WriteLine("{0}->{1}, {2}->{3}", _scanResults[worstPass].Quality, _currentScan.Quality, CorrectSectorsTest(_currentStart, _currentEnd, 10, realData, -1), CorrectSectorsTest(_currentStart, _currentEnd, 10, realData, worstPass));
|
||||
}
|
||||
for (int result = 0; result < MAXSCANS; result++)
|
||||
Quality[result] = 0;
|
||||
_currentErrorsCount = 0;
|
||||
int Sectors2Read = Math.Min(m_max_sectors, _currentEnd - sector);
|
||||
int speed = pass == 5 ? 300 : pass == 6 ? 150 : pass == 7 ? 75 : 32500; // sectors per second
|
||||
int msToSleep = 1000 * Sectors2Read / speed - (int)((DateTime.Now - LastFetch).TotalMilliseconds);
|
||||
|
||||
for (int sector = _currentStart; sector < _currentEnd; sector += m_max_sectors)
|
||||
{
|
||||
int Sectors2Read = Math.Min(m_max_sectors, _currentEnd - sector);
|
||||
int speed = pass == 5 ? 300 : pass == 6 ? 150 : pass == 7 ? 75 : 32500; // sectors per second
|
||||
int msToSleep = 1000 * Sectors2Read / speed - (int)((DateTime.Now - LastFetch).TotalMilliseconds);
|
||||
//if (msToSleep > 0) Thread.Sleep(msToSleep);
|
||||
|
||||
//if (msToSleep > 0) Thread.Sleep(msToSleep);
|
||||
LastFetch = DateTime.Now;
|
||||
FetchSectors(sector, Sectors2Read, true, pass == 0);
|
||||
//TimeSpan delay1 = DateTime.Now - LastFetch;
|
||||
if (pass == 0)
|
||||
ProcessSubchannel(sector, Sectors2Read, true);
|
||||
//DateTime LastFetched = DateTime.Now;
|
||||
CorrectSectors(Math.Min(pass, MAXSCANS - 1), sector, Sectors2Read, pass >= MAXSCANS - 1, pass == MAXSCANS - 1 + nExtraPasses);
|
||||
PrintErrors(Math.Min(pass, MAXSCANS - 1), sector, Sectors2Read, /*realData*/null);
|
||||
//TimeSpan delay2 = DateTime.Now - LastFetched;
|
||||
//if (sector == _currentStart)
|
||||
//System.Console.WriteLine("\n{0},{1}", delay1.TotalMilliseconds, delay2.TotalMilliseconds);
|
||||
if (ReadProgress != null)
|
||||
ReadProgress(this, new ReadProgressArgs(sector + Sectors2Read, pass, _currentStart, _currentEnd, _currentErrorsCount, PassTime));
|
||||
LastFetch = DateTime.Now;
|
||||
if (pass == 0)
|
||||
ClearSectors(sector, Sectors2Read);
|
||||
FetchSectors(sector, Sectors2Read, true, pass == 0);
|
||||
//TimeSpan delay1 = DateTime.Now - LastFetch;
|
||||
if (pass == 0)
|
||||
ProcessSubchannel(sector, Sectors2Read, true);
|
||||
//DateTime LastFetched = DateTime.Now;
|
||||
if ((pass & 1) == 0)
|
||||
{
|
||||
CorrectSectors(pass, sector, Sectors2Read, pass >= max_scans);
|
||||
PrintErrors(pass, sector, Sectors2Read, /*realData*/null);
|
||||
}
|
||||
//System.Console.WriteLine();
|
||||
//if (CorrectSectorsTest(start, _currentEnd, 10, realData) == 0)
|
||||
// break;
|
||||
//if (pass == MAXSCANS - 1 + nExtraPasses)
|
||||
// break;
|
||||
if (_currentErrorsCount == 0 && pass >= _correctionQuality)
|
||||
break;
|
||||
//if (_currentErrorsCount == 0 && pass >= _correctionQuality)
|
||||
//{
|
||||
// bool syncOk = true;
|
||||
// //if (pass == 0)
|
||||
// //{
|
||||
// // ScanResults saved = _currentScan;
|
||||
// // _currentScan = new ScanResults(_currentEnd - _currentStart, CB_AUDIO);
|
||||
// // for (int sector = _currentStart; sector < _currentEnd && syncOk; sector += 7)
|
||||
// // {
|
||||
// // FetchSectors(sector, 2);
|
||||
// // for (int i = 0; i < 2 * CB_AUDIO; i++)
|
||||
// // if (_currentScan.Data[(sector - _currentStart) * CB_AUDIO + i] != saved.Data[(sector - _currentStart) * CB_AUDIO + i])
|
||||
// // {
|
||||
// // System.Console.WriteLine("Lost Sync");
|
||||
// // syncOk = false;
|
||||
// // break;
|
||||
// // }
|
||||
// // }
|
||||
// // _currentScan = saved;
|
||||
// //}
|
||||
// if (syncOk)
|
||||
// break;
|
||||
//}
|
||||
//TimeSpan delay2 = DateTime.Now - LastFetched;
|
||||
//if (sector == _currentStart)
|
||||
//System.Console.WriteLine("\n{0},{1}", delay1.TotalMilliseconds, delay2.TotalMilliseconds);
|
||||
if (ReadProgress != null)
|
||||
ReadProgress(this, new ReadProgressArgs(sector + Sectors2Read, pass, _currentStart, _currentEnd, _currentErrorsCount, PassTime));
|
||||
}
|
||||
//System.Console.WriteLine();
|
||||
//if (CorrectSectorsTest(start, _currentEnd, 10, realData) == 0)
|
||||
// break;
|
||||
if ((pass & 1) == 0 && pass >= _correctionQuality && _currentErrorsCount == 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.50727</ProductVersion>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{D2700165-3E77-4B28-928D-551F5FC11954}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
@@ -19,7 +19,7 @@
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<OutputPath>..\bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
|
||||
@@ -67,12 +67,12 @@ namespace CUETools.TestCodecs
|
||||
toc.AddTrack(new CDTrack(2, 68, 31, true, false));
|
||||
toc.AddTrack(new CDTrack(3, 99, 37, true, false));
|
||||
toc[1][0].Start = 0;
|
||||
ar = new AccurateRipVerify(toc);
|
||||
ar = new AccurateRipVerify(toc, null);
|
||||
|
||||
toc2 = new CDImageLayout();
|
||||
toc2.AddTrack(new CDTrack(1, 0, toc.AudioLength, true, false));
|
||||
toc2.AddTrack(new CDTrack(2, toc.AudioLength, 750, true, false));
|
||||
ar2 = new AccurateRipVerify(toc2);
|
||||
ar2 = new AccurateRipVerify(toc2, null);
|
||||
|
||||
Random rnd = new Random(2314);
|
||||
for (int sector = 0; sector < toc2.AudioLength; sector++)
|
||||
|
||||
@@ -23,6 +23,7 @@ namespace CUETools.TestParity
|
||||
static byte[] wav2 = new byte[finalSampleCount * 4];
|
||||
static byte[] wav3 = new byte[finalSampleCount * 4];
|
||||
static byte[] parity;
|
||||
static uint crc;
|
||||
const int offset = 48;
|
||||
//const int offset = 5 * 588 - 5;
|
||||
//const int offset = 2000;
|
||||
@@ -60,11 +61,12 @@ namespace CUETools.TestParity
|
||||
wav2[(int)(rnd.NextDouble() * (wav2.Length - 1))] = (byte)(rnd.NextDouble() * 255);
|
||||
|
||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
||||
CDRepairEncode encode = new CDRepairEncode(finalSampleCount, stride, npar, false);
|
||||
CDRepairEncode encode = new CDRepairEncode(finalSampleCount, stride, npar, false, true);
|
||||
buff.Prepare(wav, finalSampleCount);
|
||||
encode.Write(buff);
|
||||
encode.Close();
|
||||
parity = encode.Parity;
|
||||
crc = encode.CRC;
|
||||
}
|
||||
//
|
||||
//Use ClassCleanup to run code after all tests in a class have run
|
||||
@@ -95,13 +97,15 @@ namespace CUETools.TestParity
|
||||
public void CDRepairDecodeOriginalTest()
|
||||
{
|
||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
||||
CDRepairEncode decode = new CDRepairEncode(finalSampleCount, stride, npar, true);
|
||||
CDRepairEncode decode = new CDRepairEncode(finalSampleCount, stride, npar, true, false);
|
||||
buff.Prepare(wav, finalSampleCount);
|
||||
decode.Write(buff);
|
||||
decode.Close();
|
||||
decode.VerifyParity(parity);
|
||||
Assert.IsFalse(decode.HasErrors);
|
||||
Assert.AreEqual(0, decode.ActualOffset, "wrong offset");
|
||||
int actualOffset;
|
||||
bool hasErrors;
|
||||
Assert.IsTrue(decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors));
|
||||
Assert.IsFalse(hasErrors, "has errors");
|
||||
Assert.AreEqual(0, actualOffset, "wrong offset");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -111,14 +115,18 @@ namespace CUETools.TestParity
|
||||
public void CDRepairDecodeModifiedTest()
|
||||
{
|
||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
||||
CDRepairEncode decode = new CDRepairEncode(finalSampleCount, stride, npar, true);
|
||||
CDRepairEncode decode = new CDRepairEncode(finalSampleCount, stride, npar, true, false);
|
||||
buff.Prepare(wav2, finalSampleCount);
|
||||
decode.Write(buff);
|
||||
decode.Close();
|
||||
decode.VerifyParity(parity);
|
||||
Assert.IsTrue(decode.HasErrors, "doesn't have errors");
|
||||
Assert.IsTrue(decode.CanRecover, "cannot recover");
|
||||
Assert.AreEqual(0, decode.ActualOffset, "wrong offset");
|
||||
int actualOffset;
|
||||
bool hasErrors;
|
||||
Assert.IsTrue(decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors));
|
||||
Assert.IsTrue(hasErrors, "doesn't have errors");
|
||||
Assert.AreEqual(0, actualOffset, "wrong offset");
|
||||
CDRepairFix fix = decode.VerifyParity(parity, actualOffset);
|
||||
Assert.IsTrue(fix.HasErrors, "doesn't have errors");
|
||||
Assert.IsTrue(fix.CanRecover, "cannot recover");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -128,14 +136,16 @@ namespace CUETools.TestParity
|
||||
public void CDRepairDecodePositiveOffsetTest()
|
||||
{
|
||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
||||
CDRepairEncode decode = new CDRepairEncode(finalSampleCount, stride, npar, true);
|
||||
CDRepairEncode decode = new CDRepairEncode(finalSampleCount, stride, npar, true, false);
|
||||
Array.Copy(wav, offset * 4, wav3, 0, (finalSampleCount - offset) * 4);
|
||||
buff.Prepare(wav3, finalSampleCount);
|
||||
decode.Write(buff);
|
||||
decode.Close();
|
||||
decode.VerifyParity(parity);
|
||||
Assert.IsFalse(decode.HasErrors, "has errors");
|
||||
Assert.AreEqual(offset, decode.ActualOffset, "wrong offset");
|
||||
int actualOffset;
|
||||
bool hasErrors;
|
||||
Assert.IsTrue(decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors));
|
||||
Assert.IsFalse(hasErrors, "has errors");
|
||||
Assert.AreEqual(offset, actualOffset, "wrong offset");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -145,15 +155,17 @@ namespace CUETools.TestParity
|
||||
public void CDRepairDecodeNegativeOffsetTest()
|
||||
{
|
||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
||||
CDRepairEncode decode = new CDRepairEncode(finalSampleCount, stride, npar, true);
|
||||
CDRepairEncode decode = new CDRepairEncode(finalSampleCount, stride, npar, true, false);
|
||||
buff.Prepare(new byte[offset * 4], offset);
|
||||
decode.Write(buff);
|
||||
buff.Prepare(wav, finalSampleCount - offset);
|
||||
decode.Write(buff);
|
||||
decode.Close();
|
||||
decode.VerifyParity(parity);
|
||||
Assert.IsFalse(decode.HasErrors, "has errors");
|
||||
Assert.AreEqual(-offset, decode.ActualOffset, "wrong offset");
|
||||
int actualOffset;
|
||||
bool hasErrors;
|
||||
Assert.IsTrue(decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors));
|
||||
Assert.IsFalse(hasErrors, "has errors");
|
||||
Assert.AreEqual(-offset, actualOffset, "wrong offset");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -163,15 +175,19 @@ namespace CUETools.TestParity
|
||||
public void CDRepairDecodePositiveOffsetErrorsTest()
|
||||
{
|
||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
||||
CDRepairEncode decode = new CDRepairEncode(finalSampleCount, stride, npar, true);
|
||||
CDRepairEncode decode = new CDRepairEncode(finalSampleCount, stride, npar, true, false);
|
||||
Array.Copy(wav2, offset * 4, wav3, 0, (finalSampleCount - offset) * 4);
|
||||
buff.Prepare(wav3, finalSampleCount);
|
||||
decode.Write(buff);
|
||||
decode.Close();
|
||||
decode.VerifyParity(parity);
|
||||
Assert.IsTrue(decode.HasErrors, "doesn't have errors");
|
||||
Assert.IsTrue(decode.CanRecover, "cannot recover");
|
||||
Assert.AreEqual(offset, decode.ActualOffset, "wrong offset");
|
||||
int actualOffset;
|
||||
bool hasErrors;
|
||||
Assert.IsTrue(decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors));
|
||||
Assert.IsTrue(hasErrors, "doesn't have errors");
|
||||
Assert.AreEqual(offset, actualOffset, "wrong offset");
|
||||
CDRepairFix fix = decode.VerifyParity(parity, actualOffset);
|
||||
Assert.IsTrue(fix.HasErrors, "doesn't have errors");
|
||||
Assert.IsTrue(fix.CanRecover, "cannot recover");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -181,16 +197,20 @@ namespace CUETools.TestParity
|
||||
public void CDRepairDecodeNegativeOffsetErrorsTest()
|
||||
{
|
||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
||||
CDRepairEncode decode = new CDRepairEncode(finalSampleCount, stride, npar, true);
|
||||
CDRepairEncode decode = new CDRepairEncode(finalSampleCount, stride, npar, true, false);
|
||||
buff.Prepare(new byte[offset * 4], offset);
|
||||
decode.Write(buff);
|
||||
buff.Prepare(wav2, finalSampleCount - offset);
|
||||
decode.Write(buff);
|
||||
decode.Close();
|
||||
decode.VerifyParity(parity);
|
||||
Assert.IsTrue(decode.HasErrors, "doesn't have errors");
|
||||
Assert.IsTrue(decode.CanRecover, "cannot recover");
|
||||
Assert.AreEqual(-offset, decode.ActualOffset, "wrong offset");
|
||||
int actualOffset;
|
||||
bool hasErrors;
|
||||
Assert.IsTrue(decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors));
|
||||
Assert.IsTrue(hasErrors, "doesn't have errors");
|
||||
Assert.AreEqual(-offset, actualOffset, "wrong offset");
|
||||
CDRepairFix fix = decode.VerifyParity(parity, actualOffset);
|
||||
Assert.IsTrue(fix.HasErrors, "doesn't have errors");
|
||||
Assert.IsTrue(fix.CanRecover, "cannot recover");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@ namespace CUETools.TestParity
|
||||
public void CDRepairEncodeWriteTest()
|
||||
{
|
||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
||||
CDRepairEncode encode = new CDRepairEncode(finalSampleCount, stride, npar, false);
|
||||
CDRepairEncode encode = new CDRepairEncode(finalSampleCount, stride, npar, false, true);
|
||||
buff.Prepare(wav, finalSampleCount);
|
||||
encode.Write(buff);
|
||||
encode.Close();
|
||||
|
||||
@@ -27,6 +27,8 @@ namespace CUETools.TestParity
|
||||
static uint crc;
|
||||
static CDRepairEncode decode;
|
||||
static CDRepairEncode decode2;
|
||||
static CDRepairFix fix;
|
||||
static CDRepairFix fix2;
|
||||
const int offset = 48;
|
||||
|
||||
/// <summary>
|
||||
@@ -60,26 +62,31 @@ namespace CUETools.TestParity
|
||||
wav2[(int)(rnd.NextDouble() * (wav2.Length - 1))] = (byte)(rnd.NextDouble() * 255);
|
||||
|
||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
||||
CDRepairEncode encode = new CDRepairEncode(finalSampleCount, stride, npar, false);
|
||||
CDRepairEncode encode = new CDRepairEncode(finalSampleCount, stride, npar, false, true);
|
||||
buff.Prepare(wav, finalSampleCount);
|
||||
encode.Write(buff);
|
||||
encode.Close();
|
||||
parity = encode.Parity;
|
||||
crc = encode.CRC;
|
||||
|
||||
decode = new CDRepairEncode(finalSampleCount, stride, npar, true);
|
||||
decode = new CDRepairEncode(finalSampleCount, stride, npar, true, false);
|
||||
buff.Prepare(wav2, finalSampleCount);
|
||||
decode.Write(buff);
|
||||
decode.Close();
|
||||
decode.VerifyParity(parity);
|
||||
|
||||
decode2 = new CDRepairEncode(finalSampleCount, stride, npar, true);
|
||||
int actualOffset;
|
||||
bool hasErrors;
|
||||
decode.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors);
|
||||
fix = decode.VerifyParity(parity, actualOffset);
|
||||
|
||||
decode2 = new CDRepairEncode(finalSampleCount, stride, npar, true, false);
|
||||
buff.Prepare(new byte[offset * 4], offset);
|
||||
decode2.Write(buff);
|
||||
buff.Prepare(wav2, finalSampleCount - offset);
|
||||
decode2.Write(buff);
|
||||
decode2.Close();
|
||||
decode2.VerifyParity(parity);
|
||||
decode2.FindOffset(npar, parity, 0, crc, out actualOffset, out hasErrors);
|
||||
fix2 = decode2.VerifyParity(parity, actualOffset);
|
||||
}
|
||||
|
||||
//Use ClassCleanup to run code after all tests in a class have run
|
||||
@@ -108,12 +115,11 @@ namespace CUETools.TestParity
|
||||
[TestMethod()]
|
||||
public void CDRepairFixTest()
|
||||
{
|
||||
Assert.IsTrue(decode.HasErrors);
|
||||
Assert.IsTrue(decode.CanRecover);
|
||||
Assert.AreEqual(0, decode.ActualOffset, "wrong offset");
|
||||
Assert.IsTrue(fix.HasErrors);
|
||||
Assert.IsTrue(fix.CanRecover);
|
||||
Assert.AreEqual(0, fix.ActualOffset, "wrong offset");
|
||||
|
||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
||||
CDRepairFix fix = new CDRepairFix(decode);
|
||||
buff.Prepare(wav2, finalSampleCount);
|
||||
fix.Write(buff);
|
||||
fix.Close();
|
||||
@@ -127,19 +133,18 @@ namespace CUETools.TestParity
|
||||
[TestMethod()]
|
||||
public void CDRepairFixWithOffsetTest()
|
||||
{
|
||||
Assert.IsTrue(decode2.HasErrors);
|
||||
Assert.IsTrue(decode2.CanRecover);
|
||||
Assert.AreEqual(-offset, decode2.ActualOffset, "wrong offset");
|
||||
Assert.IsTrue(fix2.HasErrors);
|
||||
Assert.IsTrue(fix2.CanRecover);
|
||||
Assert.AreEqual(-offset, fix2.ActualOffset, "wrong offset");
|
||||
|
||||
AudioBuffer buff = new AudioBuffer(AudioPCMConfig.RedBook, 0);
|
||||
CDRepairFix fix = new CDRepairFix(decode2);
|
||||
buff.Prepare(new byte[offset * 4], offset);
|
||||
fix.Write(buff);
|
||||
fix2.Write(buff);
|
||||
buff.Prepare(wav2, finalSampleCount - offset);
|
||||
fix.Write(buff);
|
||||
fix.Close();
|
||||
fix2.Write(buff);
|
||||
fix2.Close();
|
||||
|
||||
Assert.AreEqual<uint>(crc, fix.CRC);
|
||||
Assert.AreEqual<uint>(crc, fix2.CRC);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.50727</ProductVersion>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{EF351583-A9CD-4530-92C3-20AC02136BC2}</ProjectGuid>
|
||||
<OutputType>WinExe</OutputType>
|
||||
@@ -15,6 +15,12 @@
|
||||
<GenerateManifests>false</GenerateManifests>
|
||||
<SignManifests>true</SignManifests>
|
||||
<IsWebBootstrapper>true</IsWebBootstrapper>
|
||||
<TargetZone>LocalIntranet</TargetZone>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<OldToolsVersion>2.0</OldToolsVersion>
|
||||
<UpgradeBackupLocation>
|
||||
</UpgradeBackupLocation>
|
||||
<PublishUrl>ftp://cuetools.net/cuetools.net/install/cuetools/</PublishUrl>
|
||||
<Install>true</Install>
|
||||
<InstallFrom>Web</InstallFrom>
|
||||
@@ -31,21 +37,16 @@
|
||||
<PublisherName>CUETools</PublisherName>
|
||||
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
|
||||
<WebPage>publish.htm</WebPage>
|
||||
<ApplicationVersion>2.0.3.%2a</ApplicationVersion>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
<TargetZone>LocalIntranet</TargetZone>
|
||||
<FileUpgradeFlags>
|
||||
</FileUpgradeFlags>
|
||||
<OldToolsVersion>2.0</OldToolsVersion>
|
||||
<ApplicationRevision>7</ApplicationRevision>
|
||||
<UpgradeBackupLocation>
|
||||
</UpgradeBackupLocation>
|
||||
<ApplicationVersion>2.0.3.%2a</ApplicationVersion>
|
||||
<UseApplicationTrust>false</UseApplicationTrust>
|
||||
<BootstrapperEnabled>true</BootstrapperEnabled>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<OutputPath>..\bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
@@ -227,6 +228,10 @@
|
||||
<Project>{14EE067E-C218-4625-9540-2361AB27C4A6}</Project>
|
||||
<Name>CUETools.Compression</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\CUETools.CTDB\CUETools.CTDB.csproj">
|
||||
<Project>{AA2A9A7E-45FB-4632-AD85-85B0E556F818}</Project>
|
||||
<Name>CUETools.CTDB</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\CUETools.Processor\CUETools.Processor.csproj">
|
||||
<Project>{4911BD82-49EF-4858-8B51-5394F86739A4}</Project>
|
||||
<Name>CUETools.Processor</Name>
|
||||
@@ -264,6 +269,8 @@
|
||||
<None Include="Resources\link_go.png" />
|
||||
<None Include="Resources\basket.png" />
|
||||
<None Include="Resources\delete.png" />
|
||||
<None Include="Resources\cdrepair.ico" />
|
||||
<None Include="Resources\cdrepair.png" />
|
||||
<Content Include="unrar.dll">
|
||||
</Content>
|
||||
<Content Include="Resources\accuraterip_16.bmp" />
|
||||
@@ -301,11 +308,31 @@
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework Client Profile</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 2.0</ProductName>
|
||||
<ProductName>.NET Framework 2.0 %28x86%29</ProductName>
|
||||
<Install>true</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.0">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.0 %28x86%29</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>.NET Framework 3.5 SP1</ProductName>
|
||||
<Install>false</Install>
|
||||
</BootstrapperPackage>
|
||||
<BootstrapperPackage Include="Microsoft.Visual.C++.8.0.x86">
|
||||
<Visible>False</Visible>
|
||||
<ProductName>Visual C++ Runtime Libraries %28x86%29</ProductName>
|
||||
@@ -320,6 +347,7 @@
|
||||
<TargetPath>
|
||||
</TargetPath>
|
||||
<PublishState>Include</PublishState>
|
||||
<IncludeHash>True</IncludeHash>
|
||||
<FileType>Satellite</FileType>
|
||||
</PublishFile>
|
||||
<PublishFile Include="ru-RU\CUETools.resources">
|
||||
@@ -329,6 +357,7 @@
|
||||
<TargetPath>
|
||||
</TargetPath>
|
||||
<PublishState>Include</PublishState>
|
||||
<IncludeHash>True</IncludeHash>
|
||||
<FileType>Satellite</FileType>
|
||||
</PublishFile>
|
||||
</ItemGroup>
|
||||
|
||||
@@ -143,6 +143,16 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.Compression.Zip",
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.Ripper", "..\CUETools.Ripper\CUETools.Ripper.csproj", "{D2700165-3E77-4B28-928D-551F5FC11954}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestRipper", "TestRipper\TestRipper.csproj", "{5C8B61C0-BC3D-4316-B8A7-419D55BB5796}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.Parity", "..\CUETools.Parity\CUETools.Parity.csproj", "{ECEB839C-171B-4535-958F-9899310A0342}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.TestParity", "CUETools.TestParity\CUETools.TestParity.csproj", "{6C74652F-1EF4-459E-84F4-99D93D3D17DA}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.CDRepair", "..\CUETools.CDRepair\CUETools.CDRepair.csproj", "{C4869B37-EBB1-47BB-9406-B1209BEAB84B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CUETools.CTDB", "..\CUETools.CTDB\CUETools.CTDB.csproj", "{AA2A9A7E-45FB-4632-AD85-85B0E556F818}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(TestCaseManagementSettings) = postSolution
|
||||
CategoryFile = CUETools1.vsmdi
|
||||
@@ -510,6 +520,46 @@ Global
|
||||
{D2700165-3E77-4B28-928D-551F5FC11954}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D2700165-3E77-4B28-928D-551F5FC11954}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||
{D2700165-3E77-4B28-928D-551F5FC11954}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Debug|Win32.ActiveCfg = Debug|Any CPU
|
||||
{5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||
{5C8B61C0-BC3D-4316-B8A7-419D55BB5796}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{ECEB839C-171B-4535-958F-9899310A0342}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{ECEB839C-171B-4535-958F-9899310A0342}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{ECEB839C-171B-4535-958F-9899310A0342}.Debug|Win32.ActiveCfg = Debug|Any CPU
|
||||
{ECEB839C-171B-4535-958F-9899310A0342}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{ECEB839C-171B-4535-958F-9899310A0342}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{ECEB839C-171B-4535-958F-9899310A0342}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{ECEB839C-171B-4535-958F-9899310A0342}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||
{ECEB839C-171B-4535-958F-9899310A0342}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Debug|Win32.ActiveCfg = Debug|Any CPU
|
||||
{6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||
{6C74652F-1EF4-459E-84F4-99D93D3D17DA}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{C4869B37-EBB1-47BB-9406-B1209BEAB84B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C4869B37-EBB1-47BB-9406-B1209BEAB84B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C4869B37-EBB1-47BB-9406-B1209BEAB84B}.Debug|Win32.ActiveCfg = Debug|Any CPU
|
||||
{C4869B37-EBB1-47BB-9406-B1209BEAB84B}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{C4869B37-EBB1-47BB-9406-B1209BEAB84B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C4869B37-EBB1-47BB-9406-B1209BEAB84B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{C4869B37-EBB1-47BB-9406-B1209BEAB84B}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||
{C4869B37-EBB1-47BB-9406-B1209BEAB84B}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Debug|Win32.ActiveCfg = Debug|Any CPU
|
||||
{AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Release|Win32.ActiveCfg = Release|Any CPU
|
||||
{AA2A9A7E-45FB-4632-AD85-85B0E556F818}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
@@ -546,6 +596,8 @@ Global
|
||||
{DDE1EA77-637C-4D5F-96F3-1328BC45CE80} = {93B7AE1D-DEF6-4A04-A222-5CDE09DF262D}
|
||||
{04945FB2-8410-4F14-8262-2ED18DCDACD6} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4}
|
||||
{A430AD28-B76A-4ED0-AF7D-D13B8969297F} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4}
|
||||
{5C8B61C0-BC3D-4316-B8A7-419D55BB5796} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4}
|
||||
{6C74652F-1EF4-459E-84F4-99D93D3D17DA} = {D9D97BB6-002F-4858-8EF2-49B4C4C4DDB4}
|
||||
{B75FA7AD-968E-4990-B342-1B4B17C850DF} = {B36BE134-D85A-437E-AB61-2DA1CCDE06C1}
|
||||
{F2DFEB00-BB35-4665-85EA-CB8C7729A6B7} = {B36BE134-D85A-437E-AB61-2DA1CCDE06C1}
|
||||
{A05B6AA6-0EC3-495D-BCC4-ECE1210071A8} = {B36BE134-D85A-437E-AB61-2DA1CCDE06C1}
|
||||
|
||||
14
CUETools/Properties/Resources.Designer.cs
generated
14
CUETools/Properties/Resources.Designer.cs
generated
@@ -88,6 +88,20 @@ namespace JDP.Properties {
|
||||
}
|
||||
}
|
||||
|
||||
internal static System.Drawing.Icon cdrepair {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("cdrepair", resourceCulture);
|
||||
return ((System.Drawing.Icon)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
internal static System.Drawing.Bitmap cdrepair1 {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("cdrepair1", resourceCulture);
|
||||
return ((System.Drawing.Bitmap)(obj));
|
||||
}
|
||||
}
|
||||
|
||||
internal static System.Drawing.Bitmap cog {
|
||||
get {
|
||||
object obj = ResourceManager.GetObject("cog", resourceCulture);
|
||||
|
||||
@@ -238,4 +238,10 @@
|
||||
<data name="delete" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\delete.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="cdrepair" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\cdrepair.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
<data name="cdrepair1" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||
<value>..\Resources\cdrepair.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
|
||||
</data>
|
||||
</root>
|
||||
BIN
CUETools/Resources/cdrepair.ico
Normal file
BIN
CUETools/Resources/cdrepair.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
BIN
CUETools/Resources/cdrepair.png
Normal file
BIN
CUETools/Resources/cdrepair.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 702 B |
152
CUETools/TestRipper/CDDriveReaderTest.cs
Normal file
152
CUETools/TestRipper/CDDriveReaderTest.cs
Normal file
@@ -0,0 +1,152 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
using CUETools.Codecs;
|
||||
using CUETools.Ripper;
|
||||
using CUETools.Ripper.SCSI;
|
||||
using Microsoft.VisualStudio.TestTools.UnitTesting;
|
||||
namespace TestRipper
|
||||
{
|
||||
|
||||
|
||||
/// <summary>
|
||||
///This is a test class for CDDriveReaderTest and is intended
|
||||
///to contain all CDDriveReaderTest Unit Tests
|
||||
///</summary>
|
||||
[TestClass()]
|
||||
public class CDDriveReaderTest
|
||||
{
|
||||
|
||||
|
||||
private TestContext testContextInstance;
|
||||
|
||||
/// <summary>
|
||||
///Gets or sets the test context which provides
|
||||
///information about and functionality for the current test run.
|
||||
///</summary>
|
||||
public TestContext TestContext
|
||||
{
|
||||
get
|
||||
{
|
||||
return testContextInstance;
|
||||
}
|
||||
set
|
||||
{
|
||||
testContextInstance = value;
|
||||
}
|
||||
}
|
||||
|
||||
const int pass = 16;
|
||||
const int Sectors2Read = 10000;
|
||||
const int bit_weight = 3;
|
||||
const int c2_weight = 1;
|
||||
|
||||
bool markErrors = true;
|
||||
int _currentStart = 0, _realErrors = 0;
|
||||
byte[] _currentData = new byte[Sectors2Read * 4 * 588];
|
||||
|
||||
static long[,] UserData = new long[Sectors2Read, 4 * 588];
|
||||
static long[,] C2Data = new long[Sectors2Read, 4 * 588 / 8];
|
||||
static byte[] _realData = new byte[Sectors2Read * 4 * 588];
|
||||
static long[] byte2long = new long[256];
|
||||
|
||||
#region Additional test attributes
|
||||
//
|
||||
//You can use the following additional attributes as you write your tests:
|
||||
//
|
||||
//Use ClassInitialize to run code before running the first test in the class
|
||||
[ClassInitialize()]
|
||||
public static void MyClassInitialize(TestContext testContext)
|
||||
{
|
||||
for (long i = 0; i < 256; i++)
|
||||
{
|
||||
long bl = 0;
|
||||
for (int b = 0; b < 8; b++)
|
||||
bl += ((i >> b) & 1) << (b << 3);
|
||||
byte2long[i] = bl;
|
||||
}
|
||||
|
||||
Random rnd = new Random(2314);
|
||||
rnd.NextBytes(_realData);
|
||||
|
||||
for (int p = 0; p <= pass; p++)
|
||||
for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
for (int iPar = 0; iPar < 4 * 588; iPar++)
|
||||
{
|
||||
bool error = rnd.NextDouble() < 0.2;
|
||||
byte val = error ? (byte)rnd.Next(255) : _realData[iSector * 4 * 588 + iPar];
|
||||
UserData[iSector, iPar] += byte2long[val] * bit_weight;
|
||||
if (error && rnd.NextDouble() < 0.5)
|
||||
{
|
||||
C2Data[iSector, iPar >> 3] += (iPar & 7) * 8;
|
||||
UserData[iSector, iPar] += 0x0101010101010101 * (bit_weight / 2) + byte2long[val] * (c2_weight - bit_weight);
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
//Use ClassCleanup to run code after all tests in a class have run
|
||||
//[ClassCleanup()]
|
||||
//public static void MyClassCleanup()
|
||||
//{
|
||||
//}
|
||||
//
|
||||
//Use TestInitialize to run code before running each test
|
||||
[TestInitialize()]
|
||||
public void MyTestInitialize()
|
||||
{
|
||||
}
|
||||
//
|
||||
//Use TestCleanup to run code after each test has run
|
||||
//[TestCleanup()]
|
||||
//public void MyTestCleanup()
|
||||
//{
|
||||
//}
|
||||
//
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
///A test for CorrectSectors
|
||||
///</summary>
|
||||
[TestMethod()]
|
||||
[DeploymentItem("CUETools.Ripper.SCSI.dll")]
|
||||
public void CorrectSectorsTest()
|
||||
{
|
||||
int _currentErrorsCount = 0;
|
||||
int sector = 0;
|
||||
|
||||
for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
{
|
||||
int pos = sector - _currentStart + iSector;
|
||||
int avg = (pass + 1) * bit_weight / 2;
|
||||
int c2_limit = pass / 3; //
|
||||
int er_limit = avg - pass; // allow 33% minority
|
||||
for (int iPar = 0; iPar < 4 * 588; iPar++)
|
||||
{
|
||||
long val = UserData[pos, iPar];
|
||||
byte c2 = (byte)(C2Data[pos, iPar >> 3] >> ((iPar & 7) * 8));
|
||||
int bestValue = 0;
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
int sum = avg - ((int)(val & 0xff));
|
||||
int sig = sum >> 31; // bit value
|
||||
if ((sum ^ sig) < er_limit) _currentErrorsCount++;
|
||||
bestValue += sig & (1 << i);
|
||||
val >>= 8;
|
||||
}
|
||||
//if (c2 > c2_limit)
|
||||
//_currentErrorsCount++;
|
||||
_currentData[pos * 4 * 588 + iPar] = (byte)bestValue;
|
||||
}
|
||||
}
|
||||
for (int p = 0; p <= pass; p++)
|
||||
for (int iSector = 0; iSector < Sectors2Read; iSector++)
|
||||
for (int iPar = 0; iPar < 4 * 588; iPar++)
|
||||
if (_realData[iSector * 4 * 588 + iPar] != _currentData[iSector * 4 * 588 + iPar])
|
||||
_realErrors++;
|
||||
Assert.AreEqual<int>(0, _realErrors, "0 != _realErrors; _currentErrorsCount == " + _currentErrorsCount.ToString());
|
||||
//CollectionAssert.AreEqual(_realData, _currentData, "_realData != _currentData");
|
||||
Assert.AreEqual<int>(0, _currentErrorsCount, "_currentErrorsCount != 0");
|
||||
}
|
||||
}
|
||||
}
|
||||
35
CUETools/TestRipper/Properties/AssemblyInfo.cs
Normal file
35
CUETools/TestRipper/Properties/AssemblyInfo.cs
Normal file
@@ -0,0 +1,35 @@
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("TestRipper")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("Microsoft")]
|
||||
[assembly: AssemblyProduct("TestRipper")]
|
||||
[assembly: AssemblyCopyright("Copyright © Microsoft 2010")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM componenets. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("18afe9af-ef9e-48f4-87cf-76b1ba9f295d")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
// You can specify all the values or you can default the Revision and Build Numbers
|
||||
// by using the '*' as shown below:
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
85
CUETools/TestRipper/TestRipper.csproj
Normal file
85
CUETools/TestRipper/TestRipper.csproj
Normal file
@@ -0,0 +1,85 @@
|
||||
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{5C8B61C0-BC3D-4316-B8A7-419D55BB5796}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>TestRipper</RootNamespace>
|
||||
<AssemblyName>TestRipper</AssemblyName>
|
||||
<TargetFrameworkVersion>v2.0</TargetFrameworkVersion>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<ProjectTypeGuids>{3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
|
||||
<TargetFrameworkSubset>
|
||||
</TargetFrameworkSubset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>..\bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="CDDriveReaderTest.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\Bwg.Logging\Bwg.Logging.csproj">
|
||||
<Project>{F2DFEB00-BB35-4665-85EA-CB8C7729A6B7}</Project>
|
||||
<Name>Bwg.Logging</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\Bwg.Scsi\Bwg.Scsi.csproj">
|
||||
<Project>{A05B6AA6-0EC3-495D-BCC4-ECE1210071A8}</Project>
|
||||
<Name>Bwg.Scsi</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\CUETools.CDImage\CUETools.CDImage.csproj">
|
||||
<Project>{1DD41038-D885-46C5-8DDE-E0B82F066584}</Project>
|
||||
<Name>CUETools.CDImage</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\CUETools.Codecs\CUETools.Codecs.csproj">
|
||||
<Project>{6458A13A-30EF-45A9-9D58-E5031B17BEE2}</Project>
|
||||
<Name>CUETools.Codecs</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\CUETools.Ripper.SCSI\CUETools.Ripper.SCSI.csproj">
|
||||
<Project>{8CF07381-BEA2-4AFC-B3DD-9B2F21C65A3A}</Project>
|
||||
<Name>CUETools.Ripper.SCSI</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\CUETools.Ripper\CUETools.Ripper.csproj">
|
||||
<Project>{D2700165-3E77-4B28-928D-551F5FC11954}</Project>
|
||||
<Name>CUETools.Ripper</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Test References\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
</Project>
|
||||
3
CUETools/TestRipper/app.config
Normal file
3
CUETools/TestRipper/app.config
Normal file
@@ -0,0 +1,3 @@
|
||||
<?xml version="1.0"?>
|
||||
<configuration>
|
||||
<startup><supportedRuntime version="v2.0.50727"/></startup></configuration>
|
||||
57
CUETools/frmCUETools.Designer.cs
generated
57
CUETools/frmCUETools.Designer.cs
generated
@@ -28,8 +28,9 @@ namespace JDP {
|
||||
this.toolStripContainer1 = new System.Windows.Forms.ToolStripContainer();
|
||||
this.statusStrip1 = new System.Windows.Forms.StatusStrip();
|
||||
this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.toolStripStatusLabelAR = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.toolStripStatusLabelProcessed = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.toolStripStatusLabelCTDB = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.toolStripStatusLabelAR = new System.Windows.Forms.ToolStripStatusLabel();
|
||||
this.toolStripProgressBar1 = new System.Windows.Forms.ToolStripProgressBar();
|
||||
this.toolStripProgressBar2 = new System.Windows.Forms.ToolStripProgressBar();
|
||||
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
|
||||
@@ -51,6 +52,8 @@ namespace JDP {
|
||||
this.toolStripMenuItemCorrectorModeLocateFiles = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripMenuItemCorrectorModeChangeExtension = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.toolStripDropDownButtonCorrectorFormat = new System.Windows.Forms.ToolStripDropDownButton();
|
||||
this.tableLayoutPanelVerifyMode = new System.Windows.Forms.TableLayoutPanel();
|
||||
this.checkBoxVerifyUseCDRepair = new System.Windows.Forms.CheckBox();
|
||||
this.grpAudioOutput = new System.Windows.Forms.GroupBox();
|
||||
this.labelEncoderMaxMode = new System.Windows.Forms.Label();
|
||||
this.labelEncoderMinMode = new System.Windows.Forms.Label();
|
||||
@@ -130,6 +133,7 @@ namespace JDP {
|
||||
this.groupBoxMode.SuspendLayout();
|
||||
this.tableLayoutPanelCUEStyle.SuspendLayout();
|
||||
this.toolStripCorrectorFormat.SuspendLayout();
|
||||
this.tableLayoutPanelVerifyMode.SuspendLayout();
|
||||
this.grpAudioOutput.SuspendLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.trackBarEncoderMode)).BeginInit();
|
||||
((System.ComponentModel.ISupportInitialize)(this.pictureBoxMotd)).BeginInit();
|
||||
@@ -177,8 +181,9 @@ namespace JDP {
|
||||
resources.ApplyResources(this.statusStrip1, "statusStrip1");
|
||||
this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.toolStripStatusLabel1,
|
||||
this.toolStripStatusLabelAR,
|
||||
this.toolStripStatusLabelProcessed,
|
||||
this.toolStripStatusLabelCTDB,
|
||||
this.toolStripStatusLabelAR,
|
||||
this.toolStripProgressBar1,
|
||||
this.toolStripProgressBar2});
|
||||
this.statusStrip1.Name = "statusStrip1";
|
||||
@@ -190,13 +195,6 @@ namespace JDP {
|
||||
resources.ApplyResources(this.toolStripStatusLabel1, "toolStripStatusLabel1");
|
||||
this.toolStripStatusLabel1.Spring = true;
|
||||
//
|
||||
// toolStripStatusLabelAR
|
||||
//
|
||||
resources.ApplyResources(this.toolStripStatusLabelAR, "toolStripStatusLabelAR");
|
||||
this.toolStripStatusLabelAR.Image = global::JDP.Properties.Resources.AR;
|
||||
this.toolStripStatusLabelAR.Name = "toolStripStatusLabelAR";
|
||||
this.toolStripStatusLabelAR.Padding = new System.Windows.Forms.Padding(0, 0, 5, 0);
|
||||
//
|
||||
// toolStripStatusLabelProcessed
|
||||
//
|
||||
this.toolStripStatusLabelProcessed.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Top)
|
||||
@@ -206,6 +204,27 @@ namespace JDP {
|
||||
this.toolStripStatusLabelProcessed.Name = "toolStripStatusLabelProcessed";
|
||||
resources.ApplyResources(this.toolStripStatusLabelProcessed, "toolStripStatusLabelProcessed");
|
||||
//
|
||||
// toolStripStatusLabelCTDB
|
||||
//
|
||||
this.toolStripStatusLabelCTDB.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Top)
|
||||
| System.Windows.Forms.ToolStripStatusLabelBorderSides.Right)
|
||||
| System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom)));
|
||||
this.toolStripStatusLabelCTDB.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenOuter;
|
||||
resources.ApplyResources(this.toolStripStatusLabelCTDB, "toolStripStatusLabelCTDB");
|
||||
this.toolStripStatusLabelCTDB.Image = global::JDP.Properties.Resources.cdrepair1;
|
||||
this.toolStripStatusLabelCTDB.Name = "toolStripStatusLabelCTDB";
|
||||
//
|
||||
// toolStripStatusLabelAR
|
||||
//
|
||||
this.toolStripStatusLabelAR.BorderSides = ((System.Windows.Forms.ToolStripStatusLabelBorderSides)((((System.Windows.Forms.ToolStripStatusLabelBorderSides.Left | System.Windows.Forms.ToolStripStatusLabelBorderSides.Top)
|
||||
| System.Windows.Forms.ToolStripStatusLabelBorderSides.Right)
|
||||
| System.Windows.Forms.ToolStripStatusLabelBorderSides.Bottom)));
|
||||
this.toolStripStatusLabelAR.BorderStyle = System.Windows.Forms.Border3DStyle.SunkenOuter;
|
||||
resources.ApplyResources(this.toolStripStatusLabelAR, "toolStripStatusLabelAR");
|
||||
this.toolStripStatusLabelAR.Image = global::JDP.Properties.Resources.AR;
|
||||
this.toolStripStatusLabelAR.Name = "toolStripStatusLabelAR";
|
||||
this.toolStripStatusLabelAR.Padding = new System.Windows.Forms.Padding(0, 0, 5, 0);
|
||||
//
|
||||
// toolStripProgressBar1
|
||||
//
|
||||
this.toolStripProgressBar1.AutoToolTip = true;
|
||||
@@ -287,6 +306,7 @@ namespace JDP {
|
||||
//
|
||||
this.groupBoxMode.Controls.Add(this.tableLayoutPanelCUEStyle);
|
||||
this.groupBoxMode.Controls.Add(this.toolStripCorrectorFormat);
|
||||
this.groupBoxMode.Controls.Add(this.tableLayoutPanelVerifyMode);
|
||||
resources.ApplyResources(this.groupBoxMode, "groupBoxMode");
|
||||
this.groupBoxMode.Name = "groupBoxMode";
|
||||
this.groupBoxMode.TabStop = false;
|
||||
@@ -409,6 +429,20 @@ namespace JDP {
|
||||
this.toolStripDropDownButtonCorrectorFormat.Name = "toolStripDropDownButtonCorrectorFormat";
|
||||
this.toolStripDropDownButtonCorrectorFormat.DropDownItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.toolStripDropDownButtonCorrectorFormat_DropDownItemClicked);
|
||||
//
|
||||
// tableLayoutPanelVerifyMode
|
||||
//
|
||||
resources.ApplyResources(this.tableLayoutPanelVerifyMode, "tableLayoutPanelVerifyMode");
|
||||
this.tableLayoutPanelVerifyMode.Controls.Add(this.checkBoxVerifyUseCDRepair, 0, 0);
|
||||
this.tableLayoutPanelVerifyMode.Name = "tableLayoutPanelVerifyMode";
|
||||
this.toolTip1.SetToolTip(this.tableLayoutPanelVerifyMode, resources.GetString("tableLayoutPanelVerifyMode.ToolTip"));
|
||||
//
|
||||
// checkBoxVerifyUseCDRepair
|
||||
//
|
||||
resources.ApplyResources(this.checkBoxVerifyUseCDRepair, "checkBoxVerifyUseCDRepair");
|
||||
this.checkBoxVerifyUseCDRepair.Image = global::JDP.Properties.Resources.cdrepair1;
|
||||
this.checkBoxVerifyUseCDRepair.Name = "checkBoxVerifyUseCDRepair";
|
||||
this.checkBoxVerifyUseCDRepair.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// grpAudioOutput
|
||||
//
|
||||
this.grpAudioOutput.Controls.Add(this.labelEncoderMaxMode);
|
||||
@@ -997,6 +1031,8 @@ namespace JDP {
|
||||
this.tableLayoutPanelCUEStyle.PerformLayout();
|
||||
this.toolStripCorrectorFormat.ResumeLayout(false);
|
||||
this.toolStripCorrectorFormat.PerformLayout();
|
||||
this.tableLayoutPanelVerifyMode.ResumeLayout(false);
|
||||
this.tableLayoutPanelVerifyMode.PerformLayout();
|
||||
this.grpAudioOutput.ResumeLayout(false);
|
||||
this.grpAudioOutput.PerformLayout();
|
||||
((System.ComponentModel.ISupportInitialize)(this.trackBarEncoderMode)).EndInit();
|
||||
@@ -1118,6 +1154,9 @@ namespace JDP {
|
||||
private System.Windows.Forms.CheckBox checkBoxUseMusicBrainz;
|
||||
private System.Windows.Forms.CheckBox checkBoxUseAccurateRip;
|
||||
private System.Windows.Forms.CheckBox checkBoxUseFreeDb;
|
||||
private System.Windows.Forms.TableLayoutPanel tableLayoutPanelVerifyMode;
|
||||
private System.Windows.Forms.CheckBox checkBoxVerifyUseCDRepair;
|
||||
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabelCTDB;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -479,6 +479,7 @@ namespace JDP {
|
||||
string status = null;
|
||||
bool outputAudio = action == CUEAction.Encode && audioEncoderType != AudioEncoderType.NoAudio;
|
||||
bool useAR = action == CUEAction.Verify || (outputAudio && checkBoxUseAccurateRip.Checked);
|
||||
bool useCUEToolsDB = action == CUEAction.Verify && checkBoxVerifyUseCDRepair.Checked;
|
||||
|
||||
try
|
||||
{
|
||||
@@ -704,7 +705,7 @@ namespace JDP {
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Directory.Exists(pathIn))
|
||||
if (Directory.Exists(pathIn) && !IsCDROM(pathIn))
|
||||
{
|
||||
if (_batchPaths.Count == 0)
|
||||
throw new Exception("is a directory");
|
||||
@@ -742,6 +743,10 @@ namespace JDP {
|
||||
cueSheet.DataTrackLengthMSF = txtDataTrackLength.Text;
|
||||
cueSheet.UseAccurateRip();
|
||||
}
|
||||
if (useCUEToolsDB)
|
||||
{
|
||||
cueSheet.UseCUEToolsDB();
|
||||
}
|
||||
|
||||
if (_batchPaths.Count == 0 && action == CUEAction.Encode)
|
||||
{
|
||||
@@ -751,9 +756,16 @@ namespace JDP {
|
||||
|
||||
this.Invoke((MethodInvoker)delegate()
|
||||
{
|
||||
toolStripStatusLabelAR.Visible = useAR;// && cueSheet.ArVerify.ARStatus == null;
|
||||
toolStripStatusLabelAR.Text = cueSheet.ArVerify.ARStatus == null ? cueSheet.ArVerify.WorstTotal().ToString() : "?";
|
||||
toolStripStatusLabelAR.Enabled = cueSheet.ArVerify.ARStatus == null;
|
||||
toolStripStatusLabelAR.Visible = useAR;
|
||||
toolStripStatusLabelAR.Text = cueSheet.ArVerify.ARStatus == null ? cueSheet.ArVerify.WorstTotal().ToString() : "";
|
||||
toolStripStatusLabelAR.ToolTipText = "AccurateRip: " + (cueSheet.ArVerify.ARStatus ?? "found") + ".";
|
||||
|
||||
toolStripStatusLabelCTDB.Enabled = cueSheet.CTDB.DBStatus == null;
|
||||
toolStripStatusLabelCTDB.Visible = useCUEToolsDB;
|
||||
toolStripStatusLabelCTDB.Text = cueSheet.CTDB.DBStatus == null ? cueSheet.CTDB.Total.ToString() : "";
|
||||
toolStripStatusLabelCTDB.ToolTipText = "CUETools DB: " + (cueSheet.CTDB.DBStatus ?? "found") + ".";
|
||||
|
||||
if (releases != null)
|
||||
{
|
||||
frmChoice dlg = new frmChoice();
|
||||
@@ -808,7 +820,34 @@ namespace JDP {
|
||||
else
|
||||
status = cueSheet.ExecuteScript(script);
|
||||
|
||||
//if (_batchPaths.Count > 0)
|
||||
//if (useCUEToolsDB)
|
||||
//{
|
||||
// if (cueSheet.CTDB.AccResult == HttpStatusCode.NotFound &&
|
||||
// cueSheet.ArVerify.ARStatus == null &&
|
||||
// cueSheet.ArVerify.WorstConfidence() > 2
|
||||
// )
|
||||
// {
|
||||
// this.Invoke((MethodInvoker)delegate()
|
||||
// {
|
||||
// dlgRes = MessageBox.Show(this, "Disc is not present in CUETools Database, " +
|
||||
// "do you want to submit it?", "Overwrite?", (_batchPaths.Count == 0) ?
|
||||
// MessageBoxButtons.YesNo : MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
|
||||
// if (dlgRes == DialogResult.Cancel)
|
||||
// SetupControls(false);
|
||||
// });
|
||||
// if (dlgRes == DialogResult.Cancel)
|
||||
// {
|
||||
// cueSheet.Close();
|
||||
// return;
|
||||
// }
|
||||
// if (dlgRes == DialogResult.Yes)
|
||||
// {
|
||||
// cueSheet.CTDB.Submit((int)cueSheet.ArVerify.WorstConfidence(), (int)cueSheet.ArVerify.WorstTotal());
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
if (_batchPaths.Count > 0)
|
||||
{
|
||||
_batchProcessed++;
|
||||
BatchLog("{0}.", pathIn, status);
|
||||
@@ -836,7 +875,7 @@ namespace JDP {
|
||||
//reportForm.Message = _batchReport.ToString();
|
||||
//reportForm.ShowDialog(this);
|
||||
}
|
||||
else if (useAR)
|
||||
else if (useAR && cueSheet.Processed)
|
||||
{
|
||||
using (StringWriter sw = new StringWriter())
|
||||
{
|
||||
@@ -856,7 +895,7 @@ namespace JDP {
|
||||
//reportForm.ShowDialog(this);
|
||||
}
|
||||
else
|
||||
ShowFinishedMessage(cueSheet.PaddedToFrame);
|
||||
ShowFinishedMessage(cueSheet.PaddedToFrame, status);
|
||||
SetupControls(false);
|
||||
}
|
||||
});
|
||||
@@ -963,6 +1002,7 @@ namespace JDP {
|
||||
groupBoxMode.Enabled = !running;
|
||||
toolStripCorrectorFormat.Visible = SelectedAction == CUEAction.CorrectFilenames;
|
||||
tableLayoutPanelCUEStyle.Visible = converting;
|
||||
tableLayoutPanelVerifyMode.Visible = SelectedAction == CUEAction.Verify;
|
||||
grpOutputPathGeneration.Enabled = !running;
|
||||
grpAudioOutput.Enabled = !running && converting;
|
||||
grpAction.Enabled = !running;
|
||||
@@ -980,6 +1020,7 @@ namespace JDP {
|
||||
toolStripProgressBar1.Value = 0;
|
||||
toolStripProgressBar2.Value = 0;
|
||||
toolStripStatusLabelAR.Visible = false;
|
||||
toolStripStatusLabelCTDB.Visible = false;
|
||||
if (ReportState)
|
||||
{
|
||||
if (_batchReport != null)
|
||||
@@ -1018,7 +1059,7 @@ namespace JDP {
|
||||
return (dlgRes == DialogResult.OK);
|
||||
}
|
||||
|
||||
private void ShowFinishedMessage(bool warnAboutPadding) {
|
||||
private void ShowFinishedMessage(bool warnAboutPadding, string status) {
|
||||
if (_batchPaths.Count != 0) {
|
||||
return;
|
||||
}
|
||||
@@ -1028,7 +1069,7 @@ namespace JDP {
|
||||
"files are from a CD source, this may indicate a problem with your files.",
|
||||
"Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
||||
}
|
||||
MessageBox.Show(this, "Conversion was successful!", "Done", MessageBoxButtons.OK,
|
||||
MessageBox.Show(this, status, "Done", MessageBoxButtons.OK,
|
||||
MessageBoxIcon.Information);
|
||||
}
|
||||
|
||||
@@ -1063,6 +1104,7 @@ namespace JDP {
|
||||
checkBoxUseFreeDb.Checked = _profile._useFreeDb;
|
||||
checkBoxUseMusicBrainz.Checked = _profile._useMusicBrainz;
|
||||
checkBoxUseAccurateRip.Checked = _profile._useAccurateRip;
|
||||
checkBoxVerifyUseCDRepair.Checked = _profile._useCUEToolsDB;
|
||||
}
|
||||
|
||||
private void ActivateProfile(string profileName)
|
||||
@@ -1106,6 +1148,7 @@ namespace JDP {
|
||||
_profile._useFreeDb = checkBoxUseFreeDb.Checked;
|
||||
_profile._useMusicBrainz = checkBoxUseMusicBrainz.Checked;
|
||||
_profile._useAccurateRip = checkBoxUseAccurateRip.Checked;
|
||||
_profile._useCUEToolsDB = checkBoxVerifyUseCDRepair.Checked;
|
||||
|
||||
if (_profile != _defaultProfile)
|
||||
{
|
||||
|
||||
@@ -126,26 +126,11 @@
|
||||
</data>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="toolStripStatusLabel1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>404, 21</value>
|
||||
<value>381, 21</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabel1.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
|
||||
<value>MiddleLeft</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelAR.Font" type="System.Drawing.Font, System.Drawing">
|
||||
<value>Segoe UI, 8.25pt</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelAR.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
|
||||
<value>White</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelAR.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>21, 21</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelAR.TextImageRelation" type="System.Windows.Forms.TextImageRelation, System.Windows.Forms">
|
||||
<value>Overlay</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelAR.ToolTipText" xml:space="preserve">
|
||||
<value>Album found in AccurateRip database.</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelProcessed.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>32, 21</value>
|
||||
</data>
|
||||
@@ -156,6 +141,33 @@
|
||||
<data name="toolStripStatusLabelProcessed.Visible" type="System.Boolean, mscorlib">
|
||||
<value>False</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelCTDB.Font" type="System.Drawing.Font, System.Drawing">
|
||||
<value>Segoe UI, 9pt</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelCTDB.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>39, 21</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelCTDB.Text" xml:space="preserve">
|
||||
<value>77</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelCTDB.Visible" type="System.Boolean, mscorlib">
|
||||
<value>False</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelAR.Font" type="System.Drawing.Font, System.Drawing">
|
||||
<value>Segoe UI, 9pt</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelAR.ImageTransparentColor" type="System.Drawing.Color, System.Drawing">
|
||||
<value>White</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelAR.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>44, 21</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelAR.Text" xml:space="preserve">
|
||||
<value>55</value>
|
||||
</data>
|
||||
<data name="toolStripStatusLabelAR.ToolTipText" xml:space="preserve">
|
||||
<value>Album found in AccurateRip database.</value>
|
||||
</data>
|
||||
<data name="toolStripProgressBar1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>120, 20</value>
|
||||
</data>
|
||||
@@ -265,7 +277,7 @@
|
||||
<value>fileSystemTreeView1</value>
|
||||
</data>
|
||||
<data name=">>fileSystemTreeView1.Type" xml:space="preserve">
|
||||
<value>CUEControls.FileSystemTreeView, CUEControls, Version=1.0.3510.22143, Culture=neutral, PublicKeyToken=null</value>
|
||||
<value>CUEControls.FileSystemTreeView, CUEControls, Version=2.0.5.0, Culture=neutral, PublicKeyToken=null</value>
|
||||
</data>
|
||||
<data name=">>fileSystemTreeView1.Parent" xml:space="preserve">
|
||||
<value>grpInput</value>
|
||||
@@ -319,13 +331,13 @@
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="checkBoxUseAccurateRip.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>95, 80</value>
|
||||
<value>95, 84</value>
|
||||
</data>
|
||||
<data name="checkBoxUseAccurateRip.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>0, 0, 0, 0</value>
|
||||
</data>
|
||||
<data name="checkBoxUseAccurateRip.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>49, 30</value>
|
||||
<value>49, 26</value>
|
||||
</data>
|
||||
<data name="checkBoxUseAccurateRip.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>5</value>
|
||||
@@ -358,13 +370,13 @@
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="checkBoxUseFreeDb.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>47, 80</value>
|
||||
<value>47, 84</value>
|
||||
</data>
|
||||
<data name="checkBoxUseFreeDb.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>0, 0, 0, 0</value>
|
||||
</data>
|
||||
<data name="checkBoxUseFreeDb.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>48, 30</value>
|
||||
<value>48, 26</value>
|
||||
</data>
|
||||
<data name="checkBoxUseFreeDb.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>4</value>
|
||||
@@ -394,13 +406,13 @@
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="rbTracks.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>3, 36</value>
|
||||
<value>3, 40</value>
|
||||
</data>
|
||||
<data name="rbTracks.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>3, 0, 3, 0</value>
|
||||
</data>
|
||||
<data name="rbTracks.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>138, 18</value>
|
||||
<value>138, 20</value>
|
||||
</data>
|
||||
<data name="rbTracks.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>2</value>
|
||||
@@ -439,7 +451,7 @@
|
||||
<value>3, 0, 3, 0</value>
|
||||
</data>
|
||||
<data name="rbEmbedCUE.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>138, 18</value>
|
||||
<value>138, 20</value>
|
||||
</data>
|
||||
<data name="rbEmbedCUE.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>0</value>
|
||||
@@ -472,13 +484,13 @@
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="rbSingleFile.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>3, 18</value>
|
||||
<value>3, 20</value>
|
||||
</data>
|
||||
<data name="rbSingleFile.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>3, 0, 3, 0</value>
|
||||
</data>
|
||||
<data name="rbSingleFile.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>138, 18</value>
|
||||
<value>138, 20</value>
|
||||
</data>
|
||||
<data name="rbSingleFile.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>1</value>
|
||||
@@ -507,14 +519,17 @@
|
||||
<data name="checkBoxUseMusicBrainz.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||
<value>Fill</value>
|
||||
</data>
|
||||
<data name="checkBoxUseMusicBrainz.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="checkBoxUseMusicBrainz.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>0, 80</value>
|
||||
<value>0, 84</value>
|
||||
</data>
|
||||
<data name="checkBoxUseMusicBrainz.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
|
||||
<value>0, 0, 0, 0</value>
|
||||
</data>
|
||||
<data name="checkBoxUseMusicBrainz.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>47, 30</value>
|
||||
<value>47, 26</value>
|
||||
</data>
|
||||
<data name="checkBoxUseMusicBrainz.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>3</value>
|
||||
@@ -565,7 +580,7 @@
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanelCUEStyle.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
|
||||
<value><?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="checkBoxUseAccurateRip" Row="4" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="checkBoxUseFreeDb" Row="4" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="rbTracks" Row="2" RowSpan="1" Column="0" ColumnSpan="3" /><Control Name="rbEmbedCUE" Row="0" RowSpan="1" Column="0" ColumnSpan="3" /><Control Name="rbSingleFile" Row="1" RowSpan="1" Column="0" ColumnSpan="3" /><Control Name="checkBoxUseMusicBrainz" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,33,33333,Percent,33,33334,Percent,33,33334" /><Rows Styles="Percent,16,41941,Percent,16,41942,Percent,16,42196,Percent,24,54545,Percent,26,36364" /></TableLayoutSettings></value>
|
||||
<value><?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="checkBoxUseAccurateRip" Row="4" RowSpan="1" Column="2" ColumnSpan="1" /><Control Name="checkBoxUseFreeDb" Row="4" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="rbTracks" Row="2" RowSpan="1" Column="0" ColumnSpan="3" /><Control Name="rbEmbedCUE" Row="0" RowSpan="1" Column="0" ColumnSpan="3" /><Control Name="rbSingleFile" Row="1" RowSpan="1" Column="0" ColumnSpan="3" /><Control Name="checkBoxUseMusicBrainz" Row="4" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,33,33332,Percent,33,33334,Percent,33,33334" /><Rows Styles="Percent,18,18229,Percent,18,18229,Percent,18,18229,Percent,22,72658,Percent,22,72658" /></TableLayoutSettings></value>
|
||||
</data>
|
||||
<metadata name="toolStripCorrectorFormat.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>3, 17</value>
|
||||
@@ -645,6 +660,69 @@
|
||||
<data name=">>toolStripCorrectorFormat.ZOrder" xml:space="preserve">
|
||||
<value>1</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanelVerifyMode.ColumnCount" type="System.Int32, mscorlib">
|
||||
<value>2</value>
|
||||
</data>
|
||||
<data name="checkBoxVerifyUseCDRepair.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="checkBoxVerifyUseCDRepair.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||
<value>Fill</value>
|
||||
</data>
|
||||
<data name="checkBoxVerifyUseCDRepair.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>3, 3</value>
|
||||
</data>
|
||||
<data name="checkBoxVerifyUseCDRepair.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>45, 29</value>
|
||||
</data>
|
||||
<data name="checkBoxVerifyUseCDRepair.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name=">>checkBoxVerifyUseCDRepair.Name" xml:space="preserve">
|
||||
<value>checkBoxVerifyUseCDRepair</value>
|
||||
</data>
|
||||
<data name=">>checkBoxVerifyUseCDRepair.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>checkBoxVerifyUseCDRepair.Parent" xml:space="preserve">
|
||||
<value>tableLayoutPanelVerifyMode</value>
|
||||
</data>
|
||||
<data name=">>checkBoxVerifyUseCDRepair.ZOrder" xml:space="preserve">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanelVerifyMode.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||
<value>Fill</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanelVerifyMode.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>3, 17</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanelVerifyMode.RowCount" type="System.Int32, mscorlib">
|
||||
<value>2</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanelVerifyMode.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>144, 110</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanelVerifyMode.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>2</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanelVerifyMode.ToolTip" xml:space="preserve">
|
||||
<value>Use CUETools database</value>
|
||||
</data>
|
||||
<data name=">>tableLayoutPanelVerifyMode.Name" xml:space="preserve">
|
||||
<value>tableLayoutPanelVerifyMode</value>
|
||||
</data>
|
||||
<data name=">>tableLayoutPanelVerifyMode.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>tableLayoutPanelVerifyMode.Parent" xml:space="preserve">
|
||||
<value>groupBoxMode</value>
|
||||
</data>
|
||||
<data name=">>tableLayoutPanelVerifyMode.ZOrder" xml:space="preserve">
|
||||
<value>2</value>
|
||||
</data>
|
||||
<data name="tableLayoutPanelVerifyMode.LayoutSettings" type="System.Windows.Forms.TableLayoutSettings, System.Windows.Forms">
|
||||
<value><?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="checkBoxVerifyUseCDRepair" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,36,11111,Percent,63,88889" /><Rows Styles="Percent,32,72727,Percent,67,27273" /></TableLayoutSettings></value>
|
||||
</data>
|
||||
<data name="groupBoxMode.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
||||
<value>Fill</value>
|
||||
</data>
|
||||
@@ -2729,7 +2807,7 @@
|
||||
<value>700, 538</value>
|
||||
</data>
|
||||
<data name="$this.Text" xml:space="preserve">
|
||||
<value>CUETools 2.0.4a</value>
|
||||
<value>CUETools 2.0.5</value>
|
||||
</data>
|
||||
<data name=">>toolStripStatusLabel1.Name" xml:space="preserve">
|
||||
<value>toolStripStatusLabel1</value>
|
||||
@@ -2737,18 +2815,24 @@
|
||||
<data name=">>toolStripStatusLabel1.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>toolStripStatusLabelAR.Name" xml:space="preserve">
|
||||
<value>toolStripStatusLabelAR</value>
|
||||
</data>
|
||||
<data name=">>toolStripStatusLabelAR.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>toolStripStatusLabelProcessed.Name" xml:space="preserve">
|
||||
<value>toolStripStatusLabelProcessed</value>
|
||||
</data>
|
||||
<data name=">>toolStripStatusLabelProcessed.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>toolStripStatusLabelCTDB.Name" xml:space="preserve">
|
||||
<value>toolStripStatusLabelCTDB</value>
|
||||
</data>
|
||||
<data name=">>toolStripStatusLabelCTDB.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>toolStripStatusLabelAR.Name" xml:space="preserve">
|
||||
<value>toolStripStatusLabelAR</value>
|
||||
</data>
|
||||
<data name=">>toolStripStatusLabelAR.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.ToolStripStatusLabel, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>toolStripProgressBar1.Name" xml:space="preserve">
|
||||
<value>toolStripProgressBar1</value>
|
||||
</data>
|
||||
|
||||
31
CUETools/frmSettings.Designer.cs
generated
31
CUETools/frmSettings.Designer.cs
generated
@@ -27,6 +27,7 @@ namespace JDP {
|
||||
System.Windows.Forms.Button btnCancel;
|
||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmSettings));
|
||||
this.grpGeneral = new System.Windows.Forms.GroupBox();
|
||||
this.checkBoxSeparateDecodingThread = new System.Windows.Forms.CheckBox();
|
||||
this.checkBoxCheckForUpdates = new System.Windows.Forms.CheckBox();
|
||||
this.chkAllowMultipleInstances = new System.Windows.Forms.CheckBox();
|
||||
this.chkReducePriority = new System.Windows.Forms.CheckBox();
|
||||
@@ -127,6 +128,7 @@ namespace JDP {
|
||||
this.columnHeader1 = new System.Windows.Forms.ColumnHeader();
|
||||
this.tabPage10 = new System.Windows.Forms.TabPage();
|
||||
this.groupBoxFlaCudaOptions = new System.Windows.Forms.GroupBox();
|
||||
this.checkBoxFlaCudaMultithread = new System.Windows.Forms.CheckBox();
|
||||
this.checkBoxFlaCudaGPUOnly = new System.Windows.Forms.CheckBox();
|
||||
this.checkBoxFlaCudaVerify = new System.Windows.Forms.CheckBox();
|
||||
this.groupBoxExternalEncoder = new System.Windows.Forms.GroupBox();
|
||||
@@ -174,7 +176,7 @@ namespace JDP {
|
||||
this.labelFormatEncoder = new System.Windows.Forms.Label();
|
||||
this.columnHeader2 = new System.Windows.Forms.ColumnHeader();
|
||||
this.checkBox1 = new System.Windows.Forms.CheckBox();
|
||||
this.checkBoxFlaCudaMultithread = new System.Windows.Forms.CheckBox();
|
||||
this.checkBoxUseSystemProxy = new System.Windows.Forms.CheckBox();
|
||||
btnCancel = new System.Windows.Forms.Button();
|
||||
this.grpGeneral.SuspendLayout();
|
||||
this.groupBox1.SuspendLayout();
|
||||
@@ -227,6 +229,8 @@ namespace JDP {
|
||||
//
|
||||
// grpGeneral
|
||||
//
|
||||
this.grpGeneral.Controls.Add(this.checkBoxUseSystemProxy);
|
||||
this.grpGeneral.Controls.Add(this.checkBoxSeparateDecodingThread);
|
||||
this.grpGeneral.Controls.Add(this.checkBoxCheckForUpdates);
|
||||
this.grpGeneral.Controls.Add(this.chkAllowMultipleInstances);
|
||||
this.grpGeneral.Controls.Add(this.chkReducePriority);
|
||||
@@ -238,6 +242,13 @@ namespace JDP {
|
||||
this.grpGeneral.Name = "grpGeneral";
|
||||
this.grpGeneral.TabStop = false;
|
||||
//
|
||||
// checkBoxSeparateDecodingThread
|
||||
//
|
||||
resources.ApplyResources(this.checkBoxSeparateDecodingThread, "checkBoxSeparateDecodingThread");
|
||||
this.checkBoxSeparateDecodingThread.Name = "checkBoxSeparateDecodingThread";
|
||||
this.toolTip1.SetToolTip(this.checkBoxSeparateDecodingThread, resources.GetString("checkBoxSeparateDecodingThread.ToolTip"));
|
||||
this.checkBoxSeparateDecodingThread.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBoxCheckForUpdates
|
||||
//
|
||||
resources.ApplyResources(this.checkBoxCheckForUpdates, "checkBoxCheckForUpdates");
|
||||
@@ -1078,6 +1089,13 @@ namespace JDP {
|
||||
this.groupBoxFlaCudaOptions.Name = "groupBoxFlaCudaOptions";
|
||||
this.groupBoxFlaCudaOptions.TabStop = false;
|
||||
//
|
||||
// checkBoxFlaCudaMultithread
|
||||
//
|
||||
resources.ApplyResources(this.checkBoxFlaCudaMultithread, "checkBoxFlaCudaMultithread");
|
||||
this.checkBoxFlaCudaMultithread.DataBindings.Add(new System.Windows.Forms.Binding("Checked", this.cUEConfigBindingSource, "FlaCudaThreads", true));
|
||||
this.checkBoxFlaCudaMultithread.Name = "checkBoxFlaCudaMultithread";
|
||||
this.checkBoxFlaCudaMultithread.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBoxFlaCudaGPUOnly
|
||||
//
|
||||
resources.ApplyResources(this.checkBoxFlaCudaGPUOnly, "checkBoxFlaCudaGPUOnly");
|
||||
@@ -1455,12 +1473,11 @@ namespace JDP {
|
||||
this.checkBox1.Name = "checkBox1";
|
||||
this.checkBox1.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// checkBoxFlaCudaMultithread
|
||||
// checkBoxUseSystemProxy
|
||||
//
|
||||
resources.ApplyResources(this.checkBoxFlaCudaMultithread, "checkBoxFlaCudaMultithread");
|
||||
this.checkBoxFlaCudaMultithread.DataBindings.Add(new System.Windows.Forms.Binding("Checked", this.cUEConfigBindingSource, "FlaCudaThreads", true));
|
||||
this.checkBoxFlaCudaMultithread.Name = "checkBoxFlaCudaMultithread";
|
||||
this.checkBoxFlaCudaMultithread.UseVisualStyleBackColor = true;
|
||||
resources.ApplyResources(this.checkBoxUseSystemProxy, "checkBoxUseSystemProxy");
|
||||
this.checkBoxUseSystemProxy.Name = "checkBoxUseSystemProxy";
|
||||
this.checkBoxUseSystemProxy.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// frmSettings
|
||||
//
|
||||
@@ -1695,6 +1712,8 @@ namespace JDP {
|
||||
private System.Windows.Forms.CheckBox checkBoxFlaCudaVerify;
|
||||
private System.Windows.Forms.CheckBox checkBox1;
|
||||
private System.Windows.Forms.CheckBox checkBoxFlaCudaMultithread;
|
||||
private System.Windows.Forms.CheckBox checkBoxSeparateDecodingThread;
|
||||
private System.Windows.Forms.CheckBox checkBoxUseSystemProxy;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -84,6 +84,8 @@ namespace JDP {
|
||||
checkBoxFixToNearest.Checked = _config.fixOffsetToNearest;
|
||||
//textBoxARLogExtension.Text = _config.arLogFilenameFormat;
|
||||
numericUpDownMaxResolution.Value = _config.maxAlbumArtSize;
|
||||
checkBoxSeparateDecodingThread.Checked = _config.separateDecodingThread;
|
||||
checkBoxUseSystemProxy.Checked = _config.useSystemProxySettings;
|
||||
|
||||
switch (_config.gapsHandling)
|
||||
{
|
||||
@@ -246,6 +248,8 @@ namespace JDP {
|
||||
_config.fixOffsetToNearest = checkBoxFixToNearest.Checked;
|
||||
//_config.arLogFilenameFormat = textBoxARLogExtension.Text;
|
||||
_config.maxAlbumArtSize = (int) numericUpDownMaxResolution.Value;
|
||||
_config.separateDecodingThread = checkBoxSeparateDecodingThread.Checked;
|
||||
_config.useSystemProxySettings = checkBoxUseSystemProxy.Checked;
|
||||
|
||||
_config.language = ((CultureInfo)comboLanguage.SelectedItem).Name;
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
</data>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="btnCancel.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>273, 290</value>
|
||||
<value>268, 320</value>
|
||||
</data>
|
||||
<data name="btnCancel.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>73, 23</value>
|
||||
@@ -150,6 +150,66 @@
|
||||
<data name=">>btnCancel.ZOrder" xml:space="preserve">
|
||||
<value>1</value>
|
||||
</data>
|
||||
<data name="checkBoxUseSystemProxy.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="checkBoxUseSystemProxy.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>12, 157</value>
|
||||
</data>
|
||||
<data name="checkBoxUseSystemProxy.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>153, 17</value>
|
||||
</data>
|
||||
<data name="checkBoxUseSystemProxy.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>10</value>
|
||||
</data>
|
||||
<data name="checkBoxUseSystemProxy.Text" xml:space="preserve">
|
||||
<value>Use system proxy settings</value>
|
||||
</data>
|
||||
<data name=">>checkBoxUseSystemProxy.Name" xml:space="preserve">
|
||||
<value>checkBoxUseSystemProxy</value>
|
||||
</data>
|
||||
<data name=">>checkBoxUseSystemProxy.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>checkBoxUseSystemProxy.Parent" xml:space="preserve">
|
||||
<value>grpGeneral</value>
|
||||
</data>
|
||||
<data name=">>checkBoxUseSystemProxy.ZOrder" xml:space="preserve">
|
||||
<value>0</value>
|
||||
</data>
|
||||
<data name="checkBoxSeparateDecodingThread.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
</data>
|
||||
<data name="checkBoxSeparateDecodingThread.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>12, 140</value>
|
||||
</data>
|
||||
<data name="checkBoxSeparateDecodingThread.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>168, 17</value>
|
||||
</data>
|
||||
<data name="checkBoxSeparateDecodingThread.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>9</value>
|
||||
</data>
|
||||
<data name="checkBoxSeparateDecodingThread.Text" xml:space="preserve">
|
||||
<value>Separate thread for decoding</value>
|
||||
</data>
|
||||
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<data name="checkBoxSeparateDecodingThread.ToolTip" xml:space="preserve">
|
||||
<value>Improves speed on multicore processors</value>
|
||||
</data>
|
||||
<data name=">>checkBoxSeparateDecodingThread.Name" xml:space="preserve">
|
||||
<value>checkBoxSeparateDecodingThread</value>
|
||||
</data>
|
||||
<data name=">>checkBoxSeparateDecodingThread.Type" xml:space="preserve">
|
||||
<value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</data>
|
||||
<data name=">>checkBoxSeparateDecodingThread.Parent" xml:space="preserve">
|
||||
<value>grpGeneral</value>
|
||||
</data>
|
||||
<data name=">>checkBoxSeparateDecodingThread.ZOrder" xml:space="preserve">
|
||||
<value>1</value>
|
||||
</data>
|
||||
<data name="checkBoxCheckForUpdates.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
</data>
|
||||
@@ -168,9 +228,6 @@
|
||||
<data name="checkBoxCheckForUpdates.Text" xml:space="preserve">
|
||||
<value>Check for updates</value>
|
||||
</data>
|
||||
<metadata name="toolTip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<data name="checkBoxCheckForUpdates.ToolTip" xml:space="preserve">
|
||||
<value>Check for updates</value>
|
||||
</data>
|
||||
@@ -184,7 +241,7 @@
|
||||
<value>grpGeneral</value>
|
||||
</data>
|
||||
<data name=">>checkBoxCheckForUpdates.ZOrder" xml:space="preserve">
|
||||
<value>0</value>
|
||||
<value>2</value>
|
||||
</data>
|
||||
<data name="chkAllowMultipleInstances.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
@@ -217,7 +274,7 @@
|
||||
<value>grpGeneral</value>
|
||||
</data>
|
||||
<data name=">>chkAllowMultipleInstances.ZOrder" xml:space="preserve">
|
||||
<value>1</value>
|
||||
<value>3</value>
|
||||
</data>
|
||||
<data name="chkReducePriority.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
@@ -250,7 +307,7 @@
|
||||
<value>grpGeneral</value>
|
||||
</data>
|
||||
<data name=">>chkReducePriority.ZOrder" xml:space="preserve">
|
||||
<value>2</value>
|
||||
<value>4</value>
|
||||
</data>
|
||||
<data name="chkTruncateExtra4206Samples.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
@@ -283,7 +340,7 @@
|
||||
<value>grpGeneral</value>
|
||||
</data>
|
||||
<data name=">>chkTruncateExtra4206Samples.ZOrder" xml:space="preserve">
|
||||
<value>3</value>
|
||||
<value>5</value>
|
||||
</data>
|
||||
<data name="chkCreateCUEFileWhenEmbedded.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
@@ -316,7 +373,7 @@
|
||||
<value>grpGeneral</value>
|
||||
</data>
|
||||
<data name=">>chkCreateCUEFileWhenEmbedded.ZOrder" xml:space="preserve">
|
||||
<value>4</value>
|
||||
<value>6</value>
|
||||
</data>
|
||||
<data name="chkCreateM3U.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
@@ -349,7 +406,7 @@
|
||||
<value>grpGeneral</value>
|
||||
</data>
|
||||
<data name=">>chkCreateM3U.ZOrder" xml:space="preserve">
|
||||
<value>5</value>
|
||||
<value>7</value>
|
||||
</data>
|
||||
<data name="chkAutoCorrectFilenames.AutoSize" type="System.Boolean, mscorlib">
|
||||
<value>True</value>
|
||||
@@ -382,13 +439,13 @@
|
||||
<value>grpGeneral</value>
|
||||
</data>
|
||||
<data name=">>chkAutoCorrectFilenames.ZOrder" xml:space="preserve">
|
||||
<value>6</value>
|
||||
<value>8</value>
|
||||
</data>
|
||||
<data name="grpGeneral.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>6, 6</value>
|
||||
</data>
|
||||
<data name="grpGeneral.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>252, 144</value>
|
||||
<value>252, 182</value>
|
||||
</data>
|
||||
<data name="grpGeneral.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>0</value>
|
||||
@@ -466,7 +523,7 @@
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="btnOK.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>194, 290</value>
|
||||
<value>189, 320</value>
|
||||
</data>
|
||||
<data name="btnOK.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>73, 23</value>
|
||||
@@ -1612,10 +1669,10 @@
|
||||
<value>Top, Left, Right</value>
|
||||
</data>
|
||||
<data name="groupBoxGaps.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>8, 156</value>
|
||||
<value>6, 193</value>
|
||||
</data>
|
||||
<data name="groupBoxGaps.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>250, 99</value>
|
||||
<value>250, 98</value>
|
||||
</data>
|
||||
<data name="groupBoxGaps.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>16</value>
|
||||
@@ -1642,7 +1699,7 @@
|
||||
<value>3, 3, 3, 3</value>
|
||||
</data>
|
||||
<data name="tabPage1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>535, 261</value>
|
||||
<value>535, 291</value>
|
||||
</data>
|
||||
<data name="tabPage1.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>0</value>
|
||||
@@ -1891,7 +1948,7 @@
|
||||
<value>242, 3</value>
|
||||
</data>
|
||||
<data name="groupBoxAlbumArt.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>284, 255</value>
|
||||
<value>284, 275</value>
|
||||
</data>
|
||||
<data name="groupBoxAlbumArt.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>1</value>
|
||||
@@ -2095,7 +2152,7 @@
|
||||
<value>8, 3</value>
|
||||
</data>
|
||||
<data name="groupBoxTagging.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>226, 255</value>
|
||||
<value>226, 275</value>
|
||||
</data>
|
||||
<data name="groupBoxTagging.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>0</value>
|
||||
@@ -2116,7 +2173,7 @@
|
||||
<value>4, 22</value>
|
||||
</data>
|
||||
<data name="tabPage6.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>535, 261</value>
|
||||
<value>535, 291</value>
|
||||
</data>
|
||||
<data name="tabPage6.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>9</value>
|
||||
@@ -2506,7 +2563,7 @@
|
||||
<value>3, 3, 3, 3</value>
|
||||
</data>
|
||||
<data name="tabPage2.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>535, 261</value>
|
||||
<value>535, 291</value>
|
||||
</data>
|
||||
<data name="tabPage2.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>1</value>
|
||||
@@ -2854,7 +2911,7 @@
|
||||
<value>136, 6</value>
|
||||
</data>
|
||||
<data name="groupBoxFormat.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>390, 249</value>
|
||||
<value>390, 269</value>
|
||||
</data>
|
||||
<data name="groupBoxFormat.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>17</value>
|
||||
@@ -2881,7 +2938,7 @@
|
||||
<value>6, 6</value>
|
||||
</data>
|
||||
<data name="listViewFormats.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>124, 249</value>
|
||||
<value>124, 269</value>
|
||||
</data>
|
||||
<data name="listViewFormats.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>0</value>
|
||||
@@ -2905,7 +2962,7 @@
|
||||
<value>3, 3, 3, 3</value>
|
||||
</data>
|
||||
<data name="tabPage3.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>535, 261</value>
|
||||
<value>535, 291</value>
|
||||
</data>
|
||||
<data name="tabPage3.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>2</value>
|
||||
@@ -3213,7 +3270,7 @@
|
||||
<value>NoControl</value>
|
||||
</data>
|
||||
<data name="buttonEncoderDelete.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>37, 232</value>
|
||||
<value>37, 262</value>
|
||||
</data>
|
||||
<data name="buttonEncoderDelete.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>25, 23</value>
|
||||
@@ -3251,7 +3308,7 @@
|
||||
</value>
|
||||
</data>
|
||||
<data name="buttonEncoderAdd.Location" type="System.Drawing.Point, System.Drawing">
|
||||
<value>6, 232</value>
|
||||
<value>6, 262</value>
|
||||
</data>
|
||||
<data name="buttonEncoderAdd.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>25, 23</value>
|
||||
@@ -3275,7 +3332,7 @@
|
||||
<value>6, 7</value>
|
||||
</data>
|
||||
<data name="listBoxEncoders.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>124, 221</value>
|
||||
<value>124, 247</value>
|
||||
</data>
|
||||
<data name="listBoxEncoders.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>27</value>
|
||||
@@ -3554,7 +3611,7 @@
|
||||
<value>3, 3, 3, 3</value>
|
||||
</data>
|
||||
<data name="tabPage10.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>535, 261</value>
|
||||
<value>535, 291</value>
|
||||
</data>
|
||||
<data name="tabPage10.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>6</value>
|
||||
@@ -3734,7 +3791,7 @@
|
||||
<value>3, 6</value>
|
||||
</data>
|
||||
<data name="listViewDecoders.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>124, 249</value>
|
||||
<value>124, 279</value>
|
||||
</data>
|
||||
<data name="listViewDecoders.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>26</value>
|
||||
@@ -3794,7 +3851,7 @@
|
||||
<value>3, 3, 3, 3</value>
|
||||
</data>
|
||||
<data name="tabPage11.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>535, 261</value>
|
||||
<value>535, 291</value>
|
||||
</data>
|
||||
<data name="tabPage11.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>7</value>
|
||||
@@ -3953,7 +4010,7 @@
|
||||
<value>3, 3, 3, 3</value>
|
||||
</data>
|
||||
<data name="tabPage4.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>535, 261</value>
|
||||
<value>535, 291</value>
|
||||
</data>
|
||||
<data name="tabPage4.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>3</value>
|
||||
@@ -3980,7 +4037,7 @@
|
||||
<value>144, 110</value>
|
||||
</data>
|
||||
<data name="richTextBoxScript.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>382, 145</value>
|
||||
<value>382, 167</value>
|
||||
</data>
|
||||
<data name="richTextBoxScript.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>28</value>
|
||||
@@ -4094,7 +4151,7 @@
|
||||
<value>6, 6</value>
|
||||
</data>
|
||||
<data name="listViewScripts.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>124, 249</value>
|
||||
<value>124, 271</value>
|
||||
</data>
|
||||
<data name="listViewScripts.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>1</value>
|
||||
@@ -4115,7 +4172,7 @@
|
||||
<value>4, 22</value>
|
||||
</data>
|
||||
<data name="tabPage5.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>535, 261</value>
|
||||
<value>535, 291</value>
|
||||
</data>
|
||||
<data name="tabPage5.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>8</value>
|
||||
@@ -4142,7 +4199,7 @@
|
||||
<value>0, 0, 0, 0</value>
|
||||
</data>
|
||||
<data name="tabControl1.Size" type="System.Drawing.Size, System.Drawing">
|
||||
<value>543, 287</value>
|
||||
<value>543, 317</value>
|
||||
</data>
|
||||
<data name="tabControl1.TabIndex" type="System.Int32, mscorlib">
|
||||
<value>0</value>
|
||||
@@ -4241,7 +4298,7 @@
|
||||
<value>6, 13</value>
|
||||
</data>
|
||||
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
||||
<value>542, 325</value>
|
||||
<value>542, 355</value>
|
||||
</data>
|
||||
<data name="$this.Font" type="System.Drawing.Font, System.Drawing">
|
||||
<value>Tahoma, 8.25pt</value>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5">
|
||||
<PropertyGroup>
|
||||
<ProjectType>Local</ProjectType>
|
||||
<ProductVersion>8.0.50727</ProductVersion>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{5ADCFD6D-BFEA-4B10-BB45-9083BBB56AF4}</ProjectGuid>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
@@ -29,7 +29,7 @@
|
||||
<OldToolsVersion>2.0</OldToolsVersion>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<OutputPath>..\bin\win32\Debug\</OutputPath>
|
||||
<OutputPath>..\bin\Debug\</OutputPath>
|
||||
<AllowUnsafeBlocks>false</AllowUnsafeBlocks>
|
||||
<BaseAddress>285212672</BaseAddress>
|
||||
<CheckForOverflowUnderflow>false</CheckForOverflowUnderflow>
|
||||
|
||||
Binary file not shown.
@@ -3,7 +3,7 @@
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>8.0.50727</ProductVersion>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<ProjectGuid>{74C2036B-2C9B-4FC8-B7BD-AE81A8DCE533}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>MusicBrainz</RootNamespace>
|
||||
@@ -18,7 +18,7 @@
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>.</OutputPath>
|
||||
<OutputPath>..\bin\Debug\</OutputPath>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<AssemblyKeyFile>.</AssemblyKeyFile>
|
||||
|
||||
Reference in New Issue
Block a user