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

View File

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

View File

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

View File

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

View File

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

View File

@@ -50,7 +50,7 @@ namespace Aaru.Core.Media
bool fixSubchannelPosition, IWritableImage outputPlugin, bool fixSubchannelPosition, IWritableImage outputPlugin,
bool fixSubchannel, bool fixSubchannelCrc, DumpLog dumpLog, bool fixSubchannel, bool fixSubchannelCrc, DumpLog dumpLog,
UpdateStatusHandler updateStatus, UpdateStatusHandler updateStatus,
Dictionary<byte, int> smallestPregapLbaPerTrack) Dictionary<byte, int> smallestPregapLbaPerTrack, bool dumping)
{ {
if(supportedSubchannel == MmcSubchannel.Q16) if(supportedSubchannel == MmcSubchannel.Q16)
sub = Subchannel.ConvertQToRaw(sub); sub = Subchannel.ConvertQToRaw(sub);
@@ -65,7 +65,7 @@ namespace Aaru.Core.Media
byte[] deSub = Subchannel.Deinterleave(sub); byte[] deSub = Subchannel.Deinterleave(sub);
bool indexesChanged = CheckIndexesFromSubchannel(deSub, isrcs, currentTrack, ref mcn, tracks, dumpLog, bool indexesChanged = CheckIndexesFromSubchannel(deSub, isrcs, currentTrack, ref mcn, tracks, dumpLog,
updateStatus, smallestPregapLbaPerTrack); updateStatus, smallestPregapLbaPerTrack, dumping);
if(!fixSubchannelPosition || if(!fixSubchannelPosition ||
desiredSubchannel == MmcSubchannel.None) desiredSubchannel == MmcSubchannel.None)
@@ -100,9 +100,9 @@ namespace Aaru.Core.Media
pWeight++; pWeight++;
} }
if(!deSub.Skip(subPos + 24).Take(96 - 24).All(rw => (rw == 0)) && if(!deSub.Skip(subPos + 24).Take(96 - 24).All(rw => rw == 0) &&
!deSub.Skip(subPos + 24).Take(96 - 24).All(rw => (rw == 0xFF))) !deSub.Skip(subPos + 24).Take(96 - 24).All(rw => rw == 0xFF))
rwOk = false; rwOk = false;
bool rwPacket = false; bool rwPacket = false;
bool cdtextPacket = false; bool cdtextPacket = false;
@@ -212,16 +212,16 @@ namespace Aaru.Core.Media
if((q[0] & 0x3) == 1) if((q[0] & 0x3) == 1)
{ {
amin = (byte)(((q[7] / 16) * 10) + (q[7] & 0x0F)); amin = (byte)(((q[7] / 16) * 10) + (q[7] & 0x0F));
asec = (byte)(((q[8] / 16) * 10) + (q[8] & 0x0F)); asec = (byte)(((q[8] / 16) * 10) + (q[8] & 0x0F));
aPos = ((amin * 60 * 75) + (asec * 75) + aframe) - 150; aPos = ((amin * 60 * 75) + (asec * 75) + aframe) - 150;
} }
else else
{ {
ulong expectedSectorAddress = sectorAddress + (ulong)(subPos / 96) + 150; ulong expectedSectorAddress = sectorAddress + (ulong)(subPos / 96) + 150;
smin = (byte)(expectedSectorAddress / 60 / 75); smin = (byte)(expectedSectorAddress / 60 / 75);
expectedSectorAddress -= (ulong)(smin * 60 * 75); expectedSectorAddress -= (ulong)(smin * 60 * 75);
ssec = (byte)(expectedSectorAddress / 75); ssec = (byte)(expectedSectorAddress / 75);
aPos = ((smin * 60 * 75) + (ssec * 75) + aframe) - 150; aPos = ((smin * 60 * 75) + (ssec * 75) + aframe) - 150;
@@ -253,7 +253,7 @@ namespace Aaru.Core.Media
static bool CheckIndexesFromSubchannel(byte[] deSub, Dictionary<byte, string> isrcs, byte currentTrack, static bool CheckIndexesFromSubchannel(byte[] deSub, Dictionary<byte, string> isrcs, byte currentTrack,
ref string mcn, Track[] tracks, DumpLog dumpLog, ref string mcn, Track[] tracks, DumpLog dumpLog,
UpdateStatusHandler updateStatus, UpdateStatusHandler updateStatus,
Dictionary<byte, int> smallestPregapLbaPerTrack) Dictionary<byte, int> smallestPregapLbaPerTrack, bool dumping)
{ {
bool status = false; bool status = false;
@@ -339,8 +339,10 @@ namespace Aaru.Core.Media
byte pframe = (byte)(((q[5] / 16) * 10) + (q[5] & 0x0F)); byte pframe = (byte)(((q[5] / 16) * 10) + (q[5] & 0x0F));
int qPos = (pmin * 60 * 75) + (psec * 75) + pframe; 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)) if(!smallestPregapLbaPerTrack.ContainsKey(trackNo))
smallestPregapLbaPerTrack[trackNo] = 1; smallestPregapLbaPerTrack[trackNo] = dumping ? 1 : 0;
if(qPos < smallestPregapLbaPerTrack[trackNo]) if(qPos < smallestPregapLbaPerTrack[trackNo])
{ {
@@ -383,10 +385,10 @@ namespace Aaru.Core.Media
if(q[2] == 0) if(q[2] == 0)
continue; continue;
byte amin = (byte)(((q[7] / 16) * 10) + (q[7] & 0x0F)); byte amin = (byte)(((q[7] / 16) * 10) + (q[7] & 0x0F));
byte asec = (byte)(((q[8] / 16) * 10) + (q[8] & 0x0F)); byte asec = (byte)(((q[8] / 16) * 10) + (q[8] & 0x0F));
byte aframe = (byte)(((q[9] / 16) * 10) + (q[9] & 0x0F)); byte aframe = (byte)(((q[9] / 16) * 10) + (q[9] & 0x0F));
int aPos = ((amin * 60 * 75) + (asec * 75) + aframe) - 150; int aPos = ((amin * 60 * 75) + (asec * 75) + aframe) - 150;
if(tracks[i].Indexes.ContainsKey(q[2]) && if(tracks[i].Indexes.ContainsKey(q[2]) &&
aPos >= tracks[i].Indexes[q[2]]) aPos >= tracks[i].Indexes[q[2]])
@@ -764,7 +766,7 @@ namespace Aaru.Core.Media
byte[] preQ = new byte[12]; byte[] preQ = new byte[12];
byte[] nextQ = new byte[12]; byte[] nextQ = new byte[12];
Array.Copy(deSub, (subPos + 12) - 96, preQ, 0, 12); Array.Copy(deSub, (subPos + 12) - 96, preQ, 0, 12);
Array.Copy(deSub, subPos + 12 + 96, nextQ, 0, 12); Array.Copy(deSub, subPos + 12 + 96, nextQ, 0, 12);
bool status; bool status;
CRC16CCITTContext.Data(preQ, 10, out byte[] preCrc); CRC16CCITTContext.Data(preQ, 10, out byte[] preCrc);
@@ -923,10 +925,10 @@ namespace Aaru.Core.Media
} }
} }
amin = (byte)(((q[7] / 16) * 10) + (q[7] & 0x0F)); amin = (byte)(((q[7] / 16) * 10) + (q[7] & 0x0F));
asec = (byte)(((q[8] / 16) * 10) + (q[8] & 0x0F)); asec = (byte)(((q[8] / 16) * 10) + (q[8] & 0x0F));
aframe = (byte)(((q[9] / 16) * 10) + (q[9] & 0x0F)); aframe = (byte)(((q[9] / 16) * 10) + (q[9] & 0x0F));
aPos = ((amin * 60 * 75) + (asec * 75) + aframe) - 150; aPos = ((amin * 60 * 75) + (asec * 75) + aframe) - 150;
pmin = (byte)(((q[3] / 16) * 10) + (q[3] & 0x0F)); pmin = (byte)(((q[3] / 16) * 10) + (q[3] & 0x0F));
psec = (byte)(((q[4] / 16) * 10) + (q[4] & 0x0F)); psec = (byte)(((q[4] / 16) * 10) + (q[4] & 0x0F));
@@ -1056,10 +1058,10 @@ namespace Aaru.Core.Media
if(preCrcOk) if(preCrcOk)
{ {
rmin = (byte)(((preQ[7] / 16) * 10) + (preQ[7] & 0x0F)); rmin = (byte)(((preQ[7] / 16) * 10) + (preQ[7] & 0x0F));
rsec = (byte)(((preQ[8] / 16) * 10) + (preQ[8] & 0x0F)); rsec = (byte)(((preQ[8] / 16) * 10) + (preQ[8] & 0x0F));
rframe = (byte)(((preQ[9] / 16) * 10) + (preQ[9] & 0x0F)); rframe = (byte)(((preQ[9] / 16) * 10) + (preQ[9] & 0x0F));
rPos = ((rmin * 60 * 75) + (rsec * 75) + rframe) - 150; rPos = ((rmin * 60 * 75) + (rsec * 75) + rframe) - 150;
dPos = aPos - rPos; dPos = aPos - rPos;
@@ -1113,10 +1115,10 @@ namespace Aaru.Core.Media
nextCrcOk && nextCrcOk &&
!fixedAbsPos) !fixedAbsPos)
{ {
rmin = (byte)(((nextQ[7] / 16) * 10) + (nextQ[7] & 0x0F)); rmin = (byte)(((nextQ[7] / 16) * 10) + (nextQ[7] & 0x0F));
rsec = (byte)(((nextQ[8] / 16) * 10) + (nextQ[8] & 0x0F)); rsec = (byte)(((nextQ[8] / 16) * 10) + (nextQ[8] & 0x0F));
rframe = (byte)(((nextQ[9] / 16) * 10) + (nextQ[9] & 0x0F)); rframe = (byte)(((nextQ[9] / 16) * 10) + (nextQ[9] & 0x0F));
rPos = ((rmin * 60 * 75) + (rsec * 75) + rframe) - 150; rPos = ((rmin * 60 * 75) + (rsec * 75) + rframe) - 150;
dPos = rPos - pPos; dPos = rPos - pPos;
@@ -1178,10 +1180,10 @@ namespace Aaru.Core.Media
if(preCrcOk) if(preCrcOk)
{ {
rmin = (byte)(((preQ[7] / 16) * 10) + (preQ[7] & 0x0F)); rmin = (byte)(((preQ[7] / 16) * 10) + (preQ[7] & 0x0F));
rsec = (byte)(((preQ[8] / 16) * 10) + (preQ[8] & 0x0F)); rsec = (byte)(((preQ[8] / 16) * 10) + (preQ[8] & 0x0F));
rframe = (byte)(((preQ[9] / 16) * 10) + (preQ[9] & 0x0F)); rframe = (byte)(((preQ[9] / 16) * 10) + (preQ[9] & 0x0F));
rPos = ((rmin * 60 * 75) + (rsec * 75) + rframe) - 150; rPos = ((rmin * 60 * 75) + (rsec * 75) + rframe) - 150;
dPos = aPos - rPos; dPos = aPos - rPos;
@@ -1215,10 +1217,10 @@ namespace Aaru.Core.Media
if(nextCrcOk) if(nextCrcOk)
{ {
rmin = (byte)(((nextQ[7] / 16) * 10) + (nextQ[7] & 0x0F)); rmin = (byte)(((nextQ[7] / 16) * 10) + (nextQ[7] & 0x0F));
rsec = (byte)(((nextQ[8] / 16) * 10) + (nextQ[8] & 0x0F)); rsec = (byte)(((nextQ[8] / 16) * 10) + (nextQ[8] & 0x0F));
rframe = (byte)(((nextQ[9] / 16) * 10) + (nextQ[9] & 0x0F)); rframe = (byte)(((nextQ[9] / 16) * 10) + (nextQ[9] & 0x0F));
rPos = ((rmin * 60 * 75) + (rsec * 75) + rframe) - 150; rPos = ((rmin * 60 * 75) + (rsec * 75) + rframe) - 150;
dPos = rPos - aPos; dPos = rPos - aPos;
@@ -1495,4 +1497,4 @@ namespace Aaru.Core.Media
endProgress?.Invoke(); endProgress?.Invoke();
} }
} }
} }

View File

@@ -676,17 +676,13 @@ namespace Aaru.Gui.ViewModels.Windows
}); });
foreach(MediaTagType mediaTag in _inputFormat.Info.ReadableMediaTags.Where(mediaTag => foreach(MediaTagType mediaTag in _inputFormat.Info.ReadableMediaTags.Where(mediaTag =>
!outputFormat. !outputFormat.SupportedMediaTags.Contains(mediaTag) && !ForceChecked))
SupportedMediaTags.
Contains(mediaTag) &&
!ForceChecked))
{ {
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager. await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error", GetMessageBoxStandardWindow("Error",
$"Converting image will lose media tag {mediaTag}, not continuing...", $"Converting image will lose media tag {mediaTag}, not continuing...",
icon: Icon. icon: Icon.Error).
Error). ShowDialog(_view));
ShowDialog(_view));
return; return;
} }
@@ -694,9 +690,7 @@ namespace Aaru.Gui.ViewModels.Windows
bool useLong = _inputFormat.Info.ReadableSectorTags.Count != 0; bool useLong = _inputFormat.Info.ReadableSectorTags.Count != 0;
foreach(SectorTagType sectorTag in _inputFormat.Info.ReadableSectorTags.Where(sectorTag => foreach(SectorTagType sectorTag in _inputFormat.Info.ReadableSectorTags.Where(sectorTag =>
!outputFormat. !outputFormat.SupportedSectorTags.Contains(sectorTag)))
SupportedSectorTags.
Contains(sectorTag)))
{ {
if(ForceChecked) if(ForceChecked)
{ {
@@ -709,11 +703,10 @@ namespace Aaru.Gui.ViewModels.Windows
} }
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager. await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error", GetMessageBoxStandardWindow("Error",
$"Converting image will lose sector tag {sectorTag}, not continuing...", $"Converting image will lose sector tag {sectorTag}, not continuing...",
icon: Icon. icon: Icon.Error).
Error). ShowDialog(_view));
ShowDialog(_view));
return; return;
} }
@@ -763,11 +756,10 @@ namespace Aaru.Gui.ViewModels.Windows
_inputFormat.Info.Sectors, _inputFormat.Info.SectorSize)) _inputFormat.Info.Sectors, _inputFormat.Info.SectorSize))
{ {
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager. await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error", GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} creating output image.", $"Error {outputFormat.ErrorMessage} creating output image.",
icon: Icon. icon: Icon.Error).
Error). ShowDialog(_view));
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} creating output image.", outputFormat.ErrorMessage); AaruConsole.ErrorWriteLine("Error {0} creating output image.", outputFormat.ErrorMessage);
@@ -810,12 +802,9 @@ namespace Aaru.Gui.ViewModels.Windows
if(ForceChecked != true) if(ForceChecked != true)
{ {
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager. await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error", GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} setting metadata, not continuing...", $"Error {outputFormat.ErrorMessage} setting metadata, not continuing...",
icon icon: Icon.Error).ShowDialog(_view));
: Icon.
Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("not continuing..."); AaruConsole.ErrorWriteLine("not continuing...");
@@ -841,12 +830,10 @@ namespace Aaru.Gui.ViewModels.Windows
if(!outputOptical.SetTracks(tracks)) if(!outputOptical.SetTracks(tracks))
{ {
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager. await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error", GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} sending tracks list to output image.", $"Error {outputFormat.ErrorMessage} sending tracks list to output image.",
icon: icon: Icon.Error).
Icon. ShowDialog(_view));
Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} sending tracks list to output image.", AaruConsole.ErrorWriteLine("Error {0} sending tracks list to output image.",
outputFormat.ErrorMessage); outputFormat.ErrorMessage);
@@ -881,12 +868,10 @@ namespace Aaru.Gui.ViewModels.Windows
else else
{ {
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager. await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error", GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} writing media tag, not continuing...", $"Error {outputFormat.ErrorMessage} writing media tag, not continuing...",
icon: icon: Icon.Error).
Icon. ShowDialog(_view));
Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} writing media tag, not continuing...", AaruConsole.ErrorWriteLine("Error {0} writing media tag, not continuing...",
outputFormat.ErrorMessage); outputFormat.ErrorMessage);
@@ -990,12 +975,9 @@ namespace Aaru.Gui.ViewModels.Windows
else else
{ {
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager. await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error", GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} writing sector {doneSectors}, not continuing...", $"Error {outputFormat.ErrorMessage} writing sector {doneSectors}, not continuing...",
icon icon: Icon.Error).ShowDialog(_view));
: Icon.
Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} writing sector {1}, not continuing...", AaruConsole.ErrorWriteLine("Error {0} writing sector {1}, not continuing...",
outputFormat.ErrorMessage, doneSectors); outputFormat.ErrorMessage, doneSectors);
@@ -1121,14 +1103,9 @@ namespace Aaru.Gui.ViewModels.Windows
track != null) track != null)
{ {
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw, bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
MmcSubchannel.Raw, sector, MmcSubchannel.Raw, sector, doneSectors, 1, null, isrcs,
doneSectors, 1, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks.ToArray(), subchannelExtents, false,
(byte)track.TrackSequence, outputFormat, false, false, null, null, smallestPregapLbaPerTrack, false);
ref mcn, tracks.ToArray(),
subchannelExtents, false,
outputFormat, false, false,
null, null,
smallestPregapLbaPerTrack);
if(indexesChanged) if(indexesChanged)
outputOptical.SetTracks(tracks.ToList()); outputOptical.SetTracks(tracks.ToList());
@@ -1148,15 +1125,9 @@ namespace Aaru.Gui.ViewModels.Windows
{ {
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw, bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
MmcSubchannel.Raw, sector, MmcSubchannel.Raw, sector, doneSectors, sectorsToDo, null, isrcs,
doneSectors, sectorsToDo, null, (byte)track.TrackSequence, ref mcn, tracks.ToArray(), subchannelExtents, false,
isrcs, outputFormat, false, false, null, null, smallestPregapLbaPerTrack, false);
(byte)track.TrackSequence,
ref mcn, tracks.ToArray(),
subchannelExtents, false,
outputFormat, false, false,
null, null,
smallestPregapLbaPerTrack);
if(indexesChanged) if(indexesChanged)
outputOptical.SetTracks(tracks.ToList()); outputOptical.SetTracks(tracks.ToList());
@@ -1178,12 +1149,10 @@ namespace Aaru.Gui.ViewModels.Windows
else else
{ {
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager. await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error", GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} writing sector {doneSectors}, not continuing...", $"Error {outputFormat.ErrorMessage} writing sector {doneSectors}, not continuing...",
icon icon: Icon.Error).
: Icon. ShowDialog(_view));
Error).
ShowDialog(_view));
AaruConsole.ErrorWriteLine("Error {0} writing sector {1}, not continuing...", AaruConsole.ErrorWriteLine("Error {0} writing sector {1}, not continuing...",
outputFormat.ErrorMessage, doneSectors); outputFormat.ErrorMessage, doneSectors);
@@ -1301,12 +1270,10 @@ namespace Aaru.Gui.ViewModels.Windows
else else
{ {
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager. await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error", GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} writing sector {doneSectors}, not continuing...", $"Error {outputFormat.ErrorMessage} writing sector {doneSectors}, not continuing...",
icon icon: Icon.Error).
: Icon. ShowDialog(_view));
Error).
ShowDialog(_view));
return; return;
} }
@@ -1323,9 +1290,8 @@ namespace Aaru.Gui.ViewModels.Windows
Progress2Value = Progress2MaxValue; Progress2Value = Progress2MaxValue;
}); });
foreach(SectorTagType tag in _inputFormat. foreach(SectorTagType tag in _inputFormat.Info.ReadableSectorTags.OrderBy(t => t).
Info.ReadableSectorTags.OrderBy(t => t). TakeWhile(tag => useLong && !_cancel))
TakeWhile(tag => useLong && !_cancel))
{ {
switch(tag) switch(tag)
{ {
@@ -1380,12 +1346,10 @@ namespace Aaru.Gui.ViewModels.Windows
{ {
await Dispatcher.UIThread.InvokeAsync(action: async () => await Dispatcher.UIThread.InvokeAsync(action: async () =>
await MessageBoxManager. await MessageBoxManager.
GetMessageBoxStandardWindow("Error", GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} writing tag, not continuing...", $"Error {outputFormat.ErrorMessage} writing tag, not continuing...",
icon icon: Icon.Error).
: Icon. ShowDialog(_view));
Error).
ShowDialog(_view));
return; return;
} }
@@ -1440,12 +1404,10 @@ namespace Aaru.Gui.ViewModels.Windows
else else
{ {
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager. await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error", GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} writing tag for sector {doneSectors}, not continuing...", $"Error {outputFormat.ErrorMessage} writing tag for sector {doneSectors}, not continuing...",
icon icon: Icon.Error).
: Icon. ShowDialog(_view));
Error).
ShowDialog(_view));
return; return;
} }
@@ -1523,11 +1485,10 @@ namespace Aaru.Gui.ViewModels.Windows
if(!outputFormat.Close()) if(!outputFormat.Close())
{ {
await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager. await Dispatcher.UIThread.InvokeAsync(action: async () => await MessageBoxManager.
GetMessageBoxStandardWindow("Error", GetMessageBoxStandardWindow("Error",
$"Error {outputFormat.ErrorMessage} closing output image... Contents are not correct.", $"Error {outputFormat.ErrorMessage} closing output image... Contents are not correct.",
icon: Icon. icon: Icon.Error).
Error). ShowDialog(_view));
ShowDialog(_view));
return; return;
} }

View File

@@ -525,8 +525,8 @@ namespace Aaru.Commands.Image
// Try name // Try name
else else
candidates.AddRange(plugins.WritableImages.Values.Where(t => string.Equals(t.Name, format, candidates.AddRange(plugins.WritableImages.Values.Where(t => string.Equals(t.Name, format,
StringComparison. StringComparison.
InvariantCultureIgnoreCase))); InvariantCultureIgnoreCase)));
if(candidates.Count == 0) if(candidates.Count == 0)
{ {
@@ -557,10 +557,7 @@ namespace Aaru.Commands.Image
} }
foreach(MediaTagType mediaTag in inputFormat.Info.ReadableMediaTags.Where(mediaTag => foreach(MediaTagType mediaTag in inputFormat.Info.ReadableMediaTags.Where(mediaTag =>
!outputFormat. !outputFormat.SupportedMediaTags.Contains(mediaTag) && !force))
SupportedMediaTags.
Contains(mediaTag) &&
!force))
{ {
AaruConsole.ErrorWriteLine("Converting image will lose media tag {0}, not continuing...", mediaTag); AaruConsole.ErrorWriteLine("Converting image will lose media tag {0}, not continuing...", mediaTag);
AaruConsole.ErrorWriteLine("If you don't care, use force option."); 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; bool useLong = inputFormat.Info.ReadableSectorTags.Count != 0;
foreach(SectorTagType sectorTag in inputFormat.Info.ReadableSectorTags.Where(sectorTag => foreach(SectorTagType sectorTag in inputFormat.Info.ReadableSectorTags.Where(sectorTag =>
!outputFormat. !outputFormat.SupportedSectorTags.Contains(sectorTag)))
SupportedSectorTags.
Contains(sectorTag)))
{ {
if(force) if(force)
{ {
@@ -639,9 +634,7 @@ namespace Aaru.Commands.Image
List<DumpHardwareType> dumpHardware = inputFormat.DumpHardware; List<DumpHardwareType> dumpHardware = inputFormat.DumpHardware;
foreach(MediaTagType mediaTag in inputFormat.Info.ReadableMediaTags.Where(mediaTag => foreach(MediaTagType mediaTag in inputFormat.Info.ReadableMediaTags.Where(mediaTag =>
!force || outputFormat. !force || outputFormat.SupportedMediaTags.Contains(mediaTag)))
SupportedMediaTags.
Contains(mediaTag)))
{ {
AaruConsole.WriteLine("Converting media tag {0}", mediaTag); AaruConsole.WriteLine("Converting media tag {0}", mediaTag);
byte[] tag = inputFormat.ReadDiskTag(mediaTag); byte[] tag = inputFormat.ReadDiskTag(mediaTag);
@@ -692,7 +685,7 @@ namespace Aaru.Commands.Image
sectorsToDo = (uint)(trackSectors - doneSectors); sectorsToDo = (uint)(trackSectors - doneSectors);
AaruConsole.Write("\rConverting sectors {0} to {1} in track {3} ({2:P2} done)", AaruConsole.Write("\rConverting sectors {0} to {1} in track {3} ({2:P2} done)",
doneSectors + track.TrackStartSector, doneSectors + track.TrackStartSector,
doneSectors + sectorsToDo + track.TrackStartSector, doneSectors + sectorsToDo + track.TrackStartSector,
(doneSectors + track.TrackStartSector) / (double)inputFormat.Info.Sectors, (doneSectors + track.TrackStartSector) / (double)inputFormat.Info.Sectors,
track.TrackSequence); track.TrackSequence);
@@ -833,8 +826,8 @@ namespace Aaru.Commands.Image
subchannelExtents.Add((int)s); subchannelExtents.Add((int)s);
} }
foreach(SectorTagType tag in inputFormat. foreach(SectorTagType tag in inputFormat.Info.ReadableSectorTags.OrderBy(t => t).
Info.ReadableSectorTags.OrderBy(t => t).TakeWhile(tag => useLong)) TakeWhile(tag => useLong))
{ {
switch(tag) switch(tag)
{ {
@@ -896,7 +889,7 @@ namespace Aaru.Commands.Image
sectorsToDo = (uint)(trackSectors - doneSectors); sectorsToDo = (uint)(trackSectors - doneSectors);
AaruConsole.Write("\rConverting tag {4} for sectors {0} to {1} in track {3} ({2:P2} done)", AaruConsole.Write("\rConverting tag {4} for sectors {0} to {1} in track {3} ({2:P2} done)",
doneSectors + track.TrackStartSector, doneSectors + track.TrackStartSector,
doneSectors + sectorsToDo + track.TrackStartSector, doneSectors + sectorsToDo + track.TrackStartSector,
(doneSectors + track.TrackStartSector) / (double)inputFormat.Info.Sectors, (doneSectors + track.TrackStartSector) / (double)inputFormat.Info.Sectors,
track.TrackSequence, tag); track.TrackSequence, tag);
@@ -908,19 +901,10 @@ namespace Aaru.Commands.Image
if(tag == SectorTagType.CdSectorSubchannel) if(tag == SectorTagType.CdSectorSubchannel)
{ {
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw, bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
MmcSubchannel.Raw, sector, MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, null,
doneSectors + isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents,
track.TrackStartSector, 1, fixSubchannelPosition, outputFormat, fixSubchannel, fixSubchannelCrc, null,
null, isrcs, null, smallestPregapLbaPerTrack, false);
(byte)track.TrackSequence,
ref mcn, tracks,
subchannelExtents,
fixSubchannelPosition,
outputFormat,
fixSubchannel,
fixSubchannelCrc, null,
null,
smallestPregapLbaPerTrack);
if(indexesChanged) if(indexesChanged)
outputOptical.SetTracks(tracks.ToList()); outputOptical.SetTracks(tracks.ToList());
@@ -939,19 +923,10 @@ namespace Aaru.Commands.Image
if(tag == SectorTagType.CdSectorSubchannel) if(tag == SectorTagType.CdSectorSubchannel)
{ {
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw, bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
MmcSubchannel.Raw, sector, MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector,
doneSectors + sectorsToDo, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks,
track.TrackStartSector, subchannelExtents, fixSubchannelPosition, outputFormat, fixSubchannel,
sectorsToDo, null, isrcs, fixSubchannelCrc, null, null, smallestPregapLbaPerTrack, false);
(byte)track.TrackSequence,
ref mcn, tracks,
subchannelExtents,
fixSubchannelPosition,
outputFormat,
fixSubchannel,
fixSubchannelCrc, null,
null,
smallestPregapLbaPerTrack);
if(indexesChanged) if(indexesChanged)
outputOptical.SetTracks(tracks.ToList()); outputOptical.SetTracks(tracks.ToList());