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[]
|
_outputPlugin.WriteSectorTag(new[]
|
||||||
{
|
{
|
||||||
kvp.Value
|
kvp.Value
|
||||||
}, track.TrackStartSector, SectorTagType.CdTrackFlags);
|
}, kvp.Key, SectorTagType.CdTrackFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set MCN
|
// Set MCN
|
||||||
@@ -1144,9 +1144,7 @@ namespace Aaru.Core.Devices.Dumping
|
|||||||
foreach(KeyValuePair<byte, string> isrc in isrcs)
|
foreach(KeyValuePair<byte, string> isrc in isrcs)
|
||||||
{
|
{
|
||||||
// TODO: Track tags
|
// TODO: Track tags
|
||||||
Track track = tracks.First(t => t.TrackSequence == isrc.Key);
|
if(!_outputPlugin.WriteSectorTag(Encoding.ASCII.GetBytes(isrc.Value), isrc.Key,
|
||||||
|
|
||||||
if(!_outputPlugin.WriteSectorTag(Encoding.ASCII.GetBytes(isrc.Value), track.TrackStartSector,
|
|
||||||
SectorTagType.CdTrackIsrc))
|
SectorTagType.CdTrackIsrc))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|||||||
@@ -790,15 +790,13 @@ namespace Aaru.Gui.ViewModels.Windows
|
|||||||
|
|
||||||
var metadata = new ImageInfo
|
var metadata = new ImageInfo
|
||||||
{
|
{
|
||||||
Application = "Aaru", ApplicationVersion = Version.GetVersion(),
|
Application = "Aaru", ApplicationVersion = Version.GetVersion(), Comments = CommentsText,
|
||||||
Comments = CommentsText,
|
Creator = CreatorText, DriveFirmwareRevision = DriveFirmwareRevisionText,
|
||||||
Creator = CreatorText, DriveFirmwareRevision = DriveFirmwareRevisionText,
|
DriveManufacturer = DriveManufacturerText, DriveModel = DriveModelText,
|
||||||
DriveManufacturer = DriveManufacturerText, DriveModel = DriveModelText,
|
|
||||||
DriveSerialNumber = DriveSerialNumberText, LastMediaSequence = (int)LastMediaSequenceValue,
|
DriveSerialNumber = DriveSerialNumberText, LastMediaSequence = (int)LastMediaSequenceValue,
|
||||||
MediaBarcode = MediaBarcodeText, MediaManufacturer = MediaManufacturerText,
|
MediaBarcode = MediaBarcodeText, MediaManufacturer = MediaManufacturerText, MediaModel = MediaModelText,
|
||||||
MediaModel = MediaModelText,
|
MediaPartNumber = MediaPartNumberText, MediaSequence = (int)MediaSequenceValue,
|
||||||
MediaPartNumber = MediaPartNumberText, MediaSequence = (int)MediaSequenceValue,
|
MediaSerialNumber = MediaSerialNumberText, MediaTitle = MediaTitleText
|
||||||
MediaSerialNumber = MediaSerialNumberText, MediaTitle = MediaTitleText
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if(!cancel)
|
if(!cancel)
|
||||||
@@ -1275,8 +1273,8 @@ namespace Aaru.Gui.ViewModels.Windows
|
|||||||
case SectorTagType.CdTrackFlags:
|
case SectorTagType.CdTrackFlags:
|
||||||
case SectorTagType.CdTrackIsrc:
|
case SectorTagType.CdTrackIsrc:
|
||||||
|
|
||||||
sector = inputFormat.ReadSectorTag(track.TrackStartSector, tag);
|
sector = inputFormat.ReadSectorTag(track.TrackSequence, tag);
|
||||||
result = outputFormat.WriteSectorTag(sector, track.TrackStartSector, tag);
|
result = outputFormat.WriteSectorTag(sector, track.TrackSequence, tag);
|
||||||
|
|
||||||
if(!result)
|
if(!result)
|
||||||
if(ForceChecked)
|
if(ForceChecked)
|
||||||
|
|||||||
@@ -1337,12 +1337,12 @@ namespace Aaru.DiscImages
|
|||||||
case SectorTagType.CdSectorSubHeader:
|
case SectorTagType.CdSectorSubHeader:
|
||||||
case SectorTagType.CdSectorSync: break;
|
case SectorTagType.CdSectorSync: break;
|
||||||
case SectorTagType.CdTrackFlags:
|
case SectorTagType.CdTrackFlags:
|
||||||
return trackFlags.TryGetValue((byte)trk.TrackSequence, out byte flags) ? new[]
|
return trackFlags.TryGetValue((byte)sectorAddress, out byte flags) ? new[]
|
||||||
{
|
{
|
||||||
flags
|
flags
|
||||||
} : null;
|
} : null;
|
||||||
case SectorTagType.CdTrackIsrc:
|
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;
|
? Encoding.UTF8.GetBytes(isrc) : null;
|
||||||
default: throw new ArgumentException("Unsupported tag requested", nameof(tag));
|
default: throw new ArgumentException("Unsupported tag requested", nameof(tag));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3461,6 +3461,25 @@ namespace Aaru.DiscImages
|
|||||||
{
|
{
|
||||||
case SectorTagType.CdTrackFlags:
|
case SectorTagType.CdTrackFlags:
|
||||||
case SectorTagType.CdTrackIsrc:
|
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:
|
case SectorTagType.CdSectorSubchannel:
|
||||||
if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
|
if(imageInfo.XmlMediaType != XmlMediaType.OpticalDisc)
|
||||||
{
|
{
|
||||||
@@ -3495,7 +3514,7 @@ namespace Aaru.DiscImages
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
trackFlags.Add((byte)track.TrackSequence, data[0]);
|
trackFlags.Add((byte)sectorAddress, data[0]);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -3503,7 +3522,7 @@ namespace Aaru.DiscImages
|
|||||||
case SectorTagType.CdTrackIsrc:
|
case SectorTagType.CdTrackIsrc:
|
||||||
{
|
{
|
||||||
if(data != null)
|
if(data != null)
|
||||||
trackIsrcs.Add((byte)track.TrackSequence, Encoding.UTF8.GetString(data));
|
trackIsrcs.Add((byte)sectorAddress, Encoding.UTF8.GetString(data));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -902,6 +902,9 @@ namespace Aaru.DiscImages
|
|||||||
|
|
||||||
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
|
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) ||
|
if(!alcTracks.TryGetValue((int)track, out AlcoholTrack alcTrack) ||
|
||||||
!alcTrackExtras.TryGetValue((int)track, out AlcoholTrackExtra alcExtra))
|
!alcTrackExtras.TryGetValue((int)track, out AlcoholTrackExtra alcExtra))
|
||||||
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image");
|
throw new ArgumentOutOfRangeException(nameof(track), "Track does not exist in disc image");
|
||||||
@@ -1399,13 +1402,10 @@ namespace Aaru.DiscImages
|
|||||||
1, alcTrack.startLba
|
1, alcTrack.startLba
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
TrackStartSector = alcTrack.startLba,
|
TrackStartSector = alcTrack.startLba, TrackEndSector = alcExtra.sectors - 1,
|
||||||
TrackEndSector = alcExtra.sectors - 1,
|
TrackPregap = alcExtra.pregap, TrackSession = sessionNo, TrackSequence = alcTrack.point,
|
||||||
TrackPregap = alcExtra.pregap, TrackSession = sessionNo,
|
|
||||||
TrackSequence = alcTrack.point,
|
|
||||||
TrackType = AlcoholTrackTypeToTrackType(alcTrack.mode), TrackFilter = alcImage,
|
TrackType = AlcoholTrackTypeToTrackType(alcTrack.mode), TrackFilter = alcImage,
|
||||||
TrackFile = alcImage.GetFilename(),
|
TrackFile = alcImage.GetFilename(), TrackFileOffset = alcTrack.startOffset,
|
||||||
TrackFileOffset = alcTrack.startOffset,
|
|
||||||
TrackFileType = "BINARY", TrackRawBytesPerSector = alcTrack.sectorSize,
|
TrackFileType = "BINARY", TrackRawBytesPerSector = alcTrack.sectorSize,
|
||||||
TrackBytesPerSector = AlcoholTrackModeToCookedBytesPerSector(alcTrack.mode)
|
TrackBytesPerSector = AlcoholTrackModeToCookedBytesPerSector(alcTrack.mode)
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -981,7 +981,7 @@ namespace Aaru.DiscImages
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
trackFlags.Add((byte)track.TrackSequence, data[0]);
|
trackFlags.Add((byte)sectorAddress, data[0]);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -992,7 +992,7 @@ namespace Aaru.DiscImages
|
|||||||
case SectorTagType.CdSectorSubHeader:
|
case SectorTagType.CdSectorSubHeader:
|
||||||
case SectorTagType.CdSectorSync: break;
|
case SectorTagType.CdSectorSync: break;
|
||||||
case SectorTagType.CdTrackFlags:
|
case SectorTagType.CdTrackFlags:
|
||||||
if(trackFlags.TryGetValue(track, out byte flag))
|
if(trackFlags.TryGetValue((uint)sectorAddress, out byte flag))
|
||||||
return new[]
|
return new[]
|
||||||
{
|
{
|
||||||
flag
|
flag
|
||||||
|
|||||||
@@ -1406,7 +1406,7 @@ namespace Aaru.DiscImages
|
|||||||
case SectorTagType.CdSectorSubHeader:
|
case SectorTagType.CdSectorSubHeader:
|
||||||
case SectorTagType.CdSectorSync: break;
|
case SectorTagType.CdSectorSync: break;
|
||||||
case SectorTagType.CdTrackFlags:
|
case SectorTagType.CdTrackFlags:
|
||||||
if(trackFlags.TryGetValue(track, out byte flag))
|
if(trackFlags.TryGetValue((uint)sectorAddress, out byte flag))
|
||||||
return new[]
|
return new[]
|
||||||
{
|
{
|
||||||
flag
|
flag
|
||||||
|
|||||||
@@ -359,8 +359,7 @@ namespace Aaru.DiscImages
|
|||||||
string[] lengthString = matchPregap.Groups["address"].Value.Split(':');
|
string[] lengthString = matchPregap.Groups["address"].Value.Split(':');
|
||||||
|
|
||||||
currenttrack.Pregap = (ulong.Parse(lengthString[0]) * 60 * 75) +
|
currenttrack.Pregap = (ulong.Parse(lengthString[0]) * 60 * 75) +
|
||||||
(ulong.Parse(lengthString[1]) * 75) +
|
(ulong.Parse(lengthString[1]) * 75) + ulong.Parse(lengthString[2]);
|
||||||
ulong.Parse(lengthString[2]);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
currenttrack.Pregap = currenttrack.Sectors;
|
currenttrack.Pregap = currenttrack.Sectors;
|
||||||
@@ -1058,6 +1057,10 @@ namespace Aaru.DiscImages
|
|||||||
|
|
||||||
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
|
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
|
var aaruTrack = new CdrdaoTrack
|
||||||
{
|
{
|
||||||
Sequence = 0
|
Sequence = 0
|
||||||
|
|||||||
@@ -659,14 +659,14 @@ namespace Aaru.DiscImages
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
trackFlags.Add((byte)track.TrackSequence, data[0]);
|
trackFlags.Add((byte)sectorAddress, data[0]);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case SectorTagType.CdTrackIsrc:
|
case SectorTagType.CdTrackIsrc:
|
||||||
{
|
{
|
||||||
if(data != null)
|
if(data != null)
|
||||||
trackIsrcs.Add((byte)track.TrackSequence, Encoding.UTF8.GetString(data));
|
trackIsrcs.Add((byte)sectorAddress, Encoding.UTF8.GetString(data));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1518,6 +1518,10 @@ namespace Aaru.DiscImages
|
|||||||
|
|
||||||
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
|
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
|
var aaruTrack = new CdrWinTrack
|
||||||
{
|
{
|
||||||
Sequence = 0
|
Sequence = 0
|
||||||
|
|||||||
@@ -571,14 +571,14 @@ namespace Aaru.DiscImages
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_trackFlags.Add((byte)track.TrackSequence, data[0]);
|
_trackFlags.Add((byte)sectorAddress, data[0]);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
case SectorTagType.CdTrackIsrc:
|
case SectorTagType.CdTrackIsrc:
|
||||||
{
|
{
|
||||||
if(data != null)
|
if(data != null)
|
||||||
_trackIsrcs.Add((byte)track.TrackSequence, Encoding.UTF8.GetString(data));
|
_trackIsrcs.Add((byte)sectorAddress, Encoding.UTF8.GetString(data));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -939,6 +939,9 @@ namespace Aaru.DiscImages
|
|||||||
|
|
||||||
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
|
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
|
||||||
{
|
{
|
||||||
|
if(tag == SectorTagType.CdTrackFlags)
|
||||||
|
track = (uint)sectorAddress;
|
||||||
|
|
||||||
var aaruTrack = new Track
|
var aaruTrack = new Track
|
||||||
{
|
{
|
||||||
TrackSequence = 0
|
TrackSequence = 0
|
||||||
|
|||||||
@@ -340,12 +340,9 @@ namespace Aaru.DiscImages
|
|||||||
// Lead-out
|
// Lead-out
|
||||||
trackDescriptors.Add(new FullTOC.TrackDataDescriptor
|
trackDescriptors.Add(new FullTOC.TrackDataDescriptor
|
||||||
{
|
{
|
||||||
SessionNumber = currentSession, POINT = 0xB0, ADR = 5,
|
SessionNumber = currentSession, POINT = 0xB0, ADR = 5, CONTROL = 0,
|
||||||
CONTROL = 0,
|
HOUR = 0, Min = leadoutAmsf.minute, Sec = leadoutAmsf.second, Frame = leadoutAmsf.frame,
|
||||||
HOUR = 0, Min = leadoutAmsf.minute, Sec = leadoutAmsf.second,
|
PHOUR = 2, PMIN = leadoutPmsf.minute, PSEC = leadoutPmsf.second, PFRAME = leadoutPmsf.frame
|
||||||
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
|
// 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
|
// Lead-out start
|
||||||
trackDescriptors.Add(new FullTOC.TrackDataDescriptor
|
trackDescriptors.Add(new FullTOC.TrackDataDescriptor
|
||||||
{
|
{
|
||||||
SessionNumber = currentSession, POINT = 0xA2, ADR = 1,
|
SessionNumber = currentSession, POINT = 0xA2, ADR = 1, CONTROL = trackControl,
|
||||||
CONTROL = trackControl,
|
PHOUR = 0, PMIN = leadinPmsf.minute, PSEC = leadinPmsf.second, PFRAME = leadinPmsf.frame
|
||||||
PHOUR = 0, PMIN = leadinPmsf.minute, PSEC = leadinPmsf.second,
|
|
||||||
PFRAME = leadinPmsf.frame
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -397,8 +392,7 @@ namespace Aaru.DiscImages
|
|||||||
trackDescriptors.Add(new FullTOC.TrackDataDescriptor
|
trackDescriptors.Add(new FullTOC.TrackDataDescriptor
|
||||||
{
|
{
|
||||||
SessionNumber = (byte)track.TrackSession, POINT = (byte)track.TrackSequence, ADR = 1,
|
SessionNumber = (byte)track.TrackSession, POINT = (byte)track.TrackSequence, ADR = 1,
|
||||||
CONTROL = trackControl, PHOUR = 0, PMIN = pmsf.minute,
|
CONTROL = trackControl, PHOUR = 0, PMIN = pmsf.minute, PSEC = pmsf.second,
|
||||||
PSEC = pmsf.second,
|
|
||||||
PFRAME = pmsf.frame
|
PFRAME = pmsf.frame
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -511,7 +505,7 @@ namespace Aaru.DiscImages
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
trackFlags.Add((byte)track.TrackSequence, data[0]);
|
trackFlags.Add((byte)sectorAddress, data[0]);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -616,7 +610,7 @@ namespace Aaru.DiscImages
|
|||||||
subStream.Seek((long)(track.TrackSubchannelOffset + ((sectorAddress - track.TrackStartSector) * 96)),
|
subStream.Seek((long)(track.TrackSubchannelOffset + ((sectorAddress - track.TrackStartSector) * 96)),
|
||||||
SeekOrigin.Begin);
|
SeekOrigin.Begin);
|
||||||
|
|
||||||
subStream.Write(Decoders.CD.Subchannel.Deinterleave(data), 0, data.Length);
|
subStream.Write(Subchannel.Deinterleave(data), 0, data.Length);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -844,6 +844,9 @@ namespace Aaru.DiscImages
|
|||||||
|
|
||||||
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
|
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
|
||||||
{
|
{
|
||||||
|
if(tag == SectorTagType.CdTrackFlags)
|
||||||
|
track = (uint)sectorAddress;
|
||||||
|
|
||||||
var aaruTrack = new Track
|
var aaruTrack = new Track
|
||||||
{
|
{
|
||||||
TrackSequence = 0
|
TrackSequence = 0
|
||||||
|
|||||||
@@ -479,6 +479,9 @@ namespace Aaru.DiscImages
|
|||||||
|
|
||||||
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
|
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
|
||||||
{
|
{
|
||||||
|
if(tag == SectorTagType.CdTrackFlags)
|
||||||
|
track = (uint)sectorAddress;
|
||||||
|
|
||||||
if(track == 0)
|
if(track == 0)
|
||||||
{
|
{
|
||||||
if(sectorAddress + length > densitySeparationSectors)
|
if(sectorAddress + length > densitySeparationSectors)
|
||||||
@@ -825,13 +828,11 @@ namespace Aaru.DiscImages
|
|||||||
{
|
{
|
||||||
var track = new Track
|
var track = new Track
|
||||||
{
|
{
|
||||||
Indexes = new Dictionary<int, ulong>(), TrackDescription = null,
|
Indexes = new Dictionary<int, ulong>(), TrackDescription = null,
|
||||||
TrackStartSector = gdiTrack.StartSector, TrackPregap = gdiTrack.Pregap,
|
TrackStartSector = gdiTrack.StartSector, TrackPregap = gdiTrack.Pregap,
|
||||||
TrackSession = (ushort)(gdiTrack.HighDensity ? 2 : 1), TrackSequence = gdiTrack.Sequence,
|
TrackSession = (ushort)(gdiTrack.HighDensity ? 2 : 1), TrackSequence = gdiTrack.Sequence,
|
||||||
TrackType = gdiTrack.Tracktype,
|
TrackType = gdiTrack.Tracktype, TrackFilter = gdiTrack.Trackfilter,
|
||||||
TrackFilter = gdiTrack.Trackfilter,
|
TrackFile = gdiTrack.Trackfile, TrackFileOffset = (ulong)gdiTrack.Offset,
|
||||||
TrackFile = gdiTrack.Trackfile,
|
|
||||||
TrackFileOffset = (ulong)gdiTrack.Offset,
|
|
||||||
TrackFileType = "BINARY", TrackRawBytesPerSector = gdiTrack.Bps,
|
TrackFileType = "BINARY", TrackRawBytesPerSector = gdiTrack.Bps,
|
||||||
TrackBytesPerSector = gdiTrack.Tracktype == TrackType.Data ? 2048 : 2352,
|
TrackBytesPerSector = gdiTrack.Tracktype == TrackType.Data ? 2048 : 2352,
|
||||||
TrackSubchannelType = TrackSubchannelType.None
|
TrackSubchannelType = TrackSubchannelType.None
|
||||||
|
|||||||
@@ -314,12 +314,10 @@ namespace Aaru.DiscImages
|
|||||||
|
|
||||||
var neroTrack = new NeroTrack
|
var neroTrack = new NeroTrack
|
||||||
{
|
{
|
||||||
EndOfTrack = entry.EndOfTrack, Isrc = entry.Isrc,
|
EndOfTrack = entry.EndOfTrack, Isrc = entry.Isrc,
|
||||||
Length = entry.EndOfTrack - entry.Index0, Mode = entry.Mode,
|
Length = entry.EndOfTrack - entry.Index0, Mode = entry.Mode, Offset = entry.Index0,
|
||||||
Offset = entry.Index0,
|
SectorSize = entry.SectorSize, StartLba = imageInfo.Sectors, Index0 = entry.Index0,
|
||||||
SectorSize = entry.SectorSize, StartLba = imageInfo.Sectors,
|
Index1 = entry.Index1, Sequence = currenttrack
|
||||||
Index0 = entry.Index0,
|
|
||||||
Index1 = entry.Index1, Sequence = currenttrack
|
|
||||||
};
|
};
|
||||||
|
|
||||||
neroTrack.Sectors = neroTrack.Length / entry.SectorSize;
|
neroTrack.Sectors = neroTrack.Length / entry.SectorSize;
|
||||||
@@ -425,12 +423,10 @@ namespace Aaru.DiscImages
|
|||||||
|
|
||||||
var neroTrack = new NeroTrack
|
var neroTrack = new NeroTrack
|
||||||
{
|
{
|
||||||
EndOfTrack = entry.EndOfTrack, Isrc = entry.Isrc,
|
EndOfTrack = entry.EndOfTrack, Isrc = entry.Isrc,
|
||||||
Length = entry.EndOfTrack - entry.Index0, Mode = entry.Mode,
|
Length = entry.EndOfTrack - entry.Index0, Mode = entry.Mode, Offset = entry.Index0,
|
||||||
Offset = entry.Index0,
|
SectorSize = entry.SectorSize, StartLba = imageInfo.Sectors, Index0 = entry.Index0,
|
||||||
SectorSize = entry.SectorSize, StartLba = imageInfo.Sectors,
|
Index1 = entry.Index1, Sequence = currenttrack
|
||||||
Index0 = entry.Index0,
|
|
||||||
Index1 = entry.Index1, Sequence = currenttrack
|
|
||||||
};
|
};
|
||||||
|
|
||||||
neroTrack.Sectors = neroTrack.Length / entry.SectorSize;
|
neroTrack.Sectors = neroTrack.Length / entry.SectorSize;
|
||||||
@@ -960,11 +956,9 @@ namespace Aaru.DiscImages
|
|||||||
var partition = new Partition
|
var partition = new Partition
|
||||||
{
|
{
|
||||||
Description = $"Track {track.TrackSequence} Index 1",
|
Description = $"Track {track.TrackSequence} Index 1",
|
||||||
Size = neroTrack.EndOfTrack - neroTrack.Index1,
|
Size = neroTrack.EndOfTrack - neroTrack.Index1, Name = StringHandlers.CToString(neroTrack.Isrc),
|
||||||
Name = StringHandlers.CToString(neroTrack.Isrc),
|
Sequence = partitionSequence, Offset = partitionStartByte,
|
||||||
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()
|
Type = NeroTrackModeToTrackType((DaoMode)neroTrack.Mode).ToString()
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -992,13 +986,11 @@ namespace Aaru.DiscImages
|
|||||||
(DaoMode)neroTracks.ElementAt(i).Value.Mode == DaoMode.AudioSub);
|
(DaoMode)neroTracks.ElementAt(i).Value.Mode == DaoMode.AudioSub);
|
||||||
|
|
||||||
// First track is data
|
// First track is data
|
||||||
firstdata |= i == 0 &&
|
firstdata |= i == 0 && (DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio &&
|
||||||
(DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio &&
|
|
||||||
(DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.AudioSub;
|
(DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.AudioSub;
|
||||||
|
|
||||||
// Any non first track is data
|
// Any non first track is data
|
||||||
data |= i != 0 &&
|
data |= i != 0 && (DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio &&
|
||||||
(DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio &&
|
|
||||||
(DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.AudioSub;
|
(DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.AudioSub;
|
||||||
|
|
||||||
// Any non first track is audio
|
// Any non first track is audio
|
||||||
@@ -1226,6 +1218,10 @@ namespace Aaru.DiscImages
|
|||||||
|
|
||||||
public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag)
|
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))
|
if(!neroTracks.TryGetValue(track, out NeroTrack aaruTrack))
|
||||||
throw new ArgumentOutOfRangeException(nameof(track), "Track not found");
|
throw new ArgumentOutOfRangeException(nameof(track), "Track not found");
|
||||||
|
|
||||||
|
|||||||
@@ -526,22 +526,20 @@ namespace Aaru.Commands.Image
|
|||||||
|
|
||||||
var metadata = new ImageInfo
|
var metadata = new ImageInfo
|
||||||
{
|
{
|
||||||
Application = "Aaru",
|
Application = "Aaru", ApplicationVersion = Version.GetVersion(),
|
||||||
ApplicationVersion = Version.GetVersion(),
|
Comments = comments ?? inputFormat.Info.Comments, Creator = creator ?? inputFormat.Info.Creator,
|
||||||
Comments = comments ?? inputFormat.Info.Comments,
|
|
||||||
Creator = creator ?? inputFormat.Info.Creator,
|
|
||||||
DriveFirmwareRevision = driveFirmwareRevision ?? inputFormat.Info.DriveFirmwareRevision,
|
DriveFirmwareRevision = driveFirmwareRevision ?? inputFormat.Info.DriveFirmwareRevision,
|
||||||
DriveManufacturer = driveManufacturer ?? inputFormat.Info.DriveManufacturer,
|
DriveManufacturer = driveManufacturer ?? inputFormat.Info.DriveManufacturer,
|
||||||
DriveModel = driveModel ?? inputFormat.Info.DriveModel,
|
DriveModel = driveModel ?? inputFormat.Info.DriveModel,
|
||||||
DriveSerialNumber = driveSerialNumber ?? inputFormat.Info.DriveSerialNumber,
|
DriveSerialNumber = driveSerialNumber ?? inputFormat.Info.DriveSerialNumber,
|
||||||
LastMediaSequence = lastMediaSequence != 0 ? lastMediaSequence : inputFormat.Info.LastMediaSequence,
|
LastMediaSequence = lastMediaSequence != 0 ? lastMediaSequence : inputFormat.Info.LastMediaSequence,
|
||||||
MediaBarcode = mediaBarcode ?? inputFormat.Info.MediaBarcode,
|
MediaBarcode = mediaBarcode ?? inputFormat.Info.MediaBarcode,
|
||||||
MediaManufacturer = mediaManufacturer ?? inputFormat.Info.MediaManufacturer,
|
MediaManufacturer = mediaManufacturer ?? inputFormat.Info.MediaManufacturer,
|
||||||
MediaModel = mediaModel ?? inputFormat.Info.MediaModel,
|
MediaModel = mediaModel ?? inputFormat.Info.MediaModel,
|
||||||
MediaPartNumber = mediaPartNumber ?? inputFormat.Info.MediaPartNumber,
|
MediaPartNumber = mediaPartNumber ?? inputFormat.Info.MediaPartNumber,
|
||||||
MediaSequence = mediaSequence != 0 ? mediaSequence : inputFormat.Info.MediaSequence,
|
MediaSequence = mediaSequence != 0 ? mediaSequence : inputFormat.Info.MediaSequence,
|
||||||
MediaSerialNumber = mediaSerialNumber ?? inputFormat.Info.MediaSerialNumber,
|
MediaSerialNumber = mediaSerialNumber ?? inputFormat.Info.MediaSerialNumber,
|
||||||
MediaTitle = mediaTitle ?? inputFormat.Info.MediaTitle
|
MediaTitle = mediaTitle ?? inputFormat.Info.MediaTitle
|
||||||
};
|
};
|
||||||
|
|
||||||
if(!outputFormat.SetMetadata(metadata))
|
if(!outputFormat.SetMetadata(metadata))
|
||||||
@@ -729,8 +727,8 @@ namespace Aaru.Commands.Image
|
|||||||
track.TrackSequence,
|
track.TrackSequence,
|
||||||
track.TrackSequence / (double)inputOptical.Tracks.Count);
|
track.TrackSequence / (double)inputOptical.Tracks.Count);
|
||||||
|
|
||||||
sector = inputFormat.ReadSectorTag(track.TrackStartSector, tag);
|
sector = inputFormat.ReadSectorTag(track.TrackSequence, tag);
|
||||||
result = outputFormat.WriteSectorTag(sector, track.TrackStartSector, tag);
|
result = outputFormat.WriteSectorTag(sector, track.TrackSequence, tag);
|
||||||
|
|
||||||
if(!result)
|
if(!result)
|
||||||
if(force)
|
if(force)
|
||||||
|
|||||||
Reference in New Issue
Block a user