[UI] Fix speed calculation.

This commit is contained in:
2024-04-26 03:16:36 +01:00
parent 0003093bf0
commit b48545b0b4
11 changed files with 99 additions and 50 deletions

View File

@@ -217,13 +217,13 @@ partial class Dump
UpdateProgress?.
Invoke(string.Format(Localization.Core.Reading_sector_0_of_1_2, i, blocks, ByteSize.FromMegabytes(currentSpeed).Per(_oneSecond).Humanize()),
(long)i, (long)blocks);
_speedStopwatch.Start();
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;
_speedStopwatch.Stop();
double elapsed;
// Overcome the track mode change drive error
@@ -234,13 +234,13 @@ partial class Dump
UpdateProgress?.
Invoke(string.Format(Localization.Core.Reading_sector_0_of_1_2, i + r, blocks, ByteSize.FromMegabytes(currentSpeed).Per(_oneSecond).Humanize()),
(long)i + r, (long)blocks);
_speedStopwatch.Start();
sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)(i + r), blockSize, (uint)sectorsForOffset + 1,
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true,
true, MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration);
totalDuration += cmdDuration;
_speedStopwatch.Stop();
if(!sense && !_dev.Error)
{
mhddLog.Write(i + r, cmdDuration);
@@ -313,17 +313,15 @@ partial class Dump
elapsed = _speedStopwatch.Elapsed.TotalSeconds;
if(elapsed <= 0)
if(elapsed <= 0 || sectorSpeedStart * blockSize < 524288)
continue;
currentSpeed = sectorSpeedStart * blockSize / (1048576 * elapsed);
sectorSpeedStart = 0;
_speedStopwatch.Restart();
_speedStopwatch.Reset();
}
}
_speedStopwatch.Restart();
if(!sense && !_dev.Error)
{
if(cdiReadyReadAsAudio)
@@ -424,12 +422,12 @@ partial class Dump
elapsed = _speedStopwatch.Elapsed.TotalSeconds;
if(elapsed <= 0)
if(elapsed <= 0 || sectorSpeedStart * blockSize < 524288)
continue;
currentSpeed = sectorSpeedStart * blockSize / (1048576 * elapsed);
sectorSpeedStart = 0;
_speedStopwatch.Restart();
_speedStopwatch.Reset();
}
_speedStopwatch.Stop();

View File

@@ -128,8 +128,6 @@ partial class Dump
for(ulong i = _resume.NextBlock; (long)i <= lastSector; i += blocksToRead)
{
_speedStopwatch.Restart();
if(_aborted)
{
currentTry.Extents = ExtentsConverter.ToMetadata(extents);
@@ -280,18 +278,22 @@ partial class Dump
if(_supportsPlextorD8 && !inData)
{
_speedStopwatch.Start();
sense = ReadPlextorWithSubchannel(out cmdBuf, out senseBuf, firstSectorToRead, blockSize, blocksToRead,
supportedPlextorSubchannel, out cmdDuration);
totalDuration += cmdDuration;
_speedStopwatch.Stop();
}
else if(readcd)
{
if(inData)
{
_speedStopwatch.Start();
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);
_speedStopwatch.Stop();
if(sense)
{
@@ -305,10 +307,12 @@ partial class Dump
// Go one for one as the drive does not tell us which one failed
for(var bi = 0; bi < blocksToRead; bi++)
{
_speedStopwatch.Start();
sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)(firstSectorToRead + bi), blockSize,
1, MmcSectorTypes.AllTypes, false, false, true,
MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
supportedSubchannel, _dev.Timeout, out double cmdDuration2);
_speedStopwatch.Stop();
cmdDuration += cmdDuration2;
@@ -348,10 +352,12 @@ partial class Dump
// Drive definitively didn't like to read everything so just do something clever...
// Try again
_speedStopwatch.Start();
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);
_speedStopwatch.Stop();
if(sense)
@@ -359,10 +365,12 @@ partial class Dump
{
for(uint bi = blocksToRead; bi > 0; bi--)
{
_speedStopwatch.Start();
sense = _dev.ReadCd(out cmdBuf, out senseBuf, firstSectorToRead, blockSize, bi,
MmcSectorTypes.AllTypes, false, false, true,
MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
supportedSubchannel, _dev.Timeout, out cmdDuration);
_speedStopwatch.Stop();
if(sense)
continue;
@@ -377,9 +385,11 @@ partial class Dump
}
else
{
_speedStopwatch.Start();
sense = _dev.ReadCd(out cmdBuf, out senseBuf, firstSectorToRead, blockSize, blocksToRead,
MmcSectorTypes.Cdda, false, false, false, MmcHeaderCodes.None, true, false,
MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration);
_speedStopwatch.Stop();
if(sense)
{
@@ -388,10 +398,12 @@ partial class Dump
// Try to workaround firmware
if(decSense is { ASC: 0x11, ASCQ: 0x05 } || decSense?.ASC == 0x64)
{
_speedStopwatch.Start();
sense = _dev.ReadCd(out cmdBuf, out _, firstSectorToRead, blockSize, blocksToRead,
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders,
true, true, MmcErrorField.None, supportedSubchannel, _dev.Timeout,
out double cmdDuration2);
_speedStopwatch.Stop();
cmdDuration += cmdDuration2;
}
@@ -402,23 +414,31 @@ partial class Dump
}
else if(read16)
{
_speedStopwatch.Start();
sense = _dev.Read16(out cmdBuf, out senseBuf, 0, false, false, false, firstSectorToRead, blockSize, 0,
blocksToRead, false, _dev.Timeout, out cmdDuration);
_speedStopwatch.Stop();
}
else if(read12)
{
_speedStopwatch.Start();
sense = _dev.Read12(out cmdBuf, out senseBuf, 0, false, false, false, false, firstSectorToRead,
blockSize, 0, blocksToRead, false, _dev.Timeout, out cmdDuration);
_speedStopwatch.Stop();
}
else if(read10)
{
_speedStopwatch.Start();
sense = _dev.Read10(out cmdBuf, out senseBuf, 0, false, false, false, false, firstSectorToRead,
blockSize, 0, (ushort)blocksToRead, _dev.Timeout, out cmdDuration);
_speedStopwatch.Stop();
}
else if(read6)
{
_speedStopwatch.Start();
sense = _dev.Read6(out cmdBuf, out senseBuf, firstSectorToRead, blockSize, (byte)blocksToRead,
_dev.Timeout, out cmdDuration);
_speedStopwatch.Stop();
}
double elapsed;
@@ -426,8 +446,6 @@ partial class Dump
// Overcome the track mode change drive error
if(inData && !nextData && sense)
{
_speedStopwatch.Restart();
for(uint r = 0; r < blocksToRead; r++)
{
UpdateProgress?.
@@ -441,10 +459,12 @@ partial class Dump
if(offsetBytes < 0)
adjustment = -sectorsForOffset;
_speedStopwatch.Start();
sense = ReadPlextorWithSubchannel(out cmdBuf, out senseBuf,
(uint)(firstSectorToRead + r + adjustment), blockSize,
(uint)sectorsForOffset + 1, supportedPlextorSubchannel,
out cmdDuration);
_speedStopwatch.Stop();
totalDuration += cmdDuration;
@@ -461,32 +481,42 @@ partial class Dump
}
else if(readcd)
{
_speedStopwatch.Start();
sense = _dev.ReadCd(out cmdBuf, out senseBuf, (uint)(i + r), blockSize, 1,
MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders,
true, true, MmcErrorField.None, supportedSubchannel, _dev.Timeout,
out cmdDuration);
_speedStopwatch.Stop();
totalDuration += cmdDuration;
}
else if(read16)
{
_speedStopwatch.Start();
sense = _dev.Read16(out cmdBuf, out senseBuf, 0, false, true, false, i + r, blockSize, 0, 1,
false, _dev.Timeout, out cmdDuration);
_speedStopwatch.Stop();
}
else if(read12)
{
_speedStopwatch.Start();
sense = _dev.Read12(out cmdBuf, out senseBuf, 0, false, true, false, false, (uint)(i + r),
blockSize, 0, 1, false, _dev.Timeout, out cmdDuration);
_speedStopwatch.Stop();
}
else if(read10)
{
_speedStopwatch.Start();
sense = _dev.Read10(out cmdBuf, out senseBuf, 0, false, true, false, false, (uint)(i + r),
blockSize, 0, 1, _dev.Timeout, out cmdDuration);
_speedStopwatch.Stop();
}
else if(read6)
{
_speedStopwatch.Start();
sense = _dev.Read6(out cmdBuf, out senseBuf, (uint)(i + r), blockSize, 1, _dev.Timeout,
out cmdDuration);
_speedStopwatch.Stop();
}
if(!sense && !_dev.Error)
@@ -628,12 +658,12 @@ partial class Dump
elapsed = _speedStopwatch.Elapsed.TotalSeconds;
if(elapsed <= 0)
if(elapsed <= 0 || sectorSpeedStart * blockSize < 524288)
continue;
currentSpeed = sectorSpeedStart * blockSize / (1048576 * elapsed);
sectorSpeedStart = 0;
_speedStopwatch.Restart();
_speedStopwatch.Reset();
}
continue;
@@ -810,12 +840,12 @@ partial class Dump
elapsed = _speedStopwatch.Elapsed.TotalSeconds;
if(elapsed <= 0)
if(elapsed <= 0 || sectorSpeedStart * blockSize < 524288)
continue;
currentSpeed = sectorSpeedStart * blockSize / (1048576 * elapsed);
sectorSpeedStart = 0;
_speedStopwatch.Restart();
_speedStopwatch.Reset();
}
_speedStopwatch.Stop();