From 34a730b7309c5e41ea6990634d863d2ebfe97b8e Mon Sep 17 00:00:00 2001 From: chudov Date: Fri, 28 Nov 2008 23:49:04 +0000 Subject: [PATCH] moving AccurateRipId calculations to CUETools.AccurateRip --- CUETools.CDImage/CDImage.cs | 42 +++++++++++++++- CUETools.Ripper.SCSI/SCSIDrive.cs | 11 ----- CUEToolsLib/Main.cs | 80 ++++++++----------------------- 3 files changed, 59 insertions(+), 74 deletions(-) diff --git a/CUETools.CDImage/CDImage.cs b/CUETools.CDImage/CDImage.cs index cece0c3..774f7ff 100644 --- a/CUETools.CDImage/CDImage.cs +++ b/CUETools.CDImage/CDImage.cs @@ -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(); + 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(); + 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 diff --git a/CUETools.Ripper.SCSI/SCSIDrive.cs b/CUETools.Ripper.SCSI/SCSIDrive.cs index 47f5219..6e7b227 100644 --- a/CUETools.Ripper.SCSI/SCSIDrive.cs +++ b/CUETools.Ripper.SCSI/SCSIDrive.cs @@ -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; - } } } diff --git a/CUEToolsLib/Main.cs b/CUEToolsLib/Main.cs index 176118d..3253c49 100644 --- a/CUEToolsLib/Main.cs +++ b/CUEToolsLib/Main.cs @@ -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); } } }