Fix detection of CD-ROM XA. Fixes #269

This commit is contained in:
2020-03-03 19:58:49 +00:00
parent 83721d8bbc
commit a89fa4bd13
3 changed files with 62 additions and 35 deletions

View File

@@ -169,20 +169,6 @@ namespace Aaru.Core.Devices.Dumping
else if(trk.POINT == 0xA0 &&
trk.ADR == 1)
{
switch(trk.PSEC)
{
case 0x10:
dskType = MediaType.CDI;
break;
case 0x20:
if(dskType == MediaType.CD ||
dskType == MediaType.CDROM)
dskType = MediaType.CDROMXA;
break;
}
leadoutTrackType =
(TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrack ||
(TocControl)(trk.CONTROL & 0x0D) == TocControl.DataTrackIncremental ? TrackType.Data

View File

@@ -252,7 +252,25 @@ namespace Aaru.Core.Media.Detection
bool hasVideoTrack = false;
if(decodedToc.HasValue)
foreach(FullTOC.TrackDataDescriptor track in decodedToc.Value.TrackDescriptors)
{
FullTOC.TrackDataDescriptor a0Track =
decodedToc.Value.TrackDescriptors.FirstOrDefault(t => t.POINT == 0xA0 && t.ADR == 1);
if(a0Track.POINT == 0xA0)
switch(a0Track.PSEC)
{
case 0x10:
mediaType = MediaType.CDI;
break;
case 0x20:
mediaType = MediaType.CDROMXA;
break;
}
foreach(FullTOC.TrackDataDescriptor track in
decodedToc.Value.TrackDescriptors.Where(t => t.POINT > 0 && t.POINT <= 0x99))
{
if(track.TNO == 1 &&
((TocControl)(track.CONTROL & 0x0D) == TocControl.DataTrack ||
@@ -279,6 +297,7 @@ namespace Aaru.Core.Media.Detection
hasVideoTrack |= track.ADR == 4;
}
}
if(hasDataTrack &&
hasAudioTrack &&
@@ -300,6 +319,48 @@ namespace Aaru.Core.Media.Detection
!hasDataTrack &&
sessions == 1)
mediaType = MediaType.CDV;
if((mediaType == MediaType.CD || mediaType == MediaType.CDROM) && hasDataTrack)
{
foreach(FullTOC.TrackDataDescriptor track in
decodedToc.Value.TrackDescriptors.Where(t => t.POINT > 0 && t.POINT <= 0x99 &&
((TocControl)(t.CONTROL & 0x0D) ==
TocControl.DataTrack ||
(TocControl)(t.CONTROL & 0x0D) ==
TocControl.DataTrackIncremental)))
{
uint startAddress =
(uint)(((track.PHOUR * 3600 * 75) + (track.PMIN * 60 * 75) + (track.PSEC * 75) +
track.PFRAME) - 150) + 16;
sense = dev.ReadCd(out cmdBuf, out _, startAddress, 2352, 1, MmcSectorTypes.AllTypes, false,
false, true, MmcHeaderCodes.AllHeaders, true, true, MmcErrorField.None,
MmcSubchannel.None, dev.Timeout, out _);
if(!sense &&
!dev.Error)
{
if(cmdBuf[0] == 0x00 &&
cmdBuf[1] == 0xFF &&
cmdBuf[2] == 0xFF &&
cmdBuf[3] == 0xFF &&
cmdBuf[4] == 0xFF &&
cmdBuf[5] == 0xFF &&
cmdBuf[6] == 0xFF &&
cmdBuf[7] == 0xFF &&
cmdBuf[8] == 0xFF &&
cmdBuf[9] == 0xFF &&
cmdBuf[10] == 0xFF &&
cmdBuf[11] == 0x00 &&
cmdBuf[15] == 0x02)
{
mediaType = MediaType.CDROMXA;
break;
}
}
}
}
}
if(secondSessionFirstTrack != 0 &&

View File

@@ -1148,26 +1148,6 @@ namespace Aaru.Core.Media.Info
RawToc = cmdBuf;
FullToc = FullTOC.Decode(cmdBuf);
if(FullToc.HasValue)
{
FullTOC.TrackDataDescriptor a0Track =
FullToc.Value.TrackDescriptors.
FirstOrDefault(t => t.POINT == 0xA0 && t.ADR == 1);
if(a0Track.POINT == 0xA0)
switch(a0Track.PSEC)
{
case 0x10:
MediaType = MediaType.CDI;
break;
case 0x20:
MediaType = MediaType.CDROMXA;
break;
}
}
}
sense = dev.ReadPma(out cmdBuf, out senseBuf, dev.Timeout, out _);