mirror of
https://github.com/claunia/cuetools.net.git
synced 2025-12-16 18:14:25 +00:00
* LocalDB merged with file browser
* fixed hangup on truncated flac files * optimized CRC32 calculations
This commit is contained in:
@@ -27,9 +27,9 @@ namespace CUETools.AccurateRip
|
|||||||
{
|
{
|
||||||
int offset = 64 * 64;
|
int offset = 64 * 64;
|
||||||
for (int i = 0; i < 64; i++)
|
for (int i = 0; i < 64; i++)
|
||||||
this.val[i] = ar.CTDBCRC(offset + i * 64 + 64, 2 * offset - 64 - i * 64);
|
this.val[i] = ar.CTDBCRC(0, (i + 1) * 64, offset, 2 * offset);
|
||||||
for (int i = 0; i < 64; i++)
|
for (int i = 0; i < 64; i++)
|
||||||
this.val[i + 64] = ar.CTDBCRC(offset + 64 - 1 - i, 2 * offset - 64 + 1 + i);
|
this.val[i + 64] = ar.CTDBCRC(0, 63 - i, offset, 2 * offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
public OffsetSafeCRCRecord(uint[] val)
|
public OffsetSafeCRCRecord(uint[] val)
|
||||||
@@ -287,10 +287,10 @@ namespace CUETools.AccurateRip
|
|||||||
|
|
||||||
public uint CRC450(int iTrack, int oi)
|
public uint CRC450(int iTrack, int oi)
|
||||||
{
|
{
|
||||||
uint crca = _CRCAR[iTrack + 1, 2 * maxOffset + 5 * 588 + oi];
|
uint crca = _CRCAR[iTrack + 1, 2 * maxOffset + 1 + 5 * 588 + oi];
|
||||||
uint crcb = _CRCAR[iTrack + 1, 2 * maxOffset + 6 * 588 + oi];
|
uint crcb = _CRCAR[iTrack + 1, 2 * maxOffset + 1 + 6 * 588 + oi];
|
||||||
uint suma = _CRCSM[iTrack + 1, 2 * maxOffset + 5 * 588 + oi];
|
uint suma = _CRCSM[iTrack + 1, 2 * maxOffset + 1 + 5 * 588 + oi];
|
||||||
uint sumb = _CRCSM[iTrack + 1, 2 * maxOffset + 6 * 588 + oi];
|
uint sumb = _CRCSM[iTrack + 1, 2 * maxOffset + 1 + 6 * 588 + oi];
|
||||||
uint offs = 450 * 588 + (uint)oi;
|
uint offs = 450 * 588 + (uint)oi;
|
||||||
return crcb - crca - offs * (sumb - suma);
|
return crcb - crca - offs * (sumb - suma);
|
||||||
}
|
}
|
||||||
@@ -329,63 +329,21 @@ namespace CUETools.AccurateRip
|
|||||||
uint crc = 0;
|
uint crc = 0;
|
||||||
if (iTrack == 0)
|
if (iTrack == 0)
|
||||||
{
|
{
|
||||||
// New idea:
|
int dlen = (int)_toc.AudioLength * 588;
|
||||||
// _CRC32[x, maxOffset] keeps crc state at track x boundary
|
if (oi > 0)
|
||||||
// _CRC32[x, maxOffset +- offs] keeps crc state around track x boundary
|
|
||||||
// _CRC32[0, maxOffset] keeps crc state at disc end
|
|
||||||
// _CRC32[0, maxOffset + offs] keeps crc state around disc start
|
|
||||||
// _CRC32[0, maxOffset - offs] keeps crc state around disc end
|
|
||||||
|
|
||||||
//int t0len = (int)_toc[_toc.FirstAudio].Pregap * 588;
|
|
||||||
//int dlen = (int)_toc.AudioLength * 588;
|
|
||||||
//if (oi == 0)
|
|
||||||
//{
|
|
||||||
// // whole disc crc
|
|
||||||
// crc = _CRC32[0, maxOffset];
|
|
||||||
//}
|
|
||||||
//if (oi > 0)
|
|
||||||
//{
|
|
||||||
// // whole disc crc
|
|
||||||
// crc = _CRC32[0, maxOffset];
|
|
||||||
// // substract prefix
|
|
||||||
// // IDEA: copy _CRC32[1, maxOffset + oi - t0len] so we can always use _CRC32[0, maxOffset + oi] even if pregap is short
|
|
||||||
// if (oi >= t0len)
|
|
||||||
// crc = Crc32.Combine(_CRC32[1, maxOffset + oi - t0len], crc, (dlen - oi) * 4);
|
|
||||||
// else
|
|
||||||
// crc = Crc32.Combine(_CRC32[0, maxOffset + oi], crc, (dlen - oi) * 4);
|
|
||||||
// // add zero suffix
|
|
||||||
// crc = Crc32.Combine(crc, 0, oi * 4); // TODO: is crc(0) really 0?
|
|
||||||
//}
|
|
||||||
//if (oi < 0)
|
|
||||||
//{
|
|
||||||
// crc = _CRC32[0, maxOffset + oi];
|
|
||||||
// crc = Crc32.Combine(crc, 0, -oi * 4); // TODO: is crc(0) really 0?
|
|
||||||
//}
|
|
||||||
|
|
||||||
for (iTrack = 0; iTrack <= _toc.AudioTracks; iTrack++)
|
|
||||||
{
|
{
|
||||||
int trackLength = (int)(iTrack > 0 ? _toc[iTrack + _toc.FirstAudio - 1].Length : _toc[_toc.FirstAudio].Pregap) * 588 * 4;
|
// whole disc crc
|
||||||
if (oi < 0 && iTrack == 0)
|
crc = _CRC32[_toc.AudioTracks, 2 * maxOffset];
|
||||||
crc = Crc32.Combine(crc, 0, -oi * 4);
|
// - prefix
|
||||||
if (trackLength == 0)
|
crc = Crc32.Combine(_CRC32[0, oi], crc, (dlen - oi) * 4);
|
||||||
continue;
|
// + zero suffix
|
||||||
if (oi > 0 && (iTrack == 0 || (iTrack == 1 && _toc[_toc.FirstAudio].Pregap == 0)))
|
crc = Crc32.Combine(crc, 0, oi * 4);
|
||||||
{
|
|
||||||
// Calculate track CRC skipping first oi samples by 'subtracting' their CRC
|
|
||||||
crc = Crc32.Combine(_CRC32[iTrack, oi], _CRC32[iTrack, 0], trackLength - oi * 4);
|
|
||||||
}
|
|
||||||
else if (oi < 0 && iTrack == _toc.AudioTracks)
|
|
||||||
{
|
|
||||||
crc = Crc32.Combine(crc, _CRC32[iTrack, 2 * maxOffset + oi], trackLength + oi * 4);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
crc = Crc32.Combine(crc, _CRC32[iTrack, 0], trackLength);
|
|
||||||
}
|
|
||||||
if (oi > 0 && iTrack == _toc.AudioTracks)
|
|
||||||
crc = Crc32.Combine(crc, 0, oi * 4);
|
|
||||||
}
|
}
|
||||||
iTrack = 0;
|
else // if (oi <= 0)
|
||||||
|
{
|
||||||
|
crc = _CRC32[_toc.AudioTracks, 2 * maxOffset + oi];
|
||||||
|
}
|
||||||
|
|
||||||
// Use 0xffffffff as an initial state
|
// Use 0xffffffff as an initial state
|
||||||
crc ^= _CRCMASK[0];
|
crc ^= _CRCMASK[0];
|
||||||
}
|
}
|
||||||
@@ -394,23 +352,13 @@ namespace CUETools.AccurateRip
|
|||||||
int trackLength = (int)(iTrack > 0 ? _toc[iTrack + _toc.FirstAudio - 1].Length : _toc[_toc.FirstAudio].Pregap) * 588 * 4;
|
int trackLength = (int)(iTrack > 0 ? _toc[iTrack + _toc.FirstAudio - 1].Length : _toc[_toc.FirstAudio].Pregap) * 588 * 4;
|
||||||
if (oi > 0)
|
if (oi > 0)
|
||||||
{
|
{
|
||||||
// Calculate track CRC skipping first oi samples by 'subtracting' their CRC
|
crc = iTrack < _toc.AudioTracks ? _CRC32[iTrack + 1, oi]
|
||||||
crc = Crc32.Combine(_CRC32[iTrack, oi], _CRC32[iTrack, 0], trackLength - oi * 4);
|
: Crc32.Combine(_CRC32[iTrack, 2 * maxOffset], 0, oi * 4);
|
||||||
// Add oi samples from next track CRC
|
crc = Crc32.Combine(_CRC32[iTrack, oi], crc, trackLength);
|
||||||
crc = Crc32.Combine(crc, 0, oi * 4);
|
|
||||||
if (iTrack < _toc.AudioTracks)
|
|
||||||
crc ^= _CRC32[iTrack + 1, oi];
|
|
||||||
}
|
}
|
||||||
else if (oi < 0)
|
else //if (oi <= 0)
|
||||||
{
|
{
|
||||||
// Calculate CRC of previous track's last oi samples by 'subtracting' it's last CRCs
|
crc = Crc32.Combine(_CRC32[iTrack - 1, 2 * maxOffset + oi], _CRC32[iTrack, 2 * maxOffset + oi], trackLength);
|
||||||
crc = Crc32.Combine(_CRC32[iTrack - 1, 2 * maxOffset + oi], _CRC32[iTrack - 1, 0], -oi * 4);
|
|
||||||
// Add this track's CRC without last oi samples
|
|
||||||
crc = Crc32.Combine(crc, _CRC32[iTrack, 2 * maxOffset + oi], trackLength + oi * 4);
|
|
||||||
}
|
|
||||||
else // oi == 0
|
|
||||||
{
|
|
||||||
crc = _CRC32[iTrack, 0];
|
|
||||||
}
|
}
|
||||||
// Use 0xffffffff as an initial state
|
// Use 0xffffffff as an initial state
|
||||||
crc ^= _CRCMASK[iTrack];
|
crc ^= _CRCMASK[iTrack];
|
||||||
@@ -429,59 +377,47 @@ namespace CUETools.AccurateRip
|
|||||||
{
|
{
|
||||||
if (_CacheCRCWN[iTrack, _arOffsetRange + oi] == 0)
|
if (_CacheCRCWN[iTrack, _arOffsetRange + oi] == 0)
|
||||||
{
|
{
|
||||||
uint crc = 0xffffffff;
|
uint crc;
|
||||||
|
int cnt;
|
||||||
if (iTrack == 0)
|
if (iTrack == 0)
|
||||||
{
|
{
|
||||||
for (iTrack = 0; iTrack <= _toc.AudioTracks; iTrack++)
|
if (oi > 0)
|
||||||
{
|
{
|
||||||
int trackLength = (int)(iTrack > 0 ? _toc[iTrack + _toc.FirstAudio - 1].Length : _toc[_toc.FirstAudio].Pregap) * 588 * 4
|
// whole disc crc
|
||||||
- _CRCNL[iTrack, 0] * 2;
|
cnt = _CRCNL[_toc.AudioTracks, 2 * maxOffset] * 2;
|
||||||
crc = Crc32.Combine(crc, _CRCWN[iTrack, 0], trackLength);
|
crc = _CRCWN[_toc.AudioTracks, 2 * maxOffset];
|
||||||
|
// - prefix
|
||||||
|
cnt -= _CRCNL[0, oi] * 2;
|
||||||
|
crc = Crc32.Combine(_CRCWN[0, oi], crc, cnt);
|
||||||
}
|
}
|
||||||
iTrack = 0;
|
else // if (oi <= 0)
|
||||||
|
{
|
||||||
|
cnt = _CRCNL[_toc.AudioTracks, 2 * maxOffset + oi] * 2;
|
||||||
|
crc = _CRCWN[_toc.AudioTracks, 2 * maxOffset + oi];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int trackLength = (int)(iTrack > 0 ? _toc[iTrack + _toc.FirstAudio - 1].Length : _toc[_toc.FirstAudio].Pregap) * 588 * 4;
|
|
||||||
if (oi > 0)
|
if (oi > 0)
|
||||||
{
|
{
|
||||||
int nonzeroPrevLength = trackLength - oi * 4 -
|
cnt = (iTrack < _toc.AudioTracks ? _CRCNL[iTrack + 1, oi] : _CRCNL[iTrack, 2 * maxOffset]) * 2;
|
||||||
(_CRCNL[iTrack, 0] - _CRCNL[iTrack, oi]) * 2;
|
crc = iTrack < _toc.AudioTracks ? _CRCWN[iTrack + 1, oi] : _CRCWN[iTrack, 2 * maxOffset];
|
||||||
// Calculate track CRC skipping first oi samples by 'subtracting' their CRC
|
|
||||||
crc = Crc32.Combine(
|
cnt -= _CRCNL[iTrack, oi] * 2;
|
||||||
_CRCWN[iTrack, oi],
|
crc = Crc32.Combine(_CRCWN[iTrack, oi], crc, cnt);
|
||||||
_CRCWN[iTrack, 0],
|
|
||||||
nonzeroPrevLength);
|
|
||||||
// Use 0xffffffff as an initial state
|
|
||||||
crc = Crc32.Combine(0xffffffff, crc, nonzeroPrevLength);
|
|
||||||
// Add oi samples from next track CRC
|
|
||||||
if (iTrack < _toc.AudioTracks)
|
|
||||||
crc = Crc32.Combine(crc,
|
|
||||||
_CRCWN[iTrack + 1, oi],
|
|
||||||
oi * 4 - _CRCNL[iTrack + 1, oi] * 2);
|
|
||||||
}
|
}
|
||||||
else if (oi < 0)
|
else //if (oi <= 0)
|
||||||
{
|
{
|
||||||
int nonzeroPrevLength = -oi * 4 -
|
cnt = _CRCNL[iTrack, 2 * maxOffset + oi] * 2;
|
||||||
(_CRCNL[iTrack - 1, 0] - _CRCNL[iTrack - 1, 2 * maxOffset + oi]) * 2;
|
crc = _CRCWN[iTrack, 2 * maxOffset + oi];
|
||||||
// Calculate CRC of previous track's last oi samples by 'subtracting' it's last CRCs
|
|
||||||
crc = Crc32.Combine(
|
cnt -= _CRCNL[iTrack - 1, 2 * maxOffset + oi] * 2;
|
||||||
_CRCWN[iTrack - 1, 2 * maxOffset + oi],
|
crc = Crc32.Combine(_CRCWN[iTrack - 1, 2 * maxOffset + oi], crc, cnt);
|
||||||
_CRCWN[iTrack - 1, 0],
|
|
||||||
nonzeroPrevLength);
|
|
||||||
// Use 0xffffffff as an initial state
|
|
||||||
crc = Crc32.Combine(0xffffffff, crc, nonzeroPrevLength);
|
|
||||||
// Add this track's CRC without last oi samples
|
|
||||||
crc = Crc32.Combine(crc,
|
|
||||||
_CRCWN[iTrack, 2 * maxOffset + oi],
|
|
||||||
trackLength + oi * 4 - _CRCNL[iTrack, 2 * maxOffset + oi] * 2);
|
|
||||||
}
|
|
||||||
else // oi == 0
|
|
||||||
{
|
|
||||||
// Use 0xffffffff as an initial state
|
|
||||||
crc = Crc32.Combine(0xffffffff, _CRCWN[iTrack, 0], trackLength - _CRCNL[iTrack, 0] * 2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
// Use 0xffffffff as an initial state
|
||||||
|
crc = Crc32.Combine(0xffffffff, crc, cnt);
|
||||||
_CacheCRCWN[iTrack, _arOffsetRange + oi] = crc ^ 0xffffffff;
|
_CacheCRCWN[iTrack, _arOffsetRange + oi] = crc ^ 0xffffffff;
|
||||||
}
|
}
|
||||||
return _CacheCRCWN[iTrack, _arOffsetRange + oi];
|
return _CacheCRCWN[iTrack, _arOffsetRange + oi];
|
||||||
@@ -503,7 +439,6 @@ namespace CUETools.AccurateRip
|
|||||||
private int maxOffset;
|
private int maxOffset;
|
||||||
internal ushort[] leadin;
|
internal ushort[] leadin;
|
||||||
internal ushort[] leadout;
|
internal ushort[] leadout;
|
||||||
private uint preLeadoutCrc;
|
|
||||||
private int stride = 1, laststride = 1, stridecount = 1, npar = 1;
|
private int stride = 1, laststride = 1, stridecount = 1, npar = 1;
|
||||||
private bool calcSyn = false;
|
private bool calcSyn = false;
|
||||||
private bool calcParity = false;
|
private bool calcParity = false;
|
||||||
@@ -523,38 +458,56 @@ namespace CUETools.AccurateRip
|
|||||||
Init(_toc);
|
Init(_toc);
|
||||||
}
|
}
|
||||||
|
|
||||||
public unsafe uint CTDBCRC(int prefixSamples, int suffixSamples)
|
public unsafe uint CTDBCRC(int iTrack, int oi, int prefixSamples, int suffixSamples)
|
||||||
{
|
{
|
||||||
if (prefixSamples > maxOffset || suffixSamples > maxOffset)
|
prefixSamples += oi;
|
||||||
|
suffixSamples -= oi;
|
||||||
|
if (prefixSamples < 0 || prefixSamples >= maxOffset || suffixSamples < 0 || suffixSamples > maxOffset)
|
||||||
throw new ArgumentOutOfRangeException();
|
throw new ArgumentOutOfRangeException();
|
||||||
|
|
||||||
int discLen = (int)_toc.AudioLength * 588;
|
uint crc;
|
||||||
int lastTrackLen = (int)_toc[_toc.FirstAudio + (int)_toc.AudioTracks - 1].Length * 588;
|
if (iTrack == 0)
|
||||||
int trackOneBorder = (int)_toc[_toc.FirstAudio].Pregap * 588;
|
|
||||||
|
|
||||||
if (preLeadoutCrc == 0)
|
|
||||||
{
|
{
|
||||||
preLeadoutCrc = CRC32(0, 0) ^ _CRCMASK[0];
|
int discLen = (int)_toc.AudioLength * 588;
|
||||||
preLeadoutCrc = Crc32.Substract(preLeadoutCrc, _CRC32[_toc.AudioTracks, 0], lastTrackLen * 4);
|
int chunkLen = discLen - prefixSamples - suffixSamples;
|
||||||
|
crc = Crc32.Combine(
|
||||||
|
_CRC32[0, prefixSamples],
|
||||||
|
_CRC32[_toc.AudioTracks, 2 * maxOffset - suffixSamples],
|
||||||
|
chunkLen * 4);
|
||||||
|
return Crc32.Combine(0xffffffff, crc, chunkLen * 4) ^ 0xffffffff;
|
||||||
}
|
}
|
||||||
|
int posA = (int)_toc[iTrack + _toc.FirstAudio - 1].Start * 588 + (iTrack > 1 ? oi : prefixSamples);
|
||||||
uint crcA = prefixSamples == 0 ? 0
|
int posB = iTrack < _toc.AudioTracks ?
|
||||||
: prefixSamples < trackOneBorder ? _CRC32[0, prefixSamples]
|
(int)_toc[iTrack + 1 + _toc.FirstAudio - 1].Start * 588 + oi :
|
||||||
: trackOneBorder == 0 ? _CRC32[1, prefixSamples - trackOneBorder]
|
(int)_toc.AudioLength * 588 - suffixSamples;
|
||||||
: Crc32.Combine(_CRC32[0, 0], _CRC32[1, prefixSamples - trackOneBorder], (prefixSamples - trackOneBorder) * 4);
|
uint crcA, crcB;
|
||||||
if (_toc.AudioTracks == 1)
|
if (oi > 0)
|
||||||
{
|
{
|
||||||
uint crcY = Crc32.Combine(crcA, _CRC32[_toc.AudioTracks, 2 * maxOffset - suffixSamples], (discLen - prefixSamples - suffixSamples) * 4);
|
crcA = iTrack > 1 ?
|
||||||
return Crc32.Combine(0xffffffff, crcY, (discLen - prefixSamples - suffixSamples) * 4) ^ 0xffffffff;
|
_CRC32[iTrack, oi]:
|
||||||
|
_CRC32[iTrack, prefixSamples];
|
||||||
|
crcB = iTrack < _toc.AudioTracks ?
|
||||||
|
_CRC32[iTrack + 1, oi] :
|
||||||
|
_CRC32[iTrack, maxOffset * 2 - suffixSamples];
|
||||||
}
|
}
|
||||||
uint crcXE = Crc32.Combine(crcA, preLeadoutCrc, (discLen - prefixSamples - lastTrackLen) * 4);
|
else //if (oi <= 0)
|
||||||
uint crcX = Crc32.Combine(crcXE, _CRC32[_toc.AudioTracks, 2 * maxOffset - suffixSamples], (lastTrackLen - suffixSamples) * 4);
|
{
|
||||||
return Crc32.Combine(0xffffffff, crcX, (discLen - prefixSamples - suffixSamples) * 4) ^ 0xffffffff;
|
crcA = iTrack > 1 ?
|
||||||
|
_CRC32[iTrack - 1, maxOffset * 2 + oi] :
|
||||||
|
_CRC32[iTrack, prefixSamples];
|
||||||
|
crcB = iTrack < _toc.AudioTracks ?
|
||||||
|
_CRC32[iTrack, maxOffset * 2 + oi] :
|
||||||
|
_CRC32[iTrack, maxOffset * 2 - suffixSamples];
|
||||||
|
}
|
||||||
|
crc = Crc32.Combine(crcA, crcB, (posB - posA) * 4);
|
||||||
|
// Use 0xffffffff as an initial state
|
||||||
|
crc = Crc32.Combine(0xffffffff, crc, (posB - posA) * 4) ^ 0xffffffff;
|
||||||
|
return crc;
|
||||||
}
|
}
|
||||||
|
|
||||||
public uint CTDBCRC(int actualOffset)
|
public uint CTDBCRC(int offset)
|
||||||
{
|
{
|
||||||
return CTDBCRC(stride / 2 - actualOffset, laststride / 2 + actualOffset);
|
return CTDBCRC(0, offset, stride / 2, laststride / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
private unsafe static void CalcSyn8(ushort* exp, ushort* log, ushort* syn, uint lo, uint n, int npar)
|
private unsafe static void CalcSyn8(ushort* exp, ushort* log, ushort* syn, uint lo, uint n, int npar)
|
||||||
@@ -645,11 +598,12 @@ namespace CUETools.AccurateRip
|
|||||||
bool doPar = currentStride >= 1 && currentStride <= stridecount && calcParity;
|
bool doPar = currentStride >= 1 && currentStride <= stridecount && calcParity;
|
||||||
uint n = (uint)(stridecount - currentStride);
|
uint n = (uint)(stridecount - currentStride);
|
||||||
|
|
||||||
|
int crcTrack = _currentTrack + (_samplesDoneTrack == 0 && _currentTrack > 0 ? -1 : 0);
|
||||||
uint crcar = _CRCAR[_currentTrack, 0];
|
uint crcar = _CRCAR[_currentTrack, 0];
|
||||||
uint crcsm = _CRCSM[_currentTrack, 0];
|
uint crcsm = _CRCSM[_currentTrack, 0];
|
||||||
uint crc32 = _CRC32[_currentTrack, 0];
|
uint crc32 = _CRC32[crcTrack, 2 * maxOffset];
|
||||||
uint crcwn = _CRCWN[_currentTrack, 0];
|
uint crcwn = _CRCWN[crcTrack, 2 * maxOffset];
|
||||||
int crcnl = _CRCNL[_currentTrack, 0];
|
int crcnl = _CRCNL[crcTrack, 2 * maxOffset];
|
||||||
uint crcv2 = _CRCV2[_currentTrack, 0];
|
uint crcv2 = _CRCV2[_currentTrack, 0];
|
||||||
int peak = _Peak[_currentTrack];
|
int peak = _Peak[_currentTrack];
|
||||||
|
|
||||||
@@ -678,8 +632,8 @@ namespace CUETools.AccurateRip
|
|||||||
{
|
{
|
||||||
crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ lo)];
|
crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ lo)];
|
||||||
crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ (lo >> 8))];
|
crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ (lo >> 8))];
|
||||||
|
crcnl++;
|
||||||
}
|
}
|
||||||
else crcnl++;
|
|
||||||
|
|
||||||
int pk = ((int)(lo << 16)) >> 16;
|
int pk = ((int)(lo << 16)) >> 16;
|
||||||
peak = Math.Max(peak, (pk << 1) ^ (pk >> 31));
|
peak = Math.Max(peak, (pk << 1) ^ (pk >> 31));
|
||||||
@@ -694,8 +648,8 @@ namespace CUETools.AccurateRip
|
|||||||
{
|
{
|
||||||
crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ hi)];
|
crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ hi)];
|
||||||
crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ (hi >> 8))];
|
crcwn = (crcwn >> 8) ^ t[(byte)(crcwn ^ (hi >> 8))];
|
||||||
|
crcnl++;
|
||||||
}
|
}
|
||||||
else crcnl++;
|
|
||||||
|
|
||||||
pk = ((int)(hi << 16)) >> 16;
|
pk = ((int)(hi << 16)) >> 16;
|
||||||
peak = Math.Max(peak, (pk << 1) ^ (pk >> 31));
|
peak = Math.Max(peak, (pk << 1) ^ (pk >> 31));
|
||||||
@@ -706,9 +660,9 @@ namespace CUETools.AccurateRip
|
|||||||
|
|
||||||
_CRCAR[_currentTrack, 0] = crcar;
|
_CRCAR[_currentTrack, 0] = crcar;
|
||||||
_CRCSM[_currentTrack, 0] = crcsm;
|
_CRCSM[_currentTrack, 0] = crcsm;
|
||||||
_CRC32[_currentTrack, 0] = crc32;
|
_CRC32[_currentTrack, 2 * maxOffset] = crc32;
|
||||||
_CRCWN[_currentTrack, 0] = crcwn;
|
_CRCWN[_currentTrack, 2 * maxOffset] = crcwn;
|
||||||
_CRCNL[_currentTrack, 0] = crcnl;
|
_CRCNL[_currentTrack, 2 * maxOffset] = crcnl;
|
||||||
_CRCV2[_currentTrack, 0] = crcv2;
|
_CRCV2[_currentTrack, 0] = crcv2;
|
||||||
_Peak[_currentTrack] = peak;
|
_Peak[_currentTrack] = peak;
|
||||||
}
|
}
|
||||||
@@ -773,7 +727,7 @@ namespace CUETools.AccurateRip
|
|||||||
|
|
||||||
int offset = _samplesDoneTrack < maxOffset ? _samplesDoneTrack
|
int offset = _samplesDoneTrack < maxOffset ? _samplesDoneTrack
|
||||||
: _samplesRemTrack <= maxOffset ? 2 * maxOffset - _samplesRemTrack
|
: _samplesRemTrack <= maxOffset ? 2 * maxOffset - _samplesRemTrack
|
||||||
: _samplesDoneTrack >= 445 * 588 && _samplesDoneTrack <= 455 * 588 ? 2 * maxOffset + _samplesDoneTrack - 445 * 588
|
: _samplesDoneTrack >= 445 * 588 && _samplesDoneTrack <= 455 * 588 ? 2 * maxOffset + 1 + _samplesDoneTrack - 445 * 588
|
||||||
: -1;
|
: -1;
|
||||||
|
|
||||||
CalculateCRCs(t, exp, log, synptr, wr, samples, copyCount, offset);
|
CalculateCRCs(t, exp, log, synptr, wr, samples, copyCount, offset);
|
||||||
@@ -784,15 +738,26 @@ namespace CUETools.AccurateRip
|
|||||||
Array.Copy(_CRC32, _currentTrack * 3 * maxOffset + _samplesDoneTrack,
|
Array.Copy(_CRC32, _currentTrack * 3 * maxOffset + _samplesDoneTrack,
|
||||||
_CRC32, _currentTrack * 3 * maxOffset + 2 * maxOffset - _samplesRemTrack,
|
_CRC32, _currentTrack * 3 * maxOffset + 2 * maxOffset - _samplesRemTrack,
|
||||||
copyCount);
|
copyCount);
|
||||||
|
Array.Copy(_CRCWN, _currentTrack * 3 * maxOffset + _samplesDoneTrack,
|
||||||
|
_CRCWN, _currentTrack * 3 * maxOffset + 2 * maxOffset - _samplesRemTrack,
|
||||||
|
copyCount);
|
||||||
|
Array.Copy(_CRCNL, _currentTrack * 3 * maxOffset + _samplesDoneTrack,
|
||||||
|
_CRCNL, _currentTrack * 3 * maxOffset + 2 * maxOffset - _samplesRemTrack,
|
||||||
|
copyCount);
|
||||||
|
}
|
||||||
|
// duplicate prefix to pregap
|
||||||
|
if (_sampleCount < maxOffset && _currentTrack == 1)
|
||||||
|
{
|
||||||
|
Array.Copy(_CRC32, _currentTrack * 3 * maxOffset + _samplesDoneTrack,
|
||||||
|
_CRC32, _sampleCount,
|
||||||
|
copyCount);
|
||||||
|
Array.Copy(_CRCWN, _currentTrack * 3 * maxOffset + _samplesDoneTrack,
|
||||||
|
_CRCWN, _sampleCount,
|
||||||
|
copyCount);
|
||||||
|
Array.Copy(_CRCNL, _currentTrack * 3 * maxOffset + _samplesDoneTrack,
|
||||||
|
_CRCNL, _sampleCount,
|
||||||
|
copyCount);
|
||||||
}
|
}
|
||||||
//// duplicate prefix to pregap
|
|
||||||
//// be careful here not overwrite _CRC32[0, maxOffset] which can hold disc CRC in the future!!!
|
|
||||||
//if (_sampleCount < maxOffset && _currentTrack == 1)
|
|
||||||
//{
|
|
||||||
// Array.Copy(_CRC32, _currentTrack * 3 * maxOffset + _samplesDoneTrack,
|
|
||||||
// _CRC32, _sampleCount,
|
|
||||||
// copyCount);
|
|
||||||
//}
|
|
||||||
|
|
||||||
pos += copyCount;
|
pos += copyCount;
|
||||||
_samplesRemTrack -= copyCount;
|
_samplesRemTrack -= copyCount;
|
||||||
@@ -823,6 +788,22 @@ namespace CUETools.AccurateRip
|
|||||||
if (currentOffset >= start && currentOffset < end)
|
if (currentOffset >= start && currentOffset < end)
|
||||||
this.leadout[i] = part.leadout[i];
|
this.leadout[i] = part.leadout[i];
|
||||||
}
|
}
|
||||||
|
int iSplitTrack = -1;
|
||||||
|
for (int iTrack = 0; iTrack <= _toc.AudioTracks; iTrack++)
|
||||||
|
{
|
||||||
|
int tempLocation = (int)(iTrack == 0 ? 0 : _toc[_toc.FirstAudio + iTrack - 1].Start - _toc[_toc.FirstAudio][0].Start) * 588;
|
||||||
|
int tempLen = (int)(iTrack == 0 ? _toc[_toc.FirstAudio].Pregap : _toc[_toc.FirstAudio + iTrack - 1].Length) * 588;
|
||||||
|
if (start > tempLocation && start <= tempLocation + tempLen)
|
||||||
|
{
|
||||||
|
iSplitTrack = iTrack;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint crc32 = _CRC32[iSplitTrack, 2 * maxOffset];
|
||||||
|
uint crcwn = _CRCWN[iSplitTrack, 2 * maxOffset];
|
||||||
|
int crcnl = _CRCNL[iSplitTrack, 2 * maxOffset];
|
||||||
|
|
||||||
for (int iTrack = 0; iTrack <= _toc.AudioTracks; iTrack++)
|
for (int iTrack = 0; iTrack <= _toc.AudioTracks; iTrack++)
|
||||||
{
|
{
|
||||||
// ??? int tempLocation = (int) (iTrack == 0 ? _toc[_toc.FirstAudio][0].Start : _toc[_toc.FirstAudio + iTrack - 1].Start) * 588;
|
// ??? int tempLocation = (int) (iTrack == 0 ? _toc[_toc.FirstAudio][0].Start : _toc[_toc.FirstAudio + iTrack - 1].Start) * 588;
|
||||||
@@ -836,39 +817,32 @@ namespace CUETools.AccurateRip
|
|||||||
uint crcar = _CRCAR[iTrack, 0];
|
uint crcar = _CRCAR[iTrack, 0];
|
||||||
uint crcv2 = _CRCV2[iTrack, 0];
|
uint crcv2 = _CRCV2[iTrack, 0];
|
||||||
uint crcsm = _CRCSM[iTrack, 0];
|
uint crcsm = _CRCSM[iTrack, 0];
|
||||||
uint crc32 = _CRC32[iTrack, 0];
|
|
||||||
uint crcwn = _CRCWN[iTrack, 0];
|
|
||||||
int crcnl = _CRCNL[iTrack, 0];
|
|
||||||
_CRCAR[iTrack, 0] = crcar + part._CRCAR[iTrack, 0];
|
_CRCAR[iTrack, 0] = crcar + part._CRCAR[iTrack, 0];
|
||||||
_CRCSM[iTrack, 0] = crcsm + part._CRCSM[iTrack, 0];
|
_CRCSM[iTrack, 0] = crcsm + part._CRCSM[iTrack, 0];
|
||||||
_CRCNL[iTrack, 0] = crcnl + part._CRCNL[iTrack, 0];
|
|
||||||
_CRC32[iTrack, 0] = Crc32.Combine(crc32, part._CRC32[iTrack, 0], 4 * (trEnd - trStart));
|
|
||||||
_CRCWN[iTrack, 0] = Crc32.Combine(crcwn, part._CRCWN[iTrack, 0], 4 * (trEnd - trStart) - 2 * part._CRCNL[iTrack, 0]);
|
|
||||||
_CRCV2[iTrack, 0] = crcv2 + part._CRCV2[iTrack, 0];
|
_CRCV2[iTrack, 0] = crcv2 + part._CRCV2[iTrack, 0];
|
||||||
for (int i = 1; i < 3 * maxOffset; i++)
|
|
||||||
|
for (int i = 0; i < 3 * maxOffset; i++)
|
||||||
{
|
{
|
||||||
int currentOffset;
|
int currentOffset;
|
||||||
if (i < maxOffset)
|
if (i < maxOffset)
|
||||||
{
|
|
||||||
currentOffset = tempLocation + i;
|
currentOffset = tempLocation + i;
|
||||||
}
|
|
||||||
else if (i < 2 * maxOffset)
|
else if (i < 2 * maxOffset)
|
||||||
{
|
|
||||||
currentOffset = tempLocation + tempLen + i - 2 * maxOffset;
|
currentOffset = tempLocation + tempLen + i - 2 * maxOffset;
|
||||||
}
|
else if (i == 2 * maxOffset)
|
||||||
else
|
currentOffset = trEnd;
|
||||||
{
|
else //if (i > 2 * maxOffset)
|
||||||
currentOffset = tempLocation + i - 2 * maxOffset + 445 * 588;
|
currentOffset = tempLocation + i - 1 - 2 * maxOffset + 445 * 588;
|
||||||
}
|
|
||||||
if (currentOffset < trStart)
|
if (currentOffset < trStart || currentOffset > trEnd)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
_CRC32[iTrack, i] = Crc32.Combine(crc32, part._CRC32[iTrack, i], 4 * (currentOffset - start));
|
||||||
|
_CRCWN[iTrack, i] = Crc32.Combine(crcwn, part._CRCWN[iTrack, i], part._CRCNL[iTrack, i] * 2);
|
||||||
|
_CRCNL[iTrack, i] = crcnl + part._CRCNL[iTrack, i];
|
||||||
|
if (i == 0 || i == 2 * maxOffset) continue;
|
||||||
_CRCAR[iTrack, i] = crcar + part._CRCAR[iTrack, i];
|
_CRCAR[iTrack, i] = crcar + part._CRCAR[iTrack, i];
|
||||||
_CRCV2[iTrack, i] = crcv2 + part._CRCV2[iTrack, i];
|
_CRCV2[iTrack, i] = crcv2 + part._CRCV2[iTrack, i];
|
||||||
_CRCSM[iTrack, i] = crcsm + part._CRCSM[iTrack, i];
|
_CRCSM[iTrack, i] = crcsm + part._CRCSM[iTrack, i];
|
||||||
_CRCNL[iTrack, i] = crcnl + part._CRCNL[iTrack, i];
|
|
||||||
_CRC32[iTrack, i] = Crc32.Combine(crc32, part._CRC32[iTrack, i], 4 * (currentOffset - trStart));
|
|
||||||
_CRCWN[iTrack, i] = Crc32.Combine(crcwn, part._CRCWN[iTrack, i], 4 * (currentOffset - trStart) - 2 * part._CRCNL[iTrack, i]);
|
|
||||||
}
|
}
|
||||||
_Peak[iTrack] = Math.Max(_Peak[iTrack], part._Peak[iTrack]);
|
_Peak[iTrack] = Math.Max(_Peak[iTrack], part._Peak[iTrack]);
|
||||||
}
|
}
|
||||||
@@ -902,7 +876,6 @@ namespace CUETools.AccurateRip
|
|||||||
int leadout_len = Math.Max(4096 * 4, (calcSyn || calcParity) ? stride + laststride : 0);
|
int leadout_len = Math.Max(4096 * 4, (calcSyn || calcParity) ? stride + laststride : 0);
|
||||||
leadin = new ushort[leadin_len];
|
leadin = new ushort[leadin_len];
|
||||||
leadout = new ushort[leadout_len];
|
leadout = new ushort[leadout_len];
|
||||||
preLeadoutCrc = 0;
|
|
||||||
_currentTrack = 0;
|
_currentTrack = 0;
|
||||||
Position = 0; // NOT _toc[_toc.FirstAudio][0].Start * 588;
|
Position = 0; // NOT _toc[_toc.FirstAudio][0].Start * 588;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -332,7 +332,7 @@ namespace CUETools.AccurateRip
|
|||||||
if (err_count == allowed_errors && (err_count == 0 || rs.chienSearch(_errpos, stridecount + npar, err_count, _sigma)))
|
if (err_count == allowed_errors && (err_count == 0 || rs.chienSearch(_errpos, stridecount + npar, err_count, _sigma)))
|
||||||
{
|
{
|
||||||
actualOffset = offset;
|
actualOffset = offset;
|
||||||
hasErrors = err_count != 0 || ar.CTDBCRC(offset) != expectedCRC;
|
hasErrors = err_count != 0 || ar.CTDBCRC(-offset) != expectedCRC;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,7 +108,10 @@ namespace CUETools.Codecs.ALAC
|
|||||||
int sampleDuration;
|
int sampleDuration;
|
||||||
int sampleSize;
|
int sampleSize;
|
||||||
if (_iSample >= _sample_byte_size.Length)
|
if (_iSample >= _sample_byte_size.Length)
|
||||||
|
{
|
||||||
|
buff.Length = offset;
|
||||||
return offset;
|
return offset;
|
||||||
|
}
|
||||||
get_sample_info(_iSample, out sampleDuration, out sampleSize);
|
get_sample_info(_iSample, out sampleDuration, out sampleSize);
|
||||||
_IO.Read(_framesBuffer, 0, sampleSize);
|
_IO.Read(_framesBuffer, 0, sampleSize);
|
||||||
decodeFrame(sampleSize);
|
decodeFrame(sampleSize);
|
||||||
|
|||||||
@@ -1628,6 +1628,8 @@ namespace CUETools.Codecs.ALAC
|
|||||||
verifyBuffer = new int[Alac.MAX_BLOCKSIZE * _pcm.ChannelCount];
|
verifyBuffer = new int[Alac.MAX_BLOCKSIZE * _pcm.ChannelCount];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sample_count < 0)
|
||||||
|
throw new InvalidOperationException("FinalSampleCount unknown");
|
||||||
int frames = sample_count / eparams.block_size;
|
int frames = sample_count / eparams.block_size;
|
||||||
int header_len = max_header_len
|
int header_len = max_header_len
|
||||||
+ eparams.padding_size
|
+ eparams.padding_size
|
||||||
|
|||||||
@@ -263,7 +263,10 @@ namespace CUETools { namespace Codecs { namespace FLAC {
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (FLAC__stream_decoder_get_state(_decoder) == FLAC__STREAM_DECODER_END_OF_STREAM)
|
if (FLAC__stream_decoder_get_state(_decoder) == FLAC__STREAM_DECODER_END_OF_STREAM)
|
||||||
return buff->Length - samplesNeeded;
|
{
|
||||||
|
buff->Length -= samplesNeeded;
|
||||||
|
return buff->Length;
|
||||||
|
}
|
||||||
if (!FLAC__stream_decoder_process_single(_decoder))
|
if (!FLAC__stream_decoder_process_single(_decoder))
|
||||||
{
|
{
|
||||||
String^ state = gcnew String(FLAC__StreamDecoderStateString[FLAC__stream_decoder_get_state(_decoder)]);
|
String^ state = gcnew String(FLAC__StreamDecoderStateString[FLAC__stream_decoder_get_state(_decoder)]);
|
||||||
|
|||||||
@@ -251,7 +251,10 @@ namespace CUETools.Codecs.FLAKE
|
|||||||
fill_frames_buffer();
|
fill_frames_buffer();
|
||||||
|
|
||||||
if (_framesBufferLength == 0)
|
if (_framesBufferLength == 0)
|
||||||
|
{
|
||||||
|
buff.Length = offset;
|
||||||
return offset;
|
return offset;
|
||||||
|
}
|
||||||
|
|
||||||
int bytesDecoded = DecodeFrame(_framesBuffer, _framesBufferOffset, _framesBufferLength);
|
int bytesDecoded = DecodeFrame(_framesBuffer, _framesBufferOffset, _framesBufferLength);
|
||||||
_framesBufferLength -= bytesDecoded;
|
_framesBufferLength -= bytesDecoded;
|
||||||
|
|||||||
@@ -79,14 +79,6 @@ namespace CUETools.TestCodecs
|
|||||||
AudioBuffer buff = WAVReader.ReadAllSamples("test.wav", null);
|
AudioBuffer buff = WAVReader.ReadAllSamples("test.wav", null);
|
||||||
ALACWriter target;
|
ALACWriter target;
|
||||||
|
|
||||||
target = new ALACWriter("alacwriter0.m4a", null, buff.PCM);
|
|
||||||
target.Padding = 1;
|
|
||||||
target.Vendor = "CUETools";
|
|
||||||
target.CreationTime = DateTime.Parse("15 Aug 1976");
|
|
||||||
target.Write(buff);
|
|
||||||
target.Close();
|
|
||||||
CollectionAssert.AreEqual(File.ReadAllBytes("alac.m4a"), File.ReadAllBytes("alacwriter0.m4a"), "alacwriter0.m4a doesn't match.");
|
|
||||||
|
|
||||||
target = new ALACWriter("alacwriter1.m4a", null, buff.PCM);
|
target = new ALACWriter("alacwriter1.m4a", null, buff.PCM);
|
||||||
target.Padding = 1;
|
target.Padding = 1;
|
||||||
target.Vendor = "CUETools";
|
target.Vendor = "CUETools";
|
||||||
@@ -95,6 +87,14 @@ namespace CUETools.TestCodecs
|
|||||||
target.Write(buff);
|
target.Write(buff);
|
||||||
target.Close();
|
target.Close();
|
||||||
CollectionAssert.AreEqual(File.ReadAllBytes("alac.m4a"), File.ReadAllBytes("alacwriter1.m4a"), "alacwriter1.m4a doesn't match.");
|
CollectionAssert.AreEqual(File.ReadAllBytes("alac.m4a"), File.ReadAllBytes("alacwriter1.m4a"), "alacwriter1.m4a doesn't match.");
|
||||||
|
|
||||||
|
target = new ALACWriter("alacwriter0.m4a", null, buff.PCM);
|
||||||
|
target.Padding = 1;
|
||||||
|
target.Vendor = "CUETools";
|
||||||
|
target.CreationTime = DateTime.Parse("15 Aug 1976");
|
||||||
|
target.Write(buff);
|
||||||
|
target.Close();
|
||||||
|
CollectionAssert.AreEqual(File.ReadAllBytes("alac.m4a"), File.ReadAllBytes("alacwriter0.m4a"), "alacwriter0.m4a doesn't match.");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,10 +91,10 @@ namespace CUETools.TestCodecs
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///A test for CRC32
|
///A test for CRC32 with offset
|
||||||
///</summary>
|
///</summary>
|
||||||
[TestMethod()]
|
[TestMethod()]
|
||||||
public void CRC32Test1()
|
public void CRC32TestOffset()
|
||||||
{
|
{
|
||||||
Assert.AreEqual<uint>(2953798997, ar.CRC32(0, 13), "CRC32[0][13] was not set correctly.");
|
Assert.AreEqual<uint>(2953798997, ar.CRC32(0, 13), "CRC32[0][13] was not set correctly.");
|
||||||
Assert.AreEqual<uint>(0480843614, ar.CRC32(0, -7), "CRC32[0][-7] was not set correctly.");
|
Assert.AreEqual<uint>(0480843614, ar.CRC32(0, -7), "CRC32[0][-7] was not set correctly.");
|
||||||
@@ -108,6 +108,20 @@ namespace CUETools.TestCodecs
|
|||||||
Assert.AreEqual<uint>(0480843614, ar2.CRC32(1, -7), "CRC32[1,13](2) was not set correctly.");
|
Assert.AreEqual<uint>(0480843614, ar2.CRC32(1, -7), "CRC32[1,13](2) was not set correctly.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///A test for CTDBCRC
|
||||||
|
///</summary>
|
||||||
|
[TestMethod()]
|
||||||
|
public void CTDBCRCTest()
|
||||||
|
{
|
||||||
|
Assert.AreEqual<uint>(4209773141, ar.CTDBCRC(1, 0, 5 * 588, 5 * 588), "CTDBCRC[1] was not set correctly.");
|
||||||
|
Assert.AreEqual<uint>(0037001035, ar.CTDBCRC(2, 0, 5 * 588, 5 * 588), "CTDBCRC[2] was not set correctly.");
|
||||||
|
Assert.AreEqual<uint>(1024656428, ar.CTDBCRC(3, 0, 5 * 588, 5 * 588), "CTDBCRC[3] was not set correctly.");
|
||||||
|
|
||||||
|
Assert.AreEqual<uint>(ar.CRC32(2), ar.CTDBCRC(2, 0, 5 * 588, 5 * 588), "CTDBCRC[2] was not set correctly.");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
///A test for ARV1 CRC
|
///A test for ARV1 CRC
|
||||||
///</summary>
|
///</summary>
|
||||||
@@ -195,19 +209,21 @@ namespace CUETools.TestCodecs
|
|||||||
Assert.AreEqual<uint>(ar0.CRC(track), ar1.CRC(track, -offs), "CRC with offset " + (-offs) + " was not set correctly.");
|
Assert.AreEqual<uint>(ar0.CRC(track), ar1.CRC(track, -offs), "CRC with offset " + (-offs) + " was not set correctly.");
|
||||||
Assert.AreEqual<uint>(ar0.CRC450(track, offs), ar1.CRC450(track, 0), "CRC450 with offset " + offs + " was not set correctly.");
|
Assert.AreEqual<uint>(ar0.CRC450(track, offs), ar1.CRC450(track, 0), "CRC450 with offset " + offs + " was not set correctly.");
|
||||||
Assert.AreEqual<uint>(ar0.CRC450(track, 0), ar1.CRC450(track, -offs), "CRC450 with offset " + (-offs) + " was not set correctly.");
|
Assert.AreEqual<uint>(ar0.CRC450(track, 0), ar1.CRC450(track, -offs), "CRC450 with offset " + (-offs) + " was not set correctly.");
|
||||||
|
Assert.AreEqual<uint>(ar0.CTDBCRC(track + 1, offs, 588 * 5, 588 * 5), ar1.CTDBCRC(track + 1, 0, 588 * 5, 588 * 5), "CTDBCRC with offset " + offs + " was not set correctly.");
|
||||||
|
Assert.AreEqual<uint>(ar1.CTDBCRC(track + 1, -offs, 588 * 5, 588 * 5), ar0.CTDBCRC(track + 1, 0, 588 * 5, 588 * 5), "CTDBCRC with offset " + (-offs) + " was not set correctly.");
|
||||||
if (track != 2)
|
if (track != 2)
|
||||||
{
|
{
|
||||||
Assert.AreEqual<uint>(ar0.CRC32(track + 1, offs), ar1.CRC32(track + 1), "CRC32 with offset " + (offs) + " was not set correctly.");
|
Assert.AreEqual<uint>(ar0.CRC32(track + 1, offs), ar1.CRC32(track + 1), "CRC32 with offset " + (offs) + " was not set correctly.");
|
||||||
Assert.AreEqual<uint>(ar0.CRCWONULL(track + 1, offs), ar1.CRCWONULL(track + 1), "CRCWONULL with offset " + (offs) + " was not set correctly.");
|
Assert.AreEqual<uint>(ar0.CRCWONULL(track + 1, offs), ar1.CRCWONULL(track + 1), "CRCWONULL with offset " + (offs) + " was not set correctly.");
|
||||||
}
|
}
|
||||||
if (track != 0)
|
//if (track != 0)
|
||||||
{
|
{
|
||||||
Assert.AreEqual<uint>(ar0.CRC32(track + 1), ar1.CRC32(track + 1, -offs), "CRC32 with offset " + (-offs) + " was not set correctly.");
|
Assert.AreEqual<uint>(ar0.CRC32(track + 1), ar1.CRC32(track + 1, -offs), "CRC32 with offset " + (-offs) + " was not set correctly.");
|
||||||
Assert.AreEqual<uint>(ar0.CRCWONULL(track + 1), ar1.CRCWONULL(track + 1, -offs), "CRCWONULL with offset " + (-offs) + " was not set correctly.");
|
Assert.AreEqual<uint>(ar0.CRCWONULL(track + 1), ar1.CRCWONULL(track + 1, -offs), "CRCWONULL with offset " + (-offs) + " was not set correctly.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Assert.AreEqual<uint>(ar0.CTDBCRC(588 * 5, 588 * 5), ar1.CTDBCRC(588 * 5 - offs, 588 * 5 + offs), "CTDBCRC with offset " + offs + " was not set correctly.");
|
Assert.AreEqual<uint>(ar0.CTDBCRC(0, offs, 588 * 5, 588 * 5), ar1.CTDBCRC(0, 0, 588 * 5, 588 * 5), "CTDBCRC with offset " + offs + " was not set correctly.");
|
||||||
Assert.AreEqual<uint>(ar1.CTDBCRC(588 * 5, 588 * 5), ar0.CTDBCRC(588 * 5 + offs, 588 * 5 - offs), "CTDBCRC with offset " + (-offs) + " was not set correctly.");
|
Assert.AreEqual<uint>(ar1.CTDBCRC(0, -offs, 588 * 5, 588 * 5), ar0.CTDBCRC(0, 0, 588 * 5, 588 * 5), "CTDBCRC with offset " + (-offs) + " was not set correctly.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,8 +247,10 @@ namespace CUETools.TestCodecs
|
|||||||
{
|
{
|
||||||
string message = "split = " + CDImageLayout.TimeToString((uint)split/588) + "." + (split%588).ToString() + ", offset = " + offs.ToString() + ", track = " + (track + 1).ToString();
|
string message = "split = " + CDImageLayout.TimeToString((uint)split/588) + "." + (split%588).ToString() + ", offset = " + offs.ToString() + ", track = " + (track + 1).ToString();
|
||||||
Assert.AreEqual<uint>(ar0.CRC(track, offs), ar1.CRC(track, offs), "CRC was not set correctly, " + message);
|
Assert.AreEqual<uint>(ar0.CRC(track, offs), ar1.CRC(track, offs), "CRC was not set correctly, " + message);
|
||||||
Assert.AreEqual<uint>(ar0.CRC450(track, offs), ar1.CRC450(track, offs), "CRC450 was not set correctly, " + message);
|
Assert.AreEqual<uint>(ar0.CTDBCRC(track, offs, 5 * 588, 5 * 588), ar1.CTDBCRC(track, offs, 5 * 588, 5 * 588), "CTDBCRC was not set correctly, " + message);
|
||||||
if ((track != 2 || offs <= 0) && (track != 0 || offs >= 0))
|
//CRC450 is zero here :( too small tracks
|
||||||
|
//Assert.AreEqual<uint>(ar0.CRC450(track, offs), ar1.CRC450(track, offs), "CRC450 was not set correctly, " + message);
|
||||||
|
if ((track != 2 || offs <= 0))// && (track != 0 || offs >= 0))
|
||||||
{
|
{
|
||||||
Assert.AreEqual<uint>(ar0.CRC32(track + 1, offs), ar1.CRC32(track + 1, offs), "CRC32 was not set correctly, " + message);
|
Assert.AreEqual<uint>(ar0.CRC32(track + 1, offs), ar1.CRC32(track + 1, offs), "CRC32 was not set correctly, " + message);
|
||||||
Assert.AreEqual<uint>(ar0.CRCWONULL(track + 1, offs), ar1.CRCWONULL(track + 1, offs), "CRCWONULL was not set correctly, " + message);
|
Assert.AreEqual<uint>(ar0.CRCWONULL(track + 1, offs), ar1.CRCWONULL(track + 1, offs), "CRCWONULL was not set correctly, " + message);
|
||||||
|
|||||||
@@ -70,12 +70,12 @@
|
|||||||
<ProjectReference Include="..\..\CUETools.Codecs.ALAC\CUETools.Codecs.ALAC.csproj">
|
<ProjectReference Include="..\..\CUETools.Codecs.ALAC\CUETools.Codecs.ALAC.csproj">
|
||||||
<Project>{F2EC7193-D5E5-4252-9803-5CEB407E910F}</Project>
|
<Project>{F2EC7193-D5E5-4252-9803-5CEB407E910F}</Project>
|
||||||
<Name>CUETools.Codecs.ALAC</Name>
|
<Name>CUETools.Codecs.ALAC</Name>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\..\CUETools.Codecs.FLAKE\CUETools.Codecs.FLAKE.csproj">
|
<ProjectReference Include="..\..\CUETools.Codecs.FLAKE\CUETools.Codecs.FLAKE.csproj">
|
||||||
<Project>{082D6B9E-326E-4D15-9798-EDAE9EDE70A6}</Project>
|
<Project>{082D6B9E-326E-4D15-9798-EDAE9EDE70A6}</Project>
|
||||||
<Name>CUETools.Codecs.FLAKE</Name>
|
<Name>CUETools.Codecs.FLAKE</Name>
|
||||||
<Private>False</Private>
|
<Private>True</Private>
|
||||||
</ProjectReference>
|
</ProjectReference>
|
||||||
<ProjectReference Include="..\..\CUETools.Codecs.LossyWAV\CUETools.Codecs.LossyWAV.csproj">
|
<ProjectReference Include="..\..\CUETools.Codecs.LossyWAV\CUETools.Codecs.LossyWAV.csproj">
|
||||||
<Project>{8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}</Project>
|
<Project>{8A0426FA-0BC2-4C49-A6E5-1F9A68156F19}</Project>
|
||||||
|
|||||||
Binary file not shown.
@@ -3,9 +3,4 @@
|
|||||||
<TestList name="Lists of Tests" id="8c43106b-9dc1-4907-a29f-aa66a61bf5b6">
|
<TestList name="Lists of Tests" id="8c43106b-9dc1-4907-a29f-aa66a61bf5b6">
|
||||||
<RunConfiguration id="cad9b348-419f-496e-92ed-2dfc5d74da06" name="Local Test Run" storage="localtestrun.testrunconfig" type="Microsoft.VisualStudio.TestTools.Common.TestRunConfiguration, Microsoft.VisualStudio.QualityTools.Common, PublicKeyToken=b03f5f7f11d50a3a" />
|
<RunConfiguration id="cad9b348-419f-496e-92ed-2dfc5d74da06" name="Local Test Run" storage="localtestrun.testrunconfig" type="Microsoft.VisualStudio.TestTools.Common.TestRunConfiguration, Microsoft.VisualStudio.QualityTools.Common, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||||
</TestList>
|
</TestList>
|
||||||
<TestList name="Results Not in a List" id="8c84fa94-04c1-424b-9868-57a2d4851a1d">
|
|
||||||
<TestLinks>
|
|
||||||
<TestLink id="707b580c-3801-a61c-0d6a-866ccb489f00" name="CDRepairFixTest" storage="cuetools.testparity\bin\release\cuetools.testparity.dll" enabled="false" type="Microsoft.VisualStudio.TestTools.TestTypes.Unit.UnitTestElement, Microsoft.VisualStudio.QualityTools.Tips.UnitTest.ObjectModel, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
</TestLinks>
|
|
||||||
</TestList>
|
|
||||||
</TestLists>
|
</TestLists>
|
||||||
9
CUETools/frmCUETools.Designer.cs
generated
9
CUETools/frmCUETools.Designer.cs
generated
@@ -80,7 +80,6 @@ namespace JDP {
|
|||||||
this.toolStripMenuItemInputBrowserFiles = new System.Windows.Forms.ToolStripMenuItem();
|
this.toolStripMenuItemInputBrowserFiles = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItemInputBrowserMulti = new System.Windows.Forms.ToolStripMenuItem();
|
this.toolStripMenuItemInputBrowserMulti = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItemInputBrowserDrag = new System.Windows.Forms.ToolStripMenuItem();
|
this.toolStripMenuItemInputBrowserDrag = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripMenuItemLocalDatabase = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.toolStripMenuItemInputBrowserHide = new System.Windows.Forms.ToolStripMenuItem();
|
this.toolStripMenuItemInputBrowserHide = new System.Windows.Forms.ToolStripMenuItem();
|
||||||
this.toolStripOutput = new System.Windows.Forms.ToolStrip();
|
this.toolStripOutput = new System.Windows.Forms.ToolStrip();
|
||||||
this.toolStripLabelOutput = new System.Windows.Forms.ToolStripLabel();
|
this.toolStripLabelOutput = new System.Windows.Forms.ToolStripLabel();
|
||||||
@@ -649,7 +648,6 @@ namespace JDP {
|
|||||||
this.toolStripMenuItemInputBrowserFiles,
|
this.toolStripMenuItemInputBrowserFiles,
|
||||||
this.toolStripMenuItemInputBrowserMulti,
|
this.toolStripMenuItemInputBrowserMulti,
|
||||||
this.toolStripMenuItemInputBrowserDrag,
|
this.toolStripMenuItemInputBrowserDrag,
|
||||||
this.toolStripMenuItemLocalDatabase,
|
|
||||||
this.toolStripMenuItemInputBrowserHide});
|
this.toolStripMenuItemInputBrowserHide});
|
||||||
this.toolStripSplitButtonInputBrowser.Image = global::JDP.Properties.Resources.folder;
|
this.toolStripSplitButtonInputBrowser.Image = global::JDP.Properties.Resources.folder;
|
||||||
resources.ApplyResources(this.toolStripSplitButtonInputBrowser, "toolStripSplitButtonInputBrowser");
|
resources.ApplyResources(this.toolStripSplitButtonInputBrowser, "toolStripSplitButtonInputBrowser");
|
||||||
@@ -675,12 +673,6 @@ namespace JDP {
|
|||||||
this.toolStripMenuItemInputBrowserDrag.Name = "toolStripMenuItemInputBrowserDrag";
|
this.toolStripMenuItemInputBrowserDrag.Name = "toolStripMenuItemInputBrowserDrag";
|
||||||
resources.ApplyResources(this.toolStripMenuItemInputBrowserDrag, "toolStripMenuItemInputBrowserDrag");
|
resources.ApplyResources(this.toolStripMenuItemInputBrowserDrag, "toolStripMenuItemInputBrowserDrag");
|
||||||
//
|
//
|
||||||
// toolStripMenuItemLocalDatabase
|
|
||||||
//
|
|
||||||
this.toolStripMenuItemLocalDatabase.Image = global::JDP.Properties.Resources.puzzle__arrow;
|
|
||||||
this.toolStripMenuItemLocalDatabase.Name = "toolStripMenuItemLocalDatabase";
|
|
||||||
resources.ApplyResources(this.toolStripMenuItemLocalDatabase, "toolStripMenuItemLocalDatabase");
|
|
||||||
//
|
|
||||||
// toolStripMenuItemInputBrowserHide
|
// toolStripMenuItemInputBrowserHide
|
||||||
//
|
//
|
||||||
this.toolStripMenuItemInputBrowserHide.Image = global::JDP.Properties.Resources.folder_delete;
|
this.toolStripMenuItemInputBrowserHide.Image = global::JDP.Properties.Resources.folder_delete;
|
||||||
@@ -1206,7 +1198,6 @@ namespace JDP {
|
|||||||
private System.Windows.Forms.CheckBox checkBoxVerifyUseCDRepair;
|
private System.Windows.Forms.CheckBox checkBoxVerifyUseCDRepair;
|
||||||
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabelCTDB;
|
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabelCTDB;
|
||||||
private System.Windows.Forms.CheckBox checkBoxVerifyUseLocal;
|
private System.Windows.Forms.CheckBox checkBoxVerifyUseLocal;
|
||||||
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemLocalDatabase;
|
|
||||||
private System.Windows.Forms.CheckBox checkBoxSkipRecent;
|
private System.Windows.Forms.CheckBox checkBoxSkipRecent;
|
||||||
private System.Windows.Forms.ToolStripMenuItem editMetadataToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem editMetadataToolStripMenuItem;
|
||||||
private System.Windows.Forms.ToolStripMenuItem addFolderToLocalDatabaseToolStripMenuItem;
|
private System.Windows.Forms.ToolStripMenuItem addFolderToLocalDatabaseToolStripMenuItem;
|
||||||
|
|||||||
@@ -82,28 +82,26 @@ namespace JDP {
|
|||||||
{
|
{
|
||||||
if (node.IsExpanded)
|
if (node.IsExpanded)
|
||||||
AddCheckedNodesToBatch(node.Nodes);
|
AddCheckedNodesToBatch(node.Nodes);
|
||||||
else if (node.Checked && node is CUEControls.FileSystemTreeNodeFileSystemInfo)
|
else if (node.Checked)
|
||||||
_batchPaths.Add((node as CUEControls.FileSystemTreeNodeFileSystemInfo).Path);
|
{
|
||||||
|
if (node is CUEControls.FileSystemTreeNodeFileSystemInfo || node is FileSystemTreeNodeLocalDBEntry)
|
||||||
|
if ((node as CUEControls.FileSystemTreeNode).Path != null)
|
||||||
|
_batchPaths.Add((node as CUEControls.FileSystemTreeNode).Path);
|
||||||
|
if (node is FileSystemTreeNodeLocalDBFolder)
|
||||||
|
foreach (var entry in (node as FileSystemTreeNodeLocalDBFolder).Group)
|
||||||
|
if (entry.Path != null)
|
||||||
|
_batchPaths.Add(entry.Path);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddAllNodesToBatch(TreeNode node)
|
private void AddAllNodesToBatch(TreeNode node)
|
||||||
{
|
{
|
||||||
if (node.IsExpanded || !(node is CUEControls.FileSystemTreeNode))
|
|
||||||
{
|
|
||||||
AddAllNodesToBatch(node.Nodes);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (node is CUEControls.FileSystemTreeNodeFileSystemInfo)
|
if (node is CUEControls.FileSystemTreeNodeFileSystemInfo)
|
||||||
{
|
{
|
||||||
_batchPaths.Add((node as CUEControls.FileSystemTreeNodeFileSystemInfo).Path);
|
_batchPaths.Add((node as CUEControls.FileSystemTreeNodeFileSystemInfo).Path);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (node is FileSystemTreeNodeLocalDBEntry)
|
|
||||||
{
|
|
||||||
_batchPaths.Add((node as FileSystemTreeNodeLocalDBEntry).Path);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (node is FileSystemTreeNodeLocalDBFolder)
|
if (node is FileSystemTreeNodeLocalDBFolder)
|
||||||
{
|
{
|
||||||
foreach (var entry in (node as FileSystemTreeNodeLocalDBFolder).Group)
|
foreach (var entry in (node as FileSystemTreeNodeLocalDBFolder).Group)
|
||||||
@@ -111,6 +109,17 @@ namespace JDP {
|
|||||||
_batchPaths.Add(entry.Path);
|
_batchPaths.Add(entry.Path);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (node is FileSystemTreeNodeLocalDBEntry)
|
||||||
|
{
|
||||||
|
if ((node as FileSystemTreeNodeLocalDBEntry).Path != null)
|
||||||
|
_batchPaths.Add((node as FileSystemTreeNodeLocalDBEntry).Path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (node.IsExpanded || !(node is CUEControls.FileSystemTreeNode))
|
||||||
|
{
|
||||||
|
AddAllNodesToBatch(node.Nodes);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddAllNodesToBatch(TreeNodeCollection nodes)
|
private void AddAllNodesToBatch(TreeNodeCollection nodes)
|
||||||
@@ -164,10 +173,10 @@ namespace JDP {
|
|||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
if (FileBrowserState != FileBrowserStateEnum.Checkboxes
|
if (FileBrowserState == FileBrowserStateEnum.Hidden
|
||||||
&& FileBrowserState != FileBrowserStateEnum.DragDrop
|
|| (FileBrowserState == FileBrowserStateEnum.Tree
|
||||||
&& (FileBrowserState != FileBrowserStateEnum.LocalDB || fileSystemTreeView1.SelectedPath != null)
|
&& !(fileSystemTreeView1.SelectedNode is FileSystemTreeNodeLocalDBFolder)
|
||||||
&& !Directory.Exists(InputPath))
|
&& !Directory.Exists(InputPath)))
|
||||||
{
|
{
|
||||||
StartConvert();
|
StartConvert();
|
||||||
return;
|
return;
|
||||||
@@ -182,8 +191,12 @@ namespace JDP {
|
|||||||
AddCheckedNodesToBatch(fileSystemTreeView1.Nodes);
|
AddCheckedNodesToBatch(fileSystemTreeView1.Nodes);
|
||||||
else if (FileBrowserState == FileBrowserStateEnum.DragDrop)
|
else if (FileBrowserState == FileBrowserStateEnum.DragDrop)
|
||||||
AddAllNodesToBatch(fileSystemTreeView1.Nodes);
|
AddAllNodesToBatch(fileSystemTreeView1.Nodes);
|
||||||
else if (FileBrowserState == FileBrowserStateEnum.LocalDB && fileSystemTreeView1.SelectedNode != null)
|
else if (FileBrowserState == FileBrowserStateEnum.Tree && fileSystemTreeView1.SelectedNode is FileSystemTreeNodeLocalDBFolder)
|
||||||
AddAllNodesToBatch(fileSystemTreeView1.SelectedNode);
|
{
|
||||||
|
foreach (var entry in (fileSystemTreeView1.SelectedNode as FileSystemTreeNodeLocalDBFolder).Group)
|
||||||
|
if (entry.Path != null)
|
||||||
|
_batchPaths.Add(entry.Path);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_batchRoot = InputPath;
|
_batchRoot = InputPath;
|
||||||
@@ -386,7 +399,6 @@ namespace JDP {
|
|||||||
Tree = 0,
|
Tree = 0,
|
||||||
Checkboxes = 1,
|
Checkboxes = 1,
|
||||||
DragDrop = 2,
|
DragDrop = 2,
|
||||||
LocalDB = 8,
|
|
||||||
Hidden = 4
|
Hidden = 4
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1153,7 +1165,6 @@ namespace JDP {
|
|||||||
toolStripMenu.Enabled = !running;
|
toolStripMenu.Enabled = !running;
|
||||||
fileSystemTreeView1.Enabled = !running;
|
fileSystemTreeView1.Enabled = !running;
|
||||||
txtInputPath.Enabled = !running;
|
txtInputPath.Enabled = !running;
|
||||||
txtInputPath.ReadOnly = FileBrowserState == FileBrowserStateEnum.DragDrop || FileBrowserState == FileBrowserStateEnum.Checkboxes || FileBrowserState == FileBrowserStateEnum.LocalDB;
|
|
||||||
grpExtra.Enabled = !running && (converting || verifying);
|
grpExtra.Enabled = !running && (converting || verifying);
|
||||||
//groupBoxCorrector.Enabled = !running && SelectedAction == CUEAction.CorrectFilenames;
|
//groupBoxCorrector.Enabled = !running && SelectedAction == CUEAction.CorrectFilenames;
|
||||||
//grpOutputStyle.Enabled = !running && converting;
|
//grpOutputStyle.Enabled = !running && converting;
|
||||||
@@ -1361,7 +1372,7 @@ namespace JDP {
|
|||||||
if (InputPath == "")
|
if (InputPath == "")
|
||||||
{
|
{
|
||||||
InputPath = sr.Load("InputPath") ?? "";
|
InputPath = sr.Load("InputPath") ?? "";
|
||||||
FileBrowserState = (FileBrowserStateEnum)(sr.LoadInt32("FileBrowserState", (int)FileBrowserStateEnum.Tree, (int)FileBrowserStateEnum.LocalDB) ?? (int)FileBrowserStateEnum.Hidden);
|
FileBrowserState = (FileBrowserStateEnum)(sr.LoadInt32("FileBrowserState", (int)FileBrowserStateEnum.Tree, (int)FileBrowserStateEnum.Hidden) ?? (int)FileBrowserStateEnum.Hidden);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
FileBrowserState = FileBrowserStateEnum.Hidden;
|
FileBrowserState = FileBrowserStateEnum.Hidden;
|
||||||
@@ -1542,7 +1553,7 @@ namespace JDP {
|
|||||||
? toolStripMenuItemOutputManual : toolStripMenuItemOutputBrowse;
|
? toolStripMenuItemOutputManual : toolStripMenuItemOutputBrowse;
|
||||||
toolStripSplitButtonOutputBrowser.Text = toolStripSplitButtonOutputBrowser.DefaultItem.Text;
|
toolStripSplitButtonOutputBrowser.Text = toolStripSplitButtonOutputBrowser.DefaultItem.Text;
|
||||||
toolStripSplitButtonOutputBrowser.Image = toolStripSplitButtonOutputBrowser.DefaultItem.Image;
|
toolStripSplitButtonOutputBrowser.Image = toolStripSplitButtonOutputBrowser.DefaultItem.Image;
|
||||||
toolStripSplitButtonOutputBrowser.Enabled = toolStripSplitButtonOutputBrowser.DefaultItem.Enabled;
|
toolStripSplitButtonOutputBrowser.Enabled = true;// toolStripSplitButtonOutputBrowser.DefaultItem.Enabled;
|
||||||
UpdateOutputPath();
|
UpdateOutputPath();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1555,7 +1566,6 @@ namespace JDP {
|
|||||||
case FileBrowserStateEnum.Checkboxes: return toolStripMenuItemInputBrowserMulti;
|
case FileBrowserStateEnum.Checkboxes: return toolStripMenuItemInputBrowserMulti;
|
||||||
case FileBrowserStateEnum.DragDrop: return toolStripMenuItemInputBrowserDrag;
|
case FileBrowserStateEnum.DragDrop: return toolStripMenuItemInputBrowserDrag;
|
||||||
case FileBrowserStateEnum.Hidden: return toolStripMenuItemInputBrowserHide;
|
case FileBrowserStateEnum.Hidden: return toolStripMenuItemInputBrowserHide;
|
||||||
case FileBrowserStateEnum.LocalDB: return toolStripMenuItemLocalDatabase;
|
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -1601,6 +1611,7 @@ namespace JDP {
|
|||||||
{
|
{
|
||||||
fileSystemTreeView1.Nodes.Clear();
|
fileSystemTreeView1.Nodes.Clear();
|
||||||
fileSystemTreeView1.IconManager = m_icon_mgr;
|
fileSystemTreeView1.IconManager = m_icon_mgr;
|
||||||
|
fileSystemTreeView1.Nodes.Add(new FileSystemTreeNodeLocalDB(m_icon_mgr, _localDB));
|
||||||
if (InputPath != "")
|
if (InputPath != "")
|
||||||
{
|
{
|
||||||
TreeNode node = null;
|
TreeNode node = null;
|
||||||
@@ -1619,8 +1630,9 @@ namespace JDP {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fileSystemTreeView1.Nodes.Count > 0)
|
foreach (TreeNode node in fileSystemTreeView1.Nodes)
|
||||||
fileSystemTreeView1.Nodes[0].Expand();
|
node.Expand();
|
||||||
|
|
||||||
if (value == FileBrowserStateEnum.Checkboxes
|
if (value == FileBrowserStateEnum.Checkboxes
|
||||||
&& fileSystemTreeView1.SelectedNode != null
|
&& fileSystemTreeView1.SelectedNode != null
|
||||||
&& fileSystemTreeView1.SelectedNode is CUEControls.FileSystemTreeNodeFileSystemInfo)
|
&& fileSystemTreeView1.SelectedNode is CUEControls.FileSystemTreeNodeFileSystemInfo)
|
||||||
@@ -1647,92 +1659,6 @@ namespace JDP {
|
|||||||
fileSystemTreeView1.Select();
|
fileSystemTreeView1.Select();
|
||||||
fileSystemTreeView1.ShowRootLines = false;
|
fileSystemTreeView1.ShowRootLines = false;
|
||||||
break;
|
break;
|
||||||
case FileBrowserStateEnum.LocalDB:
|
|
||||||
OutputPathUseTemplate = true;
|
|
||||||
if (_fileBrowserControlState != value)
|
|
||||||
{
|
|
||||||
fileSystemTreeView1.BeginUpdate();
|
|
||||||
fileSystemTreeView1.CheckBoxes = false;
|
|
||||||
//fileSystemTreeView1.StateImageList = m_state_image_list;
|
|
||||||
fileSystemTreeView1.Nodes.Clear();
|
|
||||||
fileSystemTreeView1.Nodes.Add("dummy");
|
|
||||||
fileSystemTreeView1.IconManager = m_icon_mgr;
|
|
||||||
fileSystemTreeView1.Nodes.Clear();
|
|
||||||
|
|
||||||
fileSystemTreeView1.Nodes.Add(new FileSystemTreeNodeLocalDBCategory(
|
|
||||||
m_icon_mgr, _localDB, true, true, m_icon_mgr.GetIconIndex(".#puzzle"), "By Uniqueness",
|
|
||||||
i => ((int)FileSystemTreeNodeLocalDBCollision.GetGroupType(_localDB.FindAll(j => j.DiscID == i.DiscID))).ToString(),
|
|
||||||
i => FileSystemTreeNodeLocalDBCollision.GroupTypeToDescription(FileSystemTreeNodeLocalDBCollision.GetGroupType(_localDB.FindAll(j => j.DiscID == i.DiscID))),
|
|
||||||
i => m_icon_mgr.GetIconIndex(FileSystemTreeNodeLocalDBCollision.GroupTypeToIconTag(FileSystemTreeNodeLocalDBCollision.GetGroupType(_localDB.FindAll(j => j.DiscID == i.DiscID)))))); //converter_icon
|
|
||||||
|
|
||||||
fileSystemTreeView1.Nodes.Add(new FileSystemTreeNodeLocalDBCategory(
|
|
||||||
m_icon_mgr, _localDB, true, true, m_icon_mgr.GetIconIndex(".flac"), "By Format",
|
|
||||||
i => i.AudioPaths == null || i.AudioPaths.Count == 0 ? null : Path.GetExtension(i.AudioPaths[0]).ToLower(),
|
|
||||||
null,
|
|
||||||
i => m_icon_mgr.GetIconIndex(i.AudioPaths[0])));
|
|
||||||
|
|
||||||
fileSystemTreeView1.Nodes.Add(new FileSystemTreeNodeLocalDBCategory(
|
|
||||||
m_icon_mgr, _localDB, false, true, m_icon_mgr.GetIconIndex(".#users"), "By Artist",
|
|
||||||
i => i.Metadata.Artist, null, null));
|
|
||||||
|
|
||||||
fileSystemTreeView1.Nodes.Add(new FileSystemTreeNodeLocalDBCategory(
|
|
||||||
m_icon_mgr, _localDB, true, false, m_icon_mgr.GetIconIndex(".#calendar"), "By Release Date",
|
|
||||||
i => i.Metadata.Year, null, null));
|
|
||||||
|
|
||||||
fileSystemTreeView1.Nodes.Add(new FileSystemTreeNodeLocalDBCategory(
|
|
||||||
m_icon_mgr, _localDB, true, true, m_icon_mgr.GetIconIndex(".#alarm_clock"), "By Verification Date",
|
|
||||||
i =>
|
|
||||||
i.VerificationDate == DateTime.MinValue ? "0" :
|
|
||||||
i.VerificationDate.AddHours(1) > DateTime.Now ? "1" :
|
|
||||||
i.VerificationDate.AddDays(1) > DateTime.Now ? "2" :
|
|
||||||
i.VerificationDate.AddDays(7) > DateTime.Now ? "3" :
|
|
||||||
i.VerificationDate.AddDays(31) > DateTime.Now ? "4" :
|
|
||||||
i.VerificationDate.AddDays(365) > DateTime.Now ? "5" :
|
|
||||||
"6",
|
|
||||||
i =>
|
|
||||||
i.VerificationDate == DateTime.MinValue ? "never" :
|
|
||||||
i.VerificationDate.AddHours(1) > DateTime.Now ? "this hour" :
|
|
||||||
i.VerificationDate.AddDays(1) > DateTime.Now ? "this day" :
|
|
||||||
i.VerificationDate.AddDays(7) > DateTime.Now ? "this week" :
|
|
||||||
i.VerificationDate.AddDays(31) > DateTime.Now ? "this month" :
|
|
||||||
i.VerificationDate.AddDays(365) > DateTime.Now ? "this year" :
|
|
||||||
"more than a year ago",
|
|
||||||
null));
|
|
||||||
|
|
||||||
fileSystemTreeView1.Nodes.Add(new FileSystemTreeNodeLocalDBCategory(
|
|
||||||
m_icon_mgr, _localDB, true, true, m_icon_mgr.GetIconIndex(".#ar"), "By AccurateRip Confidence",
|
|
||||||
i =>
|
|
||||||
i.VerificationDate == DateTime.MinValue ? "00" :
|
|
||||||
i.ARConfidence == 0 ? "01" :
|
|
||||||
i.ARConfidence == 1 ? "02" :
|
|
||||||
i.ARConfidence == 2 ? "03" :
|
|
||||||
i.ARConfidence == 3 ? "04" :
|
|
||||||
i.ARConfidence < 5 ? "05" :
|
|
||||||
i.ARConfidence < 10 ? "06" :
|
|
||||||
i.ARConfidence < 20 ? "07" :
|
|
||||||
i.ARConfidence < 50 ? "08" :
|
|
||||||
i.ARConfidence < 100 ? "09" :
|
|
||||||
"10",
|
|
||||||
i =>
|
|
||||||
i.VerificationDate == DateTime.MinValue ? "?" :
|
|
||||||
i.ARConfidence == 0 ? "0" :
|
|
||||||
i.ARConfidence == 1 ? "1" :
|
|
||||||
i.ARConfidence == 2 ? "2" :
|
|
||||||
i.ARConfidence == 3 ? "3" :
|
|
||||||
i.ARConfidence < 5 ? "< 5" :
|
|
||||||
i.ARConfidence < 10 ? "< 10" :
|
|
||||||
i.ARConfidence < 20 ? "< 20" :
|
|
||||||
i.ARConfidence < 50 ? "< 50" :
|
|
||||||
i.ARConfidence < 100 ? "< 100" :
|
|
||||||
">=100",
|
|
||||||
null));
|
|
||||||
|
|
||||||
_fileBrowserControlState = value;
|
|
||||||
fileSystemTreeView1.EndUpdate();
|
|
||||||
}
|
|
||||||
fileSystemTreeView1.Select();
|
|
||||||
fileSystemTreeView1.ShowRootLines = true;
|
|
||||||
break;
|
|
||||||
case FileBrowserStateEnum.Hidden:
|
case FileBrowserStateEnum.Hidden:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1872,7 +1798,7 @@ namespace JDP {
|
|||||||
|
|
||||||
private void UpdateActions()
|
private void UpdateActions()
|
||||||
{
|
{
|
||||||
if (FileBrowserState == FileBrowserStateEnum.DragDrop || FileBrowserState == FileBrowserStateEnum.Checkboxes || FileBrowserState == FileBrowserStateEnum.LocalDB)
|
if (FileBrowserState == FileBrowserStateEnum.DragDrop || FileBrowserState == FileBrowserStateEnum.Checkboxes)
|
||||||
{
|
{
|
||||||
rbActionCorrectFilenames.Enabled = true;
|
rbActionCorrectFilenames.Enabled = true;
|
||||||
rbActionCreateCUESheet.Enabled = true;
|
rbActionCreateCUESheet.Enabled = true;
|
||||||
@@ -1881,24 +1807,21 @@ namespace JDP {
|
|||||||
//toolStripSplitButtonOutputBrowser.Enabled = false;
|
//toolStripSplitButtonOutputBrowser.Enabled = false;
|
||||||
toolStripMenuItemOutputManual.Enabled =
|
toolStripMenuItemOutputManual.Enabled =
|
||||||
toolStripMenuItemOutputBrowse.Enabled = false;
|
toolStripMenuItemOutputBrowse.Enabled = false;
|
||||||
|
txtInputPath.ReadOnly = true;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
string pathIn = InputPath;
|
string pathIn = InputPath;
|
||||||
rbActionCorrectFilenames.Enabled = pathIn.Length != 0
|
bool is_file = !string.IsNullOrEmpty(pathIn) && File.Exists(pathIn);
|
||||||
&& ((File.Exists(pathIn) && Path.GetExtension(pathIn).ToLower() == ".cue")
|
bool is_cue = is_file && Path.GetExtension(pathIn).ToLower() == ".cue";
|
||||||
|| Directory.Exists(pathIn));
|
bool is_directory = !string.IsNullOrEmpty(pathIn) && Directory.Exists(pathIn);
|
||||||
rbActionCreateCUESheet.Enabled = pathIn.Length != 0
|
bool is_folder = FileBrowserState == FileBrowserStateEnum.Tree && fileSystemTreeView1.SelectedNode is FileSystemTreeNodeLocalDBFolder;
|
||||||
&& ((File.Exists(pathIn) && Path.GetExtension(pathIn).ToLower() != ".cue")
|
bool is_cdrom = !string.IsNullOrEmpty(pathIn) && IsCDROM(pathIn);
|
||||||
//&& ((File.Exists(pathIn) && CUESheet.CreateDummyCUESheet(_profile._config, pathIn) != null) -- too slow
|
rbActionCorrectFilenames.Enabled = is_cue || is_directory;
|
||||||
|| Directory.Exists(pathIn));
|
rbActionCreateCUESheet.Enabled = (is_file && !is_cue) || is_directory;
|
||||||
rbActionVerify.Enabled =
|
rbActionVerify.Enabled = rbActionEncode.Enabled = is_file || is_directory || is_folder || is_cdrom;
|
||||||
rbActionEncode.Enabled = pathIn.Length != 0
|
toolStripMenuItemOutputManual.Enabled = toolStripMenuItemOutputBrowse.Enabled = is_file || is_cdrom;
|
||||||
&& (File.Exists(pathIn) || Directory.Exists(pathIn) || IsCDROM(pathIn));
|
txtInputPath.ReadOnly = is_folder;
|
||||||
toolStripMenuItemOutputManual.Enabled =
|
|
||||||
toolStripMenuItemOutputBrowse.Enabled =
|
|
||||||
pathIn.Length != 0
|
|
||||||
&& (IsCDROM(pathIn) || File.Exists(pathIn));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
btnConvert.Enabled = btnConvert.Visible &&
|
btnConvert.Enabled = btnConvert.Visible &&
|
||||||
@@ -1911,54 +1834,27 @@ namespace JDP {
|
|||||||
comboBoxScript.Enabled = btnConvert.Enabled && comboBoxScript.Items.Count > 1;
|
comboBoxScript.Enabled = btnConvert.Enabled && comboBoxScript.Items.Count > 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DumpLocalDB(StringBuilder report, TreeNode parent)
|
private void fileSystemTreeView1_AfterSelect(object sender, TreeViewEventArgs e)
|
||||||
{
|
{
|
||||||
if (parent is FileSystemTreeNodeLocalDBFolder)
|
InputPath = fileSystemTreeView1.SelectedPath ?? "";
|
||||||
|
txtInputPath.SelectAll();
|
||||||
|
UpdateActions();
|
||||||
|
if (fileSystemTreeView1.SelectedNode is FileSystemTreeNodeLocalDBEntry)
|
||||||
{
|
{
|
||||||
foreach (var entry in (parent as FileSystemTreeNodeLocalDBFolder).Group)
|
var entry = (fileSystemTreeView1.SelectedNode as FileSystemTreeNodeLocalDBEntry).Item;
|
||||||
|
textBatchReport.Text = (entry.Log ?? "").Replace("\r", "").Replace("\n", "\r\n");
|
||||||
|
}
|
||||||
|
else if (fileSystemTreeView1.SelectedNode is FileSystemTreeNodeLocalDBFolder)
|
||||||
|
{
|
||||||
|
var group = (fileSystemTreeView1.SelectedNode as FileSystemTreeNodeLocalDBFolder).Group;
|
||||||
|
StringBuilder report = new StringBuilder();
|
||||||
|
foreach (var entry in group)
|
||||||
if (entry.Path != null)
|
if (entry.Path != null)
|
||||||
if (entry.Status == null || entry.OffsetSafeCRC == null)
|
if (entry.Status == null || entry.OffsetSafeCRC == null)
|
||||||
report.AppendFormat("{0}: never verified\r\n", entry.Path);
|
report.AppendFormat("{0}: never verified\r\n", entry.Path);
|
||||||
else
|
else
|
||||||
report.AppendFormat("{0}: CRC {1,8:X}, {2}\r\n", entry.Path, entry.OffsetSafeCRC.Value[0], entry.Status);
|
report.AppendFormat("{0}: CRC {1,8:X}, {2}\r\n", entry.Path, entry.OffsetSafeCRC.Value[0], entry.Status);
|
||||||
}
|
textBatchReport.Text = report.ToString();
|
||||||
else
|
|
||||||
{
|
|
||||||
foreach (TreeNode node in parent.Nodes)
|
|
||||||
if (node is FileSystemTreeNodeLocalDBEntry)
|
|
||||||
{
|
|
||||||
var entry = (node as FileSystemTreeNodeLocalDBEntry).Item;
|
|
||||||
if (entry.Path != null)
|
|
||||||
if (entry.Status == null || entry.OffsetSafeCRC == null)
|
|
||||||
report.AppendFormat("{0}: never verified\r\n", entry.Path);
|
|
||||||
else
|
|
||||||
report.AppendFormat("{0}: CRC {1,8:X}, {2}\r\n", entry.Path, entry.OffsetSafeCRC.Value[0], entry.Status);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
DumpLocalDB(report, node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void fileSystemTreeView1_AfterSelect(object sender, TreeViewEventArgs e)
|
|
||||||
{
|
|
||||||
if (fileSystemTreeView1.SelectedPath != null)
|
|
||||||
{
|
|
||||||
InputPath = fileSystemTreeView1.SelectedPath;
|
|
||||||
txtInputPath.SelectAll();
|
|
||||||
}
|
|
||||||
if (FileBrowserState == FileBrowserStateEnum.LocalDB && fileSystemTreeView1.SelectedNode != null)
|
|
||||||
{
|
|
||||||
if (fileSystemTreeView1.SelectedNode is FileSystemTreeNodeLocalDBEntry)
|
|
||||||
{
|
|
||||||
var entry = (fileSystemTreeView1.SelectedNode as FileSystemTreeNodeLocalDBEntry).Item;
|
|
||||||
textBatchReport.Text = (entry.Log ?? "").Replace("\r", "").Replace("\n", "\r\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
StringBuilder report = new StringBuilder();
|
|
||||||
DumpLocalDB(report, fileSystemTreeView1.SelectedNode);
|
|
||||||
textBatchReport.Text = report.ToString();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2028,9 +1924,6 @@ namespace JDP {
|
|||||||
fileSystemTreeView1.Nodes.Add(node);
|
fileSystemTreeView1.Nodes.Add(node);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FileBrowserStateEnum.LocalDB:
|
|
||||||
// ???
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
fileSystemTreeView1.Focus();
|
fileSystemTreeView1.Focus();
|
||||||
}
|
}
|
||||||
@@ -2139,9 +2032,6 @@ namespace JDP {
|
|||||||
}
|
}
|
||||||
fileSystemTreeView1.Select();
|
fileSystemTreeView1.Select();
|
||||||
break;
|
break;
|
||||||
case FileBrowserStateEnum.LocalDB:
|
|
||||||
// ???
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (WindowState == FormWindowState.Minimized)
|
if (WindowState == FormWindowState.Minimized)
|
||||||
@@ -2549,8 +2439,6 @@ namespace JDP {
|
|||||||
FileBrowserState = FileBrowserStateEnum.Checkboxes;
|
FileBrowserState = FileBrowserStateEnum.Checkboxes;
|
||||||
if (e.ClickedItem == toolStripMenuItemInputBrowserDrag)
|
if (e.ClickedItem == toolStripMenuItemInputBrowserDrag)
|
||||||
FileBrowserState = FileBrowserStateEnum.DragDrop;
|
FileBrowserState = FileBrowserStateEnum.DragDrop;
|
||||||
if (e.ClickedItem == toolStripMenuItemLocalDatabase)
|
|
||||||
FileBrowserState = FileBrowserStateEnum.LocalDB;
|
|
||||||
if (e.ClickedItem == toolStripMenuItemInputBrowserHide)
|
if (e.ClickedItem == toolStripMenuItemInputBrowserHide)
|
||||||
FileBrowserState = FileBrowserStateEnum.Hidden;
|
FileBrowserState = FileBrowserStateEnum.Hidden;
|
||||||
SetupControls(false);
|
SetupControls(false);
|
||||||
@@ -2953,4 +2841,110 @@ namespace JDP {
|
|||||||
this.Nodes.Add(new FileSystemTreeNodeLocalDBGroup(icon_mgr, group, ShowArtist, ShowYear, m_converter_icon(group[0]), m_converter_name(group[0])));
|
this.Nodes.Add(new FileSystemTreeNodeLocalDBGroup(icon_mgr, group, ShowArtist, ShowYear, m_converter_icon(group[0]), m_converter_name(group[0])));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class FileSystemTreeNodeLocalDB : FileSystemTreeNodeLocalDBFolder
|
||||||
|
{
|
||||||
|
public override string Path
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string DisplayName
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return "Local DB";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int DisplayIcon
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return icon_mgr.GetIconIndex(".#puzzle");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileSystemTreeNodeLocalDB(CUEControls.IIconManager icon_mgr, List<CUEToolsLocalDBEntry> group)
|
||||||
|
: base(icon_mgr)
|
||||||
|
{
|
||||||
|
this.Group = group;
|
||||||
|
this.SelectedImageIndex = this.ImageIndex = this.DisplayIcon;
|
||||||
|
this.Text = this.DisplayName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void DoExpand()
|
||||||
|
{
|
||||||
|
this.Nodes.Add(new FileSystemTreeNodeLocalDBCategory(
|
||||||
|
icon_mgr, this.Group, true, true, icon_mgr.GetIconIndex(".#puzzle"), "By Uniqueness",
|
||||||
|
i => ((int)FileSystemTreeNodeLocalDBCollision.GetGroupType(this.Group.FindAll(j => j.DiscID == i.DiscID))).ToString(),
|
||||||
|
i => FileSystemTreeNodeLocalDBCollision.GroupTypeToDescription(FileSystemTreeNodeLocalDBCollision.GetGroupType(this.Group.FindAll(j => j.DiscID == i.DiscID))),
|
||||||
|
i => icon_mgr.GetIconIndex(FileSystemTreeNodeLocalDBCollision.GroupTypeToIconTag(FileSystemTreeNodeLocalDBCollision.GetGroupType(this.Group.FindAll(j => j.DiscID == i.DiscID)))))); //converter_icon
|
||||||
|
|
||||||
|
this.Nodes.Add(new FileSystemTreeNodeLocalDBCategory(
|
||||||
|
icon_mgr, this.Group, true, true, icon_mgr.GetIconIndex(".flac"), "By Format",
|
||||||
|
i => i.AudioPaths == null || i.AudioPaths.Count == 0 ? null : System.IO.Path.GetExtension(i.AudioPaths[0]).ToLower(),
|
||||||
|
null,
|
||||||
|
i => icon_mgr.GetIconIndex(i.AudioPaths[0])));
|
||||||
|
|
||||||
|
this.Nodes.Add(new FileSystemTreeNodeLocalDBCategory(
|
||||||
|
icon_mgr, this.Group, false, true, icon_mgr.GetIconIndex(".#users"), "By Artist",
|
||||||
|
i => i.Metadata.Artist, null, null));
|
||||||
|
|
||||||
|
this.Nodes.Add(new FileSystemTreeNodeLocalDBCategory(
|
||||||
|
icon_mgr, this.Group, true, false, icon_mgr.GetIconIndex(".#calendar"), "By Release Date",
|
||||||
|
i => i.Metadata.Year, null, null));
|
||||||
|
|
||||||
|
this.Nodes.Add(new FileSystemTreeNodeLocalDBCategory(
|
||||||
|
icon_mgr, this.Group, true, true, icon_mgr.GetIconIndex(".#alarm_clock"), "By Verification Date",
|
||||||
|
i =>
|
||||||
|
i.VerificationDate == DateTime.MinValue ? "0" :
|
||||||
|
i.VerificationDate.AddHours(1) > DateTime.Now ? "1" :
|
||||||
|
i.VerificationDate.AddDays(1) > DateTime.Now ? "2" :
|
||||||
|
i.VerificationDate.AddDays(7) > DateTime.Now ? "3" :
|
||||||
|
i.VerificationDate.AddDays(31) > DateTime.Now ? "4" :
|
||||||
|
i.VerificationDate.AddDays(365) > DateTime.Now ? "5" :
|
||||||
|
"6",
|
||||||
|
i =>
|
||||||
|
i.VerificationDate == DateTime.MinValue ? "never" :
|
||||||
|
i.VerificationDate.AddHours(1) > DateTime.Now ? "this hour" :
|
||||||
|
i.VerificationDate.AddDays(1) > DateTime.Now ? "this day" :
|
||||||
|
i.VerificationDate.AddDays(7) > DateTime.Now ? "this week" :
|
||||||
|
i.VerificationDate.AddDays(31) > DateTime.Now ? "this month" :
|
||||||
|
i.VerificationDate.AddDays(365) > DateTime.Now ? "this year" :
|
||||||
|
"more than a year ago",
|
||||||
|
null));
|
||||||
|
|
||||||
|
this.Nodes.Add(new FileSystemTreeNodeLocalDBCategory(
|
||||||
|
icon_mgr, this.Group, true, true, icon_mgr.GetIconIndex(".#ar"), "By AccurateRip Confidence",
|
||||||
|
i =>
|
||||||
|
i.VerificationDate == DateTime.MinValue ? "00" :
|
||||||
|
i.ARConfidence == 0 ? "01" :
|
||||||
|
i.ARConfidence == 1 ? "02" :
|
||||||
|
i.ARConfidence == 2 ? "03" :
|
||||||
|
i.ARConfidence == 3 ? "04" :
|
||||||
|
i.ARConfidence < 5 ? "05" :
|
||||||
|
i.ARConfidence < 10 ? "06" :
|
||||||
|
i.ARConfidence < 20 ? "07" :
|
||||||
|
i.ARConfidence < 50 ? "08" :
|
||||||
|
i.ARConfidence < 100 ? "09" :
|
||||||
|
"10",
|
||||||
|
i =>
|
||||||
|
i.VerificationDate == DateTime.MinValue ? "?" :
|
||||||
|
i.ARConfidence == 0 ? "0" :
|
||||||
|
i.ARConfidence == 1 ? "1" :
|
||||||
|
i.ARConfidence == 2 ? "2" :
|
||||||
|
i.ARConfidence == 3 ? "3" :
|
||||||
|
i.ARConfidence < 5 ? "< 5" :
|
||||||
|
i.ARConfidence < 10 ? "< 10" :
|
||||||
|
i.ARConfidence < 20 ? "< 20" :
|
||||||
|
i.ARConfidence < 50 ? "< 50" :
|
||||||
|
i.ARConfidence < 100 ? "< 100" :
|
||||||
|
">=100",
|
||||||
|
null));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user