From b0f01f53f08bb83c68731dc2a286bb50ba9fe3ce Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 18 Jul 2020 20:43:37 +0100 Subject: [PATCH] Handle discs that have pregap ending in LBA 1 instead of ending in LBA 0. --- .../Devices/Dumping/CompactDisc/CdiReady.cs | 27 +++++++--- Aaru.Core/Devices/Dumping/CompactDisc/Data.cs | 9 ++-- Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs | 20 ++++--- .../Devices/Dumping/CompactDisc/Error.cs | 35 ++++++++---- .../Devices/Dumping/CompactDisc/LeadOuts.cs | 32 ++++++++--- Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs | 6 ++- Aaru.Core/Media/CompactDisc.cs | 34 ++++++++++-- .../Windows/ImageConvertViewModel.cs | 32 +++++++---- Aaru/Commands/Image/Convert.cs | 53 +++++++++++++------ 9 files changed, 179 insertions(+), 69 deletions(-) diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/CdiReady.cs b/Aaru.Core/Devices/Dumping/CompactDisc/CdiReady.cs index 802107e9f..1286fa41b 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/CdiReady.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/CdiReady.cs @@ -147,7 +147,7 @@ namespace Aaru.Core.Devices.Dumping MmcSubchannel supportedSubchannel, ref double totalDuration, Track[] tracks, SubchannelLog subLog, MmcSubchannel desiredSubchannel, Dictionary isrcs, ref string mcn, HashSet subchannelExtents, ulong blocks, bool cdiReadyReadAsAudio, - int offsetBytes, int sectorsForOffset) + int offsetBytes, int sectorsForOffset, Dictionary smallestPregapLbaPerTrack) { ulong sectorSpeedStart = 0; // Used to calculate correct speed DateTime timeSpeedStart = DateTime.UtcNow; // Time of start for speed calculation @@ -270,9 +270,16 @@ 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); + desiredSubchannel, sub, + i + r, 1, subLog, isrcs, + 1, ref mcn, tracks, + subchannelExtents, + _fixSubchannelPosition, + _outputPlugin, + _fixSubchannel, + _fixSubchannelCrc, + _dumpLog, UpdateStatus, + smallestPregapLbaPerTrack); // Set tracks and go back if(indexesChanged) @@ -355,9 +362,15 @@ 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); + desiredSubchannel, sub, i, + blocksToRead, subLog, isrcs, 1, + ref mcn, tracks, + subchannelExtents, + _fixSubchannelPosition, + _outputPlugin, _fixSubchannel, + _fixSubchannelCrc, _dumpLog, + UpdateStatus, + smallestPregapLbaPerTrack); // Set tracks and go back if(indexesChanged) diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs index c86e49ca6..4d1562114 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Data.cs @@ -86,7 +86,8 @@ namespace Aaru.Core.Devices.Dumping bool read12, bool read16, bool readcd, int sectorsForOffset, uint subSize, MmcSubchannel supportedSubchannel, bool supportsLongSectors, ref double totalDuration, Track[] tracks, SubchannelLog subLog, MmcSubchannel desiredSubchannel, - Dictionary isrcs, ref string mcn, HashSet subchannelExtents) + Dictionary isrcs, ref string mcn, HashSet subchannelExtents, + Dictionary smallestPregapLbaPerTrack) { ulong sectorSpeedStart = 0; // Used to calculate correct speed DateTime timeSpeedStart = DateTime.UtcNow; // Time of start for speed calculation @@ -407,7 +408,8 @@ namespace Aaru.Core.Devices.Dumping _outputPlugin, _fixSubchannel, _fixSubchannelCrc, - _dumpLog, UpdateStatus); + _dumpLog, UpdateStatus, + smallestPregapLbaPerTrack); // Set tracks and go back if(indexesChanged) @@ -546,7 +548,8 @@ namespace Aaru.Core.Devices.Dumping _fixSubchannelPosition, _outputPlugin, _fixSubchannel, _fixSubchannelCrc, _dumpLog, - UpdateStatus); + UpdateStatus, + smallestPregapLbaPerTrack); // Set tracks and go back if(indexesChanged) diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs index dd44b195f..edfc5412d 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Dump.cs @@ -119,6 +119,7 @@ namespace Aaru.Core.Devices.Dumping bool cdiReadyReadAsAudio = false; Dictionary mediaTags = new Dictionary(); // Media tags + Dictionary smallestPregapLbaPerTrack = new Dictionary(); MediaType dskType = MediaType.CD; @@ -406,7 +407,7 @@ namespace Aaru.Core.Devices.Dumping } if(!(_outputPlugin as IWritableOpticalImage).OpticalCapabilities.HasFlag(OpticalImageCapabilities. - CanStorePregaps) && + CanStorePregaps) && tracks.Where(track => track.TrackSequence != tracks.First(t => t.TrackSession == track.TrackSession).TrackSequence). Any(track => track.TrackPregap > 0)) @@ -795,7 +796,7 @@ namespace Aaru.Core.Devices.Dumping // If a subchannel is supported, check if output plugin allows us to write it. if(desiredSubchannel != MmcSubchannel.None && !(_outputPlugin as IWritableOpticalImage).OpticalCapabilities.HasFlag(OpticalImageCapabilities. - CanStoreSubchannelRw)) + CanStoreSubchannelRw)) { _dumpLog.WriteLine("Output image does not support subchannels, {0}continuing...", _force ? "" : "not "); @@ -1128,20 +1129,22 @@ namespace Aaru.Core.Devices.Dumping ReadCdiReady(blockSize, ref currentSpeed, currentTry, extents, ibgLog, ref imageWriteDuration, leadOutExtents, ref maxSpeed, mhddLog, ref minSpeed, subSize, supportedSubchannel, ref totalDuration, tracks, subLog, desiredSubchannel, isrcs, ref mcn, - subchannelExtents, blocks, cdiReadyReadAsAudio, offsetBytes, sectorsForOffset); + subchannelExtents, blocks, cdiReadyReadAsAudio, offsetBytes, sectorsForOffset, + smallestPregapLbaPerTrack); } ReadCdData(audioExtents, blocks, blockSize, ref currentSpeed, currentTry, extents, ibgLog, ref imageWriteDuration, lastSector, leadOutExtents, ref maxSpeed, mhddLog, ref minSpeed, out newTrim, tracks[0].TrackType != TrackType.Audio, offsetBytes, read6, read10, read12, read16, readcd, sectorsForOffset, subSize, supportedSubchannel, supportsLongSectors, ref totalDuration, - tracks, subLog, desiredSubchannel, isrcs, ref mcn, subchannelExtents); + tracks, subLog, desiredSubchannel, isrcs, ref mcn, subchannelExtents, smallestPregapLbaPerTrack); // TODO: Enable when underlying images support lead-outs /* DumpCdLeadOuts(blocks, blockSize, ref currentSpeed, currentTry, extents, ibgLog, ref imageWriteDuration, leadOutExtents, ref maxSpeed, mhddLog, ref minSpeed, read6, read10, read12, read16, readcd, - supportedSubchannel, subSize, ref totalDuration, subLog, desiredSubchannel, isrcs, ref mcn, tracks); + supportedSubchannel, subSize, ref totalDuration, subLog, desiredSubchannel, isrcs, ref mcn, tracks, + smallestPregapLbaPerTrack); */ end = DateTime.UtcNow; @@ -1168,11 +1171,12 @@ namespace Aaru.Core.Devices.Dumping TrimCdUserData(audioExtents, blockSize, currentTry, extents, newTrim, offsetBytes, read6, read10, read12, read16, readcd, sectorsForOffset, subSize, supportedSubchannel, supportsLongSectors, - ref totalDuration, subLog, desiredSubchannel, tracks, isrcs, ref mcn, subchannelExtents); + ref totalDuration, subLog, desiredSubchannel, tracks, isrcs, ref mcn, subchannelExtents, + smallestPregapLbaPerTrack); RetryCdUserData(audioExtents, blockSize, currentTry, extents, offsetBytes, readcd, sectorsForOffset, subSize, supportedSubchannel, ref totalDuration, subLog, desiredSubchannel, tracks, isrcs, - ref mcn, subchannelExtents); + ref mcn, subchannelExtents, smallestPregapLbaPerTrack); foreach(Tuple leadoutExtent in leadOutExtents.ToArray()) { @@ -1184,7 +1188,7 @@ namespace Aaru.Core.Devices.Dumping _retryPasses > 0 && _retrySubchannel) RetrySubchannel(readcd, subSize, supportedSubchannel, ref totalDuration, subLog, desiredSubchannel, - tracks, isrcs, ref mcn, subchannelExtents); + tracks, isrcs, ref mcn, subchannelExtents, smallestPregapLbaPerTrack); // Write media tags to image if(!_aborted) diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs index 12c757e17..83079ceaf 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Error.cs @@ -55,7 +55,8 @@ namespace Aaru.Core.Devices.Dumping ExtentsULong extents, int offsetBytes, bool readcd, int sectorsForOffset, uint subSize, MmcSubchannel supportedSubchannel, ref double totalDuration, SubchannelLog subLog, MmcSubchannel desiredSubchannel, Track[] tracks, Dictionary isrcs, - ref string mcn, HashSet subchannelExtents) + ref string mcn, HashSet subchannelExtents, + Dictionary smallestPregapLbaPerTrack) { bool sense = true; // Sense indicator byte[] cmdBuf = null; // Data buffer @@ -293,9 +294,15 @@ namespace Aaru.Core.Devices.Dumping _outputPlugin.WriteSectorLong(data, badSector); 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); + desiredSubchannel, sub, badSector, 1, + subLog, isrcs, + (byte)track.TrackSequence, ref mcn, + tracks, subchannelExtents, + _fixSubchannelPosition, + _outputPlugin, _fixSubchannel, + _fixSubchannelCrc, _dumpLog, + UpdateStatus, + smallestPregapLbaPerTrack); // Set tracks and go back if(indexesChanged) @@ -412,9 +419,17 @@ namespace Aaru.Core.Devices.Dumping _outputPlugin.WriteSectorLong(data, badSector); 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); + desiredSubchannel, sub, + badSector, 1, subLog, isrcs, + (byte)track.TrackSequence, + ref mcn, tracks, + subchannelExtents, + _fixSubchannelPosition, + _outputPlugin, + _fixSubchannel, + _fixSubchannelCrc, _dumpLog, + UpdateStatus, + smallestPregapLbaPerTrack); // Set tracks and go back if(indexesChanged) @@ -458,7 +473,8 @@ namespace Aaru.Core.Devices.Dumping void RetrySubchannel(bool readcd, uint subSize, MmcSubchannel supportedSubchannel, ref double totalDuration, SubchannelLog subLog, MmcSubchannel desiredSubchannel, Track[] tracks, - Dictionary isrcs, ref string mcn, HashSet subchannelExtents) + Dictionary isrcs, ref string mcn, HashSet subchannelExtents, + Dictionary smallestPregapLbaPerTrack) { bool sense = true; // Sense indicator byte[] cmdBuf = null; // Data buffer @@ -559,7 +575,8 @@ namespace Aaru.Core.Devices.Dumping Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel, desiredSubchannel, cmdBuf, badSector, 5, subLog, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, _fixSubchannelPosition, _outputPlugin, - _fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus); + _fixSubchannel, _fixSubchannelCrc, _dumpLog, UpdateStatus, + smallestPregapLbaPerTrack); if(subchannelExtents.Contains(tmpArray[i])) continue; diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/LeadOuts.cs b/Aaru.Core/Devices/Dumping/CompactDisc/LeadOuts.cs index 88ed249ff..020c65271 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/LeadOuts.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/LeadOuts.cs @@ -75,7 +75,8 @@ namespace Aaru.Core.Devices.Dumping bool read6, bool read10, bool read12, bool read16, bool readcd, MmcSubchannel supportedSubchannel, uint subSize, ref double totalDuration, SubchannelLog subLog, MmcSubchannel desiredSubchannel, Dictionary isrcs, - ref string mcn, Track[] tracks, HashSet subchannelExtents) + ref string mcn, Track[] tracks, HashSet subchannelExtents, + Dictionary smallestPregapLbaPerTrack) { byte[] cmdBuf = null; // Data buffer const uint sectorSize = 2352; // Full sector size @@ -161,9 +162,16 @@ 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); + desiredSubchannel, sub, i, + _maximumReadable, subLog, + isrcs, 0xAA, ref mcn, tracks, + subchannelExtents, + _fixSubchannelPosition, + _outputPlugin, + _fixSubchannel, + _fixSubchannelCrc, _dumpLog, + UpdateStatus, + smallestPregapLbaPerTrack); // Set tracks and go back if(indexesChanged) @@ -244,7 +252,8 @@ namespace Aaru.Core.Devices.Dumping bool read6, bool read10, bool read12, bool read16, bool readcd, MmcSubchannel supportedSubchannel, uint subSize, ref double totalDuration, SubchannelLog subLog, MmcSubchannel desiredSubchannel, Dictionary isrcs, - ref string mcn, Track[] tracks, HashSet subchannelExtents) + ref string mcn, Track[] tracks, HashSet subchannelExtents, + Dictionary smallestPregapLbaPerTrack) { byte[] cmdBuf = null; // Data buffer const uint sectorSize = 2352; // Full sector size @@ -330,9 +339,16 @@ 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); + desiredSubchannel, sub, i, + _maximumReadable, subLog, + isrcs, 0xAA, ref mcn, tracks, + subchannelExtents, + _fixSubchannelPosition, + _outputPlugin, + _fixSubchannel, + _fixSubchannelCrc, _dumpLog, + UpdateStatus, + smallestPregapLbaPerTrack); // Set tracks and go back if(indexesChanged) diff --git a/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs b/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs index 04cd02be5..503053f98 100644 --- a/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs +++ b/Aaru.Core/Devices/Dumping/CompactDisc/Trim.cs @@ -53,7 +53,8 @@ namespace Aaru.Core.Devices.Dumping bool read16, bool readcd, int sectorsForOffset, uint subSize, MmcSubchannel supportedSubchannel, bool supportsLongSectors, ref double totalDuration, SubchannelLog subLog, MmcSubchannel desiredSubchannel, Track[] tracks, - Dictionary isrcs, ref string mcn, HashSet subchannelExtents) + Dictionary isrcs, ref string mcn, HashSet subchannelExtents, + Dictionary smallestPregapLbaPerTrack) { DateTime start; DateTime end; @@ -201,7 +202,8 @@ namespace Aaru.Core.Devices.Dumping _fixSubchannelPosition, _outputPlugin, _fixSubchannel, _fixSubchannelCrc, _dumpLog, - UpdateStatus); + UpdateStatus, + smallestPregapLbaPerTrack); // Set tracks and go back if(!indexesChanged) diff --git a/Aaru.Core/Media/CompactDisc.cs b/Aaru.Core/Media/CompactDisc.cs index ec8eb24a4..1989c0669 100644 --- a/Aaru.Core/Media/CompactDisc.cs +++ b/Aaru.Core/Media/CompactDisc.cs @@ -20,7 +20,8 @@ namespace Aaru.Core.Media Track[] tracks, HashSet subchannelExtents, bool fixSubchannelPosition, IWritableImage outputPlugin, bool fixSubchannel, bool fixSubchannelCrc, DumpLog dumpLog, - UpdateStatusHandler updateStatus) + UpdateStatusHandler updateStatus, + Dictionary smallestPregapLbaPerTrack) { if(supportedSubchannel == MmcSubchannel.Q16) sub = Subchannel.ConvertQToRaw(sub); @@ -34,8 +35,8 @@ namespace Aaru.Core.Media byte[] deSub = Subchannel.Deinterleave(sub); - bool indexesChanged = - CheckIndexesFromSubchannel(deSub, isrcs, currentTrack, ref mcn, tracks, dumpLog, updateStatus); + bool indexesChanged = CheckIndexesFromSubchannel(deSub, isrcs, currentTrack, ref mcn, tracks, dumpLog, + updateStatus, smallestPregapLbaPerTrack); if(!fixSubchannelPosition || desiredSubchannel == MmcSubchannel.None) @@ -228,7 +229,8 @@ namespace Aaru.Core.Media static bool CheckIndexesFromSubchannel(byte[] deSub, Dictionary isrcs, byte currentTrack, ref string mcn, Track[] tracks, DumpLog dumpLog, - UpdateStatusHandler updateStatus) + UpdateStatusHandler updateStatus, + Dictionary smallestPregapLbaPerTrack) { bool status = false; @@ -314,12 +316,34 @@ namespace Aaru.Core.Media byte pframe = (byte)(((q[5] / 16) * 10) + (q[5] & 0x0F)); int qPos = (pmin * 60 * 75) + (psec * 75) + pframe; + if(!smallestPregapLbaPerTrack.ContainsKey(trackNo)) + smallestPregapLbaPerTrack[trackNo] = 1; + + if(qPos < smallestPregapLbaPerTrack[trackNo]) + { + int dif = smallestPregapLbaPerTrack[trackNo] - qPos; + tracks[i].TrackPregap += (ulong)dif; + tracks[i].TrackStartSector -= (ulong)dif; + smallestPregapLbaPerTrack[trackNo] = qPos; + + if(i > 0) + tracks[i - 1].TrackEndSector = tracks[i].TrackStartSector - 1; + + dumpLog?. + WriteLine($"Pregap for track {trackNo} set to {tracks[i].TrackPregap} sectors."); + + updateStatus?. + Invoke($"Pregap for track {trackNo} set to {tracks[i].TrackPregap} sectors."); + + status = true; + } + if(tracks[i].TrackPregap >= (ulong)qPos) continue; ulong oldPregap = tracks[i].TrackPregap; - tracks[i].TrackPregap = (ulong)qPos + 1; + tracks[i].TrackPregap = (ulong)qPos; tracks[i].TrackStartSector -= tracks[i].TrackPregap - oldPregap; if(i > 0) diff --git a/Aaru.Gui/ViewModels/Windows/ImageConvertViewModel.cs b/Aaru.Gui/ViewModels/Windows/ImageConvertViewModel.cs index 228e1ae26..c7226c631 100644 --- a/Aaru.Gui/ViewModels/Windows/ImageConvertViewModel.cs +++ b/Aaru.Gui/ViewModels/Windows/ImageConvertViewModel.cs @@ -1010,10 +1010,11 @@ namespace Aaru.Gui.ViewModels.Windows Progress2Value = Progress2MaxValue; }); - Dictionary isrcs = new Dictionary(); - Dictionary trackFlags = new Dictionary(); - string mcn = null; - HashSet subchannelExtents = new HashSet(); + Dictionary isrcs = new Dictionary(); + Dictionary trackFlags = new Dictionary(); + string mcn = null; + HashSet subchannelExtents = new HashSet(); + Dictionary smallestPregapLbaPerTrack = new Dictionary(); foreach(SectorTagType tag in inputFormat.Info.ReadableSectorTags. Where(t => t == SectorTagType.CdTrackIsrc).OrderBy(t => t)) @@ -1119,9 +1120,14 @@ 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); + MmcSubchannel.Raw, sector, + doneSectors, 1, null, isrcs, + (byte)track.TrackSequence, + ref mcn, tracks.ToArray(), + subchannelExtents, false, + outputFormat, false, false, + null, null, + smallestPregapLbaPerTrack); if(indexesChanged) outputOptical.SetTracks(tracks.ToList()); @@ -1141,9 +1147,15 @@ 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); + MmcSubchannel.Raw, sector, + doneSectors, sectorsToDo, null, + isrcs, + (byte)track.TrackSequence, + ref mcn, tracks.ToArray(), + subchannelExtents, false, + outputFormat, false, false, + null, null, + smallestPregapLbaPerTrack); if(indexesChanged) outputOptical.SetTracks(tracks.ToList()); diff --git a/Aaru/Commands/Image/Convert.cs b/Aaru/Commands/Image/Convert.cs index 8010ce362..9ca538b3a 100644 --- a/Aaru/Commands/Image/Convert.cs +++ b/Aaru/Commands/Image/Convert.cs @@ -496,8 +496,8 @@ namespace Aaru.Commands.Image // Try name else candidates.AddRange(plugins.WritableImages.Values.Where(t => string.Equals(t.Name, format, - StringComparison. - InvariantCultureIgnoreCase))); + StringComparison. + InvariantCultureIgnoreCase))); if(candidates.Count == 0) { @@ -660,7 +660,7 @@ namespace Aaru.Commands.Image sectorsToDo = (uint)(trackSectors - doneSectors); AaruConsole.Write("\rConverting sectors {0} to {1} in track {3} ({2:P2} done)", - doneSectors + track.TrackStartSector, + doneSectors + track.TrackStartSector, doneSectors + sectorsToDo + track.TrackStartSector, (doneSectors + track.TrackStartSector) / (double)inputFormat.Info.Sectors, track.TrackSequence); @@ -737,11 +737,12 @@ namespace Aaru.Commands.Image AaruConsole.WriteLine(); - Dictionary isrcs = new Dictionary(); - Dictionary trackFlags = new Dictionary(); - string mcn = null; - HashSet subchannelExtents = new HashSet(); - Track[] tracks = inputOptical.Tracks.ToArray(); + Dictionary isrcs = new Dictionary(); + Dictionary trackFlags = new Dictionary(); + string mcn = null; + HashSet subchannelExtents = new HashSet(); + Track[] tracks = inputOptical.Tracks.ToArray(); + Dictionary smallestPregapLbaPerTrack = new Dictionary(); foreach(SectorTagType tag in inputFormat.Info.ReadableSectorTags. Where(t => t == SectorTagType.CdTrackIsrc).OrderBy(t => t)) @@ -844,7 +845,7 @@ namespace Aaru.Commands.Image sectorsToDo = (uint)(trackSectors - doneSectors); 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 + track.TrackStartSector) / (double)inputFormat.Info.Sectors, track.TrackSequence, tag); @@ -856,10 +857,19 @@ 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); + MmcSubchannel.Raw, sector, + doneSectors + + track.TrackStartSector, 1, + null, isrcs, + (byte)track.TrackSequence, + ref mcn, tracks, + subchannelExtents, + fixSubchannelPosition, + outputFormat, + fixSubchannel, + fixSubchannelCrc, null, + null, + smallestPregapLbaPerTrack); if(indexesChanged) outputOptical.SetTracks(tracks.ToList()); @@ -878,10 +888,19 @@ 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); + MmcSubchannel.Raw, sector, + doneSectors + + track.TrackStartSector, + sectorsToDo, null, isrcs, + (byte)track.TrackSequence, + ref mcn, tracks, + subchannelExtents, + fixSubchannelPosition, + outputFormat, + fixSubchannel, + fixSubchannelCrc, null, + null, + smallestPregapLbaPerTrack); if(indexesChanged) outputOptical.SetTracks(tracks.ToList());