From a89fa4bd13fd31b1712a81b26744768a8cffab6a Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Tue, 3 Mar 2020 19:58:49 +0000 Subject: [PATCH] Fix detection of CD-ROM XA. Fixes #269 --- .../Devices/Dumping/CompactDisc/Tracks.cs | 14 ----- Aaru.Core/Media/Detection/MMC.cs | 63 ++++++++++++++++++- Aaru.Core/Media/Info/ScsiInfo.cs | 20 ------ 3 files changed, 62 insertions(+), 35 deletions(-) diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Tracks.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Tracks.cs index 87160ef31..821e0e333 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Tracks.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Tracks.cs @@ -169,20 +169,6 @@ namespace Aaru.Core.Devices.Dumping else if(trk.POINT == 0xA0 && trk.ADR == 1) { - switch(trk.PSEC) - { - case 0x10: - dskType = MediaType.CDI; - - break; - case 0x20: - if(dskType == MediaType.CD || - dskType == MediaType.CDROM) - dskType = MediaType.CDROMXA; - - break; - } - leadoutTrackType = (TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrack || (TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrackIncremental ? TrackType.Data diff --git a/Aaru.Core/Media/Detection/MMC.cs b/Aaru.Core/Media/Detection/MMC.cs index 0ae269845..ce734e50a 100644 --- a/Aaru.Core/Media/Detection/MMC.cs +++ b/Aaru.Core/Media/Detection/MMC.cs @@ -252,7 +252,25 @@ namespace Aaru.Core.Media.Detection bool hasVideoTrack = false; if(decodedToc.HasValue) - foreach(FullTOC.TrackDataDescriptor track in decodedToc.Value.TrackDescriptors) + { + FullTOC.TrackDataDescriptor a0Track = + decodedToc.Value.TrackDescriptors.FirstOrDefault(t => t.POINT == 0xA0 && t.ADR == 1); + + if(a0Track.POINT == 0xA0) + switch(a0Track.PSEC) + { + case 0x10: + mediaType = MediaType.CDI; + + break; + case 0x20: + mediaType = MediaType.CDROMXA; + + break; + } + + foreach(FullTOC.TrackDataDescriptor track in + decodedToc.Value.TrackDescriptors.Where(t => t.POINT > 0 && t.POINT <= 0x99)) { if(track.TNO == 1 && ((TocControl)(track.CONTROL & 0x0D) == TocControl.DataTrack || @@ -279,6 +297,7 @@ namespace Aaru.Core.Media.Detection hasVideoTrack |= track.ADR == 4; } + } if(hasDataTrack && hasAudioTrack && @@ -300,6 +319,48 @@ namespace Aaru.Core.Media.Detection !hasDataTrack && sessions == 1) mediaType = MediaType.CDV; + + if((mediaType == MediaType.CD || mediaType == MediaType.CDROM) && hasDataTrack) + { + foreach(FullTOC.TrackDataDescriptor track in + decodedToc.Value.TrackDescriptors.Where(t => t.POINT > 0 && t.POINT <= 0x99 && + ((TocControl)(t.CONTROL & 0x0D) == + TocControl.DataTrack || + (TocControl)(t.CONTROL & 0x0D) == + TocControl.DataTrackIncremental))) + { + uint startAddress = + (uint)(((track.PHOUR * 3600 * 75) + (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, + MmcSubchannel.None, dev.Timeout, out _); + + if(!sense && + !dev.Error) + { + if(cmdBuf[0] == 0x00 && + cmdBuf[1] == 0xFF && + cmdBuf[2] == 0xFF && + cmdBuf[3] == 0xFF && + cmdBuf[4] == 0xFF && + cmdBuf[5] == 0xFF && + cmdBuf[6] == 0xFF && + cmdBuf[7] == 0xFF && + cmdBuf[8] == 0xFF && + cmdBuf[9] == 0xFF && + cmdBuf[10] == 0xFF && + cmdBuf[11] == 0x00 && + cmdBuf[15] == 0x02) + { + mediaType = MediaType.CDROMXA; + + break; + } + } + } + } } if(secondSessionFirstTrack != 0 && diff --git a/Aaru.Core/Media/Info/ScsiInfo.cs b/Aaru.Core/Media/Info/ScsiInfo.cs index 420356d07..9edd4e4b9 100644 --- a/Aaru.Core/Media/Info/ScsiInfo.cs +++ b/Aaru.Core/Media/Info/ScsiInfo.cs @@ -1148,26 +1148,6 @@ namespace Aaru.Core.Media.Info RawToc = cmdBuf; FullToc = FullTOC.Decode(cmdBuf); - - if(FullToc.HasValue) - { - FullTOC.TrackDataDescriptor a0Track = - FullToc.Value.TrackDescriptors. - FirstOrDefault(t => t.POINT == 0xA0 && t.ADR == 1); - - if(a0Track.POINT == 0xA0) - switch(a0Track.PSEC) - { - case 0x10: - MediaType = MediaType.CDI; - - break; - case 0x20: - MediaType = MediaType.CDROMXA; - - break; - } - } } sense = dev.ReadPma(out cmdBuf, out senseBuf, dev.Timeout, out _);