mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
[Aaru.Images] Reformat and cleanup.
This commit is contained in:
@@ -45,6 +45,7 @@ namespace Aaru.DiscImages;
|
||||
/// <summary>Implements reading and writing cdrdao cuesheet disc images</summary>
|
||||
public sealed partial class Cdrdao : IWritableOpticalImage
|
||||
{
|
||||
const string MODULE_NAME = "CDRDAO plugin";
|
||||
IFilter _cdrdaoFilter;
|
||||
StreamWriter _descriptorStream;
|
||||
CdrdaoDisc _discimage;
|
||||
@@ -81,6 +82,4 @@ public sealed partial class Cdrdao : IWritableOpticalImage
|
||||
DriveSerialNumber = null,
|
||||
DriveFirmwareRevision = null
|
||||
};
|
||||
|
||||
const string MODULE_NAME = "CDRDAO plugin";
|
||||
}
|
||||
@@ -43,13 +43,18 @@ public sealed partial class Cdrdao
|
||||
{
|
||||
case CDRDAO_TRACK_TYPE_MODE1:
|
||||
case CDRDAO_TRACK_TYPE_MODE2_FORM1:
|
||||
case CDRDAO_TRACK_TYPE_MODE1_RAW: return 2048;
|
||||
case CDRDAO_TRACK_TYPE_MODE2_FORM2: return 2324;
|
||||
case CDRDAO_TRACK_TYPE_MODE1_RAW:
|
||||
return 2048;
|
||||
case CDRDAO_TRACK_TYPE_MODE2_FORM2:
|
||||
return 2324;
|
||||
case CDRDAO_TRACK_TYPE_MODE2:
|
||||
case CDRDAO_TRACK_TYPE_MODE2_MIX:
|
||||
case CDRDAO_TRACK_TYPE_MODE2_RAW: return 2336;
|
||||
case CDRDAO_TRACK_TYPE_AUDIO: return 2352;
|
||||
default: return 0;
|
||||
case CDRDAO_TRACK_TYPE_MODE2_RAW:
|
||||
return 2336;
|
||||
case CDRDAO_TRACK_TYPE_AUDIO:
|
||||
return 2352;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,14 +63,20 @@ public sealed partial class Cdrdao
|
||||
switch(trackType)
|
||||
{
|
||||
case CDRDAO_TRACK_TYPE_MODE1:
|
||||
case CDRDAO_TRACK_TYPE_MODE1_RAW: return TrackType.CdMode1;
|
||||
case CDRDAO_TRACK_TYPE_MODE2_FORM1: return TrackType.CdMode2Form1;
|
||||
case CDRDAO_TRACK_TYPE_MODE2_FORM2: return TrackType.CdMode2Form2;
|
||||
case CDRDAO_TRACK_TYPE_MODE1_RAW:
|
||||
return TrackType.CdMode1;
|
||||
case CDRDAO_TRACK_TYPE_MODE2_FORM1:
|
||||
return TrackType.CdMode2Form1;
|
||||
case CDRDAO_TRACK_TYPE_MODE2_FORM2:
|
||||
return TrackType.CdMode2Form2;
|
||||
case CDRDAO_TRACK_TYPE_MODE2:
|
||||
case CDRDAO_TRACK_TYPE_MODE2_MIX:
|
||||
case CDRDAO_TRACK_TYPE_MODE2_RAW: return TrackType.CdMode2Formless;
|
||||
case CDRDAO_TRACK_TYPE_AUDIO: return TrackType.Audio;
|
||||
default: return TrackType.Data;
|
||||
case CDRDAO_TRACK_TYPE_MODE2_RAW:
|
||||
return TrackType.CdMode2Formless;
|
||||
case CDRDAO_TRACK_TYPE_AUDIO:
|
||||
return TrackType.Audio;
|
||||
default:
|
||||
return TrackType.Data;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,16 +87,24 @@ public sealed partial class Cdrdao
|
||||
{
|
||||
switch(track.Type)
|
||||
{
|
||||
case TrackType.Audio when track.RawBytesPerSector == 2352: return CDRDAO_TRACK_TYPE_AUDIO;
|
||||
case TrackType.Data: return CDRDAO_TRACK_TYPE_MODE1;
|
||||
case TrackType.CdMode1 when track.RawBytesPerSector == 2352: return CDRDAO_TRACK_TYPE_MODE1_RAW;
|
||||
case TrackType.CdMode2Formless when track.RawBytesPerSector != 2352: return CDRDAO_TRACK_TYPE_MODE2;
|
||||
case TrackType.CdMode2Form1 when track.RawBytesPerSector != 2352: return CDRDAO_TRACK_TYPE_MODE2_FORM1;
|
||||
case TrackType.CdMode2Form2 when track.RawBytesPerSector != 2352: return CDRDAO_TRACK_TYPE_MODE2_FORM2;
|
||||
case TrackType.Audio when track.RawBytesPerSector == 2352:
|
||||
return CDRDAO_TRACK_TYPE_AUDIO;
|
||||
case TrackType.Data:
|
||||
return CDRDAO_TRACK_TYPE_MODE1;
|
||||
case TrackType.CdMode1 when track.RawBytesPerSector == 2352:
|
||||
return CDRDAO_TRACK_TYPE_MODE1_RAW;
|
||||
case TrackType.CdMode2Formless when track.RawBytesPerSector != 2352:
|
||||
return CDRDAO_TRACK_TYPE_MODE2;
|
||||
case TrackType.CdMode2Form1 when track.RawBytesPerSector != 2352:
|
||||
return CDRDAO_TRACK_TYPE_MODE2_FORM1;
|
||||
case TrackType.CdMode2Form2 when track.RawBytesPerSector != 2352:
|
||||
return CDRDAO_TRACK_TYPE_MODE2_FORM2;
|
||||
case TrackType.CdMode2Formless when track.RawBytesPerSector == 2352:
|
||||
case TrackType.CdMode2Form1 when track.RawBytesPerSector == 2352:
|
||||
case TrackType.CdMode2Form2 when track.RawBytesPerSector == 2352: return CDRDAO_TRACK_TYPE_MODE2_RAW;
|
||||
default: return CDRDAO_TRACK_TYPE_MODE1;
|
||||
case TrackType.CdMode2Form2 when track.RawBytesPerSector == 2352:
|
||||
return CDRDAO_TRACK_TYPE_MODE2_RAW;
|
||||
default:
|
||||
return CDRDAO_TRACK_TYPE_MODE1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -41,20 +41,22 @@ namespace Aaru.DiscImages;
|
||||
|
||||
public sealed partial class Cdrdao
|
||||
{
|
||||
#region IWritableOpticalImage Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool Identify(IFilter imageFilter)
|
||||
{
|
||||
try
|
||||
{
|
||||
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
|
||||
byte[] testArray = new byte[512];
|
||||
var testArray = new byte[512];
|
||||
imageFilter.GetDataForkStream().EnsureRead(testArray, 0, 512);
|
||||
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
|
||||
|
||||
// Check for unexpected control characters that shouldn't be present in a text file and can crash this plugin
|
||||
bool twoConsecutiveNulls = false;
|
||||
var twoConsecutiveNulls = false;
|
||||
|
||||
for(int i = 0; i < 512; i++)
|
||||
for(var i = 0; i < 512; i++)
|
||||
{
|
||||
if(i >= imageFilter.GetDataForkStream().Length)
|
||||
break;
|
||||
@@ -100,10 +102,12 @@ public sealed partial class Cdrdao
|
||||
catch(Exception ex)
|
||||
{
|
||||
AaruConsole.ErrorWriteLine(Localization.Exception_trying_to_identify_image_file_0, _cdrdaoFilter.Filename);
|
||||
AaruConsole.ErrorWriteLine(Localization.Exception_0, ex.Message);
|
||||
AaruConsole.ErrorWriteLine(Localization.Stack_trace_0, ex.StackTrace);
|
||||
AaruConsole.ErrorWriteLine(Localization.Exception_0, ex.Message);
|
||||
AaruConsole.ErrorWriteLine(Localization.Stack_trace_0, ex.StackTrace);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -34,15 +34,18 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Aaru.CommonTypes;
|
||||
using Aaru.CommonTypes.AaruMetadata;
|
||||
using Aaru.CommonTypes.Enums;
|
||||
using Aaru.CommonTypes.Structs;
|
||||
using DumpHardware = Aaru.CommonTypes.AaruMetadata.DumpHardware;
|
||||
using Metadata = Aaru.CommonTypes.AaruMetadata.Metadata;
|
||||
using Partition = Aaru.CommonTypes.Partition;
|
||||
using Track = Aaru.CommonTypes.Structs.Track;
|
||||
|
||||
namespace Aaru.DiscImages;
|
||||
|
||||
public sealed partial class Cdrdao
|
||||
{
|
||||
#region IWritableOpticalImage Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public OpticalImageCapabilities OpticalCapabilities => OpticalImageCapabilities.CanStoreAudioTracks |
|
||||
OpticalImageCapabilities.CanStoreDataTracks |
|
||||
@@ -55,16 +58,22 @@ public sealed partial class Cdrdao
|
||||
OpticalImageCapabilities.CanStoreCookedData |
|
||||
OpticalImageCapabilities.CanStoreMultipleTracks |
|
||||
OpticalImageCapabilities.CanStoreIndexes;
|
||||
|
||||
/// <inheritdoc />
|
||||
public ImageInfo Info => _imageInfo;
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Name => Localization.Cdrdao_Name;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Guid Id => new("04D7BA12-1BE8-44D4-97A4-1B48A505463E");
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Format => "CDRDAO tocfile";
|
||||
|
||||
/// <inheritdoc />
|
||||
public string Author => Authors.NataliaPortillo;
|
||||
|
||||
/// <inheritdoc />
|
||||
public List<Partition> Partitions { get; private set; }
|
||||
|
||||
@@ -122,7 +131,8 @@ public sealed partial class Cdrdao
|
||||
|
||||
if(cdrTrack.Subchannel)
|
||||
{
|
||||
aaruTrack.SubchannelType = cdrTrack.Packedsubchannel ? TrackSubchannelType.PackedInterleaved
|
||||
aaruTrack.SubchannelType = cdrTrack.Packedsubchannel
|
||||
? TrackSubchannelType.PackedInterleaved
|
||||
: TrackSubchannelType.RawInterleaved;
|
||||
|
||||
aaruTrack.SubchannelFilter = cdrTrack.Trackfile.Datafilter;
|
||||
@@ -150,8 +160,10 @@ public sealed partial class Cdrdao
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach(KeyValuePair<int, ulong> idx in cdrTrack.Indexes.OrderBy(i => i.Key))
|
||||
aaruTrack.Indexes[(ushort)idx.Key] = (int)idx.Value;
|
||||
}
|
||||
|
||||
tracks.Add(aaruTrack);
|
||||
}
|
||||
@@ -162,45 +174,49 @@ public sealed partial class Cdrdao
|
||||
|
||||
/// <inheritdoc />
|
||||
public List<DumpHardware> DumpHardware => null;
|
||||
|
||||
/// <inheritdoc />
|
||||
public Metadata AaruMetadata => null;
|
||||
|
||||
// TODO: Decode CD-Text to text
|
||||
/// <inheritdoc />
|
||||
public IEnumerable<MediaTagType> SupportedMediaTags => new[]
|
||||
{
|
||||
MediaTagType.CD_MCN
|
||||
};
|
||||
public IEnumerable<MediaTagType> SupportedMediaTags => new[] { MediaTagType.CD_MCN };
|
||||
|
||||
/// <inheritdoc />
|
||||
public IEnumerable<SectorTagType> SupportedSectorTags => new[]
|
||||
{
|
||||
SectorTagType.CdSectorEcc, SectorTagType.CdSectorEccP, SectorTagType.CdSectorEccQ, SectorTagType.CdSectorEdc,
|
||||
SectorTagType.CdSectorHeader, SectorTagType.CdSectorSubchannel, SectorTagType.CdSectorSubHeader,
|
||||
SectorTagType.CdSectorSync, SectorTagType.CdTrackFlags, SectorTagType.CdTrackIsrc
|
||||
SectorTagType.CdSectorEcc, SectorTagType.CdSectorEccP, SectorTagType.CdSectorEccQ,
|
||||
SectorTagType.CdSectorEdc, SectorTagType.CdSectorHeader, SectorTagType.CdSectorSubchannel,
|
||||
SectorTagType.CdSectorSubHeader, SectorTagType.CdSectorSync, SectorTagType.CdTrackFlags,
|
||||
SectorTagType.CdTrackIsrc
|
||||
};
|
||||
|
||||
/// <inheritdoc />
|
||||
public IEnumerable<MediaType> SupportedMediaTypes => new[]
|
||||
{
|
||||
MediaType.CD, MediaType.CDDA, MediaType.CDEG, MediaType.CDG, MediaType.CDI, MediaType.CDMIDI, MediaType.CDMRW,
|
||||
MediaType.CDPLUS, MediaType.CDR, MediaType.CDROM, MediaType.CDROMXA, MediaType.CDRW, MediaType.CDV,
|
||||
MediaType.DDCD, MediaType.DDCDR, MediaType.DDCDRW, MediaType.MEGACD, MediaType.PS1CD, MediaType.PS2CD,
|
||||
MediaType.SuperCDROM2, MediaType.SVCD, MediaType.SATURNCD, MediaType.ThreeDO, MediaType.VCD, MediaType.VCDHD,
|
||||
MediaType.NeoGeoCD, MediaType.PCFX, MediaType.CDTV, MediaType.CD32, MediaType.Nuon, MediaType.Playdia,
|
||||
MediaType.Pippin, MediaType.FMTOWNS, MediaType.MilCD, MediaType.VideoNow, MediaType.VideoNowColor,
|
||||
MediaType.VideoNowXp, MediaType.CVD, MediaType.PCD
|
||||
MediaType.CD, MediaType.CDDA, MediaType.CDEG, MediaType.CDG, MediaType.CDI, MediaType.CDMIDI,
|
||||
MediaType.CDMRW, MediaType.CDPLUS, MediaType.CDR, MediaType.CDROM, MediaType.CDROMXA, MediaType.CDRW,
|
||||
MediaType.CDV, MediaType.DDCD, MediaType.DDCDR, MediaType.DDCDRW, MediaType.MEGACD, MediaType.PS1CD,
|
||||
MediaType.PS2CD, MediaType.SuperCDROM2, MediaType.SVCD, MediaType.SATURNCD, MediaType.ThreeDO,
|
||||
MediaType.VCD, MediaType.VCDHD, MediaType.NeoGeoCD, MediaType.PCFX, MediaType.CDTV, MediaType.CD32,
|
||||
MediaType.Nuon, MediaType.Playdia, MediaType.Pippin, MediaType.FMTOWNS, MediaType.MilCD, MediaType.VideoNow,
|
||||
MediaType.VideoNowColor, MediaType.VideoNowXp, MediaType.CVD, MediaType.PCD
|
||||
};
|
||||
|
||||
/// <inheritdoc />
|
||||
public IEnumerable<(string name, Type type, string description, object @default)> SupportedOptions => new[]
|
||||
{
|
||||
("separate", typeof(bool), Localization.Write_each_track_to_a_separate_file, (object)false)
|
||||
};
|
||||
|
||||
/// <inheritdoc />
|
||||
public IEnumerable<string> KnownExtensions => new[]
|
||||
{
|
||||
".toc"
|
||||
};
|
||||
public IEnumerable<string> KnownExtensions => new[] { ".toc" };
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool IsWriting { get; private set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public string ErrorMessage { get; private set; }
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -48,6 +48,8 @@ namespace Aaru.DiscImages;
|
||||
|
||||
public sealed partial class Cdrdao
|
||||
{
|
||||
#region IWritableOpticalImage Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public ErrorNumber Open(IFilter imageFilter)
|
||||
{
|
||||
@@ -60,7 +62,7 @@ public sealed partial class Cdrdao
|
||||
{
|
||||
imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin);
|
||||
_tocStream = new StreamReader(imageFilter.GetDataForkStream());
|
||||
bool inTrack = false;
|
||||
var inTrack = false;
|
||||
|
||||
// Initialize all RegExs
|
||||
var regexComment = new Regex(REGEX_COMMENT);
|
||||
@@ -108,12 +110,12 @@ public sealed partial class Cdrdao
|
||||
currentTrack.Indexes = new Dictionary<int, ulong>();
|
||||
currentTrack.Pregap = 0;
|
||||
ulong currentSector = 0;
|
||||
int nextIndex = 2;
|
||||
var nextIndex = 2;
|
||||
var commentBuilder = new StringBuilder();
|
||||
|
||||
_tocStream = new StreamReader(_cdrdaoFilter.GetDataForkStream());
|
||||
string line;
|
||||
int lineNumber = 0;
|
||||
var lineNumber = 0;
|
||||
|
||||
while(_tocStream.Peek() >= 0)
|
||||
{
|
||||
@@ -196,13 +198,13 @@ public sealed partial class Cdrdao
|
||||
_discimage.Disktypestr = matchDiskType.Groups["type"].Value;
|
||||
|
||||
_discimage.Disktype = matchDiskType.Groups["type"].Value switch
|
||||
{
|
||||
"CD_DA" => MediaType.CDDA,
|
||||
"CD_ROM" => MediaType.CDROM,
|
||||
"CD_ROM_XA" => MediaType.CDROMXA,
|
||||
"CD_I" => MediaType.CDI,
|
||||
_ => MediaType.CD
|
||||
};
|
||||
{
|
||||
"CD_DA" => MediaType.CDDA,
|
||||
"CD_ROM" => MediaType.CDROM,
|
||||
"CD_ROM_XA" => MediaType.CDROMXA,
|
||||
"CD_I" => MediaType.CDI,
|
||||
_ => MediaType.CD
|
||||
};
|
||||
}
|
||||
else if(matchMcn.Success)
|
||||
{
|
||||
@@ -214,13 +216,17 @@ public sealed partial class Cdrdao
|
||||
else if(matchTrack.Success)
|
||||
{
|
||||
if(matchTrack.Groups["subchan"].Value == "")
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME,
|
||||
Localization.Found_TRACK_type_1_with_no_subchannel_at_line_0,
|
||||
lineNumber, matchTrack.Groups["type"].Value);
|
||||
}
|
||||
else
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME,
|
||||
Localization.Found_TRACK_type_1_subchannel_2_at_line_0, lineNumber,
|
||||
matchTrack.Groups["type"].Value, matchTrack.Groups["subchan"].Value);
|
||||
}
|
||||
|
||||
if(inTrack)
|
||||
{
|
||||
@@ -277,7 +283,8 @@ public sealed partial class Cdrdao
|
||||
|
||||
switch(matchTrack.Groups["subchan"].Value)
|
||||
{
|
||||
case "": break;
|
||||
case "":
|
||||
break;
|
||||
case "RW":
|
||||
currentTrack.Packedsubchannel = true;
|
||||
goto case "RW_RAW";
|
||||
@@ -336,8 +343,8 @@ public sealed partial class Cdrdao
|
||||
|
||||
string[] lengthString = matchFile.Groups["length"].Value.Split(':');
|
||||
|
||||
ulong nextIndexPos = (ulong.Parse(lengthString[0]) * 60 * 75) +
|
||||
(ulong.Parse(lengthString[1]) * 75) + ulong.Parse(lengthString[2]);
|
||||
ulong nextIndexPos = ulong.Parse(lengthString[0]) * 60 * 75 +
|
||||
ulong.Parse(lengthString[1]) * 75 + ulong.Parse(lengthString[2]);
|
||||
|
||||
currentTrack.Indexes.Add(nextIndex, nextIndexPos + currentTrack.Pregap + currentTrack.StartSector);
|
||||
}
|
||||
@@ -352,8 +359,8 @@ public sealed partial class Cdrdao
|
||||
{
|
||||
string[] lengthString = matchPregap.Groups["address"].Value.Split(':');
|
||||
|
||||
currentTrack.Pregap = (ulong.Parse(lengthString[0]) * 60 * 75) +
|
||||
(ulong.Parse(lengthString[1]) * 75) + ulong.Parse(lengthString[2]);
|
||||
currentTrack.Pregap = ulong.Parse(lengthString[0]) * 60 * 75 +
|
||||
ulong.Parse(lengthString[1]) * 75 + ulong.Parse(lengthString[2]);
|
||||
}
|
||||
else
|
||||
currentTrack.Pregap = currentTrack.Sectors;
|
||||
@@ -366,15 +373,19 @@ public sealed partial class Cdrdao
|
||||
currentTrack.Indexes.Add(0, currentTrack.StartSector);
|
||||
string[] lengthString = matchZeroPregap.Groups["length"].Value.Split(':');
|
||||
|
||||
currentTrack.Pregap = (ulong.Parse(lengthString[0]) * 60 * 75) +
|
||||
(ulong.Parse(lengthString[1]) * 75) + ulong.Parse(lengthString[2]);
|
||||
currentTrack.Pregap = ulong.Parse(lengthString[0]) * 60 * 75 +
|
||||
ulong.Parse(lengthString[1]) * 75 + ulong.Parse(lengthString[2]);
|
||||
}
|
||||
else if(matchZeroData.Success)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Found_ZERO_1_at_line_0, lineNumber,
|
||||
matchZeroData.Groups["length"].Value);
|
||||
}
|
||||
else if(matchZeroAudio.Success)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Found_SILENCE_1_at_line_0, lineNumber,
|
||||
matchZeroAudio.Groups["length"].Value);
|
||||
}
|
||||
else
|
||||
{
|
||||
FiltersList filtersList;
|
||||
@@ -393,7 +404,8 @@ public sealed partial class Cdrdao
|
||||
matchAudioFile.Groups["filename"].Value)),
|
||||
Datafile = matchAudioFile.Groups["filename"].Value,
|
||||
Offset = matchAudioFile.Groups["base_offset"].Value != ""
|
||||
? ulong.Parse(matchAudioFile.Groups["base_offset"].Value) : 0,
|
||||
? ulong.Parse(matchAudioFile.Groups["base_offset"].Value)
|
||||
: 0,
|
||||
Filetype = "BINARY",
|
||||
Sequence = currentTrackNumber
|
||||
};
|
||||
@@ -404,8 +416,8 @@ public sealed partial class Cdrdao
|
||||
{
|
||||
string[] startString = matchAudioFile.Groups["start"].Value.Split(':');
|
||||
|
||||
startSectors = (ulong.Parse(startString[0]) * 60 * 75) +
|
||||
(ulong.Parse(startString[1]) * 75) + ulong.Parse(startString[2]);
|
||||
startSectors = ulong.Parse(startString[0]) * 60 * 75 +
|
||||
ulong.Parse(startString[1]) * 75 + ulong.Parse(startString[2]);
|
||||
}
|
||||
|
||||
currentTrack.Trackfile.Offset += startSectors * currentTrack.Bps;
|
||||
@@ -414,13 +426,15 @@ public sealed partial class Cdrdao
|
||||
{
|
||||
string[] lengthString = matchAudioFile.Groups["length"].Value.Split(':');
|
||||
|
||||
currentTrack.Sectors = (ulong.Parse(lengthString[0]) * 60 * 75) +
|
||||
(ulong.Parse(lengthString[1]) * 75) + ulong.Parse(lengthString[2]);
|
||||
currentTrack.Sectors = ulong.Parse(lengthString[0]) * 60 * 75 +
|
||||
ulong.Parse(lengthString[1]) * 75 + ulong.Parse(lengthString[2]);
|
||||
}
|
||||
else
|
||||
{
|
||||
currentTrack.Sectors =
|
||||
((ulong)currentTrack.Trackfile.Datafilter.DataForkLength -
|
||||
currentTrack.Trackfile.Offset) / currentTrack.Bps;
|
||||
}
|
||||
}
|
||||
else if(matchFile.Success)
|
||||
{
|
||||
@@ -436,7 +450,8 @@ public sealed partial class Cdrdao
|
||||
matchFile.Groups["filename"].Value)),
|
||||
Datafile = matchAudioFile.Groups["filename"].Value,
|
||||
Offset = matchFile.Groups["base_offset"].Value != ""
|
||||
? ulong.Parse(matchFile.Groups["base_offset"].Value) : 0,
|
||||
? ulong.Parse(matchFile.Groups["base_offset"].Value)
|
||||
: 0,
|
||||
Filetype = "BINARY",
|
||||
Sequence = currentTrackNumber
|
||||
};
|
||||
@@ -445,13 +460,15 @@ public sealed partial class Cdrdao
|
||||
{
|
||||
string[] lengthString = matchFile.Groups["length"].Value.Split(':');
|
||||
|
||||
currentTrack.Sectors = (ulong.Parse(lengthString[0]) * 60 * 75) +
|
||||
(ulong.Parse(lengthString[1]) * 75) + ulong.Parse(lengthString[2]);
|
||||
currentTrack.Sectors = ulong.Parse(lengthString[0]) * 60 * 75 +
|
||||
ulong.Parse(lengthString[1]) * 75 + ulong.Parse(lengthString[2]);
|
||||
}
|
||||
else
|
||||
{
|
||||
currentTrack.Sectors =
|
||||
((ulong)currentTrack.Trackfile.Datafilter.DataForkLength -
|
||||
currentTrack.Trackfile.Offset) / currentTrack.Bps;
|
||||
}
|
||||
}
|
||||
else if(matchTitle.Success)
|
||||
{
|
||||
@@ -618,7 +635,7 @@ public sealed partial class Cdrdao
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t" + Localization.Disc_contains_0_tracks,
|
||||
_discimage.Tracks.Count);
|
||||
|
||||
for(int i = 0; i < _discimage.Tracks.Count; i++)
|
||||
for(var i = 0; i < _discimage.Tracks.Count; i++)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t" + Localization.Track_0_information,
|
||||
_discimage.Tracks[i].Sequence);
|
||||
@@ -654,44 +671,58 @@ public sealed partial class Cdrdao
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t" + Localization.Indexes);
|
||||
|
||||
foreach(KeyValuePair<int, ulong> kvp in _discimage.Tracks[i].Indexes)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t\t" + Localization.Index_0_starts_at_sector_1,
|
||||
kvp.Key, kvp.Value);
|
||||
}
|
||||
|
||||
if(_discimage.Tracks[i].Isrc == null)
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t" + Localization.ISRC_is_not_set);
|
||||
else
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t" + Localization.ISRC_0,
|
||||
_discimage.Tracks[i].Isrc);
|
||||
}
|
||||
|
||||
if(_discimage.Tracks[i].Arranger == null)
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t" + Localization.Arranger_is_not_set);
|
||||
else
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t" + Localization.Arranger_0,
|
||||
_discimage.Tracks[i].Arranger);
|
||||
}
|
||||
|
||||
if(_discimage.Tracks[i].Composer == null)
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t" + Localization.Composer_is_not_set);
|
||||
else
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t" + Localization.Composer_0,
|
||||
_discimage.Tracks[i].Composer);
|
||||
}
|
||||
|
||||
if(_discimage.Tracks[i].Performer == null)
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t" + Localization.Performer_is_not_set);
|
||||
else
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t" + Localization.Performer_0,
|
||||
_discimage.Tracks[i].Performer);
|
||||
}
|
||||
|
||||
if(_discimage.Tracks[i].Songwriter == null)
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t" + Localization.Songwriter_is_not_set);
|
||||
else
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t" + Localization.Songwriter_0,
|
||||
_discimage.Tracks[i].Songwriter);
|
||||
}
|
||||
|
||||
if(_discimage.Tracks[i].Title == null)
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t" + Localization.Title_is_not_set);
|
||||
else
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t\t" + Localization.Title_0,
|
||||
_discimage.Tracks[i].Title);
|
||||
}
|
||||
}
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Building_offset_map);
|
||||
@@ -702,7 +733,7 @@ public sealed partial class Cdrdao
|
||||
ulong byteOffset = 0;
|
||||
ulong partitionSequence = 0;
|
||||
|
||||
for(int i = 0; i < _discimage.Tracks.Count; i++)
|
||||
for(var i = 0; i < _discimage.Tracks.Count; i++)
|
||||
{
|
||||
if(_discimage.Tracks[i].Sequence == 1 &&
|
||||
i != 0)
|
||||
@@ -749,7 +780,7 @@ public sealed partial class Cdrdao
|
||||
|
||||
foreach(Partition partition in Partitions)
|
||||
{
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Partition_sequence_0, partition.Sequence);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, Localization.Partition_sequence_0, partition.Sequence);
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t" + Localization.Partition_name_0, partition.Name);
|
||||
|
||||
AaruConsole.DebugWriteLine(MODULE_NAME, "\t" + Localization.Partition_description_0,
|
||||
@@ -804,8 +835,10 @@ public sealed partial class Cdrdao
|
||||
foreach(CdrdaoTrack track in _discimage.Tracks)
|
||||
{
|
||||
if(track.Subchannel)
|
||||
{
|
||||
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel))
|
||||
_imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubchannel);
|
||||
}
|
||||
|
||||
switch(track.Tracktype)
|
||||
{
|
||||
@@ -885,7 +918,7 @@ public sealed partial class Cdrdao
|
||||
catch(Exception ex)
|
||||
{
|
||||
AaruConsole.ErrorWriteLine(Localization.Exception_trying_to_identify_image_file_0, imageFilter);
|
||||
AaruConsole.ErrorWriteLine(Localization.Exception_0, ex);
|
||||
AaruConsole.ErrorWriteLine(Localization.Exception_0, ex);
|
||||
|
||||
return ErrorNumber.UnexpectedException;
|
||||
}
|
||||
@@ -907,7 +940,8 @@ public sealed partial class Cdrdao
|
||||
|
||||
return ErrorNumber.NoError;
|
||||
}
|
||||
default: return ErrorNumber.NotSupported;
|
||||
default:
|
||||
return ErrorNumber.NotSupported;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -931,10 +965,12 @@ public sealed partial class Cdrdao
|
||||
{
|
||||
buffer = null;
|
||||
|
||||
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap where sectorAddress >= kvp.Value
|
||||
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap
|
||||
where sectorAddress >= kvp.Value
|
||||
from cdrdaoTrack in _discimage.Tracks
|
||||
where cdrdaoTrack.Sequence == kvp.Key
|
||||
where sectorAddress - kvp.Value < cdrdaoTrack.Sectors select kvp)
|
||||
where sectorAddress - kvp.Value < cdrdaoTrack.Sectors
|
||||
select kvp)
|
||||
return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key, out buffer);
|
||||
|
||||
return ErrorNumber.SectorNotFound;
|
||||
@@ -945,10 +981,12 @@ public sealed partial class Cdrdao
|
||||
{
|
||||
buffer = null;
|
||||
|
||||
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap where sectorAddress >= kvp.Value
|
||||
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap
|
||||
where sectorAddress >= kvp.Value
|
||||
from cdrdaoTrack in _discimage.Tracks
|
||||
where cdrdaoTrack.Sequence == kvp.Key
|
||||
where sectorAddress - kvp.Value < cdrdaoTrack.Sectors select kvp)
|
||||
where sectorAddress - kvp.Value < cdrdaoTrack.Sectors
|
||||
select kvp)
|
||||
return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag, out buffer);
|
||||
|
||||
return ErrorNumber.SectorNotFound;
|
||||
@@ -980,7 +1018,7 @@ public sealed partial class Cdrdao
|
||||
uint sectorOffset;
|
||||
uint sectorSize;
|
||||
uint sectorSkip;
|
||||
bool mode2 = false;
|
||||
var mode2 = false;
|
||||
|
||||
switch(aaruTrack.Tracktype)
|
||||
{
|
||||
@@ -1036,7 +1074,8 @@ public sealed partial class Cdrdao
|
||||
|
||||
break;
|
||||
}
|
||||
default: return ErrorNumber.NotSupported;
|
||||
default:
|
||||
return ErrorNumber.NotSupported;
|
||||
}
|
||||
|
||||
if(aaruTrack.Subchannel)
|
||||
@@ -1057,9 +1096,9 @@ public sealed partial class Cdrdao
|
||||
|
||||
buffer = br.ReadBytes((int)((sectorSize + sectorSkip) * length));
|
||||
|
||||
for(int i = 0; i < length; i++)
|
||||
for(var i = 0; i < length; i++)
|
||||
{
|
||||
byte[] sector = new byte[sectorSize];
|
||||
var sector = new byte[sectorSize];
|
||||
Array.Copy(buffer, (sectorSize + sectorSkip) * i, sector, 0, sectorSize);
|
||||
sector = Sector.GetUserDataFromMode2(sector);
|
||||
mode2Ms.Write(sector, 0, sector.Length);
|
||||
@@ -1071,19 +1110,21 @@ public sealed partial class Cdrdao
|
||||
sectorSkip == 0)
|
||||
buffer = br.ReadBytes((int)(sectorSize * length));
|
||||
else
|
||||
for(int i = 0; i < length; i++)
|
||||
{
|
||||
for(var i = 0; i < length; i++)
|
||||
{
|
||||
br.BaseStream.Seek(sectorOffset, SeekOrigin.Current);
|
||||
byte[] sector = br.ReadBytes((int)sectorSize);
|
||||
br.BaseStream.Seek(sectorSkip, SeekOrigin.Current);
|
||||
Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize);
|
||||
}
|
||||
}
|
||||
|
||||
// cdrdao audio tracks are endian swapped corresponding to Aaru
|
||||
if(aaruTrack.Tracktype != CDRDAO_TRACK_TYPE_AUDIO)
|
||||
return ErrorNumber.NoError;
|
||||
|
||||
byte[] swapped = new byte[buffer.Length];
|
||||
var swapped = new byte[buffer.Length];
|
||||
|
||||
for(long i = 0; i < buffer.Length; i += 2)
|
||||
{
|
||||
@@ -1097,7 +1138,7 @@ public sealed partial class Cdrdao
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public ErrorNumber ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag,
|
||||
public ErrorNumber ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag,
|
||||
out byte[] buffer)
|
||||
{
|
||||
buffer = null;
|
||||
@@ -1140,7 +1181,8 @@ public sealed partial class Cdrdao
|
||||
case SectorTagType.CdSectorHeader:
|
||||
case SectorTagType.CdSectorSubchannel:
|
||||
case SectorTagType.CdSectorSubHeader:
|
||||
case SectorTagType.CdSectorSync: break;
|
||||
case SectorTagType.CdSectorSync:
|
||||
break;
|
||||
case SectorTagType.CdTrackFlags:
|
||||
{
|
||||
CdFlags flags = 0;
|
||||
@@ -1157,10 +1199,7 @@ public sealed partial class Cdrdao
|
||||
if(aaruTrack.Flag4Ch)
|
||||
flags |= CdFlags.FourChannel;
|
||||
|
||||
buffer = new[]
|
||||
{
|
||||
(byte)flags
|
||||
};
|
||||
buffer = new[] { (byte)flags };
|
||||
|
||||
return ErrorNumber.NoError;
|
||||
}
|
||||
@@ -1171,7 +1210,8 @@ public sealed partial class Cdrdao
|
||||
buffer = Encoding.UTF8.GetBytes(aaruTrack.Isrc);
|
||||
|
||||
return ErrorNumber.NoError;
|
||||
default: return ErrorNumber.NotSupported;
|
||||
default:
|
||||
return ErrorNumber.NotSupported;
|
||||
}
|
||||
|
||||
switch(aaruTrack.Tracktype)
|
||||
@@ -1229,7 +1269,8 @@ public sealed partial class Cdrdao
|
||||
|
||||
break;
|
||||
}
|
||||
case SectorTagType.CdSectorSubHeader: return ErrorNumber.NotSupported;
|
||||
case SectorTagType.CdSectorSubHeader:
|
||||
return ErrorNumber.NotSupported;
|
||||
case SectorTagType.CdSectorEcc:
|
||||
{
|
||||
sectorOffset = 2076;
|
||||
@@ -1274,7 +1315,8 @@ public sealed partial class Cdrdao
|
||||
sectorSize = 96;
|
||||
|
||||
break;
|
||||
default: return ErrorNumber.NotSupported;
|
||||
default:
|
||||
return ErrorNumber.NotSupported;
|
||||
}
|
||||
|
||||
buffer = new byte[sectorSize * length];
|
||||
@@ -1290,13 +1332,15 @@ public sealed partial class Cdrdao
|
||||
sectorSkip == 0)
|
||||
buffer = br.ReadBytes((int)(sectorSize * length));
|
||||
else
|
||||
for(int i = 0; i < length; i++)
|
||||
{
|
||||
for(var i = 0; i < length; i++)
|
||||
{
|
||||
br.BaseStream.Seek(sectorOffset, SeekOrigin.Current);
|
||||
byte[] sector = br.ReadBytes((int)sectorSize);
|
||||
br.BaseStream.Seek(sectorSkip, SeekOrigin.Current);
|
||||
Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize);
|
||||
}
|
||||
}
|
||||
|
||||
return ErrorNumber.NoError;
|
||||
}
|
||||
@@ -1314,10 +1358,12 @@ public sealed partial class Cdrdao
|
||||
{
|
||||
buffer = null;
|
||||
|
||||
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap where sectorAddress >= kvp.Value
|
||||
foreach(KeyValuePair<uint, ulong> kvp in from kvp in _offsetmap
|
||||
where sectorAddress >= kvp.Value
|
||||
from cdrdaoTrack in _discimage.Tracks
|
||||
where cdrdaoTrack.Sequence == kvp.Key
|
||||
where sectorAddress - kvp.Value < cdrdaoTrack.Sectors select kvp)
|
||||
where sectorAddress - kvp.Value < cdrdaoTrack.Sectors
|
||||
select kvp)
|
||||
return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key, out buffer);
|
||||
|
||||
return ErrorNumber.SectorNotFound;
|
||||
@@ -1388,7 +1434,8 @@ public sealed partial class Cdrdao
|
||||
|
||||
break;
|
||||
}
|
||||
default: return ErrorNumber.NotSupported;
|
||||
default:
|
||||
return ErrorNumber.NotSupported;
|
||||
}
|
||||
|
||||
if(aaruTrack.Subchannel)
|
||||
@@ -1405,7 +1452,8 @@ public sealed partial class Cdrdao
|
||||
if(sectorSkip == 0)
|
||||
buffer = br.ReadBytes((int)(sectorSize * length));
|
||||
else
|
||||
for(int i = 0; i < length; i++)
|
||||
{
|
||||
for(var i = 0; i < length; i++)
|
||||
{
|
||||
br.BaseStream.Seek(sectorOffset, SeekOrigin.Current);
|
||||
byte[] sector = br.ReadBytes((int)sectorSize);
|
||||
@@ -1413,13 +1461,14 @@ public sealed partial class Cdrdao
|
||||
|
||||
Array.Copy(sector, 0, buffer, i * sectorSize, sectorSize);
|
||||
}
|
||||
}
|
||||
|
||||
switch(aaruTrack.Tracktype)
|
||||
{
|
||||
case CDRDAO_TRACK_TYPE_MODE1:
|
||||
{
|
||||
byte[] fullSector = new byte[2352];
|
||||
byte[] fullBuffer = new byte[2352 * length];
|
||||
var fullSector = new byte[2352];
|
||||
var fullBuffer = new byte[2352 * length];
|
||||
|
||||
for(uint i = 0; i < length; i++)
|
||||
{
|
||||
@@ -1435,8 +1484,8 @@ public sealed partial class Cdrdao
|
||||
}
|
||||
case CDRDAO_TRACK_TYPE_MODE2_FORM1:
|
||||
{
|
||||
byte[] fullSector = new byte[2352];
|
||||
byte[] fullBuffer = new byte[2352 * length];
|
||||
var fullSector = new byte[2352];
|
||||
var fullBuffer = new byte[2352 * length];
|
||||
|
||||
for(uint i = 0; i < length; i++)
|
||||
{
|
||||
@@ -1454,8 +1503,8 @@ public sealed partial class Cdrdao
|
||||
}
|
||||
case CDRDAO_TRACK_TYPE_MODE2_FORM2:
|
||||
{
|
||||
byte[] fullSector = new byte[2352];
|
||||
byte[] fullBuffer = new byte[2352 * length];
|
||||
var fullSector = new byte[2352];
|
||||
var fullBuffer = new byte[2352 * length];
|
||||
|
||||
for(uint i = 0; i < length; i++)
|
||||
{
|
||||
@@ -1474,16 +1523,16 @@ public sealed partial class Cdrdao
|
||||
case CDRDAO_TRACK_TYPE_MODE2:
|
||||
case CDRDAO_TRACK_TYPE_MODE2_MIX:
|
||||
{
|
||||
byte[] fullSector = new byte[2352];
|
||||
byte[] fullBuffer = new byte[2352 * length];
|
||||
var fullSector = new byte[2352];
|
||||
var fullBuffer = new byte[2352 * length];
|
||||
|
||||
for(uint i = 0; i < length; i++)
|
||||
{
|
||||
_sectorBuilder.ReconstructPrefix(ref fullSector, TrackType.CdMode2Formless,
|
||||
(long)(sectorAddress + i));
|
||||
|
||||
Array.Copy(buffer, i * 2336, fullSector, 16, 2336);
|
||||
Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352);
|
||||
Array.Copy(buffer, i * 2336, fullSector, 16, 2336);
|
||||
Array.Copy(fullSector, 0, fullBuffer, i * 2352, 2352);
|
||||
}
|
||||
|
||||
buffer = fullBuffer;
|
||||
@@ -1494,7 +1543,7 @@ public sealed partial class Cdrdao
|
||||
// cdrdao audio tracks are endian swapped corresponding to Aaru
|
||||
case CDRDAO_TRACK_TYPE_AUDIO:
|
||||
{
|
||||
byte[] swapped = new byte[buffer.Length];
|
||||
var swapped = new byte[buffer.Length];
|
||||
|
||||
for(long i = 0; i < buffer.Length; i += 2)
|
||||
{
|
||||
@@ -1516,4 +1565,6 @@ public sealed partial class Cdrdao
|
||||
|
||||
/// <inheritdoc />
|
||||
public List<Track> GetSessionTracks(ushort session) => session == 1 ? Tracks : null;
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -39,6 +39,8 @@ namespace Aaru.DiscImages;
|
||||
|
||||
public sealed partial class Cdrdao
|
||||
{
|
||||
#region Nested type: CdrdaoTrackFile
|
||||
|
||||
[SuppressMessage("ReSharper", "NotAccessedField.Local")]
|
||||
struct CdrdaoTrackFile
|
||||
{
|
||||
@@ -54,7 +56,9 @@ public sealed partial class Cdrdao
|
||||
public string Filetype;
|
||||
}
|
||||
|
||||
#pragma warning disable 169
|
||||
#endregion
|
||||
|
||||
#pragma warning disable 169
|
||||
[SuppressMessage("ReSharper", "NotAccessedField.Local")]
|
||||
struct CdrdaoTrack
|
||||
{
|
||||
@@ -134,5 +138,5 @@ public sealed partial class Cdrdao
|
||||
/// <summary>Disk comment</summary>
|
||||
public string Comment;
|
||||
}
|
||||
#pragma warning restore 169
|
||||
#pragma warning restore 169
|
||||
}
|
||||
@@ -39,6 +39,8 @@ namespace Aaru.DiscImages;
|
||||
|
||||
public sealed partial class Cdrdao
|
||||
{
|
||||
#region IWritableOpticalImage Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool? VerifySector(ulong sectorAddress)
|
||||
{
|
||||
@@ -48,7 +50,7 @@ public sealed partial class Cdrdao
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas,
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
@@ -58,10 +60,10 @@ public sealed partial class Cdrdao
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return null;
|
||||
|
||||
int bps = (int)(buffer.Length / length);
|
||||
byte[] sector = new byte[bps];
|
||||
var bps = (int)(buffer.Length / length);
|
||||
var sector = new byte[bps];
|
||||
|
||||
for(int i = 0; i < length; i++)
|
||||
for(var i = 0; i < length; i++)
|
||||
{
|
||||
Array.Copy(buffer, i * bps, sector, 0, bps);
|
||||
bool? sectorStatus = CdChecksums.CheckCdSector(sector);
|
||||
@@ -86,7 +88,7 @@ public sealed partial class Cdrdao
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
|
||||
public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas,
|
||||
out List<ulong> unknownLbas)
|
||||
{
|
||||
failingLbas = new List<ulong>();
|
||||
@@ -96,10 +98,10 @@ public sealed partial class Cdrdao
|
||||
if(errno != ErrorNumber.NoError)
|
||||
return null;
|
||||
|
||||
int bps = (int)(buffer.Length / length);
|
||||
byte[] sector = new byte[bps];
|
||||
var bps = (int)(buffer.Length / length);
|
||||
var sector = new byte[bps];
|
||||
|
||||
for(int i = 0; i < length; i++)
|
||||
for(var i = 0; i < length; i++)
|
||||
{
|
||||
Array.Copy(buffer, i * bps, sector, 0, bps);
|
||||
bool? sectorStatus = CdChecksums.CheckCdSector(sector);
|
||||
@@ -122,4 +124,6 @@ public sealed partial class Cdrdao
|
||||
|
||||
return failingLbas.Count <= 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -46,9 +46,11 @@ namespace Aaru.DiscImages;
|
||||
|
||||
public sealed partial class Cdrdao
|
||||
{
|
||||
#region IWritableOpticalImage Members
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool Create(string path, MediaType mediaType, Dictionary<string, string> options, ulong sectors,
|
||||
uint sectorSize)
|
||||
uint sectorSize)
|
||||
{
|
||||
if(options != null)
|
||||
{
|
||||
@@ -184,7 +186,7 @@ public sealed partial class Cdrdao
|
||||
// cdrdao audio tracks are endian swapped corresponding to Aaru
|
||||
if(track.Type == TrackType.Audio)
|
||||
{
|
||||
byte[] swapped = new byte[data.Length];
|
||||
var swapped = new byte[data.Length];
|
||||
|
||||
for(long i = 0; i < swapped.Length; i += 2)
|
||||
{
|
||||
@@ -196,7 +198,7 @@ public sealed partial class Cdrdao
|
||||
}
|
||||
|
||||
trackStream.
|
||||
Seek((long)(track.FileOffset + ((sectorAddress - track.StartSector) * (ulong)track.RawBytesPerSector)),
|
||||
Seek((long)(track.FileOffset + (sectorAddress - track.StartSector) * (ulong)track.RawBytesPerSector),
|
||||
SeekOrigin.Begin);
|
||||
|
||||
trackStream.Write(data, 0, data.Length);
|
||||
@@ -257,7 +259,7 @@ public sealed partial class Cdrdao
|
||||
// cdrdao audio tracks are endian swapped corresponding to Aaru
|
||||
if(track.Type == TrackType.Audio)
|
||||
{
|
||||
byte[] swapped = new byte[data.Length];
|
||||
var swapped = new byte[data.Length];
|
||||
|
||||
for(long i = 0; i < swapped.Length; i += 2)
|
||||
{
|
||||
@@ -272,8 +274,9 @@ public sealed partial class Cdrdao
|
||||
{
|
||||
case TrackSubchannelType.None:
|
||||
trackStream.
|
||||
Seek((long)(track.FileOffset + ((sectorAddress - track.StartSector) * (ulong)track.RawBytesPerSector)),
|
||||
SeekOrigin.Begin);
|
||||
Seek(
|
||||
(long)(track.FileOffset + (sectorAddress - track.StartSector) * (ulong)track.RawBytesPerSector),
|
||||
SeekOrigin.Begin);
|
||||
|
||||
trackStream.Write(data, 0, data.Length);
|
||||
|
||||
@@ -283,8 +286,10 @@ public sealed partial class Cdrdao
|
||||
case TrackSubchannelType.Raw:
|
||||
case TrackSubchannelType.RawInterleaved:
|
||||
trackStream.
|
||||
Seek((long)(track.FileOffset + ((sectorAddress - track.StartSector) * (ulong)(track.RawBytesPerSector + 96))),
|
||||
SeekOrigin.Begin);
|
||||
Seek(
|
||||
(long)(track.FileOffset +
|
||||
(sectorAddress - track.StartSector) * (ulong)(track.RawBytesPerSector + 96)),
|
||||
SeekOrigin.Begin);
|
||||
|
||||
for(uint i = 0; i < length; i++)
|
||||
{
|
||||
@@ -341,7 +346,7 @@ public sealed partial class Cdrdao
|
||||
// cdrdao audio tracks are endian swapped corresponding to Aaru
|
||||
if(track.Type == TrackType.Audio)
|
||||
{
|
||||
byte[] swapped = new byte[data.Length];
|
||||
var swapped = new byte[data.Length];
|
||||
|
||||
for(long i = 0; i < swapped.Length; i += 2)
|
||||
{
|
||||
@@ -352,11 +357,13 @@ public sealed partial class Cdrdao
|
||||
data = swapped;
|
||||
}
|
||||
|
||||
uint subchannelSize = (uint)(track.SubchannelType != TrackSubchannelType.None ? 96 : 0);
|
||||
var subchannelSize = (uint)(track.SubchannelType != TrackSubchannelType.None ? 96 : 0);
|
||||
|
||||
trackStream.
|
||||
Seek((long)(track.FileOffset + ((sectorAddress - track.StartSector) * (ulong)(track.RawBytesPerSector + subchannelSize))),
|
||||
SeekOrigin.Begin);
|
||||
Seek(
|
||||
(long)(track.FileOffset + (sectorAddress - track.StartSector) *
|
||||
(ulong)(track.RawBytesPerSector + subchannelSize)),
|
||||
SeekOrigin.Begin);
|
||||
|
||||
trackStream.Write(data, 0, data.Length);
|
||||
|
||||
@@ -409,7 +416,7 @@ public sealed partial class Cdrdao
|
||||
// cdrdao audio tracks are endian swapped corresponding to Aaru
|
||||
if(track.Type == TrackType.Audio)
|
||||
{
|
||||
byte[] swapped = new byte[data.Length];
|
||||
var swapped = new byte[data.Length];
|
||||
|
||||
for(long i = 0; i < swapped.Length; i += 2)
|
||||
{
|
||||
@@ -420,13 +427,15 @@ public sealed partial class Cdrdao
|
||||
data = swapped;
|
||||
}
|
||||
|
||||
uint subchannelSize = (uint)(track.SubchannelType != TrackSubchannelType.None ? 96 : 0);
|
||||
var subchannelSize = (uint)(track.SubchannelType != TrackSubchannelType.None ? 96 : 0);
|
||||
|
||||
for(uint i = 0; i < length; i++)
|
||||
{
|
||||
trackStream.
|
||||
Seek((long)(track.FileOffset + ((i + sectorAddress - track.StartSector) * (ulong)(track.RawBytesPerSector + subchannelSize))),
|
||||
SeekOrigin.Begin);
|
||||
Seek(
|
||||
(long)(track.FileOffset + (i + sectorAddress - track.StartSector) *
|
||||
(ulong)(track.RawBytesPerSector + subchannelSize)),
|
||||
SeekOrigin.Begin);
|
||||
|
||||
trackStream.Write(data, (int)(i * track.RawBytesPerSector), track.RawBytesPerSector);
|
||||
}
|
||||
@@ -454,8 +463,10 @@ public sealed partial class Cdrdao
|
||||
|
||||
if(_writingTracks != null &&
|
||||
_writingStreams != null)
|
||||
{
|
||||
foreach(FileStream oldTrack in _writingStreams.Select(t => t.Value).Distinct())
|
||||
oldTrack.Close();
|
||||
}
|
||||
|
||||
ulong currentOffset = 0;
|
||||
_writingTracks = new List<Track>();
|
||||
@@ -470,8 +481,9 @@ public sealed partial class Cdrdao
|
||||
return false;
|
||||
}
|
||||
|
||||
track.File = _separateTracksWriting ? _writingBaseName + $"_track{track.Sequence:D2}.bin"
|
||||
: _writingBaseName + ".bin";
|
||||
track.File = _separateTracksWriting
|
||||
? _writingBaseName + $"_track{track.Sequence:D2}.bin"
|
||||
: _writingBaseName + ".bin";
|
||||
|
||||
track.FileOffset = _separateTracksWriting ? 0 : currentOffset;
|
||||
_writingTracks.Add(track);
|
||||
@@ -485,10 +497,14 @@ public sealed partial class Cdrdao
|
||||
_writingStreams = new Dictionary<uint, FileStream>();
|
||||
|
||||
if(_separateTracksWriting)
|
||||
{
|
||||
foreach(Track track in _writingTracks)
|
||||
{
|
||||
_writingStreams.Add(track.Sequence,
|
||||
new FileStream(track.File, FileMode.OpenOrCreate, FileAccess.ReadWrite,
|
||||
FileShare.None));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var jointStream = new FileStream(_writingBaseName + ".bin", FileMode.OpenOrCreate, FileAccess.ReadWrite,
|
||||
@@ -512,11 +528,13 @@ public sealed partial class Cdrdao
|
||||
}
|
||||
|
||||
if(_separateTracksWriting)
|
||||
{
|
||||
foreach(FileStream writingStream in _writingStreams.Values)
|
||||
{
|
||||
writingStream.Flush();
|
||||
writingStream.Close();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_writingStreams.First().Value.Flush();
|
||||
@@ -527,7 +545,7 @@ public sealed partial class Cdrdao
|
||||
|
||||
bool mode2 =
|
||||
_writingTracks.Count(t => t.Type is TrackType.CdMode2Form1 or TrackType.CdMode2Form2
|
||||
or TrackType.CdMode2Formless) > 0;
|
||||
or TrackType.CdMode2Formless) > 0;
|
||||
|
||||
if(mode2)
|
||||
_descriptorStream.WriteLine("CD_ROM_XA");
|
||||
@@ -538,10 +556,7 @@ public sealed partial class Cdrdao
|
||||
|
||||
if(!string.IsNullOrWhiteSpace(_discimage.Comment))
|
||||
{
|
||||
string[] commentLines = _discimage.Comment.Split(new[]
|
||||
{
|
||||
'\n'
|
||||
}, StringSplitOptions.RemoveEmptyEntries);
|
||||
string[] commentLines = _discimage.Comment.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
foreach(string line in commentLines)
|
||||
_descriptorStream.WriteLine("// {0}", line);
|
||||
@@ -711,8 +726,11 @@ public sealed partial class Cdrdao
|
||||
}
|
||||
|
||||
trackStream.
|
||||
Seek((long)(track.FileOffset + ((sectorAddress - track.StartSector) * (ulong)(track.RawBytesPerSector + 96))) + track.RawBytesPerSector,
|
||||
SeekOrigin.Begin);
|
||||
Seek(
|
||||
(long)(track.FileOffset +
|
||||
(sectorAddress - track.StartSector) * (ulong)(track.RawBytesPerSector + 96)) +
|
||||
track.RawBytesPerSector,
|
||||
SeekOrigin.Begin);
|
||||
|
||||
trackStream.Write(data, 0, data.Length);
|
||||
|
||||
@@ -748,7 +766,8 @@ public sealed partial class Cdrdao
|
||||
switch(tag)
|
||||
{
|
||||
case SectorTagType.CdTrackFlags:
|
||||
case SectorTagType.CdTrackIsrc: return WriteSectorTag(data, sectorAddress, tag);
|
||||
case SectorTagType.CdTrackIsrc:
|
||||
return WriteSectorTag(data, sectorAddress, tag);
|
||||
case SectorTagType.CdSectorSubchannel:
|
||||
{
|
||||
if(track.SubchannelType == 0)
|
||||
@@ -779,8 +798,10 @@ public sealed partial class Cdrdao
|
||||
for(uint i = 0; i < length; i++)
|
||||
{
|
||||
trackStream.
|
||||
Seek((long)(track.FileOffset + ((i + sectorAddress - track.StartSector) * (ulong)(track.RawBytesPerSector + 96))) + track.RawBytesPerSector,
|
||||
SeekOrigin.Begin);
|
||||
Seek(
|
||||
(long)(track.FileOffset + (i + sectorAddress - track.StartSector) *
|
||||
(ulong)(track.RawBytesPerSector + 96)) + track.RawBytesPerSector,
|
||||
SeekOrigin.Begin);
|
||||
|
||||
trackStream.Write(data, (int)(i * 96), 96);
|
||||
}
|
||||
@@ -799,4 +820,6 @@ public sealed partial class Cdrdao
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool SetMetadata(Metadata metadata) => false;
|
||||
|
||||
#endregion
|
||||
}
|
||||
Reference in New Issue
Block a user