mirror of
https://github.com/aaru-dps/Aaru.git
synced 2026-07-08 18:16:24 +00:00
Remove retrial of lead-outs.
This commit is contained in:
@@ -79,9 +79,6 @@ partial class Dump
|
||||
/// <param name="mcn">Disc media catalogue number</param>
|
||||
/// <param name="subchannelExtents">List of subchannels not yet dumped correctly</param>
|
||||
/// <param name="smallestPregapLbaPerTrack">List of smallest pregap relative address per track</param>
|
||||
|
||||
// TODO: Use it
|
||||
[SuppressMessage("ReSharper", "UnusedMember.Local")]
|
||||
void DumpCdLeadOuts(uint blockSize, ref double currentSpeed, DumpHardware currentTry, ExtentsULong extents,
|
||||
IbgLog ibgLog, ref double imageWriteDuration, ExtentsULong leadOutExtents, ref double maxSpeed,
|
||||
MhddLog mhddLog, ref double minSpeed, bool read6, bool read10, bool read12, bool read16,
|
||||
@@ -351,304 +348,4 @@ partial class Dump
|
||||
|
||||
EndProgress?.Invoke();
|
||||
}
|
||||
|
||||
/// <summary>Retries inter-session lead-outs</summary>
|
||||
/// <param name="blockSize">Size of the read sector in bytes</param>
|
||||
/// <param name="currentSpeed">Current read speed</param>
|
||||
/// <param name="currentTry">Current dump hardware try</param>
|
||||
/// <param name="extents">Extents</param>
|
||||
/// <param name="ibgLog">IMGBurn log</param>
|
||||
/// <param name="imageWriteDuration">Duration of image write</param>
|
||||
/// <param name="leadOutExtents">Lead-out extents</param>
|
||||
/// <param name="maxSpeed">Maximum speed</param>
|
||||
/// <param name="mhddLog">MHDD log</param>
|
||||
/// <param name="minSpeed">Minimum speed</param>
|
||||
/// <param name="read6">Device supports READ(6)</param>
|
||||
/// <param name="read10">Device supports READ(10)</param>
|
||||
/// <param name="read12">Device supports READ(12)</param>
|
||||
/// <param name="read16">Device supports READ(16)</param>
|
||||
/// <param name="readcd">Device supports READ CD</param>
|
||||
/// <param name="supportedSubchannel">Drive's maximum supported subchannel</param>
|
||||
/// <param name="subSize">Subchannel size in bytes</param>
|
||||
/// <param name="totalDuration">Total commands duration</param>
|
||||
/// <param name="tracks">Disc tracks</param>
|
||||
/// <param name="subLog">Subchannel log</param>
|
||||
/// <param name="desiredSubchannel">Subchannel desired to save</param>
|
||||
/// <param name="isrcs">List of disc ISRCs</param>
|
||||
/// <param name="mcn">Disc media catalogue number</param>
|
||||
/// <param name="subchannelExtents">List of subchannels not yet dumped correctly</param>
|
||||
/// <param name="smallestPregapLbaPerTrack">List of smallest pregap relative address per track</param>
|
||||
|
||||
// TODO: Use it
|
||||
[SuppressMessage("ReSharper", "UnusedMember.Local")]
|
||||
void RetryCdLeadOuts(uint blockSize, ref double currentSpeed, DumpHardware currentTry, ExtentsULong extents,
|
||||
IbgLog ibgLog, ref double imageWriteDuration, ExtentsULong leadOutExtents, ref double maxSpeed,
|
||||
MhddLog mhddLog, ref double minSpeed, bool read6, bool read10, bool read12, bool read16,
|
||||
bool readcd, MmcSubchannel supportedSubchannel, uint subSize, ref double totalDuration,
|
||||
SubchannelLog subLog, MmcSubchannel desiredSubchannel, Dictionary<byte, string> isrcs,
|
||||
ref string mcn, Track[] tracks, HashSet<int> subchannelExtents,
|
||||
Dictionary<byte, int> smallestPregapLbaPerTrack, int offsetBytes, int sectorsForOffset)
|
||||
{
|
||||
byte[] cmdBuf = null; // Data buffer
|
||||
const uint sectorSize = 2352; // Full sector size
|
||||
var sense = true; // Sense indicator
|
||||
ReadOnlySpan<byte> senseBuf = null;
|
||||
var outputOptical = _outputPlugin as IWritableOpticalImage;
|
||||
|
||||
AaruLogging.WriteLine("Retrying lead-outs");
|
||||
|
||||
InitProgress?.Invoke();
|
||||
|
||||
foreach((ulong item1, ulong item2) in leadOutExtents.ToArray())
|
||||
{
|
||||
Track t = tracks.FirstOrDefault(t => item1 == t.EndSector + 1);
|
||||
|
||||
bool isAudio = t.Type == TrackType.Audio;
|
||||
bool needsOffsetCorrection = _fixOffset && isAudio && offsetBytes != 0;
|
||||
|
||||
for(ulong i = item1; i <= item2; i++)
|
||||
{
|
||||
if(_aborted)
|
||||
{
|
||||
currentTry.Extents = ExtentsConverter.ToMetadata(extents);
|
||||
AaruLogging.WriteLine(Localization.Core.Aborted);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
double cmdDuration = 0;
|
||||
|
||||
if(currentSpeed > maxSpeed && currentSpeed > 0) maxSpeed = currentSpeed;
|
||||
|
||||
if(currentSpeed < minSpeed && currentSpeed > 0) minSpeed = currentSpeed;
|
||||
|
||||
PulseProgress?.Invoke(string.Format(Localization.Core.Reading_sector_0_at_lead_out_1,
|
||||
i,
|
||||
ByteSize.FromMegabytes(currentSpeed).Per(_oneSecond).Humanize()));
|
||||
|
||||
uint blocksToRead = 1;
|
||||
var firstSectorToRead = (uint)i;
|
||||
var failedCrossingLeadOut = false;
|
||||
|
||||
if(needsOffsetCorrection)
|
||||
{
|
||||
if(offsetBytes < 0)
|
||||
{
|
||||
firstSectorToRead =
|
||||
i >= (ulong)sectorsForOffset ? (uint)(i - (ulong)sectorsForOffset) : (uint)i;
|
||||
|
||||
blocksToRead += (uint)sectorsForOffset;
|
||||
}
|
||||
else
|
||||
{
|
||||
blocksToRead += (uint)sectorsForOffset;
|
||||
|
||||
if(i + blocksToRead > item2 + 1) failedCrossingLeadOut = true;
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
totalDuration += cmdDuration;
|
||||
}
|
||||
else if(read16)
|
||||
{
|
||||
sense = _dev.Read16(out cmdBuf,
|
||||
out senseBuf,
|
||||
0,
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
firstSectorToRead,
|
||||
blockSize,
|
||||
0,
|
||||
blocksToRead,
|
||||
false,
|
||||
_dev.Timeout,
|
||||
out cmdDuration);
|
||||
}
|
||||
else if(read12)
|
||||
{
|
||||
sense = _dev.Read12(out cmdBuf,
|
||||
out senseBuf,
|
||||
0,
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
firstSectorToRead,
|
||||
blockSize,
|
||||
0,
|
||||
blocksToRead,
|
||||
false,
|
||||
_dev.Timeout,
|
||||
out cmdDuration);
|
||||
}
|
||||
else if(read10)
|
||||
{
|
||||
sense = _dev.Read10(out cmdBuf,
|
||||
out senseBuf,
|
||||
0,
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
firstSectorToRead,
|
||||
blockSize,
|
||||
0,
|
||||
(ushort)blocksToRead,
|
||||
_dev.Timeout,
|
||||
out cmdDuration);
|
||||
}
|
||||
else if(read6)
|
||||
{
|
||||
sense = _dev.Read6(out cmdBuf,
|
||||
out senseBuf,
|
||||
firstSectorToRead,
|
||||
blockSize,
|
||||
(byte)blocksToRead,
|
||||
_dev.Timeout,
|
||||
out cmdDuration);
|
||||
}
|
||||
|
||||
if(!sense && !_dev.Error)
|
||||
{
|
||||
if(needsOffsetCorrection)
|
||||
{
|
||||
FixOffsetData(offsetBytes,
|
||||
sectorSize,
|
||||
sectorsForOffset,
|
||||
supportedSubchannel,
|
||||
ref blocksToRead,
|
||||
subSize,
|
||||
ref cmdBuf,
|
||||
blockSize,
|
||||
failedCrossingLeadOut);
|
||||
}
|
||||
|
||||
mhddLog.Write(i, cmdDuration, _maximumReadable);
|
||||
ibgLog.Write(i, currentSpeed * 1024);
|
||||
extents.Add(i, _maximumReadable, true);
|
||||
leadOutExtents.Remove(i);
|
||||
_writeStopwatch.Restart();
|
||||
|
||||
if(supportedSubchannel != MmcSubchannel.None)
|
||||
{
|
||||
var data = new byte[sectorSize * _maximumReadable];
|
||||
var sub = new byte[subSize * _maximumReadable];
|
||||
|
||||
for(var b = 0; b < _maximumReadable; b++)
|
||||
{
|
||||
Array.Copy(cmdBuf, (int)(0 + b * blockSize), data, sectorSize * b, sectorSize);
|
||||
|
||||
Array.Copy(cmdBuf, (int)(sectorSize + b * blockSize), sub, subSize * b, subSize);
|
||||
}
|
||||
|
||||
outputOptical.WriteSectorsLong(data,
|
||||
i,
|
||||
false,
|
||||
_maximumReadable,
|
||||
Enumerable.Repeat(SectorStatus.Dumped, (int)_maximumReadable)
|
||||
.ToArray());
|
||||
|
||||
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
|
||||
desiredSubchannel,
|
||||
sub,
|
||||
i,
|
||||
_maximumReadable,
|
||||
subLog,
|
||||
isrcs,
|
||||
0xAA,
|
||||
ref mcn,
|
||||
tracks,
|
||||
subchannelExtents,
|
||||
_fixSubchannelPosition,
|
||||
outputOptical,
|
||||
_fixSubchannel,
|
||||
_fixSubchannelCrc,
|
||||
UpdateStatus,
|
||||
smallestPregapLbaPerTrack,
|
||||
true,
|
||||
out _);
|
||||
|
||||
// Set tracks and go back
|
||||
if(indexesChanged)
|
||||
{
|
||||
outputOptical.SetTracks(tracks.ToList());
|
||||
i--;
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
outputOptical.WriteSectors(cmdBuf,
|
||||
i,
|
||||
false,
|
||||
_maximumReadable,
|
||||
Enumerable.Repeat(SectorStatus.Dumped, (int)_maximumReadable)
|
||||
.ToArray());
|
||||
}
|
||||
|
||||
imageWriteDuration += _writeStopwatch.Elapsed.TotalSeconds;
|
||||
}
|
||||
else
|
||||
{
|
||||
_errorLog?.WriteLine(i, _dev.Error, _dev.LastError, senseBuf.ToArray());
|
||||
|
||||
// TODO: Reset device after X errors
|
||||
if(_stopOnError) return; // TODO: Return more cleanly
|
||||
|
||||
// Write empty data
|
||||
_writeStopwatch.Restart();
|
||||
|
||||
if(supportedSubchannel != MmcSubchannel.None)
|
||||
{
|
||||
outputOptical.WriteSectorsLong(new byte[sectorSize * _skip], i, false, 1, new SectorStatus[1]);
|
||||
|
||||
if(desiredSubchannel != MmcSubchannel.None)
|
||||
{
|
||||
outputOptical.WriteSectorsTag(new byte[subSize * _skip],
|
||||
i,
|
||||
false,
|
||||
1,
|
||||
SectorTagType.CdSectorSubchannel);
|
||||
}
|
||||
}
|
||||
else
|
||||
outputOptical.WriteSectors(new byte[blockSize * _skip], i, false, 1, new SectorStatus[1]);
|
||||
|
||||
imageWriteDuration += _writeStopwatch.Elapsed.TotalSeconds;
|
||||
|
||||
mhddLog.Write(i, cmdDuration < 500 ? 65535 : cmdDuration);
|
||||
|
||||
ibgLog.Write(i, 0);
|
||||
}
|
||||
|
||||
_writeStopwatch.Stop();
|
||||
double newSpeed = (double)blockSize * _maximumReadable / 1048576 / (cmdDuration / 1000);
|
||||
|
||||
if(!double.IsInfinity(newSpeed)) currentSpeed = newSpeed;
|
||||
}
|
||||
}
|
||||
|
||||
EndProgress?.Invoke();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user