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