From 00c229caad7f96cd7fbf1f84059bca01f1b7fda6 Mon Sep 17 00:00:00 2001 From: chudov Date: Sun, 10 May 2009 18:34:49 +0000 Subject: [PATCH] fixes --- CUETools.AccurateRip/AccurateRip.cs | 49 ++++++--- CUETools.Processor/Processor.cs | 164 ++++++++++++++++------------ CUETools.Processor/Settings.cs | 5 + CUETools/CUETools.csproj | 3 +- CUETools/frmSettings.cs | 2 + 5 files changed, 138 insertions(+), 85 deletions(-) diff --git a/CUETools.AccurateRip/AccurateRip.cs b/CUETools.AccurateRip/AccurateRip.cs index 08b0ec0..10ea69e 100644 --- a/CUETools.AccurateRip/AccurateRip.cs +++ b/CUETools.AccurateRip/AccurateRip.cs @@ -538,25 +538,22 @@ namespace CUETools.AccurateRip uint total = Total(iTrack); uint conf = 0, part = 0; bool zeroOffset = false; - string pressings = ""; - for (int iDisk = 0; iDisk < AccDisks.Count; iDisk++) - for (int oi = -_arOffsetRange; oi <= _arOffsetRange; oi++) + //string pressings = ""; + StringBuilder pressings = new StringBuilder(); + for (int oi = -_arOffsetRange; oi <= _arOffsetRange; oi++) + for (int iDisk = 0; iDisk < AccDisks.Count; iDisk++) { - if (CRC(iTrack, oi) == AccDisks[iDisk].tracks[iTrack].CRC) + if (CRC(iTrack, oi) == AccDisks[iDisk].tracks[iTrack].CRC && (AccDisks[iDisk].tracks[iTrack].CRC != 0 || oi == 0)) { conf += AccDisks[iDisk].tracks[iTrack].count; if (oi == 0) zeroOffset = true; - if (pressings != "") - pressings = pressings + ","; - pressings = pressings + oi.ToString(); - } else - if (CRC450(iTrack, oi) == AccDisks[iDisk].tracks[iTrack].Frame450CRC) + pressings.AppendFormat("{0}{1}({2})", pressings.Length > 0 ? "," : "", oi, AccDisks[iDisk].tracks[iTrack].count); + } + else if (CRC450(iTrack, oi) == AccDisks[iDisk].tracks[iTrack].Frame450CRC && (AccDisks[iDisk].tracks[iTrack].Frame450CRC != 0 || oi == 0)) { part += AccDisks[iDisk].tracks[iTrack].count; - if (pressings != "") - pressings = pressings + ","; - pressings = pressings + oi.ToString(); + pressings.AppendFormat("{0}{1}({2})", pressings.Length > 0 ? "," : "", oi, AccDisks[iDisk].tracks[iTrack].count); } } if (conf > 0 && zeroOffset) @@ -578,7 +575,33 @@ namespace CUETools.AccurateRip sw.WriteLine("Track\t[ CRC32 ]\t[W/O NULL]\t{0:10}", _hasLogCRC ? "[ LOG ]" : ""); sw.WriteLine(String.Format(" --\t[{0:X8}]\t[{1:X8}]\t{2:10}", CRC32(0), CRCWONULL(0), CRCLOG(0) == CRC32(0) ? " CRC32 " : CRCLOG(0) == CRCWONULL(0) ? " W/O NULL " : CRCLOG(0) == 0 ? "" : String.Format("[{0:X8}]", CRCLOG(0)))); for (int iTrack = 1; iTrack <= _toc.AudioTracks; iTrack++) - sw.WriteLine(String.Format(" {0:00}\t[{1:X8}]\t[{2:X8}]\t{3:10}", iTrack, CRC32(iTrack), CRCWONULL(iTrack), CRCLOG(iTrack) == CRC32(iTrack) ? " CRC32 " : CRCLOG(iTrack) == CRCWONULL(iTrack) ? " W/O NULL " : CRCLOG(iTrack) == 0 ? "" : String.Format("[{0:X8}]", CRCLOG(iTrack)))); + { + string inLog, extra = ""; + if (CRCLOG(iTrack) == CRC32(iTrack)) + inLog = " CRC32 "; + else if (CRCLOG(iTrack) == CRCWONULL(iTrack)) + inLog = " W/O NULL "; + else if (CRCLOG(iTrack) == 0) + inLog = ""; + else + { + inLog = String.Format("[{0:X8}]", CRCLOG(iTrack)); + for (int jTrack = 1; jTrack <= _toc.AudioTracks; jTrack++) + { + if (CRCLOG(iTrack) == CRC32(jTrack)) + { + extra = string.Format(": CRC32 for track {0}", jTrack); + break; + } + if (CRCLOG(iTrack) == CRCWONULL(jTrack)) + { + inLog = string.Format(": W/O NULL for track {0}", jTrack); + break; + } + } + } + sw.WriteLine(String.Format(" {0:00}\t[{1:X8}]\t[{2:X8}]\t{3:10}{4}", iTrack, CRC32(iTrack), CRCWONULL(iTrack), inLog, extra)); + } } } diff --git a/CUETools.Processor/Processor.cs b/CUETools.Processor/Processor.cs index f682401..9cc5f5d 100644 --- a/CUETools.Processor/Processor.cs +++ b/CUETools.Processor/Processor.cs @@ -505,7 +505,7 @@ namespace CUETools.Processor encoders.Add("lame 256", new CUEToolsUDC("lame 256", "mp3", false, "lame.exe", "-m s -q 0 -b 256 --noreplaygain - %O")); encoders.Add("lame 320", new CUEToolsUDC("lame 320", "mp3", false, "lame.exe", "-m s -q 0 -b 320 --noreplaygain - %O")); encoders.Add("oggenc", new CUEToolsUDC("oggenc", "ogg", false, "oggenc.exe", "-q 3 - -o %O")); - encoders.Add("nero aac", new CUEToolsUDC("nero aac", "mp4", false, "neroAacEnc.exe", "-q 0.4 -if - -of %O")); + encoders.Add("nero aac", new CUEToolsUDC("nero aac", "m4a", false, "neroAacEnc.exe", "-q 0.4 -if - -of %O")); decoders = new Dictionary(); #if !MONO @@ -928,6 +928,7 @@ return processor.Go(); private string _eacLog; private string _inputPath, _inputDir; private string _outputPath; + private string[] _destPaths; private TagLib.File _fileInfo; private const int _arOffsetRange = 5 * 588 - 1; private HDCDDotNet.HDCDDotNet hdcdDecoder; @@ -1012,6 +1013,18 @@ return processor.Go(); } } + public CDDriveReader CDRipper + { + get + { + return _ripper; + } + set + { + _ripper = value; + } + } + public void FillFromMusicBrainz(MusicBrainz.Release release) { Year = release.GetEvents().Count > 0 ? release.GetEvents()[0].Date.Substring(0, 4) : ""; @@ -1538,13 +1551,21 @@ return processor.Go(); } } } - else if (fileIsBinary) + else { - fileTimeLengthFrames = timeRelativeToFileStart + 150; - sourceInfo.Path = null; - sourceInfo.Offset = 0; - sourceInfo.Length = 150 * 588; - _sources.Add(sourceInfo); + if (fileIsBinary) + { + fileTimeLengthFrames = timeRelativeToFileStart + 150; + sourceInfo.Path = null; + sourceInfo.Offset = 0; + sourceInfo.Length = 150 * 588; + _sources.Add(sourceInfo); + } + else + { + if (timeRelativeToFileStart > fileTimeLengthFrames) + throw new Exception(string.Format("TRACK {0} INDEX {1} is at {2}, which is past {3} - the end of source file {4}", trackNumber, line.Params[1], CDImageLayout.TimeToString((uint)timeRelativeToFileStart), CDImageLayout.TimeToString((uint)fileTimeLengthFrames), pathAudio)); + } } indexInfo.Track = trackNumber; indexInfo.Index = Int32.Parse(line.Params[1]); @@ -1754,9 +1775,9 @@ return processor.Go(); if (PreGapLength < tocFromLog.Pregap) PreGapLength = tocFromLog.Pregap; int trNo; - for (trNo = 2; trNo <= tocFromLog.TrackCount; trNo++) - if (_toc[trNo].Pregap < tocFromLog[trNo].Pregap) - _toc[trNo].Pregap = tocFromLog[trNo].Pregap; + for (trNo = 1; trNo < tocFromLog.AudioTracks && trNo < _toc.AudioTracks; trNo++) + if (_toc[_toc.FirstAudio + trNo].Pregap < tocFromLog[tocFromLog.FirstAudio + trNo].Pregap) + _toc[_toc.FirstAudio + trNo].Pregap = tocFromLog[tocFromLog.FirstAudio + trNo].Pregap; } // use data track length from log @@ -2181,6 +2202,22 @@ return processor.Go(); } } } + + if (OutputStyle == CUEStyle.SingleFile || OutputStyle == CUEStyle.SingleFileWithCUE) + { + _destPaths = new string[1]; + _destPaths[0] = Path.Combine(OutputDir, _singleFilename); + } + else + { + bool htoaToFile = ((OutputStyle == CUEStyle.GapsAppended) && _config.preserveHTOA && + (_toc.Pregap != 0)); + _destPaths = new string[TrackCount + (htoaToFile ? 1 : 0)]; + if (htoaToFile) + _destPaths[0] = Path.Combine(OutputDir, _htoaFilename); + for (int i = 0; i < TrackCount; i++) + _destPaths[i + (htoaToFile ? 1 : 0)] = Path.Combine(OutputDir, _trackFilenames[i]); + } } private int GetSampleLength(string path, out TagLib.File fileInfo) @@ -2228,7 +2265,7 @@ return processor.Go(); } #if !MONO - public void CreateExactAudioCopyLOG(string[] destPaths, CUEStyle style) + public void CreateExactAudioCopyLOG() { StringWriter logWriter = new StringWriter(CultureInfo.InvariantCulture); string eacHeader = "Exact Audio Copy V0.99 prebeta 4 from 23. January 2008\r\n" + @@ -2252,12 +2289,8 @@ return processor.Go(); "Used interface : Native Win32 interface for Win NT & 2000\r\n" + "Gap handling : Appended to previous track\r\n" + "\r\n" + - "Used output format : User Defined Encoder\r\n" + - "Selected bitrate : 768 kBit/s\r\n" + - "Quality : High\r\n" + - "Add ID3 tag : No\r\n" + - "Command line compressor : C:\\Program Files (x86)\\EAC\\FLAC\\FLAC.EXE\r\n" + - "Additional command line options : -8 -V -T \"ARTIST=%a\" -T \"TITLE=%t\" -T \"ALBUM=%g\" -T \"DATE=%y\" -T \"TRACKNUMBER=%n\" -T \"GENRE=%m\" %s -o %d\r\n"; + "Used output format : Internal WAV Routines\r\n" + + "Sample format : 44.100 Hz; 16 Bit; Stereo\r\n"; logWriter.WriteLine(eacHeader, DateTime.Now, @@ -2280,24 +2313,24 @@ return processor.Go(); _toc[track].End); logWriter.WriteLine(); - bool htoaToFile = ((style == CUEStyle.GapsAppended) && _config.preserveHTOA && + bool htoaToFile = ((OutputStyle == CUEStyle.GapsAppended) && _config.preserveHTOA && (_toc.Pregap != 0)); int accurateTracks = 0, knownTracks = 0; - if (style != CUEStyle.SingleFile && style != CUEStyle.SingleFileWithCUE) + if (OutputStyle != CUEStyle.SingleFile && OutputStyle != CUEStyle.SingleFileWithCUE) { logWriter.WriteLine(); for (int track = 0; track < _toc.AudioTracks; track++) { logWriter.WriteLine("Track {0,2}", track + 1); logWriter.WriteLine(); - logWriter.WriteLine(" Filename {0}", Path.ChangeExtension(Path.GetFullPath(destPaths[track + (htoaToFile ? 1 : 0)]), ".wav")); + logWriter.WriteLine(" Filename {0}", Path.ChangeExtension(Path.GetFullPath(_destPaths[track + (htoaToFile ? 1 : 0)]), ".wav")); if (_toc[track + _toc.FirstAudio].Pregap > 0 || track + _toc.FirstAudio == 1) { logWriter.WriteLine(); - logWriter.WriteLine(" Pre-gap length {0}", CDImageLayout.TimeToString("0:{0:00}:{1:00}.{2:00}", _toc[track + _toc.FirstAudio].Pregap + (track + _toc.FirstAudio == 1 ? 150U : 0U))); + logWriter.WriteLine(" Pre-gap length 0:{0}.{1:00}", CDImageLayout.TimeToString("{0:00}:{1:00}", _toc[track + _toc.FirstAudio].Pregap + (track + _toc.FirstAudio == 1 ? 150U : 0U)), (_toc[track + _toc.FirstAudio].Pregap % 75) * 100 / 75); } logWriter.WriteLine(); - logWriter.WriteLine(" Peak level {0:F1} %", Tracks[track].PeakLevel / 327.68); + logWriter.WriteLine(" Peak level {0:F1} %", (Tracks[track].PeakLevel * 1000 / 32768) * 0.1); logWriter.WriteLine(" Track quality 100.0 %"); logWriter.WriteLine(" Test CRC {0:X8}", _arVerify.CRC32(track + 1)); logWriter.WriteLine(" Copy CRC {0:X8}", _arVerify.CRC32(track + 1)); @@ -2307,7 +2340,7 @@ return processor.Go(); { knownTracks++; if (_arVerify.Confidence(track) == 0) - logWriter.WriteLine(" Track cannot be verified as accurate (confidence {0}) [{1:X8}], AccurateRip returned [{2:X8}]", _arVerify.Total(track), _arVerify.CRC(track), _arVerify.DBCRC(track)); + logWriter.WriteLine(" Cannot be verified as accurate (confidence {0}) [{1:X8}], AccurateRip returned [{2:X8}]", _arVerify.Total(track), _arVerify.CRC(track), _arVerify.DBCRC(track)); else { logWriter.WriteLine(" Accurately ripped (confidence {0}) [{1:X8}]", _arVerify.Confidence(track), _arVerify.CRC(track)); @@ -2325,9 +2358,13 @@ return processor.Go(); logWriter.WriteLine(); logWriter.WriteLine("Selected range"); logWriter.WriteLine(); - logWriter.WriteLine(" Filename {0}", Path.ChangeExtension(Path.GetFullPath(destPaths[0]), ".wav")); + logWriter.WriteLine(" Filename {0}", Path.ChangeExtension(Path.GetFullPath(_destPaths[0]), ".wav")); logWriter.WriteLine(); - logWriter.WriteLine(" Peak level {0:F1} %", Tracks[0].PeakLevel / 327.68); // TODO: max(tracks) + int PeakLevel = 0; + for (int track = 0; track < TrackCount; track++) + if (PeakLevel < Tracks[track].PeakLevel) + PeakLevel = Tracks[track].PeakLevel; + logWriter.WriteLine(" Peak level {0:F1} %", (PeakLevel * 1000 / 32768) * 0.1); logWriter.WriteLine(" Range quality 100.0 %"); logWriter.WriteLine(" Test CRC {0:X8}", _arVerify.CRC32(0)); logWriter.WriteLine(" Copy CRC {0:X8}", _arVerify.CRC32(0)); @@ -2337,18 +2374,19 @@ return processor.Go(); logWriter.WriteLine(); logWriter.WriteLine(); logWriter.WriteLine("AccurateRip summary"); - for (int track = 1; track <= _toc.TrackCount; track++) + logWriter.WriteLine(); + for (int track = 0; track < _toc.AudioTracks; track++) { - if (_arVerify.Total(track - 1) == 0) - logWriter.WriteLine("Track {0,2} not present in AccurateRip database", track + 1); + if (_arVerify.Total(track) == 0) + logWriter.WriteLine("Track {0,2} not present in database", track + 1); else { knownTracks++; - if (_arVerify.Confidence(track - 1) == 0) - logWriter.WriteLine("Track {3,2} cannot be verified as accurate (confidence {0}) [{1:X8}], AccurateRip returned [{2:X8}]", _arVerify.Total(track - 1), _arVerify.CRC(track - 1), _arVerify.DBCRC(track - 1), track + 1); + if (_arVerify.Confidence(track) == 0) + logWriter.WriteLine("Track {3,2} cannot be verified as accurate (confidence {0}) [{1:X8}], AccurateRip returned [{2:X8}]", _arVerify.Total(track), _arVerify.CRC(track), _arVerify.DBCRC(track), track + 1); else { - logWriter.WriteLine("Track {2,2} Accurately ripped (confidence {0}) [{1:X8}]", _arVerify.Confidence(track - 1), _arVerify.CRC(track - 1), track + 1); + logWriter.WriteLine("Track {2,2} accurately ripped (confidence {0}) [{1:X8}]", _arVerify.Confidence(track), _arVerify.CRC(track), track + 1); accurateTracks++; } } @@ -2358,7 +2396,10 @@ return processor.Go(); if (knownTracks == 0) logWriter.WriteLine("None of the tracks are present in the AccurateRip database"); else if (accurateTracks == 0) - logWriter.WriteLine("No tracks could be verified as accurate\r\nYou may have a different pressing from the one(s) in the database\r\n"); + { + logWriter.WriteLine("No tracks could be verified as accurate"); + logWriter.WriteLine("You may have a different pressing from the one(s) in the database"); + } else if (accurateTracks == TrackCount) logWriter.WriteLine("All tracks accurately ripped"); else @@ -2370,7 +2411,7 @@ return processor.Go(); logWriter.WriteLine("Some tracks could not be verified as accurate"); } logWriter.WriteLine(); - if (style != CUEStyle.SingleFile && style != CUEStyle.SingleFileWithCUE) + if (OutputStyle != CUEStyle.SingleFile && OutputStyle != CUEStyle.SingleFileWithCUE) { logWriter.WriteLine("No errors occurred"); logWriter.WriteLine(); @@ -2381,14 +2422,14 @@ return processor.Go(); } #endif - public void CreateRipperLOG(string[] destPaths, CUEStyle style) + public void CreateRipperLOG() { if (!_isCD || _ripper == null || _ripperLog != null) return; #if !MONO if (_config.createEACLOG) { - CreateExactAudioCopyLOG(destPaths, style); + CreateExactAudioCopyLOG(); return; } StringWriter logWriter = new StringWriter(); @@ -2435,7 +2476,7 @@ return processor.Go(); _toc[track].LastIndex); logWriter.WriteLine(); logWriter.WriteLine("Destination files"); - foreach (string path in destPaths) + foreach (string path in _destPaths) logWriter.WriteLine(" {0}", path); bool wereErrors = false; for (int iTrack = 0; iTrack < _toc.AudioTracks; iTrack++) @@ -2712,11 +2753,9 @@ return processor.Go(); public string Go() { - string[] destPaths; int[] destLengths; bool htoaToFile = ((OutputStyle == CUEStyle.GapsAppended) && _config.preserveHTOA && (_toc.Pregap != 0)); - string dir = OutputDir; if (_isCD && (OutputStyle == CUEStyle.GapsLeftOut || OutputStyle == CUEStyle.GapsPrepended) && (_action == CUEAction.Convert || _action == CUEAction.VerifyAndConvert)) throw new Exception("When ripping a CD, gaps Left Out/Gaps prepended modes can only be used in verify-then-convert mode"); @@ -2724,44 +2763,27 @@ return processor.Go(); if (_usePregapForFirstTrackInSingleFile) throw new Exception("UsePregapForFirstTrackInSingleFile is not supported for writing audio files."); - if (OutputStyle == CUEStyle.SingleFile || OutputStyle == CUEStyle.SingleFileWithCUE) - { - destPaths = new string[1]; - destPaths[0] = Path.Combine(dir, _singleFilename); - } - else - { - destPaths = new string[TrackCount + (htoaToFile ? 1 : 0)]; - if (htoaToFile) - { - destPaths[0] = Path.Combine(dir, _htoaFilename); - } - for (int i = 0; i < TrackCount; i++) - { - destPaths[i + (htoaToFile ? 1 : 0)] = Path.Combine(dir, _trackFilenames[i]); - } - } - if (_action != CUEAction.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++) - 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."); destLengths = CalculateAudioFileLengths(OutputStyle); + // TODO: if (_isCD) might need to recalc, might have changed after scanning the CD + // Lookup(); if (_action != CUEAction.Verify) { - if (!Directory.Exists(dir)) - Directory.CreateDirectory(dir); + if (!Directory.Exists(OutputDir)) + Directory.CreateDirectory(OutputDir); } - if (_isCD) - destLengths = CalculateAudioFileLengths(OutputStyle); // need to recalc, might have changed after scanning the CD + if (_audioEncoderType != AudioEncoderType.NoAudio || _action == CUEAction.Verify) - WriteAudioFilesPass(dir, OutputStyle, destPaths, destLengths, htoaToFile, _action == CUEAction.Verify); - CreateRipperLOG(destPaths, OutputStyle); + WriteAudioFilesPass(OutputDir, OutputStyle, destLengths, htoaToFile, _action == CUEAction.Verify); + CreateRipperLOG(); if (_action == CUEAction.Convert || _action == CUEAction.VerifyAndConvert) { string cueContents = CUESheetContents(OutputStyle); @@ -2796,7 +2818,7 @@ return processor.Go(); { NameValueCollection tags = GenerateAlbumTags(bestOffset, OutputStyle == CUEStyle.SingleFileWithCUE, _ripperLog ?? _eacLog); TagLib.UserDefined.AdditionalFileTypes.Config = _config; - TagLib.File fileInfo = TagLib.File.Create(new TagLib.File.LocalFileAbstraction(destPaths[0])); + TagLib.File fileInfo = TagLib.File.Create(new TagLib.File.LocalFileAbstraction(_destPaths[0])); if (Tagging.UpdateTags(fileInfo, tags, _config)) { TagLib.File sourceFileInfo = _tracks[0]._fileInfo ?? _fileInfo; @@ -2848,7 +2870,7 @@ return processor.Go(); if (_audioEncoderType != AudioEncoderType.NoAudio) for (int iTrack = 0; iTrack < TrackCount; iTrack++) { - string path = destPaths[iTrack + (htoaToFile ? 1 : 0)]; + string path = _destPaths[iTrack + (htoaToFile ? 1 : 0)]; NameValueCollection tags = GenerateTrackTags(iTrack, bestOffset); TagLib.UserDefined.AdditionalFileTypes.Config = _config; TagLib.File fileInfo = TagLib.File.Create(new TagLib.File.LocalFileAbstraction(path)); @@ -3146,7 +3168,7 @@ return processor.Go(); return destTags; } - public void WriteAudioFilesPass(string dir, CUEStyle style, string[] destPaths, int[] destLengths, bool htoaToFile, bool noOutput) + public void WriteAudioFilesPass(string dir, CUEStyle style, int[] destLengths, bool htoaToFile, bool noOutput) { const int buffLen = 16384; int iTrack, iIndex; @@ -3211,7 +3233,7 @@ return processor.Go(); if (style == CUEStyle.SingleFile || style == CUEStyle.SingleFileWithCUE) { iDest++; - audioDest = GetAudioDest(destPaths[iDest], destLengths[iDest], hdcdDecoder != null && hdcdDecoder.Decoding ? hdcdDecoder.BitsPerSample : 16, noOutput); + audioDest = GetAudioDest(_destPaths[iDest], destLengths[iDest], hdcdDecoder != null && hdcdDecoder.Decoding ? hdcdDecoder.BitsPerSample : 16, noOutput); } uint currentOffset = 0, previousOffset = 0; @@ -3239,7 +3261,7 @@ return processor.Go(); hdcdDecoder.AudioDest = null; if (audioDest != null) audioDest.Close(); - audioDest = GetAudioDest(destPaths[iDest], destLengths[iDest], hdcdDecoder != null && hdcdDecoder.Decoding ? hdcdDecoder.BitsPerSample : 16, noOutput); + audioDest = GetAudioDest(_destPaths[iDest], destLengths[iDest], hdcdDecoder != null && hdcdDecoder.Decoding ? hdcdDecoder.BitsPerSample : 16, noOutput); } for (iIndex = 0; iIndex <= _toc[_toc.FirstAudio + iTrack].LastIndex; iIndex++) @@ -3260,7 +3282,7 @@ return processor.Go(); if (audioDest != null) audioDest.Close(); iDest++; - audioDest = GetAudioDest(destPaths[iDest], destLengths[iDest], hdcdDecoder != null && hdcdDecoder.Decoding ? hdcdDecoder.BitsPerSample : 16, noOutput); + audioDest = GetAudioDest(_destPaths[iDest], destLengths[iDest], hdcdDecoder != null && hdcdDecoder.Decoding ? hdcdDecoder.BitsPerSample : 16, noOutput); } if ((style == CUEStyle.GapsAppended) && (iIndex == 0) && (iTrack == 0)) @@ -3269,7 +3291,7 @@ return processor.Go(); if (htoaToFile) { iDest++; - audioDest = GetAudioDest(destPaths[iDest], destLengths[iDest], hdcdDecoder != null && hdcdDecoder.Decoding ? hdcdDecoder.BitsPerSample : 16, noOutput); + audioDest = GetAudioDest(_destPaths[iDest], destLengths[iDest], hdcdDecoder != null && hdcdDecoder.Decoding ? hdcdDecoder.BitsPerSample : 16, noOutput); } } else if ((style == CUEStyle.GapsLeftOut) && (iIndex == 0)) diff --git a/CUETools.Processor/Settings.cs b/CUETools.Processor/Settings.cs index e5dd48a..4c0f50f 100644 --- a/CUETools.Processor/Settings.cs +++ b/CUETools.Processor/Settings.cs @@ -127,6 +127,11 @@ namespace CUETools.Processor public void SaveText(string name, string value) { _sw.Write(name); + if (value == "") + { + _sw.WriteLine("="); + return; + } using (StringReader sr = new StringReader(value)) { string lineStr; diff --git a/CUETools/CUETools.csproj b/CUETools/CUETools.csproj index 5c02caa..3d91065 100644 --- a/CUETools/CUETools.csproj +++ b/CUETools/CUETools.csproj @@ -9,7 +9,7 @@ Properties JDP CUETools - Resources\cue.ico + cue2.ico true @@ -256,6 +256,7 @@ + diff --git a/CUETools/frmSettings.cs b/CUETools/frmSettings.cs index 453d48a..acb5c7a 100644 --- a/CUETools/frmSettings.cs +++ b/CUETools/frmSettings.cs @@ -837,6 +837,8 @@ namespace JDP { private static int WordLength(string text, int pos) { + if (pos >= text.Length) + return 1; if ((text[pos] >= 'a' && text[pos] <= 'z') || (text[pos] >= 'A' && text[pos] <= 'Z') || (text[pos] == '_'))