diff --git a/.idea/.idea.Aaru/.idea/contentModel.xml b/.idea/.idea.Aaru/.idea/contentModel.xml
index b5bf4e607..712090b5f 100644
--- a/.idea/.idea.Aaru/.idea/contentModel.xml
+++ b/.idea/.idea.Aaru/.idea/contentModel.xml
@@ -268,6 +268,7 @@
+
diff --git a/Aaru.Core/Aaru.Core.csproj b/Aaru.Core/Aaru.Core.csproj
index be52a8561..705984182 100644
--- a/Aaru.Core/Aaru.Core.csproj
+++ b/Aaru.Core/Aaru.Core.csproj
@@ -52,6 +52,7 @@
+
diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs
index f1163d6d5..a395911e4 100644
--- a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs
+++ b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs
@@ -258,19 +258,8 @@ namespace Aaru.Core.Devices.Dumping
if(_supportsPlextorD8 && !inData)
{
- sense = _dev.PlextorReadCdDa(out cmdBuf, out senseBuf, firstSectorToRead, blockSize, blocksToRead,
- 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);
- }
+ sense = ReadPlextorWithSubchannel(out cmdBuf, out senseBuf, firstSectorToRead, blockSize,
+ blocksToRead, supportedPlextorSubchannel, out cmdDuration);
totalDuration += cmdDuration;
}
@@ -336,22 +325,10 @@ namespace Aaru.Core.Devices.Dumping
if(offsetBytes < 0)
adjustment = -sectorsForOffset;
- sense = _dev.PlextorReadCdDa(out cmdBuf, out senseBuf,
- (uint)(firstSectorToRead + r + adjustment), blockSize,
- (uint)sectorsForOffset + 1, 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,
- (uint)(firstSectorToRead + r + adjustment), blockSize,
- (uint)sectorsForOffset + 1, supportedPlextorSubchannel,
- _dev.Timeout, out cmdDuration);
- }
+ sense = ReadPlextorWithSubchannel(out cmdBuf, out senseBuf,
+ (uint)(firstSectorToRead + r + adjustment), blockSize,
+ (uint)sectorsForOffset + 1,
+ supportedPlextorSubchannel, out cmdDuration);
totalDuration += cmdDuration;
diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs
index a7e3d7f76..060aaffd0 100644
--- a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs
+++ b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs
@@ -222,19 +222,8 @@ namespace Aaru.Core.Devices.Dumping
if(_supportsPlextorD8 && audioExtents.Contains(badSector))
{
- sense = _dev.PlextorReadCdDa(out cmdBuf, out senseBuf, badSectorToReRead, blockSize,
- 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);
- }
+ sense = ReadPlextorWithSubchannel(out cmdBuf, out senseBuf, badSectorToReRead, blockSize,
+ sectorsToReRead, supportedPlextorSubchannel, out cmdDuration);
totalDuration += cmdDuration;
}
diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Plextor.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Plextor.cs
new file mode 100644
index 000000000..3a81d2249
--- /dev/null
+++ b/Aaru.Core/Devices/Dumping/CompactDisc/Plextor.cs
@@ -0,0 +1,86 @@
+using System;
+using Aaru.Devices;
+
+namespace Aaru.Core.Devices.Dumping
+{
+ partial class Dump
+ {
+ bool ReadPlextorWithSubchannel(out byte[] cmdBuf, out byte[] senseBuf, uint firstSectorToRead, uint blockSize,
+ uint blocksToRead, PlextorSubchannel supportedPlextorSubchannel,
+ out double cmdDuration)
+ {
+ bool sense;
+ cmdBuf = null;
+
+ if(supportedPlextorSubchannel == PlextorSubchannel.None)
+ {
+ sense = _dev.PlextorReadCdDa(out cmdBuf, out senseBuf, firstSectorToRead, blockSize, blocksToRead,
+ supportedPlextorSubchannel, 0, out cmdDuration);
+
+ if(!sense)
+ return false;
+
+ // 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);
+
+ return sense;
+ }
+
+ byte[] subBuf;
+
+ uint subSize = supportedPlextorSubchannel == PlextorSubchannel.Q16 ? 16u : 96u;
+
+ sense = _dev.PlextorReadCdDa(out byte[] dataBuf, out senseBuf, firstSectorToRead, 2352, blocksToRead,
+ PlextorSubchannel.None, 0, out cmdDuration);
+
+ if(!sense)
+ {
+ sense = _dev.PlextorReadCdDa(out subBuf, out senseBuf, firstSectorToRead, subSize, blocksToRead,
+ supportedPlextorSubchannel, 0, out cmdDuration);
+
+ if(!sense)
+ {
+ cmdBuf = new byte[(2352 * blocksToRead) + (subSize * blocksToRead)];
+
+ for(int b = 0; b < blocksToRead; b++)
+ {
+ Array.Copy(dataBuf, 2352 * b, cmdBuf, (2352 + subSize) * b, 2352);
+ Array.Copy(subBuf, subSize * b, cmdBuf, ((2352 + subSize) * b) + 2352, subSize);
+ }
+
+ return false;
+ }
+ }
+
+ // 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 dataBuf, out senseBuf, firstSectorToRead, 2352, blocksToRead,
+ PlextorSubchannel.None, 0, out cmdDuration);
+
+ if(sense)
+ return true;
+
+ sense = _dev.PlextorReadCdDa(out subBuf, out senseBuf, firstSectorToRead, subSize, blocksToRead,
+ supportedPlextorSubchannel, 0, out cmdDuration);
+
+ if(sense)
+ return true;
+
+ cmdBuf = new byte[(2352 * blocksToRead) + (subSize * blocksToRead)];
+
+ for(int b = 0; b < blocksToRead; b++)
+ {
+ Array.Copy(dataBuf, 2352 * b, cmdBuf, (2352 + subSize) * b, 2352);
+ Array.Copy(subBuf, subSize * b, cmdBuf, ((2352 + subSize) * b) + 2352, subSize);
+ }
+
+ return false;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Pregap.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Pregap.cs
index 6d8e02673..c12332355 100644
--- a/Aaru.Core/Devices/Dumping/CompactDisc/Pregap.cs
+++ b/Aaru.Core/Devices/Dumping/CompactDisc/Pregap.cs
@@ -491,9 +491,9 @@ namespace Aaru.Core.Devices.Dumping
previousPregapIsPreviousTrack = false;
// Pregap according to Q position
- posQ = ((subBuf[7] * 60 * 75) + (subBuf[8] * 75) + subBuf[9]) - 150;
- int diff = posQ - lba;
- int pregapQ = (int)track.TrackStartSector - lba;
+ posQ = ((subBuf[7] * 60 * 75) + (subBuf[8] * 75) + subBuf[9]) - 150;
+ int diff = posQ - lba;
+ int pregapQ = (int)track.TrackStartSector - lba;
if(diff != 0)
{
@@ -593,16 +593,12 @@ namespace Aaru.Core.Devices.Dumping
else if(dbDev?.ATAPI?.RemovableMedias?.Any(d => d.SupportsPlextorReadCDDA == true) == true ||
dbDev?.SCSI?.RemovableMedias?.Any(d => d.SupportsPlextorReadCDDA == true) == true ||
dev.Manufacturer.ToLowerInvariant() == "plextor")
- sense = dev.PlextorReadCdDa(out cmdBuf, out _, lba, 2448, 1, PlextorSubchannel.All, dev.Timeout,
+ sense = dev.PlextorReadCdDa(out cmdBuf, out _, lba, 96, 1, PlextorSubchannel.All, dev.Timeout,
out _);
{
if(!sense)
- {
- byte[] tmpBuf = new byte[96];
- Array.Copy(cmdBuf, 0, tmpBuf, 0, 96);
- subBuf = DeinterleaveQ(tmpBuf);
- }
+ subBuf = DeinterleaveQ(cmdBuf);
}
}
diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs
index 7b00a7f14..38b188911 100644
--- a/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs
+++ b/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs
@@ -125,18 +125,8 @@ namespace Aaru.Core.Devices.Dumping
if(_supportsPlextorD8 && audioExtents.Contains(badSector))
{
- sense = _dev.PlextorReadCdDa(out cmdBuf, out _, badSectorToRead, blockSize, sectorsToTrim,
- 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);
- }
+ sense = ReadPlextorWithSubchannel(out cmdBuf, out _, badSectorToRead, blockSize, sectorsToTrim,
+ supportedPlextorSubchannel, out cmdDuration);
totalDuration += cmdDuration;
}