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

@@ -47,8 +47,9 @@ namespace Aaru.DiscImages
enum TrackMode : byte enum TrackMode : byte
{ {
NoData = 0x00, DVD = 0x02, Audio = 0xA9, NoData = 0x00, DVD = 0x02, Audio = 0xA9,
Mode1 = 0xAA, Mode2 = 0xAB, Mode2F1 = 0xEC, AudioAlt = 0xE9, Mode1 = 0xAA, Mode1Alt = 0xEA,
Mode2F2 = 0xED, Mode2F1Alt = 0xAC, Mode2F2Alt = 0xAD Mode2 = 0xAB, Mode2F1 = 0xEC, Mode2F2 = 0xED,
Mode2F1Alt = 0xAC, Mode2F2Alt = 0xAD
} }
enum SubchannelMode : byte enum SubchannelMode : byte

View File

@@ -42,12 +42,14 @@ namespace Aaru.DiscImages
switch(trackMode) switch(trackMode)
{ {
case TrackMode.Mode1: case TrackMode.Mode1:
case TrackMode.Mode1Alt:
case TrackMode.Mode2F1: case TrackMode.Mode2F1:
case TrackMode.Mode2F1Alt: return 2048; case TrackMode.Mode2F1Alt: return 2048;
case TrackMode.Mode2F2: case TrackMode.Mode2F2:
case TrackMode.Mode2F2Alt: return 2324; case TrackMode.Mode2F2Alt: return 2324;
case TrackMode.Mode2: return 2336; case TrackMode.Mode2: return 2336;
case TrackMode.Audio: return 2352; case TrackMode.Audio:
case TrackMode.AudioAlt: return 2352;
case TrackMode.DVD: return 2048; case TrackMode.DVD: return 2048;
default: return 0; default: return 0;
} }
@@ -57,13 +59,15 @@ namespace Aaru.DiscImages
{ {
switch(trackType) switch(trackType)
{ {
case TrackMode.Mode1: return TrackType.CdMode1; case TrackMode.Mode1:
case TrackMode.Mode1Alt: return TrackType.CdMode1;
case TrackMode.Mode2F1: case TrackMode.Mode2F1:
case TrackMode.Mode2F1Alt: return TrackType.CdMode2Form1; case TrackMode.Mode2F1Alt: return TrackType.CdMode2Form1;
case TrackMode.Mode2F2: case TrackMode.Mode2F2:
case TrackMode.Mode2F2Alt: return TrackType.CdMode2Form2; case TrackMode.Mode2F2Alt: return TrackType.CdMode2Form2;
case TrackMode.Mode2: return TrackType.CdMode2Formless; case TrackMode.Mode2: return TrackType.CdMode2Formless;
case TrackMode.Audio: return TrackType.Audio; case TrackMode.Audio:
case TrackMode.AudioAlt: return TrackType.Audio;
default: return TrackType.Data; default: return TrackType.Data;
} }
} }
@@ -147,6 +151,6 @@ namespace Aaru.DiscImages
} }
static (byte minute, byte second, byte frame) LbaToMsf(ulong sector) => 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); stream.Read(filename, 0, filename.Length);
alcFile = _alcFooter.widechar == 1 ? Encoding.Unicode.GetString(filename) alcFile = _alcFooter.widechar == 1 ? StringHandlers.CToString(filename, Encoding.Unicode, true)
: Encoding.Default.GetString(filename); : StringHandlers.CToString(filename, Encoding.Default);
AaruConsole.DebugWriteLine("Alcohol 120% plugin", "footer.filename = {0}", alcFile); AaruConsole.DebugWriteLine("Alcohol 120% plugin", "footer.filename = {0}", alcFile);
} }
if(_alcFooter.filenameOffset == 0 || if(_alcFooter.filenameOffset == 0)
string.Compare(alcFile, "*.mdf", StringComparison.InvariantCultureIgnoreCase) == 0) {
if(Path.GetExtension(imageFilter.GetBasePath()).ToLowerInvariant() == ".mds")
alcFile = Path.GetFileNameWithoutExtension(imageFilter.GetBasePath()) + ".mdf"; 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 && if(_header.bcaLength > 0 &&
_header.bcaOffset > 0 && _header.bcaOffset > 0 &&
@@ -494,16 +502,20 @@ namespace Aaru.DiscImages
foreach(Track alcoholTrack in _alcTracks.Values) foreach(Track alcoholTrack in _alcTracks.Values)
{ {
// First track is audio // 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 // 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 // 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 // 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) switch(alcoholTrack.mode)
{ {
@@ -565,6 +577,7 @@ namespace Aaru.DiscImages
switch(trk.mode) switch(trk.mode)
{ {
case TrackMode.Mode1: case TrackMode.Mode1:
case TrackMode.Mode1Alt:
case TrackMode.Mode2F1: case TrackMode.Mode2F1:
case TrackMode.Mode2F1Alt: case TrackMode.Mode2F1Alt:
if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync)) if(!_imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSync))
@@ -833,6 +846,7 @@ namespace Aaru.DiscImages
switch(alcTrack.mode) switch(alcTrack.mode)
{ {
case TrackMode.Mode1: case TrackMode.Mode1:
case TrackMode.Mode1Alt:
{ {
sectorOffset = 16; sectorOffset = 16;
sectorSize = 2048; sectorSize = 2048;
@@ -856,6 +870,7 @@ namespace Aaru.DiscImages
} }
case TrackMode.Audio: case TrackMode.Audio:
case TrackMode.AudioAlt:
{ {
sectorOffset = 0; sectorOffset = 0;
sectorSize = 2352; sectorSize = 2352;
@@ -984,6 +999,7 @@ namespace Aaru.DiscImages
switch(alcTrack.mode) switch(alcTrack.mode)
{ {
case TrackMode.Mode1: case TrackMode.Mode1:
case TrackMode.Mode1Alt:
switch(tag) switch(tag)
{ {
case SectorTagType.CdSectorSync: case SectorTagType.CdSectorSync:
@@ -1264,6 +1280,7 @@ namespace Aaru.DiscImages
break; break;
case TrackMode.Audio: case TrackMode.Audio:
case TrackMode.AudioAlt:
{ {
switch(tag) switch(tag)
{ {
@@ -1383,12 +1400,14 @@ namespace Aaru.DiscImages
switch(alcTrack.mode) switch(alcTrack.mode)
{ {
case TrackMode.Mode1: case TrackMode.Mode1:
case TrackMode.Mode1Alt:
case TrackMode.Mode2: case TrackMode.Mode2:
case TrackMode.Mode2F1: case TrackMode.Mode2F1:
case TrackMode.Mode2F1Alt: case TrackMode.Mode2F1Alt:
case TrackMode.Mode2F2: case TrackMode.Mode2F2:
case TrackMode.Mode2F2Alt: case TrackMode.Mode2F2Alt:
case TrackMode.Audio: case TrackMode.Audio:
case TrackMode.AudioAlt:
case TrackMode.DVD: case TrackMode.DVD:
{ {
sectorOffset = 0; sectorOffset = 0;