From 1b44d37b357e3d8015fd2ff735b5bbe82e521b3e Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 10 Jul 2021 01:04:33 +0100 Subject: [PATCH] Add support for Alcohol disc images created by CDRWin 10 and GameJack. --- Aaru.Images/Alcohol120/Enums.cs | 7 ++++--- Aaru.Images/Alcohol120/Helpers.cs | 18 +++++++++------- Aaru.Images/Alcohol120/Read.cs | 35 ++++++++++++++++++++++++------- 3 files changed, 42 insertions(+), 18 deletions(-) diff --git a/Aaru.Images/Alcohol120/Enums.cs b/Aaru.Images/Alcohol120/Enums.cs index f22b28fa3..6881aa5c3 100644 --- a/Aaru.Images/Alcohol120/Enums.cs +++ b/Aaru.Images/Alcohol120/Enums.cs @@ -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 diff --git a/Aaru.Images/Alcohol120/Helpers.cs b/Aaru.Images/Alcohol120/Helpers.cs index d48ddd636..63aef5989 100644 --- a/Aaru.Images/Alcohol120/Helpers.cs +++ b/Aaru.Images/Alcohol120/Helpers.cs @@ -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)); } } \ No newline at end of file diff --git a/Aaru.Images/Alcohol120/Read.cs b/Aaru.Images/Alcohol120/Read.cs index 2dae7f8f7..902912393 100644 --- a/Aaru.Images/Alcohol120/Read.cs +++ b/Aaru.Images/Alcohol120/Read.cs @@ -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;