Add support for Alcohol disc images created by CDRWin 10 and GameJack.

This commit is contained in:
2021-07-10 01:04:33 +01:00
parent c678eab410
commit 1b44d37b35
3 changed files with 42 additions and 18 deletions

View File

@@ -46,9 +46,10 @@ namespace Aaru.DiscImages
[SuppressMessage("ReSharper", "InconsistentNaming")]
enum TrackMode : byte
{
NoData = 0x00, DVD = 0x02, Audio = 0xA9,
Mode1 = 0xAA, Mode2 = 0xAB, Mode2F1 = 0xEC,
Mode2F2 = 0xED, Mode2F1Alt = 0xAC, Mode2F2Alt = 0xAD
NoData = 0x00, DVD = 0x02, Audio = 0xA9,
AudioAlt = 0xE9, Mode1 = 0xAA, Mode1Alt = 0xEA,
Mode2 = 0xAB, Mode2F1 = 0xEC, Mode2F2 = 0xED,
Mode2F1Alt = 0xAC, Mode2F2Alt = 0xAD
}
enum SubchannelMode : byte

View File

@@ -42,14 +42,16 @@ namespace Aaru.DiscImages
switch(trackMode)
{
case TrackMode.Mode1:
case TrackMode.Mode1Alt:
case TrackMode.Mode2F1:
case TrackMode.Mode2F1Alt: return 2048;
case TrackMode.Mode2F2:
case TrackMode.Mode2F2Alt: return 2324;
case TrackMode.Mode2: return 2336;
case TrackMode.Audio: return 2352;
case TrackMode.DVD: return 2048;
default: return 0;
case TrackMode.Audio:
case TrackMode.AudioAlt: return 2352;
case TrackMode.DVD: return 2048;
default: return 0;
}
}
@@ -57,14 +59,16 @@ namespace Aaru.DiscImages
{
switch(trackType)
{
case TrackMode.Mode1: return TrackType.CdMode1;
case TrackMode.Mode1:
case TrackMode.Mode1Alt: return TrackType.CdMode1;
case TrackMode.Mode2F1:
case TrackMode.Mode2F1Alt: return TrackType.CdMode2Form1;
case TrackMode.Mode2F2:
case TrackMode.Mode2F2Alt: return TrackType.CdMode2Form2;
case TrackMode.Mode2: return TrackType.CdMode2Formless;
case TrackMode.Audio: return TrackType.Audio;
default: return TrackType.Data;
case TrackMode.Audio:
case TrackMode.AudioAlt: return TrackType.Audio;
default: return TrackType.Data;
}
}
@@ -147,6 +151,6 @@ namespace Aaru.DiscImages
}
static (byte minute, byte second, byte frame) LbaToMsf(ulong sector) =>
((byte)((sector + 150) / 75 / 60), (byte)(((sector + 150) / 75) % 60), (byte)((sector + 150) % 75));
((byte)((sector + 150) / 75 / 60), (byte)((sector + 150) / 75 % 60), (byte)((sector + 150) % 75));
}
}

View File

@@ -317,15 +317,23 @@ namespace Aaru.DiscImages
stream.Read(filename, 0, filename.Length);
alcFile = _alcFooter.widechar == 1 ? Encoding.Unicode.GetString(filename)
: Encoding.Default.GetString(filename);
alcFile = _alcFooter.widechar == 1 ? StringHandlers.CToString(filename, Encoding.Unicode, true)
: StringHandlers.CToString(filename, Encoding.Default);
AaruConsole.DebugWriteLine("Alcohol 120% plugin", "footer.filename = {0}", alcFile);
}
if(_alcFooter.filenameOffset == 0 ||
string.Compare(alcFile, "*.mdf", StringComparison.InvariantCultureIgnoreCase) == 0)
if(_alcFooter.filenameOffset == 0)
{
if(Path.GetExtension(imageFilter.GetBasePath()).ToLowerInvariant() == ".mds")
alcFile = Path.GetFileNameWithoutExtension(imageFilter.GetBasePath()) + ".mdf";
else if(Path.GetExtension(imageFilter.GetBasePath()).ToLowerInvariant() == ".xmd")
alcFile = Path.GetFileNameWithoutExtension(imageFilter.GetBasePath()) + ".xmf";
}
else if(string.Compare(alcFile, "*.mdf", StringComparison.InvariantCultureIgnoreCase) == 0)
alcFile = Path.GetFileNameWithoutExtension(imageFilter.GetBasePath()) + ".mdf";
else if(string.Compare(alcFile, "*.xmf", StringComparison.InvariantCultureIgnoreCase) == 0)
alcFile = Path.GetFileNameWithoutExtension(imageFilter.GetBasePath()) + ".xmf";
if(_header.bcaLength > 0 &&
_header.bcaOffset > 0 &&
@@ -494,16 +502,20 @@ namespace Aaru.DiscImages
foreach(Track alcoholTrack in _alcTracks.Values)
{
// First track is audio
firstAudio |= alcoholTrack.point == 1 && alcoholTrack.mode == TrackMode.Audio;
firstAudio |= alcoholTrack.point == 1 &&
(alcoholTrack.mode == TrackMode.Audio || alcoholTrack.mode == TrackMode.AudioAlt);
// First track is data
firstData |= alcoholTrack.point == 1 && alcoholTrack.mode != TrackMode.Audio;
firstData |= alcoholTrack.point == 1 &&
(alcoholTrack.mode != TrackMode.Audio || alcoholTrack.mode != TrackMode.AudioAlt);
// Any non first track is data
data |= alcoholTrack.point != 1 && alcoholTrack.mode != TrackMode.Audio;
data |= alcoholTrack.point != 1 &&
(alcoholTrack.mode != TrackMode.Audio || alcoholTrack.mode != TrackMode.AudioAlt);
// Any non first track is audio
audio |= alcoholTrack.point != 1 && alcoholTrack.mode == TrackMode.Audio;
audio |= alcoholTrack.point != 1 &&
(alcoholTrack.mode == TrackMode.Audio || alcoholTrack.mode == TrackMode.AudioAlt);
switch(alcoholTrack.mode)
{
@@ -565,6 +577,7 @@ namespace Aaru.DiscImages
switch(trk.mode)
{
case TrackMode.Mode1:
case TrackMode.Mode1Alt:
case TrackMode.Mode2F1:
case TrackMode.Mode2F1Alt:
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
@@ -833,6 +846,7 @@ namespace Aaru.DiscImages
switch(alcTrack.mode)
{
case TrackMode.Mode1:
case TrackMode.Mode1Alt:
{
sectorOffset = 16;
sectorSize = 2048;
@@ -856,6 +870,7 @@ namespace Aaru.DiscImages
}
case TrackMode.Audio:
case TrackMode.AudioAlt:
{
sectorOffset = 0;
sectorSize = 2352;
@@ -984,6 +999,7 @@ namespace Aaru.DiscImages
switch(alcTrack.mode)
{
case TrackMode.Mode1:
case TrackMode.Mode1Alt:
switch(tag)
{
case SectorTagType.CdSectorSync:
@@ -1264,6 +1280,7 @@ namespace Aaru.DiscImages
break;
case TrackMode.Audio:
case TrackMode.AudioAlt:
{
switch(tag)
{
@@ -1383,12 +1400,14 @@ namespace Aaru.DiscImages
switch(alcTrack.mode)
{
case TrackMode.Mode1:
case TrackMode.Mode1Alt:
case TrackMode.Mode2:
case TrackMode.Mode2F1:
case TrackMode.Mode2F1Alt:
case TrackMode.Mode2F2:
case TrackMode.Mode2F2Alt:
case TrackMode.Audio:
case TrackMode.AudioAlt:
case TrackMode.DVD:
{
sectorOffset = 0;