Fix reading MODE 2 sectors in all CD images, when they interleave subchannel data. Fixes #229.

This commit is contained in:
2020-01-12 01:00:26 +00:00
parent 736323098e
commit 398d89e55f
6 changed files with 386 additions and 233 deletions

View File

@@ -808,6 +808,10 @@ namespace DiscImageChef.DiscImages
}
case AlcoholTrackMode.Mode2:
case AlcoholTrackMode.Mode2F1:
case AlcoholTrackMode.Mode2F1Alt:
case AlcoholTrackMode.Mode2F2:
case AlcoholTrackMode.Mode2F2Alt:
{
mode2 = true;
sectorOffset = 0;
@@ -817,26 +821,6 @@ namespace DiscImageChef.DiscImages
break;
}
case AlcoholTrackMode.Mode2F1:
case AlcoholTrackMode.Mode2F1Alt:
{
sectorOffset = 24;
sectorSize = 2048;
sectorSkip = 280;
break;
}
case AlcoholTrackMode.Mode2F2:
case AlcoholTrackMode.Mode2F2Alt:
{
sectorOffset = 24;
sectorSize = 2324;
sectorSkip = 4;
break;
}
case AlcoholTrackMode.Audio:
{
sectorOffset = 0;
@@ -884,12 +868,12 @@ namespace DiscImageChef.DiscImages
{
var mode2Ms = new MemoryStream((int)(sectorSize * length));
buffer = br.ReadBytes((int)(sectorSize * length));
buffer = br.ReadBytes((int)((sectorSize + sectorSkip) * length));
for(int i = 0; i < length; i++)
{
byte[] sector = new byte[sectorSize];
Array.Copy(buffer, sectorSize * i, sector, 0, sectorSize);
Array.Copy(buffer, (sectorSize + sectorSkip) * i, sector, 0, sectorSize);
sector = Sector.GetUserDataFromMode2(sector);
mode2Ms.Write(sector, 0, sector.Length);
}

View File

@@ -1348,12 +1348,12 @@ namespace DiscImageChef.DiscImages
{
var mode2Ms = new MemoryStream((int)(sectorSize * length));
buffer = br.ReadBytes((int)(sectorSize * length));
buffer = br.ReadBytes((int)((sectorSize + sectorSkip) * length));
for(int i = 0; i < length; i++)
{
byte[] sector = new byte[sectorSize];
Array.Copy(buffer, sectorSize * i, sector, 0, sectorSize);
Array.Copy(buffer, (sectorSize + sectorSkip) * i, sector, 0, sectorSize);
sector = Sector.GetUserDataFromMode2(sector);
mode2Ms.Write(sector, 0, sector.Length);
}

File diff suppressed because it is too large Load Diff

View File

@@ -304,8 +304,7 @@ namespace DiscImageChef.DiscImages
track.TrackSubchannelOffset = currentOffset;
track.TrackSubchannelType = TrackSubchannelType.Q16Interleaved;
currentOffset +=
trackLen * (ulong)(track.TrackRawBytesPerSector + 16);
currentOffset += trackLen * (ulong)(track.TrackRawBytesPerSector + 16);
break;
case 4:
@@ -317,8 +316,7 @@ namespace DiscImageChef.DiscImages
track.TrackSubchannelOffset = currentOffset;
track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
currentOffset +=
trackLen * (ulong)(track.TrackRawBytesPerSector + 96);
currentOffset += trackLen * (ulong)(track.TrackRawBytesPerSector + 96);
break;
default: throw new ImageNotSupportedException($"Unknown read mode {readMode}");
@@ -383,8 +381,7 @@ namespace DiscImageChef.DiscImages
track.TrackSubchannelOffset = currentOffset;
track.TrackSubchannelType = TrackSubchannelType.Q16Interleaved;
currentOffset +=
trackLen * (ulong)(track.TrackRawBytesPerSector + 16);
currentOffset += trackLen * (ulong)(track.TrackRawBytesPerSector + 16);
if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
@@ -416,8 +413,7 @@ namespace DiscImageChef.DiscImages
track.TrackSubchannelOffset = currentOffset;
track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
currentOffset +=
trackLen * (ulong)(track.TrackRawBytesPerSector + 96);
currentOffset += trackLen * (ulong)(track.TrackRawBytesPerSector + 96);
if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
@@ -488,8 +484,7 @@ namespace DiscImageChef.DiscImages
track.TrackSubchannelOffset = currentOffset;
track.TrackSubchannelType = TrackSubchannelType.Q16Interleaved;
currentOffset +=
trackLen * (ulong)(track.TrackRawBytesPerSector + 16);
currentOffset += trackLen * (ulong)(track.TrackRawBytesPerSector + 16);
if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
@@ -509,8 +504,7 @@ namespace DiscImageChef.DiscImages
track.TrackSubchannelOffset = currentOffset;
track.TrackSubchannelType = TrackSubchannelType.RawInterleaved;
currentOffset +=
trackLen * (ulong)(track.TrackRawBytesPerSector + 96);
currentOffset += trackLen * (ulong)(track.TrackRawBytesPerSector + 96);
if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync);
@@ -821,14 +815,14 @@ namespace DiscImageChef.DiscImages
if(mode2)
{
var mode2Ms = new MemoryStream((int)(sectorSize * length));
var mode2Ms = new MemoryStream((int)((sectorSize + sectorSkip) * length));
imageStream.Read(buffer, 0, buffer.Length);
for(int i = 0; i < length; i++)
{
byte[] sector = new byte[sectorSize];
Array.Copy(buffer, sectorSize * i, sector, 0, sectorSize);
Array.Copy(buffer, (sectorSize + sectorSkip) * i, sector, 0, sectorSize);
sector = Sector.GetUserDataFromMode2(sector);
mode2Ms.Write(sector, 0, sector.Length);
}