diff --git a/CUETools.AccurateRip/AccurateRip.cs b/CUETools.AccurateRip/AccurateRip.cs index a8407f2..222a60f 100644 --- a/CUETools.AccurateRip/AccurateRip.cs +++ b/CUETools.AccurateRip/AccurateRip.cs @@ -362,49 +362,42 @@ namespace CUETools.AccurateRip } } - //private string CalculateAccurateRipId() - //{ - // // Calculate the three disc ids used by AR - // uint discId1 = 0; - // uint discId2 = 0; - // uint cddbDiscId = 0; + private static uint sumDigits(uint n) + { + uint r = 0; + while (n > 0) + { + r = r + (n % 10); + n = n / 10; + } + return r; + } - // 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); + public static string CalculateCDDBId(CDImageLayout toc) + { + uint cddbDiscId = 0; + for (int iTrack = 1; iTrack <= toc.TrackCount; iTrack++) + cddbDiscId += sumDigits(toc[iTrack].Start / 75 + 2); + return string.Format("{0:X8}", ((cddbDiscId << 24) + ((toc.Length / 75 - toc[1].Start / 75) << 8) + (uint)toc.TrackCount) & 0xFFFFFFFF); + } - // 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); - //} + public static string CalculateAccurateRipId(CDImageLayout toc) + { + // Calculate the three disc ids used by AR + uint discId1 = 0; + uint discId2 = 0; + for (int iTrack = 1; iTrack <= toc.TrackCount; iTrack++) + if (toc[iTrack].IsAudio) + { + discId1 += toc[iTrack].Start; + discId2 += Math.Max(toc[iTrack].Start, 1) * toc[iTrack].Number; + } + discId1 += toc.Length; + discId2 += Math.Max(toc.Length, 1) * ((uint)toc.AudioTracks + 1); + discId1 &= 0xFFFFFFFF; + discId2 &= 0xFFFFFFFF; + return string.Format("{0:x8}-{1:x8}-{2}", discId1, discId2, CalculateCDDBId(toc).ToLower()); + } public List AccDisks { diff --git a/CUETools.CDImage/CDImage.cs b/CUETools.CDImage/CDImage.cs index abc9d8b..cece0c3 100644 --- a/CUETools.CDImage/CDImage.cs +++ b/CUETools.CDImage/CDImage.cs @@ -299,9 +299,6 @@ namespace CUETools.CDImage return String.Format("{0:00}:{1:00}:{2:00}", min, sec, frame); } - public string _cddbId; - public string _ArId; - uint _length; string _catalog; IList _tracks; diff --git a/CUETools.Ripper.Console/Program.cs b/CUETools.Ripper.Console/Program.cs index 406cc58..3c067d1 100644 --- a/CUETools.Ripper.Console/Program.cs +++ b/CUETools.Ripper.Console/Program.cs @@ -62,8 +62,10 @@ namespace CUERipper AccurateRipVerify arVerify = new AccurateRipVerify(audioSource.TOC); WAVWriter audioDest = new WAVWriter(destFile, audioSource.BitsPerSample, audioSource.ChannelCount, audioSource.SampleRate, toStdout ? Console.OpenStandardOutput() : null); int[,] buff = new int[audioSource.BestBlockSize, audioSource.ChannelCount]; + string CDDBId = AccurateRipVerify.CalculateCDDBId(audioSource.TOC); + string ArId = AccurateRipVerify.CalculateAccurateRipId(audioSource.TOC); - arVerify.ContactAccurateRip(audioSource.TOC._ArId); + arVerify.ContactAccurateRip(ArId); Console.WriteLine("File Info : {0}kHz; {1} channel; {2} bit; {3}", audioSource.SampleRate, audioSource.ChannelCount, audioSource.BitsPerSample, TimeSpan.FromSeconds(audioSource.Length * 1.0 / audioSource.SampleRate)); Console.WriteLine("Filename : {0}", destFile); @@ -131,8 +133,8 @@ namespace CUERipper logWriter.Close(); StreamWriter cueWriter = new StreamWriter(Path.ChangeExtension(destFile, ".cue")); - cueWriter.WriteLine("REM DISCID {0}", audioSource.TOC._cddbId); - cueWriter.WriteLine("REM ACCURATERIPID {0}", audioSource.TOC._ArId); + cueWriter.WriteLine("REM DISCID {0}", CDDBId); + cueWriter.WriteLine("REM ACCURATERIPID {0}", ArId); cueWriter.WriteLine("REM COMMENT \"{0}\"", programVersion); if (audioSource.TOC.Catalog != null) cueWriter.WriteLine("CATALOG {0}", audioSource.TOC.Catalog); diff --git a/CUETools.Ripper.SCSI/SCSIDrive.cs b/CUETools.Ripper.SCSI/SCSIDrive.cs index e78bebb..47f5219 100644 --- a/CUETools.Ripper.SCSI/SCSIDrive.cs +++ b/CUETools.Ripper.SCSI/SCSIDrive.cs @@ -107,29 +107,9 @@ namespace CUETools.Ripper.SCSI // new CDTextEncoderDecoder _toc = new CDImageLayout(toc[toc.Count - 1].StartSector); - uint cddbDiscId = 0; - uint discId1 = 0; - uint discId2 = 0; for (int iTrack = 0; iTrack < toc.Count - 1; iTrack++) - { _toc.AddTrack(new CDTrack((uint)iTrack + 1, toc[iTrack].StartSector, toc[iTrack + 1].StartSector - toc[iTrack].StartSector, toc[iTrack].Control == 0)); - cddbDiscId += sumDigits((uint)(toc[iTrack].StartSector / 75) + 2); - if (toc[iTrack].Control == 0) - { - discId1 += toc[iTrack].StartSector; - discId2 += (toc[iTrack].StartSector == 0 ? 1 : toc[iTrack].StartSector) * ((uint)iTrack + 1); - } - } - discId1 += toc[toc.Count - 1].StartSector; - discId2 += (toc[toc.Count - 1].StartSector == 0 ? 1 : toc[toc.Count - 1].StartSector) * (_toc.AudioTracks+1); - discId1 &= 0xFFFFFFFF; - discId2 &= 0xFFFFFFFF; - cddbDiscId = (((cddbDiscId % 255) << 24) + - (((uint)(toc[toc.Count - 1].StartSector / 75) - (uint)(toc[0].StartSector / 75)) << 8) + - (uint)(toc.Count - 1)) & 0xFFFFFFFF; - _toc._cddbId = string.Format("{0:X8}", cddbDiscId); - _toc._ArId = string.Format("{0:x8}-{1:x8}-{2:x8}", discId1, discId2, cddbDiscId); return true; }