diff --git a/APEDotNet/apedotnet.cpp b/APEDotNet/apedotnet.cpp index ffaf607..93dcd48 100644 --- a/APEDotNet/apedotnet.cpp +++ b/APEDotNet/apedotnet.cpp @@ -231,7 +231,12 @@ namespace APEDotNet { virtual bool UpdateTags(bool preserveTime) { - return false; + Close (); + APETagDotNet^ apeTag = gcnew APETagDotNet (_path, true, false); + apeTag->SetStringTags (_tags, true); + apeTag->Save(); + apeTag->Close(); + return true; } virtual UInt32 Read([Out] array^ buff, UInt32 sampleCount) diff --git a/CUETools.AccurateRip/AccurateRip.cs b/CUETools.AccurateRip/AccurateRip.cs index 908ef43..5bd046d 100644 --- a/CUETools.AccurateRip/AccurateRip.cs +++ b/CUETools.AccurateRip/AccurateRip.cs @@ -127,7 +127,12 @@ namespace CUETools.AccurateRip public uint CRC(int iTrack) { - return CRC(iTrack); + return _offsetedCRC[iTrack, _arOffsetRange]; + } + + public uint BackupCRC(int iTrack) + { + return _backupCRC[iTrack]; } public uint CRC(int iTrack, int oi) @@ -186,6 +191,13 @@ namespace CUETools.AccurateRip CheckPosition(); } + public void CreateBackup(int writeOffset) + { + _backupCRC = new uint[_toc.AudioTracks]; + for (int i = 0; i < _toc.AudioTracks; i++) + _backupCRC[i] = CRC(i, writeOffset); + } + private void CheckPosition() { while (_samplesRemTrack <= 0) @@ -538,6 +550,7 @@ namespace CUETools.AccurateRip private HttpStatusCode _accResult; private uint[,] _offsetedCRC; private uint[,] _offsetedFrame450CRC; + private uint[] _backupCRC; private const int _arOffsetRange = 5 * 588 - 1; } diff --git a/CUETools.Ripper.Console/Program.cs b/CUETools.Ripper.Console/Program.cs index 169ae94..6ca17b7 100644 --- a/CUETools.Ripper.Console/Program.cs +++ b/CUETools.Ripper.Console/Program.cs @@ -38,7 +38,7 @@ namespace CUERipper { string programVersion = "CUERipper v1.9.3 Copyright (C) 2008 Gregory S. Chudov"; Console.SetOut(Console.Error); - Console.WriteLine("{0}", programVersion); + Console.WriteLine("{0}", CDDriveReader.RipperVersion()); Console.WriteLine("This is free software under the GNU GPLv3+ license; There is NO WARRANTY, to"); Console.WriteLine("the extent permitted by law. for details."); diff --git a/CUETools.Ripper.SCSI/SCSIDrive.cs b/CUETools.Ripper.SCSI/SCSIDrive.cs index 9699416..d652f7b 100644 --- a/CUETools.Ripper.SCSI/SCSIDrive.cs +++ b/CUETools.Ripper.SCSI/SCSIDrive.cs @@ -430,6 +430,12 @@ namespace CUETools.Ripper.SCSI } } + public static string RipperVersion() + { + return "CUERipper v1.9.3 Copyright (C) 2008 Gregory S. Chudov"; + // ripper.GetName().Name + " " + ripper.GetName().Version; + } + byte[] _sectorBuffer = new byte[CB_AUDIO * NSECTORS]; private int fromBCD(byte hex) diff --git a/CUETools/frmBatch.cs b/CUETools/frmBatch.cs index 91f46cd..bc2505f 100644 --- a/CUETools/frmBatch.cs +++ b/CUETools/frmBatch.cs @@ -171,7 +171,12 @@ namespace JDP //TimeSpan span = DateTime.Now - _startedAt; progressBar1.Value = 0; progressBar2.Value = 0; - if (cueSheet.AccurateRip != AccurateRipMode.None) + if (cueSheet.IsCD) + { + textBox1.Text += cueSheet.LOGContents(); + textBox1.Show(); + } + else if (cueSheet.AccurateRip != AccurateRipMode.None) { StringWriter sw = new StringWriter(); cueSheet.GenerateAccurateRipLog(sw); diff --git a/CUETools/frmCUETools.cs b/CUETools/frmCUETools.cs index aedb695..9547794 100644 --- a/CUETools/frmCUETools.cs +++ b/CUETools/frmCUETools.cs @@ -364,7 +364,14 @@ namespace JDP { { if (_batchPaths.Count == 0) { - if (cueSheet.AccurateRip != AccurateRipMode.None) + if (cueSheet.IsCD) + { + frmReport reportForm = new frmReport(); + reportForm.Message = cueSheet.LOGContents(); + CenterSubForm(reportForm); + reportForm.ShowDialog(this); + } + else if (cueSheet.AccurateRip != AccurateRipMode.None) { frmReport reportForm = new frmReport(); StringWriter sw = new StringWriter(); diff --git a/CUETools/frmSettings.cs b/CUETools/frmSettings.cs index 595d05b..c30e621 100644 --- a/CUETools/frmSettings.cs +++ b/CUETools/frmSettings.cs @@ -35,7 +35,6 @@ namespace JDP { if (_config.wvCompressionMode == 2) rbWVHigh.Checked = true; if (_config.wvCompressionMode == 3) rbWVVeryHigh.Checked = true; chkWVExtraMode.Checked = (_config.wvExtraMode != 0); - chkWVExtraMode_CheckedChanged(null, null); if (_config.wvExtraMode != 0) numWVExtraMode.Value = _config.wvExtraMode; chkWVStoreMD5.Checked = _config.wvStoreMD5; switch (_config.apeCompressionLevel) @@ -68,6 +67,8 @@ namespace JDP { numericLossyWAVQuality.Value = _config.lossyWAVQuality; chkHDCDLW16.Checked = _config.decodeHDCDtoLW16; chkHDCD24bit.Checked = _config.decodeHDCDto24bit; + + EnableDisable(); } private void frmSettings_FormClosing(object sender, FormClosingEventArgs e) { @@ -90,7 +91,7 @@ namespace JDP { } private void chkWVExtraMode_CheckedChanged(object sender, EventArgs e) { - numWVExtraMode.Enabled = chkWVExtraMode.Checked; + EnableDisable(); } private void btnOK_Click(object sender, EventArgs e) @@ -144,43 +145,59 @@ namespace JDP { _config.decodeHDCDto24bit = chkHDCD24bit.Checked; } - private void chkArFixOffset_CheckedChanged(object sender, EventArgs e) + private void EnableDisable() { numFixWhenConfidence.Enabled = labelFixWhenConfidence.Enabled = - numFixWhenPercent.Enabled = + numFixWhenPercent.Enabled = labelFixWhenPercent.Enabled = chkArFixOffset.Checked; + + numEncodeWhenConfidence.Enabled = + labelEncodeWhenConfidence.Enabled = + numEncodeWhenPercent.Enabled = + labelEncodeWhenPercent.Enabled = + chkEncodeWhenZeroOffset.Enabled = chkArNoUnverifiedAudio.Checked; + + grpHDCD.Enabled = chkHDCDDetect.Checked; + chkHDCDLW16.Enabled = chkHDCDDetect.Checked && chkHDCDDecode.Checked; + chkHDCD24bit.Enabled = chkHDCDDetect.Checked && chkHDCDDecode.Checked; + + chkRemoveSpecial.Enabled = chkFilenamesANSISafe.Checked; + txtSpecialExceptions.Enabled = chkRemoveSpecial.Checked && chkFilenamesANSISafe.Checked; + + txtSpecialExceptions.Enabled = chkRemoveSpecial.Checked; + + numWVExtraMode.Enabled = chkWVExtraMode.Checked; + } + + private void chkArFixOffset_CheckedChanged(object sender, EventArgs e) + { + EnableDisable(); } private void chkArNoUnverifiedAudio_CheckedChanged(object sender, EventArgs e) { - numEncodeWhenConfidence.Enabled = - labelEncodeWhenConfidence.Enabled = - numEncodeWhenPercent.Enabled = - labelEncodeWhenPercent.Enabled = - chkEncodeWhenZeroOffset.Enabled = chkArNoUnverifiedAudio.Checked; + EnableDisable(); } private void chkHDCDDetect_CheckedChanged(object sender, EventArgs e) { - grpHDCD.Enabled = chkHDCDDetect.Checked; + EnableDisable(); } private void chkFilenamesANSISafe_CheckedChanged(object sender, EventArgs e) { - chkRemoveSpecial.Enabled = chkFilenamesANSISafe.Checked; - txtSpecialExceptions.Enabled = chkRemoveSpecial.Checked && chkFilenamesANSISafe.Checked; + EnableDisable(); } private void chkRemoveSpecial_CheckedChanged(object sender, EventArgs e) { - txtSpecialExceptions.Enabled = chkRemoveSpecial.Checked; + EnableDisable(); } private void chkHDCDDecode_CheckedChanged(object sender, EventArgs e) { - chkHDCDLW16.Enabled = chkHDCDDecode.Checked; - chkHDCD24bit.Enabled = chkHDCDDecode.Checked; + EnableDisable(); } } } \ No newline at end of file diff --git a/CUEToolsLib/Main.cs b/CUEToolsLib/Main.cs index 1345cfb..1f3ddea 100644 --- a/CUEToolsLib/Main.cs +++ b/CUEToolsLib/Main.cs @@ -20,7 +20,6 @@ // **************************************************************************** using System; -using System.Reflection; using System.Collections.Generic; using System.Collections.Specialized; using System.Text; @@ -521,7 +520,7 @@ namespace CUETools.Processor { release = results.First(); General.SetCUELine(_attributes, "REM", "DISCID", AccurateRipVerify.CalculateCDDBId(_toc), false); - General.SetCUELine(_attributes, "REM", "COMMENT", VersionString(), true); + General.SetCUELine(_attributes, "REM", "COMMENT", CDDriveReader.RipperVersion(), true); General.SetCUELine(_attributes, "REM", "DATE", release.GetEvents()[0].Date.Substring(0, 4), false); General.SetCUELine(_attributes, "PERFORMER", release.GetArtist(), true); General.SetCUELine(_attributes, "TITLE", release.GetTitle(), true); @@ -1182,24 +1181,29 @@ namespace CUETools.Processor sw1.Close(); } - public string VersionString() - { - return Assembly.GetExecutingAssembly().GetName().Name + " " + Assembly.GetExecutingAssembly().GetName().Version; - } - public string LOGContents() { if (!_isCD) return null; #if !MONO StringWriter logWriter = new StringWriter(); - logWriter.WriteLine("{0}", VersionString()); - logWriter.WriteLine(); - logWriter.WriteLine("Extraction logfile from {0}", DateTime.Now); - logWriter.WriteLine(); - logWriter.WriteLine("Used drive : {0}", _driveName); - logWriter.WriteLine(); - logWriter.WriteLine("Read offset correction : {0}", _driveOffset); + logWriter.WriteLine("{0}", CDDriveReader.RipperVersion()); + logWriter.WriteLine("Extraction logfile from : {0}", DateTime.Now); + logWriter.WriteLine("Used drive : {0}", _driveName); + logWriter.WriteLine("Read offset correction : {0}", _driveOffset); + if (hdcdDecoder != null && hdcdDecoder.Detected) + { + hdcd_decoder_statistics stats; + hdcdDecoder.GetStatistics(out stats); + logWriter.WriteLine("HDCD : peak extend: {0}, transient filter: {1}, gain: {2}", + (stats.enabled_peak_extend ? (stats.disabled_peak_extend ? "some" : "yes") : "none"), + (stats.enabled_transient_filter ? (stats.disabled_transient_filter ? "some" : "yes") : "none"), + stats.min_gain_adjustment == stats.max_gain_adjustment ? + (stats.min_gain_adjustment == 1.0 ? "none" : String.Format("{0:0.0}dB", (Math.Log10(stats.min_gain_adjustment) * 20))) : + String.Format("{0:0.0}dB..{1:0.0}dB", (Math.Log10(stats.min_gain_adjustment) * 20), (Math.Log10(stats.max_gain_adjustment) * 20)) + ); + logWriter.WriteLine(); + } logWriter.WriteLine(); logWriter.WriteLine("TOC of the extracted CD"); logWriter.WriteLine(); @@ -1213,6 +1217,10 @@ namespace CUETools.Processor _toc[track].Start, _toc[track].End); logWriter.WriteLine(); + if (_accurateRipMode == AccurateRipMode.VerifyThenConvert) + for (int iTrack = 0; iTrack < _toc.AudioTracks; iTrack++) + if (_arVerify.BackupCRC(iTrack) != _arVerify.CRC(iTrack)) + logWriter.WriteLine("Track {0} CRC mismatch: test {1:X8} vs copy {2:X8}", iTrack + 1, _arVerify.BackupCRC(iTrack), _arVerify.CRC(iTrack)); if (_accurateRipMode != AccurateRipMode.None) { logWriter.WriteLine("AccurateRip summary"); @@ -1348,7 +1356,7 @@ namespace CUETools.Processor if (0 != _writeOffset) sw.WriteLine("Offset applied: {0}", _writeOffset); - _arVerify.GenerateFullLog(sw, _accurateRipMode == AccurateRipMode.VerifyThenConvert ? _writeOffset : 0); + _arVerify.GenerateFullLog(sw, 0); } public void GenerateAccurateRipTagsForTrack(NameValueCollection tags, int offset, int bestOffset, int iTrack, string prefix) @@ -1469,14 +1477,11 @@ namespace CUETools.Processor } } - if ( _accurateRipMode != AccurateRipMode.Verify ) - for (int i = 0; i < destPaths.Length; i++) { - for (int j = 0; j < _sourcePaths.Count; j++) { - if (destPaths[i].ToLower() == _sourcePaths[j].ToLower()) { - throw new Exception("Source and destination audio file paths cannot be the same."); - } - } - } + if (_accurateRipMode != AccurateRipMode.Verify) + for (int i = 0; i < destPaths.Length; i++) + for (int j = 0; j < _sourcePaths.Count; j++) + if (destPaths[i].ToLower() == _sourcePaths[j].ToLower()) + throw new Exception("Source and destination audio file paths cannot be the same."); destLengths = CalculateAudioFileLengths(style); @@ -1546,6 +1551,7 @@ namespace CUETools.Processor { _writeOffset = 0; WriteAudioFilesPass(dir, style, destPaths, destLengths, htoaToFile, true); + _arVerify.CreateBackup(_writeOffset); } } else if (_accurateRipMode == AccurateRipMode.VerifyThenConvert) @@ -1569,6 +1575,7 @@ namespace CUETools.Processor if (tracksMatch * 100 >= _config.fixWhenPercent * TrackCount) _writeOffset = bestOffset; } + _arVerify.CreateBackup(_writeOffset); } } @@ -1586,6 +1593,14 @@ namespace CUETools.Processor { string logContents = LOGContents(); string cueContents = CUESheetContents(style); + bool needNewCRCs = _accurateRipMode != AccurateRipMode.None && + (_accurateRipMode == AccurateRipMode.VerifyAndConvert || _isCD) && + _config.writeArTagsOnConvert && + _arVerify.AccResult == HttpStatusCode.OK; + uint tracksMatch = 0; + int bestOffset = 0; + if (needNewCRCs) + FindBestOffset(1, true, out tracksMatch, out bestOffset); if (logContents != null) WriteText(Path.ChangeExtension(_cuePath, ".log"), logContents); @@ -1593,13 +1608,8 @@ namespace CUETools.Processor { WriteText(_cuePath, cueContents); #if !MONO - if (_accurateRipMode == AccurateRipMode.VerifyAndConvert && - _config.writeArTagsOnConvert && - _arVerify.AccResult == HttpStatusCode.OK) + if (needNewCRCs) { - uint tracksMatch; - int bestOffset; - FindBestOffset(1, true, out tracksMatch, out bestOffset); for (int iTrack = 0; iTrack < TrackCount; iTrack++) { IAudioSource audioSource = AudioReadWrite.GetAudioSource(destPaths[iTrack + (htoaToFile ? 1 : 0)], null); @@ -1617,24 +1627,16 @@ namespace CUETools.Processor if (_config.createCUEFileWhenEmbedded) WriteText(Path.ChangeExtension(_cuePath, ".cue"), cueContents); #if !MONO - if ((_accurateRipMode == AccurateRipMode.VerifyAndConvert && - _config.writeArTagsOnConvert && - _arVerify.AccResult == HttpStatusCode.OK) || - (_accurateRipMode != AccurateRipMode.VerifyThenConvert && - _isCD)) + if (needNewCRCs || _isCD) { IAudioSource audioSource = AudioReadWrite.GetAudioSource(destPaths[0], null); if (_isCD) { - audioSource.Tags.Add("CUESHEET", cueContents); + if (_accurateRipMode != AccurateRipMode.VerifyThenConvert) + audioSource.Tags.Add("CUESHEET", cueContents); audioSource.Tags.Add("LOG", logContents); } - uint tracksMatch; - int bestOffset; - FindBestOffset(1, true, out tracksMatch, out bestOffset); - if (_accurateRipMode == AccurateRipMode.VerifyAndConvert && - _config.writeArTagsOnConvert && - _arVerify.AccResult == HttpStatusCode.OK) + if (needNewCRCs) { CleanupTags(audioSource.Tags, "ACCURATERIP"); GenerateAccurateRipTags(audioSource.Tags, 0, bestOffset, -1); @@ -1754,7 +1756,7 @@ namespace CUETools.Processor destTags.Add("TRACKNUMBER", (iTrack + 1).ToString()); if (_config.writeArTagsOnConvert) { - if (_accurateRipMode == AccurateRipMode.VerifyThenConvert && _arVerify.AccResult == HttpStatusCode.OK) + if (!_isCD && _accurateRipMode == AccurateRipMode.VerifyThenConvert && _arVerify.AccResult == HttpStatusCode.OK) GenerateAccurateRipTags(destTags, _writeOffset, bestOffset, iTrack); else destTags.Add("ACCURATERIPID", _accurateRipId); @@ -1815,7 +1817,7 @@ namespace CUETools.Processor if (_config.writeArTagsOnConvert) { - if (fWithCUE && _accurateRipMode == AccurateRipMode.VerifyThenConvert && _arVerify.AccResult == HttpStatusCode.OK) + if (fWithCUE && !_isCD && _accurateRipMode == AccurateRipMode.VerifyThenConvert && _arVerify.AccResult == HttpStatusCode.OK) GenerateAccurateRipTags(destTags, _writeOffset, bestOffset, -1); else destTags.Add("ACCURATERIPID", _accurateRipId); @@ -1899,7 +1901,7 @@ namespace CUETools.Processor uint diskLength = 588 * (_toc[_toc.TrackCount].IsAudio ? _toc[_toc.TrackCount].End + 1 : _toc[_toc.TrackCount - 1].End + 1); uint diskOffset = 0; - if (_accurateRipMode != AccurateRipMode.None && (noOutput || _accurateRipMode == AccurateRipMode.VerifyAndConvert)) + if (_accurateRipMode != AccurateRipMode.None) _arVerify.Init(); ShowProgress(String.Format("{2} track {0:00} ({1:00}%)...", 0, 0, noOutput ? "Verifying" : "Writing"), 0, 0.0, null, null); @@ -2017,7 +2019,7 @@ namespace CUETools.Processor } } } - if (_accurateRipMode != AccurateRipMode.None && (noOutput || _accurateRipMode == AccurateRipMode.VerifyAndConvert)) + if (_accurateRipMode != AccurateRipMode.None) _arVerify.Write(sampleBuffer, copyCount); currentOffset += copyCount; @@ -2434,6 +2436,14 @@ namespace CUETools.Processor } } + public bool IsCD + { + get + { + return _isCD; + } + } + private CDImageLayout _toc; } diff --git a/CUEToolsLib/Properties/AssemblyInfo.cs b/CUEToolsLib/Properties/AssemblyInfo.cs index 0bfe4fa..c949ad1 100644 --- a/CUEToolsLib/Properties/AssemblyInfo.cs +++ b/CUEToolsLib/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // // 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")] +[assembly: AssemblyVersion("1.9.4.0")] +[assembly: AssemblyFileVersion("1.9.4.0")] diff --git a/WavPackDotNet/WavPackDotNet.cpp b/WavPackDotNet/WavPackDotNet.cpp index 9769b2c..a0bd2dc 100644 --- a/WavPackDotNet/WavPackDotNet.cpp +++ b/WavPackDotNet/WavPackDotNet.cpp @@ -174,12 +174,18 @@ namespace WavPackDotNet { virtual bool UpdateTags(bool preserveTime) { - return false; + Close (); + APETagDotNet^ apeTag = gcnew APETagDotNet (_path, true, false); + apeTag->SetStringTags (_tags, true); + apeTag->Save(); + apeTag->Close(); + return true; } virtual void Close() { - _wpc = WavpackCloseFile(_wpc); + if (_wpc != NULL) + _wpc = WavpackCloseFile(_wpc); if (_IO != nullptr) { _IO->Close ();