From c399291c255f45abd5bacdb5b53c637e53708df7 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Tue, 3 Mar 2020 03:03:34 +0000 Subject: [PATCH] Skip over a few sectors on audio sector read error in Plextor drives as sometimes it's a firmware bug with their cache. --- Aaru.Core/Devices/Dumping/CompactDisc/Data.cs | 13 ++++++++++++- Aaru.Core/Devices/Dumping/CompactDisc/Error.cs | 14 ++++++++++++-- Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs | 12 +++++++++++- 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs index bc231c2c7..42069a12c 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs @@ -228,7 +228,18 @@ namespace Aaru.Core.Devices.Dumping if(_supportsPlextorD8 && !inData) { sense = _dev.PlextorReadCdDa(out cmdBuf, out senseBuf, firstSectorToRead, blockSize, blocksToRead, - supportedPlextorSubchannel, _dev.Timeout, out cmdDuration); + supportedPlextorSubchannel, 0, out cmdDuration); + + if(sense) + { + // As a workaround for some firmware bugs, seek far away. + _dev.PlextorReadCdDa(out _, out senseBuf, firstSectorToRead - 32, blockSize, blocksToRead, + supportedPlextorSubchannel, 0, out _); + + sense = _dev.PlextorReadCdDa(out cmdBuf, out senseBuf, firstSectorToRead, blockSize, + blocksToRead, supportedPlextorSubchannel, _dev.Timeout, + out cmdDuration); + } totalDuration += cmdDuration; } diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs index 9876e19c5..b6dc1560d 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs @@ -223,8 +223,18 @@ namespace Aaru.Core.Devices.Dumping if(_supportsPlextorD8 && audioExtents.Contains(badSector)) { sense = _dev.PlextorReadCdDa(out cmdBuf, out senseBuf, badSectorToReRead, blockSize, - sectorsToReRead, supportedPlextorSubchannel, _dev.Timeout, - out cmdDuration); + sectorsToReRead, supportedPlextorSubchannel, 0, out cmdDuration); + + if(sense) + { + // As a workaround for some firmware bugs, seek far away. + _dev.PlextorReadCdDa(out _, out _, badSectorToReRead - 32, blockSize, sectorsToReRead, + supportedPlextorSubchannel, 0, out _); + + sense = _dev.PlextorReadCdDa(out cmdBuf, out senseBuf, badSectorToReRead, blockSize, + sectorsToReRead, supportedPlextorSubchannel, _dev.Timeout, + out cmdDuration); + } totalDuration += cmdDuration; } diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs index 4a675911b..52bdf715b 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs @@ -126,7 +126,17 @@ namespace Aaru.Core.Devices.Dumping if(_supportsPlextorD8 && audioExtents.Contains(badSector)) { sense = _dev.PlextorReadCdDa(out cmdBuf, out _, badSectorToRead, blockSize, sectorsToTrim, - supportedPlextorSubchannel, _dev.Timeout, out cmdDuration); + supportedPlextorSubchannel, 0, out cmdDuration); + + if(sense) + { + // As a workaround for some firmware bugs, seek far away. + _dev.PlextorReadCdDa(out _, out _, badSectorToRead - 32, blockSize, sectorsToTrim, + supportedPlextorSubchannel, 0, out _); + + sense = _dev.PlextorReadCdDa(out cmdBuf, out _, badSectorToRead, blockSize, sectorsToTrim, + supportedPlextorSubchannel, _dev.Timeout, out cmdDuration); + } totalDuration += cmdDuration; }