From 697649ed533d888de3eddeec8f482bd8720c34cf Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Thu, 2 Jan 2020 19:50:43 +0000 Subject: [PATCH] Show offsets in media info. --- DiscImageChef.Core/Media/Info/CompactDisc.cs | 6 +-- DiscImageChef/Commands/MediaInfo.cs | 50 +++++++++++++++++++- 2 files changed, 51 insertions(+), 5 deletions(-) diff --git a/DiscImageChef.Core/Media/Info/CompactDisc.cs b/DiscImageChef.Core/Media/Info/CompactDisc.cs index c9c20c2d6..599d46460 100644 --- a/DiscImageChef.Core/Media/Info/CompactDisc.cs +++ b/DiscImageChef.Core/Media/Info/CompactDisc.cs @@ -50,7 +50,7 @@ namespace DiscImageChef.Core.Media.Info if(!readcd) { - dumpLog.WriteLine("READ CD command is not supported, disabling offset fix. Dump may not be correct."); + dumpLog?.WriteLine("READ CD command is not supported, disabling offset fix. Dump may not be correct."); updateStatus?. Invoke("READ CD command is not supported, disabling offset fix. Dump may not be correct."); @@ -158,7 +158,7 @@ namespace DiscImageChef.Core.Media.Info } else { - dumpLog. + dumpLog?. WriteLine("Drive read offset is unknown, disabling offset fix. Dump may not be correct."); updateStatus?. @@ -171,7 +171,7 @@ namespace DiscImageChef.Core.Media.Info { if(offsetFound) { - dumpLog. + dumpLog?. WriteLine($"Disc offsets is {offsetBytes - (cdOffset.Offset * 4)} bytes ({(offsetBytes / 4) - cdOffset.Offset} samples)"); updateStatus?. diff --git a/DiscImageChef/Commands/MediaInfo.cs b/DiscImageChef/Commands/MediaInfo.cs index b612f031a..d91a76a08 100644 --- a/DiscImageChef/Commands/MediaInfo.cs +++ b/DiscImageChef/Commands/MediaInfo.cs @@ -34,12 +34,15 @@ using System; using System.Collections.Generic; using System.CommandLine; using System.CommandLine.Invocation; +using System.Linq; using DiscImageChef.CommonTypes.Enums; using DiscImageChef.CommonTypes.Structs; using DiscImageChef.Console; using DiscImageChef.Core; using DiscImageChef.Core.Devices.Dumping; using DiscImageChef.Core.Media.Info; +using DiscImageChef.Database; +using DiscImageChef.Database.Models; using DiscImageChef.Decoders.Bluray; using DiscImageChef.Decoders.CD; using DiscImageChef.Decoders.DVD; @@ -50,7 +53,9 @@ using DiscImageChef.Decoders.Xbox; using DiscImageChef.Devices; using BCA = DiscImageChef.Decoders.Bluray.BCA; using Cartridge = DiscImageChef.Decoders.DVD.Cartridge; +using Command = System.CommandLine.Command; using DDS = DiscImageChef.Decoders.DVD.DDS; +using Device = DiscImageChef.Devices.Device; using DMI = DiscImageChef.Decoders.Xbox.DMI; using Session = DiscImageChef.Decoders.CD.Session; using Spare = DiscImageChef.Decoders.DVD.Spare; @@ -143,7 +148,7 @@ namespace DiscImageChef.Commands break; case DeviceType.ATAPI: case DeviceType.SCSI: - DoScsiMediaInfo(outputPrefix, dev); + DoScsiMediaInfo(debug, verbose, outputPrefix, dev); break; default: throw new NotSupportedException("Unknown device type."); @@ -159,7 +164,7 @@ namespace DiscImageChef.Commands static void DoSdMediaInfo() => DicConsole.ErrorWriteLine("Please use device-info command for MMC/SD devices."); - static void DoScsiMediaInfo(string outputPrefix, Device dev) + static void DoScsiMediaInfo(bool debug, bool verbose, string outputPrefix, Device dev) { var scsiInfo = new ScsiInfo(dev); @@ -562,6 +567,47 @@ namespace DiscImageChef.Commands WriteLine("Track {0} starts at LBA {1}, ends at LBA {2}, has a pregap of {3} sectors and is of type {4}", track.TrackSequence, track.TrackStartSector, track.TrackEndSector, track.TrackPregap, track.TrackType); + + // Open master database + var ctx = DicContext.Create(Settings.Settings.MasterDbPath); + + // Search for device in master database + Database.Models.Device dbDev = + ctx.Devices.FirstOrDefault(d => d.Manufacturer == dev.Manufacturer && d.Model == dev.Model && + d.Revision == dev.Revision); + + CdOffset cdOffset = null; + + if(dbDev != null) + { + // Search for read offset in master database + cdOffset = ctx.CdOffsets.FirstOrDefault(d => d.Manufacturer == dev.Manufacturer && + d.Model == dev.Model); + } + + bool gotOffset = CompactDisc.GetOffset(cdOffset, dbDev, debug, dev, scsiInfo.MediaType, null, + out int offsetBytes, true, out _, tracks, null); + + DicConsole.WriteLine(); + DicConsole.WriteLine("Offsets:"); + + DicConsole.WriteLine(cdOffset != null + ? $"Drive offset is {cdOffset.Offset * 4} bytes ({cdOffset.Offset} samples)" + : "Drive offset is unknown"); + + if(gotOffset) + { + DicConsole.WriteLine($"Combined offset is {offsetBytes} bytes ({offsetBytes / 4} samples)"); + + DicConsole.WriteLine(cdOffset != null + ? $"Disc offset is {offsetBytes - (cdOffset.Offset * 4)} bytes ({(offsetBytes / 4) - cdOffset.Offset} samples)" + : "Disc offset is unknown"); + } + else + { + DicConsole.WriteLine("Combined offset is unknown"); + DicConsole.WriteLine("Disc offset is unknown"); + } } }