From 5d0a6f88ad9b61595de92aaa37fbfbd62ca125fe Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sat, 23 Nov 2019 19:13:48 +1000 Subject: [PATCH] CDROM: Header valid/playing should not be set on SeekL Fixes Syphon Filter locking up on boot. --- src/core/cdrom.cpp | 9 ++++----- src/core/cdrom.h | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/core/cdrom.cpp b/src/core/cdrom.cpp index d74e03957..7bdf0e4e7 100644 --- a/src/core/cdrom.cpp +++ b/src/core/cdrom.cpp @@ -1125,7 +1125,7 @@ void CDROM::DoSeekComplete() seek_okay &= m_media->Seek(m_media->GetPositionOnDisc() - 1); if (seek_okay) { - ProcessDataSectorHeader(raw_sector); + ProcessDataSectorHeader(raw_sector, false); // ensure the location matches up (it should) const auto [seek_mm, seek_ss, seek_ff] = m_seek_position.ToBCD(); @@ -1280,18 +1280,17 @@ void CDROM::DoSectorRead() m_system->SetDowncount(m_drive_remaining_ticks); } -void CDROM::ProcessDataSectorHeader(const u8* raw_sector) +void CDROM::ProcessDataSectorHeader(const u8* raw_sector, bool set_valid) { std::memcpy(&m_last_sector_header, &raw_sector[SECTOR_SYNC_SIZE], sizeof(m_last_sector_header)); std::memcpy(&m_last_sector_subheader, &raw_sector[SECTOR_SYNC_SIZE + sizeof(m_last_sector_header)], sizeof(m_last_sector_subheader)); - - m_secondary_status.header_valid = true; + m_secondary_status.header_valid |= set_valid; } void CDROM::ProcessDataSector(const u8* raw_sector, const CDImage::SubChannelQ& subq) { - ProcessDataSectorHeader(raw_sector); + ProcessDataSectorHeader(raw_sector, true); Log_DevPrintf("Read sector %u: mode %u submode 0x%02X", m_media->GetPositionOnDisc() - 1, ZeroExtend32(m_last_sector_header.sector_mode), ZeroExtend32(m_last_sector_subheader.submode.bits)); diff --git a/src/core/cdrom.h b/src/core/cdrom.h index 420eb3dca..95f3a9f34 100644 --- a/src/core/cdrom.h +++ b/src/core/cdrom.h @@ -206,7 +206,7 @@ private: void DoIDRead(); void DoTOCRead(); void DoSectorRead(); - void ProcessDataSectorHeader(const u8* raw_sector); + void ProcessDataSectorHeader(const u8* raw_sector, bool set_valid); void ProcessDataSector(const u8* raw_sector, const CDImage::SubChannelQ& subq); void ProcessXAADPCMSector(const u8* raw_sector, const CDImage::SubChannelQ& subq); void ProcessCDDASector(const u8* raw_sector, const CDImage::SubChannelQ& subq);