diff --git a/Aaru.Images/CDRWin/Properties.cs b/Aaru.Images/CDRWin/Properties.cs index fb3045424..14d3177fd 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.StartSector = gdRomSession2Offset; - previousTrackFile = cdrTrack.TrackFile.DataFilter.Filename; aaruTrack.EndSector = aaruTrack.StartSector + cdrTrack.Sectors - 1; + if(_discImage.IsRedumpGigadisc && + cdrTrack.Session == 2 && + previousStartSector < gdRomSession2Offset) + { + aaruTrack.StartSector = (ulong)cdrTrack.Indexes[0]; + aaruTrack.EndSector = gdRomSession2Offset + cdrTrack.Sectors - (uint)cdrTrack.Pregap - 1; + } + if(cdrTrack.TrackType == CDRWIN_TRACK_TYPE_CDG) { aaruTrack.SubchannelFilter = cdrTrack.TrackFile.DataFilter; diff --git a/Aaru.Images/CDRWin/Read.cs b/Aaru.Images/CDRWin/Read.cs index a8e0bd5c4..9b179d99d 100644 --- a/Aaru.Images/CDRWin/Read.cs +++ b/Aaru.Images/CDRWin/Read.cs @@ -1319,9 +1319,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; @@ -1420,7 +1422,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) @@ -1824,6 +1827,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); @@ -2239,6 +2265,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);