From f423d99b08ec1e5f4ed68a353fadf0a5de20c403 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Mon, 2 Mar 2020 23:58:20 +0000 Subject: [PATCH] On drives that support D8h use it to read Audio CD sectors as some fail due to a firmware bug. --- Aaru.Core/Devices/Dumping/CompactDisc/Data.cs | 34 ++++++++++++- Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs | 2 +- .../Devices/Dumping/CompactDisc/Error.cs | 47 +++++++++++++++--- Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs | 48 +++++++++++++++---- Aaru.Core/Devices/Dumping/Dump.cs | 1 + Aaru.Core/Media/Info/CompactDisc.cs | 10 ++-- Aaru/Commands/Media/Info.cs | 2 +- 7 files changed, 123 insertions(+), 21 deletions(-) diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs index 88543eef8..bc231c2c7 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs @@ -94,6 +94,31 @@ namespace Aaru.Core.Devices.Dumping const uint sectorSize = 2352; // Full sector size byte[] tmpBuf; // Temporary buffer newTrim = false; + PlextorSubchannel supportedPlextorSubchannel; + + switch(supportedSubchannel) + { + case MmcSubchannel.None: + supportedPlextorSubchannel = PlextorSubchannel.None; + + break; + case MmcSubchannel.Raw: + supportedPlextorSubchannel = PlextorSubchannel.All; + + break; + case MmcSubchannel.Q16: + supportedPlextorSubchannel = PlextorSubchannel.Q16; + + break; + case MmcSubchannel.Rw: + supportedPlextorSubchannel = PlextorSubchannel.Pack; + + break; + default: + supportedPlextorSubchannel = PlextorSubchannel.None; + + break; + } InitProgress?.Invoke(); @@ -200,7 +225,14 @@ namespace Aaru.Core.Devices.Dumping UpdateProgress?.Invoke($"Reading sector {i} of {blocks} ({currentSpeed:F3} MiB/sec.)", (long)i, (long)blocks); - if(readcd) + if(_supportsPlextorD8 && !inData) + { + sense = _dev.PlextorReadCdDa(out cmdBuf, out senseBuf, firstSectorToRead, blockSize, blocksToRead, + supportedPlextorSubchannel, _dev.Timeout, out cmdDuration); + + totalDuration += cmdDuration; + } + else if(readcd) { sense = _dev.ReadCd(out cmdBuf, out senseBuf, firstSectorToRead, blockSize, blocksToRead, MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs index 90b374cff..714983fd2 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs @@ -860,7 +860,7 @@ namespace Aaru.Core.Devices.Dumping cdOffset = _ctx.CdOffsets.FirstOrDefault(d => d.Manufacturer == _dev.Manufacturer && d.Model == _dev.Model); Media.Info.CompactDisc.GetOffset(cdOffset, _dbDev, _debug, _dev, dskType, _dumpLog, tracks, UpdateStatus, - out int? driveOffset, out int? combinedOffset); + out int? driveOffset, out int? combinedOffset, out _supportsPlextorD8); if(combinedOffset is null) { diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs index 295bbbc5a..9876e19c5 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs @@ -52,12 +52,37 @@ namespace Aaru.Core.Devices.Dumping ExtentsULong extents, int offsetBytes, bool readcd, int sectorsForOffset, uint subSize, MmcSubchannel supportedSubchannel, ref double totalDuration) { - bool sense = true; // Sense indicator - byte[] cmdBuf = null; // Data buffer - double cmdDuration; // Command execution time - const uint sectorSize = 2352; // Full sector size - byte[] tmpBuf; // Temporary buffer - byte[] senseBuf = null; // Sense buffer + bool sense = true; // Sense indicator + byte[] cmdBuf = null; // Data buffer + double cmdDuration; // Command execution time + const uint sectorSize = 2352; // Full sector size + byte[] tmpBuf; // Temporary buffer + byte[] senseBuf = null; // Sense buffer + PlextorSubchannel supportedPlextorSubchannel; + + switch(supportedSubchannel) + { + case MmcSubchannel.None: + supportedPlextorSubchannel = PlextorSubchannel.None; + + break; + case MmcSubchannel.Raw: + supportedPlextorSubchannel = PlextorSubchannel.All; + + break; + case MmcSubchannel.Q16: + supportedPlextorSubchannel = PlextorSubchannel.Q16; + + break; + case MmcSubchannel.Rw: + supportedPlextorSubchannel = PlextorSubchannel.Pack; + + break; + default: + supportedPlextorSubchannel = PlextorSubchannel.None; + + break; + } if(_resume.BadBlocks.Count <= 0 || _aborted || @@ -195,7 +220,15 @@ namespace Aaru.Core.Devices.Dumping sectorsToReRead = (byte)(sectorsForOffset + 1); } - if(readcd) + if(_supportsPlextorD8 && audioExtents.Contains(badSector)) + { + sense = _dev.PlextorReadCdDa(out cmdBuf, out senseBuf, badSectorToReRead, blockSize, + sectorsToReRead, supportedPlextorSubchannel, _dev.Timeout, + out cmdDuration); + + totalDuration += cmdDuration; + } + else if(readcd) { sense = _dev.ReadCd(out cmdBuf, out senseBuf, badSectorToReRead, blockSize, sectorsToReRead, MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs index 39024afa6..4a675911b 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs @@ -49,13 +49,38 @@ namespace Aaru.Core.Devices.Dumping bool read16, bool readcd, int sectorsForOffset, uint subSize, MmcSubchannel supportedSubchannel, bool supportsLongSectors, ref double totalDuration) { - DateTime start; - DateTime end; - bool sense = true; // Sense indicator - byte[] cmdBuf = null; // Data buffer - double cmdDuration = 0; // Command execution time - const uint sectorSize = 2352; // Full sector size - byte[] tmpBuf; // Temporary buffer + DateTime start; + DateTime end; + bool sense = true; // Sense indicator + byte[] cmdBuf = null; // Data buffer + double cmdDuration = 0; // Command execution time + const uint sectorSize = 2352; // Full sector size + byte[] tmpBuf; // Temporary buffer + PlextorSubchannel supportedPlextorSubchannel; + + switch(supportedSubchannel) + { + case MmcSubchannel.None: + supportedPlextorSubchannel = PlextorSubchannel.None; + + break; + case MmcSubchannel.Raw: + supportedPlextorSubchannel = PlextorSubchannel.All; + + break; + case MmcSubchannel.Q16: + supportedPlextorSubchannel = PlextorSubchannel.Q16; + + break; + case MmcSubchannel.Rw: + supportedPlextorSubchannel = PlextorSubchannel.Pack; + + break; + default: + supportedPlextorSubchannel = PlextorSubchannel.None; + + break; + } if(_resume.BadBlocks.Count <= 0 || _aborted || @@ -98,7 +123,14 @@ namespace Aaru.Core.Devices.Dumping sectorsToTrim = (byte)(sectorsForOffset + 1); } - if(readcd) + if(_supportsPlextorD8 && audioExtents.Contains(badSector)) + { + sense = _dev.PlextorReadCdDa(out cmdBuf, out _, badSectorToRead, blockSize, sectorsToTrim, + supportedPlextorSubchannel, _dev.Timeout, out cmdDuration); + + totalDuration += cmdDuration; + } + else if(readcd) sense = _dev.ReadCd(out cmdBuf, out _, badSectorToRead, blockSize, sectorsToTrim, MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration); diff --git a/Aaru.Core/Devices/Dumping/Dump.cs b/Aaru.Core/Devices/Dumping/Dump.cs index e1352c6ac..01b6812f2 100644 --- a/Aaru.Core/Devices/Dumping/Dump.cs +++ b/Aaru.Core/Devices/Dumping/Dump.cs @@ -52,6 +52,7 @@ namespace Aaru.Core.Devices.Dumping uint _skip; int _speed; int _speedMultiplier; + bool _supportsPlextorD8; /// Initializes dumpers /// Should resume? diff --git a/Aaru.Core/Media/Info/CompactDisc.cs b/Aaru.Core/Media/Info/CompactDisc.cs index 46ab4d979..02c20665c 100644 --- a/Aaru.Core/Media/Info/CompactDisc.cs +++ b/Aaru.Core/Media/Info/CompactDisc.cs @@ -30,7 +30,8 @@ namespace Aaru.Core.Media.Info [SuppressMessage("ReSharper", "TooWideLocalVariableScope")] public static void GetOffset(CdOffset cdOffset, Device dbDev, bool debug, Aaru.Devices.Device dev, MediaType dskType, DumpLog dumpLog, Track[] tracks, - UpdateStatusHandler updateStatus, out int? driveOffset, out int? combinedOffset) + UpdateStatusHandler updateStatus, out int? driveOffset, out int? combinedOffset, + out bool supportsPlextorReadCdDa) { byte[] cmdBuf; bool sense; @@ -45,8 +46,9 @@ namespace Aaru.Core.Media.Info Track audioTrack = default; bool offsetFound = false; const uint sectorSize = 2352; - driveOffset = cdOffset?.Offset * 4; - combinedOffset = null; + driveOffset = cdOffset?.Offset * 4; + combinedOffset = null; + supportsPlextorReadCdDa = false; if(dskType != MediaType.VideoNowColor) { @@ -78,6 +80,8 @@ namespace Aaru.Core.Media.Info if(!sense && !dev.Error) { + supportsPlextorReadCdDa = true; + for(int i = 0; i < cmdBuf.Length - sectorSync.Length; i++) { Array.Copy(cmdBuf, i, tmpBuf, 0, sectorSync.Length); diff --git a/Aaru/Commands/Media/Info.cs b/Aaru/Commands/Media/Info.cs index 546ef33dd..516f25eca 100644 --- a/Aaru/Commands/Media/Info.cs +++ b/Aaru/Commands/Media/Info.cs @@ -593,7 +593,7 @@ namespace Aaru.Commands.Media d.Model == dev.Model); CompactDisc.GetOffset(cdOffset, dbDev, debug, dev, scsiInfo.MediaType, null, tracks, null, - out int? driveOffset, out int? combinedOffset); + out int? driveOffset, out int? combinedOffset, out _); if(combinedOffset is null) {