diff --git a/Aaru.Images/CDRWin/Properties.cs b/Aaru.Images/CDRWin/Properties.cs index 7e5b817ed..05e3e537d 100644 --- a/Aaru.Images/CDRWin/Properties.cs +++ b/Aaru.Images/CDRWin/Properties.cs @@ -56,14 +56,15 @@ namespace Aaru.DiscImages ulong previousStartSector = 0; ulong gdRomSession2Offset = 45000; + string previousTrackFile = ""; foreach(CdrWinTrack cdrTrack in _discImage.Tracks) { 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, @@ -71,18 +72,27 @@ namespace Aaru.DiscImages TrackFileType = cdrTrack.TrackFile.FileType, TrackRawBytesPerSector = cdrTrack.Bps, TrackBytesPerSector = CdrWinTrackTypeToCookedBytesPerSector(cdrTrack.TrackType) }; + + 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; if(_discImage.IsRedumpGigadisc && - cdrTrack.Session == 2 && + cdrTrack.Session == 2 && previousStartSector < gdRomSession2Offset) { aaruTrack.TrackStartSector = gdRomSession2Offset; } + previousTrackFile = cdrTrack.TrackFile.DataFilter.GetFilename(); + aaruTrack.TrackEndSector = (aaruTrack.TrackStartSector + cdrTrack.Sectors) - 1; - /*if(!cdrTrack.Indexes.TryGetValue(0, out aaruTrack.TrackStartSector)) - cdrTrack.Indexes.TryGetValue(1, out aaruTrack.TrackStartSector);*/ 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 dfd30c467..3a0481587 100644 --- a/Aaru.Images/CDRWin/Read.cs +++ b/Aaru.Images/CDRWin/Read.cs @@ -125,6 +125,8 @@ namespace Aaru.DiscImages int trackCount = 0; + Dictionary leadouts = new Dictionary(); + while(_cueStream.Peek() >= 0) { lineNumber++; @@ -348,8 +350,6 @@ 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(matchRedumpSdArea.Success) _discImage.IsRedumpGigadisc = true; @@ -363,6 +363,7 @@ namespace Aaru.DiscImages 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) { @@ -798,14 +799,14 @@ namespace Aaru.DiscImages ulong sessionSectors = 0; int lastSessionTrack = 0; - int firstSessionTrack = 0; + int firstSessionTra = 0; for(int i = 0; i < cueTracks.Length; i++) if(cueTracks[i].Session == s) { if(!firstTrackRead) { - firstSessionTrack = i; + firstSessionTra = i; firstTrackRead = true; } sessionSectors += cueTracks[i].Sectors; @@ -814,9 +815,33 @@ namespace Aaru.DiscImages lastSessionTrack = i; } - sessions[s - 1].StartTrack = cueTracks[firstSessionTrack].Sequence; + sessions[s - 1].StartTrack = cueTracks[firstSessionTra].Sequence; sessions[s - 1].EndTrack = cueTracks[lastSessionTrack].Sequence; - sessions[s - 1].EndSector = (sessions[s-1].StartSector + sessionSectors) - 1; + + 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++)