mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Fix sectors calculations in CDRWin disc images. Fixes #501
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user