CDROM: Don't send reports when subq isn't valid

This commit is contained in:
Stenzek 2024-03-26 00:53:01 +10:00
parent 28fd6c0ea4
commit de1e5b24fb
No known key found for this signature in database

View file

@ -277,7 +277,7 @@ static void DoSectorRead();
static void ProcessDataSectorHeader(const u8* raw_sector); static void ProcessDataSectorHeader(const u8* raw_sector);
static void ProcessDataSector(const u8* raw_sector, const CDImage::SubChannelQ& subq); static void ProcessDataSector(const u8* raw_sector, const CDImage::SubChannelQ& subq);
static void ProcessXAADPCMSector(const u8* raw_sector, const CDImage::SubChannelQ& subq); static void ProcessXAADPCMSector(const u8* raw_sector, const CDImage::SubChannelQ& subq);
static void ProcessCDDASector(const u8* raw_sector, const CDImage::SubChannelQ& subq); static void ProcessCDDASector(const u8* raw_sector, const CDImage::SubChannelQ& subq, bool subq_valid);
static void StopReadingWithDataEnd(); static void StopReadingWithDataEnd();
static void StartMotor(); static void StartMotor();
static void StopMotor(); static void StopMotor();
@ -1214,7 +1214,7 @@ void CDROM::UpdateStatusRegister()
void CDROM::UpdateInterruptRequest() void CDROM::UpdateInterruptRequest()
{ {
InterruptController::SetLineState(InterruptController::IRQ::CDROM, InterruptController::SetLineState(InterruptController::IRQ::CDROM,
(s_interrupt_flag_register & s_interrupt_enable_register) != 0); (s_interrupt_flag_register & s_interrupt_enable_register) != 0);
} }
bool CDROM::HasPendingDiscEvent() bool CDROM::HasPendingDiscEvent()
@ -2837,7 +2837,7 @@ void CDROM::DoSectorRead()
else if (!is_data_sector && else if (!is_data_sector &&
(s_drive_state == DriveState::Playing || (s_drive_state == DriveState::Reading && s_mode.cdda))) (s_drive_state == DriveState::Playing || (s_drive_state == DriveState::Reading && s_mode.cdda)))
{ {
ProcessCDDASector(s_reader.GetSectorBuffer().data(), subq); ProcessCDDASector(s_reader.GetSectorBuffer().data(), subq, subq_valid);
if (s_fast_forward_rate != 0) if (s_fast_forward_rate != 0)
next_sector = s_current_lba + SignExtend32(s_fast_forward_rate); next_sector = s_current_lba + SignExtend32(s_fast_forward_rate);
@ -2856,7 +2856,7 @@ void CDROM::DoSectorRead()
s_reader.QueueReadSector(s_requested_lba); s_reader.QueueReadSector(s_requested_lba);
} }
void CDROM::ProcessDataSectorHeader(const u8* raw_sector) ALWAYS_INLINE_RELEASE void CDROM::ProcessDataSectorHeader(const u8* raw_sector)
{ {
std::memcpy(&s_last_sector_header, &raw_sector[SECTOR_SYNC_SIZE], sizeof(s_last_sector_header)); std::memcpy(&s_last_sector_header, &raw_sector[SECTOR_SYNC_SIZE], sizeof(s_last_sector_header));
std::memcpy(&s_last_sector_subheader, &raw_sector[SECTOR_SYNC_SIZE + sizeof(s_last_sector_header)], std::memcpy(&s_last_sector_subheader, &raw_sector[SECTOR_SYNC_SIZE + sizeof(s_last_sector_header)],
@ -2864,7 +2864,7 @@ void CDROM::ProcessDataSectorHeader(const u8* raw_sector)
s_last_sector_header_valid = true; s_last_sector_header_valid = true;
} }
void CDROM::ProcessDataSector(const u8* raw_sector, const CDImage::SubChannelQ& subq) ALWAYS_INLINE_RELEASE void CDROM::ProcessDataSector(const u8* raw_sector, const CDImage::SubChannelQ& subq)
{ {
const u32 sb_num = (s_current_write_sector_buffer + 1) % NUM_SECTOR_BUFFERS; const u32 sb_num = (s_current_write_sector_buffer + 1) % NUM_SECTOR_BUFFERS;
Log_DevPrintf("Read sector %u [%s]: mode %u submode 0x%02X into buffer %u", s_current_lba, Log_DevPrintf("Read sector %u [%s]: mode %u submode 0x%02X into buffer %u", s_current_lba,
@ -3062,7 +3062,7 @@ void CDROM::ResetAudioDecoder()
s_audio_fifo.Clear(); s_audio_fifo.Clear();
} }
void CDROM::ProcessXAADPCMSector(const u8* raw_sector, const CDImage::SubChannelQ& subq) ALWAYS_INLINE_RELEASE void CDROM::ProcessXAADPCMSector(const u8* raw_sector, const CDImage::SubChannelQ& subq)
{ {
// Check for automatic ADPCM filter. // Check for automatic ADPCM filter.
if (s_mode.xa_filter && (s_last_sector_subheader.file_number != s_xa_filter_file_number || if (s_mode.xa_filter && (s_last_sector_subheader.file_number != s_xa_filter_file_number ||
@ -3183,13 +3183,14 @@ static s16 GetPeakVolume(const u8* raw_sector, u8 channel)
#endif #endif
} }
void CDROM::ProcessCDDASector(const u8* raw_sector, const CDImage::SubChannelQ& subq) ALWAYS_INLINE_RELEASE void CDROM::ProcessCDDASector(const u8* raw_sector, const CDImage::SubChannelQ& subq,
bool subq_valid)
{ {
// For CDDA sectors, the whole sector contains the audio data. // For CDDA sectors, the whole sector contains the audio data.
Log_DevPrintf("Read sector %u as CDDA", s_current_lba); Log_DevPrintf("Read sector %u as CDDA", s_current_lba);
// The reporting doesn't happen if we're reading with the CDDA mode bit set. // The reporting doesn't happen if we're reading with the CDDA mode bit set.
if (s_drive_state == DriveState::Playing && s_mode.report_audio) if (s_drive_state == DriveState::Playing && s_mode.report_audio && subq_valid)
{ {
const u8 frame_nibble = subq.absolute_frame_bcd >> 4; const u8 frame_nibble = subq.absolute_frame_bcd >> 4;