From c309ca331ec25bf65ad4ad3fe38109ffa12a0db6 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 19 Sep 2026 15:48:07 +1000 Subject: [PATCH] CDROM: Fix possible incorrect restart track when playing If the readahead passes a track boundary. --- src/core/cdrom.cpp | 22 ++++++++++++++-------- src/util/cd_image.h | 5 ++--- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/core/cdrom.cpp b/src/core/cdrom.cpp index 9535124e7..6f311c855 100644 --- a/src/core/cdrom.cpp +++ b/src/core/cdrom.cpp @@ -2894,7 +2894,10 @@ void CDROM::BeginPlaying(u8 track, bool after_seek) if (track > media->GetTrackCount()) { // restart current track - track = Truncate8(media->GetTrackNumber()); + const u32 track_count = media->GetTrackCount(); + const CDImage::Index* const index = media->GetIndexForDiscPosition(s_state.current_lba); + track = Truncate8(std::min(index ? index->track_number : track_count, track_count)); + s_state.play_track_number_bcd = BinaryToBCD(track); } s_state.setloc_position = media->GetTrackStartMSFPosition(track); @@ -4197,15 +4200,16 @@ void CDROM::DrawDebugWindow(float scale) ImGui::Text("Disc Position: MSF[%02u:%02u:%02u] LBA[%u]", disc_position.minute, disc_position.second, disc_position.frame, disc_position.ToLBA()); - if (media->GetTrackNumber() > media->GetTrackCount()) + const CDImage::Index* index = media->GetIndexForDiscPosition(s_state.current_lba); + if (!index || index->track_number > media->GetTrackCount()) { ImGui::Text("Track Position: Lead-out"); } else { const CDImage::Position track_position = CDImage::Position::FromLBA( - s_state.current_lba - media->GetTrackStartPosition(static_cast(media->GetTrackNumber()))); - ImGui::Text("Track Position: Number[%u] MSF[%02u:%02u:%02u] LBA[%u]", media->GetTrackNumber(), + s_state.current_lba - media->GetTrackStartPosition(Truncate8(index->track_number))); + ImGui::Text("Track Position: Number[%u] MSF[%02u:%02u:%02u] LBA[%u]", index->track_number, track_position.minute, track_position.second, track_position.frame, track_position.ToLBA()); } @@ -4215,14 +4219,16 @@ void CDROM::DrawDebugWindow(float scale) if (s_state.show_current_file) { - if (media->GetTrackNumber() == 1) + if (index && index->track_number == 1) { if (!s_state.file_map_created) - CreateFileMap(); + { + Host::RunOnCoreThread(static_cast(&CDROM::CreateFileMap)); + return; + } u32 current_file_start_lba, current_file_end_lba; - const u32 track_lba = - s_state.current_lba - media->GetTrackStartPosition(static_cast(media->GetTrackNumber())); + const u32 track_lba = s_state.current_lba - media->GetTrackStartPosition(Truncate8(index->track_number)); const std::string* current_file = LookupFileMap(track_lba, ¤t_file_start_lba, ¤t_file_end_lba); if (current_file) { diff --git a/src/util/cd_image.h b/src/util/cd_image.h index 5ef3cc880..535bb5aa2 100644 --- a/src/util/cd_image.h +++ b/src/util/cd_image.h @@ -233,6 +233,8 @@ public: u32 GetFirstTrackNumber() const { return m_tracks.front().track_number; } u32 GetLastTrackNumber() const { return m_tracks.back().track_number; } u32 GetIndexCount() const { return static_cast(m_indices.size()); } + const Index* GetIndexForDiscPosition(LBA pos) const; + const Index* GetIndexForTrackPosition(u32 track_number, LBA track_pos) const; const std::vector& GetTracks() const { return m_tracks; } const std::vector& GetIndices() const { return m_indices; } const Track& GetTrack(u32 track) const; @@ -298,9 +300,6 @@ protected: void ClearTOC(); void CopyTOC(const CDImage* image); - const Index* GetIndexForDiscPosition(LBA pos) const; - const Index* GetIndexForTrackPosition(u32 track_number, LBA track_pos) const; - /// Synthesis of lead-out data. void AddLeadOutIndex();