From b9c327b38c4e2f638296901db01f1a7c70930e34 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 19 Jan 2020 19:04:34 +0000 Subject: [PATCH] Fix media type detection when CD TOC does not list track 1. --- .../.idea/contentModel.xml | 3 +- DiscImageChef.Core/Media/Detection/MMC.cs | 45 ++++++++++--------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/.idea/.idea.DiscImageChef/.idea/contentModel.xml b/.idea/.idea.DiscImageChef/.idea/contentModel.xml index 1c4194183..7386de059 100644 --- a/.idea/.idea.DiscImageChef/.idea/contentModel.xml +++ b/.idea/.idea.DiscImageChef/.idea/contentModel.xml @@ -1,10 +1,9 @@ - - + diff --git a/DiscImageChef.Core/Media/Detection/MMC.cs b/DiscImageChef.Core/Media/Detection/MMC.cs index 78051ce52..f49a2695d 100644 --- a/DiscImageChef.Core/Media/Detection/MMC.cs +++ b/DiscImageChef.Core/Media/Detection/MMC.cs @@ -39,6 +39,7 @@ using DiscImageChef.Console; using DiscImageChef.Decoders.CD; using DiscImageChef.Decoders.Sega; using DiscImageChef.Devices; + // ReSharper disable JoinDeclarationAndInitializer namespace DiscImageChef.Core.Media.Detection @@ -382,34 +383,38 @@ namespace DiscImageChef.Core.Media.Detection if(decodedToc.HasValue) { - FullTOC.TrackDataDescriptor firstTrack = decodedToc.Value.TrackDescriptors.First(t => t.POINT == 1); + FullTOC.TrackDataDescriptor firstTrack = + decodedToc.Value.TrackDescriptors.FirstOrDefault(t => t.POINT == 1); - uint firstTrackSector = (uint)(((firstTrack.PHOUR * 3600 * 75) + (firstTrack.PMIN * 60 * 75) + - (firstTrack.PSEC * 75) + firstTrack.PFRAME) - 150); - - // Check for hidden data before start of track 1 - if(firstTrackSector > 0) + if(firstTrack.POINT == 1) { - sense = dev.ReadCd(out sector0, out _, 0, 2352, 1, MmcSectorTypes.AllTypes, false, false, true, - MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, MmcSubchannel.None, - dev.Timeout, out _); + uint firstTrackSector = (uint)(((firstTrack.PHOUR * 3600 * 75) + (firstTrack.PMIN * 60 * 75) + + (firstTrack.PSEC * 75) + firstTrack.PFRAME) - 150); - if(!dev.Error && - !sense) + // Check for hidden data before start of track 1 + if(firstTrackSector > 0) { - hiddenTrack = true; + sense = dev.ReadCd(out sector0, out _, 0, 2352, 1, MmcSectorTypes.AllTypes, false, false, true, + MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + MmcSubchannel.None, dev.Timeout, out _); - hiddenData = IsData(sector0); - - if(hiddenData) + if(!dev.Error && + !sense) { - sense = dev.ReadCd(out byte[] sector16, out _, 16, 2352, 1, MmcSectorTypes.AllTypes, false, false, - true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, - MmcSubchannel.None, dev.Timeout, out _); + hiddenTrack = true; - if(IsCdi(sector0, sector16)) + hiddenData = IsData(sector0); + + if(hiddenData) { - mediaType = MediaType.CDIREADY; + sense = dev.ReadCd(out byte[] sector16, out _, 16, 2352, 1, MmcSectorTypes.AllTypes, + false, false, true, MmcHeaderCodes.AllHeaders, true, true, + MmcErrorField.None, MmcSubchannel.None, dev.Timeout, out _); + + if(IsCdi(sector0, sector16)) + { + mediaType = MediaType.CDIREADY; + } } } }