From 3e8626896aeb76e97858952c031762b8acbc914c Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 12 Sep 2026 15:49:10 +1000 Subject: [PATCH] CDImage: Remove cursor-based read interface --- src/core/cdrom.cpp | 22 +++++--- src/util/cd_image.cpp | 102 ----------------------------------- src/util/cd_image.h | 33 +----------- src/util/cd_image_ccd.cpp | 2 +- src/util/cd_image_chd.cpp | 2 +- src/util/cd_image_cue.cpp | 4 +- src/util/cd_image_device.cpp | 6 +-- src/util/cd_image_m3u.cpp | 3 -- src/util/cd_image_mds.cpp | 2 +- src/util/cd_image_memory.cpp | 2 +- src/util/cd_image_pbp.cpp | 2 +- 11 files changed, 28 insertions(+), 152 deletions(-) diff --git a/src/core/cdrom.cpp b/src/core/cdrom.cpp index 4f0dfe5f7..e6f1ea5e8 100644 --- a/src/core/cdrom.cpp +++ b/src/core/cdrom.cpp @@ -2901,7 +2901,12 @@ void CDROM::BeginPlaying(u8 track, bool after_seek) if (track > s_reader.GetMedia()->GetTrackCount()) { // restart current track - track = Truncate8(s_reader.GetMedia()->GetTrackNumber()); + const CDImage* media = s_reader.GetMedia(); + const CDImage::Index* current_index = media->GetIndexForDiscPosition(s_state.current_lba); + track = (current_index && current_index->track_number >= media->GetFirstTrackNumber() && + current_index->track_number <= media->GetLastTrackNumber()) ? + Truncate8(current_index->track_number) : + Truncate8(media->GetLastTrackNumber()); } s_state.setloc_position = s_reader.GetMedia()->GetTrackStartMSFPosition(track); @@ -4191,6 +4196,7 @@ void CDROM::DrawDebugWindow(float scale) { const CDImage* media = s_reader.GetMedia(); const CDImage::Position disc_position = CDImage::Position::FromLBA(s_state.current_lba); + const CDImage::Index* current_index = media->GetIndexForDiscPosition(s_state.current_lba); const float start_y = ImGui::GetCursorPosY(); if (media->HasSubImages()) @@ -4206,15 +4212,19 @@ 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()) + if (!current_index) + { + ImGui::Text("Track Position: Outside image"); + } + else if (current_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(static_cast(current_index->track_number))); + ImGui::Text("Track Position: Number[%u] MSF[%02u:%02u:%02u] LBA[%u]", current_index->track_number, track_position.minute, track_position.second, track_position.frame, track_position.ToLBA()); } @@ -4224,14 +4234,14 @@ void CDROM::DrawDebugWindow(float scale) if (s_state.show_current_file) { - if (media->GetTrackNumber() == 1) + if (current_index && current_index->track_number == 1) { if (!s_state.file_map_created) CreateFileMap(); u32 current_file_start_lba, current_file_end_lba; const u32 track_lba = - s_state.current_lba - media->GetTrackStartPosition(static_cast(media->GetTrackNumber())); + s_state.current_lba - media->GetTrackStartPosition(static_cast(current_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.cpp b/src/util/cd_image.cpp index a1373030f..62338980f 100644 --- a/src/util/cd_image.cpp +++ b/src/util/cd_image.cpp @@ -299,88 +299,6 @@ const CDImage::CDImage::Index& CDImage::GetIndex(u32 i) const return m_indices[i]; } -bool CDImage::Seek(LBA lba) -{ - const Index* new_index; - if (m_current_index && lba >= m_current_index->start_lba_on_disc && - (lba - m_current_index->start_lba_on_disc) < m_current_index->length) - { - new_index = m_current_index; - } - else - { - new_index = GetIndexForDiscPosition(lba); - if (!new_index) - return false; - } - - const LBA new_index_offset = lba - new_index->start_lba_on_disc; - if (new_index_offset >= new_index->length) - return false; - - m_current_index = new_index; - m_position_on_disc = lba; - m_position_in_index = new_index_offset; - m_position_in_track = new_index->start_lba_in_track + new_index_offset; - return true; -} - -bool CDImage::Seek(u32 track_number, const Position& pos_in_track) -{ - if (track_number < 1 || track_number > m_tracks.size()) - return false; - - const Track& track = m_tracks[track_number - 1]; - const LBA pos_lba = pos_in_track.ToLBA(); - if (pos_lba >= track.length) - return false; - - return Seek(track.start_lba + pos_lba); -} - -bool CDImage::Seek(const Position& pos) -{ - return Seek(pos.ToLBA()); -} - -bool CDImage::Seek(u32 track_number, LBA lba) -{ - if (track_number < 1 || track_number > m_tracks.size()) - return false; - - const Track& track = m_tracks[track_number - 1]; - return Seek(track.start_lba + lba); -} - -bool CDImage::ReadRawSector(void* buffer, SubChannelQ* subq) -{ - if (m_position_in_index == m_current_index->length) - { - if (!Seek(m_position_on_disc)) - return false; - } - - Sector sector; - if (ReadSectors( - m_position_on_disc, std::span(§or, 1), - (buffer ? (subq ? SectorReadMode::DataAndSubQ : SectorReadMode::DataOnly) : SectorReadMode::SubQOnly)) != 1) - { - ERROR_LOG("Read of LBA {} failed", m_position_on_disc); - Seek(m_position_on_disc); - return false; - } - - if (buffer) - std::memcpy(buffer, sector.data.data(), sector.data.size()); - if (subq) - *subq = sector.subq; - - m_position_on_disc++; - m_position_in_index++; - m_position_in_track++; - return true; -} - u32 CDImage::ReadSectors(LBA lba, std::span sectors, SectorReadMode mode) { const bool read_data = (mode != SectorReadMode::SubQOnly); @@ -515,10 +433,6 @@ void CDImage::ClearTOC() m_lba_count = 0; m_indices.clear(); m_tracks.clear(); - m_current_index = nullptr; - m_position_in_index = 0; - m_position_in_track = 0; - m_position_on_disc = 0; } void CDImage::CopyTOC(const CDImage* image) @@ -542,10 +456,6 @@ void CDImage::CopyTOC(const CDImage* image) std::memcpy(&new_track, &track, sizeof(new_track)); m_tracks.push_back(new_track); } - m_current_index = nullptr; - m_position_in_index = 0; - m_position_in_track = 0; - m_position_on_disc = 0; } const CDImage::Index* CDImage::GetIndexForDiscPosition(LBA pos) const @@ -565,18 +475,6 @@ const CDImage::Index* CDImage::GetIndexForDiscPosition(LBA pos) const return nullptr; } -const CDImage::Index* CDImage::GetIndexForTrackPosition(u32 track_number, LBA track_pos) const -{ - if (track_number < 1 || track_number > m_tracks.size()) - return nullptr; - - const Track& track = m_tracks[track_number - 1]; - if (track_pos >= track.length) - return nullptr; - - return GetIndexForDiscPosition(track.start_lba + track_pos); -} - bool CDImage::GenerateSubChannelQ(SubChannelQ* subq, LBA lba) const { const Index* index = GetIndexForDiscPosition(lba); diff --git a/src/util/cd_image.h b/src/util/cd_image.h index 2a1090f45..212ff0846 100644 --- a/src/util/cd_image.h +++ b/src/util/cd_image.h @@ -232,13 +232,7 @@ public: // Accessors. const std::string& GetPath() const { return m_path; } - LBA GetPositionOnDisc() const { return m_position_on_disc; } - Position GetMSFPositionOnDisc() const { return Position::FromLBA(m_position_on_disc); } - LBA GetPositionInTrack() const { return m_position_in_track; } - Position GetMSFPositionInTrack() const { return Position::FromLBA(m_position_in_track); } LBA GetLBACount() const { return m_lba_count; } - u32 GetIndexNumber() const { return m_current_index->index_number; } - u32 GetTrackNumber() const { return m_current_index->track_number; } u32 GetTrackCount() const { return static_cast(m_tracks.size()); } LBA GetTrackStartPosition(u32 track) const; Position GetTrackStartMSFPosition(u32 track) const; @@ -255,20 +249,8 @@ public: const Track& GetTrack(u32 track) const; const Index& GetIndex(u32 i) const; - // Seek to data LBA. - bool Seek(LBA lba); - - // Seek to disc position (MSF). - bool Seek(const Position& pos); - - // Seek to track and position. - bool Seek(u32 track_number, const Position& pos_in_track); - - // Seek to track and LBA. - bool Seek(u32 track_number, LBA lba); - - // Read a single raw sector, and subchannel from the current LBA. - bool ReadRawSector(void* buffer, SubChannelQ* subq); + /// Returns the index containing the specified absolute disc LBA, or nullptr when the LBA is outside the image. + const Index* GetIndexForDiscPosition(LBA pos) const; /// Reads the requested components of consecutive raw sectors beginning at the specified LBA, leaving unrequested /// components untouched. Returns the number of sectors successfully read. @@ -321,9 +303,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(); @@ -336,12 +315,4 @@ protected: private: // Helper function for filling in raw sector headers. static void FillRawSectorSyncAndHeader(u8* sector, LBA lba, u8 sector_mode); - - // Position on disc. - LBA m_position_on_disc = 0; - - // Position in track/index. - const Index* m_current_index = nullptr; - LBA m_position_in_index = 0; - LBA m_position_in_track = 0; }; diff --git a/src/util/cd_image_ccd.cpp b/src/util/cd_image_ccd.cpp index b9e1c68b2..6efc2463f 100644 --- a/src/util/cd_image_ccd.cpp +++ b/src/util/cd_image_ccd.cpp @@ -387,7 +387,7 @@ bool CDImageCCD::OpenAndParse(const char* path, Error* error) m_path = path; - return Seek(1, Position{0, 0, 0}); + return true; } u32 CDImageCCD::ReadSectorsFromIndex(std::span sectors, const Index& index, LBA lba_in_index, diff --git a/src/util/cd_image_chd.cpp b/src/util/cd_image_chd.cpp index 14a3cfdcc..c702ff5c1 100644 --- a/src/util/cd_image_chd.cpp +++ b/src/util/cd_image_chd.cpp @@ -413,7 +413,7 @@ bool CDImageCHD::Open(const char* path, Error* error) m_lba_count = disc_lba; AddLeadOutIndex(); - return Seek(1, Position{0, 0, 0}); + return true; } bool CDImageCHD::HasSubchannelData() const diff --git a/src/util/cd_image_cue.cpp b/src/util/cd_image_cue.cpp index 0c2f24c71..44a4681eb 100644 --- a/src/util/cd_image_cue.cpp +++ b/src/util/cd_image_cue.cpp @@ -814,7 +814,7 @@ bool CDImageCueSheet::OpenAndParseCueSheet(const char* path, Error* error) m_lba_count = disc_lba; AddLeadOutIndex(); - return Seek(1, Position{0, 0, 0}); + return true; } bool CDImageCueSheet::OpenAndParseSingleFile(const char* path, Error* error) @@ -874,7 +874,7 @@ bool CDImageCueSheet::OpenAndParseSingleFile(const char* path, Error* error) AddLeadOutIndex(); - return Seek(1, Position{0, 0, 0}); + return true; } std::optional CDImageCueSheet::DetectSingleFileTrackMode(TrackFileInterface* fi, const char* path, diff --git a/src/util/cd_image_device.cpp b/src/util/cd_image_device.cpp index a93a8f320..c3b116aaa 100644 --- a/src/util/cd_image_device.cpp +++ b/src/util/cd_image_device.cpp @@ -439,7 +439,7 @@ bool CDImageDeviceWin32::Open(const char* path, Error* error) return false; } - return Seek(1, Position{0, 0, 0}); + return true; } u32 CDImageDeviceWin32::ReadSectorsFromIndex(std::span sectors, const Index& index, LBA lba_in_index, @@ -974,7 +974,7 @@ bool CDImageDeviceLinux::Open(const char* filename, Error* error) if (!DetermineReadMode(error)) return false; - return Seek(1, Position{0, 0, 0}); + return true; } u32 CDImageDeviceLinux::ReadSectorsFromIndex(std::span sectors, const Index& index, LBA lba_in_index, @@ -1516,7 +1516,7 @@ bool CDImageDeviceMacOS::Open(const char* filename, Error* error) if (!DetermineReadMode(error)) return false; - return Seek(1, Position{0, 0, 0}); + return true; } u32 CDImageDeviceMacOS::ReadSectorsFromIndex(std::span sectors, const Index& index, LBA lba_in_index, diff --git a/src/util/cd_image_m3u.cpp b/src/util/cd_image_m3u.cpp index 7cdee181a..17d3cf344 100644 --- a/src/util/cd_image_m3u.cpp +++ b/src/util/cd_image_m3u.cpp @@ -147,9 +147,6 @@ bool CDImageM3u::SwitchSubImage(u32 index, Error* error) CopyTOC(new_image.get()); m_current_image = std::move(new_image); m_current_image_index = index; - if (!Seek(1, Position{0, 0, 0})) - Panic("Failed to seek to start after sub-image change."); - return true; } diff --git a/src/util/cd_image_mds.cpp b/src/util/cd_image_mds.cpp index 4bd81ab52..1826be5cb 100644 --- a/src/util/cd_image_mds.cpp +++ b/src/util/cd_image_mds.cpp @@ -248,7 +248,7 @@ bool CDImageMDS::OpenAndParse(const char* path, Error* error) m_lba_count = m_tracks.back().start_lba + m_tracks.back().length; AddLeadOutIndex(); - return Seek(1, Position{0, 0, 0}); + return true; } u32 CDImageMDS::ReadSectorsFromIndex(std::span sectors, const Index& index, LBA lba_in_index, diff --git a/src/util/cd_image_memory.cpp b/src/util/cd_image_memory.cpp index a6637ee0d..4f3f3e887 100644 --- a/src/util/cd_image_memory.cpp +++ b/src/util/cd_image_memory.cpp @@ -149,7 +149,7 @@ bool CDImageMemory::CopyImage(CDImage* image, ProgressCallback* progress, Error* m_path = image->GetPath(); m_lba_count = image->GetLBACount(); - return Seek(1, Position{0, 0, 0}); + return true; } bool CDImageMemory::HasSubchannelData() const diff --git a/src/util/cd_image_pbp.cpp b/src/util/cd_image_pbp.cpp index f9611ed44..a02edad9d 100644 --- a/src/util/cd_image_pbp.cpp +++ b/src/util/cd_image_pbp.cpp @@ -751,7 +751,7 @@ bool CDImagePBP::OpenDisc(u32 index, Error* error) } m_current_disc = index; - return Seek(1, Position{0, 0, 0}); + return true; } const std::string* CDImagePBP::LookupStringSFOTableEntry(const char* key, const SFOTable& table)