diff --git a/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs b/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs index 9af059dc3..41ad0dcf8 100644 --- a/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs +++ b/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs @@ -73,22 +73,23 @@ namespace DiscImageChef.Core.Devices.Dumping /// Disc type as detected in MMC layer internal void CompactDisc(ref MediaType dskType) { - DicContext ctx; // Master database context - Device dbDev; // Device database entry - CdOffset cdOffset; // Read offset from database - bool readcd; // Device supports READ CD - bool read6 = false; // Device supports READ(6) - bool read10 = false; //Device supports READ(10) - bool read12 = false; // Device supports READ(12) - bool read16 = false; // Device supports READ(16) - const uint SECTOR_SIZE = 2352; // Full sector size - MmcSubchannel supportedSubchannel; // Drive's maximum supported subchannel - uint subSize; // Subchannel size in bytes - bool sense; // Sense indicator - byte[] cmdBuf; // Data buffer - byte[] senseBuf; // Sense buffer - byte[] tmpBuf; // Temporary buffer - FullTOC.CDFullTOC? toc = null; // Full CD TOC + DicContext ctx; // Master database context + Device dbDev; // Device database entry + CdOffset cdOffset; // Read offset from database + bool readcd; // Device supports READ CD + bool read6 = false; // Device supports READ(6) + bool read10 = false; //Device supports READ(10) + bool read12 = false; // Device supports READ(12) + bool read16 = false; // Device supports READ(16) + const uint SECTOR_SIZE = 2352; // Full sector size + MmcSubchannel supportedSubchannel; // Drive's maximum supported subchannel + uint subSize; // Subchannel size in bytes + bool sense; // Sense indicator + byte[] cmdBuf; // Data buffer + byte[] senseBuf; // Sense buffer + byte[] tmpBuf; // Temporary buffer + FullTOC.CDFullTOC? toc = null; // Full CD TOC + TrackSubchannelType subType; // Track subchannel type Dictionary mediaTags = new Dictionary(); // Media tags @@ -254,6 +255,50 @@ namespace DiscImageChef.Core.Devices.Dumping } } + // Check if output format supports subchannels + if(!outputPlugin.SupportedSectorTags.Contains(SectorTagType.CdSectorSubchannel) && + supportedSubchannel != MmcSubchannel.None) + { + if(!force) + { + dumpLog.WriteLine("Output format does not support subchannels, continuing..."); + UpdateStatus?.Invoke("Output format does not support subchannels, continuing..."); + } + else + { + dumpLog.WriteLine("Output format does not support subchannels, not continuing..."); + StoppingErrorMessage?.Invoke("Output format does not support subchannels, not continuing..."); + + return; + } + + supportedSubchannel = MmcSubchannel.None; + subSize = 0; + } + + switch(supportedSubchannel) + { + case MmcSubchannel.None: + subType = TrackSubchannelType.None; + + break; + case MmcSubchannel.Raw: + subType = TrackSubchannelType.Raw; + + break; + case MmcSubchannel.Q16: + subType = TrackSubchannelType.Q16; + + break; + default: + dumpLog.WriteLine("Handling subchannel type {0} not supported, exiting...", supportedSubchannel); + + StoppingErrorMessage?. + Invoke($"Handling subchannel type {supportedSubchannel} not supported, exiting..."); + + return; + } + // We discarded all discs that falsify a TOC before requesting a real TOC // No TOC, no CD (or an empty one) dumpLog.WriteLine("Reading full TOC"); @@ -352,6 +397,7 @@ namespace DiscImageChef.Core.Devices.Dumping byte[] senseBuf; byte[] tmpBuf; MmcSubchannel supportedSubchannel = MmcSubchannel.Raw; + TrackSubchannelType subType = TrackSubchannelType.None; // Track subchannel type int sessions = 1; int firstTrackLastSession = 0; @@ -465,52 +511,6 @@ namespace DiscImageChef.Core.Devices.Dumping if(MMC.IsVideoNowColor(videoNowColorFrame)) dskType = MediaType.VideoNowColor; - // Check if output format supports subchannels - if(!outputPlugin.SupportedSectorTags.Contains(SectorTagType.CdSectorSubchannel) && - supportedSubchannel != MmcSubchannel.None) - { - if(!force) - { - dumpLog.WriteLine("Output format does not support subchannels, continuing..."); - UpdateStatus?.Invoke("Output format does not support subchannels, continuing..."); - } - else - { - dumpLog.WriteLine("Output format does not support subchannels, not continuing..."); - StoppingErrorMessage?.Invoke("Output format does not support subchannels, not continuing..."); - - return; - } - - supportedSubchannel = MmcSubchannel.None; - subSize = 0; - } - - TrackSubchannelType subType; - - switch(supportedSubchannel) - { - case MmcSubchannel.None: - subType = TrackSubchannelType.None; - - break; - case MmcSubchannel.Raw: - subType = TrackSubchannelType.Raw; - - break; - case MmcSubchannel.Q16: - subType = TrackSubchannelType.Q16; - - break; - default: - dumpLog.WriteLine("Handling subchannel type {0} not supported, exiting...", supportedSubchannel); - - StoppingErrorMessage?. - Invoke($"Handling subchannel type {supportedSubchannel} not supported, exiting..."); - - return; - } - uint blockSize = SECTOR_SIZE + subSize; UpdateStatus?.Invoke("Building track map...");