mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Add test for inter-session reading in multi-session discs to device reports.
This commit is contained in:
5
.idea/.idea.DiscImageChef/.idea/contentModel.xml
generated
5
.idea/.idea.DiscImageChef/.idea/contentModel.xml
generated
@@ -330,6 +330,8 @@
|
||||
<e p="20181225152947_StoreMmcGetConfigurationResponse.cs" t="Include" />
|
||||
<e p="20181225214500_StoreReadResultsInReportDatabase.Designer.cs" t="Include" />
|
||||
<e p="20181225214500_StoreReadResultsInReportDatabase.cs" t="Include" />
|
||||
<e p="20190102061236_AddMultisessionLeadTest.Designer.cs" t="Include" />
|
||||
<e p="20190102061236_AddMultisessionLeadTest.cs" t="Include" />
|
||||
<e p="DicContextModelSnapshot.cs" t="Include" />
|
||||
</e>
|
||||
<e p="Models" t="Include">
|
||||
@@ -1853,6 +1855,9 @@
|
||||
<e p="201812252219066_StoreReadResultsInReportDatabase.Designer.cs" t="Include" />
|
||||
<e p="201812252219066_StoreReadResultsInReportDatabase.cs" t="Include" />
|
||||
<e p="201812252219066_StoreReadResultsInReportDatabase.resx" t="Include" />
|
||||
<e p="201901022133012_AddMultisessionLeadTest.Designer.cs" t="Include" />
|
||||
<e p="201901022133012_AddMultisessionLeadTest.cs" t="Include" />
|
||||
<e p="201901022133012_AddMultisessionLeadTest.resx" t="Include" />
|
||||
<e p="Configuration.cs" t="Include" />
|
||||
</e>
|
||||
<e p="Models" t="Include">
|
||||
|
||||
@@ -1338,6 +1338,11 @@ namespace DiscImageChef.CommonTypes.Metadata
|
||||
public bool? SupportsReadLongRetry { get; set; }
|
||||
public bool? SupportsSeek { get; set; }
|
||||
|
||||
public bool? CanReadingIntersessionLeadIn { get; set; }
|
||||
public bool? CanReadingIntersessionLeadOut { get; set; }
|
||||
public byte[] IntersessionLeadInData { get; set; }
|
||||
public byte[] IntersessionLeadOutData { get; set; }
|
||||
|
||||
[JsonIgnore]
|
||||
public long? BlocksSql
|
||||
{
|
||||
|
||||
@@ -31,9 +31,11 @@
|
||||
// ****************************************************************************/
|
||||
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using DiscImageChef.CommonTypes.Metadata;
|
||||
using DiscImageChef.Console;
|
||||
using DiscImageChef.Decoders.CD;
|
||||
using DiscImageChef.Decoders.SCSI;
|
||||
using DiscImageChef.Decoders.SCSI.MMC;
|
||||
using DiscImageChef.Devices;
|
||||
@@ -1210,6 +1212,129 @@ namespace DiscImageChef.Core.Devices.Report
|
||||
|
||||
if(mediaTest.SupportsHLDTSTReadRawDVD == true && debug) mediaTest.HLDTSTReadRawDVDData = buffer;
|
||||
|
||||
// This is for checking multi-session support, and inter-session lead-in/out reading, as Enhanced CD are
|
||||
if(mediaType == "Enhanced CD (aka E-CD, CD-Plus or CD+)")
|
||||
{
|
||||
DicConsole.WriteLine("Querying CD Full TOC...");
|
||||
mediaTest.CanReadFullTOC = !dev.ReadRawToc(out buffer, out senseBuffer, 1, dev.Timeout, out _);
|
||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}", !mediaTest.CanReadFullTOC);
|
||||
if(debug) mediaTest.FullTocData = buffer;
|
||||
|
||||
if(mediaTest.CanReadFullTOC == true)
|
||||
{
|
||||
FullTOC.CDFullTOC? decodedTocNullable = FullTOC.Decode(buffer);
|
||||
|
||||
mediaTest.CanReadFullTOC = decodedTocNullable.HasValue;
|
||||
|
||||
if(mediaTest.CanReadFullTOC == true)
|
||||
{
|
||||
FullTOC.CDFullTOC decodedToc = decodedTocNullable.Value;
|
||||
|
||||
if(!decodedToc.TrackDescriptors.Any(t => t.SessionNumber > 1))
|
||||
{
|
||||
DicConsole
|
||||
.ErrorWriteLine("Could not find second session. Have you inserted the correct type of disc?");
|
||||
return null;
|
||||
}
|
||||
|
||||
FullTOC.TrackDataDescriptor firstSessionLeadOutTrack =
|
||||
decodedToc.TrackDescriptors.FirstOrDefault(t => t.SessionNumber == 1 && t.POINT == 0xA2);
|
||||
FullTOC.TrackDataDescriptor secondSessionFirstTrack =
|
||||
decodedToc.TrackDescriptors.FirstOrDefault(t => t.SessionNumber > 1 && t.POINT <= 99);
|
||||
|
||||
if(firstSessionLeadOutTrack.SessionNumber == 0 || secondSessionFirstTrack.SessionNumber == 0)
|
||||
{
|
||||
DicConsole
|
||||
.ErrorWriteLine("Could not find second session. Have you inserted the correct type of disc?");
|
||||
return null;
|
||||
}
|
||||
|
||||
DicConsole.DebugWriteLine("SCSI Report",
|
||||
"First session Lead-Out starts at {0:D2}:{1:D2}:{2:D2}",
|
||||
firstSessionLeadOutTrack.PMIN, firstSessionLeadOutTrack.PSEC,
|
||||
firstSessionLeadOutTrack.PFRAME);
|
||||
DicConsole.DebugWriteLine("SCSI Report", "Second session starts at {0:D2}:{1:D2}:{2:D2}",
|
||||
secondSessionFirstTrack.PMIN, secondSessionFirstTrack.PSEC,
|
||||
secondSessionFirstTrack.PFRAME);
|
||||
|
||||
// Skip Lead-Out pre-gap
|
||||
uint firstSessionLeadOutLba = (uint)(firstSessionLeadOutTrack.PMIN * 60 * 75 +
|
||||
firstSessionLeadOutTrack.PSEC * 75 +
|
||||
firstSessionLeadOutTrack.PFRAME + 150);
|
||||
|
||||
// Skip second session track pre-gap
|
||||
uint secondSessionLeadInLba = (uint)(secondSessionFirstTrack.PMIN * 60 * 75 +
|
||||
secondSessionFirstTrack.PSEC * 75 +
|
||||
secondSessionFirstTrack.PFRAME - 300);
|
||||
|
||||
DicConsole.WriteLine("Trying SCSI READ CD in first session Lead-Out...");
|
||||
mediaTest.CanReadingIntersessionLeadOut = !dev.ReadCd(out buffer, out senseBuffer,
|
||||
firstSessionLeadOutLba, 2448, 1,
|
||||
MmcSectorTypes.AllTypes, false, false,
|
||||
false, MmcHeaderCodes.AllHeaders, true,
|
||||
false, MmcErrorField.None,
|
||||
MmcSubchannel.Raw, dev.Timeout, out _);
|
||||
|
||||
if(mediaTest.CanReadingIntersessionLeadOut == false)
|
||||
{
|
||||
mediaTest.CanReadingIntersessionLeadOut = !dev.ReadCd(out buffer, out senseBuffer,
|
||||
firstSessionLeadOutLba, 2368, 1,
|
||||
MmcSectorTypes.AllTypes, false, false,
|
||||
false, MmcHeaderCodes.AllHeaders,
|
||||
true, false, MmcErrorField.None,
|
||||
MmcSubchannel.Q16, dev.Timeout,
|
||||
out _);
|
||||
|
||||
if(mediaTest.CanReadingIntersessionLeadOut == false)
|
||||
mediaTest.CanReadingIntersessionLeadOut = !dev.ReadCd(out buffer, out senseBuffer,
|
||||
firstSessionLeadOutLba, 2352, 1,
|
||||
MmcSectorTypes.AllTypes, false,
|
||||
false, false,
|
||||
MmcHeaderCodes.AllHeaders, true,
|
||||
false, MmcErrorField.None,
|
||||
MmcSubchannel.None, dev.Timeout,
|
||||
out _);
|
||||
}
|
||||
|
||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
|
||||
!mediaTest.CanReadingIntersessionLeadOut);
|
||||
if(debug) mediaTest.IntersessionLeadOutData = buffer;
|
||||
|
||||
DicConsole.WriteLine("Trying SCSI READ CD in second session Lead-In...");
|
||||
mediaTest.CanReadingIntersessionLeadIn = !dev.ReadCd(out buffer, out senseBuffer,
|
||||
secondSessionLeadInLba, 2448, 1,
|
||||
MmcSectorTypes.AllTypes, false, false,
|
||||
false, MmcHeaderCodes.AllHeaders, true,
|
||||
false, MmcErrorField.None,
|
||||
MmcSubchannel.Raw, dev.Timeout, out _);
|
||||
|
||||
if(mediaTest.CanReadingIntersessionLeadIn == false)
|
||||
{
|
||||
mediaTest.CanReadingIntersessionLeadIn = !dev.ReadCd(out buffer, out senseBuffer,
|
||||
secondSessionLeadInLba, 2368, 1,
|
||||
MmcSectorTypes.AllTypes, false, false,
|
||||
false, MmcHeaderCodes.AllHeaders, true,
|
||||
false, MmcErrorField.None,
|
||||
MmcSubchannel.Q16, dev.Timeout, out _);
|
||||
|
||||
if(mediaTest.CanReadingIntersessionLeadIn == false)
|
||||
mediaTest.CanReadingIntersessionLeadIn = !dev.ReadCd(out buffer, out senseBuffer,
|
||||
secondSessionLeadInLba, 2352, 1,
|
||||
MmcSectorTypes.AllTypes, false,
|
||||
false, false,
|
||||
MmcHeaderCodes.AllHeaders, true,
|
||||
false, MmcErrorField.None,
|
||||
MmcSubchannel.None, dev.Timeout,
|
||||
out _);
|
||||
}
|
||||
|
||||
DicConsole.DebugWriteLine("SCSI Report", "Sense = {0}",
|
||||
!mediaTest.CanReadingIntersessionLeadIn);
|
||||
if(debug) mediaTest.IntersessionLeadInData = buffer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mediaTest;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,6 +90,8 @@
|
||||
<Compile Include="Migrations\20181225152947_StoreMmcGetConfigurationResponse.Designer.cs" />
|
||||
<Compile Include="Migrations\20181225214500_StoreReadResultsInReportDatabase.cs" />
|
||||
<Compile Include="Migrations\20181225214500_StoreReadResultsInReportDatabase.Designer.cs" />
|
||||
<Compile Include="Migrations\20190102061236_AddMultisessionLeadTest.cs" />
|
||||
<Compile Include="Migrations\20190102061236_AddMultisessionLeadTest.Designer.cs" />
|
||||
<Compile Include="Migrations\DicContextModelSnapshot.cs" />
|
||||
<Compile Include="Models\CdOffset.cs" />
|
||||
<Compile Include="Models\Command.cs" />
|
||||
|
||||
1559
DiscImageChef.Database/Migrations/20190102061236_AddMultisessionLeadTest.Designer.cs
generated
Normal file
1559
DiscImageChef.Database/Migrations/20190102061236_AddMultisessionLeadTest.Designer.cs
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,29 @@
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
namespace DiscImageChef.Database.Migrations
|
||||
{
|
||||
public partial class AddMultisessionLeadTest : Migration
|
||||
{
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AddColumn<bool>("CanReadingIntersessionLeadIn", "TestedMedia", nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<bool>("CanReadingIntersessionLeadOut", "TestedMedia", nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<byte[]>("IntersessionLeadInData", "TestedMedia", nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<byte[]>("IntersessionLeadOutData", "TestedMedia", nullable: true);
|
||||
}
|
||||
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn("CanReadingIntersessionLeadIn", "TestedMedia");
|
||||
|
||||
migrationBuilder.DropColumn("CanReadingIntersessionLeadOut", "TestedMedia");
|
||||
|
||||
migrationBuilder.DropColumn("IntersessionLeadInData", "TestedMedia");
|
||||
|
||||
migrationBuilder.DropColumn("IntersessionLeadOutData", "TestedMedia");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -709,6 +709,10 @@ namespace DiscImageChef.Database.Migrations
|
||||
|
||||
b.Property<bool?>("CanReadTOC");
|
||||
|
||||
b.Property<bool?>("CanReadingIntersessionLeadIn");
|
||||
|
||||
b.Property<bool?>("CanReadingIntersessionLeadOut");
|
||||
|
||||
b.Property<byte[]>("CmiData");
|
||||
|
||||
b.Property<byte[]>("CorrectedSubchannelData");
|
||||
@@ -743,6 +747,10 @@ namespace DiscImageChef.Database.Migrations
|
||||
|
||||
b.Property<byte[]>("IdentifyData");
|
||||
|
||||
b.Property<byte[]>("IntersessionLeadInData");
|
||||
|
||||
b.Property<byte[]>("IntersessionLeadOutData");
|
||||
|
||||
b.Property<ulong?>("LBA48Sectors");
|
||||
|
||||
b.Property<long?>("LBA48SectorsSql");
|
||||
|
||||
@@ -256,6 +256,10 @@
|
||||
<Compile Include="Migrations\201812252219066_StoreReadResultsInReportDatabase.Designer.cs">
|
||||
<DependentUpon>201812252219066_StoreReadResultsInReportDatabase.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Migrations\201901022133012_AddMultisessionLeadTest.cs" />
|
||||
<Compile Include="Migrations\201901022133012_AddMultisessionLeadTest.Designer.cs">
|
||||
<DependentUpon>201901022133012_AddMultisessionLeadTest.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Migrations\Configuration.cs" />
|
||||
<Compile Include="Models\CdOffset.cs" />
|
||||
<Compile Include="Models\Command.cs" />
|
||||
@@ -380,6 +384,9 @@
|
||||
<EmbeddedResource Include="Migrations\201812252219066_StoreReadResultsInReportDatabase.resx">
|
||||
<DependentUpon>201812252219066_StoreReadResultsInReportDatabase.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Migrations\201901022133012_AddMultisessionLeadTest.resx">
|
||||
<DependentUpon>201901022133012_AddMultisessionLeadTest.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
||||
|
||||
29
DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.Designer.cs
generated
Normal file
29
DiscImageChef.Server/Migrations/201901022133012_AddMultisessionLeadTest.Designer.cs
generated
Normal file
@@ -0,0 +1,29 @@
|
||||
// <auto-generated />
|
||||
namespace DiscImageChef.Server.Migrations
|
||||
{
|
||||
using System.CodeDom.Compiler;
|
||||
using System.Data.Entity.Migrations;
|
||||
using System.Data.Entity.Migrations.Infrastructure;
|
||||
using System.Resources;
|
||||
|
||||
[GeneratedCode("EntityFramework.Migrations", "6.2.0-61023")]
|
||||
public sealed partial class AddMultisessionLeadTest : IMigrationMetadata
|
||||
{
|
||||
private readonly ResourceManager Resources = new ResourceManager(typeof(AddMultisessionLeadTest));
|
||||
|
||||
string IMigrationMetadata.Id
|
||||
{
|
||||
get { return "201901022133012_AddMultisessionLeadTest"; }
|
||||
}
|
||||
|
||||
string IMigrationMetadata.Source
|
||||
{
|
||||
get { return null; }
|
||||
}
|
||||
|
||||
string IMigrationMetadata.Target
|
||||
{
|
||||
get { return Resources.GetString("Target"); }
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
using System.Data.Entity.Migrations;
|
||||
|
||||
namespace DiscImageChef.Server.Migrations
|
||||
{
|
||||
public partial class AddMultisessionLeadTest : DbMigration
|
||||
{
|
||||
public override void Up()
|
||||
{
|
||||
AddColumn("dbo.TestedMedias", "CanReadingIntersessionLeadIn", c => c.Boolean());
|
||||
AddColumn("dbo.TestedMedias", "CanReadingIntersessionLeadOut", c => c.Boolean());
|
||||
AddColumn("dbo.TestedMedias", "IntersessionLeadInData", c => c.Binary());
|
||||
AddColumn("dbo.TestedMedias", "IntersessionLeadOutData", c => c.Binary());
|
||||
}
|
||||
|
||||
public override void Down()
|
||||
{
|
||||
DropColumn("dbo.TestedMedias", "IntersessionLeadOutData");
|
||||
DropColumn("dbo.TestedMedias", "IntersessionLeadInData");
|
||||
DropColumn("dbo.TestedMedias", "CanReadingIntersessionLeadOut");
|
||||
DropColumn("dbo.TestedMedias", "CanReadingIntersessionLeadIn");
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -317,6 +317,7 @@ namespace DiscImageChef.Commands
|
||||
{
|
||||
mediaTypes.Add("CD-ROM");
|
||||
mediaTypes.Add("Audio CD");
|
||||
mediaTypes.Add("Enhanced CD (aka E-CD, CD-Plus or CD+)");
|
||||
if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadCDR) mediaTypes.Add("CD-R");
|
||||
if(report.SCSI.MultiMediaDevice.ModeSense2A.ReadCDRW)
|
||||
{
|
||||
@@ -434,6 +435,8 @@ namespace DiscImageChef.Commands
|
||||
mediaTypes.Add("CD-RW High Speed (marked between 8x and 12x)");
|
||||
if(!mediaTypes.Contains("CD-RW (marked 4x or lower)"))
|
||||
mediaTypes.Add("CD-RW (marked 4x or lower)");
|
||||
if(!mediaTypes.Contains("Enhanced CD (aka E-CD, CD-Plus or CD+)"))
|
||||
mediaTypes.Add("Enhanced CD (aka E-CD, CD-Plus or CD+)");
|
||||
}
|
||||
|
||||
mediaTypes.Sort();
|
||||
@@ -587,6 +590,8 @@ namespace DiscImageChef.Commands
|
||||
mediaTest = reporter.ReportMmcMedia(mediaType, tryPlextor, tryPioneer, tryNec,
|
||||
tryHldtst);
|
||||
|
||||
if(mediaTest is null) continue;
|
||||
|
||||
if(mediaTest.SupportsReadLong == true &&
|
||||
mediaTest.LongBlockSize == mediaTest.BlockSize)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user