From 727afd3e79dd3598d35dd399f34de5367a2b275b Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Wed, 1 Jan 2020 19:15:32 +0000 Subject: [PATCH] Move CD first track pregap reading to a separate file. --- .../.idea/contentModel.xml | 1 + .../Devices/Dumping/CompactDisc/Dump.cs | 69 +--------- .../Devices/Dumping/CompactDisc/Pregap.cs | 120 ++++++++++++++++++ DiscImageChef.Core/DiscImageChef.Core.csproj | 1 + 4 files changed, 123 insertions(+), 68 deletions(-) create mode 100644 DiscImageChef.Core/Devices/Dumping/CompactDisc/Pregap.cs diff --git a/.idea/.idea.DiscImageChef/.idea/contentModel.xml b/.idea/.idea.DiscImageChef/.idea/contentModel.xml index 531f41366..a1ee10864 100644 --- a/.idea/.idea.DiscImageChef/.idea/contentModel.xml +++ b/.idea/.idea.DiscImageChef/.idea/contentModel.xml @@ -238,6 +238,7 @@ + diff --git a/DiscImageChef.Core/Devices/Dumping/CompactDisc/Dump.cs b/DiscImageChef.Core/Devices/Dumping/CompactDisc/Dump.cs index 0bcb980bf..f486dca3e 100644 --- a/DiscImageChef.Core/Devices/Dumping/CompactDisc/Dump.cs +++ b/DiscImageChef.Core/Devices/Dumping/CompactDisc/Dump.cs @@ -32,7 +32,6 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Text; using DiscImageChef.CommonTypes; @@ -70,7 +69,6 @@ namespace DiscImageChef.Core.Devices.Dumping uint blockSize; // Size of the read sector in bytes CdOffset cdOffset; // Read offset from database byte[] cmdBuf; // Data buffer - double cmdDuration; // Command execution time DumpHardwareType currentTry = null; // Current dump hardware try double currentSpeed = 0; // Current read speed DateTime dumpStart = DateTime.UtcNow; // Time of dump start @@ -95,7 +93,6 @@ namespace DiscImageChef.Core.Devices.Dumping bool ret; // Image writing return status const uint sectorSize = 2352; // Full sector size int sectorsForOffset = 0; // Sectors needed to fix offset - ulong sectorSpeedStart = 0; // Used to calculate correct speed bool sense = true; // Sense indicator int sessions; // Number of sessions in disc DateTime start; // Start of operation @@ -113,7 +110,6 @@ namespace DiscImageChef.Core.Devices.Dumping int firstTrackLastSession; // Number of first track in last session bool hiddenTrack; // Disc has a hidden track before track 1 MmcSubchannel supportedSubchannel; // Drive's maximum supported subchannel - DateTime timeSpeedStart; // Time of start for speed calculation Dictionary mediaTags = new Dictionary(); // Media tags @@ -603,70 +599,7 @@ namespace DiscImageChef.Core.Devices.Dumping // Try to read the first track pregap if(_dumpFirstTrackPregap && readcd) - { - bool gotFirstTrackPregap = false; - int firstTrackPregapSectorsGood = 0; - var firstTrackPregapMs = new MemoryStream(); - - _dumpLog.WriteLine("Reading first track pregap"); - UpdateStatus?.Invoke("Reading first track pregap"); - InitProgress?.Invoke(); - timeSpeedStart = DateTime.UtcNow; - - for(int firstTrackPregapBlock = -150; firstTrackPregapBlock < 0 && _resume.NextBlock == 0; - firstTrackPregapBlock++) - { - if(_aborted) - { - _dumpLog.WriteLine("Aborted!"); - UpdateStatus?.Invoke("Aborted!"); - - break; - } - - PulseProgress?. - Invoke($"Trying to read first track pregap sector {firstTrackPregapBlock} ({currentSpeed:F3} MiB/sec.)"); - - sense = _dev.ReadCd(out cmdBuf, out _, (uint)firstTrackPregapBlock, blockSize, 1, - MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, - true, MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration); - - if(!sense && - !_dev.Error) - { - firstTrackPregapMs.Write(cmdBuf, 0, (int)blockSize); - gotFirstTrackPregap = true; - firstTrackPregapSectorsGood++; - totalDuration += cmdDuration; - } - else - { - // Write empty data - if(gotFirstTrackPregap) - firstTrackPregapMs.Write(new byte[blockSize], 0, (int)blockSize); - } - - sectorSpeedStart++; - - double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; - - if(elapsed < 1) - continue; - - currentSpeed = (sectorSpeedStart * blockSize) / (1048576 * elapsed); - sectorSpeedStart = 0; - timeSpeedStart = DateTime.UtcNow; - } - - if(firstTrackPregapSectorsGood > 0) - mediaTags.Add(MediaTagType.CD_FirstTrackPregap, firstTrackPregapMs.ToArray()); - - EndProgress?.Invoke(); - UpdateStatus?.Invoke($"Got {firstTrackPregapSectorsGood} first track pregap sectors."); - _dumpLog.WriteLine("Got {0} first track pregap sectors.", firstTrackPregapSectorsGood); - - firstTrackPregapMs.Close(); - } + ReadCdFirstTrackPregap(blockSize, ref currentSpeed, mediaTags, supportedSubchannel, ref totalDuration); // Try how many blocks are readable at once while(true) diff --git a/DiscImageChef.Core/Devices/Dumping/CompactDisc/Pregap.cs b/DiscImageChef.Core/Devices/Dumping/CompactDisc/Pregap.cs new file mode 100644 index 000000000..c2a9dddb5 --- /dev/null +++ b/DiscImageChef.Core/Devices/Dumping/CompactDisc/Pregap.cs @@ -0,0 +1,120 @@ +// /*************************************************************************** +// The Disc Image Chef +// ---------------------------------------------------------------------------- +// +// Filename : CompactDisc.cs +// Author(s) : Natalia Portillo +// +// Component : Core algorithms. +// +// --[ Description ] ---------------------------------------------------------- +// +// Dumps CDs and DDCDs. +// +// --[ License ] -------------------------------------------------------------- +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as +// published by the Free Software Foundation, either version 3 of the +// License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// ---------------------------------------------------------------------------- +// Copyright © 2011-2019 Natalia Portillo +// ****************************************************************************/ + +using System; +using System.Collections.Generic; +using System.IO; +using DiscImageChef.CommonTypes.Enums; +using DiscImageChef.Devices; + +// ReSharper disable JoinDeclarationAndInitializer +// ReSharper disable InlineOutVariableDeclaration +// ReSharper disable TooWideLocalVariableScope + +namespace DiscImageChef.Core.Devices.Dumping +{ + partial class Dump + { + // TODO: Fix offset + void ReadCdFirstTrackPregap(uint blockSize, ref double currentSpeed, Dictionary mediaTags, + MmcSubchannel supportedSubchannel, ref double totalDuration) + { + bool sense; // Sense indicator + byte[] cmdBuf; // Data buffer + double cmdDuration; // Command execution time + DateTime timeSpeedStart; // Time of start for speed calculation + ulong sectorSpeedStart = 0; // Used to calculate correct speed + bool gotFirstTrackPregap = false; + int firstTrackPregapSectorsGood = 0; + var firstTrackPregapMs = new MemoryStream(); + + _dumpLog.WriteLine("Reading first track pregap"); + UpdateStatus?.Invoke("Reading first track pregap"); + InitProgress?.Invoke(); + timeSpeedStart = DateTime.UtcNow; + + for(int firstTrackPregapBlock = -150; firstTrackPregapBlock < 0 && _resume.NextBlock == 0; + firstTrackPregapBlock++) + { + if(_aborted) + { + _dumpLog.WriteLine("Aborted!"); + UpdateStatus?.Invoke("Aborted!"); + + break; + } + + PulseProgress?. + Invoke($"Trying to read first track pregap sector {firstTrackPregapBlock} ({currentSpeed:F3} MiB/sec.)"); + + sense = _dev.ReadCd(out cmdBuf, out _, (uint)firstTrackPregapBlock, blockSize, 1, + MmcSectorTypes.AllTypes, false, false, true, MmcHeaderCodes.AllHeaders, true, true, + MmcErrorField.None, supportedSubchannel, _dev.Timeout, out cmdDuration); + + if(!sense && + !_dev.Error) + { + firstTrackPregapMs.Write(cmdBuf, 0, (int)blockSize); + gotFirstTrackPregap = true; + firstTrackPregapSectorsGood++; + totalDuration += cmdDuration; + } + else + { + // Write empty data + if(gotFirstTrackPregap) + firstTrackPregapMs.Write(new byte[blockSize], 0, (int)blockSize); + } + + sectorSpeedStart++; + + double elapsed = (DateTime.UtcNow - timeSpeedStart).TotalSeconds; + + if(elapsed < 1) + continue; + + currentSpeed = (sectorSpeedStart * blockSize) / (1048576 * elapsed); + sectorSpeedStart = 0; + timeSpeedStart = DateTime.UtcNow; + } + + if(firstTrackPregapSectorsGood > 0) + mediaTags.Add(MediaTagType.CD_FirstTrackPregap, firstTrackPregapMs.ToArray()); + + EndProgress?.Invoke(); + UpdateStatus?.Invoke($"Got {firstTrackPregapSectorsGood} first track pregap sectors."); + _dumpLog.WriteLine("Got {0} first track pregap sectors.", firstTrackPregapSectorsGood); + + firstTrackPregapMs.Close(); + } + } +} \ No newline at end of file diff --git a/DiscImageChef.Core/DiscImageChef.Core.csproj b/DiscImageChef.Core/DiscImageChef.Core.csproj index 000ce9c23..6d0862c6b 100644 --- a/DiscImageChef.Core/DiscImageChef.Core.csproj +++ b/DiscImageChef.Core/DiscImageChef.Core.csproj @@ -51,6 +51,7 @@ +