From 83bb2b5b1e903cb944a0d8dd7cdc6aa76df06191 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sun, 4 Feb 2018 18:51:04 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9BFix=20dumping=20CD=20when=20RAW=20T?= =?UTF-8?q?OC=20says=20there=20are=20no=20tracks,=20but=20processed=20TOC?= =?UTF-8?q?=20says=20there=20are.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Devices/Dumping/CompactDisc.cs | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs b/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs index 9d6ec5f2..92be1351 100644 --- a/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs +++ b/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs @@ -119,7 +119,7 @@ namespace DiscImageChef.Core.Devices.Dumping // 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"); - bool tocSense = dev.ReadRawToc(out byte[] cmdBuf, out byte[] senseBuf, 1, dev.Timeout, out _); + bool tocSense = dev.ReadRawToc(out byte[] cmdBuf, out byte[] senseBuf, 0, dev.Timeout, out _); if(!tocSense) { toc = FullTOC.Decode(cmdBuf); @@ -392,6 +392,43 @@ namespace DiscImageChef.Core.Devices.Dumping lastSector = phour * 3600 * 75 + pmin * 60 * 75 + psec * 75 + pframe - 150; } + if(trackList.Count == 0) + { + DicConsole.WriteLine("TOC with no tracks found, trying old method..."); + dumpLog.WriteLine("TOC with no tracks found, trying old method..."); + dumpLog.WriteLine("Reading old TOC"); + tocSense = dev.ReadToc(out cmdBuf, out senseBuf, false, 0, dev.Timeout, out _); + + TOC.CDTOC? oldToc = Decoders.CD.TOC.Decode(cmdBuf); + if(tocSense ||!oldToc.HasValue) + { + DicConsole.WriteLine("Could not read TOC, cannot continue..."); + dumpLog.WriteLine("Could not read TOC, cannot continue..."); + return; + } + + lastSector = 0; + + foreach(TOC.CDTOCTrackDataDescriptor trk in oldToc.Value.TrackDescriptors.OrderBy(t=>t.TrackNumber).Where(trk => trk.ADR == 1 || trk.ADR == 4)) + if(trk.TrackNumber >= 0x01 && trk.TrackNumber <= 0x63) + trackList.Add(new Track + { + TrackSequence = trk.TrackNumber, + TrackSession = 1, + TrackType = + (TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrack || + (TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrackIncremental + ? TrackType.Data + : TrackType.Audio, + TrackStartSector = trk.TrackStartAddress, + TrackBytesPerSector = (int)SECTOR_SIZE, + TrackRawBytesPerSector = (int)SECTOR_SIZE, + TrackSubchannelType = subType + }); + else if(trk.TrackNumber == 0xAA) + lastSector = trk.TrackStartAddress - 1; + } + Track[] tracks = trackList.ToArray(); for(int t = 1; t < tracks.Length; t++) tracks[t - 1].TrackEndSector = tracks[t].TrackStartSector - 1;