mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-10-23 07:35:57 +00:00
CDROM: Skip reading sectors which have an invalid SubQ checksum
i.e. libcrypt support
This commit is contained in:
parent
bc44d4b1b0
commit
36fbc4523d
|
@ -1093,7 +1093,7 @@ void CDROM::BeginSeeking(bool logical, bool read_after_seek, bool play_after_see
|
||||||
// Read sub-q early.. this is because we're not reading sectors while seeking.
|
// Read sub-q early.. this is because we're not reading sectors while seeking.
|
||||||
// Fixes music looping in Spyro.
|
// Fixes music looping in Spyro.
|
||||||
CDImage::SubChannelQ subq;
|
CDImage::SubChannelQ subq;
|
||||||
if (m_media->Seek(m_seek_position) && m_media->ReadSubChannelQ(&subq))
|
if (m_media->Seek(m_seek_position) && m_media->ReadSubChannelQ(&subq) && subq.IsCRCValid())
|
||||||
m_last_subq = subq;
|
m_last_subq = subq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1116,7 +1116,6 @@ void CDROM::DoSeekComplete()
|
||||||
m_sector_buffer.clear();
|
m_sector_buffer.clear();
|
||||||
|
|
||||||
// seek and update sub-q for ReadP command
|
// seek and update sub-q for ReadP command
|
||||||
// TODO: Check SubQ checksum
|
|
||||||
const auto [seek_mm, seek_ss, seek_ff] = m_seek_position.ToBCD();
|
const auto [seek_mm, seek_ss, seek_ff] = m_seek_position.ToBCD();
|
||||||
bool seek_okay = (m_last_subq.absolute_minute_bcd == seek_mm && m_last_subq.absolute_second_bcd == seek_ss &&
|
bool seek_okay = (m_last_subq.absolute_minute_bcd == seek_mm && m_last_subq.absolute_second_bcd == seek_ss &&
|
||||||
m_last_subq.absolute_frame_bcd == seek_ff);
|
m_last_subq.absolute_frame_bcd == seek_ff);
|
||||||
|
@ -1260,6 +1259,8 @@ void CDROM::DoSectorRead()
|
||||||
if (!m_media->ReadRawSector(raw_sector))
|
if (!m_media->ReadRawSector(raw_sector))
|
||||||
Panic("Sector read failed");
|
Panic("Sector read failed");
|
||||||
|
|
||||||
|
if (subq.IsCRCValid())
|
||||||
|
{
|
||||||
m_last_subq = subq;
|
m_last_subq = subq;
|
||||||
|
|
||||||
if (is_data_sector && m_drive_state == DriveState::Reading)
|
if (is_data_sector && m_drive_state == DriveState::Reading)
|
||||||
|
@ -1279,6 +1280,13 @@ void CDROM::DoSectorRead()
|
||||||
Log_WarningPrintf("Skipping sector %u as it is a %s sector and we're not %s", m_media->GetPositionOnDisc() - 1,
|
Log_WarningPrintf("Skipping sector %u as it is a %s sector and we're not %s", m_media->GetPositionOnDisc() - 1,
|
||||||
is_data_sector ? "data" : "audio", is_data_sector ? "reading" : "playing");
|
is_data_sector ? "data" : "audio", is_data_sector ? "reading" : "playing");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const CDImage::Position pos(CDImage::Position::FromLBA(m_media->GetPositionOnDisc() - 1));
|
||||||
|
Log_DevPrintf("Skipping sector %u [%02u:%02u:%02u] due to invalid subchannel Q", m_media->GetPositionOnDisc() - 1,
|
||||||
|
pos.minute, pos.second, pos.frame);
|
||||||
|
}
|
||||||
|
|
||||||
m_drive_remaining_ticks += GetTicksForRead();
|
m_drive_remaining_ticks += GetTicksForRead();
|
||||||
m_system->SetDowncount(m_drive_remaining_ticks);
|
m_system->SetDowncount(m_drive_remaining_ticks);
|
||||||
|
|
Loading…
Reference in a new issue