From 32c8d6a2d991fed0fb7fd1885a995d4345259555 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 7 Mar 2020 20:05:17 +0000 Subject: [PATCH] Fix dumping track type change border in Plextor drives. --- Aaru.Core/Devices/Dumping/CompactDisc/Data.cs | 58 +++++++++---------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs index a395911e4..99614ba15 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs @@ -304,7 +304,32 @@ namespace Aaru.Core.Devices.Dumping UpdateProgress?.Invoke($"Reading sector {i} of {blocks} ({currentSpeed:F3} MiB/sec.)", (long)i + r, (long)blocks); - if(readcd) + if(_supportsPlextorD8) + { + int adjustment = 0; + + if(offsetBytes < 0) + adjustment = -sectorsForOffset; + + sense = ReadPlextorWithSubchannel(out cmdBuf, out senseBuf, + (uint)(firstSectorToRead + r + adjustment), blockSize, + (uint)sectorsForOffset + 1, + supportedPlextorSubchannel, out cmdDuration); + + totalDuration += cmdDuration; + + if(!sense) + { + uint sectorsForFix = (uint)(1 + sectorsForOffset); + + FixOffsetData(offsetBytes, sectorSize, sectorsForOffset, supportedSubchannel, + ref sectorsForFix, subSize, ref cmdBuf, blockSize, false); + + // TODO: Implement sector validity + cmdBuf = Sector.Scramble(cmdBuf); + } + } + else if(readcd) { sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)(i + r), blockSize, 1, MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, @@ -312,37 +337,6 @@ namespace Aaru.Core.Devices.Dumping out cmdDuration); totalDuration += cmdDuration; - - // Some drives just happily return the next audio sector instead of the last data sector, so we need to manually check for correctness - // TODO: Check the same when trimming and reading back - if(!sense) - sense = CdChecksums.CheckCdSector(cmdBuf) != true; - - if(_supportsPlextorD8 && sense) - { - int adjustment = 0; - - if(offsetBytes < 0) - adjustment = -sectorsForOffset; - - sense = ReadPlextorWithSubchannel(out cmdBuf, out senseBuf, - (uint)(firstSectorToRead + r + adjustment), blockSize, - (uint)sectorsForOffset + 1, - supportedPlextorSubchannel, out cmdDuration); - - totalDuration += cmdDuration; - - if(!sense) - { - uint sectorsForFix = (uint)(1 + sectorsForOffset); - - FixOffsetData(offsetBytes, sectorSize, sectorsForOffset, supportedSubchannel, - ref sectorsForFix, subSize, ref cmdBuf, blockSize, false); - - // TODO: Implement sector validity - cmdBuf = Sector.Scramble(cmdBuf); - } - } } else if(read16) {