diff --git a/DICUI.Library/Aaru/Parameters.cs b/DICUI.Library/Aaru/Parameters.cs
index c17362f6..86c31027 100644
--- a/DICUI.Library/Aaru/Parameters.cs
+++ b/DICUI.Library/Aaru/Parameters.cs
@@ -6,6 +6,7 @@ using System.Text.RegularExpressions;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
+using DICUI.CueSheets;
using DICUI.Data;
using DICUI.Utilities;
using DICUI.Web;
@@ -2162,6 +2163,57 @@ namespace DICUI.Aaru
#region Information Extraction Methods
+ ///
+ /// Convert the TrackTypeTrackType value to a CueTrackDataType
+ ///
+ private CueTrackDataType ConvertToDataType(TrackTypeTrackType trackType, uint bytesPerSector)
+ {
+ switch (trackType)
+ {
+ case TrackTypeTrackType.audio:
+ return CueTrackDataType.AUDIO;
+
+ case TrackTypeTrackType.mode1:
+ if (bytesPerSector == 2048)
+ return CueTrackDataType.MODE1_2048;
+ else
+ return CueTrackDataType.MODE1_2352;
+
+ case TrackTypeTrackType.mode2:
+ case TrackTypeTrackType.m2f1:
+ case TrackTypeTrackType.m2f2:
+ if (bytesPerSector == 2336)
+ return CueTrackDataType.MODE2_2336;
+ else
+ return CueTrackDataType.MODE2_2352;
+
+ default:
+ return CueTrackDataType.MODE1_2352;
+ }
+ }
+
+ ///
+ /// Convert the TrackFlagsType value to a CueTrackFlag
+ ///
+ private CueTrackFlag ConvertToTrackFlag(TrackFlagsType trackFlagsType)
+ {
+ if (trackFlagsType == null)
+ return 0;
+
+ CueTrackFlag flag = 0;
+
+ if (trackFlagsType.CopyPermitted)
+ flag |= CueTrackFlag.DCP;
+
+ if (trackFlagsType.Quadraphonic)
+ flag |= CueTrackFlag.FourCH;
+
+ if (trackFlagsType.PreEmphasis)
+ flag |= CueTrackFlag.PRE;
+
+ return flag;
+ }
+
///
/// Generate a cuesheet string based on CICM sidecar data
///
@@ -2176,7 +2228,8 @@ namespace DICUI.Aaru
// Required variables
uint totalTracks = 0;
- string cuesheet = string.Empty;
+ CueSheet cueSheet = new CueSheet();
+ cueSheet.Files = new List();
// Only care about OpticalDisc types
if (cicmSidecar.OpticalDisc == null || cicmSidecar.OpticalDisc.Length == 0)
@@ -2193,83 +2246,72 @@ namespace DICUI.Aaru
if (opticalDisc.Track == null || opticalDisc.Track.Length == 0)
continue;
+ // Get cuesheet-level information
+ cueSheet.Catalog = opticalDisc.MediaCatalogueNumber;
+
// Loop through each track
foreach (TrackType track in opticalDisc.Track)
{
- uint trackNumber = track.Sequence?.TrackNumber ?? 0;
- TrackTypeTrackType trackType = track.TrackType1;
+ // Create cue file entry
+ CueFile cueFile = new CueFile();
+ cueFile.FileType = CueFileType.BINARY;
+ cueFile.Tracks = new List();
+
+ // Create cue track entry
+ CueTrack cueTrack = new CueTrack();
+ cueTrack.Number = (int)(track.Sequence?.TrackNumber ?? 0);
+ cueTrack.DataType = ConvertToDataType(track.TrackType1, track.BytesPerSector);
+ cueTrack.Flags = ConvertToTrackFlag(track.Flags);
+ cueTrack.ISRC = track.ISRC;
// Build the track datfile data and append
- string trackName = basePath;
+ cueFile.FileName = basePath;
if (totalTracks == 1)
- trackName = $"{trackName}.bin";
+ cueFile.FileName = $"{cueFile.FileName}.bin";
else if (totalTracks > 1 && totalTracks < 10)
- trackName = $"{trackName} (Track {trackNumber}).bin";
+ cueFile.FileName = $"{cueFile.FileName} (Track {cueTrack.Number}).bin";
else
- trackName = $"{trackName} (Track {trackNumber.ToString().PadLeft(2, '0')}).bin";
-
- // Handle track flags
- if (track.Flags != null)
- {
- string flagString = "FLAGS";
- if (track.Flags.CopyPermitted)
- flagString += " DCP";
- if (track.Flags.Quadraphonic)
- flagString += " 4CH";
- if (track.Flags.PreEmphasis)
- flagString += " PRE";
-
- cuesheet += $"{flagString}\n";
- }
-
- // Handle ISRC
- if (track.ISRC != null)
- cuesheet += $"ISRC {track.ISRC}\n";
-
- // Add track for each file
- cuesheet += $"FILE \"{trackName}\" BINARY\n";
-
- // Add track type
- string trackTypeString = string.Empty;
- switch (trackType)
- {
- case TrackTypeTrackType.audio:
- trackTypeString = "AUDIO";
- break;
- case TrackTypeTrackType.mode0:
- trackTypeString = $"MODE0/{track.BytesPerSector}";
- break;
- case TrackTypeTrackType.mode1:
- trackTypeString = $"MODE1/{track.BytesPerSector}";
- break;
- case TrackTypeTrackType.mode2:
- case TrackTypeTrackType.m2f1:
- case TrackTypeTrackType.m2f2:
- trackTypeString = $"MODE2/{track.BytesPerSector}";
- break;
- }
-
- cuesheet += $" TRACK {trackNumber.ToString().PadLeft(2, '0')} {trackTypeString}\n";
+ cueFile.FileName = $"{cueFile.FileName } (Track {cueTrack.Number:D2}).bin";
// Add index data
if (track.Indexes != null && track.Indexes.Length > 0)
{
+ cueTrack.Indices = new List();
+
// Loop through each index
foreach (TrackIndexType trackIndex in track.Indexes)
{
// TODO: Convert Value to timecode
- cuesheet += $" INDEX {trackIndex.index} {trackIndex.Value}\n";
+ cueTrack.Indices.Add(new CueIndex(trackIndex.index.ToString(), trackIndex.Value.ToString()));
}
}
else
{
// Default if index data missing from sidecar
- cuesheet += " INDEX 01 00:00:00\n";
+ cueTrack.Indices.Add(new CueIndex("01", "00:00:00"));
}
+
+ // Add the track to the file
+ cueFile.Tracks.Add(cueTrack);
+
+ // Add the file to the cuesheet
+ cueSheet.Files.Add(cueFile);
}
}
- return cuesheet;
+ // If we have a cuesheet to write out, do so
+ if (cueSheet != null && cueSheet != default)
+ {
+ MemoryStream ms = new MemoryStream();
+ cueSheet.Write(ms);
+ ms.Position = 0;
+ using (var sr = new StreamReader(ms))
+ {
+ return sr.ReadToEnd();
+ }
+ }
+
+ return string.Empty;
}
///