mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Shift audio data by offset.
This commit is contained in:
@@ -118,10 +118,9 @@ namespace DiscImageChef.Core.Devices.Dumping
|
|||||||
Dictionary<byte, byte> trackFlags = new Dictionary<byte, byte>(); // Track flags
|
Dictionary<byte, byte> trackFlags = new Dictionary<byte, byte>(); // Track flags
|
||||||
List<Track> trackList = new List<Track>(); // Tracks in disc
|
List<Track> trackList = new List<Track>(); // Tracks in disc
|
||||||
Track[] tracks; // Tracks in disc as array
|
Track[] tracks; // Tracks in disc as array
|
||||||
int offsetBytes; // Read offset
|
int offsetBytes = 0; // Read offset
|
||||||
|
|
||||||
bool
|
bool nextData; // Next cluster of sectors is all data;
|
||||||
nextData; // Next cluster of sectors is all data;
|
|
||||||
|
|
||||||
Dictionary<MediaTagType, byte[]> mediaTags = new Dictionary<MediaTagType, byte[]>(); // Media tags
|
Dictionary<MediaTagType, byte[]> mediaTags = new Dictionary<MediaTagType, byte[]>(); // Media tags
|
||||||
|
|
||||||
@@ -842,18 +841,18 @@ namespace DiscImageChef.Core.Devices.Dumping
|
|||||||
sessions == 1)
|
sessions == 1)
|
||||||
dskType = MediaType.CDV;
|
dskType = MediaType.CDV;
|
||||||
|
|
||||||
byte[] videoNowColorFrame = new byte[9 * 2352];
|
byte[] videoNowColorFrame = new byte[9 * sectorSize];
|
||||||
|
|
||||||
for(int i = 0; i < 9; i++)
|
for(int i = 0; i < 9; i++)
|
||||||
{
|
{
|
||||||
sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)i, 2352, 1, MmcSectorTypes.AllTypes, false,
|
sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)i, sectorSize, 1, MmcSectorTypes.AllTypes,
|
||||||
false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
|
false, false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
|
||||||
MmcSubchannel.None, _dev.Timeout, out _);
|
MmcSubchannel.None, _dev.Timeout, out _);
|
||||||
|
|
||||||
if(sense || _dev.Error)
|
if(sense || _dev.Error)
|
||||||
{
|
{
|
||||||
sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)i, 2352, 1, MmcSectorTypes.Cdda, false,
|
sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)i, sectorSize, 1, MmcSectorTypes.Cdda,
|
||||||
false, true, MmcHeaderCodes.None, true, true, MmcErrorField.None,
|
false, false, true, MmcHeaderCodes.None, true, true, MmcErrorField.None,
|
||||||
MmcSubchannel.None, _dev.Timeout, out _);
|
MmcSubchannel.None, _dev.Timeout, out _);
|
||||||
|
|
||||||
if(sense || !_dev.Error)
|
if(sense || !_dev.Error)
|
||||||
@@ -864,7 +863,7 @@ namespace DiscImageChef.Core.Devices.Dumping
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Array.Copy(cmdBuf, 0, videoNowColorFrame, i * 2352, 2352);
|
Array.Copy(cmdBuf, 0, videoNowColorFrame, i * sectorSize, sectorSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(MMC.IsVideoNowColor(videoNowColorFrame))
|
if(MMC.IsVideoNowColor(videoNowColorFrame))
|
||||||
@@ -1437,6 +1436,18 @@ namespace DiscImageChef.Core.Devices.Dumping
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(_fixOffset && !inData)
|
||||||
|
{
|
||||||
|
// TODO: FreeBSD bug
|
||||||
|
if(offsetBytes > 0)
|
||||||
|
{
|
||||||
|
if(i == 0)
|
||||||
|
firstSectorToRead = uint.MaxValue; // -1
|
||||||
|
else
|
||||||
|
firstSectorToRead--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
|
#pragma warning disable RECS0018 // Comparison of floating point numbers with equality operator
|
||||||
|
|
||||||
// ReSharper disable CompareOfFloatsByEqualityOperator
|
// ReSharper disable CompareOfFloatsByEqualityOperator
|
||||||
@@ -1484,6 +1495,50 @@ namespace DiscImageChef.Core.Devices.Dumping
|
|||||||
_dev.Timeout, out cmdDuration);
|
_dev.Timeout, out cmdDuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Because one block has been partially used to fix the offset
|
||||||
|
if(_fixOffset &&
|
||||||
|
!inData &&
|
||||||
|
offsetBytes != 0)
|
||||||
|
{
|
||||||
|
int offsetFix = offsetBytes > 0 ? offsetFix = (int)(sectorSize - offsetBytes)
|
||||||
|
: offsetFix = offsetBytes * -1;
|
||||||
|
|
||||||
|
if(supportedSubchannel != MmcSubchannel.None)
|
||||||
|
{
|
||||||
|
// Deinterleave subchannel
|
||||||
|
byte[] data = new byte[sectorSize * blocksToRead];
|
||||||
|
byte[] sub = new byte[subSize * blocksToRead];
|
||||||
|
|
||||||
|
for(int b = 0; b < blocksToRead; b++)
|
||||||
|
{
|
||||||
|
Array.Copy(cmdBuf, (int)(0 + (b * blockSize)), data, sectorSize * b, sectorSize);
|
||||||
|
Array.Copy(cmdBuf, (int)(sectorSize + (b * blockSize)), sub, subSize * b, subSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpBuf = new byte[sectorSize * (blocksToRead - 1)];
|
||||||
|
Array.Copy(data, offsetFix, tmpBuf, 0, tmpBuf.Length);
|
||||||
|
data = tmpBuf;
|
||||||
|
|
||||||
|
blocksToRead--;
|
||||||
|
|
||||||
|
// Reinterleave subchannel
|
||||||
|
cmdBuf = new byte[blockSize * blocksToRead];
|
||||||
|
|
||||||
|
for(int b = 0; b < blocksToRead; b++)
|
||||||
|
{
|
||||||
|
Array.Copy(data, sectorSize * b, cmdBuf, (int)(0 + (b * blockSize)), sectorSize);
|
||||||
|
Array.Copy(sub, subSize * b, cmdBuf, (int)(sectorSize + (b * blockSize)), subSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmpBuf = new byte[blockSize * (blocksToRead - 1)];
|
||||||
|
Array.Copy(cmdBuf, offsetFix, tmpBuf, 0, tmpBuf.Length);
|
||||||
|
cmdBuf = tmpBuf;
|
||||||
|
blocksToRead--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(!sense &&
|
if(!sense &&
|
||||||
!_dev.Error)
|
!_dev.Error)
|
||||||
{
|
{
|
||||||
@@ -1515,7 +1570,7 @@ namespace DiscImageChef.Core.Devices.Dumping
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(cmdBuf.Length % 2352 == 0)
|
if(cmdBuf.Length % sectorSize == 0)
|
||||||
{
|
{
|
||||||
byte[] data = new byte[2048 * blocksToRead];
|
byte[] data = new byte[2048 * blocksToRead];
|
||||||
|
|
||||||
@@ -1560,7 +1615,7 @@ namespace DiscImageChef.Core.Devices.Dumping
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(cmdBuf.Length % 2352 == 0)
|
if(cmdBuf.Length % sectorSize == 0)
|
||||||
_outputPlugin.WriteSectors(new byte[2048 * _skip], i, _skip);
|
_outputPlugin.WriteSectors(new byte[2048 * _skip], i, _skip);
|
||||||
else
|
else
|
||||||
_outputPlugin.WriteSectorsLong(new byte[blockSize * _skip], i, _skip);
|
_outputPlugin.WriteSectorsLong(new byte[blockSize * _skip], i, _skip);
|
||||||
@@ -1753,22 +1808,37 @@ namespace DiscImageChef.Core.Devices.Dumping
|
|||||||
|
|
||||||
PulseProgress?.Invoke($"Trimming sector {badSector}");
|
PulseProgress?.Invoke($"Trimming sector {badSector}");
|
||||||
|
|
||||||
|
byte sectorsToTrim = 1;
|
||||||
|
uint badSectorToRead = (uint)badSector;
|
||||||
|
|
||||||
|
if(_fixOffset &&
|
||||||
|
audioExtents.Contains(badSector) &&
|
||||||
|
offsetBytes != 0)
|
||||||
|
{
|
||||||
|
if(offsetBytes > 0)
|
||||||
|
{
|
||||||
|
badSectorToRead--;
|
||||||
|
}
|
||||||
|
|
||||||
|
sectorsToTrim = 2;
|
||||||
|
}
|
||||||
|
|
||||||
if(readcd)
|
if(readcd)
|
||||||
sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)badSector, blockSize, 1,
|
sense = _dev.ReadCd(out cmdBuf, out senseBuf, badSectorToRead, blockSize, sectorsToTrim,
|
||||||
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders,
|
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders,
|
||||||
true, true, MmcErrorField.None, supportedSubchannel, _dev.Timeout,
|
true, true, MmcErrorField.None, supportedSubchannel, _dev.Timeout,
|
||||||
out cmdDuration);
|
out cmdDuration);
|
||||||
else if(read16)
|
else if(read16)
|
||||||
sense = _dev.Read16(out cmdBuf, out senseBuf, 0, false, true, false, badSector, blockSize, 0,
|
sense = _dev.Read16(out cmdBuf, out senseBuf, 0, false, true, false, badSectorToRead, blockSize,
|
||||||
1, false, _dev.Timeout, out cmdDuration);
|
0, sectorsToTrim, false, _dev.Timeout, out cmdDuration);
|
||||||
else if(read12)
|
else if(read12)
|
||||||
sense = _dev.Read12(out cmdBuf, out senseBuf, 0, false, true, false, false, (uint)badSector,
|
sense = _dev.Read12(out cmdBuf, out senseBuf, 0, false, true, false, false, badSectorToRead,
|
||||||
blockSize, 0, 1, false, _dev.Timeout, out cmdDuration);
|
blockSize, 0, sectorsToTrim, false, _dev.Timeout, out cmdDuration);
|
||||||
else if(read10)
|
else if(read10)
|
||||||
sense = _dev.Read10(out cmdBuf, out senseBuf, 0, false, true, false, false, (uint)badSector,
|
sense = _dev.Read10(out cmdBuf, out senseBuf, 0, false, true, false, false, badSectorToRead,
|
||||||
blockSize, 0, 1, _dev.Timeout, out cmdDuration);
|
blockSize, 0, sectorsToTrim, _dev.Timeout, out cmdDuration);
|
||||||
else if(read6)
|
else if(read6)
|
||||||
sense = _dev.Read6(out cmdBuf, out senseBuf, (uint)badSector, blockSize, 1,
|
sense = _dev.Read6(out cmdBuf, out senseBuf, badSectorToRead, blockSize, sectorsToTrim,
|
||||||
_dev.Timeout, out cmdDuration);
|
_dev.Timeout, out cmdDuration);
|
||||||
|
|
||||||
totalDuration += cmdDuration;
|
totalDuration += cmdDuration;
|
||||||
@@ -1783,6 +1853,51 @@ namespace DiscImageChef.Core.Devices.Dumping
|
|||||||
extents.Add(badSector);
|
extents.Add(badSector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Because one block has been partially used to fix the offset
|
||||||
|
if(_fixOffset &&
|
||||||
|
audioExtents.Contains(badSector) &&
|
||||||
|
offsetBytes != 0)
|
||||||
|
{
|
||||||
|
int offsetFix = offsetBytes > 0 ? offsetFix = (int)(sectorSize - offsetBytes)
|
||||||
|
: offsetFix = offsetBytes * -1;
|
||||||
|
|
||||||
|
if(supportedSubchannel != MmcSubchannel.None)
|
||||||
|
{
|
||||||
|
// Deinterleave subchannel
|
||||||
|
byte[] data = new byte[sectorSize * sectorsToTrim];
|
||||||
|
byte[] sub = new byte[subSize * sectorsToTrim];
|
||||||
|
|
||||||
|
for(int b = 0; b < sectorsToTrim; b++)
|
||||||
|
{
|
||||||
|
Array.Copy(cmdBuf, (int)(0 + (b * blockSize)), data, sectorSize * b,
|
||||||
|
sectorSize);
|
||||||
|
|
||||||
|
Array.Copy(cmdBuf, (int)(sectorSize + (b * blockSize)), sub, subSize * b, subSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpBuf = new byte[sectorSize * (sectorsToTrim - 1)];
|
||||||
|
Array.Copy(data, offsetFix, tmpBuf, 0, tmpBuf.Length);
|
||||||
|
data = tmpBuf;
|
||||||
|
|
||||||
|
// Reinterleave subchannel
|
||||||
|
cmdBuf = new byte[blockSize * sectorsToTrim];
|
||||||
|
|
||||||
|
for(int b = 0; b < sectorsToTrim; b++)
|
||||||
|
{
|
||||||
|
Array.Copy(data, sectorSize * b, cmdBuf, (int)(0 + (b * blockSize)),
|
||||||
|
sectorSize);
|
||||||
|
|
||||||
|
Array.Copy(sub, subSize * b, cmdBuf, (int)(sectorSize + (b * blockSize)), subSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmpBuf = new byte[blockSize * (sectorsToTrim - 1)];
|
||||||
|
Array.Copy(cmdBuf, offsetFix, tmpBuf, 0, tmpBuf.Length);
|
||||||
|
cmdBuf = tmpBuf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(supportedSubchannel != MmcSubchannel.None)
|
if(supportedSubchannel != MmcSubchannel.None)
|
||||||
{
|
{
|
||||||
byte[] data = new byte[sectorSize];
|
byte[] data = new byte[sectorSize];
|
||||||
@@ -1800,7 +1915,7 @@ namespace DiscImageChef.Core.Devices.Dumping
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(cmdBuf.Length % 2352 == 0)
|
if(cmdBuf.Length % sectorSize == 0)
|
||||||
{
|
{
|
||||||
byte[] data = new byte[2048];
|
byte[] data = new byte[2048];
|
||||||
Array.Copy(cmdBuf, 16, data, 0, 2048);
|
Array.Copy(cmdBuf, 16, data, 0, 2048);
|
||||||
@@ -1944,9 +2059,24 @@ namespace DiscImageChef.Core.Devices.Dumping
|
|||||||
forward ? "forward" : "reverse",
|
forward ? "forward" : "reverse",
|
||||||
runningPersistent ? "recovering partial data, " : ""));
|
runningPersistent ? "recovering partial data, " : ""));
|
||||||
|
|
||||||
|
byte sectorsToReRead = 1;
|
||||||
|
uint badSectorToReRead = (uint)badSector;
|
||||||
|
|
||||||
|
if(_fixOffset &&
|
||||||
|
audioExtents.Contains(badSector) &&
|
||||||
|
offsetBytes != 0)
|
||||||
|
{
|
||||||
|
if(offsetBytes > 0)
|
||||||
|
{
|
||||||
|
badSectorToReRead--;
|
||||||
|
}
|
||||||
|
|
||||||
|
sectorsToReRead = 2;
|
||||||
|
}
|
||||||
|
|
||||||
if(readcd)
|
if(readcd)
|
||||||
{
|
{
|
||||||
sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)badSector, blockSize, 1,
|
sense = _dev.ReadCd(out cmdBuf, out senseBuf, badSectorToReRead, blockSize, sectorsToReRead,
|
||||||
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders,
|
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders,
|
||||||
true, true, MmcErrorField.None, supportedSubchannel, _dev.Timeout,
|
true, true, MmcErrorField.None, supportedSubchannel, _dev.Timeout,
|
||||||
out cmdDuration);
|
out cmdDuration);
|
||||||
@@ -1968,6 +2098,51 @@ namespace DiscImageChef.Core.Devices.Dumping
|
|||||||
sectorsNotEvenPartial.Add(badSector);
|
sectorsNotEvenPartial.Add(badSector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Because one block has been partially used to fix the offset
|
||||||
|
if(_fixOffset &&
|
||||||
|
audioExtents.Contains(badSector) &&
|
||||||
|
offsetBytes != 0)
|
||||||
|
{
|
||||||
|
int offsetFix = offsetBytes > 0 ? offsetFix = (int)(sectorSize - offsetBytes)
|
||||||
|
: offsetFix = offsetBytes * -1;
|
||||||
|
|
||||||
|
if(supportedSubchannel != MmcSubchannel.None)
|
||||||
|
{
|
||||||
|
// Deinterleave subchannel
|
||||||
|
byte[] data = new byte[sectorSize * sectorsToReRead];
|
||||||
|
byte[] sub = new byte[subSize * sectorsToReRead];
|
||||||
|
|
||||||
|
for(int b = 0; b < sectorsToReRead; b++)
|
||||||
|
{
|
||||||
|
Array.Copy(cmdBuf, (int)(0 + (b * blockSize)), data, sectorSize * b,
|
||||||
|
sectorSize);
|
||||||
|
|
||||||
|
Array.Copy(cmdBuf, (int)(sectorSize + (b * blockSize)), sub, subSize * b, subSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
tmpBuf = new byte[sectorSize * (sectorsToReRead - 1)];
|
||||||
|
Array.Copy(data, offsetFix, tmpBuf, 0, tmpBuf.Length);
|
||||||
|
data = tmpBuf;
|
||||||
|
|
||||||
|
// Reinterleave subchannel
|
||||||
|
cmdBuf = new byte[blockSize * sectorsToReRead];
|
||||||
|
|
||||||
|
for(int b = 0; b < sectorsToReRead; b++)
|
||||||
|
{
|
||||||
|
Array.Copy(data, sectorSize * b, cmdBuf, (int)(0 + (b * blockSize)),
|
||||||
|
sectorSize);
|
||||||
|
|
||||||
|
Array.Copy(sub, subSize * b, cmdBuf, (int)(sectorSize + (b * blockSize)), subSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmpBuf = new byte[blockSize * (sectorsToReRead - 1)];
|
||||||
|
Array.Copy(cmdBuf, offsetFix, tmpBuf, 0, tmpBuf.Length);
|
||||||
|
cmdBuf = tmpBuf;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(!sense &&
|
if(!sense &&
|
||||||
!_dev.Error)
|
!_dev.Error)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user