Done with ripping for now

This commit is contained in:
chudov
2008-12-02 03:03:08 +00:00
parent e4e1d3ebde
commit 6a7486f7cd
10 changed files with 138 additions and 69 deletions

View File

@@ -231,7 +231,12 @@ namespace APEDotNet {
virtual bool UpdateTags(bool preserveTime) 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<Int32, 2>^ buff, UInt32 sampleCount) virtual UInt32 Read([Out] array<Int32, 2>^ buff, UInt32 sampleCount)

View File

@@ -127,7 +127,12 @@ namespace CUETools.AccurateRip
public uint CRC(int iTrack) 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) public uint CRC(int iTrack, int oi)
@@ -186,6 +191,13 @@ namespace CUETools.AccurateRip
CheckPosition(); 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() private void CheckPosition()
{ {
while (_samplesRemTrack <= 0) while (_samplesRemTrack <= 0)
@@ -538,6 +550,7 @@ namespace CUETools.AccurateRip
private HttpStatusCode _accResult; private HttpStatusCode _accResult;
private uint[,] _offsetedCRC; private uint[,] _offsetedCRC;
private uint[,] _offsetedFrame450CRC; private uint[,] _offsetedFrame450CRC;
private uint[] _backupCRC;
private const int _arOffsetRange = 5 * 588 - 1; private const int _arOffsetRange = 5 * 588 - 1;
} }

View File

@@ -38,7 +38,7 @@ namespace CUERipper
{ {
string programVersion = "CUERipper v1.9.3 Copyright (C) 2008 Gregory S. Chudov"; string programVersion = "CUERipper v1.9.3 Copyright (C) 2008 Gregory S. Chudov";
Console.SetOut(Console.Error); 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("This is free software under the GNU GPLv3+ license; There is NO WARRANTY, to");
Console.WriteLine("the extent permitted by law. <http://www.gnu.org/licenses/> for details."); Console.WriteLine("the extent permitted by law. <http://www.gnu.org/licenses/> for details.");

View File

@@ -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]; byte[] _sectorBuffer = new byte[CB_AUDIO * NSECTORS];
private int fromBCD(byte hex) private int fromBCD(byte hex)

View File

@@ -171,7 +171,12 @@ namespace JDP
//TimeSpan span = DateTime.Now - _startedAt; //TimeSpan span = DateTime.Now - _startedAt;
progressBar1.Value = 0; progressBar1.Value = 0;
progressBar2.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(); StringWriter sw = new StringWriter();
cueSheet.GenerateAccurateRipLog(sw); cueSheet.GenerateAccurateRipLog(sw);

View File

@@ -364,7 +364,14 @@ namespace JDP {
{ {
if (_batchPaths.Count == 0) 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(); frmReport reportForm = new frmReport();
StringWriter sw = new StringWriter(); StringWriter sw = new StringWriter();

View File

@@ -35,7 +35,6 @@ namespace JDP {
if (_config.wvCompressionMode == 2) rbWVHigh.Checked = true; if (_config.wvCompressionMode == 2) rbWVHigh.Checked = true;
if (_config.wvCompressionMode == 3) rbWVVeryHigh.Checked = true; if (_config.wvCompressionMode == 3) rbWVVeryHigh.Checked = true;
chkWVExtraMode.Checked = (_config.wvExtraMode != 0); chkWVExtraMode.Checked = (_config.wvExtraMode != 0);
chkWVExtraMode_CheckedChanged(null, null);
if (_config.wvExtraMode != 0) numWVExtraMode.Value = _config.wvExtraMode; if (_config.wvExtraMode != 0) numWVExtraMode.Value = _config.wvExtraMode;
chkWVStoreMD5.Checked = _config.wvStoreMD5; chkWVStoreMD5.Checked = _config.wvStoreMD5;
switch (_config.apeCompressionLevel) switch (_config.apeCompressionLevel)
@@ -68,6 +67,8 @@ namespace JDP {
numericLossyWAVQuality.Value = _config.lossyWAVQuality; numericLossyWAVQuality.Value = _config.lossyWAVQuality;
chkHDCDLW16.Checked = _config.decodeHDCDtoLW16; chkHDCDLW16.Checked = _config.decodeHDCDtoLW16;
chkHDCD24bit.Checked = _config.decodeHDCDto24bit; chkHDCD24bit.Checked = _config.decodeHDCDto24bit;
EnableDisable();
} }
private void frmSettings_FormClosing(object sender, FormClosingEventArgs e) { private void frmSettings_FormClosing(object sender, FormClosingEventArgs e) {
@@ -90,7 +91,7 @@ namespace JDP {
} }
private void chkWVExtraMode_CheckedChanged(object sender, EventArgs e) { private void chkWVExtraMode_CheckedChanged(object sender, EventArgs e) {
numWVExtraMode.Enabled = chkWVExtraMode.Checked; EnableDisable();
} }
private void btnOK_Click(object sender, EventArgs e) private void btnOK_Click(object sender, EventArgs e)
@@ -144,43 +145,59 @@ namespace JDP {
_config.decodeHDCDto24bit = chkHDCD24bit.Checked; _config.decodeHDCDto24bit = chkHDCD24bit.Checked;
} }
private void chkArFixOffset_CheckedChanged(object sender, EventArgs e) private void EnableDisable()
{ {
numFixWhenConfidence.Enabled = numFixWhenConfidence.Enabled =
labelFixWhenConfidence.Enabled = labelFixWhenConfidence.Enabled =
numFixWhenPercent.Enabled = numFixWhenPercent.Enabled =
labelFixWhenPercent.Enabled = chkArFixOffset.Checked; labelFixWhenPercent.Enabled = chkArFixOffset.Checked;
}
private void chkArNoUnverifiedAudio_CheckedChanged(object sender, EventArgs e)
{
numEncodeWhenConfidence.Enabled = numEncodeWhenConfidence.Enabled =
labelEncodeWhenConfidence.Enabled = labelEncodeWhenConfidence.Enabled =
numEncodeWhenPercent.Enabled = numEncodeWhenPercent.Enabled =
labelEncodeWhenPercent.Enabled = labelEncodeWhenPercent.Enabled =
chkEncodeWhenZeroOffset.Enabled = chkArNoUnverifiedAudio.Checked; 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)
{
EnableDisable();
} }
private void chkHDCDDetect_CheckedChanged(object sender, EventArgs e) private void chkHDCDDetect_CheckedChanged(object sender, EventArgs e)
{ {
grpHDCD.Enabled = chkHDCDDetect.Checked; EnableDisable();
} }
private void chkFilenamesANSISafe_CheckedChanged(object sender, EventArgs e) private void chkFilenamesANSISafe_CheckedChanged(object sender, EventArgs e)
{ {
chkRemoveSpecial.Enabled = chkFilenamesANSISafe.Checked; EnableDisable();
txtSpecialExceptions.Enabled = chkRemoveSpecial.Checked && chkFilenamesANSISafe.Checked;
} }
private void chkRemoveSpecial_CheckedChanged(object sender, EventArgs e) private void chkRemoveSpecial_CheckedChanged(object sender, EventArgs e)
{ {
txtSpecialExceptions.Enabled = chkRemoveSpecial.Checked; EnableDisable();
} }
private void chkHDCDDecode_CheckedChanged(object sender, EventArgs e) private void chkHDCDDecode_CheckedChanged(object sender, EventArgs e)
{ {
chkHDCDLW16.Enabled = chkHDCDDecode.Checked; EnableDisable();
chkHDCD24bit.Enabled = chkHDCDDecode.Checked;
} }
} }
} }

View File

@@ -20,7 +20,6 @@
// **************************************************************************** // ****************************************************************************
using System; using System;
using System.Reflection;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Text; using System.Text;
@@ -521,7 +520,7 @@ namespace CUETools.Processor
{ {
release = results.First(); release = results.First();
General.SetCUELine(_attributes, "REM", "DISCID", AccurateRipVerify.CalculateCDDBId(_toc), false); 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, "REM", "DATE", release.GetEvents()[0].Date.Substring(0, 4), false);
General.SetCUELine(_attributes, "PERFORMER", release.GetArtist(), true); General.SetCUELine(_attributes, "PERFORMER", release.GetArtist(), true);
General.SetCUELine(_attributes, "TITLE", release.GetTitle(), true); General.SetCUELine(_attributes, "TITLE", release.GetTitle(), true);
@@ -1182,24 +1181,29 @@ namespace CUETools.Processor
sw1.Close(); sw1.Close();
} }
public string VersionString()
{
return Assembly.GetExecutingAssembly().GetName().Name + " " + Assembly.GetExecutingAssembly().GetName().Version;
}
public string LOGContents() public string LOGContents()
{ {
if (!_isCD) if (!_isCD)
return null; return null;
#if !MONO #if !MONO
StringWriter logWriter = new StringWriter(); StringWriter logWriter = new StringWriter();
logWriter.WriteLine("{0}", VersionString()); logWriter.WriteLine("{0}", CDDriveReader.RipperVersion());
logWriter.WriteLine(); logWriter.WriteLine("Extraction logfile from : {0}", DateTime.Now);
logWriter.WriteLine("Extraction logfile from {0}", DateTime.Now);
logWriter.WriteLine();
logWriter.WriteLine("Used drive : {0}", _driveName); logWriter.WriteLine("Used drive : {0}", _driveName);
logWriter.WriteLine();
logWriter.WriteLine("Read offset correction : {0}", _driveOffset); 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();
logWriter.WriteLine("TOC of the extracted CD"); logWriter.WriteLine("TOC of the extracted CD");
logWriter.WriteLine(); logWriter.WriteLine();
@@ -1213,6 +1217,10 @@ namespace CUETools.Processor
_toc[track].Start, _toc[track].Start,
_toc[track].End); _toc[track].End);
logWriter.WriteLine(); 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) if (_accurateRipMode != AccurateRipMode.None)
{ {
logWriter.WriteLine("AccurateRip summary"); logWriter.WriteLine("AccurateRip summary");
@@ -1348,7 +1356,7 @@ namespace CUETools.Processor
if (0 != _writeOffset) if (0 != _writeOffset)
sw.WriteLine("Offset applied: {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) public void GenerateAccurateRipTagsForTrack(NameValueCollection tags, int offset, int bestOffset, int iTrack, string prefix)
@@ -1469,14 +1477,11 @@ namespace CUETools.Processor
} }
} }
if ( _accurateRipMode != AccurateRipMode.Verify ) if (_accurateRipMode != AccurateRipMode.Verify)
for (int i = 0; i < destPaths.Length; i++) { for (int i = 0; i < destPaths.Length; i++)
for (int j = 0; j < _sourcePaths.Count; j++) { for (int j = 0; j < _sourcePaths.Count; j++)
if (destPaths[i].ToLower() == _sourcePaths[j].ToLower()) { if (destPaths[i].ToLower() == _sourcePaths[j].ToLower())
throw new Exception("Source and destination audio file paths cannot be the same."); throw new Exception("Source and destination audio file paths cannot be the same.");
}
}
}
destLengths = CalculateAudioFileLengths(style); destLengths = CalculateAudioFileLengths(style);
@@ -1546,6 +1551,7 @@ namespace CUETools.Processor
{ {
_writeOffset = 0; _writeOffset = 0;
WriteAudioFilesPass(dir, style, destPaths, destLengths, htoaToFile, true); WriteAudioFilesPass(dir, style, destPaths, destLengths, htoaToFile, true);
_arVerify.CreateBackup(_writeOffset);
} }
} }
else if (_accurateRipMode == AccurateRipMode.VerifyThenConvert) else if (_accurateRipMode == AccurateRipMode.VerifyThenConvert)
@@ -1569,6 +1575,7 @@ namespace CUETools.Processor
if (tracksMatch * 100 >= _config.fixWhenPercent * TrackCount) if (tracksMatch * 100 >= _config.fixWhenPercent * TrackCount)
_writeOffset = bestOffset; _writeOffset = bestOffset;
} }
_arVerify.CreateBackup(_writeOffset);
} }
} }
@@ -1586,6 +1593,14 @@ namespace CUETools.Processor
{ {
string logContents = LOGContents(); string logContents = LOGContents();
string cueContents = CUESheetContents(style); 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) if (logContents != null)
WriteText(Path.ChangeExtension(_cuePath, ".log"), logContents); WriteText(Path.ChangeExtension(_cuePath, ".log"), logContents);
@@ -1593,13 +1608,8 @@ namespace CUETools.Processor
{ {
WriteText(_cuePath, cueContents); WriteText(_cuePath, cueContents);
#if !MONO #if !MONO
if (_accurateRipMode == AccurateRipMode.VerifyAndConvert && if (needNewCRCs)
_config.writeArTagsOnConvert &&
_arVerify.AccResult == HttpStatusCode.OK)
{ {
uint tracksMatch;
int bestOffset;
FindBestOffset(1, true, out tracksMatch, out bestOffset);
for (int iTrack = 0; iTrack < TrackCount; iTrack++) for (int iTrack = 0; iTrack < TrackCount; iTrack++)
{ {
IAudioSource audioSource = AudioReadWrite.GetAudioSource(destPaths[iTrack + (htoaToFile ? 1 : 0)], null); IAudioSource audioSource = AudioReadWrite.GetAudioSource(destPaths[iTrack + (htoaToFile ? 1 : 0)], null);
@@ -1617,24 +1627,16 @@ namespace CUETools.Processor
if (_config.createCUEFileWhenEmbedded) if (_config.createCUEFileWhenEmbedded)
WriteText(Path.ChangeExtension(_cuePath, ".cue"), cueContents); WriteText(Path.ChangeExtension(_cuePath, ".cue"), cueContents);
#if !MONO #if !MONO
if ((_accurateRipMode == AccurateRipMode.VerifyAndConvert && if (needNewCRCs || _isCD)
_config.writeArTagsOnConvert &&
_arVerify.AccResult == HttpStatusCode.OK) ||
(_accurateRipMode != AccurateRipMode.VerifyThenConvert &&
_isCD))
{ {
IAudioSource audioSource = AudioReadWrite.GetAudioSource(destPaths[0], null); IAudioSource audioSource = AudioReadWrite.GetAudioSource(destPaths[0], null);
if (_isCD) if (_isCD)
{ {
if (_accurateRipMode != AccurateRipMode.VerifyThenConvert)
audioSource.Tags.Add("CUESHEET", cueContents); audioSource.Tags.Add("CUESHEET", cueContents);
audioSource.Tags.Add("LOG", logContents); audioSource.Tags.Add("LOG", logContents);
} }
uint tracksMatch; if (needNewCRCs)
int bestOffset;
FindBestOffset(1, true, out tracksMatch, out bestOffset);
if (_accurateRipMode == AccurateRipMode.VerifyAndConvert &&
_config.writeArTagsOnConvert &&
_arVerify.AccResult == HttpStatusCode.OK)
{ {
CleanupTags(audioSource.Tags, "ACCURATERIP"); CleanupTags(audioSource.Tags, "ACCURATERIP");
GenerateAccurateRipTags(audioSource.Tags, 0, bestOffset, -1); GenerateAccurateRipTags(audioSource.Tags, 0, bestOffset, -1);
@@ -1754,7 +1756,7 @@ namespace CUETools.Processor
destTags.Add("TRACKNUMBER", (iTrack + 1).ToString()); destTags.Add("TRACKNUMBER", (iTrack + 1).ToString());
if (_config.writeArTagsOnConvert) 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); GenerateAccurateRipTags(destTags, _writeOffset, bestOffset, iTrack);
else else
destTags.Add("ACCURATERIPID", _accurateRipId); destTags.Add("ACCURATERIPID", _accurateRipId);
@@ -1815,7 +1817,7 @@ namespace CUETools.Processor
if (_config.writeArTagsOnConvert) 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); GenerateAccurateRipTags(destTags, _writeOffset, bestOffset, -1);
else else
destTags.Add("ACCURATERIPID", _accurateRipId); 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 diskLength = 588 * (_toc[_toc.TrackCount].IsAudio ? _toc[_toc.TrackCount].End + 1 : _toc[_toc.TrackCount - 1].End + 1);
uint diskOffset = 0; uint diskOffset = 0;
if (_accurateRipMode != AccurateRipMode.None && (noOutput || _accurateRipMode == AccurateRipMode.VerifyAndConvert)) if (_accurateRipMode != AccurateRipMode.None)
_arVerify.Init(); _arVerify.Init();
ShowProgress(String.Format("{2} track {0:00} ({1:00}%)...", 0, 0, noOutput ? "Verifying" : "Writing"), 0, 0.0, null, null); 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); _arVerify.Write(sampleBuffer, copyCount);
currentOffset += copyCount; currentOffset += copyCount;
@@ -2434,6 +2436,14 @@ namespace CUETools.Processor
} }
} }
public bool IsCD
{
get
{
return _isCD;
}
}
private CDImageLayout _toc; private CDImageLayout _toc;
} }

View File

@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
// //
// You can specify all the values or you can default the Revision and Build Numbers // You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
[assembly: AssemblyVersion("1.0.0.0")] [assembly: AssemblyVersion("1.9.4.0")]
[assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyFileVersion("1.9.4.0")]

View File

@@ -174,11 +174,17 @@ namespace WavPackDotNet {
virtual bool UpdateTags(bool preserveTime) 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() virtual void Close()
{ {
if (_wpc != NULL)
_wpc = WavpackCloseFile(_wpc); _wpc = WavpackCloseFile(_wpc);
if (_IO != nullptr) if (_IO != nullptr)
{ {