mirror of
https://github.com/aaru-dps/Aaru.git
synced 2025-12-16 19:24:25 +00:00
Fix detection of CD-ROM XA. Fixes #269
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 &&
|
||||
|
||||
@@ -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 _);
|
||||
|
||||
Reference in New Issue
Block a user