Fix detection of CD-i Ready discs when negative offset and drive cannot read negative sectors. Fixes #396

This commit is contained in:
2020-11-08 21:48:22 +00:00
parent 1308b2b17d
commit 146bb0804e

View File

@@ -224,7 +224,7 @@ namespace Aaru.Core.Media.Detection
bool isData = IsData(sector0);
if(!isData ||
sector0[0xF] != 2)
(sector0[0xF] != 2 && sector0[0xF] != 1))
return false;
byte[] testMark = new byte[4];
@@ -406,15 +406,18 @@ namespace Aaru.Core.Media.Detection
if((mediaType == MediaType.CD || mediaType == MediaType.CDROM) && hasDataTrack)
{
foreach(uint startAddress in decodedToc.
Value.TrackDescriptors.
foreach(uint startAddress in decodedToc.Value.TrackDescriptors.
Where(t => t.POINT > 0 && t.POINT <= 0x99 &&
((TocControl)(t.CONTROL & 0x0D) == TocControl.DataTrack ||
((TocControl)(t.CONTROL & 0x0D) ==
TocControl.DataTrack ||
(TocControl)(t.CONTROL & 0x0D) ==
TocControl.DataTrackIncremental)).
Select(track => (uint)(((track.PHOUR * 3600 * 75) +
(track.PMIN * 60 * 75) + (track.PSEC * 75) +
track.PFRAME) - 150) + 16))
(track.PMIN * 60 *
75) +
(track.PSEC * 75) +
track.PFRAME) -
150) + 16))
{
sense = dev.ReadCd(out cmdBuf, out _, startAddress, 2352, 1, MmcSectorTypes.AllTypes, false,
false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
@@ -587,10 +590,21 @@ namespace Aaru.Core.Media.Detection
lba16 -= sectorsForOffset;
}
dev.ReadCd(out sector0, out _, (uint)lba0, 2352, (uint)sectorsForOffset + 1,
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true,
true, MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out _);
sense = dev.ReadCd(out sector0, out _, (uint)lba0, 2352, (uint)sectorsForOffset + 1,
MmcSectorTypes.AllTypes, false, false, true,
MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
MmcSubchannel.None, dev.Timeout, out _);
// Drive does not support reading negative sectors?
if(sense && lba0 < 0)
{
dev.ReadCd(out sector0, out _, 0, 2352, 2, MmcSectorTypes.AllTypes, false, false,
true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
MmcSubchannel.None, dev.Timeout, out _);
sector0 = DescrambleAndFixOffset(sector0, combinedOffset, sectorsForOffset);
}
else
sector0 = DescrambleAndFixOffset(sector0, combinedOffset, sectorsForOffset);
dev.ReadCd(out byte[] sector16, out _, (uint)lba16, 2352, (uint)sectorsForOffset + 1,