Change how pregap starting with 0 is calculated dumping vs converting. Fixes #375

This commit is contained in:
2020-11-04 23:55:24 +00:00
parent 14605b4d91
commit f92f122443
8 changed files with 132 additions and 220 deletions

View File

@@ -261,16 +261,9 @@ namespace Aaru.Core.Devices.Dumping
_outputPlugin.WriteSectorsLong(data, i + r, 1);
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
desiredSubchannel, sub,
i + r, 1, subLog, isrcs,
1, ref mcn, tracks,
subchannelExtents,
_fixSubchannelPosition,
_outputPlugin,
_fixSubchannel,
_fixSubchannelCrc,
_dumpLog, UpdateStatus,
smallestPregapLbaPerTrack);
desiredSubchannel, sub, i + r, 1, subLog, isrcs, 1, ref mcn, tracks,
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true);
// Set tracks and go back
if(indexesChanged)
@@ -353,15 +346,9 @@ namespace Aaru.Core.Devices.Dumping
_outputPlugin.WriteSectorsLong(data, i, blocksToRead);
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
desiredSubchannel, sub, i,
blocksToRead, subLog, isrcs, 1,
ref mcn, tracks,
subchannelExtents,
_fixSubchannelPosition,
_outputPlugin, _fixSubchannel,
_fixSubchannelCrc, _dumpLog,
UpdateStatus,
smallestPregapLbaPerTrack);
desiredSubchannel, sub, i, blocksToRead, subLog, isrcs, 1, ref mcn, tracks,
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true);
// Set tracks and go back
if(indexesChanged)

View File

@@ -417,7 +417,7 @@ namespace Aaru.Core.Devices.Dumping
desiredSubchannel, sub, i + r, 1, subLog, isrcs, (byte)track.TrackSequence,
ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin,
_fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus,
smallestPregapLbaPerTrack);
smallestPregapLbaPerTrack, true);
// Set tracks and go back
if(indexesChanged)
@@ -560,7 +560,8 @@ namespace Aaru.Core.Devices.Dumping
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
desiredSubchannel, sub, i, blocksToRead, subLog, isrcs, (byte)track.TrackSequence,
ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin,
_fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack);
_fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack,
true);
// Set tracks and go back
if(indexesChanged)

View File

@@ -308,7 +308,7 @@ namespace Aaru.Core.Devices.Dumping
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
desiredSubchannel, sub, badSector, 1, subLog, isrcs, (byte)track.TrackSequence, ref mcn,
tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack);
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true);
// Set tracks and go back
if(indexesChanged)
@@ -440,7 +440,7 @@ namespace Aaru.Core.Devices.Dumping
desiredSubchannel, sub, badSector, 1, subLog, isrcs, (byte)track.TrackSequence,
ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin,
_fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus,
smallestPregapLbaPerTrack);
smallestPregapLbaPerTrack, true);
// Set tracks and go back
if(indexesChanged)
@@ -590,7 +590,7 @@ namespace Aaru.Core.Devices.Dumping
subLog, isrcs, (byte)track.TrackSequence, ref mcn, tracks,
subchannelExtents, _fixSubchannelPosition, _outputPlugin,
_fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus,
smallestPregapLbaPerTrack);
smallestPregapLbaPerTrack, true);
if(subchannelExtents.Contains(bs))
continue;

View File

@@ -161,16 +161,9 @@ namespace Aaru.Core.Devices.Dumping
_outputPlugin.WriteSectorsLong(data, i, _maximumReadable);
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
desiredSubchannel, sub, i,
_maximumReadable, subLog,
isrcs, 0xAA, ref mcn, tracks,
subchannelExtents,
_fixSubchannelPosition,
_outputPlugin,
_fixSubchannel,
_fixSubchannelCrc, _dumpLog,
UpdateStatus,
smallestPregapLbaPerTrack);
desiredSubchannel, sub, i, _maximumReadable, subLog, isrcs, 0xAA, ref mcn, tracks,
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true);
// Set tracks and go back
if(indexesChanged)
@@ -336,16 +329,9 @@ namespace Aaru.Core.Devices.Dumping
_outputPlugin.WriteSectorsLong(data, i, _maximumReadable);
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
desiredSubchannel, sub, i,
_maximumReadable, subLog,
isrcs, 0xAA, ref mcn, tracks,
subchannelExtents,
_fixSubchannelPosition,
_outputPlugin,
_fixSubchannel,
_fixSubchannelCrc, _dumpLog,
UpdateStatus,
smallestPregapLbaPerTrack);
desiredSubchannel, sub, i, _maximumReadable, subLog, isrcs, 0xAA, ref mcn, tracks,
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true);
// Set tracks and go back
if(indexesChanged)

View File

@@ -202,7 +202,7 @@ namespace Aaru.Core.Devices.Dumping
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
desiredSubchannel, sub, badSector, 1, subLog, isrcs, (byte)track.TrackSequence, ref mcn,
tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack);
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true);
// Set tracks and go back
if(!indexesChanged)

View File

@@ -50,7 +50,7 @@ namespace Aaru.Core.Media
bool fixSubchannelPosition, IWritableImage outputPlugin,
bool fixSubchannel, bool fixSubchannelCrc, DumpLog dumpLog,
UpdateStatusHandler updateStatus,
Dictionary<byte, int> smallestPregapLbaPerTrack)
Dictionary<byte, int> smallestPregapLbaPerTrack, bool dumping)
{
if(supportedSubchannel == MmcSubchannel.Q16)
sub = Subchannel.ConvertQToRaw(sub);
@@ -65,7 +65,7 @@ namespace Aaru.Core.Media
byte[] deSub = Subchannel.Deinterleave(sub);
bool indexesChanged = CheckIndexesFromSubchannel(deSub, isrcs, currentTrack, ref mcn, tracks, dumpLog,
updateStatus, smallestPregapLbaPerTrack);
updateStatus, smallestPregapLbaPerTrack, dumping);
if(!fixSubchannelPosition ||
desiredSubchannel == MmcSubchannel.None)
@@ -100,8 +100,8 @@ namespace Aaru.Core.Media
pWeight++;
}
if(!deSub.Skip(subPos + 24).Take(96 - 24).All(rw => (rw == 0)) &&
!deSub.Skip(subPos + 24).Take(96 - 24).All(rw => (rw == 0xFF)))
if(!deSub.Skip(subPos + 24).Take(96 - 24).All(rw => rw == 0) &&
!deSub.Skip(subPos + 24).Take(96 - 24).All(rw => rw == 0xFF))
rwOk = false;
bool rwPacket = false;
@@ -253,7 +253,7 @@ namespace Aaru.Core.Media
static bool CheckIndexesFromSubchannel(byte[] deSub, Dictionary<byte, string> isrcs, byte currentTrack,
ref string mcn, Track[] tracks, DumpLog dumpLog,
UpdateStatusHandler updateStatus,
Dictionary<byte, int> smallestPregapLbaPerTrack)
Dictionary<byte, int> smallestPregapLbaPerTrack, bool dumping)
{
bool status = false;
@@ -339,8 +339,10 @@ namespace Aaru.Core.Media
byte pframe = (byte)(((q[5] / 16) * 10) + (q[5] & 0x0F));
int qPos = (pmin * 60 * 75) + (psec * 75) + pframe;
// When we are dumping we calculate the pregap in reverse from index 1 back.
// When we are not, we go from index 0.
if(!smallestPregapLbaPerTrack.ContainsKey(trackNo))
smallestPregapLbaPerTrack[trackNo] = 1;
smallestPregapLbaPerTrack[trackNo] = dumping ? 1 : 0;
if(qPos < smallestPregapLbaPerTrack[trackNo])
{

View File

@@ -676,16 +676,12 @@ namespace Aaru.Gui.ViewModels.Windows
});
foreach(MediaTagType mediaTag in _inputFormat.Info.ReadableMediaTags.Where(mediaTag =>
!outputFormat.
SupportedMediaTags.
Contains(mediaTag) &&
!ForceChecked))
!outputFormat.SupportedMediaTags.Contains(mediaTag) && !ForceChecked))
{
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Converting image will lose media tag {mediaTag}, not continuing...",
icon: Icon.
Error).
icon: Icon.Error).
ShowDialog(_view));
return;
@@ -694,9 +690,7 @@ namespace Aaru.Gui.ViewModels.Windows
bool useLong = _inputFormat.Info.ReadableSectorTags.Count != 0;
foreach(SectorTagType sectorTag in _inputFormat.Info.ReadableSectorTags.Where(sectorTag =>
!outputFormat.
SupportedSectorTags.
Contains(sectorTag)))
!outputFormat.SupportedSectorTags.Contains(sectorTag)))
{
if(ForceChecked)
{
@@ -711,8 +705,7 @@ namespace Aaru.Gui.ViewModels.Windows
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Converting image will lose sector tag {sectorTag}, not continuing...",
icon: Icon.
Error).
icon: Icon.Error).
ShowDialog(_view));
return;
@@ -765,8 +758,7 @@ namespace Aaru.Gui.ViewModels.Windows
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} creating output image.",
icon: Icon.
Error).
icon: Icon.Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} creating output image.", outputFormat.ErrorMessage);
@@ -812,10 +804,7 @@ namespace Aaru.Gui.ViewModels.Windows
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} setting metadata, not continuing...",
icon
: Icon.
Error).
ShowDialog(_view));
icon: Icon.Error).ShowDialog(_view));
AaruConsole.ErrorWriteLine("not continuing...");
@@ -843,9 +832,7 @@ namespace Aaru.Gui.ViewModels.Windows
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} sending tracks list to output image.",
icon:
Icon.
Error).
icon: Icon.Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} sending tracks list to output image.",
@@ -883,9 +870,7 @@ namespace Aaru.Gui.ViewModels.Windows
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} writing media tag, not continuing...",
icon:
Icon.
Error).
icon: Icon.Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} writing media tag, not continuing...",
@@ -992,10 +977,7 @@ namespace Aaru.Gui.ViewModels.Windows
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} writing sector {doneSectors}, not continuing...",
icon
: Icon.
Error).
ShowDialog(_view));
icon: Icon.Error).ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} writing sector {1}, not continuing...",
outputFormat.ErrorMessage, doneSectors);
@@ -1121,14 +1103,9 @@ namespace Aaru.Gui.ViewModels.Windows
track != null)
{
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
MmcSubchannel.Raw, sector,
doneSectors, 1, null, isrcs,
(byte)track.TrackSequence,
ref mcn, tracks.ToArray(),
subchannelExtents, false,
outputFormat, false, false,
null, null,
smallestPregapLbaPerTrack);
MmcSubchannel.Raw, sector, doneSectors, 1, null, isrcs,
(byte)track.TrackSequence, ref mcn, tracks.ToArray(), subchannelExtents, false,
outputFormat, false, false, null, null, smallestPregapLbaPerTrack, false);
if(indexesChanged)
outputOptical.SetTracks(tracks.ToList());
@@ -1148,15 +1125,9 @@ namespace Aaru.Gui.ViewModels.Windows
{
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
MmcSubchannel.Raw, sector,
doneSectors, sectorsToDo, null,
isrcs,
(byte)track.TrackSequence,
ref mcn, tracks.ToArray(),
subchannelExtents, false,
outputFormat, false, false,
null, null,
smallestPregapLbaPerTrack);
MmcSubchannel.Raw, sector, doneSectors, sectorsToDo, null, isrcs,
(byte)track.TrackSequence, ref mcn, tracks.ToArray(), subchannelExtents, false,
outputFormat, false, false, null, null, smallestPregapLbaPerTrack, false);
if(indexesChanged)
outputOptical.SetTracks(tracks.ToList());
@@ -1180,9 +1151,7 @@ namespace Aaru.Gui.ViewModels.Windows
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} writing sector {doneSectors}, not continuing...",
icon
: Icon.
Error).
icon: Icon.Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} writing sector {1}, not continuing...",
@@ -1303,9 +1272,7 @@ namespace Aaru.Gui.ViewModels.Windows
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} writing sector {doneSectors}, not continuing...",
icon
: Icon.
Error).
icon: Icon.Error).
ShowDialog(_view));
return;
@@ -1323,8 +1290,7 @@ namespace Aaru.Gui.ViewModels.Windows
Progress2Value = Progress2MaxValue;
});
foreach(SectorTagType tag in _inputFormat.
Info.ReadableSectorTags.OrderBy(t => t).
foreach(SectorTagType tag in _inputFormat.Info.ReadableSectorTags.OrderBy(t => t).
TakeWhile(tag => useLong && !_cancel))
{
switch(tag)
@@ -1382,9 +1348,7 @@ namespace Aaru.Gui.ViewModels.Windows
await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} writing tag, not continuing...",
icon
: Icon.
Error).
icon: Icon.Error).
ShowDialog(_view));
return;
@@ -1442,9 +1406,7 @@ namespace Aaru.Gui.ViewModels.Windows
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} writing tag for sector {doneSectors}, not continuing...",
icon
: Icon.
Error).
icon: Icon.Error).
ShowDialog(_view));
return;
@@ -1525,8 +1487,7 @@ namespace Aaru.Gui.ViewModels.Windows
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} closing output image... Contents are not correct.",
icon: Icon.
Error).
icon: Icon.Error).
ShowDialog(_view));
return;

View File

@@ -557,10 +557,7 @@ namespace Aaru.Commands.Image
}
foreach(MediaTagType mediaTag in inputFormat.Info.ReadableMediaTags.Where(mediaTag =>
!outputFormat.
SupportedMediaTags.
Contains(mediaTag) &&
!force))
!outputFormat.SupportedMediaTags.Contains(mediaTag) && !force))
{
AaruConsole.ErrorWriteLine("Converting image will lose media tag {0}, not continuing...", mediaTag);
AaruConsole.ErrorWriteLine("If you don't care, use force option.");
@@ -571,9 +568,7 @@ namespace Aaru.Commands.Image
bool useLong = inputFormat.Info.ReadableSectorTags.Count != 0;
foreach(SectorTagType sectorTag in inputFormat.Info.ReadableSectorTags.Where(sectorTag =>
!outputFormat.
SupportedSectorTags.
Contains(sectorTag)))
!outputFormat.SupportedSectorTags.Contains(sectorTag)))
{
if(force)
{
@@ -639,9 +634,7 @@ namespace Aaru.Commands.Image
List<DumpHardwareType> dumpHardware = inputFormat.DumpHardware;
foreach(MediaTagType mediaTag in inputFormat.Info.ReadableMediaTags.Where(mediaTag =>
!force || outputFormat.
SupportedMediaTags.
Contains(mediaTag)))
!force || outputFormat.SupportedMediaTags.Contains(mediaTag)))
{
AaruConsole.WriteLine("Converting media tag {0}", mediaTag);
byte[] tag = inputFormat.ReadDiskTag(mediaTag);
@@ -833,8 +826,8 @@ namespace Aaru.Commands.Image
subchannelExtents.Add((int)s);
}
foreach(SectorTagType tag in inputFormat.
Info.ReadableSectorTags.OrderBy(t => t).TakeWhile(tag => useLong))
foreach(SectorTagType tag in inputFormat.Info.ReadableSectorTags.OrderBy(t => t).
TakeWhile(tag => useLong))
{
switch(tag)
{
@@ -908,19 +901,10 @@ namespace Aaru.Commands.Image
if(tag == SectorTagType.CdSectorSubchannel)
{
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
MmcSubchannel.Raw, sector,
doneSectors +
track.TrackStartSector, 1,
null, isrcs,
(byte)track.TrackSequence,
ref mcn, tracks,
subchannelExtents,
fixSubchannelPosition,
outputFormat,
fixSubchannel,
fixSubchannelCrc, null,
null,
smallestPregapLbaPerTrack);
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, null,
isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents,
fixSubchannelPosition, outputFormat, fixSubchannel, fixSubchannelCrc, null,
null, smallestPregapLbaPerTrack, false);
if(indexesChanged)
outputOptical.SetTracks(tracks.ToList());
@@ -939,19 +923,10 @@ namespace Aaru.Commands.Image
if(tag == SectorTagType.CdSectorSubchannel)
{
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
MmcSubchannel.Raw, sector,
doneSectors +
track.TrackStartSector,
sectorsToDo, null, isrcs,
(byte)track.TrackSequence,
ref mcn, tracks,
subchannelExtents,
fixSubchannelPosition,
outputFormat,
fixSubchannel,
fixSubchannelCrc, null,
null,
smallestPregapLbaPerTrack);
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector,
sectorsToDo, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks,
subchannelExtents, fixSubchannelPosition, outputFormat, fixSubchannel,
fixSubchannelCrc, null, null, smallestPregapLbaPerTrack, false);
if(indexesChanged)
outputOptical.SetTracks(tracks.ToList());