diff --git a/DiscImageChef.DiscImages/CDRDAO.cs b/DiscImageChef.DiscImages/CDRDAO.cs index 5ddda0bf..50c3acf8 100644 --- a/DiscImageChef.DiscImages/CDRDAO.cs +++ b/DiscImageChef.DiscImages/CDRDAO.cs @@ -65,73 +65,70 @@ namespace DiscImageChef.DiscImages /// Mode 2 track, raw, 2352 bytes/sector const string CDRDAO_TRACK_TYPE_MODE2_RAW = "MODE2_RAW"; - const string REGEX_COMMENT = @"^\s*\/{2}(?.+)$"; - const string REGEX_COPY = @"^\s*(?NO)?\s*COPY"; - const string REGEX_DISCTYPE = @"^\s*(?(CD_DA|CD_ROM_XA|CD_ROM|CD_I))"; - const string REGEX_EMPHASIS = @"^\s*(?NO)?\s*PRE_EMPHASIS"; + const string REGEX_COMMENT = @"^\s*\/{2}(?.+)$"; + const string REGEX_COPY = @"^\s*(?NO)?\s*COPY"; + const string REGEX_DISCTYPE = @"^\s*(?(CD_DA|CD_ROM_XA|CD_ROM|CD_I))"; + const string REGEX_EMPHASIS = @"^\s*(?NO)?\s*PRE_EMPHASIS"; const string REGEX_FILE_AUDIO = - @"^\s*(AUDIO)?FILE\s*""(?.+)""\s*(#(?\d+))?\s*((?[\d]+:[\d]+:[\d]+)|(?\d+))\s*(?[\d]+:[\d]+:[\d]+)?" - ; + @"^\s*(AUDIO)?FILE\s*""(?.+)""\s*(#(?\d+))?\s*((?[\d]+:[\d]+:[\d]+)|(?\d+))\s*(?[\d]+:[\d]+:[\d]+)?"; const string REGEX_FILE_DATA = @"^\s*DATAFILE\s*""(?.+)""\s*(#(?\d+))?\s*(?[\d]+:[\d]+:[\d]+)?"; - const string REGEX_INDEX = @"^\s*INDEX\s*(?
\d+:\d+:\d+)"; - const string REGEX_ISRC = @"^\s*ISRC\s*""(?[A-Z0-9]{5,5}[0-9]{7,7})"""; - const string REGEX_MCN = @"^\s*CATALOG\s*""(?[\d]{13,13})"""; + const string REGEX_INDEX = @"^\s*INDEX\s*(?
\d+:\d+:\d+)"; + const string REGEX_ISRC = @"^\s*ISRC\s*""(?[A-Z0-9]{5,5}[0-9]{7,7})"""; + const string REGEX_MCN = @"^\s*CATALOG\s*""(?[\d]{13,13})"""; const string REGEX_PREGAP = @"^\s*START\s*(?
\d+:\d+:\d+)?"; const string REGEX_STEREO = @"^\s*(?(TWO|FOUR))_CHANNEL_AUDIO"; - const string REGEX_TRACK = - @"^\s*TRACK\s*(?(AUDIO|MODE1_RAW|MODE1|MODE2_FORM1|MODE2_FORM2|MODE2_FORM_MIX|MODE2_RAW|MODE2))\s*(?(RW_RAW|RW))?" - ; - const string REGEX_ZERO_AUDIO = @"^\s*SILENCE\s*(?\d+:\d+:\d+)"; - const string REGEX_ZERO_DATA = @"^\s*ZERO\s*(?\d+:\d+:\d+)"; + const string REGEX_TRACK = + @"^\s*TRACK\s*(?(AUDIO|MODE1_RAW|MODE1|MODE2_FORM1|MODE2_FORM2|MODE2_FORM_MIX|MODE2_RAW|MODE2))\s*(?(RW_RAW|RW))?"; + const string REGEX_ZERO_AUDIO = @"^\s*SILENCE\s*(?\d+:\d+:\d+)"; + const string REGEX_ZERO_DATA = @"^\s*ZERO\s*(?\d+:\d+:\d+)"; const string REGEX_ZERO_PREGAP = @"^\s*PREGAP\s*(?\d+:\d+:\d+)"; // CD-Text - const string REGEX_ARRANGER = @"^\s*ARRANGER\s*""(?.+)"""; - const string REGEX_COMPOSER = @"^\s*COMPOSER\s*""(?.+)"""; - const string REGEX_DISC_ID = @"^\s*DISC_ID\s*""(?.+)"""; - const string REGEX_MESSAGE = @"^\s*MESSAGE\s*""(?.+)"""; - const string REGEX_PERFORMER = @"^\s*PERFORMER\s*""(?.+)"""; + const string REGEX_ARRANGER = @"^\s*ARRANGER\s*""(?.+)"""; + const string REGEX_COMPOSER = @"^\s*COMPOSER\s*""(?.+)"""; + const string REGEX_DISC_ID = @"^\s*DISC_ID\s*""(?.+)"""; + const string REGEX_MESSAGE = @"^\s*MESSAGE\s*""(?.+)"""; + const string REGEX_PERFORMER = @"^\s*PERFORMER\s*""(?.+)"""; const string REGEX_SONGWRITER = @"^\s*SONGWRITER\s*""(?.+)"""; - const string REGEX_TITLE = @"^\s*TITLE\s*""(?.+)"""; - const string REGEX_UPC = @"^\s*UPC_EAN\s*""(?<catalog>[\d]{13,13})"""; + const string REGEX_TITLE = @"^\s*TITLE\s*""(?<title>.+)"""; + const string REGEX_UPC = @"^\s*UPC_EAN\s*""(?<catalog>[\d]{13,13})"""; // Unused - const string REGEX_CD_TEXT = @"^\s*CD_TEXT\s*\{"; - const string REGEX_CLOSURE = @"^\s*\}"; - const string REGEX_LANGUAGE = @"^\s*LANGUAGE\s*(?<code>\d+)\s*\{"; - const string REGEX_LANGUAGE_MAP = @"^\s*LANGUAGE_MAP\s*\{"; + const string REGEX_CD_TEXT = @"^\s*CD_TEXT\s*\{"; + const string REGEX_CLOSURE = @"^\s*\}"; + const string REGEX_LANGUAGE = @"^\s*LANGUAGE\s*(?<code>\d+)\s*\{"; + const string REGEX_LANGUAGE_MAP = @"^\s*LANGUAGE_MAP\s*\{"; const string REGEX_LANGUAGE_MAPPING = @"^\s*(?<code>\d+)\s?\:\s?(?<language>\d+|\w+)"; - IFilter cdrdaoFilter; + IFilter cdrdaoFilter; CdrdaoDisc discimage; - ImageInfo imageInfo; - Stream imageStream; + ImageInfo imageInfo; + Stream imageStream; /// <summary>Dictionary, index is track #, value is TrackFile</summary> Dictionary<uint, ulong> offsetmap; - List<Partition> partitions; - StreamReader tocStream; + StreamReader tocStream; public Cdrdao() { imageInfo = new ImageInfo { - ReadableSectorTags = new List<SectorTagType>(), - ReadableMediaTags = new List<MediaTagType>(), - HasPartitions = true, - HasSessions = true, - Version = null, - ApplicationVersion = null, - MediaTitle = null, - Creator = null, - MediaManufacturer = null, - MediaModel = null, - MediaPartNumber = null, - MediaSequence = 0, - LastMediaSequence = 0, - DriveManufacturer = null, - DriveModel = null, - DriveSerialNumber = null, + ReadableSectorTags = new List<SectorTagType>(), + ReadableMediaTags = new List<MediaTagType>(), + HasPartitions = true, + HasSessions = true, + Version = null, + ApplicationVersion = null, + MediaTitle = null, + Creator = null, + MediaManufacturer = null, + MediaModel = null, + MediaPartNumber = null, + MediaSequence = 0, + LastMediaSequence = 0, + DriveManufacturer = null, + DriveModel = null, + DriveSerialNumber = null, DriveFirmwareRevision = null }; } @@ -139,11 +136,11 @@ namespace DiscImageChef.DiscImages public ImageInfo Info => imageInfo; public string Name => "CDRDAO tocfile"; - public Guid Id => new Guid("04D7BA12-1BE8-44D4-97A4-1B48A505463E"); + public Guid Id => new Guid("04D7BA12-1BE8-44D4-97A4-1B48A505463E"); public string Format => "CDRDAO tocfile"; - public List<Partition> Partitions => partitions; + public List<Partition> Partitions { get; set; } public List<Track> Tracks { @@ -155,19 +152,19 @@ namespace DiscImageChef.DiscImages { Track dicTrack = new Track { - Indexes = cdrTrack.Indexes, - TrackDescription = cdrTrack.Title, - TrackStartSector = cdrTrack.StartSector, - TrackPregap = cdrTrack.Pregap, - TrackSession = 1, - TrackSequence = cdrTrack.Sequence, - TrackType = CdrdaoTrackTypeToTrackType(cdrTrack.Tracktype), - TrackFilter = cdrTrack.Trackfile.Datafilter, - TrackFile = cdrTrack.Trackfile.Datafilter.GetFilename(), - TrackFileOffset = cdrTrack.Trackfile.Offset, - TrackFileType = cdrTrack.Trackfile.Filetype, + Indexes = cdrTrack.Indexes, + TrackDescription = cdrTrack.Title, + TrackStartSector = cdrTrack.StartSector, + TrackPregap = cdrTrack.Pregap, + TrackSession = 1, + TrackSequence = cdrTrack.Sequence, + TrackType = CdrdaoTrackTypeToTrackType(cdrTrack.Tracktype), + TrackFilter = cdrTrack.Trackfile.Datafilter, + TrackFile = cdrTrack.Trackfile.Datafilter.GetFilename(), + TrackFileOffset = cdrTrack.Trackfile.Offset, + TrackFileType = cdrTrack.Trackfile.Filetype, TrackRawBytesPerSector = cdrTrack.Bps, - TrackBytesPerSector = CdrdaoTrackTypeToCookedBytesPerSector(cdrTrack.Tracktype) + TrackBytesPerSector = CdrdaoTrackTypeToCookedBytesPerSector(cdrTrack.Tracktype) }; dicTrack.TrackEndSector = dicTrack.TrackStartSector + cdrTrack.Sectors - 1; @@ -179,7 +176,7 @@ namespace DiscImageChef.DiscImages ? TrackSubchannelType.PackedInterleaved : TrackSubchannelType.RawInterleaved; dicTrack.TrackSubchannelFilter = cdrTrack.Trackfile.Datafilter; - dicTrack.TrackSubchannelFile = cdrTrack.Trackfile.Datafilter.GetFilename(); + dicTrack.TrackSubchannelFile = cdrTrack.Trackfile.Datafilter.GetFilename(); dicTrack.TrackSubchannelOffset = cdrTrack.Trackfile.Offset; } else dicTrack.TrackSubchannelType = TrackSubchannelType.None; @@ -242,8 +239,8 @@ namespace DiscImageChef.DiscImages catch(Exception ex) { DicConsole.ErrorWriteLine("Exception trying to identify image file {0}", cdrdaoFilter.GetFilename()); - DicConsole.ErrorWriteLine("Exception: {0}", ex.Message); - DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace); + DicConsole.ErrorWriteLine("Exception: {0}", ex.Message); + DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace); return false; } } @@ -257,37 +254,37 @@ namespace DiscImageChef.DiscImages try { imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); - tocStream = new StreamReader(imageFilter.GetDataForkStream()); + tocStream = new StreamReader(imageFilter.GetDataForkStream()); bool intrack = false; // Initialize all RegExs - Regex regexComment = new Regex(REGEX_COMMENT); - Regex regexDiskType = new Regex(REGEX_DISCTYPE); - Regex regexMcn = new Regex(REGEX_MCN); - Regex regexTrack = new Regex(REGEX_TRACK); - Regex regexCopy = new Regex(REGEX_COPY); - Regex regexEmphasis = new Regex(REGEX_EMPHASIS); - Regex regexStereo = new Regex(REGEX_STEREO); - Regex regexIsrc = new Regex(REGEX_ISRC); - Regex regexIndex = new Regex(REGEX_INDEX); - Regex regexPregap = new Regex(REGEX_PREGAP); - Regex regexZeroPregap = new Regex(REGEX_ZERO_PREGAP); - Regex regexZeroData = new Regex(REGEX_ZERO_DATA); - Regex regexZeroAudio = new Regex(REGEX_ZERO_AUDIO); - Regex regexAudioFile = new Regex(REGEX_FILE_AUDIO); - Regex regexFile = new Regex(REGEX_FILE_DATA); - Regex regexTitle = new Regex(REGEX_TITLE); - Regex regexPerformer = new Regex(REGEX_PERFORMER); - Regex regexSongwriter = new Regex(REGEX_SONGWRITER); - Regex regexComposer = new Regex(REGEX_COMPOSER); - Regex regexArranger = new Regex(REGEX_ARRANGER); - Regex regexMessage = new Regex(REGEX_MESSAGE); - Regex regexDiscId = new Regex(REGEX_DISC_ID); - Regex regexUpc = new Regex(REGEX_UPC); - Regex regexCdText = new Regex(REGEX_CD_TEXT); - Regex regexLanguage = new Regex(REGEX_LANGUAGE); - Regex regexClosure = new Regex(REGEX_CLOSURE); - Regex regexLanguageMap = new Regex(REGEX_LANGUAGE_MAP); + Regex regexComment = new Regex(REGEX_COMMENT); + Regex regexDiskType = new Regex(REGEX_DISCTYPE); + Regex regexMcn = new Regex(REGEX_MCN); + Regex regexTrack = new Regex(REGEX_TRACK); + Regex regexCopy = new Regex(REGEX_COPY); + Regex regexEmphasis = new Regex(REGEX_EMPHASIS); + Regex regexStereo = new Regex(REGEX_STEREO); + Regex regexIsrc = new Regex(REGEX_ISRC); + Regex regexIndex = new Regex(REGEX_INDEX); + Regex regexPregap = new Regex(REGEX_PREGAP); + Regex regexZeroPregap = new Regex(REGEX_ZERO_PREGAP); + Regex regexZeroData = new Regex(REGEX_ZERO_DATA); + Regex regexZeroAudio = new Regex(REGEX_ZERO_AUDIO); + Regex regexAudioFile = new Regex(REGEX_FILE_AUDIO); + Regex regexFile = new Regex(REGEX_FILE_DATA); + Regex regexTitle = new Regex(REGEX_TITLE); + Regex regexPerformer = new Regex(REGEX_PERFORMER); + Regex regexSongwriter = new Regex(REGEX_SONGWRITER); + Regex regexComposer = new Regex(REGEX_COMPOSER); + Regex regexArranger = new Regex(REGEX_ARRANGER); + Regex regexMessage = new Regex(REGEX_MESSAGE); + Regex regexDiscId = new Regex(REGEX_DISC_ID); + Regex regexUpc = new Regex(REGEX_UPC); + Regex regexCdText = new Regex(REGEX_CD_TEXT); + Regex regexLanguage = new Regex(REGEX_LANGUAGE); + Regex regexClosure = new Regex(REGEX_CLOSURE); + Regex regexLanguageMap = new Regex(REGEX_LANGUAGE_MAP); Regex regexLanguageMapping = new Regex(REGEX_LANGUAGE_MAPPING); // Initialize all RegEx matches @@ -297,17 +294,17 @@ namespace DiscImageChef.DiscImages // Initialize disc discimage = new CdrdaoDisc {Tracks = new List<CdrdaoTrack>(), Comment = ""}; - CdrdaoTrack currenttrack = new CdrdaoTrack(); - uint currentTrackNumber = 0; - currenttrack.Indexes = new Dictionary<int, ulong>(); - currenttrack.Pregap = 0; - ulong currentSector = 0; - int nextindex = 2; - StringBuilder commentBuilder = new StringBuilder(); + CdrdaoTrack currenttrack = new CdrdaoTrack(); + uint currentTrackNumber = 0; + currenttrack.Indexes = new Dictionary<int, ulong>(); + currenttrack.Pregap = 0; + ulong currentSector = 0; + int nextindex = 2; + StringBuilder commentBuilder = new StringBuilder(); tocStream = new StreamReader(cdrdaoFilter.GetDataForkStream()); string line; - int lineNumber = 0; + int lineNumber = 0; while(tocStream.Peek() >= 0) { @@ -315,7 +312,7 @@ namespace DiscImageChef.DiscImages line = tocStream.ReadLine(); matchDiskType = regexDiskType.Match(line ?? throw new InvalidOperationException()); - matchComment = regexComment.Match(line); + matchComment = regexComment.Match(line); // Skip comments at start of file if(matchComment.Success) continue; @@ -330,7 +327,7 @@ namespace DiscImageChef.DiscImages break; } - tocStream = new StreamReader(cdrdaoFilter.GetDataForkStream()); + tocStream = new StreamReader(cdrdaoFilter.GetDataForkStream()); lineNumber = 0; tocStream.BaseStream.Position = 0; @@ -339,33 +336,33 @@ namespace DiscImageChef.DiscImages lineNumber++; line = tocStream.ReadLine(); - matchComment = regexComment.Match(line ?? throw new InvalidOperationException()); - matchDiskType = regexDiskType.Match(line); - Match matchMcn = regexMcn.Match(line); - Match matchTrack = regexTrack.Match(line); - Match matchCopy = regexCopy.Match(line); - Match matchEmphasis = regexEmphasis.Match(line); - Match matchStereo = regexStereo.Match(line); - Match matchIsrc = regexIsrc.Match(line); - Match matchIndex = regexIndex.Match(line); - Match matchPregap = regexPregap.Match(line); - Match matchZeroPregap = regexZeroPregap.Match(line); - Match matchZeroData = regexZeroData.Match(line); - Match matchZeroAudio = regexZeroAudio.Match(line); - Match matchAudioFile = regexAudioFile.Match(line); - Match matchFile = regexFile.Match(line); - Match matchTitle = regexTitle.Match(line); - Match matchPerformer = regexPerformer.Match(line); - Match matchSongwriter = regexSongwriter.Match(line); - Match matchComposer = regexComposer.Match(line); - Match matchArranger = regexArranger.Match(line); - Match matchMessage = regexMessage.Match(line); - Match matchDiscId = regexDiscId.Match(line); - Match matchUpc = regexUpc.Match(line); - Match matchCdText = regexCdText.Match(line); - Match matchLanguage = regexLanguage.Match(line); - Match matchClosure = regexClosure.Match(line); - Match matchLanguageMap = regexLanguageMap.Match(line); + matchComment = regexComment.Match(line ?? throw new InvalidOperationException()); + matchDiskType = regexDiskType.Match(line); + Match matchMcn = regexMcn.Match(line); + Match matchTrack = regexTrack.Match(line); + Match matchCopy = regexCopy.Match(line); + Match matchEmphasis = regexEmphasis.Match(line); + Match matchStereo = regexStereo.Match(line); + Match matchIsrc = regexIsrc.Match(line); + Match matchIndex = regexIndex.Match(line); + Match matchPregap = regexPregap.Match(line); + Match matchZeroPregap = regexZeroPregap.Match(line); + Match matchZeroData = regexZeroData.Match(line); + Match matchZeroAudio = regexZeroAudio.Match(line); + Match matchAudioFile = regexAudioFile.Match(line); + Match matchFile = regexFile.Match(line); + Match matchTitle = regexTitle.Match(line); + Match matchPerformer = regexPerformer.Match(line); + Match matchSongwriter = regexSongwriter.Match(line); + Match matchComposer = regexComposer.Match(line); + Match matchArranger = regexArranger.Match(line); + Match matchMessage = regexMessage.Match(line); + Match matchDiscId = regexDiscId.Match(line); + Match matchUpc = regexUpc.Match(line); + Match matchCdText = regexCdText.Match(line); + Match matchLanguage = regexLanguage.Match(line); + Match matchClosure = regexClosure.Match(line); + Match matchLanguageMap = regexLanguageMap.Match(line); Match matchLanguageMapping = regexLanguageMapping.Match(line); if(matchComment.Success) @@ -427,8 +424,9 @@ namespace DiscImageChef.DiscImages currenttrack.Indexes.Add(1, currenttrack.StartSector + currenttrack.Pregap); discimage.Tracks.Add(currenttrack); currenttrack = new CdrdaoTrack {Indexes = new Dictionary<int, ulong>(), Pregap = 0}; - nextindex = 2; + nextindex = 2; } + currentTrackNumber++; intrack = true; @@ -462,8 +460,8 @@ namespace DiscImageChef.DiscImages currenttrack.Packedsubchannel = true; goto case "RW_RAW"; case "RW_RAW": - currenttrack.Bps += 96; - currenttrack.Subchannel = true; + currenttrack.Bps += 96; + currenttrack.Subchannel = true; break; default: throw new @@ -472,7 +470,7 @@ namespace DiscImageChef.DiscImages currenttrack.Tracktype = matchTrack.Groups["type"].Value; - currenttrack.Sequence = currentTrackNumber; + currenttrack.Sequence = currentTrackNumber; currenttrack.StartSector = currentSector; } else if(matchCopy.Success) @@ -505,8 +503,9 @@ namespace DiscImageChef.DiscImages matchIndex.Groups["address"].Value); string[] lengthString = matchFile.Groups["length"].Value.Split(':'); - ulong nextIndexPos = ulong.Parse(lengthString[0]) * 60 * 75 + - ulong.Parse(lengthString[1]) * 75 + ulong.Parse(lengthString[2]); + ulong nextIndexPos = ulong.Parse(lengthString[0]) * 60 * 75 + + ulong.Parse(lengthString[1]) * 75 + + ulong.Parse(lengthString[2]); currenttrack.Indexes.Add(nextindex, nextIndexPos + currenttrack.Pregap + currenttrack.StartSector); } @@ -519,8 +518,9 @@ namespace DiscImageChef.DiscImages if(matchPregap.Groups["address"].Value != "") { string[] lengthString = matchPregap.Groups["address"].Value.Split(':'); - currenttrack.Pregap = ulong.Parse(lengthString[0]) * 60 * 75 + - ulong.Parse(lengthString[1]) * 75 + ulong.Parse(lengthString[2]); + currenttrack.Pregap = ulong.Parse(lengthString[0]) * 60 * 75 + + ulong.Parse(lengthString[1]) * 75 + + ulong.Parse(lengthString[2]); } else currenttrack.Pregap = currenttrack.Sectors; } @@ -530,8 +530,8 @@ namespace DiscImageChef.DiscImages matchZeroPregap.Groups["length"].Value); currenttrack.Indexes.Add(0, currenttrack.StartSector); string[] lengthString = matchZeroPregap.Groups["length"].Value.Split(':'); - currenttrack.Pregap = ulong.Parse(lengthString[0]) * 60 * 75 + - ulong.Parse(lengthString[1]) * 75 + ulong.Parse(lengthString[2]); + currenttrack.Pregap = ulong.Parse(lengthString[0]) * 60 * 75 + + ulong.Parse(lengthString[1]) * 75 + ulong.Parse(lengthString[2]); } else if(matchZeroData.Success) DicConsole.DebugWriteLine("CDRDAO plugin", "Found ZERO \"{1}\" at line {0}", lineNumber, @@ -547,16 +547,16 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("CDRDAO plugin", "Found AUDIOFILE \"{1}\" at line {0}", lineNumber, matchAudioFile.Groups["filename"].Value); - filtersList = new FiltersList(); + filtersList = new FiltersList(); currenttrack.Trackfile = new CdrdaoTrackFile { Datafilter = filtersList.GetFilter(Path.Combine(imageFilter.GetParentFolder(), matchAudioFile.Groups["filename"].Value)), Datafile = matchAudioFile.Groups["filename"].Value, - Offset = matchAudioFile.Groups["base_offset"].Value != "" - ? ulong.Parse(matchAudioFile.Groups["base_offset"].Value) - : 0, + Offset = matchAudioFile.Groups["base_offset"].Value != "" + ? ulong.Parse(matchAudioFile.Groups["base_offset"].Value) + : 0, Filetype = "BINARY", Sequence = currentTrackNumber }; @@ -566,8 +566,9 @@ namespace DiscImageChef.DiscImages if(matchAudioFile.Groups["start"].Value != "") { string[] startString = matchAudioFile.Groups["start"].Value.Split(':'); - startSectors = ulong.Parse(startString[0]) * 60 * 75 + - ulong.Parse(startString[1]) * 75 + ulong.Parse(startString[2]); + startSectors = ulong.Parse(startString[0]) * 60 * 75 + + ulong.Parse(startString[1]) * 75 + + ulong.Parse(startString[2]); } currenttrack.Trackfile.Offset += startSectors * currenttrack.Bps; @@ -575,8 +576,9 @@ namespace DiscImageChef.DiscImages if(matchAudioFile.Groups["length"].Value != "") { string[] lengthString = matchAudioFile.Groups["length"].Value.Split(':'); - currenttrack.Sectors = ulong.Parse(lengthString[0]) * 60 * 75 + - ulong.Parse(lengthString[1]) * 75 + ulong.Parse(lengthString[2]); + currenttrack.Sectors = ulong.Parse(lengthString[0]) * 60 * 75 + + ulong.Parse(lengthString[1]) * 75 + + ulong.Parse(lengthString[2]); } else currenttrack.Sectors = @@ -588,16 +590,16 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("CDRDAO plugin", "Found DATAFILE \"{1}\" at line {0}", lineNumber, matchFile.Groups["filename"].Value); - filtersList = new FiltersList(); + filtersList = new FiltersList(); currenttrack.Trackfile = new CdrdaoTrackFile { Datafilter = filtersList.GetFilter(Path.Combine(imageFilter.GetParentFolder(), matchFile.Groups["filename"].Value)), Datafile = matchAudioFile.Groups["filename"].Value, - Offset = matchFile.Groups["base_offset"].Value != "" - ? ulong.Parse(matchFile.Groups["base_offset"].Value) - : 0, + Offset = matchFile.Groups["base_offset"].Value != "" + ? ulong.Parse(matchFile.Groups["base_offset"].Value) + : 0, Filetype = "BINARY", Sequence = currentTrackNumber }; @@ -605,8 +607,9 @@ namespace DiscImageChef.DiscImages if(matchFile.Groups["length"].Value != "") { string[] lengthString = matchFile.Groups["length"].Value.Split(':'); - currenttrack.Sectors = ulong.Parse(lengthString[0]) * 60 * 75 + - ulong.Parse(lengthString[1]) * 75 + ulong.Parse(lengthString[2]); + currenttrack.Sectors = ulong.Parse(lengthString[0]) * 60 * 75 + + ulong.Parse(lengthString[1]) * 75 + + ulong.Parse(lengthString[2]); } else currenttrack.Sectors = @@ -618,42 +621,42 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("CDRDAO plugin", "Found TITLE \"{1}\" at line {0}", lineNumber, matchTitle.Groups["title"].Value); if(intrack) currenttrack.Title = matchTitle.Groups["title"].Value; - else discimage.Title = matchTitle.Groups["title"].Value; + else discimage.Title = matchTitle.Groups["title"].Value; } else if(matchPerformer.Success) { DicConsole.DebugWriteLine("CDRDAO plugin", "Found PERFORMER \"{1}\" at line {0}", lineNumber, matchPerformer.Groups["performer"].Value); if(intrack) currenttrack.Performer = matchPerformer.Groups["performer"].Value; - else discimage.Performer = matchPerformer.Groups["performer"].Value; + else discimage.Performer = matchPerformer.Groups["performer"].Value; } else if(matchSongwriter.Success) { DicConsole.DebugWriteLine("CDRDAO plugin", "Found SONGWRITER \"{1}\" at line {0}", lineNumber, matchSongwriter.Groups["songwriter"].Value); if(intrack) currenttrack.Songwriter = matchSongwriter.Groups["songwriter"].Value; - else discimage.Songwriter = matchSongwriter.Groups["songwriter"].Value; + else discimage.Songwriter = matchSongwriter.Groups["songwriter"].Value; } else if(matchComposer.Success) { DicConsole.DebugWriteLine("CDRDAO plugin", "Found COMPOSER \"{1}\" at line {0}", lineNumber, matchComposer.Groups["composer"].Value); if(intrack) currenttrack.Composer = matchComposer.Groups["composer"].Value; - else discimage.Composer = matchComposer.Groups["composer"].Value; + else discimage.Composer = matchComposer.Groups["composer"].Value; } else if(matchArranger.Success) { DicConsole.DebugWriteLine("CDRDAO plugin", "Found ARRANGER \"{1}\" at line {0}", lineNumber, matchArranger.Groups["arranger"].Value); if(intrack) currenttrack.Arranger = matchArranger.Groups["arranger"].Value; - else discimage.Arranger = matchArranger.Groups["arranger"].Value; + else discimage.Arranger = matchArranger.Groups["arranger"].Value; } else if(matchMessage.Success) { DicConsole.DebugWriteLine("CDRDAO plugin", "Found MESSAGE \"{1}\" at line {0}", lineNumber, matchMessage.Groups["message"].Value); if(intrack) currenttrack.Message = matchMessage.Groups["message"].Value; - else discimage.Message = matchMessage.Groups["message"].Value; + else discimage.Message = matchMessage.Groups["message"].Value; } else if(matchDiscId.Success) { @@ -668,11 +671,12 @@ namespace DiscImageChef.DiscImages if(!intrack) discimage.Barcode = matchUpc.Groups["catalog"].Value; } // Ignored fields - else if(matchCdText.Success || matchLanguage.Success || matchClosure.Success || + else if(matchCdText.Success || matchLanguage.Success || matchClosure.Success || matchLanguageMap.Success || matchLanguageMapping.Success) { } else if(line == "") // Empty line, ignore it { } } + // TODO: Regex CD-TEXT SIZE_INFO /* else // Non-empty unknown field @@ -693,28 +697,45 @@ namespace DiscImageChef.DiscImages discimage.Comment = commentBuilder.ToString(); // DEBUG information - DicConsole.DebugWriteLine("CDRDAO plugin", "Disc image parsing results"); - DicConsole.DebugWriteLine("CDRDAO plugin", "Disc CD-TEXT:"); + DicConsole.DebugWriteLine("CDRDAO plugin", + "Disc image parsing results"); + DicConsole.DebugWriteLine("CDRDAO plugin", "Disc CD-TEXT:"); if(discimage.Arranger == null) DicConsole.DebugWriteLine("CDRDAO plugin", "\tArranger is not set."); - else DicConsole.DebugWriteLine("CDRDAO plugin", "\tArranger: {0}", discimage.Arranger); + else + DicConsole.DebugWriteLine("CDRDAO plugin", "\tArranger: {0}", + discimage.Arranger); if(discimage.Composer == null) DicConsole.DebugWriteLine("CDRDAO plugin", "\tComposer is not set."); - else DicConsole.DebugWriteLine("CDRDAO plugin", "\tComposer: {0}", discimage.Composer); + else + DicConsole.DebugWriteLine("CDRDAO plugin", "\tComposer: {0}", + discimage.Composer); if(discimage.Performer == null) DicConsole.DebugWriteLine("CDRDAO plugin", "\tPerformer is not set."); - else DicConsole.DebugWriteLine("CDRDAO plugin", "\tPerformer: {0}", discimage.Performer); + else + DicConsole.DebugWriteLine("CDRDAO plugin", "\tPerformer: {0}", + discimage.Performer); if(discimage.Songwriter == null) DicConsole.DebugWriteLine("CDRDAO plugin", "\tSongwriter is not set."); - else DicConsole.DebugWriteLine("CDRDAO plugin", "\tSongwriter: {0}", discimage.Songwriter); + else + DicConsole.DebugWriteLine("CDRDAO plugin", "\tSongwriter: {0}", + discimage.Songwriter); if(discimage.Title == null) DicConsole.DebugWriteLine("CDRDAO plugin", "\tTitle is not set."); - else DicConsole.DebugWriteLine("CDRDAO plugin", "\tTitle: {0}", discimage.Title); + else + DicConsole.DebugWriteLine("CDRDAO plugin", "\tTitle: {0}", + discimage.Title); DicConsole.DebugWriteLine("CDRDAO plugin", "Disc information:"); - DicConsole.DebugWriteLine("CDRDAO plugin", "\tGuessed disk type: {0}", discimage.Disktype); + DicConsole.DebugWriteLine("CDRDAO plugin", "\tGuessed disk type: {0}", + discimage.Disktype); if(discimage.Barcode == null) DicConsole.DebugWriteLine("CDRDAO plugin", "\tBarcode not set."); - else DicConsole.DebugWriteLine("CDRDAO plugin", "\tBarcode: {0}", discimage.Barcode); + else + DicConsole.DebugWriteLine("CDRDAO plugin", "\tBarcode: {0}", + discimage.Barcode); if(discimage.DiskId == null) DicConsole.DebugWriteLine("CDRDAO plugin", "\tDisc ID not set."); - else DicConsole.DebugWriteLine("CDRDAO plugin", "\tDisc ID: {0}", discimage.DiskId); + else + DicConsole.DebugWriteLine("CDRDAO plugin", "\tDisc ID: {0}", + discimage.DiskId); if(discimage.Mcn == null) DicConsole.DebugWriteLine("CDRDAO plugin", "\tMCN not set."); - else DicConsole.DebugWriteLine("CDRDAO plugin", "\tMCN: {0}", discimage.Mcn); + else + DicConsole.DebugWriteLine("CDRDAO plugin", "\tMCN: {0}", discimage.Mcn); if(string.IsNullOrEmpty(discimage.Comment)) - DicConsole.DebugWriteLine("CDRDAO plugin", "\tComment not set."); + DicConsole.DebugWriteLine("CDRDAO plugin", "\tComment not set."); else DicConsole.DebugWriteLine("CDRDAO plugin", "\tComment: \"{0}\"", discimage.Comment); DicConsole.DebugWriteLine("CDRDAO plugin", "Track information:"); @@ -725,7 +746,7 @@ namespace DiscImageChef.DiscImages discimage.Tracks[i].Sequence); DicConsole.DebugWriteLine("CDRDAO plugin", "\t\t{0} bytes per sector", discimage.Tracks[i].Bps); - DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tPregap: {0} sectors", discimage.Tracks[i].Pregap); + DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tPregap: {0} sectors", discimage.Tracks[i].Pregap); DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tData: {0} sectors starting at sector {1}", discimage.Tracks[i].Sectors, discimage.Tracks[i].StartSector); DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tPostgap: {0} sectors", discimage.Tracks[i].Postgap); @@ -749,14 +770,14 @@ namespace DiscImageChef.DiscImages kvp.Value); if(discimage.Tracks[i].Isrc == null) - DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tISRC is not set."); + DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tISRC is not set."); else DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tISRC: {0}", discimage.Tracks[i].Isrc); if(discimage.Tracks[i].Arranger == null) - DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tArranger is not set."); + DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tArranger is not set."); else DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tArranger: {0}", discimage.Tracks[i].Arranger); if(discimage.Tracks[i].Composer == null) - DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tComposer is not set."); + DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tComposer is not set."); else DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tComposer: {0}", discimage.Tracks[i].Composer); if(discimage.Tracks[i].Performer == null) DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tPerformer is not set."); @@ -768,16 +789,16 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tSongwriter: {0}", discimage.Tracks[i].Songwriter); if(discimage.Tracks[i].Title == null) - DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tTitle is not set."); + DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tTitle is not set."); else DicConsole.DebugWriteLine("CDRDAO plugin", "\t\tTitle: {0}", discimage.Tracks[i].Title); } DicConsole.DebugWriteLine("CDRDAO plugin", "Building offset map"); - partitions = new List<Partition>(); - offsetmap = new Dictionary<uint, ulong>(); + Partitions = new List<Partition>(); + offsetmap = new Dictionary<uint, ulong>(); - ulong byteOffset = 0; + ulong byteOffset = 0; ulong partitionSequence = 0; for(int i = 0; i < discimage.Tracks.Count; i++) { @@ -790,13 +811,13 @@ namespace DiscImageChef.DiscImages Partition partition = new Partition { Description = $"Track {discimage.Tracks[i].Sequence}.", - Name = discimage.Tracks[i].Title, - Start = discimage.Tracks[i].StartSector, - Size = (discimage.Tracks[i].Sectors - index0Len) * discimage.Tracks[i].Bps, - Length = discimage.Tracks[i].Sectors - index0Len, - Sequence = partitionSequence, - Offset = byteOffset, - Type = discimage.Tracks[i].Tracktype + Name = discimage.Tracks[i].Title, + Start = discimage.Tracks[i].StartSector, + Size = (discimage.Tracks[i].Sectors - index0Len) * discimage.Tracks[i].Bps, + Length = discimage.Tracks[i].Sectors - index0Len, + Sequence = partitionSequence, + Offset = byteOffset, + Type = discimage.Tracks[i].Tracktype }; byteOffset += partition.Size; @@ -815,48 +836,50 @@ namespace DiscImageChef.DiscImages } } - partitions.Add(partition); + Partitions.Add(partition); } // Print partition map DicConsole.DebugWriteLine("CDRDAO plugin", "printing partition map"); - foreach(Partition partition in partitions) + foreach(Partition partition in Partitions) { DicConsole.DebugWriteLine("CDRDAO plugin", "Partition sequence: {0}", partition.Sequence); - DicConsole.DebugWriteLine("CDRDAO plugin", "\tPartition name: {0}", partition.Name); - DicConsole.DebugWriteLine("CDRDAO plugin", "\tPartition description: {0}", partition.Description); - DicConsole.DebugWriteLine("CDRDAO plugin", "\tPartition type: {0}", partition.Type); + DicConsole.DebugWriteLine("CDRDAO plugin", "\tPartition name: {0}", partition.Name); + DicConsole.DebugWriteLine("CDRDAO plugin", "\tPartition description: {0}", + partition.Description); + DicConsole.DebugWriteLine("CDRDAO plugin", "\tPartition type: {0}", partition.Type); DicConsole.DebugWriteLine("CDRDAO plugin", "\tPartition starting sector: {0}", partition.Start); - DicConsole.DebugWriteLine("CDRDAO plugin", "\tPartition sectors: {0}", partition.Length); + DicConsole.DebugWriteLine("CDRDAO plugin", "\tPartition sectors: {0}", partition.Length); DicConsole.DebugWriteLine("CDRDAO plugin", "\tPartition starting offset: {0}", partition.Offset); - DicConsole.DebugWriteLine("CDRDAO plugin", "\tPartition size in bytes: {0}", partition.Size); + DicConsole.DebugWriteLine("CDRDAO plugin", "\tPartition size in bytes: {0}", partition.Size); } foreach(CdrdaoTrack track in discimage.Tracks) { imageInfo.ImageSize += track.Bps * track.Sectors; - imageInfo.Sectors += track.Sectors; + imageInfo.Sectors += track.Sectors; } if(discimage.Disktype == MediaType.CDG || discimage.Disktype == MediaType.CDEG || discimage.Disktype == MediaType.CDMIDI) imageInfo.SectorSize = 2448; // CD+G subchannels ARE user data, as CD+G are useless without them else if(discimage.Disktype != MediaType.CDROMXA && discimage.Disktype != MediaType.CDDA && - discimage.Disktype != MediaType.CDI && - discimage.Disktype != MediaType.CDPLUS) imageInfo.SectorSize = 2048; // Only data tracks - else imageInfo.SectorSize = 2352; // All others + discimage.Disktype != MediaType.CDI && discimage.Disktype != MediaType.CDPLUS) + imageInfo.SectorSize = 2048; // Only data tracks + else + imageInfo.SectorSize = 2352; // All others if(discimage.Mcn != null) imageInfo.ReadableMediaTags.Add(MediaTagType.CD_MCN); imageInfo.Application = "CDRDAO"; - imageInfo.CreationTime = imageFilter.GetCreationTime(); + imageInfo.CreationTime = imageFilter.GetCreationTime(); imageInfo.LastModificationTime = imageFilter.GetLastWriteTime(); - imageInfo.Comments = discimage.Comment; + imageInfo.Comments = discimage.Comment; imageInfo.MediaSerialNumber = discimage.Mcn; - imageInfo.MediaBarcode = discimage.Barcode; - imageInfo.MediaType = discimage.Disktype; + imageInfo.MediaBarcode = discimage.Barcode; + imageInfo.MediaType = discimage.Disktype; imageInfo.ReadableSectorTags.Add(SectorTagType.CdTrackFlags); @@ -927,8 +950,8 @@ namespace DiscImageChef.DiscImages catch(Exception ex) { DicConsole.ErrorWriteLine("Exception trying to identify image file {0}", imageFilter); - DicConsole.ErrorWriteLine("Exception: {0}", ex.Message); - DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace); + DicConsole.ErrorWriteLine("Exception: {0}", ex.Message); + DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace); return false; } } @@ -973,7 +996,7 @@ namespace DiscImageChef.DiscImages foreach(KeyValuePair<uint, ulong> kvp in from kvp in offsetmap where sectorAddress >= kvp.Value from cdrdaoTrack in discimage.Tracks - where cdrdaoTrack.Sequence == kvp.Key + where cdrdaoTrack.Sequence == kvp.Key where sectorAddress - kvp.Value < cdrdaoTrack.Sectors select kvp) return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key); @@ -986,7 +1009,7 @@ namespace DiscImageChef.DiscImages foreach(KeyValuePair<uint, ulong> kvp in from kvp in offsetmap where sectorAddress >= kvp.Value from cdrdaoTrack in discimage.Tracks - where cdrdaoTrack.Sequence == kvp.Key + where cdrdaoTrack.Sequence == kvp.Key where sectorAddress - kvp.Value < cdrdaoTrack.Sectors select kvp) return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag); @@ -1021,44 +1044,44 @@ namespace DiscImageChef.DiscImages case CDRDAO_TRACK_TYPE_MODE2_FORM1: { sectorOffset = 0; - sectorSize = 2048; - sectorSkip = 0; + sectorSize = 2048; + sectorSkip = 0; break; } case CDRDAO_TRACK_TYPE_MODE2_FORM2: { sectorOffset = 0; - sectorSize = 2324; - sectorSkip = 0; + sectorSize = 2324; + sectorSkip = 0; break; } case CDRDAO_TRACK_TYPE_MODE2: case CDRDAO_TRACK_TYPE_MODE2_MIX: { sectorOffset = 0; - sectorSize = 2336; - sectorSkip = 0; + sectorSize = 2336; + sectorSkip = 0; break; } case CDRDAO_TRACK_TYPE_AUDIO: { sectorOffset = 0; - sectorSize = 2352; - sectorSkip = 0; + sectorSize = 2352; + sectorSkip = 0; break; } case CDRDAO_TRACK_TYPE_MODE1_RAW: { sectorOffset = 16; - sectorSize = 2048; - sectorSkip = 288; + sectorSize = 2048; + sectorSkip = 288; break; } case CDRDAO_TRACK_TYPE_MODE2_RAW: { sectorOffset = 16; - sectorSize = 2336; - sectorSkip = 0; + sectorSize = 2336; + sectorSkip = 0; break; } default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); @@ -1068,7 +1091,7 @@ namespace DiscImageChef.DiscImages byte[] buffer = new byte[sectorSize * length]; - imageStream = dicTrack.Trackfile.Datafilter.GetDataForkStream(); + imageStream = dicTrack.Trackfile.Datafilter.GetDataForkStream(); BinaryReader br = new BinaryReader(imageStream); br.BaseStream .Seek((long)dicTrack.Trackfile.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)), @@ -1122,20 +1145,20 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorSync: break; case SectorTagType.CdTrackFlags: { - byte[] flags = new byte[1]; + CdFlags flags = 0; - if(dicTrack.Tracktype != CDRDAO_TRACK_TYPE_AUDIO) flags[0] += 0x40; + if(dicTrack.Tracktype != CDRDAO_TRACK_TYPE_AUDIO) flags |= CdFlags.DataTrack; - if(dicTrack.FlagDcp) flags[0] += 0x20; + if(dicTrack.FlagDcp) flags |= CdFlags.CopyPermitted; - if(dicTrack.FlagPre) flags[0] += 0x10; + if(dicTrack.FlagPre) flags |= CdFlags.PreEmphasis; - if(dicTrack.Flag_4Ch) flags[0] += 0x80; + if(dicTrack.Flag_4Ch) flags |= CdFlags.FourChannel; - return flags; + return new[] {(byte)flags}; } case SectorTagType.CdTrackIsrc: return Encoding.UTF8.GetBytes(dicTrack.Isrc); - default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); + default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); } switch(dicTrack.Tracktype) @@ -1146,7 +1169,7 @@ namespace DiscImageChef.DiscImages throw new ArgumentException("No tags in image for requested track", nameof(tag)); sectorOffset = 2048; - sectorSize = 96; + sectorSize = 96; break; case CDRDAO_TRACK_TYPE_MODE2_FORM2: case CDRDAO_TRACK_TYPE_MODE2_MIX: @@ -1154,14 +1177,14 @@ namespace DiscImageChef.DiscImages throw new ArgumentException("No tags in image for requested track", nameof(tag)); sectorOffset = 2336; - sectorSize = 96; + sectorSize = 96; break; case CDRDAO_TRACK_TYPE_AUDIO: if(tag != SectorTagType.CdSectorSubchannel) throw new ArgumentException("No tags in image for requested track", nameof(tag)); sectorOffset = 2352; - sectorSize = 96; + sectorSize = 96; break; case CDRDAO_TRACK_TYPE_MODE1_RAW: { @@ -1170,21 +1193,21 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorSync: { sectorOffset = 0; - sectorSize = 12; - sectorSkip = 2340; + sectorSize = 12; + sectorSkip = 2340; break; } case SectorTagType.CdSectorHeader: { sectorOffset = 12; - sectorSize = 4; - sectorSkip = 2336; + sectorSize = 4; + sectorSkip = 2336; break; } case SectorTagType.CdSectorSubchannel: { sectorOffset = 2352; - sectorSize = 96; + sectorSize = 96; break; } case SectorTagType.CdSectorSubHeader: @@ -1192,29 +1215,29 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorEcc: { sectorOffset = 2076; - sectorSize = 276; - sectorSkip = 0; + sectorSize = 276; + sectorSkip = 0; break; } case SectorTagType.CdSectorEccP: { sectorOffset = 2076; - sectorSize = 172; - sectorSkip = 104; + sectorSize = 172; + sectorSkip = 104; break; } case SectorTagType.CdSectorEccQ: { sectorOffset = 2248; - sectorSize = 104; - sectorSkip = 0; + sectorSize = 104; + sectorSkip = 0; break; } case SectorTagType.CdSectorEdc: { sectorOffset = 2064; - sectorSize = 4; - sectorSkip = 284; + sectorSize = 4; + sectorSkip = 284; break; } default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); @@ -1227,14 +1250,14 @@ namespace DiscImageChef.DiscImages throw new FeatureSupportedButNotImplementedImageException("Feature not yet implemented"); sectorOffset = 2352; - sectorSize = 96; + sectorSize = 96; break; default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); } byte[] buffer = new byte[sectorSize * length]; - imageStream = dicTrack.Trackfile.Datafilter.GetDataForkStream(); + imageStream = dicTrack.Trackfile.Datafilter.GetDataForkStream(); BinaryReader br = new BinaryReader(imageStream); br.BaseStream .Seek((long)dicTrack.Trackfile.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)), @@ -1267,7 +1290,7 @@ namespace DiscImageChef.DiscImages foreach(KeyValuePair<uint, ulong> kvp in from kvp in offsetmap where sectorAddress >= kvp.Value from cdrdaoTrack in discimage.Tracks - where cdrdaoTrack.Sequence == kvp.Key + where cdrdaoTrack.Sequence == kvp.Key where sectorAddress - kvp.Value < cdrdaoTrack.Sectors select kvp) return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); @@ -1302,23 +1325,23 @@ namespace DiscImageChef.DiscImages case CDRDAO_TRACK_TYPE_MODE2_FORM1: { sectorOffset = 0; - sectorSize = 2048; - sectorSkip = 0; + sectorSize = 2048; + sectorSkip = 0; break; } case CDRDAO_TRACK_TYPE_MODE2_FORM2: { sectorOffset = 0; - sectorSize = 2324; - sectorSkip = 0; + sectorSize = 2324; + sectorSkip = 0; break; } case CDRDAO_TRACK_TYPE_MODE2: case CDRDAO_TRACK_TYPE_MODE2_MIX: { sectorOffset = 0; - sectorSize = 2336; - sectorSkip = 0; + sectorSize = 2336; + sectorSkip = 0; break; } case CDRDAO_TRACK_TYPE_MODE1_RAW: @@ -1326,8 +1349,8 @@ namespace DiscImageChef.DiscImages case CDRDAO_TRACK_TYPE_AUDIO: { sectorOffset = 0; - sectorSize = 2352; - sectorSkip = 0; + sectorSize = 2352; + sectorSkip = 0; break; } default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); @@ -1337,7 +1360,7 @@ namespace DiscImageChef.DiscImages byte[] buffer = new byte[sectorSize * length]; - imageStream = dicTrack.Trackfile.Datafilter.GetDataForkStream(); + imageStream = dicTrack.Trackfile.Datafilter.GetDataForkStream(); BinaryReader br = new BinaryReader(imageStream); br.BaseStream @@ -1383,13 +1406,13 @@ namespace DiscImageChef.DiscImages } public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas, - out List<ulong> unknownLbas) + out List<ulong> unknownLbas) { byte[] buffer = ReadSectorsLong(sectorAddress, length); - int bps = (int)(buffer.Length / length); + int bps = (int)(buffer.Length / length); byte[] sector = new byte[bps]; - failingLbas = new List<ulong>(); - unknownLbas = new List<ulong>(); + failingLbas = new List<ulong>(); + unknownLbas = new List<ulong>(); for(int i = 0; i < length; i++) { @@ -1413,13 +1436,13 @@ namespace DiscImageChef.DiscImages } public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas, - out List<ulong> unknownLbas) + out List<ulong> unknownLbas) { byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); + int bps = (int)(buffer.Length / length); byte[] sector = new byte[bps]; - failingLbas = new List<ulong>(); - unknownLbas = new List<ulong>(); + failingLbas = new List<ulong>(); + unknownLbas = new List<ulong>(); for(int i = 0; i < length; i++) { @@ -1459,7 +1482,7 @@ namespace DiscImageChef.DiscImages case CDRDAO_TRACK_TYPE_AUDIO: case CDRDAO_TRACK_TYPE_MODE1_RAW: case CDRDAO_TRACK_TYPE_MODE2_RAW: return 2352; - default: return 0; + default: return 0; } } @@ -1469,13 +1492,13 @@ namespace DiscImageChef.DiscImages { case CDRDAO_TRACK_TYPE_MODE1: case CDRDAO_TRACK_TYPE_MODE2_FORM1: - case CDRDAO_TRACK_TYPE_MODE1_RAW: return 2048; + case CDRDAO_TRACK_TYPE_MODE1_RAW: return 2048; case CDRDAO_TRACK_TYPE_MODE2_FORM2: return 2324; case CDRDAO_TRACK_TYPE_MODE2: case CDRDAO_TRACK_TYPE_MODE2_MIX: case CDRDAO_TRACK_TYPE_MODE2_RAW: return 2336; - case CDRDAO_TRACK_TYPE_AUDIO: return 2352; - default: return 0; + case CDRDAO_TRACK_TYPE_AUDIO: return 2352; + default: return 0; } } @@ -1484,14 +1507,14 @@ namespace DiscImageChef.DiscImages switch(trackType) { case CDRDAO_TRACK_TYPE_MODE1: - case CDRDAO_TRACK_TYPE_MODE1_RAW: return TrackType.CdMode1; + case CDRDAO_TRACK_TYPE_MODE1_RAW: return TrackType.CdMode1; case CDRDAO_TRACK_TYPE_MODE2_FORM1: return TrackType.CdMode2Form1; case CDRDAO_TRACK_TYPE_MODE2_FORM2: return TrackType.CdMode2Form2; case CDRDAO_TRACK_TYPE_MODE2: case CDRDAO_TRACK_TYPE_MODE2_MIX: case CDRDAO_TRACK_TYPE_MODE2_RAW: return TrackType.CdMode2Formless; - case CDRDAO_TRACK_TYPE_AUDIO: return TrackType.Audio; - default: return TrackType.Data; + case CDRDAO_TRACK_TYPE_AUDIO: return TrackType.Audio; + default: return TrackType.Data; } } @@ -1510,7 +1533,7 @@ namespace DiscImageChef.DiscImages public string Filetype; } -#pragma warning disable 169 + #pragma warning disable 169 [SuppressMessage("ReSharper", "NotAccessedField.Local")] struct CdrdaoTrack { @@ -1554,8 +1577,8 @@ namespace DiscImageChef.DiscImages public ulong StartSector; /// <summary>Track type</summary> public string Tracktype; - public bool Subchannel; - public bool Packedsubchannel; + public bool Subchannel; + public bool Packedsubchannel; } [SuppressMessage("ReSharper", "NotAccessedField.Local")] @@ -1590,6 +1613,6 @@ namespace DiscImageChef.DiscImages /// <summary>Disk comment</summary> public string Comment; } -#pragma warning restore 169 + #pragma warning restore 169 } } \ No newline at end of file diff --git a/DiscImageChef.DiscImages/CDRWin.cs b/DiscImageChef.DiscImages/CDRWin.cs index d7da1d00..6db79e4d 100644 --- a/DiscImageChef.DiscImages/CDRWin.cs +++ b/DiscImageChef.DiscImages/CDRWin.cs @@ -1438,18 +1438,18 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorSync: break; case SectorTagType.CdTrackFlags: { - byte[] flags = new byte[1]; + CdFlags flags = 0; if(dicTrack.Tracktype != CDRWIN_TRACK_TYPE_AUDIO && dicTrack.Tracktype != CDRWIN_TRACK_TYPE_CDG) - flags[0] += 0x40; + flags |= CdFlags.DataTrack; - if(dicTrack.FlagDcp) flags[0] += 0x20; + if(dicTrack.FlagDcp) flags |= CdFlags.CopyPermitted; - if(dicTrack.FlagPre) flags[0] += 0x10; + if(dicTrack.FlagPre) flags |= CdFlags.PreEmphasis; - if(dicTrack.Flag4ch) flags[0] += 0x80; + if(dicTrack.Flag4ch) flags |= CdFlags.FourChannel; - return flags; + return new[] {(byte)flags}; } case SectorTagType.CdTrackIsrc: return Encoding.UTF8.GetBytes(dicTrack.Isrc); case SectorTagType.CdTrackText: diff --git a/DiscImageChef.DiscImages/CloneCD.cs b/DiscImageChef.DiscImages/CloneCD.cs index 38063222..ab3706f8 100644 --- a/DiscImageChef.DiscImages/CloneCD.cs +++ b/DiscImageChef.DiscImages/CloneCD.cs @@ -45,73 +45,71 @@ namespace DiscImageChef.DiscImages { public class CloneCd : IMediaImage { - const string CCD_IDENTIFIER = @"^\s*\[CloneCD\]"; - const string DISC_IDENTIFIER = @"^\s*\[Disc\]"; + const string CCD_IDENTIFIER = @"^\s*\[CloneCD\]"; + const string DISC_IDENTIFIER = @"^\s*\[Disc\]"; const string SESSION_IDENTIFIER = @"^\s*\[Session\s*(?<number>\d+)\]"; - const string ENTRY_IDENTIFIER = @"^\s*\[Entry\s*(?<number>\d+)\]"; - const string TRACK_IDENTIFIER = @"^\s*\[TRACK\s*(?<number>\d+)\]"; - const string CDTEXT_IDENTIFIER = @"^\s*\[CDText\]"; - const string CCD_VERSION = @"^\s*Version\s*=\s*(?<value>\d+)"; - const string DISC_ENTRIES = @"^\s*TocEntries\s*=\s*(?<value>\d+)"; - const string DISC_SESSIONS = @"^\s*Sessions\s*=\s*(?<value>\d+)"; - const string DISC_SCRAMBLED = @"^\s*DataTracksScrambled\s*=\s*(?<value>\d+)"; - const string CDTEXT_LENGTH = @"^\s*CDTextLength\s*=\s*(?<value>\d+)"; - const string DISC_CATALOG = @"^\s*CATALOG\s*=\s*(?<value>\w+)"; - const string SESSION_PREGAP = @"^\s*PreGapMode\s*=\s*(?<value>\d+)"; + const string ENTRY_IDENTIFIER = @"^\s*\[Entry\s*(?<number>\d+)\]"; + const string TRACK_IDENTIFIER = @"^\s*\[TRACK\s*(?<number>\d+)\]"; + const string CDTEXT_IDENTIFIER = @"^\s*\[CDText\]"; + const string CCD_VERSION = @"^\s*Version\s*=\s*(?<value>\d+)"; + const string DISC_ENTRIES = @"^\s*TocEntries\s*=\s*(?<value>\d+)"; + const string DISC_SESSIONS = @"^\s*Sessions\s*=\s*(?<value>\d+)"; + const string DISC_SCRAMBLED = @"^\s*DataTracksScrambled\s*=\s*(?<value>\d+)"; + const string CDTEXT_LENGTH = @"^\s*CDTextLength\s*=\s*(?<value>\d+)"; + const string DISC_CATALOG = @"^\s*CATALOG\s*=\s*(?<value>\w+)"; + const string SESSION_PREGAP = @"^\s*PreGapMode\s*=\s*(?<value>\d+)"; const string SESSION_SUBCHANNEL = @"^\s*PreGapSubC\s*=\s*(?<value>\d+)"; - const string ENTRY_SESSION = @"^\s*Session\s*=\s*(?<value>\d+)"; - const string ENTRY_POINT = @"^\s*Point\s*=\s*(?<value>[\w+]+)"; - const string ENTRY_ADR = @"^\s*ADR\s*=\s*(?<value>\w+)"; - const string ENTRY_CONTROL = @"^\s*Control\s*=\s*(?<value>\w+)"; - const string ENTRY_TRACKNO = @"^\s*TrackNo\s*=\s*(?<value>\d+)"; - const string ENTRY_AMIN = @"^\s*AMin\s*=\s*(?<value>\d+)"; - const string ENTRY_ASEC = @"^\s*ASec\s*=\s*(?<value>\d+)"; - const string ENTRY_AFRAME = @"^\s*AFrame\s*=\s*(?<value>\d+)"; - const string ENTRY_ALBA = @"^\s*ALBA\s*=\s*(?<value>-?\d+)"; - const string ENTRY_ZERO = @"^\s*Zero\s*=\s*(?<value>\d+)"; - const string ENTRY_PMIN = @"^\s*PMin\s*=\s*(?<value>\d+)"; - const string ENTRY_PSEC = @"^\s*PSec\s*=\s*(?<value>\d+)"; - const string ENTRY_PFRAME = @"^\s*PFrame\s*=\s*(?<value>\d+)"; - const string ENTRY_PLBA = @"^\s*PLBA\s*=\s*(?<value>\d+)"; - const string CDTEXT_ENTRIES = @"^\s*Entries\s*=\s*(?<value>\d+)"; - const string CDTEXT_ENTRY = @"^\s*Entry\s*(?<number>\d+)\s*=\s*(?<value>([0-9a-fA-F]+\s*)+)"; - string catalog; // TODO: Use it + const string ENTRY_SESSION = @"^\s*Session\s*=\s*(?<value>\d+)"; + const string ENTRY_POINT = @"^\s*Point\s*=\s*(?<value>[\w+]+)"; + const string ENTRY_ADR = @"^\s*ADR\s*=\s*(?<value>\w+)"; + const string ENTRY_CONTROL = @"^\s*Control\s*=\s*(?<value>\w+)"; + const string ENTRY_TRACKNO = @"^\s*TrackNo\s*=\s*(?<value>\d+)"; + const string ENTRY_AMIN = @"^\s*AMin\s*=\s*(?<value>\d+)"; + const string ENTRY_ASEC = @"^\s*ASec\s*=\s*(?<value>\d+)"; + const string ENTRY_AFRAME = @"^\s*AFrame\s*=\s*(?<value>\d+)"; + const string ENTRY_ALBA = @"^\s*ALBA\s*=\s*(?<value>-?\d+)"; + const string ENTRY_ZERO = @"^\s*Zero\s*=\s*(?<value>\d+)"; + const string ENTRY_PMIN = @"^\s*PMin\s*=\s*(?<value>\d+)"; + const string ENTRY_PSEC = @"^\s*PSec\s*=\s*(?<value>\d+)"; + const string ENTRY_PFRAME = @"^\s*PFrame\s*=\s*(?<value>\d+)"; + const string ENTRY_PLBA = @"^\s*PLBA\s*=\s*(?<value>\d+)"; + const string CDTEXT_ENTRIES = @"^\s*Entries\s*=\s*(?<value>\d+)"; + const string CDTEXT_ENTRY = @"^\s*Entry\s*(?<number>\d+)\s*=\s*(?<value>([0-9a-fA-F]+\s*)+)"; + string catalog; // TODO: Use it - IFilter ccdFilter; - byte[] cdtext; - StreamReader cueStream; - IFilter dataFilter; - Stream dataStream; - byte[] fulltoc; - ImageInfo imageInfo; + IFilter ccdFilter; + byte[] cdtext; + StreamReader cueStream; + IFilter dataFilter; + Stream dataStream; + byte[] fulltoc; + ImageInfo imageInfo; Dictionary<uint, ulong> offsetmap; - List<Partition> partitions; - bool scrambled; - List<Session> sessions; - IFilter subFilter; - Stream subStream; - List<Track> tracks; + bool scrambled; + IFilter subFilter; + Stream subStream; + Dictionary<byte, byte> trackFlags; public CloneCd() { imageInfo = new ImageInfo { - ReadableSectorTags = new List<SectorTagType>(), - ReadableMediaTags = new List<MediaTagType>(), - HasPartitions = true, - HasSessions = true, - Version = null, - ApplicationVersion = null, - MediaTitle = null, - Creator = null, - MediaManufacturer = null, - MediaModel = null, - MediaPartNumber = null, - MediaSequence = 0, - LastMediaSequence = 0, - DriveManufacturer = null, - DriveModel = null, - DriveSerialNumber = null, + ReadableSectorTags = new List<SectorTagType>(), + ReadableMediaTags = new List<MediaTagType>(), + HasPartitions = true, + HasSessions = true, + Version = null, + ApplicationVersion = null, + MediaTitle = null, + Creator = null, + MediaManufacturer = null, + MediaModel = null, + MediaPartNumber = null, + MediaSequence = 0, + LastMediaSequence = 0, + DriveManufacturer = null, + DriveModel = null, + DriveSerialNumber = null, DriveFirmwareRevision = null }; } @@ -119,15 +117,15 @@ namespace DiscImageChef.DiscImages public ImageInfo Info => imageInfo; public string Name => "CloneCD"; - public Guid Id => new Guid("EE9C2975-2E79-427A-8EE9-F86F19165784"); + public Guid Id => new Guid("EE9C2975-2E79-427A-8EE9-F86F19165784"); public string Format => "CloneCD"; - public List<Partition> Partitions => partitions; + public List<Partition> Partitions { get; set; } - public List<Track> Tracks => tracks; + public List<Track> Tracks { get; set; } - public List<Session> Sessions => sessions; + public List<Session> Sessions { get; set; } public bool Identify(IFilter imageFilter) { @@ -170,8 +168,8 @@ namespace DiscImageChef.DiscImages catch(Exception ex) { DicConsole.ErrorWriteLine("Exception trying to identify image file {0}", ccdFilter); - DicConsole.ErrorWriteLine("Exception: {0}", ex.Message); - DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace); + DicConsole.ErrorWriteLine("Exception: {0}", ex.Message); + DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace); return false; } } @@ -185,65 +183,65 @@ namespace DiscImageChef.DiscImages try { imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); - cueStream = new StreamReader(imageFilter.GetDataForkStream()); + cueStream = new StreamReader(imageFilter.GetDataForkStream()); int lineNumber = 0; - Regex ccdIdRegex = new Regex(CCD_IDENTIFIER); - Regex discIdRegex = new Regex(DISC_IDENTIFIER); - Regex sessIdRegex = new Regex(SESSION_IDENTIFIER); - Regex entryIdRegex = new Regex(ENTRY_IDENTIFIER); - Regex trackIdRegex = new Regex(TRACK_IDENTIFIER); - Regex cdtIdRegex = new Regex(CDTEXT_IDENTIFIER); - Regex ccdVerRegex = new Regex(CCD_VERSION); - Regex discEntRegex = new Regex(DISC_ENTRIES); - Regex discSessRegex = new Regex(DISC_SESSIONS); - Regex discScrRegex = new Regex(DISC_SCRAMBLED); - Regex cdtLenRegex = new Regex(CDTEXT_LENGTH); - Regex discCatRegex = new Regex(DISC_CATALOG); - Regex sessPregRegex = new Regex(SESSION_PREGAP); - Regex sessSubcRegex = new Regex(SESSION_SUBCHANNEL); - Regex entSessRegex = new Regex(ENTRY_SESSION); - Regex entPointRegex = new Regex(ENTRY_POINT); - Regex entAdrRegex = new Regex(ENTRY_ADR); - Regex entCtrlRegex = new Regex(ENTRY_CONTROL); - Regex entTnoRegex = new Regex(ENTRY_TRACKNO); - Regex entAMinRegex = new Regex(ENTRY_AMIN); - Regex entASecRegex = new Regex(ENTRY_ASEC); + Regex ccdIdRegex = new Regex(CCD_IDENTIFIER); + Regex discIdRegex = new Regex(DISC_IDENTIFIER); + Regex sessIdRegex = new Regex(SESSION_IDENTIFIER); + Regex entryIdRegex = new Regex(ENTRY_IDENTIFIER); + Regex trackIdRegex = new Regex(TRACK_IDENTIFIER); + Regex cdtIdRegex = new Regex(CDTEXT_IDENTIFIER); + Regex ccdVerRegex = new Regex(CCD_VERSION); + Regex discEntRegex = new Regex(DISC_ENTRIES); + Regex discSessRegex = new Regex(DISC_SESSIONS); + Regex discScrRegex = new Regex(DISC_SCRAMBLED); + Regex cdtLenRegex = new Regex(CDTEXT_LENGTH); + Regex discCatRegex = new Regex(DISC_CATALOG); + Regex sessPregRegex = new Regex(SESSION_PREGAP); + Regex sessSubcRegex = new Regex(SESSION_SUBCHANNEL); + Regex entSessRegex = new Regex(ENTRY_SESSION); + Regex entPointRegex = new Regex(ENTRY_POINT); + Regex entAdrRegex = new Regex(ENTRY_ADR); + Regex entCtrlRegex = new Regex(ENTRY_CONTROL); + Regex entTnoRegex = new Regex(ENTRY_TRACKNO); + Regex entAMinRegex = new Regex(ENTRY_AMIN); + Regex entASecRegex = new Regex(ENTRY_ASEC); Regex entAFrameRegex = new Regex(ENTRY_AFRAME); - Regex entAlbaRegex = new Regex(ENTRY_ALBA); - Regex entZeroRegex = new Regex(ENTRY_ZERO); - Regex entPMinRegex = new Regex(ENTRY_PMIN); - Regex entPSecRegex = new Regex(ENTRY_PSEC); + Regex entAlbaRegex = new Regex(ENTRY_ALBA); + Regex entZeroRegex = new Regex(ENTRY_ZERO); + Regex entPMinRegex = new Regex(ENTRY_PMIN); + Regex entPSecRegex = new Regex(ENTRY_PSEC); Regex entPFrameRegex = new Regex(ENTRY_PFRAME); - Regex entPlbaRegex = new Regex(ENTRY_PLBA); - Regex cdtEntsRegex = new Regex(CDTEXT_ENTRIES); - Regex cdtEntRegex = new Regex(CDTEXT_ENTRY); + Regex entPlbaRegex = new Regex(ENTRY_PLBA); + Regex cdtEntsRegex = new Regex(CDTEXT_ENTRIES); + Regex cdtEntRegex = new Regex(CDTEXT_ENTRY); - bool inCcd = false; - bool inDisk = false; - bool inSession = false; - bool inEntry = false; - bool inTrack = false; - bool inCdText = false; - MemoryStream cdtMs = new MemoryStream(); - int minSession = int.MaxValue; - int maxSession = int.MinValue; - FullTOC.TrackDataDescriptor currentEntry = new FullTOC.TrackDataDescriptor(); - List<FullTOC.TrackDataDescriptor> entries = new List<FullTOC.TrackDataDescriptor>(); - scrambled = false; - catalog = null; + bool inCcd = false; + bool inDisk = false; + bool inSession = false; + bool inEntry = false; + bool inTrack = false; + bool inCdText = false; + MemoryStream cdtMs = new MemoryStream(); + int minSession = int.MaxValue; + int maxSession = int.MinValue; + FullTOC.TrackDataDescriptor currentEntry = new FullTOC.TrackDataDescriptor(); + List<FullTOC.TrackDataDescriptor> entries = new List<FullTOC.TrackDataDescriptor>(); + scrambled = false; + catalog = null; while(cueStream.Peek() >= 0) { lineNumber++; string line = cueStream.ReadLine(); - Match ccdIdMatch = ccdIdRegex.Match(line); - Match discIdMatch = discIdRegex.Match(line); - Match sessIdMatch = sessIdRegex.Match(line); + Match ccdIdMatch = ccdIdRegex.Match(line); + Match discIdMatch = discIdRegex.Match(line); + Match sessIdMatch = sessIdRegex.Match(line); Match entryIdMatch = entryIdRegex.Match(line); Match trackIdMatch = trackIdRegex.Match(line); - Match cdtIdMatch = cdtIdRegex.Match(line); + Match cdtIdMatch = cdtIdRegex.Match(line); // [CloneCD] if(ccdIdMatch.Success) @@ -252,14 +250,14 @@ namespace DiscImageChef.DiscImages throw new FeatureUnsupportedImageException($"Found [CloneCD] out of order in line {lineNumber}"); - inCcd = true; - inDisk = false; + inCcd = true; + inDisk = false; inSession = false; - inEntry = false; - inTrack = false; - inCdText = false; + inEntry = false; + inTrack = false; + inCdText = false; } - else if(discIdMatch.Success || sessIdMatch.Success || entryIdMatch.Success || + else if(discIdMatch.Success || sessIdMatch.Success || entryIdMatch.Success || trackIdMatch.Success || cdtIdMatch.Success) { if(inEntry) @@ -268,12 +266,12 @@ namespace DiscImageChef.DiscImages currentEntry = new FullTOC.TrackDataDescriptor(); } - inCcd = false; - inDisk = discIdMatch.Success; + inCcd = false; + inDisk = discIdMatch.Success; inSession = sessIdMatch.Success; - inEntry = entryIdMatch.Success; - inTrack = trackIdMatch.Success; - inCdText = cdtIdMatch.Success; + inEntry = entryIdMatch.Success; + inTrack = trackIdMatch.Success; + inCdText = cdtIdMatch.Success; } else { @@ -288,16 +286,16 @@ namespace DiscImageChef.DiscImages imageInfo.Version = ccdVerMatch.Groups["value"].Value; if(imageInfo.Version != "2" && imageInfo.Version != "3") DicConsole - .ErrorWriteLine("(CloneCD plugin): Warning! Unknown CCD image version {0}, may not work!", - imageInfo.Version); + .ErrorWriteLine("(CloneCD plugin): Warning! Unknown CCD image version {0}, may not work!", + imageInfo.Version); } else if(inDisk) { - Match discEntMatch = discEntRegex.Match(line); + Match discEntMatch = discEntRegex.Match(line); Match discSessMatch = discSessRegex.Match(line); - Match discScrMatch = discScrRegex.Match(line); - Match cdtLenMatch = cdtLenRegex.Match(line); - Match discCatMatch = discCatRegex.Match(line); + Match discScrMatch = discScrRegex.Match(line); + Match cdtLenMatch = cdtLenRegex.Match(line); + Match discCatMatch = discCatRegex.Match(line); if(discEntMatch.Success) DicConsole.DebugWriteLine("CloneCD plugin", "Found TocEntries at line {0}", lineNumber); @@ -322,7 +320,7 @@ namespace DiscImageChef.DiscImages else if(inCdText) { Match cdtEntsMatch = cdtEntsRegex.Match(line); - Match cdtEntMatch = cdtEntRegex.Match(line); + Match cdtEntMatch = cdtEntRegex.Match(line); if(cdtEntsMatch.Success) DicConsole.DebugWriteLine("CloneCD plugin", "Found CD-Text Entries at line {0}", @@ -333,7 +331,7 @@ namespace DiscImageChef.DiscImages lineNumber); string[] bytes = cdtEntMatch.Groups["value"].Value.Split(new[] {' '}, StringSplitOptions - .RemoveEmptyEntries); + .RemoveEmptyEntries); foreach(string byt in bytes) cdtMs.WriteByte(Convert.ToByte(byt, 16)); } } @@ -350,25 +348,26 @@ namespace DiscImageChef.DiscImages } else if(inEntry) { - Match entSessMatch = entSessRegex.Match(line); - Match entPointMatch = entPointRegex.Match(line); - Match entAdrMatch = entAdrRegex.Match(line); - Match entCtrlMatch = entCtrlRegex.Match(line); - Match entTnoMatch = entTnoRegex.Match(line); - Match entAMinMatch = entAMinRegex.Match(line); - Match entASecMatch = entASecRegex.Match(line); + Match entSessMatch = entSessRegex.Match(line); + Match entPointMatch = entPointRegex.Match(line); + Match entAdrMatch = entAdrRegex.Match(line); + Match entCtrlMatch = entCtrlRegex.Match(line); + Match entTnoMatch = entTnoRegex.Match(line); + Match entAMinMatch = entAMinRegex.Match(line); + Match entASecMatch = entASecRegex.Match(line); Match entAFrameMatch = entAFrameRegex.Match(line); - Match entAlbaMatch = entAlbaRegex.Match(line); - Match entZeroMatch = entZeroRegex.Match(line); - Match entPMinMatch = entPMinRegex.Match(line); - Match entPSecMatch = entPSecRegex.Match(line); + Match entAlbaMatch = entAlbaRegex.Match(line); + Match entZeroMatch = entZeroRegex.Match(line); + Match entPMinMatch = entPMinRegex.Match(line); + Match entPSecMatch = entPSecRegex.Match(line); Match entPFrameMatch = entPFrameRegex.Match(line); - Match entPlbaMatch = entPlbaRegex.Match(line); + Match entPlbaMatch = entPlbaRegex.Match(line); if(entSessMatch.Success) { DicConsole.DebugWriteLine("CloneCD plugin", "Found Session at line {0}", lineNumber); - currentEntry.SessionNumber = Convert.ToByte(entSessMatch.Groups["value"].Value, 10); + currentEntry.SessionNumber = + Convert.ToByte(entSessMatch.Groups["value"].Value, 10); if(currentEntry.SessionNumber < minSession) minSession = currentEntry.SessionNumber; if(currentEntry.SessionNumber > maxSession) maxSession = currentEntry.SessionNumber; } @@ -412,9 +411,9 @@ namespace DiscImageChef.DiscImages else if(entZeroMatch.Success) { DicConsole.DebugWriteLine("CloneCD plugin", "Found Zero at line {0}", lineNumber); - currentEntry.Zero = Convert.ToByte(entZeroMatch.Groups["value"].Value, 10); - currentEntry.HOUR = (byte)((currentEntry.Zero & 0xF0) >> 4); - currentEntry.PHOUR = (byte)(currentEntry.Zero & 0x0F); + currentEntry.Zero = Convert.ToByte(entZeroMatch.Groups["value"].Value, 10); + currentEntry.HOUR = (byte)((currentEntry.Zero & 0xF0) >> 4); + currentEntry.PHOUR = (byte)(currentEntry.Zero & 0x0F); } else if(entPMinMatch.Success) { @@ -442,11 +441,11 @@ namespace DiscImageChef.DiscImages if(entries.Count == 0) throw new FeatureUnsupportedImageException("Did not find any track."); FullTOC.CDFullTOC toc; - toc.TrackDescriptors = entries.ToArray(); - toc.LastCompleteSession = (byte)maxSession; + toc.TrackDescriptors = entries.ToArray(); + toc.LastCompleteSession = (byte)maxSession; toc.FirstCompleteSession = (byte)minSession; - toc.DataLength = (ushort)(entries.Count * 11 + 2); - MemoryStream tocMs = new MemoryStream(); + toc.DataLength = (ushort)(entries.Count * 11 + 2); + MemoryStream tocMs = new MemoryStream(); tocMs.Write(BigEndianBitConverter.GetBytes(toc.DataLength), 0, 2); tocMs.WriteByte(toc.FirstCompleteSession); tocMs.WriteByte(toc.LastCompleteSession); @@ -471,24 +470,25 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("CloneCD plugin", "{0}", FullTOC.Prettify(toc)); string dataFile = Path.GetFileNameWithoutExtension(imageFilter.GetBasePath()) + ".img"; - string subFile = Path.GetFileNameWithoutExtension(imageFilter.GetBasePath()) + ".sub"; + string subFile = Path.GetFileNameWithoutExtension(imageFilter.GetBasePath()) + ".sub"; FiltersList filtersList = new FiltersList(); - dataFilter = filtersList.GetFilter(dataFile); + dataFilter = filtersList.GetFilter(dataFile); if(dataFilter == null) throw new Exception("Cannot open data file"); filtersList = new FiltersList(); - subFilter = filtersList.GetFilter(subFile); + subFilter = filtersList.GetFilter(subFile); - int curSessionNo = 0; - Track currentTrack = new Track(); - bool firstTrackInSession = true; - tracks = new List<Track>(); - ulong leadOutStart = 0; + int curSessionNo = 0; + Track currentTrack = new Track(); + bool firstTrackInSession = true; + Tracks = new List<Track>(); + ulong leadOutStart = 0; - dataStream = dataFilter.GetDataForkStream(); + dataStream = dataFilter.GetDataForkStream(); if(subFilter != null) subStream = subFilter.GetDataForkStream(); + trackFlags = new Dictionary<byte, byte>(); foreach(FullTOC.TrackDataDescriptor descriptor in entries) { @@ -498,8 +498,9 @@ namespace DiscImageChef.DiscImages if(!firstTrackInSession) { currentTrack.TrackEndSector = leadOutStart - 1; - tracks.Add(currentTrack); + Tracks.Add(currentTrack); } + firstTrackInSession = true; } @@ -525,19 +526,19 @@ namespace DiscImageChef.DiscImages currentTrack.TrackEndSector = GetLba(descriptor.PHOUR, descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME) - 1; - tracks.Add(currentTrack); + Tracks.Add(currentTrack); } else firstTrackInSession = false; currentTrack = new Track { - TrackBytesPerSector = 2352, - TrackFile = dataFilter.GetFilename(), - TrackFileType = scrambled ? "SCRAMBLED" : "BINARY", - TrackFilter = dataFilter, + TrackBytesPerSector = 2352, + TrackFile = dataFilter.GetFilename(), + TrackFileType = scrambled ? "SCRAMBLED" : "BINARY", + TrackFilter = dataFilter, TrackRawBytesPerSector = 2352, - TrackSequence = descriptor.POINT, - TrackStartSector = + TrackSequence = descriptor.POINT, + TrackStartSector = GetLba(descriptor.PHOUR, descriptor.PMIN, descriptor.PSEC, descriptor.PFRAME), TrackSession = descriptor.SessionNumber @@ -547,15 +548,18 @@ namespace DiscImageChef.DiscImages // Need to check exact data type later if((TocControl)(descriptor.CONTROL & 0x0D) == TocControl.DataTrack || (TocControl)(descriptor.CONTROL & 0x0D) == TocControl.DataTrackIncremental) - currentTrack.TrackType = TrackType.Data; + currentTrack.TrackType = TrackType.Data; else currentTrack.TrackType = TrackType.Audio; + if(!trackFlags.ContainsKey(descriptor.POINT)) + trackFlags.Add(descriptor.POINT, descriptor.CONTROL); + if(subFilter != null) { - currentTrack.TrackSubchannelFile = subFilter.GetFilename(); + currentTrack.TrackSubchannelFile = subFilter.GetFilename(); currentTrack.TrackSubchannelFilter = subFilter; currentTrack.TrackSubchannelOffset = currentTrack.TrackStartSector * 96; - currentTrack.TrackSubchannelType = TrackSubchannelType.Raw; + currentTrack.TrackSubchannelType = TrackSubchannelType.Raw; } else currentTrack.TrackSubchannelType = TrackSubchannelType.None; @@ -574,12 +578,12 @@ namespace DiscImageChef.DiscImages if(sectTest[15] == 1) { currentTrack.TrackBytesPerSector = 2048; - currentTrack.TrackType = TrackType.CdMode1; + currentTrack.TrackType = TrackType.CdMode1; if(!imageInfo.ReadableSectorTags .Contains(SectorTagType.CdSectorSync)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync); if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorHeader)) + .CdSectorHeader)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader); if(!imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorEcc) ) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEcc); @@ -597,7 +601,7 @@ namespace DiscImageChef.DiscImages { byte[] subHdr1 = new byte[4]; byte[] subHdr2 = new byte[4]; - byte[] empHdr = new byte[4]; + byte[] empHdr = new byte[4]; Array.Copy(sectTest, 16, subHdr1, 0, 4); Array.Copy(sectTest, 20, subHdr2, 0, 4); @@ -606,86 +610,86 @@ namespace DiscImageChef.DiscImages if((subHdr1[2] & 0x20) == 0x20) { currentTrack.TrackBytesPerSector = 2324; - currentTrack.TrackType = TrackType.CdMode2Form2; + currentTrack.TrackType = TrackType.CdMode2Form2; if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorSync) + .CdSectorSync)) + imageInfo.ReadableSectorTags.Add(SectorTagType + .CdSectorSync); + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType + .CdSectorHeader) ) imageInfo.ReadableSectorTags.Add(SectorTagType - .CdSectorSync); + .CdSectorHeader); if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorHeader) + .CdSectorSubHeader) ) imageInfo.ReadableSectorTags.Add(SectorTagType - .CdSectorHeader); + .CdSectorSubHeader); if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorSubHeader) - ) + .CdSectorEdc)) imageInfo.ReadableSectorTags.Add(SectorTagType - .CdSectorSubHeader); - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorEdc)) - imageInfo.ReadableSectorTags.Add(SectorTagType - .CdSectorEdc); + .CdSectorEdc); if(imageInfo.SectorSize < 2324) imageInfo.SectorSize = 2324; } else { currentTrack.TrackBytesPerSector = 2048; - currentTrack.TrackType = TrackType.CdMode2Form1; + currentTrack.TrackType = TrackType.CdMode2Form1; if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorSync) + .CdSectorSync)) + imageInfo.ReadableSectorTags.Add(SectorTagType + .CdSectorSync); + if(!imageInfo.ReadableSectorTags.Contains(SectorTagType + .CdSectorHeader) ) imageInfo.ReadableSectorTags.Add(SectorTagType - .CdSectorSync); + .CdSectorHeader); if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorHeader) + .CdSectorSubHeader) ) imageInfo.ReadableSectorTags.Add(SectorTagType - .CdSectorHeader); + .CdSectorSubHeader); if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorSubHeader) - ) + .CdSectorEcc)) imageInfo.ReadableSectorTags.Add(SectorTagType - .CdSectorSubHeader); + .CdSectorEcc); if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorEcc)) + .CdSectorEccP)) imageInfo.ReadableSectorTags.Add(SectorTagType - .CdSectorEcc); + .CdSectorEccP); if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorEccP) - ) + .CdSectorEccQ)) imageInfo.ReadableSectorTags.Add(SectorTagType - .CdSectorEccP); + .CdSectorEccQ); if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorEccQ) - ) + .CdSectorEdc)) imageInfo.ReadableSectorTags.Add(SectorTagType - .CdSectorEccQ); - if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorEdc)) - imageInfo.ReadableSectorTags.Add(SectorTagType - .CdSectorEdc); + .CdSectorEdc); if(imageInfo.SectorSize < 2048) imageInfo.SectorSize = 2048; } else { currentTrack.TrackBytesPerSector = 2336; - currentTrack.TrackType = TrackType.CdMode2Formless; + currentTrack.TrackType = TrackType.CdMode2Formless; if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorSync)) + .CdSectorSync)) imageInfo.ReadableSectorTags .Add(SectorTagType.CdSectorSync); if(!imageInfo.ReadableSectorTags.Contains(SectorTagType - .CdSectorHeader)) + .CdSectorHeader)) imageInfo.ReadableSectorTags.Add(SectorTagType - .CdSectorHeader); + .CdSectorHeader); if(imageInfo.SectorSize < 2336) imageInfo.SectorSize = 2336; } } } } - else { if(imageInfo.SectorSize < 2352) imageInfo.SectorSize = 2352; } + else + { + if(imageInfo.SectorSize < 2352) imageInfo.SectorSize = 2352; + } } + break; } @@ -697,7 +701,7 @@ namespace DiscImageChef.DiscImages if(descriptor.PMIN == 97) { int type = descriptor.PFRAME % 10; - int frm = descriptor.PFRAME - type; + int frm = descriptor.PFRAME - type; imageInfo.MediaManufacturer = ATIP.ManufacturerFromATIP(descriptor.PSEC, frm); @@ -705,6 +709,7 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("CloneCD plugin", "Disc manufactured by: {0}", imageInfo.MediaManufacturer); } + break; } @@ -713,7 +718,7 @@ namespace DiscImageChef.DiscImages { uint id = (uint)((descriptor.Min << 16) + (descriptor.Sec << 8) + descriptor.Frame); DicConsole.DebugWriteLine("CloneCD plugin", "Disc ID: {0:X6}", id & 0x00FFFFFF); - imageInfo.MediaSerialNumber = $"{id & 0x00FFFFFF:X6}"; + imageInfo.MediaSerialNumber = $"{id & 0x00FFFFFF:X6}"; break; } } @@ -722,45 +727,47 @@ namespace DiscImageChef.DiscImages if(!firstTrackInSession) { currentTrack.TrackEndSector = leadOutStart - 1; - tracks.Add(currentTrack); + Tracks.Add(currentTrack); } if(subFilter != null && !imageInfo.ReadableSectorTags.Contains(SectorTagType.CdSectorSubchannel)) imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSubchannel); - sessions = new List<Session>(); + imageInfo.ReadableSectorTags.Add(SectorTagType.CdTrackFlags); + + Sessions = new List<Session>(); Session currentSession = new Session { - EndTrack = uint.MinValue, - StartTrack = uint.MaxValue, + EndTrack = uint.MinValue, + StartTrack = uint.MaxValue, SessionSequence = 1 }; - partitions = new List<Partition>(); - offsetmap = new Dictionary<uint, ulong>(); + Partitions = new List<Partition>(); + offsetmap = new Dictionary<uint, ulong>(); - foreach(Track track in tracks) + foreach(Track track in Tracks) { if(track.TrackSession == currentSession.SessionSequence) { if(track.TrackSequence > currentSession.EndTrack) { currentSession.EndSector = track.TrackEndSector; - currentSession.EndTrack = track.TrackSequence; + currentSession.EndTrack = track.TrackSequence; } if(track.TrackSequence < currentSession.StartTrack) { currentSession.StartSector = track.TrackStartSector; - currentSession.StartTrack = track.TrackSequence; + currentSession.StartTrack = track.TrackSequence; } } else { - sessions.Add(currentSession); + Sessions.Add(currentSession); currentSession = new Session { - EndTrack = uint.MinValue, - StartTrack = uint.MaxValue, + EndTrack = uint.MinValue, + StartTrack = uint.MaxValue, SessionSequence = track.TrackSession }; } @@ -768,40 +775,41 @@ namespace DiscImageChef.DiscImages Partition partition = new Partition { Description = track.TrackDescription, - Size = - (track.TrackEndSector - track.TrackStartSector + 1) * (ulong)track.TrackRawBytesPerSector, - Length = track.TrackEndSector - track.TrackStartSector + 1, + Size = + (track.TrackEndSector - track.TrackStartSector + 1) * + (ulong)track.TrackRawBytesPerSector, + Length = track.TrackEndSector - track.TrackStartSector + 1, Sequence = track.TrackSequence, - Offset = track.TrackFileOffset, - Start = track.TrackStartSector, - Type = track.TrackType.ToString() + Offset = track.TrackFileOffset, + Start = track.TrackStartSector, + Type = track.TrackType.ToString() }; imageInfo.Sectors += partition.Length; - partitions.Add(partition); + Partitions.Add(partition); offsetmap.Add(track.TrackSequence, track.TrackStartSector); } - bool data = false; - bool mode2 = false; + bool data = false; + bool mode2 = false; bool firstaudio = false; - bool firstdata = false; - bool audio = false; + bool firstdata = false; + bool audio = false; - for(int i = 0; i < tracks.Count; i++) + for(int i = 0; i < Tracks.Count; i++) { // First track is audio - firstaudio |= i == 0 && tracks[i].TrackType == TrackType.Audio; + firstaudio |= i == 0 && Tracks[i].TrackType == TrackType.Audio; // First track is data - firstdata |= i == 0 && tracks[i].TrackType != TrackType.Audio; + firstdata |= i == 0 && Tracks[i].TrackType != TrackType.Audio; // Any non first track is data - data |= i != 0 && tracks[i].TrackType != TrackType.Audio; + data |= i != 0 && Tracks[i].TrackType != TrackType.Audio; // Any non first track is audio - audio |= i != 0 && tracks[i].TrackType == TrackType.Audio; + audio |= i != 0 && Tracks[i].TrackType == TrackType.Audio; - switch(tracks[i].TrackType) + switch(Tracks[i].TrackType) { case TrackType.CdMode2Form1: case TrackType.CdMode2Form2: @@ -814,42 +822,38 @@ namespace DiscImageChef.DiscImages // TODO: Check format cdtext = cdtMs.ToArray(); - if(!data && !firstdata) imageInfo.MediaType = MediaType.CDDA; - else if(firstaudio && data && sessions.Count > 1 && mode2) imageInfo.MediaType = MediaType.CDPLUS; - else if(firstdata && audio || mode2) imageInfo.MediaType = MediaType.CDROMXA; - else if(!audio) imageInfo.MediaType = MediaType.CDROM; - else imageInfo.MediaType = MediaType.CD; + if(!data && !firstdata) imageInfo.MediaType = MediaType.CDDA; + else if(firstaudio && data && Sessions.Count > 1 && mode2) + imageInfo.MediaType = MediaType.CDPLUS; + else if(firstdata && audio || mode2) + imageInfo.MediaType = MediaType.CDROMXA; + else if(!audio) + imageInfo.MediaType = MediaType.CDROM; + else + imageInfo.MediaType = MediaType.CD; - imageInfo.Application = "CloneCD"; - imageInfo.ImageSize = (ulong)imageFilter.GetDataForkLength(); - imageInfo.CreationTime = imageFilter.GetCreationTime(); + imageInfo.Application = "CloneCD"; + imageInfo.ImageSize = (ulong)imageFilter.GetDataForkLength(); + imageInfo.CreationTime = imageFilter.GetCreationTime(); imageInfo.LastModificationTime = imageFilter.GetLastWriteTime(); - imageInfo.XmlMediaType = XmlMediaType.OpticalDisc; + imageInfo.XmlMediaType = XmlMediaType.OpticalDisc; return true; } catch(Exception ex) { DicConsole.ErrorWriteLine("Exception trying to identify image file {0}", imageFilter.GetFilename()); - DicConsole.ErrorWriteLine("Exception: {0}", ex.Message); - DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace); + DicConsole.ErrorWriteLine("Exception: {0}", ex.Message); + DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace); return false; } } - static ulong GetLba(int hour, int minute, int second, int frame) - { - return (ulong)(hour * 60 * 60 * 75 + minute * 60 * 75 + second * 75 + frame - 150); - } - public byte[] ReadDiskTag(MediaTagType tag) { switch(tag) { - case MediaTagType.CD_FullTOC: - { - return fulltoc; - } + case MediaTagType.CD_FullTOC: { return fulltoc; } case MediaTagType.CD_TEXT: { if(cdtext != null && cdtext.Length > 0) return cdtext; @@ -885,9 +889,9 @@ namespace DiscImageChef.DiscImages { foreach(KeyValuePair<uint, ulong> kvp in from kvp in offsetmap where sectorAddress >= kvp.Value - from track in tracks + from track in Tracks where track.TrackSequence == kvp.Key - where sectorAddress <= track.TrackEndSector + where sectorAddress <= track.TrackEndSector select kvp) return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key); @@ -898,9 +902,9 @@ namespace DiscImageChef.DiscImages { foreach(KeyValuePair<uint, ulong> kvp in from kvp in offsetmap where sectorAddress >= kvp.Value - from track in tracks + from track in Tracks where track.TrackSequence == kvp.Key - where sectorAddress <= track.TrackEndSector + where sectorAddress <= track.TrackEndSector select kvp) return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag); @@ -911,7 +915,7 @@ namespace DiscImageChef.DiscImages { Track dicTrack = new Track {TrackSequence = 0}; - foreach(Track linqTrack in tracks.Where(linqTrack => linqTrack.TrackSequence == track)) + foreach(Track linqTrack in Tracks.Where(linqTrack => linqTrack.TrackSequence == track)) { dicTrack = linqTrack; break; @@ -923,9 +927,9 @@ namespace DiscImageChef.DiscImages if(length + sectorAddress - 1 > dicTrack.TrackEndSector) throw new ArgumentOutOfRangeException(nameof(length), string - .Format("Requested more sectors ({0} {2}) than present in track ({1}), won't cross tracks", - length + sectorAddress, dicTrack.TrackEndSector, - sectorAddress)); + .Format("Requested more sectors ({0} {2}) than present in track ({1}), won't cross tracks", + length + sectorAddress, dicTrack.TrackEndSector, + sectorAddress)); uint sectorOffset; uint sectorSize; @@ -936,36 +940,36 @@ namespace DiscImageChef.DiscImages case TrackType.Audio: { sectorOffset = 0; - sectorSize = 2352; - sectorSkip = 0; + sectorSize = 2352; + sectorSkip = 0; break; } case TrackType.CdMode1: { sectorOffset = 16; - sectorSize = 2048; - sectorSkip = 288; + sectorSize = 2048; + sectorSkip = 288; break; } case TrackType.CdMode2Formless: { sectorOffset = 16; - sectorSize = 2336; - sectorSkip = 0; + sectorSize = 2336; + sectorSkip = 0; break; } case TrackType.CdMode2Form1: { sectorOffset = 24; - sectorSize = 2048; - sectorSkip = 280; + sectorSize = 2048; + sectorSkip = 280; break; } case TrackType.CdMode2Form2: { sectorOffset = 24; - sectorSize = 2324; - sectorSkip = 4; + sectorSize = 2324; + sectorSkip = 4; break; } default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); @@ -988,12 +992,11 @@ namespace DiscImageChef.DiscImages return buffer; } - // TODO: Flags public byte[] ReadSectorsTag(ulong sectorAddress, uint length, uint track, SectorTagType tag) { Track dicTrack = new Track {TrackSequence = 0}; - foreach(Track linqTrack in tracks.Where(linqTrack => linqTrack.TrackSequence == track)) + foreach(Track linqTrack in Tracks.Where(linqTrack => linqTrack.TrackSequence == track)) { dicTrack = linqTrack; break; @@ -1020,8 +1023,12 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorHeader: case SectorTagType.CdSectorSubHeader: case SectorTagType.CdSectorSync: break; + case SectorTagType.CdTrackFlags: + return !trackFlags.TryGetValue((byte)dicTrack.TrackSequence, out byte flags) + ? new[] {flags} + : new byte[1]; case SectorTagType.CdSectorSubchannel: - buffer = new byte[96 * length]; + buffer = new byte[96 * length]; subStream.Seek((long)(dicTrack.TrackSubchannelOffset + sectorAddress * 96), SeekOrigin.Begin); subStream.Read(buffer, 0, buffer.Length); return buffer; @@ -1040,15 +1047,15 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorSync: { sectorOffset = 0; - sectorSize = 12; - sectorSkip = 2340; + sectorSize = 12; + sectorSkip = 2340; break; } case SectorTagType.CdSectorHeader: { sectorOffset = 12; - sectorSize = 4; - sectorSkip = 2336; + sectorSize = 4; + sectorSkip = 2336; break; } case SectorTagType.CdSectorSubHeader: @@ -1056,29 +1063,29 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorEcc: { sectorOffset = 2076; - sectorSize = 276; - sectorSkip = 0; + sectorSize = 276; + sectorSkip = 0; break; } case SectorTagType.CdSectorEccP: { sectorOffset = 2076; - sectorSize = 172; - sectorSkip = 104; + sectorSize = 172; + sectorSkip = 104; break; } case SectorTagType.CdSectorEccQ: { sectorOffset = 2248; - sectorSize = 104; - sectorSkip = 0; + sectorSize = 104; + sectorSkip = 0; break; } case SectorTagType.CdSectorEdc: { sectorOffset = 2064; - sectorSize = 4; - sectorSkip = 284; + sectorSize = 4; + sectorSkip = 284; break; } default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); @@ -1098,15 +1105,15 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorSubHeader: { sectorOffset = 0; - sectorSize = 8; - sectorSkip = 2328; + sectorSize = 8; + sectorSkip = 2328; break; } case SectorTagType.CdSectorEdc: { sectorOffset = 2332; - sectorSize = 4; - sectorSkip = 0; + sectorSize = 4; + sectorSkip = 0; break; } default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); @@ -1120,50 +1127,50 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorSync: { sectorOffset = 0; - sectorSize = 12; - sectorSkip = 2340; + sectorSize = 12; + sectorSkip = 2340; break; } case SectorTagType.CdSectorHeader: { sectorOffset = 12; - sectorSize = 4; - sectorSkip = 2336; + sectorSize = 4; + sectorSkip = 2336; break; } case SectorTagType.CdSectorSubHeader: { sectorOffset = 16; - sectorSize = 8; - sectorSkip = 2328; + sectorSize = 8; + sectorSkip = 2328; break; } case SectorTagType.CdSectorEcc: { sectorOffset = 2076; - sectorSize = 276; - sectorSkip = 0; + sectorSize = 276; + sectorSkip = 0; break; } case SectorTagType.CdSectorEccP: { sectorOffset = 2076; - sectorSize = 172; - sectorSkip = 104; + sectorSize = 172; + sectorSkip = 104; break; } case SectorTagType.CdSectorEccQ: { sectorOffset = 2248; - sectorSize = 104; - sectorSkip = 0; + sectorSize = 104; + sectorSkip = 0; break; } case SectorTagType.CdSectorEdc: { sectorOffset = 2072; - sectorSize = 4; - sectorSkip = 276; + sectorSize = 4; + sectorSkip = 276; break; } default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); @@ -1176,40 +1183,38 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorSync: { sectorOffset = 0; - sectorSize = 12; - sectorSkip = 2340; + sectorSize = 12; + sectorSkip = 2340; break; } case SectorTagType.CdSectorHeader: { sectorOffset = 12; - sectorSize = 4; - sectorSkip = 2336; + sectorSize = 4; + sectorSkip = 2336; break; } case SectorTagType.CdSectorSubHeader: { sectorOffset = 16; - sectorSize = 8; - sectorSkip = 2328; + sectorSize = 8; + sectorSkip = 2328; break; } case SectorTagType.CdSectorEdc: { sectorOffset = 2348; - sectorSize = 4; - sectorSkip = 0; + sectorSize = 4; + sectorSkip = 0; break; } default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); } break; - case TrackType.Audio: - { - throw new ArgumentException("Unsupported tag requested", nameof(tag)); - } - default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); + case TrackType.Audio: { throw new ArgumentException("Unsupported tag requested", nameof(tag)); } + default: + throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); } buffer = new byte[sectorSize * length]; @@ -1243,9 +1248,9 @@ namespace DiscImageChef.DiscImages { foreach(KeyValuePair<uint, ulong> kvp in from kvp in offsetmap where sectorAddress >= kvp.Value - from track in tracks - where track.TrackSequence == kvp.Key - where sectorAddress - kvp.Value < + from track in Tracks + where track.TrackSequence == kvp.Key + where sectorAddress - kvp.Value < track.TrackEndSector - track.TrackStartSector + 1 select kvp) return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); @@ -1257,7 +1262,7 @@ namespace DiscImageChef.DiscImages { Track dicTrack = new Track {TrackSequence = 0}; - foreach(Track linqTrack in tracks.Where(linqTrack => linqTrack.TrackSequence == track)) + foreach(Track linqTrack in Tracks.Where(linqTrack => linqTrack.TrackSequence == track)) { dicTrack = linqTrack; break; @@ -1280,14 +1285,14 @@ namespace DiscImageChef.DiscImages public List<Track> GetSessionTracks(Session session) { - if(sessions.Contains(session)) return GetSessionTracks(session.SessionSequence); + if(Sessions.Contains(session)) return GetSessionTracks(session.SessionSequence); throw new ImageNotSupportedException("Session does not exist in disc image"); } public List<Track> GetSessionTracks(ushort session) { - return tracks.Where(track => track.TrackSession == session).ToList(); + return Tracks.Where(track => track.TrackSession == session).ToList(); } public bool? VerifySector(ulong sectorAddress) @@ -1303,13 +1308,13 @@ namespace DiscImageChef.DiscImages } public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas, - out List<ulong> unknownLbas) + out List<ulong> unknownLbas) { byte[] buffer = ReadSectorsLong(sectorAddress, length); - int bps = (int)(buffer.Length / length); + int bps = (int)(buffer.Length / length); byte[] sector = new byte[bps]; - failingLbas = new List<ulong>(); - unknownLbas = new List<ulong>(); + failingLbas = new List<ulong>(); + unknownLbas = new List<ulong>(); for(int i = 0; i < length; i++) { @@ -1333,13 +1338,13 @@ namespace DiscImageChef.DiscImages } public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas, - out List<ulong> unknownLbas) + out List<ulong> unknownLbas) { byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); + int bps = (int)(buffer.Length / length); byte[] sector = new byte[bps]; - failingLbas = new List<ulong>(); - unknownLbas = new List<ulong>(); + failingLbas = new List<ulong>(); + unknownLbas = new List<ulong>(); for(int i = 0; i < length; i++) { @@ -1366,5 +1371,10 @@ namespace DiscImageChef.DiscImages { return null; } + + static ulong GetLba(int hour, int minute, int second, int frame) + { + return (ulong)(hour * 60 * 60 * 75 + minute * 60 * 75 + second * 75 + frame - 150); + } } } \ No newline at end of file diff --git a/DiscImageChef.DiscImages/Enums.cs b/DiscImageChef.DiscImages/Enums.cs index f7fbf11f..87d0f1ae 100644 --- a/DiscImageChef.DiscImages/Enums.cs +++ b/DiscImageChef.DiscImages/Enums.cs @@ -281,12 +281,12 @@ namespace DiscImageChef.DiscImages public enum CdFlags : byte { /// <summary>Track is quadraphonic.</summary> - FourChannel = 0x20, + FourChannel = 0x08, /// <summary>Track is non-audio (data).</summary> - DataTrack = 0x10, + DataTrack = 0x04, /// <summary>Track is copy protected.</summary> - CopyPrevent = 0x08, + CopyPermitted = 0x02, /// <summary>Track has pre-emphasis.</summary> - PreEmphasis = 0x04 + PreEmphasis = 0x01 } } \ No newline at end of file diff --git a/DiscImageChef.DiscImages/GDI.cs b/DiscImageChef.DiscImages/GDI.cs index 56a31f2c..4333be9d 100644 --- a/DiscImageChef.DiscImages/GDI.cs +++ b/DiscImageChef.DiscImages/GDI.cs @@ -49,46 +49,45 @@ namespace DiscImageChef.DiscImages const string REGEX_TRACK = @"\s?(?<track>\d+)\s+(?<start>\d+)\s(?<flags>\d)\s(?<type>2352|2048)\s(?<filename>.+)\s(?<offset>\d+)$"; - ulong densitySeparationSectors; - GdiDisc discimage; + ulong densitySeparationSectors; + GdiDisc discimage; StreamReader gdiStream; - ImageInfo imageInfo; - Stream imageStream; + ImageInfo imageInfo; + Stream imageStream; /// <summary>Dictionary, index is track #, value is track number, or 0 if a TOC</summary> Dictionary<uint, ulong> offsetmap; - List<Partition> partitions; public Gdi() { imageInfo = new ImageInfo { - ReadableSectorTags = new List<SectorTagType>(), - ReadableMediaTags = new List<MediaTagType>(), - HasPartitions = true, - HasSessions = true, - Version = null, - ApplicationVersion = null, - MediaTitle = null, - Creator = null, - MediaManufacturer = null, - MediaModel = null, - MediaPartNumber = null, - MediaSequence = 0, - LastMediaSequence = 0, - DriveManufacturer = null, - DriveModel = null, - DriveSerialNumber = null, + ReadableSectorTags = new List<SectorTagType>(), + ReadableMediaTags = new List<MediaTagType>(), + HasPartitions = true, + HasSessions = true, + Version = null, + ApplicationVersion = null, + MediaTitle = null, + Creator = null, + MediaManufacturer = null, + MediaModel = null, + MediaPartNumber = null, + MediaSequence = 0, + LastMediaSequence = 0, + DriveManufacturer = null, + DriveModel = null, + DriveSerialNumber = null, DriveFirmwareRevision = null }; } - public string Name => "Dreamcast GDI image"; - public Guid Id => new Guid("281ECBF2-D2A7-414C-8497-1A33F6DCB2DD"); + public string Name => "Dreamcast GDI image"; + public Guid Id => new Guid("281ECBF2-D2A7-414C-8497-1A33F6DCB2DD"); public ImageInfo Info => imageInfo; public string Format => "Dreamcast GDI image"; - public List<Partition> Partitions => partitions; + public List<Partition> Partitions { get; set; } public List<Track> Tracks { @@ -100,20 +99,20 @@ namespace DiscImageChef.DiscImages { Track track = new Track { - Indexes = new Dictionary<int, ulong>(), - TrackDescription = null, - TrackStartSector = gdiTrack.StartSector, - TrackPregap = gdiTrack.Pregap, - TrackSession = (ushort)(gdiTrack.HighDensity ? 2 : 1), - TrackSequence = gdiTrack.Sequence, - TrackType = gdiTrack.Tracktype, - TrackFilter = gdiTrack.Trackfilter, - TrackFile = gdiTrack.Trackfile, - TrackFileOffset = (ulong)gdiTrack.Offset, - TrackFileType = "BINARY", + Indexes = new Dictionary<int, ulong>(), + TrackDescription = null, + TrackStartSector = gdiTrack.StartSector, + TrackPregap = gdiTrack.Pregap, + TrackSession = (ushort)(gdiTrack.HighDensity ? 2 : 1), + TrackSequence = gdiTrack.Sequence, + TrackType = gdiTrack.Tracktype, + TrackFilter = gdiTrack.Trackfilter, + TrackFile = gdiTrack.Trackfile, + TrackFileOffset = (ulong)gdiTrack.Offset, + TrackFileType = "BINARY", TrackRawBytesPerSector = gdiTrack.Bps, - TrackBytesPerSector = gdiTrack.Tracktype == TrackType.Data ? 2048 : 2352, - TrackSubchannelType = TrackSubchannelType.None + TrackBytesPerSector = gdiTrack.Tracktype == TrackType.Data ? 2048 : 2352, + TrackSubchannelType = TrackSubchannelType.None }; track.TrackEndSector = track.TrackStartSector + gdiTrack.Sectors - 1; @@ -154,17 +153,20 @@ namespace DiscImageChef.DiscImages return false; } - gdiStream = new StreamReader(imageFilter.GetDataForkStream()); - int lineNumber = 0; + gdiStream = new StreamReader(imageFilter.GetDataForkStream()); + int lineNumber = 0; int tracksFound = 0; - int tracks = 0; + int tracks = 0; while(gdiStream.Peek() >= 0) { lineNumber++; string line = gdiStream.ReadLine(); - if(lineNumber == 1) { if(!int.TryParse(line, out tracks)) return false; } + if(lineNumber == 1) + { + if(!int.TryParse(line, out tracks)) return false; + } else { Regex regexTrack = new Regex(REGEX_TRACK); @@ -184,8 +186,8 @@ namespace DiscImageChef.DiscImages catch(Exception ex) { DicConsole.ErrorWriteLine("Exception trying to identify image file {0}", imageFilter.GetBasePath()); - DicConsole.ErrorWriteLine("Exception: {0}", ex.Message); - DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace); + DicConsole.ErrorWriteLine("Exception: {0}", ex.Message); + DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace); return false; } } @@ -197,8 +199,8 @@ namespace DiscImageChef.DiscImages try { imageFilter.GetDataForkStream().Seek(0, SeekOrigin.Begin); - gdiStream = new StreamReader(imageFilter.GetDataForkStream()); - int lineNumber = 0; + gdiStream = new StreamReader(imageFilter.GetDataForkStream()); + int lineNumber = 0; bool highDensity = false; // Initialize all RegExs @@ -209,8 +211,8 @@ namespace DiscImageChef.DiscImages // Initialize disc discimage = new GdiDisc {Sessions = new List<Session>(), Tracks = new List<GdiTrack>()}; - ulong currentStart = 0; - offsetmap = new Dictionary<uint, ulong>(); + ulong currentStart = 0; + offsetmap = new Dictionary<uint, ulong>(); densitySeparationSectors = 0; while(gdiStream.Peek() >= 0) @@ -237,13 +239,13 @@ namespace DiscImageChef.DiscImages trackMatch.Groups["filename"].Value, trackMatch.Groups["offset"].Value, lineNumber); - FiltersList filtersList = new FiltersList(); - GdiTrack currentTrack = new GdiTrack + FiltersList filtersList = new FiltersList(); + GdiTrack currentTrack = new GdiTrack { - Bps = ushort.Parse(trackMatch.Groups["type"].Value), - Flags = (byte)(byte.Parse(trackMatch.Groups["flags"].Value) * 0x10), - Offset = long.Parse(trackMatch.Groups["offset"].Value), - Sequence = uint.Parse(trackMatch.Groups["track"].Value), + Bps = ushort.Parse(trackMatch.Groups["type"].Value), + Flags = byte.Parse(trackMatch.Groups["flags"].Value), + Offset = long.Parse(trackMatch.Groups["offset"].Value), + Sequence = uint.Parse(trackMatch.Groups["track"].Value), StartSector = ulong.Parse(trackMatch.Groups["start"].Value), Trackfilter = filtersList.GetFilter(Path.Combine(imageFilter.GetParentFolder(), @@ -253,16 +255,16 @@ namespace DiscImageChef.DiscImages currentTrack.Trackfile = currentTrack.Trackfilter.GetFilename(); if(currentTrack.StartSector - currentStart > 0) - if(currentTrack.StartSector == 45000) + if(currentTrack.StartSector == 45000) { highDensity = true; offsetmap.Add(0, currentStart); densitySeparationSectors = currentTrack.StartSector - currentStart; - currentStart = currentTrack.StartSector; + currentStart = currentTrack.StartSector; } else { - currentTrack.Pregap = currentTrack.StartSector - currentStart; + currentTrack.Pregap = currentTrack.StartSector - currentStart; currentTrack.StartSector -= currentTrack.StartSector - currentStart; } @@ -272,12 +274,12 @@ namespace DiscImageChef.DiscImages currentTrack.Sectors = (ulong)((currentTrack.Trackfilter.GetDataForkLength() - currentTrack.Offset) / currentTrack.Bps); - currentTrack.Sectors += currentTrack.Pregap; - currentStart += currentTrack.Sectors; - currentTrack.HighDensity = highDensity; + currentTrack.Sectors += currentTrack.Pregap; + currentStart += currentTrack.Sectors; + currentTrack.HighDensity = highDensity; currentTrack.Tracktype = - (currentTrack.Flags & 0x40) == 0x40 ? TrackType.CdMode1 : TrackType.Audio; + (currentTrack.Flags & 0x4) == 0x4 ? TrackType.CdMode1 : TrackType.Audio; discimage.Tracks.Add(currentTrack); } @@ -285,20 +287,21 @@ namespace DiscImageChef.DiscImages Session[] sessions = new Session[2]; for(int s = 0; s < sessions.Length; s++) - if(s == 0) + if(s == 0) { sessions[s].SessionSequence = 1; foreach(GdiTrack trk in discimage.Tracks.Where(trk => !trk.HighDensity)) { - if(sessions[s].StartTrack == 0) sessions[s].StartTrack = trk.Sequence; - else if(sessions[s].StartTrack > trk.Sequence) sessions[s].StartTrack = trk.Sequence; + if(sessions[s].StartTrack == 0) sessions[s].StartTrack = trk.Sequence; + else if(sessions[s].StartTrack > trk.Sequence) + sessions[s].StartTrack = trk.Sequence; if(sessions[s].EndTrack < trk.Sequence) sessions[s].EndTrack = trk.Sequence; if(sessions[s].StartSector > trk.StartSector) sessions[s].StartSector = trk.StartSector; - if(sessions[s].EndSector < trk.Sectors + trk.StartSector - 1) + if(sessions[s].EndSector < trk.Sectors + trk.StartSector - 1) sessions[s].EndSector = trk.Sectors + trk.StartSector - 1; } } @@ -308,14 +311,15 @@ namespace DiscImageChef.DiscImages foreach(GdiTrack trk in discimage.Tracks.Where(trk => trk.HighDensity)) { - if(sessions[s].StartTrack == 0) sessions[s].StartTrack = trk.Sequence; - else if(sessions[s].StartTrack > trk.Sequence) sessions[s].StartTrack = trk.Sequence; + if(sessions[s].StartTrack == 0) sessions[s].StartTrack = trk.Sequence; + else if(sessions[s].StartTrack > trk.Sequence) + sessions[s].StartTrack = trk.Sequence; if(sessions[s].EndTrack < trk.Sequence) sessions[s].EndTrack = trk.Sequence; if(sessions[s].StartSector > trk.StartSector) sessions[s].StartSector = trk.StartSector; - if(sessions[s].EndSector < trk.Sectors + trk.StartSector - 1) + if(sessions[s].EndSector < trk.Sectors + trk.StartSector - 1) sessions[s].EndSector = trk.Sectors + trk.StartSector - 1; } } @@ -337,7 +341,7 @@ namespace DiscImageChef.DiscImages discimage.Sessions[i].StartTrack); DicConsole.DebugWriteLine("GDI plugin", "\t\tStarting sector: {0}", discimage.Sessions[i].StartSector); - DicConsole.DebugWriteLine("GDI plugin", "\t\tEnding track: {0}", discimage.Sessions[i].EndTrack); + DicConsole.DebugWriteLine("GDI plugin", "\t\tEnding track: {0}", discimage.Sessions[i].EndTrack); DicConsole.DebugWriteLine("GDI plugin", "\t\tEnding sector: {0}", discimage.Sessions[i].EndSector); } @@ -347,15 +351,15 @@ namespace DiscImageChef.DiscImages { DicConsole.DebugWriteLine("GDI plugin", "\tTrack {0} information:", discimage.Tracks[i].Sequence); DicConsole.DebugWriteLine("GDI plugin", "\t\t{0} bytes per sector", discimage.Tracks[i].Bps); - DicConsole.DebugWriteLine("GDI plugin", "\t\tPregap: {0} sectors", discimage.Tracks[i].Pregap); + DicConsole.DebugWriteLine("GDI plugin", "\t\tPregap: {0} sectors", discimage.Tracks[i].Pregap); - if((discimage.Tracks[i].Flags & 0x80) == 0x80) + if((discimage.Tracks[i].Flags & 0x8) == 0x8) DicConsole.DebugWriteLine("GDI plugin", "\t\tTrack is flagged as quadraphonic"); - if((discimage.Tracks[i].Flags & 0x40) == 0x40) + if((discimage.Tracks[i].Flags & 0x4) == 0x4) DicConsole.DebugWriteLine("GDI plugin", "\t\tTrack is data"); - if((discimage.Tracks[i].Flags & 0x20) == 0x20) + if((discimage.Tracks[i].Flags & 0x2) == 0x2) DicConsole.DebugWriteLine("GDI plugin", "\t\tTrack allows digital copy"); - if((discimage.Tracks[i].Flags & 0x10) == 0x10) + if((discimage.Tracks[i].Flags & 0x1) == 0x1) DicConsole.DebugWriteLine("GDI plugin", "\t\tTrack has pre-emphasis applied"); DicConsole.DebugWriteLine("GDI plugin", @@ -366,7 +370,7 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("GDI plugin", "Building offset map"); - partitions = new List<Partition>(); + Partitions = new List<Partition>(); ulong byteOffset = 0; for(int i = 0; i < discimage.Tracks.Count; i++) @@ -378,29 +382,29 @@ namespace DiscImageChef.DiscImages Partition partition = new Partition { Description = $"Track {discimage.Tracks[i].Sequence}.", - Name = null, - Start = discimage.Tracks[i].StartSector, - Size = discimage.Tracks[i].Sectors * discimage.Tracks[i].Bps, - Length = discimage.Tracks[i].Sectors, - Sequence = discimage.Tracks[i].Sequence, - Offset = byteOffset, - Type = discimage.Tracks[i].Tracktype.ToString() + Name = null, + Start = discimage.Tracks[i].StartSector, + Size = discimage.Tracks[i].Sectors * discimage.Tracks[i].Bps, + Length = discimage.Tracks[i].Sectors, + Sequence = discimage.Tracks[i].Sequence, + Offset = byteOffset, + Type = discimage.Tracks[i].Tracktype.ToString() }; byteOffset += partition.Size; offsetmap.Add(discimage.Tracks[i].Sequence, partition.Start); - partitions.Add(partition); + Partitions.Add(partition); } foreach(GdiTrack track in discimage.Tracks) imageInfo.ImageSize += track.Bps * track.Sectors; - foreach(GdiTrack track in discimage.Tracks) imageInfo.Sectors += track.Sectors; + foreach(GdiTrack track in discimage.Tracks) imageInfo.Sectors += track.Sectors; imageInfo.Sectors += densitySeparationSectors; imageInfo.SectorSize = 2352; // All others - foreach(GdiTrack unused in - discimage.Tracks.Where(track => (track.Flags & 0x40) == 0x40 && track.Bps == 2352)) + foreach(GdiTrack unused in discimage.Tracks.Where(track => (track.Flags & 0x4) == 0x4 && + track.Bps == 2352)) { imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorSync); imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorHeader); @@ -411,7 +415,7 @@ namespace DiscImageChef.DiscImages imageInfo.ReadableSectorTags.Add(SectorTagType.CdSectorEdc); } - imageInfo.CreationTime = imageFilter.GetCreationTime(); + imageInfo.CreationTime = imageFilter.GetCreationTime(); imageInfo.LastModificationTime = imageFilter.GetLastWriteTime(); imageInfo.MediaType = discimage.Disktype; @@ -427,8 +431,8 @@ namespace DiscImageChef.DiscImages catch(Exception ex) { DicConsole.ErrorWriteLine("Exception trying to identify image file {0}", imageFilter.GetBasePath()); - DicConsole.ErrorWriteLine("Exception: {0}", ex.Message); - DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace); + DicConsole.ErrorWriteLine("Exception: {0}", ex.Message); + DicConsole.ErrorWriteLine("Stack trace: {0}", ex.StackTrace); return false; } } @@ -463,14 +467,15 @@ namespace DiscImageChef.DiscImages foreach(KeyValuePair<uint, ulong> kvp in from kvp in offsetmap where sectorAddress >= kvp.Value from gdiTrack in discimage.Tracks - where gdiTrack.Sequence == kvp.Key + where gdiTrack.Sequence == kvp.Key where sectorAddress - kvp.Value < gdiTrack.Sectors select kvp) return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key); offsetmap.TryGetValue(0, out ulong transitionStart); if(sectorAddress >= transitionStart && sectorAddress < densitySeparationSectors + transitionStart) - return ReadSectors(sectorAddress - transitionStart, length, 0); + return ReadSectors(sectorAddress - transitionStart, length, + 0); throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found"); } @@ -480,14 +485,15 @@ namespace DiscImageChef.DiscImages foreach(KeyValuePair<uint, ulong> kvp in from kvp in offsetmap where sectorAddress >= kvp.Value from gdiTrack in discimage.Tracks - where gdiTrack.Sequence == kvp.Key + where gdiTrack.Sequence == kvp.Key where sectorAddress - kvp.Value < gdiTrack.Sectors select kvp) return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag); offsetmap.TryGetValue(0, out ulong transitionStart); if(sectorAddress >= transitionStart && sectorAddress < densitySeparationSectors + transitionStart) - return ReadSectorsTag(sectorAddress - transitionStart, length, 0, tag); + return ReadSectorsTag(sectorAddress - transitionStart, length, + 0, tag); throw new ArgumentOutOfRangeException(nameof(sectorAddress), "Sector address not found"); } @@ -527,8 +533,8 @@ namespace DiscImageChef.DiscImages case TrackType.Audio: { sectorOffset = 0; - sectorSize = 2352; - sectorSkip = 0; + sectorSize = 2352; + sectorSkip = 0; break; } case TrackType.CdMode1: @@ -536,15 +542,16 @@ namespace DiscImageChef.DiscImages if(dicTrack.Bps == 2352) { sectorOffset = 16; - sectorSize = 2048; - sectorSkip = 288; + sectorSize = 2048; + sectorSkip = 288; } else { sectorOffset = 0; - sectorSize = 2048; - sectorSkip = 0; + sectorSize = 2048; + sectorSkip = 0; } + break; } default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); @@ -556,16 +563,16 @@ namespace DiscImageChef.DiscImages if(dicTrack.Pregap > 0 && sectorAddress < dicTrack.Pregap) { - ulong remainingPregap = dicTrack.Pregap - sectorAddress; + ulong remainingPregap = dicTrack.Pregap - sectorAddress; byte[] zero; if(length > remainingPregap) { - zero = new byte[remainingPregap * sectorSize]; + zero = new byte[remainingPregap * sectorSize]; remainingSectors -= remainingPregap; } else { - zero = new byte[length * sectorSize]; + zero = new byte[length * sectorSize]; remainingSectors -= length; } @@ -574,7 +581,7 @@ namespace DiscImageChef.DiscImages if(remainingSectors == 0) return buffer; - imageStream = dicTrack.Trackfilter.GetDataForkStream(); + imageStream = dicTrack.Trackfilter.GetDataForkStream(); BinaryReader br = new BinaryReader(imageStream); br.BaseStream .Seek(dicTrack.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip) + dicTrack.Pregap * dicTrack.Bps), @@ -656,15 +663,15 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorSync: { sectorOffset = 0; - sectorSize = 12; - sectorSkip = 2340; + sectorSize = 12; + sectorSkip = 2340; break; } case SectorTagType.CdSectorHeader: { sectorOffset = 12; - sectorSize = 4; - sectorSkip = 2336; + sectorSize = 4; + sectorSkip = 2336; break; } case SectorTagType.CdSectorSubchannel: @@ -673,29 +680,29 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorEcc: { sectorOffset = 2076; - sectorSize = 276; - sectorSkip = 0; + sectorSize = 276; + sectorSkip = 0; break; } case SectorTagType.CdSectorEccP: { sectorOffset = 2076; - sectorSize = 172; - sectorSkip = 104; + sectorSize = 172; + sectorSkip = 104; break; } case SectorTagType.CdSectorEccQ: { sectorOffset = 2248; - sectorSize = 104; - sectorSkip = 0; + sectorSize = 104; + sectorSkip = 0; break; } case SectorTagType.CdSectorEdc: { sectorOffset = 2064; - sectorSize = 4; - sectorSkip = 284; + sectorSize = 4; + sectorSkip = 284; break; } default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); @@ -712,16 +719,16 @@ namespace DiscImageChef.DiscImages if(dicTrack.Pregap > 0 && sectorAddress < dicTrack.Pregap) { - ulong remainingPregap = dicTrack.Pregap - sectorAddress; + ulong remainingPregap = dicTrack.Pregap - sectorAddress; byte[] zero; if(length > remainingPregap) { - zero = new byte[remainingPregap * sectorSize]; + zero = new byte[remainingPregap * sectorSize]; remainingSectors -= remainingPregap; } else { - zero = new byte[length * sectorSize]; + zero = new byte[length * sectorSize]; remainingSectors -= length; } @@ -730,7 +737,7 @@ namespace DiscImageChef.DiscImages if(remainingSectors == 0) return buffer; - imageStream = dicTrack.Trackfilter.GetDataForkStream(); + imageStream = dicTrack.Trackfilter.GetDataForkStream(); BinaryReader br = new BinaryReader(imageStream); br.BaseStream .Seek(dicTrack.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip) + dicTrack.Pregap * dicTrack.Bps), @@ -763,7 +770,7 @@ namespace DiscImageChef.DiscImages foreach(KeyValuePair<uint, ulong> kvp in from kvp in offsetmap where sectorAddress >= kvp.Value from gdiTrack in discimage.Tracks - where gdiTrack.Sequence == kvp.Key + where gdiTrack.Sequence == kvp.Key where sectorAddress - kvp.Value < gdiTrack.Sectors select kvp) return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); @@ -806,8 +813,8 @@ namespace DiscImageChef.DiscImages case TrackType.Audio: { sectorOffset = 0; - sectorSize = 2352; - sectorSkip = 0; + sectorSize = 2352; + sectorSkip = 0; break; } case TrackType.CdMode1: @@ -815,15 +822,16 @@ namespace DiscImageChef.DiscImages if(dicTrack.Bps == 2352) { sectorOffset = 0; - sectorSize = 2352; - sectorSkip = 0; + sectorSize = 2352; + sectorSkip = 0; } else { sectorOffset = 0; - sectorSize = 2048; - sectorSkip = 0; + sectorSize = 2048; + sectorSkip = 0; } + break; } default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); @@ -835,16 +843,16 @@ namespace DiscImageChef.DiscImages if(dicTrack.Pregap > 0 && sectorAddress < dicTrack.Pregap) { - ulong remainingPregap = dicTrack.Pregap - sectorAddress; + ulong remainingPregap = dicTrack.Pregap - sectorAddress; byte[] zero; if(length > remainingPregap) { - zero = new byte[remainingPregap * sectorSize]; + zero = new byte[remainingPregap * sectorSize]; remainingSectors -= remainingPregap; } else { - zero = new byte[length * sectorSize]; + zero = new byte[length * sectorSize]; remainingSectors -= length; } @@ -853,7 +861,7 @@ namespace DiscImageChef.DiscImages if(remainingSectors == 0) return buffer; - imageStream = dicTrack.Trackfilter.GetDataForkStream(); + imageStream = dicTrack.Trackfilter.GetDataForkStream(); BinaryReader br = new BinaryReader(imageStream); br.BaseStream .Seek(dicTrack.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip) + dicTrack.Pregap * dicTrack.Bps), @@ -881,7 +889,7 @@ namespace DiscImageChef.DiscImages public List<Track> GetSessionTracks(ushort session) { List<Track> tracks = new List<Track>(); - bool expectedDensity; + bool expectedDensity; switch(session) { @@ -899,20 +907,20 @@ namespace DiscImageChef.DiscImages { Track track = new Track { - Indexes = new Dictionary<int, ulong>(), - TrackDescription = null, - TrackStartSector = gdiTrack.StartSector, - TrackPregap = gdiTrack.Pregap, - TrackSession = (ushort)(gdiTrack.HighDensity ? 2 : 1), - TrackSequence = gdiTrack.Sequence, - TrackType = gdiTrack.Tracktype, - TrackFilter = gdiTrack.Trackfilter, - TrackFile = gdiTrack.Trackfile, - TrackFileOffset = (ulong)gdiTrack.Offset, - TrackFileType = "BINARY", + Indexes = new Dictionary<int, ulong>(), + TrackDescription = null, + TrackStartSector = gdiTrack.StartSector, + TrackPregap = gdiTrack.Pregap, + TrackSession = (ushort)(gdiTrack.HighDensity ? 2 : 1), + TrackSequence = gdiTrack.Sequence, + TrackType = gdiTrack.Tracktype, + TrackFilter = gdiTrack.Trackfilter, + TrackFile = gdiTrack.Trackfile, + TrackFileOffset = (ulong)gdiTrack.Offset, + TrackFileType = "BINARY", TrackRawBytesPerSector = gdiTrack.Bps, - TrackBytesPerSector = gdiTrack.Tracktype == TrackType.Data ? 2048 : 2352, - TrackSubchannelType = TrackSubchannelType.None + TrackBytesPerSector = gdiTrack.Tracktype == TrackType.Data ? 2048 : 2352, + TrackSubchannelType = TrackSubchannelType.None }; track.TrackEndSector = track.TrackStartSector + gdiTrack.Sectors - 1; @@ -936,13 +944,13 @@ namespace DiscImageChef.DiscImages } public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas, - out List<ulong> unknownLbas) + out List<ulong> unknownLbas) { byte[] buffer = ReadSectorsLong(sectorAddress, length); - int bps = (int)(buffer.Length / length); + int bps = (int)(buffer.Length / length); byte[] sector = new byte[bps]; - failingLbas = new List<ulong>(); - unknownLbas = new List<ulong>(); + failingLbas = new List<ulong>(); + unknownLbas = new List<ulong>(); for(int i = 0; i < length; i++) { @@ -966,13 +974,13 @@ namespace DiscImageChef.DiscImages } public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas, - out List<ulong> unknownLbas) + out List<ulong> unknownLbas) { byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); + int bps = (int)(buffer.Length / length); byte[] sector = new byte[bps]; - failingLbas = new List<ulong>(); - unknownLbas = new List<ulong>(); + failingLbas = new List<ulong>(); + unknownLbas = new List<ulong>(); for(int i = 0; i < length; i++) { diff --git a/DiscImageChef.DiscImages/Nero.cs b/DiscImageChef.DiscImages/Nero.cs index 584aa11f..527cb0d8 100644 --- a/DiscImageChef.DiscImages/Nero.cs +++ b/DiscImageChef.DiscImages/Nero.cs @@ -93,56 +93,53 @@ namespace DiscImageChef.DiscImages const uint NERO_RELOCATION = 0x52454C4F; // "END!" - const uint NERO_END = 0x454E4421; - bool imageNewFormat; - List<Partition> imagePartitions; - List<Session> imageSessions; - Stream imageStream; - ImageInfo imageInfo; + const uint NERO_END = 0x454E4421; + bool imageNewFormat; + Stream imageStream; + ImageInfo imageInfo; public ImageInfo Info => imageInfo; - List<Track> imageTracks; - NeroCdText neroCdtxt; - NeroV1Cuesheet neroCuesheetV1; - NeroV2Cuesheet neroCuesheetV2; - NeroV1Dao neroDaov1; - NeroV2Dao neroDaov2; + NeroCdText neroCdtxt; + NeroV1Cuesheet neroCuesheetV1; + NeroV2Cuesheet neroCuesheetV2; + NeroV1Dao neroDaov1; + NeroV2Dao neroDaov2; NeroDiscInformation neroDiscInfo; - IFilter neroFilter; - NeroMediaType neroMediaTyp; - NeroReloChunk neroRelo; - Dictionary<ushort, uint> neroSessions; - NeroV1Tao neroTaov1; - NeroV2Tao neroTaov2; - NeroTocChunk neroToc; + IFilter neroFilter; + NeroMediaType neroMediaTyp; + NeroReloChunk neroRelo; + Dictionary<ushort, uint> neroSessions; + NeroV1Tao neroTaov1; + NeroV2Tao neroTaov2; + NeroTocChunk neroToc; Dictionary<uint, NeroTrack> neroTracks; - Dictionary<uint, ulong> offsetmap; - Dictionary<uint, byte[]> trackIsrCs; - byte[] upc; + Dictionary<uint, ulong> offsetmap; + Dictionary<uint, byte[]> trackIsrCs; + byte[] upc; public string Name => "Nero Burning ROM image"; - public Guid Id => new Guid("D160F9FF-5941-43FC-B037-AD81DD141F05"); + public Guid Id => new Guid("D160F9FF-5941-43FC-B037-AD81DD141F05"); public Nero() { imageNewFormat = false; - imageInfo = new ImageInfo + imageInfo = new ImageInfo { ReadableSectorTags = new List<SectorTagType>(), - ReadableMediaTags = new List<MediaTagType>() + ReadableMediaTags = new List<MediaTagType>() }; neroSessions = new Dictionary<ushort, uint>(); - neroTracks = new Dictionary<uint, NeroTrack>(); - offsetmap = new Dictionary<uint, ulong>(); - imageSessions = new List<Session>(); - imagePartitions = new List<Partition>(); + neroTracks = new Dictionary<uint, NeroTrack>(); + offsetmap = new Dictionary<uint, ulong>(); + Sessions = new List<Session>(); + Partitions = new List<Partition>(); } // Due to .cue format, this method must parse whole file, ignoring errors (those will be thrown by OpenImage()). public bool Identify(IFilter imageFilter) { - imageStream = imageFilter.GetDataForkStream(); + imageStream = imageFilter.GetDataForkStream(); BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; NeroV1Footer footerV1 = new NeroV1Footer(); @@ -151,19 +148,19 @@ namespace DiscImageChef.DiscImages imageStream.Seek(-8, SeekOrigin.End); byte[] buffer = new byte[8]; imageStream.Read(buffer, 0, 8); - footerV1.ChunkId = BigEndianBitConverter.ToUInt32(buffer, 0); + footerV1.ChunkId = BigEndianBitConverter.ToUInt32(buffer, 0); footerV1.FirstChunkOffset = BigEndianBitConverter.ToUInt32(buffer, 4); imageStream.Seek(-12, SeekOrigin.End); buffer = new byte[12]; imageStream.Read(buffer, 0, 12); - footerV2.ChunkId = BigEndianBitConverter.ToUInt32(buffer, 0); + footerV2.ChunkId = BigEndianBitConverter.ToUInt32(buffer, 0); footerV2.FirstChunkOffset = BigEndianBitConverter.ToUInt64(buffer, 4); - DicConsole.DebugWriteLine("Nero plugin", "imageStream.Length = {0}", imageStream.Length); - DicConsole.DebugWriteLine("Nero plugin", "footerV1.ChunkID = 0x{0:X8}", footerV1.ChunkId); + DicConsole.DebugWriteLine("Nero plugin", "imageStream.Length = {0}", imageStream.Length); + DicConsole.DebugWriteLine("Nero plugin", "footerV1.ChunkID = 0x{0:X8}", footerV1.ChunkId); DicConsole.DebugWriteLine("Nero plugin", "footerV1.FirstChunkOffset = {0}", footerV1.FirstChunkOffset); - DicConsole.DebugWriteLine("Nero plugin", "footerV2.ChunkID = 0x{0:X8}", footerV2.ChunkId); + DicConsole.DebugWriteLine("Nero plugin", "footerV2.ChunkID = 0x{0:X8}", footerV2.ChunkId); DicConsole.DebugWriteLine("Nero plugin", "footerV2.FirstChunkOffset = {0}", footerV2.FirstChunkOffset); if(footerV2.ChunkId == NERO_FOOTER_V2 && footerV2.FirstChunkOffset < (ulong)imageStream.Length) return true; @@ -175,7 +172,7 @@ namespace DiscImageChef.DiscImages { try { - imageStream = imageFilter.GetDataForkStream(); + imageStream = imageFilter.GetDataForkStream(); BigEndianBitConverter.IsLittleEndian = BitConverter.IsLittleEndian; NeroV1Footer footerV1 = new NeroV1Footer(); @@ -184,13 +181,13 @@ namespace DiscImageChef.DiscImages imageStream.Seek(-8, SeekOrigin.End); byte[] buffer = new byte[8]; imageStream.Read(buffer, 0, 8); - footerV1.ChunkId = BigEndianBitConverter.ToUInt32(buffer, 0); + footerV1.ChunkId = BigEndianBitConverter.ToUInt32(buffer, 0); footerV1.FirstChunkOffset = BigEndianBitConverter.ToUInt32(buffer, 4); imageStream.Seek(-12, SeekOrigin.End); buffer = new byte[12]; imageStream.Read(buffer, 0, 12); - footerV2.ChunkId = BigEndianBitConverter.ToUInt32(buffer, 0); + footerV2.ChunkId = BigEndianBitConverter.ToUInt32(buffer, 0); footerV2.FirstChunkOffset = BigEndianBitConverter.ToUInt64(buffer, 4); DicConsole.DebugWriteLine("Nero plugin", "imageStream.Length = {0}", imageStream.Length); @@ -212,27 +209,27 @@ namespace DiscImageChef.DiscImages } if(imageNewFormat) imageStream.Seek((long)footerV2.FirstChunkOffset, SeekOrigin.Begin); - else imageStream.Seek(footerV1.FirstChunkOffset, SeekOrigin.Begin); + else imageStream.Seek(footerV1.FirstChunkOffset, SeekOrigin.Begin); - bool parsing = true; + bool parsing = true; ushort currentsession = 1; - uint currenttrack = 1; + uint currenttrack = 1; - imageTracks = new List<Track>(); + Tracks = new List<Track>(); trackIsrCs = new Dictionary<uint, byte[]>(); - imageInfo.MediaType = MediaType.CD; - imageInfo.Sectors = 0; + imageInfo.MediaType = MediaType.CD; + imageInfo.Sectors = 0; imageInfo.SectorSize = 0; while(parsing) { byte[] chunkHeaderBuffer = new byte[8]; - uint chunkId; - uint chunkLength; + uint chunkId; + uint chunkLength; imageStream.Read(chunkHeaderBuffer, 0, 8); - chunkId = BigEndianBitConverter.ToUInt32(chunkHeaderBuffer, 0); + chunkId = BigEndianBitConverter.ToUInt32(chunkHeaderBuffer, 0); chunkLength = BigEndianBitConverter.ToUInt32(chunkHeaderBuffer, 4); DicConsole.DebugWriteLine("Nero plugin", "ChunkID = 0x{0:X8} (\"{1}\")", chunkId, @@ -248,9 +245,9 @@ namespace DiscImageChef.DiscImages neroCuesheetV1 = new NeroV1Cuesheet { - ChunkId = chunkId, + ChunkId = chunkId, ChunkSize = chunkLength, - Entries = new List<NeroV1CueEntry>() + Entries = new List<NeroV1CueEntry>() }; byte[] tmpbuffer = new byte[8]; @@ -258,21 +255,22 @@ namespace DiscImageChef.DiscImages { NeroV1CueEntry entry = new NeroV1CueEntry(); imageStream.Read(tmpbuffer, 0, 8); - entry.Mode = tmpbuffer[0]; + entry.Mode = tmpbuffer[0]; entry.TrackNumber = tmpbuffer[1]; entry.IndexNumber = tmpbuffer[2]; - entry.Dummy = BigEndianBitConverter.ToUInt16(tmpbuffer, 3); - entry.Minute = tmpbuffer[5]; - entry.Second = tmpbuffer[6]; - entry.Frame = tmpbuffer[7]; + entry.Dummy = BigEndianBitConverter.ToUInt16(tmpbuffer, 3); + entry.Minute = tmpbuffer[5]; + entry.Second = tmpbuffer[6]; + entry.Frame = tmpbuffer[7]; - DicConsole.DebugWriteLine("Nero plugin", "Cuesheet entry {0}", i / 8 + 1); + DicConsole.DebugWriteLine("Nero plugin", "Cuesheet entry {0}", i / 8 + 1); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Mode = {1:X2}", i / 8 + 1, entry.Mode); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].TrackNumber = {1:X2}", i / 8 + 1, entry.TrackNumber); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].IndexNumber = {1:X2}", - i / 8 + 1, entry.IndexNumber); + i / 8 + 1, + entry.IndexNumber); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Dummy = {1:X4}", i / 8 + 1, entry.Dummy); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Minute = {1:X2}", i / 8 + 1, @@ -294,9 +292,9 @@ namespace DiscImageChef.DiscImages neroCuesheetV2 = new NeroV2Cuesheet { - ChunkId = chunkId, + ChunkId = chunkId, ChunkSize = chunkLength, - Entries = new List<NeroV2CueEntry>() + Entries = new List<NeroV2CueEntry>() }; byte[] tmpbuffer = new byte[8]; @@ -304,19 +302,20 @@ namespace DiscImageChef.DiscImages { NeroV2CueEntry entry = new NeroV2CueEntry(); imageStream.Read(tmpbuffer, 0, 8); - entry.Mode = tmpbuffer[0]; + entry.Mode = tmpbuffer[0]; entry.TrackNumber = tmpbuffer[1]; entry.IndexNumber = tmpbuffer[2]; - entry.Dummy = tmpbuffer[3]; - entry.LbaStart = BigEndianBitConverter.ToInt32(tmpbuffer, 4); + entry.Dummy = tmpbuffer[3]; + entry.LbaStart = BigEndianBitConverter.ToInt32(tmpbuffer, 4); - DicConsole.DebugWriteLine("Nero plugin", "Cuesheet entry {0}", i / 8 + 1); + DicConsole.DebugWriteLine("Nero plugin", "Cuesheet entry {0}", i / 8 + 1); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Mode = 0x{1:X2}", i / 8 + 1, entry.Mode); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].TrackNumber = {1:X2}", i / 8 + 1, entry.TrackNumber); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].IndexNumber = {1:X2}", - i / 8 + 1, entry.IndexNumber); + i / 8 + 1, + entry.IndexNumber); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Dummy = {1:X2}", i / 8 + 1, entry.Dummy); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].LBAStart = {1}", i / 8 + 1, @@ -337,12 +336,12 @@ namespace DiscImageChef.DiscImages byte[] tmpbuffer = new byte[22]; imageStream.Read(tmpbuffer, 0, 22); neroDaov1.ChunkSizeLe = BigEndianBitConverter.ToUInt32(tmpbuffer, 0); - neroDaov1.Upc = new byte[14]; + neroDaov1.Upc = new byte[14]; Array.Copy(tmpbuffer, 4, neroDaov1.Upc, 0, 14); - neroDaov1.TocType = BigEndianBitConverter.ToUInt16(tmpbuffer, 18); + neroDaov1.TocType = BigEndianBitConverter.ToUInt16(tmpbuffer, 18); neroDaov1.FirstTrack = tmpbuffer[20]; - neroDaov1.LastTrack = tmpbuffer[21]; - neroDaov1.Tracks = new List<NeroV1DaoEntry>(); + neroDaov1.LastTrack = tmpbuffer[21]; + neroDaov1.Tracks = new List<NeroV1DaoEntry>(); if(!imageInfo.ReadableMediaTags.Contains(MediaTagType.CD_MCN)) imageInfo.ReadableMediaTags.Add(MediaTagType.CD_MCN); @@ -369,13 +368,13 @@ namespace DiscImageChef.DiscImages entry.Isrc = new byte[12]; Array.Copy(tmpbuffer, 4, entry.Isrc, 0, 12); entry.SectorSize = BigEndianBitConverter.ToUInt16(tmpbuffer, 12); - entry.Mode = BitConverter.ToUInt16(tmpbuffer, 14); - entry.Unknown = BigEndianBitConverter.ToUInt16(tmpbuffer, 16); - entry.Index0 = BigEndianBitConverter.ToUInt32(tmpbuffer, 18); - entry.Index1 = BigEndianBitConverter.ToUInt32(tmpbuffer, 22); + entry.Mode = BitConverter.ToUInt16(tmpbuffer, 14); + entry.Unknown = BigEndianBitConverter.ToUInt16(tmpbuffer, 16); + entry.Index0 = BigEndianBitConverter.ToUInt32(tmpbuffer, 18); + entry.Index1 = BigEndianBitConverter.ToUInt32(tmpbuffer, 22); entry.EndOfTrack = BigEndianBitConverter.ToUInt32(tmpbuffer, 26); - DicConsole.DebugWriteLine("Nero plugin", "Disc-At-Once entry {0}", i / 32 + 1); + DicConsole.DebugWriteLine("Nero plugin", "Disc-At-Once entry {0}", i / 32 + 1); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].ISRC = \"{1}\"", i / 32 + 1, StringHandlers.CToString(entry.Isrc)); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].SectorSize = {1}", i / 32 + 1, @@ -383,7 +382,8 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Mode = {1} (0x{2:X4})", i / 32 + 1, (DaoMode)entry.Mode, entry.Mode); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Unknown = 0x{1:X4}", - i / 32 + 1, entry.Unknown); + i / 32 + 1, + entry.Unknown); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Index0 = {1}", i / 32 + 1, entry.Index0); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Index1 = {1}", i / 32 + 1, @@ -401,15 +401,15 @@ namespace DiscImageChef.DiscImages NeroTrack neroTrack = new NeroTrack { EndOfTrack = entry.EndOfTrack, - Isrc = entry.Isrc, - Length = entry.EndOfTrack - entry.Index0, - Mode = entry.Mode, - Offset = entry.Index0, + Isrc = entry.Isrc, + Length = entry.EndOfTrack - entry.Index0, + Mode = entry.Mode, + Offset = entry.Index0, SectorSize = entry.SectorSize, - StartLba = imageInfo.Sectors, - Index0 = entry.Index0, - Index1 = entry.Index1, - Sequence = currenttrack + StartLba = imageInfo.Sectors, + Index0 = entry.Index0, + Index1 = entry.Index1, + Sequence = currenttrack }; neroTrack.Sectors = neroTrack.Length / entry.SectorSize; neroTracks.Add(currenttrack, neroTrack); @@ -431,12 +431,12 @@ namespace DiscImageChef.DiscImages byte[] tmpbuffer = new byte[22]; imageStream.Read(tmpbuffer, 0, 22); neroDaov2.ChunkSizeLe = BigEndianBitConverter.ToUInt32(tmpbuffer, 0); - neroDaov2.Upc = new byte[14]; + neroDaov2.Upc = new byte[14]; Array.Copy(tmpbuffer, 4, neroDaov2.Upc, 0, 14); - neroDaov2.TocType = BigEndianBitConverter.ToUInt16(tmpbuffer, 18); + neroDaov2.TocType = BigEndianBitConverter.ToUInt16(tmpbuffer, 18); neroDaov2.FirstTrack = tmpbuffer[20]; - neroDaov2.LastTrack = tmpbuffer[21]; - neroDaov2.Tracks = new List<NeroV2DaoEntry>(); + neroDaov2.LastTrack = tmpbuffer[21]; + neroDaov2.Tracks = new List<NeroV2DaoEntry>(); if(!imageInfo.ReadableMediaTags.Contains(MediaTagType.CD_MCN)) imageInfo.ReadableMediaTags.Add(MediaTagType.CD_MCN); @@ -463,19 +463,20 @@ namespace DiscImageChef.DiscImages entry.Isrc = new byte[12]; Array.Copy(tmpbuffer, 4, entry.Isrc, 0, 12); entry.SectorSize = BigEndianBitConverter.ToUInt16(tmpbuffer, 12); - entry.Mode = BitConverter.ToUInt16(tmpbuffer, 14); - entry.Unknown = BigEndianBitConverter.ToUInt16(tmpbuffer, 16); - entry.Index0 = BigEndianBitConverter.ToUInt64(tmpbuffer, 18); - entry.Index1 = BigEndianBitConverter.ToUInt64(tmpbuffer, 26); + entry.Mode = BitConverter.ToUInt16(tmpbuffer, 14); + entry.Unknown = BigEndianBitConverter.ToUInt16(tmpbuffer, 16); + entry.Index0 = BigEndianBitConverter.ToUInt64(tmpbuffer, 18); + entry.Index1 = BigEndianBitConverter.ToUInt64(tmpbuffer, 26); entry.EndOfTrack = BigEndianBitConverter.ToUInt64(tmpbuffer, 34); - DicConsole.DebugWriteLine("Nero plugin", "Disc-At-Once entry {0}", i / 32 + 1); + DicConsole.DebugWriteLine("Nero plugin", "Disc-At-Once entry {0}", i / 32 + 1); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].ISRC = \"{1}\"", i / 32 + 1, StringHandlers.CToString(entry.Isrc)); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].SectorSize = {1}", i / 32 + 1, entry.SectorSize); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Mode = {1} (0x{2:X4})", - i / 32 + 1, (DaoMode)entry.Mode, entry.Mode); + i / 32 + 1, + (DaoMode)entry.Mode, entry.Mode); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Unknown = {1:X2}", i / 32 + 1, entry.Unknown); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Index0 = {1}", i / 32 + 1, @@ -496,15 +497,15 @@ namespace DiscImageChef.DiscImages NeroTrack neroTrack = new NeroTrack { EndOfTrack = entry.EndOfTrack, - Isrc = entry.Isrc, - Length = entry.EndOfTrack - entry.Index0, - Mode = entry.Mode, - Offset = entry.Index0, + Isrc = entry.Isrc, + Length = entry.EndOfTrack - entry.Index0, + Mode = entry.Mode, + Offset = entry.Index0, SectorSize = entry.SectorSize, - StartLba = imageInfo.Sectors, - Index0 = entry.Index0, - Index1 = entry.Index1, - Sequence = currenttrack + StartLba = imageInfo.Sectors, + Index0 = entry.Index0, + Index1 = entry.Index1, + Sequence = currenttrack }; neroTrack.Sectors = neroTrack.Length / entry.SectorSize; neroTracks.Add(currenttrack, neroTrack); @@ -523,9 +524,9 @@ namespace DiscImageChef.DiscImages neroCdtxt = new NeroCdText { - ChunkId = chunkId, + ChunkId = chunkId, ChunkSize = chunkLength, - Packs = new List<NeroCdTextPack>() + Packs = new List<NeroCdTextPack>() }; byte[] tmpbuffer = new byte[18]; @@ -534,11 +535,11 @@ namespace DiscImageChef.DiscImages NeroCdTextPack entry = new NeroCdTextPack(); imageStream.Read(tmpbuffer, 0, 18); - entry.PackType = tmpbuffer[0]; + entry.PackType = tmpbuffer[0]; entry.TrackNumber = tmpbuffer[1]; - entry.PackNumber = tmpbuffer[2]; + entry.PackNumber = tmpbuffer[2]; entry.BlockNumber = tmpbuffer[3]; - entry.Text = new byte[12]; + entry.Text = new byte[12]; Array.Copy(tmpbuffer, 4, entry.Text, 0, 12); entry.Crc = BigEndianBitConverter.ToUInt16(tmpbuffer, 16); @@ -550,7 +551,8 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].PackNumber = 0x{1:X2}", i / 18 + 1, entry.PackNumber); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].BlockNumber = 0x{1:X2}", - i / 18 + 1, entry.BlockNumber); + i / 18 + 1, + entry.BlockNumber); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Text = \"{1}\"", i / 18 + 1, StringHandlers.CToString(entry.Text)); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].CRC = 0x{1:X4}", i / 18 + 1, @@ -568,9 +570,9 @@ namespace DiscImageChef.DiscImages neroTaov1 = new NeroV1Tao { - ChunkId = chunkId, + ChunkId = chunkId, ChunkSize = chunkLength, - Tracks = new List<NeroV1TaoEntry>() + Tracks = new List<NeroV1TaoEntry>() }; byte[] tmpbuffer = new byte[20]; @@ -579,19 +581,20 @@ namespace DiscImageChef.DiscImages NeroV1TaoEntry entry = new NeroV1TaoEntry(); imageStream.Read(tmpbuffer, 0, 20); - entry.Offset = BigEndianBitConverter.ToUInt32(tmpbuffer, 0); - entry.Length = BigEndianBitConverter.ToUInt32(tmpbuffer, 4); - entry.Mode = BigEndianBitConverter.ToUInt32(tmpbuffer, 8); + entry.Offset = BigEndianBitConverter.ToUInt32(tmpbuffer, 0); + entry.Length = BigEndianBitConverter.ToUInt32(tmpbuffer, 4); + entry.Mode = BigEndianBitConverter.ToUInt32(tmpbuffer, 8); entry.StartLba = BigEndianBitConverter.ToUInt32(tmpbuffer, 12); - entry.Unknown = BigEndianBitConverter.ToUInt32(tmpbuffer, 16); + entry.Unknown = BigEndianBitConverter.ToUInt32(tmpbuffer, 16); - DicConsole.DebugWriteLine("Nero plugin", "Track-at-Once entry {0}", i / 20 + 1); + DicConsole.DebugWriteLine("Nero plugin", "Track-at-Once entry {0}", i / 20 + 1); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Offset = {1}", i / 20 + 1, entry.Offset); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Length = {1} bytes", i / 20 + 1, entry.Length); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Mode = {1} (0x{2:X4})", - i / 20 + 1, (DaoMode)entry.Mode, entry.Mode); + i / 20 + 1, + (DaoMode)entry.Mode, entry.Mode); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].StartLBA = {1}", i / 20 + 1, entry.StartLba); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Unknown = 0x{1:X4}", @@ -605,15 +608,15 @@ namespace DiscImageChef.DiscImages NeroTrack neroTrack = new NeroTrack { EndOfTrack = entry.Offset + entry.Length, - Isrc = new byte[12], - Length = entry.Length, - Mode = entry.Mode, - Offset = entry.Offset, + Isrc = new byte[12], + Length = entry.Length, + Mode = entry.Mode, + Offset = entry.Offset, SectorSize = NeroTrackModeToBytesPerSector((DaoMode)entry.Mode), - StartLba = imageInfo.Sectors, - Index0 = entry.Offset, - Index1 = entry.Offset, - Sequence = currenttrack + StartLba = imageInfo.Sectors, + Index0 = entry.Offset, + Index1 = entry.Offset, + Sequence = currenttrack }; neroTrack.Sectors = neroTrack.Length / NeroTrackModeToBytesPerSector((DaoMode)entry.Mode); @@ -633,9 +636,9 @@ namespace DiscImageChef.DiscImages neroTaov2 = new NeroV2Tao { - ChunkId = chunkId, + ChunkId = chunkId, ChunkSize = chunkLength, - Tracks = new List<NeroV2TaoEntry>() + Tracks = new List<NeroV2TaoEntry>() }; byte[] tmpbuffer = new byte[32]; @@ -644,24 +647,26 @@ namespace DiscImageChef.DiscImages NeroV2TaoEntry entry = new NeroV2TaoEntry(); imageStream.Read(tmpbuffer, 0, 32); - entry.Offset = BigEndianBitConverter.ToUInt64(tmpbuffer, 0); - entry.Length = BigEndianBitConverter.ToUInt64(tmpbuffer, 8); - entry.Mode = BigEndianBitConverter.ToUInt32(tmpbuffer, 16); + entry.Offset = BigEndianBitConverter.ToUInt64(tmpbuffer, 0); + entry.Length = BigEndianBitConverter.ToUInt64(tmpbuffer, 8); + entry.Mode = BigEndianBitConverter.ToUInt32(tmpbuffer, 16); entry.StartLba = BigEndianBitConverter.ToUInt32(tmpbuffer, 20); - entry.Unknown = BigEndianBitConverter.ToUInt32(tmpbuffer, 24); - entry.Sectors = BigEndianBitConverter.ToUInt32(tmpbuffer, 28); + entry.Unknown = BigEndianBitConverter.ToUInt32(tmpbuffer, 24); + entry.Sectors = BigEndianBitConverter.ToUInt32(tmpbuffer, 28); - DicConsole.DebugWriteLine("Nero plugin", "Track-at-Once entry {0}", i / 32 + 1); + DicConsole.DebugWriteLine("Nero plugin", "Track-at-Once entry {0}", i / 32 + 1); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Offset = {1}", i / 32 + 1, entry.Offset); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Length = {1} bytes", i / 32 + 1, entry.Length); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Mode = {1} (0x{2:X4})", - i / 32 + 1, (DaoMode)entry.Mode, entry.Mode); + i / 32 + 1, + (DaoMode)entry.Mode, entry.Mode); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].StartLBA = {1}", i / 32 + 1, entry.StartLba); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Unknown = 0x{1:X4}", - i / 32 + 1, entry.Unknown); + i / 32 + 1, + entry.Unknown); DicConsole.DebugWriteLine("Nero plugin", "\t _entry[{0}].Sectors = {1}", i / 32 + 1, entry.Sectors); @@ -673,18 +678,18 @@ namespace DiscImageChef.DiscImages NeroTrack neroTrack = new NeroTrack { EndOfTrack = entry.Offset + entry.Length, - Isrc = new byte[12], - Length = entry.Length, - Mode = entry.Mode, - Offset = entry.Offset + Isrc = new byte[12], + Length = entry.Length, + Mode = entry.Mode, + Offset = entry.Offset }; neroTrack.Sectors = neroTrack.Length / NeroTrackModeToBytesPerSector((DaoMode)entry.Mode); neroTrack.SectorSize = NeroTrackModeToBytesPerSector((DaoMode)entry.Mode); - neroTrack.StartLba = imageInfo.Sectors; - neroTrack.Index0 = entry.Offset; - neroTrack.Index1 = entry.Offset; - neroTrack.Sequence = currenttrack; + neroTrack.StartLba = imageInfo.Sectors; + neroTrack.Index0 = entry.Offset; + neroTrack.Index1 = entry.Offset; + neroTrack.Sequence = currenttrack; neroTracks.Add(currenttrack, neroTrack); imageInfo.Sectors += neroTrack.Sectors; @@ -699,7 +704,7 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("Nero plugin", "Found \"SINF\" chunk, parsing {0} bytes", chunkLength); - uint sessionTracks; + uint sessionTracks; byte[] tmpbuffer = new byte[4]; imageStream.Read(tmpbuffer, 0, 4); sessionTracks = BigEndianBitConverter.ToUInt32(tmpbuffer, 0); @@ -734,7 +739,7 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("Nero plugin", "Found \"DINF\" chunk, parsing {0} bytes", chunkLength); - neroDiscInfo = new NeroDiscInformation {ChunkId = chunkId, ChunkSize = chunkLength}; + neroDiscInfo = new NeroDiscInformation {ChunkId = chunkId, ChunkSize = chunkLength}; byte[] tmpbuffer = new byte[4]; imageStream.Read(tmpbuffer, 0, 4); neroDiscInfo.Unknown = BigEndianBitConverter.ToUInt32(tmpbuffer, 0); @@ -749,7 +754,7 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("Nero plugin", "Found \"RELO\" chunk, parsing {0} bytes", chunkLength); - neroRelo = new NeroReloChunk {ChunkId = chunkId, ChunkSize = chunkLength}; + neroRelo = new NeroReloChunk {ChunkId = chunkId, ChunkSize = chunkLength}; byte[] tmpbuffer = new byte[4]; imageStream.Read(tmpbuffer, 0, 4); neroRelo.Unknown = BigEndianBitConverter.ToUInt32(tmpbuffer, 0); @@ -764,7 +769,7 @@ namespace DiscImageChef.DiscImages DicConsole.DebugWriteLine("Nero plugin", "Found \"TOCT\" chunk, parsing {0} bytes", chunkLength); - neroToc = new NeroTocChunk {ChunkId = chunkId, ChunkSize = chunkLength}; + neroToc = new NeroTocChunk {ChunkId = chunkId, ChunkSize = chunkLength}; byte[] tmpbuffer = new byte[2]; imageStream.Read(tmpbuffer, 0, 2); neroToc.Unknown = BigEndianBitConverter.ToUInt16(tmpbuffer, 0); @@ -784,43 +789,43 @@ namespace DiscImageChef.DiscImages { DicConsole.DebugWriteLine("Nero plugin", "Unknown chunk ID \"{0}\", skipping...", Encoding.ASCII.GetString(BigEndianBitConverter - .GetBytes(chunkId))); + .GetBytes(chunkId))); imageStream.Seek(chunkLength, SeekOrigin.Current); break; } } } - imageInfo.HasPartitions = true; - imageInfo.HasSessions = true; - imageInfo.Creator = null; - imageInfo.CreationTime = imageFilter.GetCreationTime(); - imageInfo.LastModificationTime = imageFilter.GetLastWriteTime(); - imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename()); - imageInfo.Comments = null; - imageInfo.MediaManufacturer = null; - imageInfo.MediaModel = null; - imageInfo.MediaSerialNumber = null; - imageInfo.MediaBarcode = null; - imageInfo.MediaPartNumber = null; - imageInfo.DriveManufacturer = null; - imageInfo.DriveModel = null; - imageInfo.DriveSerialNumber = null; + imageInfo.HasPartitions = true; + imageInfo.HasSessions = true; + imageInfo.Creator = null; + imageInfo.CreationTime = imageFilter.GetCreationTime(); + imageInfo.LastModificationTime = imageFilter.GetLastWriteTime(); + imageInfo.MediaTitle = Path.GetFileNameWithoutExtension(imageFilter.GetFilename()); + imageInfo.Comments = null; + imageInfo.MediaManufacturer = null; + imageInfo.MediaModel = null; + imageInfo.MediaSerialNumber = null; + imageInfo.MediaBarcode = null; + imageInfo.MediaPartNumber = null; + imageInfo.DriveManufacturer = null; + imageInfo.DriveModel = null; + imageInfo.DriveSerialNumber = null; imageInfo.DriveFirmwareRevision = null; - imageInfo.MediaSequence = 0; - imageInfo.LastMediaSequence = 0; + imageInfo.MediaSequence = 0; + imageInfo.LastMediaSequence = 0; if(imageNewFormat) { - imageInfo.ImageSize = footerV2.FirstChunkOffset; - imageInfo.Version = "Nero Burning ROM >= 5.5"; - imageInfo.Application = "Nero Burning ROM"; + imageInfo.ImageSize = footerV2.FirstChunkOffset; + imageInfo.Version = "Nero Burning ROM >= 5.5"; + imageInfo.Application = "Nero Burning ROM"; imageInfo.ApplicationVersion = ">= 5.5"; } else { - imageInfo.ImageSize = footerV1.FirstChunkOffset; - imageInfo.Version = "Nero Burning ROM <= 5.0"; - imageInfo.Application = "Nero Burning ROM"; + imageInfo.ImageSize = footerV1.FirstChunkOffset; + imageInfo.Version = "Nero Burning ROM <= 5.0"; + imageInfo.Application = "Nero Burning ROM"; imageInfo.ApplicationVersion = "<= 5.0"; } @@ -830,93 +835,94 @@ namespace DiscImageChef.DiscImages currentsession = 1; neroSessions.TryGetValue(1, out uint currentsessionmaxtrack); - uint currentsessioncurrenttrack = 1; - Session currentsessionstruct = new Session(); - ulong partitionSequence = 0; - ulong partitionStartByte = 0; + uint currentsessioncurrenttrack = 1; + Session currentsessionstruct = new Session(); + ulong partitionSequence = 0; + ulong partitionStartByte = 0; for(uint i = 1; i <= neroTracks.Count; i++) { if(!neroTracks.TryGetValue(i, out NeroTrack neroTrack)) continue; - DicConsole.DebugWriteLine("Nero plugin", "\tcurrentsession = {0}", currentsession); + DicConsole.DebugWriteLine("Nero plugin", "\tcurrentsession = {0}", currentsession); DicConsole.DebugWriteLine("Nero plugin", "\tcurrentsessionmaxtrack = {0}", currentsessionmaxtrack); DicConsole.DebugWriteLine("Nero plugin", "\tcurrentsessioncurrenttrack = {0}", currentsessioncurrenttrack); - Track track = new Track(); + Track track = new Track(); if(neroTrack.Sequence == 1) neroTrack.Index0 = neroTrack.Index1; track.Indexes = new Dictionary<int, ulong>(); if(neroTrack.Index0 < neroTrack.Index1) track.Indexes.Add(0, neroTrack.Index0 / neroTrack.SectorSize); - track.Indexes.Add(1, neroTrack.Index1 / neroTrack.SectorSize); + track.Indexes.Add(1, neroTrack.Index1 / neroTrack.SectorSize); track.TrackDescription = StringHandlers.CToString(neroTrack.Isrc); - track.TrackEndSector = neroTrack.Length / neroTrack.SectorSize + neroTrack.StartLba - 1; - track.TrackPregap = (neroTrack.Index1 - neroTrack.Index0) / neroTrack.SectorSize; - track.TrackSequence = neroTrack.Sequence; - track.TrackSession = currentsession; - track.TrackStartSector = neroTrack.StartLba; - track.TrackType = NeroTrackModeToTrackType((DaoMode)neroTrack.Mode); - track.TrackFile = imageFilter.GetFilename(); - track.TrackFilter = imageFilter; - track.TrackFileOffset = neroTrack.Offset; - track.TrackFileType = "BINARY"; + track.TrackEndSector = neroTrack.Length / neroTrack.SectorSize + neroTrack.StartLba - 1; + track.TrackPregap = (neroTrack.Index1 - neroTrack.Index0) / + neroTrack.SectorSize; + track.TrackSequence = neroTrack.Sequence; + track.TrackSession = currentsession; + track.TrackStartSector = neroTrack.StartLba; + track.TrackType = NeroTrackModeToTrackType((DaoMode)neroTrack.Mode); + track.TrackFile = imageFilter.GetFilename(); + track.TrackFilter = imageFilter; + track.TrackFileOffset = neroTrack.Offset; + track.TrackFileType = "BINARY"; track.TrackSubchannelType = TrackSubchannelType.None; switch((DaoMode)neroTrack.Mode) { case DaoMode.Audio: - track.TrackBytesPerSector = 2352; + track.TrackBytesPerSector = 2352; track.TrackRawBytesPerSector = 2352; break; case DaoMode.AudioSub: - track.TrackBytesPerSector = 2352; + track.TrackBytesPerSector = 2352; track.TrackRawBytesPerSector = 2448; - track.TrackSubchannelType = TrackSubchannelType.RawInterleaved; + track.TrackSubchannelType = TrackSubchannelType.RawInterleaved; break; case DaoMode.Data: case DaoMode.DataM2F1: - track.TrackBytesPerSector = 2048; + track.TrackBytesPerSector = 2048; track.TrackRawBytesPerSector = 2048; break; case DaoMode.DataM2F2: - track.TrackBytesPerSector = 2336; + track.TrackBytesPerSector = 2336; track.TrackRawBytesPerSector = 2336; break; case DaoMode.DataM2Raw: - track.TrackBytesPerSector = 2352; + track.TrackBytesPerSector = 2352; track.TrackRawBytesPerSector = 2352; break; case DaoMode.DataM2RawSub: - track.TrackBytesPerSector = 2352; + track.TrackBytesPerSector = 2352; track.TrackRawBytesPerSector = 2448; - track.TrackSubchannelType = TrackSubchannelType.RawInterleaved; + track.TrackSubchannelType = TrackSubchannelType.RawInterleaved; break; case DaoMode.DataRaw: - track.TrackBytesPerSector = 2048; + track.TrackBytesPerSector = 2048; track.TrackRawBytesPerSector = 2352; break; case DaoMode.DataRawSub: - track.TrackBytesPerSector = 2048; + track.TrackBytesPerSector = 2048; track.TrackRawBytesPerSector = 2448; - track.TrackSubchannelType = TrackSubchannelType.RawInterleaved; + track.TrackSubchannelType = TrackSubchannelType.RawInterleaved; break; } if(track.TrackSubchannelType == TrackSubchannelType.RawInterleaved) { track.TrackSubchannelFilter = imageFilter; - track.TrackSubchannelFile = imageFilter.GetFilename(); + track.TrackSubchannelFile = imageFilter.GetFilename(); track.TrackSubchannelOffset = neroTrack.Offset; } - imageTracks.Add(track); + Tracks.Add(track); DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackDescription = {0}", track.TrackDescription); DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackEndSector = {0}", track.TrackEndSector); - DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackPregap = {0}", track.TrackPregap); - DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackSequence = {0}", track.TrackSequence); - DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackSession = {0}", track.TrackSession); + DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackPregap = {0}", track.TrackPregap); + DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackSequence = {0}", track.TrackSequence); + DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackSession = {0}", track.TrackSession); DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackStartSector = {0}", track.TrackStartSector); DicConsole.DebugWriteLine("Nero plugin", "\t\t _track.TrackType = {0}", track.TrackType); @@ -925,27 +931,27 @@ namespace DiscImageChef.DiscImages currentsessionstruct = new Session { SessionSequence = currentsession, - StartSector = track.TrackStartSector, - StartTrack = track.TrackSequence + StartSector = track.TrackStartSector, + StartTrack = track.TrackSequence }; currentsessioncurrenttrack++; if(currentsessioncurrenttrack > currentsessionmaxtrack) { currentsession++; neroSessions.TryGetValue(currentsession, out currentsessionmaxtrack); - currentsessioncurrenttrack = 1; - currentsessionstruct.EndTrack = track.TrackSequence; + currentsessioncurrenttrack = 1; + currentsessionstruct.EndTrack = track.TrackSequence; currentsessionstruct.EndSector = track.TrackEndSector; - imageSessions.Add(currentsessionstruct); + Sessions.Add(currentsessionstruct); } if(i == neroTracks.Count) { neroSessions.TryGetValue(currentsession, out currentsessionmaxtrack); - currentsessioncurrenttrack = 1; - currentsessionstruct.EndTrack = track.TrackSequence; + currentsessioncurrenttrack = 1; + currentsessionstruct.EndTrack = track.TrackSequence; currentsessionstruct.EndSector = track.TrackEndSector; - imageSessions.Add(currentsessionstruct); + Sessions.Add(currentsessionstruct); } offsetmap.Add(track.TrackSequence, track.TrackStartSector); @@ -970,15 +976,15 @@ namespace DiscImageChef.DiscImages Partition partition = new Partition { Description = $"Track {track.TrackSequence} Index 1", - Size = neroTrack.EndOfTrack - neroTrack.Index1, - Name = StringHandlers.CToString(neroTrack.Isrc), - Sequence = partitionSequence, - Offset = partitionStartByte, - Start = neroTrack.StartLba + (neroTrack.Index1 - neroTrack.Index0) / neroTrack.SectorSize, - Type = NeroTrackModeToTrackType((DaoMode)neroTrack.Mode).ToString() + Size = neroTrack.EndOfTrack - neroTrack.Index1, + Name = StringHandlers.CToString(neroTrack.Isrc), + Sequence = partitionSequence, + Offset = partitionStartByte, + Start = neroTrack.StartLba + (neroTrack.Index1 - neroTrack.Index0) / neroTrack.SectorSize, + Type = NeroTrackModeToTrackType((DaoMode)neroTrack.Mode).ToString() }; partition.Length = partition.Size / neroTrack.SectorSize; - imagePartitions.Add(partition); + Partitions.Add(partition); partitionSequence++; partitionStartByte += partition.Size; } @@ -987,29 +993,33 @@ namespace DiscImageChef.DiscImages if(imageInfo.MediaType == MediaType.Unknown || imageInfo.MediaType == MediaType.CD) { - bool data = false; - bool mode2 = false; + bool data = false; + bool mode2 = false; bool firstaudio = false; - bool firstdata = false; - bool audio = false; + bool firstdata = false; + bool audio = false; for(int i = 0; i < neroTracks.Count; i++) { // First track is audio - firstaudio |= i == 0 && ((DaoMode)neroTracks.ElementAt(i).Value.Mode == DaoMode.Audio || - (DaoMode)neroTracks.ElementAt(i).Value.Mode == DaoMode.AudioSub); + firstaudio |= i == 0 && + ((DaoMode)neroTracks.ElementAt(i).Value.Mode == DaoMode.Audio || + (DaoMode)neroTracks.ElementAt(i).Value.Mode == DaoMode.AudioSub); // First track is data - firstdata |= i == 0 && (DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio && + firstdata |= i == 0 && + (DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio && (DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.AudioSub; // Any non first track is data - data |= i != 0 && (DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio && + data |= i != 0 && + (DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.Audio && (DaoMode)neroTracks.ElementAt(i).Value.Mode != DaoMode.AudioSub; // Any non first track is audio - audio |= i != 0 && ((DaoMode)neroTracks.ElementAt(i).Value.Mode == DaoMode.Audio || - (DaoMode)neroTracks.ElementAt(i).Value.Mode == DaoMode.AudioSub); + audio |= i != 0 && + ((DaoMode)neroTracks.ElementAt(i).Value.Mode == DaoMode.Audio || + (DaoMode)neroTracks.ElementAt(i).Value.Mode == DaoMode.AudioSub); switch((DaoMode)neroTracks.ElementAt(i).Value.Mode) { @@ -1022,12 +1032,15 @@ namespace DiscImageChef.DiscImages } } - if(!data && !firstdata) imageInfo.MediaType = MediaType.CDDA; - else if(firstaudio && data && imageSessions.Count > 1 && mode2) + if(!data && !firstdata) imageInfo.MediaType = MediaType.CDDA; + else if(firstaudio && data && Sessions.Count > 1 && mode2) imageInfo.MediaType = MediaType.CDPLUS; - else if(firstdata && audio || mode2) imageInfo.MediaType = MediaType.CDROMXA; - else if(!audio) imageInfo.MediaType = MediaType.CDROM; - else imageInfo.MediaType = MediaType.CD; + else if(firstdata && audio || mode2) + imageInfo.MediaType = MediaType.CDROMXA; + else if(!audio) + imageInfo.MediaType = MediaType.CDROM; + else + imageInfo.MediaType = MediaType.CD; } imageInfo.XmlMediaType = XmlMediaType.OpticalDisc; @@ -1046,7 +1059,7 @@ namespace DiscImageChef.DiscImages { switch(tag) { - case MediaTagType.CD_MCN: return upc; + case MediaTagType.CD_MCN: return upc; case MediaTagType.CD_TEXT: throw new NotImplementedException("Not yet implemented"); default: throw new FeaturedNotSupportedByDiscImageException("Requested disk tag not supported by image"); @@ -1077,9 +1090,9 @@ namespace DiscImageChef.DiscImages { foreach(KeyValuePair<uint, ulong> kvp in from kvp in offsetmap where sectorAddress >= kvp.Value - from track in imageTracks - where track.TrackSequence == kvp.Key - where sectorAddress - kvp.Value < + from track in Tracks + where track.TrackSequence == kvp.Key + where sectorAddress - kvp.Value < track.TrackEndSector - track.TrackStartSector select kvp) return ReadSectors(sectorAddress - kvp.Value, length, kvp.Key); @@ -1091,9 +1104,9 @@ namespace DiscImageChef.DiscImages { foreach(KeyValuePair<uint, ulong> kvp in from kvp in offsetmap where sectorAddress >= kvp.Value - from track in imageTracks - where track.TrackSequence == kvp.Key - where sectorAddress - kvp.Value < + from track in Tracks + where track.TrackSequence == kvp.Key + where sectorAddress - kvp.Value < track.TrackEndSector - track.TrackStartSector select kvp) return ReadSectorsTag(sectorAddress - kvp.Value, length, kvp.Key, tag); @@ -1120,58 +1133,58 @@ namespace DiscImageChef.DiscImages case DaoMode.DataM2F1: { sectorOffset = 0; - sectorSize = 2048; - sectorSkip = 0; + sectorSize = 2048; + sectorSkip = 0; break; } case DaoMode.DataM2F2: { sectorOffset = 8; - sectorSize = 2324; - sectorSkip = 4; + sectorSize = 2324; + sectorSkip = 4; break; } case DaoMode.Audio: { sectorOffset = 0; - sectorSize = 2352; - sectorSkip = 0; + sectorSize = 2352; + sectorSkip = 0; break; } case DaoMode.DataRaw: { sectorOffset = 16; - sectorSize = 2048; - sectorSkip = 288; + sectorSize = 2048; + sectorSkip = 288; break; } case DaoMode.DataM2Raw: { sectorOffset = 16; - sectorSize = 2336; - sectorSkip = 0; + sectorSize = 2336; + sectorSkip = 0; break; } // TODO: Supposing Nero suffixes the subchannel to the channel case DaoMode.DataRawSub: { sectorOffset = 16; - sectorSize = 2048; - sectorSkip = 288 + 96; + sectorSize = 2048; + sectorSkip = 288 + 96; break; } case DaoMode.DataM2RawSub: { sectorOffset = 16; - sectorSize = 2336; - sectorSkip = 96; + sectorSize = 2336; + sectorSkip = 96; break; } case DaoMode.AudioSub: { sectorOffset = 0; - sectorSize = 2352; - sectorSkip = 96; + sectorSize = 2352; + sectorSkip = 96; break; } default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); @@ -1179,7 +1192,7 @@ namespace DiscImageChef.DiscImages byte[] buffer = new byte[sectorSize * length]; - imageStream = neroFilter.GetDataForkStream(); + imageStream = neroFilter.GetDataForkStream(); BinaryReader br = new BinaryReader(imageStream); br.BaseStream.Seek((long)dicTrack.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)), SeekOrigin.Begin); @@ -1222,10 +1235,10 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdTrackFlags: { byte[] flags = new byte[1]; - flags[0] = 0x00; + flags[0] = 0x00; if((DaoMode)dicTrack.Mode != DaoMode.Audio && (DaoMode)dicTrack.Mode != DaoMode.AudioSub) - flags[0] += 0x40; + flags[0] += 0x4; return flags; } @@ -1253,15 +1266,15 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorSubHeader: { sectorOffset = 0; - sectorSize = 8; - sectorSkip = 2328; + sectorSize = 8; + sectorSkip = 2328; break; } case SectorTagType.CdSectorEdc: { sectorOffset = 2332; - sectorSize = 4; - sectorSkip = 0; + sectorSize = 4; + sectorSkip = 0; break; } default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); @@ -1277,15 +1290,15 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorSync: { sectorOffset = 0; - sectorSize = 12; - sectorSkip = 2340; + sectorSize = 12; + sectorSkip = 2340; break; } case SectorTagType.CdSectorHeader: { sectorOffset = 12; - sectorSize = 4; - sectorSkip = 2336; + sectorSize = 4; + sectorSkip = 2336; break; } case SectorTagType.CdSectorSubchannel: @@ -1294,29 +1307,29 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorEcc: { sectorOffset = 2076; - sectorSize = 276; - sectorSkip = 0; + sectorSize = 276; + sectorSkip = 0; break; } case SectorTagType.CdSectorEccP: { sectorOffset = 2076; - sectorSize = 172; - sectorSkip = 104; + sectorSize = 172; + sectorSkip = 104; break; } case SectorTagType.CdSectorEccQ: { sectorOffset = 2248; - sectorSize = 104; - sectorSkip = 0; + sectorSize = 104; + sectorSkip = 0; break; } case SectorTagType.CdSectorEdc: { sectorOffset = 2064; - sectorSize = 4; - sectorSkip = 284; + sectorSize = 4; + sectorSkip = 284; break; } default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); @@ -1334,22 +1347,22 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorSync: { sectorOffset = 0; - sectorSize = 12; - sectorSkip = 2340 + 96; + sectorSize = 12; + sectorSkip = 2340 + 96; break; } case SectorTagType.CdSectorHeader: { sectorOffset = 12; - sectorSize = 4; - sectorSkip = 2336 + 96; + sectorSize = 4; + sectorSkip = 2336 + 96; break; } case SectorTagType.CdSectorSubchannel: { sectorOffset = 2352; - sectorSize = 96; - sectorSkip = 0; + sectorSize = 96; + sectorSkip = 0; break; } case SectorTagType.CdSectorSubHeader: @@ -1357,29 +1370,29 @@ namespace DiscImageChef.DiscImages case SectorTagType.CdSectorEcc: { sectorOffset = 2076; - sectorSize = 276; - sectorSkip = 0 + 96; + sectorSize = 276; + sectorSkip = 0 + 96; break; } case SectorTagType.CdSectorEccP: { sectorOffset = 2076; - sectorSize = 172; - sectorSkip = 104 + 96; + sectorSize = 172; + sectorSkip = 104 + 96; break; } case SectorTagType.CdSectorEccQ: { sectorOffset = 2248; - sectorSize = 104; - sectorSkip = 0 + 96; + sectorSize = 104; + sectorSkip = 0 + 96; break; } case SectorTagType.CdSectorEdc: { sectorOffset = 2064; - sectorSize = 4; - sectorSkip = 284 + 96; + sectorSize = 4; + sectorSkip = 284 + 96; break; } default: throw new ArgumentException("Unsupported tag requested", nameof(tag)); @@ -1393,8 +1406,8 @@ namespace DiscImageChef.DiscImages throw new ArgumentException("Unsupported tag requested for this track", nameof(tag)); sectorOffset = 2352; - sectorSize = 96; - sectorSkip = 0; + sectorSize = 96; + sectorSkip = 0; break; } default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); @@ -1402,7 +1415,7 @@ namespace DiscImageChef.DiscImages byte[] buffer = new byte[sectorSize * length]; - imageStream = neroFilter.GetDataForkStream(); + imageStream = neroFilter.GetDataForkStream(); BinaryReader br = new BinaryReader(imageStream); br.BaseStream.Seek((long)dicTrack.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)), SeekOrigin.Begin); @@ -1433,9 +1446,9 @@ namespace DiscImageChef.DiscImages { foreach(KeyValuePair<uint, ulong> kvp in from kvp in offsetmap where sectorAddress >= kvp.Value - from track in imageTracks - where track.TrackSequence == kvp.Key - where sectorAddress - kvp.Value < + from track in Tracks + where track.TrackSequence == kvp.Key + where sectorAddress - kvp.Value < track.TrackEndSector - track.TrackStartSector select kvp) return ReadSectorsLong(sectorAddress - kvp.Value, length, kvp.Key); @@ -1462,15 +1475,15 @@ namespace DiscImageChef.DiscImages case DaoMode.DataM2F1: { sectorOffset = 0; - sectorSize = 2048; - sectorSkip = 0; + sectorSize = 2048; + sectorSkip = 0; break; } case DaoMode.DataM2F2: { sectorOffset = 0; - sectorSize = 2336; - sectorSkip = 0; + sectorSize = 2336; + sectorSkip = 0; break; } case DaoMode.DataRaw: @@ -1478,8 +1491,8 @@ namespace DiscImageChef.DiscImages case DaoMode.Audio: { sectorOffset = 0; - sectorSize = 2352; - sectorSkip = 0; + sectorSize = 2352; + sectorSkip = 0; break; } case DaoMode.DataRawSub: @@ -1487,8 +1500,8 @@ namespace DiscImageChef.DiscImages case DaoMode.AudioSub: { sectorOffset = 0; - sectorSize = 2448; - sectorSkip = 0; + sectorSize = 2448; + sectorSkip = 0; break; } default: throw new FeatureSupportedButNotImplementedImageException("Unsupported track type"); @@ -1496,7 +1509,7 @@ namespace DiscImageChef.DiscImages byte[] buffer = new byte[sectorSize * length]; - imageStream = neroFilter.GetDataForkStream(); + imageStream = neroFilter.GetDataForkStream(); BinaryReader br = new BinaryReader(imageStream); br.BaseStream.Seek((long)dicTrack.Offset + (long)(sectorAddress * (sectorOffset + sectorSize + sectorSkip)), @@ -1518,9 +1531,9 @@ namespace DiscImageChef.DiscImages public string Format => "Nero Burning ROM"; - public List<Partition> Partitions => imagePartitions; + public List<Partition> Partitions { get; } - public List<Track> Tracks => imageTracks; + public List<Track> Tracks { get; set; } public List<Track> GetSessionTracks(Session session) { @@ -1529,10 +1542,10 @@ namespace DiscImageChef.DiscImages public List<Track> GetSessionTracks(ushort session) { - return imageTracks.Where(track => track.TrackSession == session).ToList(); + return Tracks.Where(track => track.TrackSession == session).ToList(); } - public List<Session> Sessions => imageSessions; + public List<Session> Sessions { get; } public bool? VerifySector(ulong sectorAddress) { @@ -1547,13 +1560,13 @@ namespace DiscImageChef.DiscImages } public bool? VerifySectors(ulong sectorAddress, uint length, out List<ulong> failingLbas, - out List<ulong> unknownLbas) + out List<ulong> unknownLbas) { byte[] buffer = ReadSectorsLong(sectorAddress, length); - int bps = (int)(buffer.Length / length); + int bps = (int)(buffer.Length / length); byte[] sector = new byte[bps]; - failingLbas = new List<ulong>(); - unknownLbas = new List<ulong>(); + failingLbas = new List<ulong>(); + unknownLbas = new List<ulong>(); for(int i = 0; i < length; i++) { @@ -1577,13 +1590,13 @@ namespace DiscImageChef.DiscImages } public bool? VerifySectors(ulong sectorAddress, uint length, uint track, out List<ulong> failingLbas, - out List<ulong> unknownLbas) + out List<ulong> unknownLbas) { byte[] buffer = ReadSectorsLong(sectorAddress, length, track); - int bps = (int)(buffer.Length / length); + int bps = (int)(buffer.Length / length); byte[] sector = new byte[bps]; - failingLbas = new List<ulong>(); - unknownLbas = new List<ulong>(); + failingLbas = new List<ulong>(); + unknownLbas = new List<ulong>(); for(int i = 0; i < length; i++) { @@ -1619,32 +1632,32 @@ namespace DiscImageChef.DiscImages case NeroMediaTypes.NeroMtypDvdM: case NeroMediaTypes.NeroMtypDvdMR: return MediaType.DVDR; case NeroMediaTypes.NeroMtypDvdP: - case NeroMediaTypes.NeroMtypDvdPR: return MediaType.DVDPR; + case NeroMediaTypes.NeroMtypDvdPR: return MediaType.DVDPR; case NeroMediaTypes.NeroMtypDvdRam: return MediaType.DVDRAM; case NeroMediaTypes.NeroMtypMl: case NeroMediaTypes.NeroMtypMrw: case NeroMediaTypes.NeroMtypCdrw: return MediaType.CDRW; - case NeroMediaTypes.NeroMtypCdr: return MediaType.CDR; + case NeroMediaTypes.NeroMtypCdr: return MediaType.CDR; case NeroMediaTypes.NeroMtypDvdRom: case NeroMediaTypes.NeroMtypDvdAny: case NeroMediaTypes.NeroMtypDvdAnyR9: case NeroMediaTypes.NeroMtypDvdAnyOld: return MediaType.DVDROM; - case NeroMediaTypes.NeroMtypCdrom: return MediaType.CDROM; - case NeroMediaTypes.NeroMtypDvdMRw: return MediaType.DVDRW; - case NeroMediaTypes.NeroMtypDvdPRw: return MediaType.DVDPRW; - case NeroMediaTypes.NeroMtypDvdPR9: return MediaType.DVDPRDL; - case NeroMediaTypes.NeroMtypDvdMR9: return MediaType.DVDRDL; + case NeroMediaTypes.NeroMtypCdrom: return MediaType.CDROM; + case NeroMediaTypes.NeroMtypDvdMRw: return MediaType.DVDRW; + case NeroMediaTypes.NeroMtypDvdPRw: return MediaType.DVDPRW; + case NeroMediaTypes.NeroMtypDvdPR9: return MediaType.DVDPRDL; + case NeroMediaTypes.NeroMtypDvdMR9: return MediaType.DVDRDL; case NeroMediaTypes.NeroMtypBd: case NeroMediaTypes.NeroMtypBdAny: case NeroMediaTypes.NeroMtypBdRom: return MediaType.BDROM; - case NeroMediaTypes.NeroMtypBdR: return MediaType.BDR; - case NeroMediaTypes.NeroMtypBdRe: return MediaType.BDRE; + case NeroMediaTypes.NeroMtypBdR: return MediaType.BDR; + case NeroMediaTypes.NeroMtypBdRe: return MediaType.BDRE; case NeroMediaTypes.NeroMtypHdDvd: case NeroMediaTypes.NeroMtypHdDvdAny: case NeroMediaTypes.NeroMtypHdDvdRom: return MediaType.HDDVDROM; - case NeroMediaTypes.NeroMtypHdDvdR: return MediaType.HDDVDR; - case NeroMediaTypes.NeroMtypHdDvdRw: return MediaType.HDDVDRW; - default: return MediaType.CD; + case NeroMediaTypes.NeroMtypHdDvdR: return MediaType.HDDVDR; + case NeroMediaTypes.NeroMtypHdDvdRw: return MediaType.HDDVDRW; + default: return MediaType.CD; } } @@ -1655,13 +1668,13 @@ namespace DiscImageChef.DiscImages case DaoMode.Data: case DaoMode.DataRaw: case DaoMode.DataRawSub: return TrackType.CdMode1; - case DaoMode.DataM2F1: return TrackType.CdMode2Form1; - case DaoMode.DataM2F2: return TrackType.CdMode2Form2; + case DaoMode.DataM2F1: return TrackType.CdMode2Form1; + case DaoMode.DataM2F2: return TrackType.CdMode2Form2; case DaoMode.DataM2RawSub: case DaoMode.DataM2Raw: return TrackType.CdMode2Formless; case DaoMode.Audio: case DaoMode.AudioSub: return TrackType.Audio; - default: return TrackType.Data; + default: return TrackType.Data; } } @@ -1678,7 +1691,7 @@ namespace DiscImageChef.DiscImages case DaoMode.DataM2RawSub: case DaoMode.DataRawSub: case DaoMode.AudioSub: return 2448; - default: return 2352; + default: return 2352; } } @@ -2228,27 +2241,27 @@ namespace DiscImageChef.DiscImages { public byte[] Isrc; public ushort SectorSize; - public ulong Offset; - public ulong Length; - public ulong EndOfTrack; - public uint Mode; - public ulong StartLba; - public ulong Sectors; - public ulong Index0; - public ulong Index1; - public uint Sequence; + public ulong Offset; + public ulong Length; + public ulong EndOfTrack; + public uint Mode; + public ulong StartLba; + public ulong Sectors; + public ulong Index0; + public ulong Index1; + public uint Sequence; } enum DaoMode : ushort { - Data = 0x0000, - DataM2F1 = 0x0002, - DataM2F2 = 0x0003, - DataRaw = 0x0005, - DataM2Raw = 0x0006, - Audio = 0x0007, - DataRawSub = 0x000F, - AudioSub = 0x0010, + Data = 0x0000, + DataM2F1 = 0x0002, + DataM2F2 = 0x0003, + DataRaw = 0x0005, + DataM2Raw = 0x0006, + Audio = 0x0007, + DataRawSub = 0x000F, + AudioSub = 0x0010, DataM2RawSub = 0x0011 }