mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
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:
@@ -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;
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
};
|
||||
|
||||
@@ -981,7 +981,7 @@ namespace Aaru.DiscImages
|
||||
return false;
|
||||
}
|
||||
|
||||
trackFlags.Add((byte)track.TrackSequence, data[0]);
|
||||
trackFlags.Add((byte)sectorAddress, data[0]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user