From 8ab3623bf442fe2ed28ef0a740bc1ab080add3f9 Mon Sep 17 00:00:00 2001 From: Rebecca Wallander Date: Sat, 25 Sep 2021 21:49:57 +0200 Subject: [PATCH] Add pregap to second session in redump gdrom --- Aaru.Images/CDRWin/Properties.cs | 13 +++++--- Aaru.Images/CDRWin/Read.cs | 57 +++++++++++++++++++++++++++++--- 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/Aaru.Images/CDRWin/Properties.cs b/Aaru.Images/CDRWin/Properties.cs index cf85f66fb..c80a9cc04 100644 --- a/Aaru.Images/CDRWin/Properties.cs +++ b/Aaru.Images/CDRWin/Properties.cs @@ -120,15 +120,18 @@ namespace Aaru.DiscImages foreach((ushort index, int position) in cdrTrack.Indexes) aaruTrack.Indexes[index] = position; - if(_discImage.IsRedumpGigadisc && - cdrTrack.Session == 2 && - previousStartSector < gdRomSession2Offset) - aaruTrack.TrackStartSector = gdRomSession2Offset; - previousTrackFile = cdrTrack.TrackFile.DataFilter.GetFilename(); aaruTrack.TrackEndSector = aaruTrack.TrackStartSector + cdrTrack.Sectors - 1; + if(_discImage.IsRedumpGigadisc && + cdrTrack.Session == 2 && + previousStartSector < gdRomSession2Offset) + { + aaruTrack.TrackStartSector = (ulong)cdrTrack.Indexes[0]; + aaruTrack.TrackEndSector = gdRomSession2Offset + cdrTrack.Sectors - (uint)cdrTrack.Pregap - 1; + } + 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 46c0d443f..dfc2aa074 100644 --- a/Aaru.Images/CDRWin/Read.cs +++ b/Aaru.Images/CDRWin/Read.cs @@ -1253,9 +1253,11 @@ namespace Aaru.DiscImages track.Session == 2 && firstTrackInSession) { - track.Indexes.Add(0, (int)(0 - (ulong)track.Pregap)); - currentSector = (int)gdRomSession2Offset; - firstTrackInSession = false; + currentSector = (int)gdRomSession2Offset - track.Pregap; + track.Indexes.Add(0, 0); + track.Indexes[1] = track.Pregap; + track.Sectors += (ulong)track.Pregap; + firstTrackInSession = false; } currentFileStartSector = currentSector; @@ -1346,7 +1348,8 @@ namespace Aaru.DiscImages if(_discImage.IsRedumpGigadisc && _discImage.Tracks[i].Sequence == 3) - _offsetMap.Add(_discImage.Tracks[i].Sequence, gdRomSession2Offset); + _offsetMap.Add(_discImage.Tracks[i].Sequence, + gdRomSession2Offset - (ulong)_discImage.Tracks[i].Pregap); else if(_discImage.Tracks[i].Indexes.TryGetValue(0, out int idx0)) _offsetMap.Add(_discImage.Tracks[i].Sequence, (ulong)idx0); else if(_discImage.Tracks[i].Sequence > 1) @@ -1746,6 +1749,29 @@ namespace Aaru.DiscImages sectorAddress -= _lostPregap; } + if(_discImage.IsRedumpGigadisc && + aaruTrack.Session == 2 && + aaruTrack.Indexes[0] >= 45000 - aaruTrack.Pregap && + aaruTrack.Indexes[1] <= 45000) + { + if(sectorAddress < (ulong)(aaruTrack.Indexes[1] - aaruTrack.Indexes[0])) + { + if(sectorAddress + length + (ulong)aaruTrack.Indexes[0] <= (ulong)aaruTrack.Indexes[1]) + return buffer; + + ulong pregapPos = (ulong)(aaruTrack.Indexes[1] - aaruTrack.Indexes[0]) - sectorAddress; + + byte[] presentData = ReadSectors((ulong)(aaruTrack.Indexes[1] - aaruTrack.Indexes[0]), + (uint)(length - pregapPos), track); + + Array.Copy(presentData, 0, buffer, (long)(pregapPos * sectorSize), presentData.Length); + + return buffer; + } + + sectorAddress -= (ulong)(aaruTrack.Indexes[1] - aaruTrack.Indexes[0]); + } + _imageStream = aaruTrack.TrackFile.DataFilter.GetDataForkStream(); var br = new BinaryReader(_imageStream); @@ -2152,6 +2178,29 @@ namespace Aaru.DiscImages sectorAddress -= _lostPregap; } + if(_discImage.IsRedumpGigadisc && + aaruTrack.Session == 2 && + aaruTrack.Indexes[0] >= 45000 - aaruTrack.Pregap && + aaruTrack.Indexes[1] <= 45000) + { + if(sectorAddress < (ulong)(aaruTrack.Indexes[1] - aaruTrack.Indexes[0])) + { + if(sectorAddress + length + (ulong)aaruTrack.Indexes[0] <= (ulong)aaruTrack.Indexes[1]) + return buffer; + + ulong pregapPos = (ulong)(aaruTrack.Indexes[1] - aaruTrack.Indexes[0]) - sectorAddress; + + byte[] presentData = ReadSectorsLong((ulong)(aaruTrack.Indexes[1] - aaruTrack.Indexes[0]), + (uint)(length - pregapPos), track); + + Array.Copy(presentData, 0, buffer, (long)(pregapPos * sectorSize), presentData.Length); + + return buffer; + } + + sectorAddress -= (ulong)(aaruTrack.Indexes[1] - aaruTrack.Indexes[0]); + } + _imageStream = aaruTrack.TrackFile.DataFilter.GetDataForkStream(); var br = new BinaryReader(_imageStream);