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; } ///