From de5ae7245eb3c29d7579890bb1e5f8281d71b653 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Sat, 20 Jun 2020 20:51:33 +0100 Subject: [PATCH] Fix CDRWin indexes. --- .idea/.idea.Aaru/.idea/contentModel.xml | 2 - Aaru.Images/CDRWin/Helpers.cs | 10 ++--- Aaru.Images/CDRWin/Properties.cs | 27 +++++++++---- Aaru.Images/CDRWin/Read.cs | 52 +++++++++++++++--------- Aaru.Images/CDRWin/Structs.cs | 54 ++++++++++++------------- 5 files changed, 83 insertions(+), 62 deletions(-) diff --git a/.idea/.idea.Aaru/.idea/contentModel.xml b/.idea/.idea.Aaru/.idea/contentModel.xml index 0f893557f..50353d339 100644 --- a/.idea/.idea.Aaru/.idea/contentModel.xml +++ b/.idea/.idea.Aaru/.idea/contentModel.xml @@ -5,8 +5,6 @@ - - diff --git a/Aaru.Images/CDRWin/Helpers.cs b/Aaru.Images/CDRWin/Helpers.cs index 438391486..06e96b4b6 100644 --- a/Aaru.Images/CDRWin/Helpers.cs +++ b/Aaru.Images/CDRWin/Helpers.cs @@ -38,14 +38,14 @@ namespace Aaru.DiscImages { public partial class CdrWin { - static ulong CdrWinMsfToLba(string msf) + static int CdrWinMsfToLba(string msf) { string[] msfElements = msf.Split(':'); - ulong minute = ulong.Parse(msfElements[0]); - ulong second = ulong.Parse(msfElements[1]); - ulong frame = ulong.Parse(msfElements[2]); + int minute = int.Parse(msfElements[0]); + int second = int.Parse(msfElements[1]); + int frame = int.Parse(msfElements[2]); - ulong sectors = (minute * 60 * 75) + (second * 75) + frame; + int sectors = (minute * 60 * 75) + (second * 75) + frame; return sectors; } diff --git a/Aaru.Images/CDRWin/Properties.cs b/Aaru.Images/CDRWin/Properties.cs index e1adfb8ac..ca6940dc5 100644 --- a/Aaru.Images/CDRWin/Properties.cs +++ b/Aaru.Images/CDRWin/Properties.cs @@ -74,7 +74,7 @@ namespace Aaru.DiscImages { var aaruTrack = new Track { - TrackDescription = cdrTrack.Title, TrackPregap = cdrTrack.Pregap, + TrackDescription = cdrTrack.Title, TrackPregap = (ulong)cdrTrack.Pregap, TrackSession = cdrTrack.Session, TrackSequence = cdrTrack.Sequence, TrackType = CdrWinTrackTypeToTrackType(cdrTrack.TrackType), TrackFile = cdrTrack.TrackFile.DataFilter.GetFilename(), @@ -83,22 +83,33 @@ namespace Aaru.DiscImages TrackBytesPerSector = CdrWinTrackTypeToCookedBytesPerSector(cdrTrack.TrackType) }; + if(aaruTrack.TrackSequence == 1) + { + aaruTrack.TrackPregap = 150; + aaruTrack.Indexes[0] = -150; + } + if(previousTrackFile == aaruTrack.TrackFile || previousTrackFile == "") - { - if(!cdrTrack.Indexes.TryGetValue(0, out aaruTrack.TrackStartSector)) - if(!cdrTrack.Indexes.TryGetValue(1, out aaruTrack.TrackStartSector)) - aaruTrack.TrackStartSector += previousStartSector; - } + if(cdrTrack.Indexes.TryGetValue(0, out int idx0)) + if(idx0 > 0) + aaruTrack.TrackStartSector = (ulong)idx0; + else + aaruTrack.TrackStartSector = 0; + else if(cdrTrack.Indexes.TryGetValue(1, out int idx1)) + aaruTrack.TrackStartSector = (ulong)idx1; + else + aaruTrack.TrackStartSector += previousStartSector; else aaruTrack.TrackStartSector += previousStartSector; + foreach((ushort index, int position) in cdrTrack.Indexes) + aaruTrack.Indexes[index] = position; + if(_discImage.IsRedumpGigadisc && cdrTrack.Session == 2 && previousStartSector < gdRomSession2Offset) - { aaruTrack.TrackStartSector = gdRomSession2Offset; - } previousTrackFile = cdrTrack.TrackFile.DataFilter.GetFilename(); diff --git a/Aaru.Images/CDRWin/Read.cs b/Aaru.Images/CDRWin/Read.cs index 6bbef912e..7d5f4b2e0 100644 --- a/Aaru.Images/CDRWin/Read.cs +++ b/Aaru.Images/CDRWin/Read.cs @@ -117,15 +117,15 @@ namespace Aaru.DiscImages var currentTrack = new CdrWinTrack { - Indexes = new Dictionary() + Indexes = new Dictionary() }; - var currentFile = new CdrWinTrackFile(); - ulong currentFileOffsetSector = 0; + var currentFile = new CdrWinTrackFile(); + long currentFileOffsetSector = 0; int trackCount = 0; - Dictionary leadouts = new Dictionary(); + Dictionary leadouts = new Dictionary(); while(_cueStream.Peek() >= 0) { @@ -627,8 +627,8 @@ namespace Aaru.DiscImages if(!inTrack) throw new FeatureUnsupportedImageException($"Found INDEX before a track {lineNumber}"); - int index = int.Parse(matchIndex.Groups[1].Value); - ulong offset = CdrWinMsfToLba(matchIndex.Groups[2].Value); + ushort index = ushort.Parse(matchIndex.Groups[1].Value); + int offset = CdrWinMsfToLba(matchIndex.Groups[2].Value); if(index != 0 && index != 1 && @@ -641,7 +641,8 @@ namespace Aaru.DiscImages if((int)(currentTrack.Sequence - 2) >= 0 && offset > 1) { - cueTracks[currentTrack.Sequence - 2].Sectors = offset - currentFileOffsetSector; + cueTracks[currentTrack.Sequence - 2].Sectors = + (ulong)(offset - (int)currentFileOffsetSector); currentFile.Offset += cueTracks[currentTrack.Sequence - 2].Sectors * @@ -665,7 +666,7 @@ namespace Aaru.DiscImages AaruConsole.DebugWriteLine("CDRWin plugin", "Sets currentFile.offset to {0}", offset * currentTrack.Bps); - currentFile.Offset = offset * currentTrack.Bps; + currentFile.Offset = (ulong)(offset * currentTrack.Bps); } currentFileOffsetSector = offset; @@ -758,7 +759,7 @@ namespace Aaru.DiscImages currentTrack = new CdrWinTrack { - Indexes = new Dictionary(), + Indexes = new Dictionary(), Sequence = uint.Parse(matchTrack.Groups[1].Value) }; @@ -827,28 +828,39 @@ namespace Aaru.DiscImages sessions[s - 1].StartTrack = cueTracks[firstSessionTrk].Sequence; sessions[s - 1].EndTrack = cueTracks[lastSessionTrack].Sequence; - if(leadouts.TryGetValue((byte)s, out ulong leadout)) + if(leadouts.TryGetValue((byte)s, out int leadout)) { - sessions[s - 1].EndSector = leadout - 1; + sessions[s - 1].EndSector = (ulong)(leadout - 1); - if(!cueTracks[lastSessionTrack].Indexes.TryGetValue(0, out ulong startSector)) + if(!cueTracks[lastSessionTrack].Indexes.TryGetValue(0, out int startSector)) cueTracks[lastSessionTrack].Indexes.TryGetValue(1, out startSector); - cueTracks[lastSessionTrack].Sectors = leadout - startSector; + cueTracks[lastSessionTrack].Sectors = (ulong)(leadout - startSector); } else sessions[s - 1].EndSector = (sessions[s - 1].StartSector + sessionSectors) - 1; CdrWinTrack firstSessionTrack = cueTracks.OrderBy(t => t.Sequence).First(t => t.Session == s); + firstSessionTrack.Indexes.TryGetValue(0, out firstSessionTrack.Pregap); + + if(firstSessionTrack.Pregap < 150) + firstSessionTrack.Pregap = 150; + if(cueTracks.All(i => i.TrackFile.DataFilter.GetFilename() == cueTracks.First().TrackFile.DataFilter.GetFilename())) { - if(firstSessionTrack.Indexes.TryGetValue(0, out sessions[s - 1].StartSector)) - continue; + if(firstSessionTrack.Indexes.TryGetValue(0, out int sessionStart)) + { + sessions[s - 1].StartSector = (ulong)sessionStart; - if(firstSessionTrack.Indexes.TryGetValue(1, out sessions[s - 1].StartSector)) continue; + } + + if(firstSessionTrack.Indexes.TryGetValue(1, out sessionStart)) + { + sessions[s - 1].StartSector = (ulong)sessionStart; + } } } @@ -857,8 +869,8 @@ namespace Aaru.DiscImages for(int t = 1; t <= cueTracks.Length; t++) { - if(cueTracks[t - 1].Indexes.TryGetValue(0, out ulong idx0) && - cueTracks[t - 1].Indexes.TryGetValue(1, out ulong idx1)) + if(cueTracks[t - 1].Indexes.TryGetValue(0, out int idx0) && + cueTracks[t - 1].Indexes.TryGetValue(1, out int idx1)) cueTracks[t - 1].Pregap = idx1 - idx0; _discImage.Tracks.Add(cueTracks[t - 1]); @@ -1064,7 +1076,7 @@ namespace Aaru.DiscImages AaruConsole.DebugWriteLine("CDRWin plugin", "\t\tIndexes:"); - foreach(KeyValuePair kvp in _discImage.Tracks[i].Indexes) + foreach(KeyValuePair kvp in _discImage.Tracks[i].Indexes) AaruConsole.DebugWriteLine("CDRWin plugin", "\t\t\tIndex {0} starts at sector {1}", kvp.Key, kvp.Value); @@ -1124,7 +1136,7 @@ namespace Aaru.DiscImages var partition = new Partition(); - if(!_discImage.Tracks[i].Indexes.TryGetValue(1, out ulong _)) + if(!_discImage.Tracks[i].Indexes.TryGetValue(1, out _)) throw new ImageNotSupportedException($"Track {_discImage.Tracks[i].Sequence} lacks index 01"); if(_discImage.IsRedumpGigadisc && diff --git a/Aaru.Images/CDRWin/Structs.cs b/Aaru.Images/CDRWin/Structs.cs index 306467ea4..402a24564 100644 --- a/Aaru.Images/CDRWin/Structs.cs +++ b/Aaru.Images/CDRWin/Structs.cs @@ -51,48 +51,48 @@ namespace Aaru.DiscImages public string FileType; } - struct CdrWinTrack + class CdrWinTrack { - /// Track # - public uint Sequence; - /// Track title (from CD-Text) - public string Title; - /// Track genre (from CD-Text) - public string Genre; /// Track arranger (from CD-Text) public string Arranger; + /// Bytes per sector + public ushort Bps; /// Track composer (from CD-Text) public string Composer; - /// Track performer (from CD-Text) - public string Performer; - /// Track song writer (from CD-Text) - public string Songwriter; - /// Track ISRC - public string Isrc; - /// File struct for this track - public CdrWinTrackFile TrackFile; - /// Indexes on this track - public Dictionary Indexes; - /// Track pre-gap in sectors - public ulong Pregap; - /// Track post-gap in sectors - public ulong Postgap; - /// Digital Copy Permitted - public bool FlagDcp; /// Track is quadraphonic public bool Flag4ch; + /// Digital Copy Permitted + public bool FlagDcp; /// Track has pre-emphasis public bool FlagPre; /// Track has SCMS public bool FlagScms; - /// Bytes per sector - public ushort Bps; + /// Track genre (from CD-Text) + public string Genre; + /// Indexes on this track + public Dictionary Indexes; + /// Track ISRC + public string Isrc; + /// Track performer (from CD-Text) + public string Performer; + /// Track post-gap in sectors + public int Postgap; + /// Track pre-gap in sectors + public int Pregap; /// Sectors in track public ulong Sectors; - /// Track type - public string TrackType; + /// Track # + public uint Sequence; /// Track session public ushort Session; + /// Track song writer (from CD-Text) + public string Songwriter; + /// Track title (from CD-Text) + public string Title; + /// File struct for this track + public CdrWinTrackFile TrackFile; + /// Track type + public string TrackType; } struct CdrWinDisc