From 5f0efc233a99ffc96610daaa9e90003b7874915a Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 6 Apr 2020 03:03:52 +0100 Subject: [PATCH 1/3] Fix building track table in multisession CDRWin images from ISOBuster. --- Aaru.Images/CDRWin/Properties.cs | 10 +++++---- Aaru.Images/CDRWin/Read.cs | 38 ++++++++++++++++++++++++-------- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/Aaru.Images/CDRWin/Properties.cs b/Aaru.Images/CDRWin/Properties.cs index 6540e09eb..608923041 100644 --- a/Aaru.Images/CDRWin/Properties.cs +++ b/Aaru.Images/CDRWin/Properties.cs @@ -61,8 +61,8 @@ namespace Aaru.DiscImages var aaruTrack = new Track { Indexes = cdrTrack.Indexes, TrackDescription = cdrTrack.Title, - TrackStartSector = previousStartSector, TrackPregap = cdrTrack.Pregap, - TrackSession = cdrTrack.Session, TrackSequence = cdrTrack.Sequence, + TrackPregap = cdrTrack.Pregap, + TrackSession = cdrTrack.Session, TrackSequence = cdrTrack.Sequence, TrackType = CdrWinTrackTypeToTrackType(cdrTrack.TrackType), TrackFile = cdrTrack.TrackFile.DataFilter.GetFilename(), TrackFilter = cdrTrack.TrackFile.DataFilter, @@ -73,8 +73,10 @@ namespace Aaru.DiscImages aaruTrack.TrackEndSector = (aaruTrack.TrackStartSector + cdrTrack.Sectors) - 1; - /*if(!cdrTrack.Indexes.TryGetValue(0, out aaruTrack.TrackStartSector)) - cdrTrack.Indexes.TryGetValue(1, out aaruTrack.TrackStartSector);*/ + if(!cdrTrack.Indexes.TryGetValue(0, out aaruTrack.TrackStartSector)) + if(!cdrTrack.Indexes.TryGetValue(1, out aaruTrack.TrackStartSector)) + aaruTrack.TrackStartSector = previousStartSector; + if(cdrTrack.TrackType == CDRWIN_TRACK_TYPE_CDG) { aaruTrack.TrackSubchannelFilter = cdrTrack.TrackFile.DataFilter; diff --git a/Aaru.Images/CDRWin/Read.cs b/Aaru.Images/CDRWin/Read.cs index 27e4e275c..35fc84fc0 100644 --- a/Aaru.Images/CDRWin/Read.cs +++ b/Aaru.Images/CDRWin/Read.cs @@ -123,6 +123,8 @@ namespace Aaru.DiscImages int trackCount = 0; + Dictionary leadouts = new Dictionary(); + while(_cueStream.Peek() >= 0) { lineNumber++; @@ -341,14 +343,13 @@ namespace Aaru.DiscImages { AaruConsole.DebugWriteLine("CDRWin plugin", "Found REM SESSION at line {0}", lineNumber); currentSession = byte.Parse(matchSession.Groups[1].Value); - - // What happens between sessions } else if(matchLba.Success) AaruConsole.DebugWriteLine("CDRWin plugin", "Found REM MSF at line {0}", lineNumber); else if(matchLeadOut.Success) { AaruConsole.DebugWriteLine("CDRWin plugin", "Found REM LEAD-OUT at line {0}", lineNumber); + leadouts[currentSession] = CdrWinMsfToLba(matchLeadOut.Groups[1].Value); } else if(matchApplication.Success) { @@ -773,11 +774,6 @@ namespace Aaru.DiscImages { sessions[s - 1].SessionSequence = (ushort)s; - if(s > 1) - sessions[s - 1].StartSector = sessions[s - 2].EndSector + 1; - else - sessions[s - 1].StartSector = 0; - ulong sessionSectors = 0; int lastSessionTrack = 0; @@ -790,8 +786,32 @@ namespace Aaru.DiscImages lastSessionTrack = i; } - sessions[s - 1].EndTrack = cueTracks[lastSessionTrack].Sequence; - sessions[s - 1].EndSector = sessionSectors - 1; + sessions[s - 1].EndTrack = cueTracks[lastSessionTrack].Sequence; + + if(leadouts.TryGetValue((byte)s, out ulong leadout)) + { + sessions[s - 1].EndSector = leadout - 1; + + if(!cueTracks[lastSessionTrack].Indexes.TryGetValue(0, out ulong startSector)) + cueTracks[lastSessionTrack].Indexes.TryGetValue(1, out startSector); + + cueTracks[lastSessionTrack].Sectors = leadout - startSector; + } + else + sessions[s - 1].EndSector = sessionSectors - 1; + + CdrWinTrack firstSessionTrack = cueTracks.OrderBy(t => t.Sequence).First(t => t.Session == s); + + if(firstSessionTrack.Indexes.TryGetValue(0, out sessions[s - 1].StartSector)) + continue; + + if(firstSessionTrack.Indexes.TryGetValue(1, out sessions[s - 1].StartSector)) + continue; + + if(s > 1) + sessions[s - 1].StartSector = sessions[s - 2].EndSector + 1; + else + sessions[s - 1].StartSector = 0; } for(int s = 1; s <= sessions.Length; s++) From 48448814448981b42294e71c8eec28e4babd4cad Mon Sep 17 00:00:00 2001 From: Rebecca Wallander Date: Wed, 15 Apr 2020 14:49:00 +0200 Subject: [PATCH 2/3] Fix order of calculations --- Aaru.Images/CDRWin/Properties.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Aaru.Images/CDRWin/Properties.cs b/Aaru.Images/CDRWin/Properties.cs index 608923041..1ee4e1a51 100644 --- a/Aaru.Images/CDRWin/Properties.cs +++ b/Aaru.Images/CDRWin/Properties.cs @@ -70,13 +70,13 @@ namespace Aaru.DiscImages TrackFileType = cdrTrack.TrackFile.FileType, TrackRawBytesPerSector = cdrTrack.Bps, TrackBytesPerSector = CdrWinTrackTypeToCookedBytesPerSector(cdrTrack.TrackType) }; - - aaruTrack.TrackEndSector = (aaruTrack.TrackStartSector + cdrTrack.Sectors) - 1; - + if(!cdrTrack.Indexes.TryGetValue(0, out aaruTrack.TrackStartSector)) if(!cdrTrack.Indexes.TryGetValue(1, out aaruTrack.TrackStartSector)) aaruTrack.TrackStartSector = previousStartSector; + aaruTrack.TrackEndSector = (aaruTrack.TrackStartSector + cdrTrack.Sectors) - 1; + if(cdrTrack.TrackType == CDRWIN_TRACK_TYPE_CDG) { aaruTrack.TrackSubchannelFilter = cdrTrack.TrackFile.DataFilter; From 6544826909d1949bf1c635b8a38ff7ce01850892 Mon Sep 17 00:00:00 2001 From: Rebecca Wallander Date: Wed, 15 Apr 2020 15:25:02 +0200 Subject: [PATCH 3/3] Use old parsing method if multi-file cue. Not the nicest solution but it it should be able to handle multi-file but still one-file-for-several-tracks cues, if those exist. --- Aaru.Images/CDRWin/Properties.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Aaru.Images/CDRWin/Properties.cs b/Aaru.Images/CDRWin/Properties.cs index 1ee4e1a51..c5cb1ec31 100644 --- a/Aaru.Images/CDRWin/Properties.cs +++ b/Aaru.Images/CDRWin/Properties.cs @@ -55,6 +55,7 @@ namespace Aaru.DiscImages List tracks = new List(); ulong previousStartSector = 0; + string previousTrackFile = ""; foreach(CdrWinTrack cdrTrack in _discImage.Tracks) { @@ -71,9 +72,16 @@ namespace Aaru.DiscImages TrackBytesPerSector = CdrWinTrackTypeToCookedBytesPerSector(cdrTrack.TrackType) }; - if(!cdrTrack.Indexes.TryGetValue(0, out aaruTrack.TrackStartSector)) - if(!cdrTrack.Indexes.TryGetValue(1, out aaruTrack.TrackStartSector)) - aaruTrack.TrackStartSector = previousStartSector; + if (previousTrackFile == aaruTrack.TrackFile || previousTrackFile == "") + { + if(!cdrTrack.Indexes.TryGetValue(0, out aaruTrack.TrackStartSector)) + if(!cdrTrack.Indexes.TryGetValue(1, out aaruTrack.TrackStartSector)) + aaruTrack.TrackStartSector += previousStartSector; + } + else + aaruTrack.TrackStartSector += previousStartSector; + + previousTrackFile = cdrTrack.TrackFile.DataFilter.GetFilename(); aaruTrack.TrackEndSector = (aaruTrack.TrackStartSector + cdrTrack.Sectors) - 1;