Process track entries from CloneCD disc images.

This commit is contained in:
2021-07-11 19:44:13 +01:00
parent 09bc86cc29
commit 5ae5c069a2
2 changed files with 60 additions and 11 deletions

View File

@@ -64,5 +64,7 @@ namespace Aaru.DiscImages
const string ENTRY_PLBA = @"^\s*PLBA\s*=\s*(?<value>\d+)";
const string CDTEXT_ENTRIES = @"^\s*Entries\s*=\s*(?<value>\d+)";
const string CDTEXT_ENTRY = @"^\s*Entry\s*(?<number>\d+)\s*=\s*(?<value>([0-9a-fA-F]+\s*)+)";
const string TRACK_MODE = @"^\s*MODE\s*=\s*(?<value>\d+)";
const string TRACK_INDEX = @"^\s*INDEX\s*(?<index>\d+)\s*=\s*(?<lba>\d+)";
}
}

View File

@@ -91,18 +91,23 @@ namespace Aaru.DiscImages
var entPlbaRegex = new Regex(ENTRY_PLBA);
var cdtEntsRegex = new Regex(CDTEXT_ENTRIES);
var cdtEntRegex = new Regex(CDTEXT_ENTRY);
var trkModeRegex = new Regex(TRACK_MODE);
var trkIndexRegex = new Regex(TRACK_INDEX);
bool inCcd = false;
bool inDisk = false;
bool inSession = false;
bool inEntry = false;
bool inTrack = false;
bool inCdText = false;
var cdtMs = new MemoryStream();
int minSession = int.MaxValue;
int maxSession = int.MinValue;
var currentEntry = new FullTOC.TrackDataDescriptor();
List<FullTOC.TrackDataDescriptor> entries = new List<FullTOC.TrackDataDescriptor>();
bool inCcd = false;
bool inDisk = false;
bool inSession = false;
bool inEntry = false;
bool inTrack = false;
bool inCdText = false;
var cdtMs = new MemoryStream();
int minSession = int.MaxValue;
int maxSession = int.MinValue;
var currentEntry = new FullTOC.TrackDataDescriptor();
byte currentTrackEntry = 0;
Dictionary<byte, int> trackModes = new Dictionary<byte, int>();
Dictionary<byte, Dictionary<byte, int>> trackIndexes = new Dictionary<byte, Dictionary<byte, int>>();
List<FullTOC.TrackDataDescriptor> entries = new List<FullTOC.TrackDataDescriptor>();
_scrambled = false;
_catalog = null;
@@ -154,6 +159,9 @@ namespace Aaru.DiscImages
inEntry = entryIdMatch.Success;
inTrack = trackIdMatch.Success;
inCdText = cdtIdMatch.Success;
if(inTrack)
currentTrackEntry = Convert.ToByte(trackIdMatch.Groups["number"].Value, 10);
}
else
{
@@ -331,6 +339,26 @@ namespace Aaru.DiscImages
else if(entPlbaMatch.Success)
AaruConsole.DebugWriteLine("CloneCD plugin", "Found PLBA at line {0}", lineNumber);
}
else if(inTrack)
{
Match trkModeMatch = trkModeRegex.Match(line);
Match trkIndexMatch = trkIndexRegex.Match(line);
if(trkModeMatch.Success &&
currentTrackEntry > 0)
trackModes[currentTrackEntry] = Convert.ToByte(trkModeMatch.Groups["value"].Value, 10);
else if(trkIndexMatch.Success &&
currentTrackEntry > 0)
{
byte indexNo = Convert.ToByte(trkIndexMatch.Groups["index"].Value, 10);
int indexLba = Convert.ToInt32(trkIndexMatch.Groups["lba"].Value, 10);
if(!trackIndexes.TryGetValue(currentTrackEntry, out _))
trackIndexes[currentTrackEntry] = new Dictionary<byte, int>();
trackIndexes[currentTrackEntry][indexNo] = indexLba;
}
}
}
}
@@ -573,6 +601,25 @@ namespace Aaru.DiscImages
}
}
if(trackModes.TryGetValue((byte)tmpTrack.TrackSequence, out int trackMode))
tmpTrack.TrackType = trackMode switch
{
1 => TrackType.CdMode1,
2 => TrackType.CdMode2Formless
};
if(trackIndexes.TryGetValue((byte)tmpTrack.TrackSequence, out Dictionary<byte, int> indexes))
{
foreach(KeyValuePair<byte, int> trackIndex in indexes.OrderBy(i => i.Key))
{
if(trackIndex.Key <= 1)
continue;
// Untested as of 20210711
tmpTrack.Indexes[trackIndex.Key] = tmpTrack.Indexes[1] + trackIndex.Value;
}
}
if(tmpTrack.TrackType == TrackType.Data)
{
for(int s = 225; s < 750; s++)