From 1af36c75bd7dacf056f05f2316e7a303be5508f1 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Tue, 3 Aug 2021 21:14:59 +0100 Subject: [PATCH] Try to reduce workaround some firmware bug in some audio CDs with hidden audio for #605. --- Aaru.Core/Devices/Dumping/CompactDisc/Data.cs | 49 ++++++++++++++- .../Devices/Dumping/CompactDisc/Error.cs | 58 ++++++++++++++++-- Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs | 59 ++++++++++++++++--- 3 files changed, 150 insertions(+), 16 deletions(-) diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs index 0c3d5fce1..bbd0c6690 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs @@ -281,9 +281,52 @@ namespace Aaru.Core.Devices.Dumping } else if(readcd) { - sense = _dev.ReadCd(out cmdBuf, out senseBuf, firstSectorToRead, blockSize, blocksToRead, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, - true, MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration); + if(inData) + { + sense = _dev.ReadCd(out cmdBuf, out senseBuf, firstSectorToRead, blockSize, blocksToRead, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, + true, true, MmcErrorField.None, supportedSubchannel, _dev.Timeout, + out cmdDuration); + + if(sense) + { + DecodedSense? decSense = Sense.Decode(senseBuf); + + // Try to workaround firmware + if(decSense?.ASC == 0x64) + { + sense = _dev.ReadCd(out cmdBuf, out _, firstSectorToRead, blockSize, blocksToRead, + MmcSectorTypes.Cdda, false, false, false, MmcHeaderCodes.None, true, + false, MmcErrorField.None, supportedSubchannel, _dev.Timeout, + out double cmdDuration2); + + cmdDuration += cmdDuration2; + } + } + } + else + { + sense = _dev.ReadCd(out cmdBuf, out senseBuf, firstSectorToRead, blockSize, blocksToRead, + MmcSectorTypes.Cdda, false, false, false, MmcHeaderCodes.None, true, false, + MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration); + + if(sense) + { + DecodedSense? decSense = Sense.Decode(senseBuf); + + // Try to workaround firmware + if((decSense?.ASC == 0x11 && decSense?.ASCQ == 0x05) || + decSense?.ASC == 0x64) + { + sense = _dev.ReadCd(out cmdBuf, out _, firstSectorToRead, blockSize, blocksToRead, + MmcSectorTypes.AllTypes, false, false, true, + MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, _dev.Timeout, out double cmdDuration2); + + cmdDuration += cmdDuration2; + } + } + } totalDuration += cmdDuration; } diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs index badb8c105..8caae3b06 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs @@ -43,6 +43,7 @@ using Aaru.Decoders.CD; using Aaru.Decoders.SCSI; using Aaru.Devices; using Schemas; +using TrackType = Aaru.CommonTypes.Enums.TrackType; // ReSharper disable JoinDeclarationAndInitializer // ReSharper disable InlineOutVariableDeclaration @@ -262,9 +263,53 @@ namespace Aaru.Core.Devices.Dumping } else if(readcd) { - sense = _dev.ReadCd(out cmdBuf, out senseBuf, badSectorToReRead, blockSize, sectorsToReRead, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, - true, MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration); + if(audioExtents.Contains(badSector)) + { + sense = _dev.ReadCd(out cmdBuf, out senseBuf, badSectorToReRead, blockSize, sectorsToReRead, + MmcSectorTypes.Cdda, false, false, false, MmcHeaderCodes.None, true, false, + MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration); + + if(sense) + { + DecodedSense? decSense = Sense.Decode(senseBuf); + + // Try to workaround firmware + if((decSense?.ASC == 0x11 && decSense?.ASCQ == 0x05) || + decSense?.ASC == 0x64) + { + sense = _dev.ReadCd(out cmdBuf, out _, badSectorToReRead, blockSize, sectorsToReRead, + MmcSectorTypes.AllTypes, false, false, true, + MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, _dev.Timeout, out double cmdDuration2); + + cmdDuration += cmdDuration2; + } + } + } + else + { + sense = _dev.ReadCd(out cmdBuf, out senseBuf, badSectorToReRead, blockSize, sectorsToReRead, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, + true, true, MmcErrorField.None, supportedSubchannel, _dev.Timeout, + out cmdDuration); + + if(sense) + { + DecodedSense? decSense = Sense.Decode(senseBuf); + + // Try to workaround firmware + if((decSense?.ASC == 0x11 && decSense?.ASCQ == 0x05) || + decSense?.ASC == 0x64) + { + sense = _dev.ReadCd(out cmdBuf, out _, badSectorToReRead, blockSize, sectorsToReRead, + MmcSectorTypes.Cdda, false, false, false, MmcHeaderCodes.None, true, + false, MmcErrorField.None, supportedSubchannel, _dev.Timeout, + out double cmdDuration2); + + cmdDuration += cmdDuration2; + } + } + } totalDuration += cmdDuration; } @@ -599,9 +644,10 @@ namespace Aaru.Core.Devices.Dumping } else if(readcd) { - sense = _dev.ReadCd(out cmdBuf, out senseBuf, startSector, subSize, 5, MmcSectorTypes.AllTypes, - false, false, false, MmcHeaderCodes.None, false, false, MmcErrorField.None, - supportedSubchannel, _dev.Timeout, out cmdDuration); + sense = _dev.ReadCd(out cmdBuf, out senseBuf, startSector, subSize, 5, + track.TrackType == TrackType.Audio ? MmcSectorTypes.Cdda + : MmcSectorTypes.AllTypes, false, false, false, MmcHeaderCodes.None, false, + false, MmcErrorField.None, supportedSubchannel, _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 ac3b55997..2596d3e0f 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs @@ -38,6 +38,7 @@ using Aaru.CommonTypes.Interfaces; using Aaru.CommonTypes.Structs; using Aaru.Core.Logging; using Aaru.Decoders.CD; +using Aaru.Decoders.SCSI; using Aaru.Devices; using Schemas; @@ -159,14 +160,58 @@ namespace Aaru.Core.Devices.Dumping if(_supportsPlextorD8 && audioExtents.Contains(badSector)) sense = ReadPlextorWithSubchannel(out cmdBuf, out senseBuf, badSectorToRead, blockSize, sectorsToTrim, supportedPlextorSubchannel, out cmdDuration); - else if(readcd && audioExtents.Contains(badSector)) - sense = _dev.ReadCd(out cmdBuf, out senseBuf, badSectorToRead, blockSize, sectorsToTrim, - MmcSectorTypes.Cdda, false, false, false, MmcHeaderCodes.None, true, false, - MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration); else if(readcd) - sense = _dev.ReadCd(out cmdBuf, out senseBuf, badSectorToRead, blockSize, sectorsToTrim, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, - true, MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration); + { + if(audioExtents.Contains(badSector)) + { + sense = _dev.ReadCd(out cmdBuf, out senseBuf, badSectorToRead, blockSize, sectorsToTrim, + MmcSectorTypes.Cdda, false, false, false, MmcHeaderCodes.None, true, false, + MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration); + + if(sense) + { + DecodedSense? decSense = Sense.Decode(senseBuf); + + // Try to workaround firmware + if((decSense?.ASC == 0x11 && decSense?.ASCQ == 0x05) || + decSense?.ASC == 0x64) + { + sense = _dev.ReadCd(out cmdBuf, out _, badSectorToRead, blockSize, sectorsToTrim, + MmcSectorTypes.AllTypes, false, false, true, + MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None, + supportedSubchannel, _dev.Timeout, out double cmdDuration2); + + cmdDuration += cmdDuration2; + } + } + } + else + { + sense = _dev.ReadCd(out cmdBuf, out senseBuf, badSectorToRead, blockSize, sectorsToTrim, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, + true, true, MmcErrorField.None, supportedSubchannel, _dev.Timeout, + out cmdDuration); + + if(sense) + { + DecodedSense? decSense = Sense.Decode(senseBuf); + + // Try to workaround firmware + if((decSense?.ASC == 0x11 && decSense?.ASCQ == 0x05) || + decSense?.ASC == 0x64) + { + sense = _dev.ReadCd(out cmdBuf, out _, badSectorToRead, blockSize, sectorsToTrim, + MmcSectorTypes.Cdda, false, false, false, MmcHeaderCodes.None, true, + false, MmcErrorField.None, supportedSubchannel, _dev.Timeout, + out double cmdDuration2); + + cmdDuration += cmdDuration2; + } + } + } + + totalDuration += cmdDuration; + } else if(read16) sense = _dev.Read16(out cmdBuf, out senseBuf, 0, false, true, false, badSectorToRead, blockSize, 0, sectorsToTrim, false, _dev.Timeout, out cmdDuration);