moving AccurateRipId calculations to CUETools.AccurateRip

This commit is contained in:
chudov
2008-11-28 23:49:04 +00:00
parent 421364a64d
commit 34a730b730
3 changed files with 59 additions and 74 deletions

View File

@@ -20,6 +20,13 @@ namespace CUETools.CDImage
_index = index;
}
public CDTrackIndex(CDTrackIndex src)
{
_length = src._length;
_start = src._start;
_index = src._index;
}
public uint Start
{
get
@@ -63,7 +70,7 @@ namespace CUETools.CDImage
uint _start, _length, _index;
}
public class CDTrack
public class CDTrack : ICloneable
{
public CDTrack(uint number, uint start, uint length, bool isAudio)
{
@@ -75,6 +82,22 @@ namespace CUETools.CDImage
_indexes.Add(new CDTrackIndex(0, start, 0));
}
public CDTrack(CDTrack src)
{
_number = src._number;
_start = src._start;
_length = src._length;
_isAudio = src._isAudio;
_indexes = new List<CDTrackIndex>();
for (int i = 0; i < src._indexes.Count; i++)
_indexes.Add(new CDTrackIndex(src._indexes[i]));
}
public object Clone()
{
return new CDTrack(this);
}
public uint Start
{
get
@@ -199,7 +222,7 @@ namespace CUETools.CDImage
uint _number;
}
public class CDImageLayout
public class CDImageLayout : ICloneable
{
public CDImageLayout(uint length)
{
@@ -207,6 +230,21 @@ namespace CUETools.CDImage
_length = length;
}
public CDImageLayout(CDImageLayout src)
{
_length = src._length;
_catalog = src._catalog;
_audioTracks = src._audioTracks;
_tracks = new List<CDTrack>();
for (int i = 0; i < src.TrackCount; i++)
_tracks.Add(new CDTrack(src._tracks[i]));
}
public object Clone()
{
return new CDImageLayout(this);
}
public uint Length
{
get

View File

@@ -410,16 +410,5 @@ namespace CUETools.Ripper.SCSI
{
return (hex >> 4) * 10 + (hex & 15);
}
private uint sumDigits(uint n)
{
uint r = 0;
while (n > 0)
{
r = r + (n % 10);
n = n / 10;
}
return r;
}
}
}

View File

@@ -845,10 +845,15 @@ namespace CUETools.Processor
if (_cddbDiscIdTag == null) _cddbDiscIdTag = GetCommonTag("DISCID");
if (_dataTrackLength != null)
_accurateRipIdActual = _accurateRipId = CalculateAccurateRipId();
{
CDImageLayout toc2 = new CDImageLayout(_toc);
toc2.AddTrack(new CDTrack((uint)_toc.TrackCount, _toc.Length + 152 * 75, _dataTrackLength.Value, false));
toc2.Length += 152 * 75 + _dataTrackLength.Value;
_accurateRipIdActual = _accurateRipId = AccurateRipVerify.CalculateAccurateRipId(toc2);
}
else
{
_accurateRipIdActual = CalculateAccurateRipId();
_accurateRipIdActual = AccurateRipVerify.CalculateAccurateRipId(_toc);
if (_accurateRipId == null)
_accurateRipId = _accurateRipIdActual;
}
@@ -1204,61 +1209,6 @@ namespace CUETools.Processor
}
}
private uint sumDigits(uint n)
{
uint r = 0;
while (n > 0)
{
r = r + (n % 10);
n = n / 10;
}
return r;
}
private string CalculateAccurateRipId ()
{
// Calculate the three disc ids used by AR
uint discId1 = 0;
uint discId2 = 0;
uint cddbDiscId = 0;
for (int iTrack = 1; iTrack <= _toc.TrackCount; iTrack++)
{
discId1 += _toc[iTrack].Start;
discId2 += (_toc[iTrack].Start == 0 ? 1 : _toc[iTrack].Start) * ((uint)iTrack);
cddbDiscId += sumDigits(_toc[iTrack].Start / 75 + 2);
}
uint trackOffset = _toc.Length;
if (_dataTrackLength.HasValue)
{
trackOffset += ((90 + 60) * 75) + 150; // 90 second lead-out, 60 second lead-in, 150 sector gap
cddbDiscId += sumDigits((uint)(trackOffset / 75) + 2);
trackOffset += _dataTrackLength.Value;
}
discId1 += trackOffset;
discId2 += (trackOffset == 0 ? 1 : trackOffset) * ((uint)TrackCount + 1);
if (!_dataTrackLength.HasValue && _cddbDiscIdTag != null)
{
uint cddbDiscIdNum = UInt32.Parse(_cddbDiscIdTag, NumberStyles.HexNumber);
if ((cddbDiscIdNum & 0xff) == TrackCount + 1)
{
uint lengthFromTag = ((cddbDiscIdNum >> 8) & 0xffff);
_minDataTrackLength = ((lengthFromTag + _toc[1].Start / 75) - 152) * 75 - trackOffset;
}
}
cddbDiscId = ((cddbDiscId % 255) << 24) +
((trackOffset / 75 - _toc[1].Start / 75) << 8) +
(uint)(TrackCount + (_dataTrackLength.HasValue ? 1 : 0));
discId1 &= 0xFFFFFFFF;
discId2 &= 0xFFFFFFFF;
cddbDiscId &= 0xFFFFFFFF;
return String.Format("{0:x8}-{1:x8}-{2:x8}", discId1, discId2, cddbDiscId);
}
private void CalculateMusicBrainzDiscID() {
StringBuilder mbSB = new StringBuilder();
mbSB.AppendFormat("{0:X2}{1:X2}{2:X8}", 1, TrackCount, _toc.Length + 150);
@@ -1575,13 +1525,19 @@ namespace CUETools.Processor
if (!_dataTrackLength.HasValue && _minDataTrackLength.HasValue && _accurateRipId == _accurateRipIdActual && _config.bruteForceDTL)
{
uint minDTL = _minDataTrackLength.Value;
CDImageLayout toc2 = new CDImageLayout(_toc);
toc2.AddTrack(new CDTrack((uint)_toc.TrackCount, _toc.Length + 152 * 75, minDTL, false));
for (uint dtl = minDTL; dtl < minDTL + 75; dtl++)
{
_dataTrackLength = dtl;
_accurateRipId = CalculateAccurateRipId();
toc2[_toc.TrackCount].Length = dtl;
toc2.Length = _toc.Length + 152 * 75 + dtl;
_accurateRipId = AccurateRipVerify.CalculateAccurateRipId(toc2);
_arVerify.ContactAccurateRip(_accurateRipId);
if (_arVerify.AccResult != HttpStatusCode.NotFound)
{
_dataTrackLength = dtl;
break;
}
ShowProgress((string)"Contacting AccurateRip database...", 0, (dtl - minDTL) / 75.0, null, null);
lock (this) {
if (_stop)
@@ -1597,7 +1553,6 @@ namespace CUETools.Processor
}
if (_arVerify.AccResult != HttpStatusCode.OK)
{
_dataTrackLength = null;
_accurateRipId = _accurateRipIdActual;
}
} else
@@ -2372,7 +2327,10 @@ namespace CUETools.Processor
if (dtl != 0)
{
_dataTrackLength = dtl;
_accurateRipId = _accurateRipIdActual = CalculateAccurateRipId();
CDImageLayout toc2 = new CDImageLayout(_toc);
toc2.AddTrack(new CDTrack((uint)_toc.TrackCount, _toc.Length + 152 * 75, dtl, false));
toc2.Length += 152 * 75 + dtl;
_accurateRipIdActual = _accurateRipId = AccurateRipVerify.CalculateAccurateRipId(toc2);
}
}
}