Change how ISRC and track flags are read from / written to images, to use track number instead of track start.

This commit is contained in:
2020-06-14 23:45:26 +01:00
parent 5013718280
commit d1a970698e
18 changed files with 108 additions and 91 deletions

View File

@@ -829,7 +829,7 @@ namespace Aaru.Core.Devices.Dumping
_outputPlugin.WriteSectorTag(new[]
{
kvp.Value
}, track.TrackStartSector, SectorTagType.CdTrackFlags);
}, kvp.Key, SectorTagType.CdTrackFlags);
}
// Set MCN
@@ -1144,9 +1144,7 @@ namespace Aaru.Core.Devices.Dumping
foreach(KeyValuePair<byte, string> isrc in isrcs)
{
// TODO: Track tags
Track track = tracks.First(t => t.TrackSequence == isrc.Key);
if(!_outputPlugin.WriteSectorTag(Encoding.ASCII.GetBytes(isrc.Value), track.TrackStartSector,
if(!_outputPlugin.WriteSectorTag(Encoding.ASCII.GetBytes(isrc.Value), isrc.Key,
SectorTagType.CdTrackIsrc))
continue;

View File

@@ -790,13 +790,11 @@ namespace Aaru.Gui.ViewModels.Windows
var metadata = new ImageInfo
{
Application = "Aaru", ApplicationVersion = Version.GetVersion(),
Comments = CommentsText,
Application = "Aaru", ApplicationVersion = Version.GetVersion(), Comments = CommentsText,
Creator = CreatorText, DriveFirmwareRevision = DriveFirmwareRevisionText,
DriveManufacturer = DriveManufacturerText, DriveModel = DriveModelText,
DriveSerialNumber = DriveSerialNumberText, LastMediaSequence = (int)LastMediaSequenceValue,
MediaBarcode = MediaBarcodeText, MediaManufacturer = MediaManufacturerText,
MediaModel = MediaModelText,
MediaBarcode = MediaBarcodeText, MediaManufacturer = MediaManufacturerText, MediaModel = MediaModelText,
MediaPartNumber = MediaPartNumberText, MediaSequence = (int)MediaSequenceValue,
MediaSerialNumber = MediaSerialNumberText, MediaTitle = MediaTitleText
};
@@ -1275,8 +1273,8 @@ namespace Aaru.Gui.ViewModels.Windows
case SectorTagType.CdTrackFlags:
case SectorTagType.CdTrackIsrc:
sector = inputFormat.ReadSectorTag(track.TrackStartSector, tag);
result = outputFormat.WriteSectorTag(sector, track.TrackStartSector, tag);
sector = inputFormat.ReadSectorTag(track.TrackSequence, tag);
result = outputFormat.WriteSectorTag(sector, track.TrackSequence, tag);
if(!result)
if(ForceChecked)

View File

@@ -1337,12 +1337,12 @@ namespace Aaru.DiscImages
case SectorTagType.CdSectorSubHeader:
case SectorTagType.CdSectorSync: break;
case SectorTagType.CdTrackFlags:
return trackFlags.TryGetValue((byte)trk.TrackSequence, out byte flags) ? new[]
return trackFlags.TryGetValue((byte)sectorAddress, out byte flags) ? new[]
{
flags
} : null;
case SectorTagType.CdTrackIsrc:
return trackIsrcs.TryGetValue((byte)trk.TrackSequence, out string isrc)
return trackIsrcs.TryGetValue((byte)sectorAddress, out string isrc)
? Encoding.UTF8.GetBytes(isrc) : null;
default: throw new ArgumentException("Unsupported tag requested", nameof(tag));
}

View File

@@ -3461,6 +3461,25 @@ namespace Aaru.DiscImages
{
case SectorTagType.CdTrackFlags:
case SectorTagType.CdTrackIsrc:
if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
{
ErrorMessage = "Incorrect tag for disk type";
return false;
}
track = Tracks.FirstOrDefault(trk => sectorAddress == trk.TrackSequence);
if(track.TrackSequence == 0 &&
track.TrackStartSector == 0 &&
track.TrackEndSector == 0)
{
ErrorMessage = $"Can't find track {sectorAddress}";
return false;
}
break;
case SectorTagType.CdSectorSubchannel:
if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
{
@@ -3495,7 +3514,7 @@ namespace Aaru.DiscImages
return false;
}
trackFlags.Add((byte)track.TrackSequence, data[0]);
trackFlags.Add((byte)sectorAddress, data[0]);
return true;
}
@@ -3503,7 +3522,7 @@ namespace Aaru.DiscImages
case SectorTagType.CdTrackIsrc:
{
if(data != null)
trackIsrcs.Add((byte)track.TrackSequence, Encoding.UTF8.GetString(data));
trackIsrcs.Add((byte)sectorAddress, Encoding.UTF8.GetString(data));
return true;
}

View File

@@ -902,6 +902,9 @@ namespace Aaru.DiscImages
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
{
if(tag == SectorTagType.CdTrackFlags)
track = (uint)sectorAddress;
if(!alcTracks.TryGetValue((int)track, out AlcoholTrack alcTrack) ||
!alcTrackExtras.TryGetValue((int)track, out AlcoholTrackExtra alcExtra))
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image");
@@ -1399,13 +1402,10 @@ namespace Aaru.DiscImages
1, alcTrack.startLba
}
},
TrackStartSector = alcTrack.startLba,
TrackEndSector = alcExtra.sectors - 1,
TrackPregap = alcExtra.pregap, TrackSession = sessionNo,
TrackSequence = alcTrack.point,
TrackStartSector = alcTrack.startLba, TrackEndSector = alcExtra.sectors - 1,
TrackPregap = alcExtra.pregap, TrackSession = sessionNo, TrackSequence = alcTrack.point,
TrackType = AlcoholTrackTypeToTrackType(alcTrack.mode), TrackFilter = alcImage,
TrackFile = alcImage.GetFilename(),
TrackFileOffset = alcTrack.startOffset,
TrackFile = alcImage.GetFilename(), TrackFileOffset = alcTrack.startOffset,
TrackFileType = "BINARY", TrackRawBytesPerSector = alcTrack.sectorSize,
TrackBytesPerSector = AlcoholTrackModeToCookedBytesPerSector(alcTrack.mode)
};

View File

@@ -981,7 +981,7 @@ namespace Aaru.DiscImages
return false;
}
trackFlags.Add((byte)track.TrackSequence, data[0]);
trackFlags.Add((byte)sectorAddress, data[0]);
return true;
}

View File

@@ -992,7 +992,7 @@ namespace Aaru.DiscImages
case SectorTagType.CdSectorSubHeader:
case SectorTagType.CdSectorSync: break;
case SectorTagType.CdTrackFlags:
if(trackFlags.TryGetValue(track, out byte flag))
if(trackFlags.TryGetValue((uint)sectorAddress, out byte flag))
return new[]
{
flag

View File

@@ -1406,7 +1406,7 @@ namespace Aaru.DiscImages
case SectorTagType.CdSectorSubHeader:
case SectorTagType.CdSectorSync: break;
case SectorTagType.CdTrackFlags:
if(trackFlags.TryGetValue(track, out byte flag))
if(trackFlags.TryGetValue((uint)sectorAddress, out byte flag))
return new[]
{
flag

View File

@@ -359,8 +359,7 @@ namespace Aaru.DiscImages
string[] lengthString = matchPregap.Groups["address"].Value.Split(':');
currenttrack.Pregap = (ulong.Parse(lengthString[0]) * 60 * 75) +
(ulong.Parse(lengthString[1]) * 75) +
ulong.Parse(lengthString[2]);
(ulong.Parse(lengthString[1]) * 75) + ulong.Parse(lengthString[2]);
}
else
currenttrack.Pregap = currenttrack.Sectors;
@@ -1058,6 +1057,10 @@ namespace Aaru.DiscImages
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
{
if(tag == SectorTagType.CdTrackFlags ||
tag == SectorTagType.CdTrackIsrc)
track = (uint)sectorAddress;
var aaruTrack = new CdrdaoTrack
{
Sequence = 0

View File

@@ -659,14 +659,14 @@ namespace Aaru.DiscImages
return false;
}
trackFlags.Add((byte)track.TrackSequence, data[0]);
trackFlags.Add((byte)sectorAddress, data[0]);
return true;
}
case SectorTagType.CdTrackIsrc:
{
if(data != null)
trackIsrcs.Add((byte)track.TrackSequence, Encoding.UTF8.GetString(data));
trackIsrcs.Add((byte)sectorAddress, Encoding.UTF8.GetString(data));
return true;
}

View File

@@ -1518,6 +1518,10 @@ namespace Aaru.DiscImages
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
{
if(tag == SectorTagType.CdTrackFlags ||
tag == SectorTagType.CdTrackIsrc)
track = (uint)sectorAddress;
var aaruTrack = new CdrWinTrack
{
Sequence = 0

View File

@@ -571,14 +571,14 @@ namespace Aaru.DiscImages
return false;
}
_trackFlags.Add((byte)track.TrackSequence, data[0]);
_trackFlags.Add((byte)sectorAddress, data[0]);
return true;
}
case SectorTagType.CdTrackIsrc:
{
if(data != null)
_trackIsrcs.Add((byte)track.TrackSequence, Encoding.UTF8.GetString(data));
_trackIsrcs.Add((byte)sectorAddress, Encoding.UTF8.GetString(data));
return true;
}

View File

@@ -939,6 +939,9 @@ namespace Aaru.DiscImages
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
{
if(tag == SectorTagType.CdTrackFlags)
track = (uint)sectorAddress;
var aaruTrack = new Track
{
TrackSequence = 0

View File

@@ -340,12 +340,9 @@ namespace Aaru.DiscImages
// Lead-out
trackDescriptors.Add(new FullTOC.TrackDataDescriptor
{
SessionNumber = currentSession, POINT = 0xB0, ADR = 5,
CONTROL = 0,
HOUR = 0, Min = leadoutAmsf.minute, Sec = leadoutAmsf.second,
Frame = leadoutAmsf.frame,
PHOUR = 2, PMIN = leadoutPmsf.minute, PSEC = leadoutPmsf.second,
PFRAME = leadoutPmsf.frame
SessionNumber = currentSession, POINT = 0xB0, ADR = 5, CONTROL = 0,
HOUR = 0, Min = leadoutAmsf.minute, Sec = leadoutAmsf.second, Frame = leadoutAmsf.frame,
PHOUR = 2, PMIN = leadoutPmsf.minute, PSEC = leadoutPmsf.second, PFRAME = leadoutPmsf.frame
});
// This seems to be constant? It should not exist on CD-ROM but CloneCD creates them anyway
@@ -384,10 +381,8 @@ namespace Aaru.DiscImages
// Lead-out start
trackDescriptors.Add(new FullTOC.TrackDataDescriptor
{
SessionNumber = currentSession, POINT = 0xA2, ADR = 1,
CONTROL = trackControl,
PHOUR = 0, PMIN = leadinPmsf.minute, PSEC = leadinPmsf.second,
PFRAME = leadinPmsf.frame
SessionNumber = currentSession, POINT = 0xA2, ADR = 1, CONTROL = trackControl,
PHOUR = 0, PMIN = leadinPmsf.minute, PSEC = leadinPmsf.second, PFRAME = leadinPmsf.frame
});
}
@@ -397,8 +392,7 @@ namespace Aaru.DiscImages
trackDescriptors.Add(new FullTOC.TrackDataDescriptor
{
SessionNumber = (byte)track.TrackSession, POINT = (byte)track.TrackSequence, ADR = 1,
CONTROL = trackControl, PHOUR = 0, PMIN = pmsf.minute,
PSEC = pmsf.second,
CONTROL = trackControl, PHOUR = 0, PMIN = pmsf.minute, PSEC = pmsf.second,
PFRAME = pmsf.frame
});
}
@@ -511,7 +505,7 @@ namespace Aaru.DiscImages
return false;
}
trackFlags.Add((byte)track.TrackSequence, data[0]);
trackFlags.Add((byte)sectorAddress, data[0]);
return true;
}
@@ -616,7 +610,7 @@ namespace Aaru.DiscImages
subStream.Seek((long)(track.TrackSubchannelOffset + ((sectorAddress - track.TrackStartSector) * 96)),
SeekOrigin.Begin);
subStream.Write(Decoders.CD.Subchannel.Deinterleave(data), 0, data.Length);
subStream.Write(Subchannel.Deinterleave(data), 0, data.Length);
return true;
}

View File

@@ -844,6 +844,9 @@ namespace Aaru.DiscImages
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
{
if(tag == SectorTagType.CdTrackFlags)
track = (uint)sectorAddress;
var aaruTrack = new Track
{
TrackSequence = 0

View File

@@ -479,6 +479,9 @@ namespace Aaru.DiscImages
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
{
if(tag == SectorTagType.CdTrackFlags)
track = (uint)sectorAddress;
if(track == 0)
{
if(sectorAddress + length > densitySeparationSectors)
@@ -828,10 +831,8 @@ namespace Aaru.DiscImages
Indexes = new Dictionary<int, ulong>(), TrackDescription = null,
TrackStartSector = gdiTrack.StartSector, TrackPregap = gdiTrack.Pregap,
TrackSession = (ushort)(gdiTrack.HighDensity ? 2 : 1), TrackSequence = gdiTrack.Sequence,
TrackType = gdiTrack.Tracktype,
TrackFilter = gdiTrack.Trackfilter,
TrackFile = gdiTrack.Trackfile,
TrackFileOffset = (ulong)gdiTrack.Offset,
TrackType = gdiTrack.Tracktype, TrackFilter = gdiTrack.Trackfilter,
TrackFile = gdiTrack.Trackfile, TrackFileOffset = (ulong)gdiTrack.Offset,
TrackFileType = "BINARY", TrackRawBytesPerSector = gdiTrack.Bps,
TrackBytesPerSector = gdiTrack.Tracktype == TrackType.Data ? 2048 : 2352,
TrackSubchannelType = TrackSubchannelType.None

View File

@@ -315,10 +315,8 @@ namespace Aaru.DiscImages
var neroTrack = new NeroTrack
{
EndOfTrack = entry.EndOfTrack, Isrc = entry.Isrc,
Length = entry.EndOfTrack - entry.Index0, Mode = entry.Mode,
Offset = entry.Index0,
SectorSize = entry.SectorSize, StartLba = imageInfo.Sectors,
Index0 = entry.Index0,
Length = entry.EndOfTrack - entry.Index0, Mode = entry.Mode, Offset = entry.Index0,
SectorSize = entry.SectorSize, StartLba = imageInfo.Sectors, Index0 = entry.Index0,
Index1 = entry.Index1, Sequence = currenttrack
};
@@ -426,10 +424,8 @@ namespace Aaru.DiscImages
var neroTrack = new NeroTrack
{
EndOfTrack = entry.EndOfTrack, Isrc = entry.Isrc,
Length = entry.EndOfTrack - entry.Index0, Mode = entry.Mode,
Offset = entry.Index0,
SectorSize = entry.SectorSize, StartLba = imageInfo.Sectors,
Index0 = entry.Index0,
Length = entry.EndOfTrack - entry.Index0, Mode = entry.Mode, Offset = entry.Index0,
SectorSize = entry.SectorSize, StartLba = imageInfo.Sectors, Index0 = entry.Index0,
Index1 = entry.Index1, Sequence = currenttrack
};
@@ -960,11 +956,9 @@ namespace Aaru.DiscImages
var partition = new Partition
{
Description = $"Track {track.TrackSequence} Index 1",
Size = neroTrack.EndOfTrack - neroTrack.Index1,
Name = StringHandlers.CToString(neroTrack.Isrc),
Size = neroTrack.EndOfTrack - neroTrack.Index1, Name = StringHandlers.CToString(neroTrack.Isrc),
Sequence = partitionSequence, Offset = partitionStartByte,
Start = neroTrack.StartLba +
((neroTrack.Index1 - neroTrack.Index0) / neroTrack.SectorSize),
Start = neroTrack.StartLba + ((neroTrack.Index1 - neroTrack.Index0) / neroTrack.SectorSize),
Type = NeroTrackModeToTrackType((DaoMode)neroTrack.Mode).ToString()
};
@@ -992,13 +986,11 @@ namespace Aaru.DiscImages
(DaoMode)neroTracks.ElementAt(i).Value.Mode == DaoMode.AudioSub);
// First track is data
firstdata |= i == 0 &&
(DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio &&
firstdata |= i == 0 && (DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio &&
(DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.AudioSub;
// Any non first track is data
data |= i != 0 &&
(DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio &&
data |= i != 0 && (DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio &&
(DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.AudioSub;
// Any non first track is audio
@@ -1226,6 +1218,10 @@ namespace Aaru.DiscImages
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
{
if(tag == SectorTagType.CdTrackFlags ||
tag == SectorTagType.CdTrackIsrc)
track = (uint)sectorAddress;
if(!neroTracks.TryGetValue(track, out NeroTrack aaruTrack))
throw new ArgumentOutOfRangeException(nameof(track), "Track not found");

View File

@@ -526,10 +526,8 @@ namespace Aaru.Commands.Image
var metadata = new ImageInfo
{
Application = "Aaru",
ApplicationVersion = Version.GetVersion(),
Comments = comments ?? inputFormat.Info.Comments,
Creator = creator ?? inputFormat.Info.Creator,
Application = "Aaru", ApplicationVersion = Version.GetVersion(),
Comments = comments ?? inputFormat.Info.Comments, Creator = creator ?? inputFormat.Info.Creator,
DriveFirmwareRevision = driveFirmwareRevision ?? inputFormat.Info.DriveFirmwareRevision,
DriveManufacturer = driveManufacturer ?? inputFormat.Info.DriveManufacturer,
DriveModel = driveModel ?? inputFormat.Info.DriveModel,
@@ -729,8 +727,8 @@ namespace Aaru.Commands.Image
track.TrackSequence,
track.TrackSequence / (double)inputOptical.Tracks.Count);
sector = inputFormat.ReadSectorTag(track.TrackStartSector, tag);
result = outputFormat.WriteSectorTag(sector, track.TrackStartSector, tag);
sector = inputFormat.ReadSectorTag(track.TrackSequence, tag);
result = outputFormat.WriteSectorTag(sector, track.TrackSequence, tag);
if(!result)
if(force)