diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/CdiReady.cs b/Aaru.Core/Devices/Dumping/CompactDisc/CdiReady.cs
index db9e202f1..c3ca2916d 100644
--- a/Aaru.Core/Devices/Dumping/CompactDisc/CdiReady.cs
+++ b/Aaru.Core/Devices/Dumping/CompactDisc/CdiReady.cs
@@ -37,6 +37,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Aaru.Checksums;
using Aaru.CommonTypes.AaruMetadata;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Extents;
@@ -114,7 +115,6 @@ partial class Dump
}
// TODO: Set pregap for Track 1
- // TODO: Detect errors in sectors
/// Reads all the hidden track in CD-i Ready discs
/// Total number of positive sectors
/// Size of the read sector in bytes
@@ -297,6 +297,9 @@ partial class Dump
if(cdiReadyReadAsAudio) data = Sector.Scramble(data);
+ // Fix or leave as is because we're overcoming track mode change
+ CdChecksums.FixSector(data);
+
outputOptical.WriteSectorsLong(data,
i + r,
false,
@@ -388,6 +391,8 @@ partial class Dump
extents.Add(i, blocksToRead, true);
_writeStopwatch.Restart();
+ List paintBad = [];
+
if(supportedSubchannel != MmcSubchannel.None)
{
var data = new byte[sectorSize * blocksToRead];
@@ -400,10 +405,29 @@ partial class Dump
{
Array.Copy(cmdBuf, (int)(0 + b * blockSize), tmpData, 0, sectorSize);
tmpData = Sector.Scramble(tmpData);
+ SectorFixResult fixedStatus = CdChecksums.FixSector(tmpData);
+
+ if(fixedStatus == SectorFixResult.CouldNotFix) // Damaged
+ {
+ _resume.BadBlocks.Add(i + (ulong)b);
+ paintBad.Add(i + (ulong)b);
+ }
+
Array.Copy(tmpData, 0, data, sectorSize * b, sectorSize);
}
else
- Array.Copy(cmdBuf, (int)(0 + b * blockSize), data, sectorSize * b, sectorSize);
+ {
+ Array.Copy(cmdBuf, (int)(0 + b * blockSize), tmpData, 0, sectorSize);
+ SectorFixResult fixedStatus = CdChecksums.FixSector(tmpData);
+
+ if(fixedStatus == SectorFixResult.CouldNotFix) // Damaged
+ {
+ _resume.BadBlocks.Add(i + (ulong)b);
+ paintBad.Add(i + (ulong)b);
+ }
+
+ Array.Copy(tmpData, 0, data, sectorSize * b, sectorSize);
+ }
Array.Copy(cmdBuf, (int)(sectorSize + b * blockSize), sub, subSize * b, subSize);
}
@@ -453,33 +477,50 @@ partial class Dump
}
else
{
+ var tmpData = new byte[sectorSize];
+ var data = new byte[sectorSize * blocksToRead];
+ var status = new SectorStatus[blocksToRead];
+
if(cdiReadyReadAsAudio)
{
- var tmpData = new byte[sectorSize];
- var data = new byte[sectorSize * blocksToRead];
-
for(var b = 0; b < blocksToRead; b++)
{
+ status[b] = SectorStatus.Dumped;
Array.Copy(cmdBuf, (int)(b * sectorSize), tmpData, 0, sectorSize);
tmpData = Sector.Scramble(tmpData);
+ SectorFixResult fixedStatus = CdChecksums.FixSector(tmpData);
+
+ if(fixedStatus == SectorFixResult.CouldNotFix) // Damaged
+ {
+ _resume.BadBlocks.Add(i + (ulong)b);
+ paintBad.Add(i + (ulong)b);
+ status[b] = SectorStatus.Errored;
+ }
+
Array.Copy(tmpData, 0, data, sectorSize * b, sectorSize);
}
- outputOptical.WriteSectorsLong(data,
- i,
- false,
- blocksToRead,
- Enumerable.Repeat(SectorStatus.Dumped, (int)blocksToRead)
- .ToArray());
+ outputOptical.WriteSectorsLong(data, i, false, blocksToRead, status);
}
else
{
- outputOptical.WriteSectorsLong(cmdBuf,
- i,
- false,
- blocksToRead,
- Enumerable.Repeat(SectorStatus.Dumped, (int)blocksToRead)
- .ToArray());
+ for(var b = 0; b < blocksToRead; b++)
+ {
+ status[b] = SectorStatus.Dumped;
+ Array.Copy(cmdBuf, (int)(b * sectorSize), tmpData, 0, sectorSize);
+ SectorFixResult fixedStatus = CdChecksums.FixSector(tmpData);
+
+ if(fixedStatus == SectorFixResult.CouldNotFix) // Damaged
+ {
+ _resume.BadBlocks.Add(i + (ulong)b);
+ paintBad.Add(i + (ulong)b);
+ status[b] = SectorStatus.Errored;
+ }
+
+ Array.Copy(tmpData, 0, data, sectorSize * b, sectorSize);
+ }
+
+ outputOptical.WriteSectorsLong(cmdBuf, i, false, blocksToRead, status);
}
}