mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Do not set INDEX 1 to a value higher than what the TOC already said.
This commit is contained in:
@@ -270,7 +270,8 @@ namespace Aaru.Core.Devices.Dumping
|
|||||||
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
|
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
|
||||||
desiredSubchannel, sub, i + r, 1, subLog, isrcs, 1, ref mcn, tracks,
|
desiredSubchannel, sub, i + r, 1, subLog, isrcs, 1, ref mcn, tracks,
|
||||||
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
|
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
|
||||||
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true);
|
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true,
|
||||||
|
out List<ulong> _);
|
||||||
|
|
||||||
// Set tracks and go back
|
// Set tracks and go back
|
||||||
if(indexesChanged)
|
if(indexesChanged)
|
||||||
@@ -355,12 +356,17 @@ namespace Aaru.Core.Devices.Dumping
|
|||||||
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
|
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
|
||||||
desiredSubchannel, sub, i, blocksToRead, subLog, isrcs, 1, ref mcn, tracks,
|
desiredSubchannel, sub, i, blocksToRead, subLog, isrcs, 1, ref mcn, tracks,
|
||||||
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
|
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
|
||||||
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true);
|
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true,
|
||||||
|
out List<ulong> newPregapSectors);
|
||||||
|
|
||||||
// Set tracks and go back
|
// Set tracks and go back
|
||||||
if(indexesChanged)
|
if(indexesChanged)
|
||||||
{
|
{
|
||||||
(_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList());
|
(_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList());
|
||||||
|
|
||||||
|
foreach(ulong newPregapSector in newPregapSectors)
|
||||||
|
_resume.BadBlocks.Add(newPregapSector);
|
||||||
|
|
||||||
i -= blocksToRead;
|
i -= blocksToRead;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -508,12 +508,16 @@ 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, true);
|
smallestPregapLbaPerTrack, true, out List<ulong> newPregapSectors);
|
||||||
|
|
||||||
// Set tracks and go back
|
// Set tracks and go back
|
||||||
if(indexesChanged)
|
if(indexesChanged)
|
||||||
{
|
{
|
||||||
(_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList());
|
(_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList());
|
||||||
|
|
||||||
|
foreach(ulong newPregapSector in newPregapSectors)
|
||||||
|
_resume.BadBlocks.Add(newPregapSector);
|
||||||
|
|
||||||
i -= blocksToRead;
|
i -= blocksToRead;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
@@ -652,12 +656,16 @@ namespace Aaru.Core.Devices.Dumping
|
|||||||
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);
|
true, out List<ulong> newPregapSectors);
|
||||||
|
|
||||||
// Set tracks and go back
|
// Set tracks and go back
|
||||||
if(indexesChanged)
|
if(indexesChanged)
|
||||||
{
|
{
|
||||||
(_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList());
|
(_outputPlugin as IWritableOpticalImage).SetTracks(tracks.ToList());
|
||||||
|
|
||||||
|
foreach(ulong newPregapSector in newPregapSectors)
|
||||||
|
_resume.BadBlocks.Add(newPregapSector);
|
||||||
|
|
||||||
i -= blocksToRead;
|
i -= blocksToRead;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -367,7 +367,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, true);
|
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, out _);
|
||||||
|
|
||||||
// Set tracks and go back
|
// Set tracks and go back
|
||||||
if(!indexesChanged)
|
if(!indexesChanged)
|
||||||
@@ -499,7 +499,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, true);
|
smallestPregapLbaPerTrack, true, out _);
|
||||||
|
|
||||||
// Set tracks and go back
|
// Set tracks and go back
|
||||||
if(indexesChanged)
|
if(indexesChanged)
|
||||||
@@ -662,7 +662,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, true);
|
smallestPregapLbaPerTrack, true, out _);
|
||||||
|
|
||||||
if(subchannelExtents.Contains(bs))
|
if(subchannelExtents.Contains(bs))
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -163,7 +163,7 @@ namespace Aaru.Core.Devices.Dumping
|
|||||||
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
|
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
|
||||||
desiredSubchannel, sub, i, _maximumReadable, subLog, isrcs, 0xAA, ref mcn, tracks,
|
desiredSubchannel, sub, i, _maximumReadable, subLog, isrcs, 0xAA, ref mcn, tracks,
|
||||||
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
|
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
|
||||||
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true);
|
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, out _);
|
||||||
|
|
||||||
// Set tracks and go back
|
// Set tracks and go back
|
||||||
if(indexesChanged)
|
if(indexesChanged)
|
||||||
@@ -331,7 +331,7 @@ namespace Aaru.Core.Devices.Dumping
|
|||||||
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
|
bool indexesChanged = Media.CompactDisc.WriteSubchannelToImage(supportedSubchannel,
|
||||||
desiredSubchannel, sub, i, _maximumReadable, subLog, isrcs, 0xAA, ref mcn, tracks,
|
desiredSubchannel, sub, i, _maximumReadable, subLog, isrcs, 0xAA, ref mcn, tracks,
|
||||||
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
|
subchannelExtents, _fixSubchannelPosition, _outputPlugin, _fixSubchannel,
|
||||||
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true);
|
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, out _);
|
||||||
|
|
||||||
// Set tracks and go back
|
// Set tracks and go back
|
||||||
if(indexesChanged)
|
if(indexesChanged)
|
||||||
|
|||||||
@@ -271,7 +271,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, true);
|
_fixSubchannelCrc, _dumpLog, UpdateStatus, smallestPregapLbaPerTrack, true, out _);
|
||||||
|
|
||||||
// Set tracks and go back
|
// Set tracks and go back
|
||||||
if(!indexesChanged)
|
if(!indexesChanged)
|
||||||
|
|||||||
@@ -72,7 +72,8 @@ 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, bool dumping)
|
Dictionary<byte, int> smallestPregapLbaPerTrack, bool dumping,
|
||||||
|
out List<ulong> newPregapSectors)
|
||||||
{
|
{
|
||||||
// We need to work in PW raw subchannels
|
// We need to work in PW raw subchannels
|
||||||
if(supportedSubchannel == MmcSubchannel.Q16)
|
if(supportedSubchannel == MmcSubchannel.Q16)
|
||||||
@@ -88,8 +89,9 @@ 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, dumping);
|
updateStatus, smallestPregapLbaPerTrack, dumping,
|
||||||
|
out newPregapSectors);
|
||||||
|
|
||||||
if(!fixSubchannelPosition ||
|
if(!fixSubchannelPosition ||
|
||||||
desiredSubchannel == MmcSubchannel.None)
|
desiredSubchannel == MmcSubchannel.None)
|
||||||
@@ -313,9 +315,11 @@ 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, bool dumping)
|
Dictionary<byte, int> smallestPregapLbaPerTrack, bool dumping,
|
||||||
|
out List<ulong> newPregapSectors)
|
||||||
{
|
{
|
||||||
bool status = false;
|
bool status = false;
|
||||||
|
newPregapSectors = new List<ulong>();
|
||||||
|
|
||||||
// Check subchannel
|
// Check subchannel
|
||||||
for(int subPos = 0; subPos < deSub.Length; subPos += 96)
|
for(int subPos = 0; subPos < deSub.Length; subPos += 96)
|
||||||
@@ -437,6 +441,9 @@ namespace Aaru.Core.Media
|
|||||||
updateStatus?.
|
updateStatus?.
|
||||||
Invoke($"Pregap for track {trackNo} set to {tracks[i].TrackPregap} sectors.");
|
Invoke($"Pregap for track {trackNo} set to {tracks[i].TrackPregap} sectors.");
|
||||||
|
|
||||||
|
for(var p = 0; p < dif; p++)
|
||||||
|
newPregapSectors.Add(tracks[i].TrackStartSector + (ulong)p);
|
||||||
|
|
||||||
status = true;
|
status = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -458,6 +465,9 @@ namespace Aaru.Core.Media
|
|||||||
updateStatus?.
|
updateStatus?.
|
||||||
Invoke($"Pregap for track {trackNo} set to {tracks[i].TrackPregap} sectors.");
|
Invoke($"Pregap for track {trackNo} set to {tracks[i].TrackPregap} sectors.");
|
||||||
|
|
||||||
|
for(var p = 0; p < (int)(tracks[i].TrackPregap - oldPregap); p++)
|
||||||
|
newPregapSectors.Add(tracks[i].TrackStartSector + (ulong)p);
|
||||||
|
|
||||||
status = true;
|
status = true;
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
@@ -471,6 +481,11 @@ namespace Aaru.Core.Media
|
|||||||
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;
|
||||||
|
|
||||||
|
// Do not set INDEX 1 to a value higher than what the TOC already said.
|
||||||
|
if(q[2] == 1 &&
|
||||||
|
aPos > (int)tracks[i].TrackStartSector)
|
||||||
|
continue;
|
||||||
|
|
||||||
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]])
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -301,7 +301,7 @@ namespace Aaru.Tests.Issues
|
|||||||
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
|
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
|
||||||
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, null,
|
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, null,
|
||||||
isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, true,
|
isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents, true,
|
||||||
outputOptical, true, true, null, null, smallestPregapLbaPerTrack, false);
|
outputOptical, true, true, null, null, smallestPregapLbaPerTrack, false, out _);
|
||||||
|
|
||||||
if(indexesChanged)
|
if(indexesChanged)
|
||||||
outputOptical.SetTracks(tracks.ToList());
|
outputOptical.SetTracks(tracks.ToList());
|
||||||
@@ -321,7 +321,7 @@ namespace Aaru.Tests.Issues
|
|||||||
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
|
bool indexesChanged = CompactDisc.WriteSubchannelToImage(MmcSubchannel.Raw,
|
||||||
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, sectorsToDo,
|
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, sectorsToDo,
|
||||||
null, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents,
|
null, isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents,
|
||||||
true, outputOptical, true, true, null, null, smallestPregapLbaPerTrack, false);
|
true, outputOptical, true, true, null, null, smallestPregapLbaPerTrack, false, out _);
|
||||||
|
|
||||||
if(indexesChanged)
|
if(indexesChanged)
|
||||||
outputOptical.SetTracks(tracks.ToList());
|
outputOptical.SetTracks(tracks.ToList());
|
||||||
|
|||||||
@@ -359,7 +359,7 @@ namespace Aaru.Tests.WritableImages
|
|||||||
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1,
|
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1,
|
||||||
null, isrcs, (byte)track.TrackSequence, ref mcn, tracks,
|
null, isrcs, (byte)track.TrackSequence, ref mcn, tracks,
|
||||||
subchannelExtents, true, outputFormat, true, true, null, null,
|
subchannelExtents, true, outputFormat, true, true, null, null,
|
||||||
smallestPregapLbaPerTrack, false);
|
smallestPregapLbaPerTrack, false, out _);
|
||||||
|
|
||||||
if(indexesChanged)
|
if(indexesChanged)
|
||||||
outputFormat.SetTracks(tracks.ToList());
|
outputFormat.SetTracks(tracks.ToList());
|
||||||
@@ -382,7 +382,7 @@ namespace Aaru.Tests.WritableImages
|
|||||||
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector,
|
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector,
|
||||||
sectorsToDo, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks,
|
sectorsToDo, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks,
|
||||||
subchannelExtents, true, outputFormat, true, true, null, null,
|
subchannelExtents, true, outputFormat, true, true, null, null,
|
||||||
smallestPregapLbaPerTrack, false);
|
smallestPregapLbaPerTrack, false, out _);
|
||||||
|
|
||||||
if(indexesChanged)
|
if(indexesChanged)
|
||||||
outputFormat.SetTracks(tracks.ToList());
|
outputFormat.SetTracks(tracks.ToList());
|
||||||
|
|||||||
@@ -949,7 +949,7 @@ namespace Aaru.Commands.Image
|
|||||||
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, null,
|
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector, 1, null,
|
||||||
isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents,
|
isrcs, (byte)track.TrackSequence, ref mcn, tracks, subchannelExtents,
|
||||||
fixSubchannelPosition, outputFormat, fixSubchannel, fixSubchannelCrc, null,
|
fixSubchannelPosition, outputFormat, fixSubchannel, fixSubchannelCrc, null,
|
||||||
null, smallestPregapLbaPerTrack, false);
|
null, smallestPregapLbaPerTrack, false, out _);
|
||||||
|
|
||||||
if(indexesChanged)
|
if(indexesChanged)
|
||||||
outputOptical.SetTracks(tracks.ToList());
|
outputOptical.SetTracks(tracks.ToList());
|
||||||
@@ -971,7 +971,7 @@ namespace Aaru.Commands.Image
|
|||||||
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector,
|
MmcSubchannel.Raw, sector, doneSectors + track.TrackStartSector,
|
||||||
sectorsToDo, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks,
|
sectorsToDo, null, isrcs, (byte)track.TrackSequence, ref mcn, tracks,
|
||||||
subchannelExtents, fixSubchannelPosition, outputFormat, fixSubchannel,
|
subchannelExtents, fixSubchannelPosition, outputFormat, fixSubchannel,
|
||||||
fixSubchannelCrc, null, null, smallestPregapLbaPerTrack, false);
|
fixSubchannelCrc, null, null, smallestPregapLbaPerTrack, false, out _);
|
||||||
|
|
||||||
if(indexesChanged)
|
if(indexesChanged)
|
||||||
outputOptical.SetTracks(tracks.ToList());
|
outputOptical.SetTracks(tracks.ToList());
|
||||||
|
|||||||
Reference in New Issue
Block a user