diff --git a/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs b/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs index 644f119a3..d58859d19 100644 --- a/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs +++ b/DiscImageChef.Core/Devices/Dumping/CompactDisc.cs @@ -67,6 +67,7 @@ namespace DiscImageChef.Core.Devices.Dumping /// Implement dumping Compact Discs // TODO: Barcode and pregaps + // TODO: Repetitive code partial class Dump { /// Dumps a compact disc @@ -1321,7 +1322,6 @@ namespace DiscImageChef.Core.Devices.Dumping // Check offset if(_fixOffset) { - // TODO: HL-DT-ST raw reading // TODO: VideoNow if(tracks.All(t => t.TrackType != TrackType.Audio)) @@ -1403,6 +1403,34 @@ namespace DiscImageChef.Core.Devices.Dumping } } } + + if(_debug || + dbDev?.ATAPI?.RemovableMedias?.Any(d => d.CanReadCdScrambled == true) == true || + dbDev?.SCSI?.RemovableMedias?.Any(d => d.CanReadCdScrambled == true) == true || + _dev.Manufacturer.ToLowerInvariant() == "hl-dt-st") + { + sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)(dataTrack.TrackEndSector - 2), + sectorSize, 3, MmcSectorTypes.Cdda, false, false, false, + MmcHeaderCodes.None, true, false, MmcErrorField.None, + MmcSubchannel.None, _dev.Timeout, out _); + + if(!sense && + !_dev.Error) + { + for(int i = 0; i < cmdBuf.Length - sectorSync.Length; i++) + { + Array.Copy(cmdBuf, i, tmpBuf, 0, sectorSync.Length); + + if(!tmpBuf.SequenceEqual(sectorSync)) + continue; + + offsetBytes = i - 2352; + offsetFound = true; + + break; + } + } + } } } diff --git a/DiscImageChef.Core/Devices/Dumping/Dump.cs b/DiscImageChef.Core/Devices/Dumping/Dump.cs index 4a0d3f3bb..9808f3640 100644 --- a/DiscImageChef.Core/Devices/Dumping/Dump.cs +++ b/DiscImageChef.Core/Devices/Dumping/Dump.cs @@ -32,6 +32,7 @@ namespace DiscImageChef.Core.Devices.Dumping readonly ushort _retryPasses; readonly bool _stopOnError; bool _aborted; + readonly bool _debug; bool _dumpFirstTrackPregap; bool _fixOffset; Resume _resume; @@ -63,7 +64,7 @@ namespace DiscImageChef.Core.Devices.Dumping bool force, bool dumpRaw, bool persistent, bool stopOnError, Resume resume, DumpLog dumpLog, Encoding encoding, string outputPrefix, string outputPath, Dictionary formatOptions, CICMMetadataType preSidecar, uint skip, bool nometadata, bool notrim, bool dumpFirstTrackPregap, - bool fixOffset) + bool fixOffset, bool debug) { _doResume = doResume; _dev = dev; @@ -87,6 +88,7 @@ namespace DiscImageChef.Core.Devices.Dumping _dumpFirstTrackPregap = dumpFirstTrackPregap; _aborted = false; _fixOffset = fixOffset; + _debug = debug; } /// Starts dumping with the stablished fields and autodetecting the device type diff --git a/DiscImageChef.Gui/Forms/frmDump.xeto.cs b/DiscImageChef.Gui/Forms/frmDump.xeto.cs index f8f70d080..2fd2ecd10 100644 --- a/DiscImageChef.Gui/Forms/frmDump.xeto.cs +++ b/DiscImageChef.Gui/Forms/frmDump.xeto.cs @@ -527,7 +527,7 @@ namespace DiscImageChef.Gui.Forms chkStopOnError.Checked == true, _resume, dumpLog, encoding, _outputPrefix, txtDestination.Text, parsedOptions, _sidecar, (uint)stpSkipped.Value, chkExistingMetadata.Checked == false, chkTrim.Checked == false, - chkTrack1Pregap.Checked == true, true); + chkTrack1Pregap.Checked == true, true, false); new Thread(DoWork).Start(); } diff --git a/DiscImageChef/Commands/DumpMedia.cs b/DiscImageChef/Commands/DumpMedia.cs index 8ffcb0cb1..77bf9ccf6 100644 --- a/DiscImageChef/Commands/DumpMedia.cs +++ b/DiscImageChef/Commands/DumpMedia.cs @@ -343,7 +343,8 @@ namespace DiscImageChef.Commands var dumper = new Dump(_doResume, dev, _devicePath, outputFormat, _retryPasses, _force, false, _persistent, _stopOnError, resume, dumpLog, encoding, outputPrefix, _outputFile, parsedOptions, - sidecar, (uint)_skip, _noMetadata, _noTrim, _firstTrackPregap, _fixOffset); + sidecar, (uint)_skip, _noMetadata, _noTrim, _firstTrackPregap, _fixOffset, + MainClass.Debug); dumper.UpdateStatus += Progress.UpdateStatus; dumper.ErrorMessage += Progress.ErrorMessage;