Fix sectors calculations in CDRWin disc images. Fixes #501

This commit is contained in:
2021-06-07 20:47:05 +01:00
parent 515831143b
commit afaacd20e8
3 changed files with 84 additions and 91 deletions

View File

@@ -44,7 +44,6 @@ namespace Aaru.DiscImages
{ {
IFilter _cdrwinFilter; IFilter _cdrwinFilter;
StreamReader _cueStream; StreamReader _cueStream;
ulong _densitySeparationSectors;
StreamWriter _descriptorStream; StreamWriter _descriptorStream;
CdrWinDisc _discImage; CdrWinDisc _discImage;
ImageInfo _imageInfo; ImageInfo _imageInfo;

View File

@@ -131,46 +131,7 @@ namespace Aaru.DiscImages
else else
aaruTrack.TrackSubchannelType = TrackSubchannelType.None; aaruTrack.TrackSubchannelType = TrackSubchannelType.None;
if(_imageInfo.MediaType != MediaType.CD && if(!_isCd)
_imageInfo.MediaType != MediaType.CDDA &&
_imageInfo.MediaType != MediaType.CDG &&
_imageInfo.MediaType != MediaType.CDEG &&
_imageInfo.MediaType != MediaType.CDI &&
_imageInfo.MediaType != MediaType.CDROM &&
_imageInfo.MediaType != MediaType.CDROMXA &&
_imageInfo.MediaType != MediaType.CDPLUS &&
_imageInfo.MediaType != MediaType.CDMO &&
_imageInfo.MediaType != MediaType.CDR &&
_imageInfo.MediaType != MediaType.CDRW &&
_imageInfo.MediaType != MediaType.CDMRW &&
_imageInfo.MediaType != MediaType.VCD &&
_imageInfo.MediaType != MediaType.SVCD &&
_imageInfo.MediaType != MediaType.PCD &&
_imageInfo.MediaType != MediaType.DTSCD &&
_imageInfo.MediaType != MediaType.CDMIDI &&
_imageInfo.MediaType != MediaType.CDV &&
_imageInfo.MediaType != MediaType.CDIREADY &&
_imageInfo.MediaType != MediaType.FMTOWNS &&
_imageInfo.MediaType != MediaType.PS1CD &&
_imageInfo.MediaType != MediaType.PS2CD &&
_imageInfo.MediaType != MediaType.MEGACD &&
_imageInfo.MediaType != MediaType.SATURNCD &&
_imageInfo.MediaType != MediaType.GDROM &&
_imageInfo.MediaType != MediaType.GDR &&
_imageInfo.MediaType != MediaType.MilCD &&
_imageInfo.MediaType != MediaType.SuperCDROM2 &&
_imageInfo.MediaType != MediaType.JaguarCD &&
_imageInfo.MediaType != MediaType.ThreeDO &&
_imageInfo.MediaType != MediaType.PCFX &&
_imageInfo.MediaType != MediaType.NeoGeoCD &&
_imageInfo.MediaType != MediaType.CDTV &&
_imageInfo.MediaType != MediaType.CD32 &&
_imageInfo.MediaType != MediaType.Playdia &&
_imageInfo.MediaType != MediaType.Pippin &&
_imageInfo.MediaType != MediaType.VideoNow &&
_imageInfo.MediaType != MediaType.VideoNowColor &&
_imageInfo.MediaType != MediaType.VideoNowXp &&
_imageInfo.MediaType != MediaType.CVD)
{ {
aaruTrack.TrackPregap = 0; aaruTrack.TrackPregap = 0;
aaruTrack.Indexes?.Clear(); aaruTrack.Indexes?.Clear();

View File

@@ -164,7 +164,6 @@ namespace Aaru.DiscImages
bool firstTrackInSession = false; bool firstTrackInSession = false;
ulong gdRomSession2Offset = 45000; ulong gdRomSession2Offset = 45000;
_densitySeparationSectors = 0;
while(_cueStream.Peek() >= 0) while(_cueStream.Peek() >= 0)
{ {
@@ -898,9 +897,10 @@ namespace Aaru.DiscImages
if(leadouts.TryGetValue((byte)s, out int leadout)) if(leadouts.TryGetValue((byte)s, out int leadout))
{ {
int startSector;
sessions[s - 1].EndSector = (ulong)(leadout - 1); sessions[s - 1].EndSector = (ulong)(leadout - 1);
if(!cueTracks[lastSessionTrack].Indexes.TryGetValue(0, out int startSector)) if(!cueTracks[lastSessionTrack].Indexes.TryGetValue(0, out startSector))
cueTracks[lastSessionTrack].Indexes.TryGetValue(1, out startSector); cueTracks[lastSessionTrack].Indexes.TryGetValue(1, out startSector);
cueTracks[lastSessionTrack].Sectors = (ulong)(leadout - startSector); cueTracks[lastSessionTrack].Sectors = (ulong)(leadout - startSector);
@@ -915,9 +915,10 @@ namespace Aaru.DiscImages
if(firstSessionTrack.Pregap < 150) if(firstSessionTrack.Pregap < 150)
firstSessionTrack.Pregap = 150; firstSessionTrack.Pregap = 150;
if(cueTracks.All(i => i.TrackFile.DataFilter.GetFilename() == if(cueTracks.Any(i => i.TrackFile.DataFilter.GetFilename() !=
cueTracks.First().TrackFile.DataFilter.GetFilename())) cueTracks.First().TrackFile.DataFilter.GetFilename()))
{ continue;
if(firstSessionTrack.Indexes.TryGetValue(0, out int sessionStart)) if(firstSessionTrack.Indexes.TryGetValue(0, out int sessionStart))
{ {
sessions[s - 1].StartSector = (ulong)sessionStart; sessions[s - 1].StartSector = (ulong)sessionStart;
@@ -930,10 +931,6 @@ namespace Aaru.DiscImages
sessions[s - 1].StartSector = (ulong)sessionStart; sessions[s - 1].StartSector = (ulong)sessionStart;
} }
} }
}
for(int s = 1; s <= sessions.Length; s++)
_discImage.Sessions.Add(sessions[s - 1]);
for(int t = 1; t <= cueTracks.Length; t++) for(int t = 1; t <= cueTracks.Length; t++)
{ {
@@ -957,7 +954,7 @@ namespace Aaru.DiscImages
// We check 32 random positions, to prevent coincidence of data // We check 32 random positions, to prevent coincidence of data
for(int i = 0; i < 32; i++) for(int i = 0; i < 32; i++)
{ {
int next = rnd.Next((int)_imageInfo.Sectors); int next = rnd.Next(cueTracks[^1].Indexes[1]);
track1Stream.Position = next * 2352; track1Stream.Position = next * 2352;
byte[] data = new byte[16]; byte[] data = new byte[16];
@@ -1058,7 +1055,7 @@ namespace Aaru.DiscImages
_discImage.MediaType = MediaType.CDI; _discImage.MediaType = MediaType.CDI;
else if(firstAudio && else if(firstAudio &&
data && data &&
_discImage.Sessions.Count > 1 && sessions.Length > 1 &&
mode2) mode2)
_discImage.MediaType = MediaType.CDPLUS; _discImage.MediaType = MediaType.CDPLUS;
else if((firstData && audio) || mode2) else if((firstData && audio) || mode2)
@@ -1138,26 +1135,6 @@ namespace Aaru.DiscImages
else else
AaruConsole.DebugWriteLine("CDRWin plugin", "\tComment: \"{0}\"", _discImage.Comment); AaruConsole.DebugWriteLine("CDRWin plugin", "\tComment: \"{0}\"", _discImage.Comment);
AaruConsole.DebugWriteLine("CDRWin plugin", "Session information:");
AaruConsole.DebugWriteLine("CDRWin plugin", "\tDisc contains {0} sessions", _discImage.Sessions.Count);
for(int i = 0; i < _discImage.Sessions.Count; i++)
{
AaruConsole.DebugWriteLine("CDRWin plugin", "\tSession {0} information:", i + 1);
AaruConsole.DebugWriteLine("CDRWin plugin", "\t\tStarting track: {0}",
_discImage.Sessions[i].StartTrack);
AaruConsole.DebugWriteLine("CDRWin plugin", "\t\tStarting sector: {0}",
_discImage.Sessions[i].StartSector);
AaruConsole.DebugWriteLine("CDRWin plugin", "\t\tEnding track: {0}",
_discImage.Sessions[i].EndTrack);
AaruConsole.DebugWriteLine("CDRWin plugin", "\t\tEnding sector: {0}",
_discImage.Sessions[i].EndSector);
}
AaruConsole.DebugWriteLine("CDRWin plugin", "Track information:"); AaruConsole.DebugWriteLine("CDRWin plugin", "Track information:");
AaruConsole.DebugWriteLine("CDRWin plugin", "\tDisc contains {0} tracks", _discImage.Tracks.Count); AaruConsole.DebugWriteLine("CDRWin plugin", "\tDisc contains {0} tracks", _discImage.Tracks.Count);
@@ -1235,6 +1212,50 @@ namespace Aaru.DiscImages
AaruConsole.DebugWriteLine("CDRWin plugin", "\t\tTitle: {0}", _discImage.Tracks[i].Title); AaruConsole.DebugWriteLine("CDRWin plugin", "\t\tTitle: {0}", _discImage.Tracks[i].Title);
} }
foreach(CdrWinTrack track in _discImage.Tracks)
_imageInfo.ImageSize += track.Bps * track.Sectors;
for(int s = 0; s < sessions.Length; s++)
{
if(!_discImage.Tracks[(int)sessions[s].StartTrack - 1].Indexes.
TryGetValue(0, out int sessionTrackStart))
_discImage.Tracks[(int)sessions[s].StartTrack - 1].Indexes.
TryGetValue(1, out sessionTrackStart);
sessions[s].StartSector = (ulong)(sessionTrackStart > 0 ? sessionTrackStart : 0);
if(!_discImage.Tracks[(int)sessions[s].EndTrack - 1].Indexes.TryGetValue(0, out sessionTrackStart))
_discImage.Tracks[(int)sessions[s].EndTrack - 1].Indexes.TryGetValue(1, out sessionTrackStart);
sessions[s].EndSector = (ulong)(sessionTrackStart > 0 ? sessionTrackStart : 0);
sessions[s].EndSector += _discImage.Tracks[(int)sessions[s].EndTrack - 1].Sectors - 1;
}
for(int s = 1; s <= sessions.Length; s++)
_discImage.Sessions.Add(sessions[s - 1]);
_imageInfo.Sectors = _discImage.Sessions.OrderByDescending(s => s.EndSector).First().EndSector + 1;
AaruConsole.DebugWriteLine("CDRWin plugin", "Session information:");
AaruConsole.DebugWriteLine("CDRWin plugin", "\tDisc contains {0} sessions", _discImage.Sessions.Count);
for(int i = 0; i < _discImage.Sessions.Count; i++)
{
AaruConsole.DebugWriteLine("CDRWin plugin", "\tSession {0} information:", i + 1);
AaruConsole.DebugWriteLine("CDRWin plugin", "\t\tStarting track: {0}",
_discImage.Sessions[i].StartTrack);
AaruConsole.DebugWriteLine("CDRWin plugin", "\t\tStarting sector: {0}",
_discImage.Sessions[i].StartSector);
AaruConsole.DebugWriteLine("CDRWin plugin", "\t\tEnding track: {0}",
_discImage.Sessions[i].EndTrack);
AaruConsole.DebugWriteLine("CDRWin plugin", "\t\tEnding sector: {0}",
_discImage.Sessions[i].EndSector);
}
AaruConsole.DebugWriteLine("CDRWin plugin", "Building offset map"); AaruConsole.DebugWriteLine("CDRWin plugin", "Building offset map");
Partitions = new List<Partition>(); Partitions = new List<Partition>();
@@ -1280,7 +1301,6 @@ namespace Aaru.DiscImages
_discImage.Tracks[i].Sequence == 3) _discImage.Tracks[i].Sequence == 3)
{ {
_offsetMap.Add(_discImage.Tracks[i].Sequence, gdRomSession2Offset); _offsetMap.Add(_discImage.Tracks[i].Sequence, gdRomSession2Offset);
_densitySeparationSectors += gdRomSession2Offset - previousPartitionsSize;
previousPartitionsSize = gdRomSession2Offset; previousPartitionsSize = gdRomSession2Offset;
} }
else if(_discImage.Tracks[i].Sequence > 1) else if(_discImage.Tracks[i].Sequence > 1)
@@ -1309,14 +1329,6 @@ namespace Aaru.DiscImages
AaruConsole.DebugWriteLine("CDRWin plugin", "\tPartition size in bytes: {0}", partition.Size); AaruConsole.DebugWriteLine("CDRWin plugin", "\tPartition size in bytes: {0}", partition.Size);
} }
foreach(CdrWinTrack track in _discImage.Tracks)
_imageInfo.ImageSize += track.Bps * track.Sectors;
foreach(CdrWinTrack track in _discImage.Tracks)
_imageInfo.Sectors += track.Sectors;
_imageInfo.Sectors += _densitySeparationSectors;
if(_discImage.MediaType != MediaType.CDROMXA && if(_discImage.MediaType != MediaType.CDROMXA &&
_discImage.MediaType != MediaType.CDDA && _discImage.MediaType != MediaType.CDDA &&
_discImage.MediaType != MediaType.CDI && _discImage.MediaType != MediaType.CDI &&
@@ -1346,7 +1358,7 @@ namespace Aaru.DiscImages
// Detect ISOBuster extensions // Detect ISOBuster extensions
else if(_discImage.OriginalMediaType != null || else if(_discImage.OriginalMediaType != null ||
_discImage.Comment.ToLower().Contains("isobuster") || _discImage.Comment.ToLower().Contains("isobuster") ||
_discImage.Sessions.Count > 1) sessions.Length > 1)
_imageInfo.Application = "ISOBuster"; _imageInfo.Application = "ISOBuster";
else else
_imageInfo.Application = "CDRWin"; _imageInfo.Application = "CDRWin";
@@ -1465,6 +1477,27 @@ namespace Aaru.DiscImages
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEdc); _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdSectorEdc);
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackFlags); _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackFlags);
_imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackIsrc); _imageInfo.ReadableSectorTags.Remove(SectorTagType.CdTrackIsrc);
sessions = _discImage.Sessions.ToArray();
foreach(CdrWinTrack track in _discImage.Tracks)
{
track.Indexes.Remove(0);
track.Pregap = 0;
for(int s = 0; s < sessions.Length; s++)
{
if(sessions[s].SessionSequence > 1 &&
track.Sequence == sessions[s].StartTrack)
{
track.TrackFile.Offset += 307200;
track.Sectors -= 150;
sessions[s].StartSector = (ulong)track.Indexes[1];
}
}
}
_discImage.Sessions = sessions.ToList();
} }
return true; return true;