diff --git a/DiscImageChef.Core/Devices/Dumping/CompactDisc/Dump.cs b/DiscImageChef.Core/Devices/Dumping/CompactDisc/Dump.cs index cd509e620..c1c242562 100644 --- a/DiscImageChef.Core/Devices/Dumping/CompactDisc/Dump.cs +++ b/DiscImageChef.Core/Devices/Dumping/CompactDisc/Dump.cs @@ -344,7 +344,16 @@ namespace DiscImageChef.Core.Devices.Dumping if(tracks is null) return; - SolveTrackPregaps(_dev, _dumpLog, UpdateStatus, tracks, supportsPqSubchannel, supportsRwSubchannel, _dbDev); + SolveTrackPregaps(_dev, _dumpLog, UpdateStatus, tracks, supportsPqSubchannel, supportsRwSubchannel, _dbDev, + out bool inexactPositioning); + + if(inexactPositioning) + { + _dumpLog.WriteLine("WARNING: The drive has returned incorrect Q positioning when calculating pregaps. A best effort has been tried but they may be incorrect."); + + UpdateStatus?. + Invoke("WARNING: The drive has returned incorrect Q positioning when calculating pregaps. A best effort has been tried but they may be incorrect."); + } for(int t = 1; t < tracks.Length; t++) tracks[t - 1].TrackEndSector = tracks[t].TrackStartSector - 1; diff --git a/DiscImageChef.Core/Devices/Dumping/CompactDisc/Pregap.cs b/DiscImageChef.Core/Devices/Dumping/CompactDisc/Pregap.cs index 26adcd743..1380e1fce 100644 --- a/DiscImageChef.Core/Devices/Dumping/CompactDisc/Pregap.cs +++ b/DiscImageChef.Core/Devices/Dumping/CompactDisc/Pregap.cs @@ -123,16 +123,16 @@ namespace DiscImageChef.Core.Devices.Dumping public static void SolveTrackPregaps(Device dev, DumpLog dumpLog, UpdateStatusHandler updateStatus, Track[] tracks, bool supportsPqSubchannel, bool supportsRwSubchannel, - Database.Models.Device dbDev) + Database.Models.Device dbDev, out bool inexactPositioning) { - bool sense; // Sense indicator - byte[] cmdBuf; // Data buffer + bool sense; // Sense indicator byte[] subBuf; int posQ; uint retries; bool? bcd = null; byte[] crc; Dictionary pregaps = new Dictionary(); + inexactPositioning = false; if(!supportsPqSubchannel && !supportsRwSubchannel) @@ -296,6 +296,14 @@ namespace DiscImageChef.Core.Devices.Dumping // Pregap according to Q position int pregapQ = (subBuf[3] * 60 * 75) + (subBuf[4] * 75) + subBuf[5] + 1; + posQ = ((subBuf[7] * 60 * 75) + (subBuf[8] * 75) + subBuf[9]) - 150; + int diff = posQ - lba; + + if(diff != 0) + { + inexactPositioning = true; + pregapQ += diff; + } // Bigger than known change, otherwise we found it if(pregapQ > pregaps[track.TrackSequence]) diff --git a/DiscImageChef/Commands/Media/Info.cs b/DiscImageChef/Commands/Media/Info.cs index 09e567831..15459bd88 100644 --- a/DiscImageChef/Commands/Media/Info.cs +++ b/DiscImageChef/Commands/Media/Info.cs @@ -559,7 +559,8 @@ namespace DiscImageChef.Commands.Media ctx.Devices.FirstOrDefault(d => d.Manufacturer == dev.Manufacturer && d.Model == dev.Model && d.Revision == dev.Revision); - Dump.SolveTrackPregaps(dev, null, null, tracks, supportsPqSubchannel, supportsRwSubchannel, dbDev); + Dump.SolveTrackPregaps(dev, null, null, tracks, supportsPqSubchannel, supportsRwSubchannel, dbDev, + out bool inexactPositioning); for(int t = 1; t < tracks.Length; t++) tracks[t - 1].TrackEndSector = tracks[t].TrackStartSector - 1; @@ -569,6 +570,10 @@ namespace DiscImageChef.Commands.Media DicConsole.WriteLine(); DicConsole.WriteLine("Track calculations:"); + if(inexactPositioning) + DicConsole. + WriteLine("WARNING: The drive has returned incorrect Q positioning when calculating pregaps. A best effort has been tried but they may be incorrect."); + foreach(Track track in tracks) DicConsole. WriteLine("Track {0} starts at LBA {1}, ends at LBA {2}, has a pregap of {3} sectors and is of type {4}",