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)
{