CDImage: Remove cursor-based read interface

cdrom-async-readahead
Stenzek 2 weeks ago
parent cd04ecb7f4
commit 3e8626896a
No known key found for this signature in database

@ -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<u8>(media->GetTrackNumber())));
ImGui::Text("Track Position: Number[%u] MSF[%02u:%02u:%02u] LBA[%u]", media->GetTrackNumber(),
s_state.current_lba - media->GetTrackStartPosition(static_cast<u8>(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<u8>(media->GetTrackNumber()));
s_state.current_lba - media->GetTrackStartPosition(static_cast<u8>(current_index->track_number));
const std::string* current_file = LookupFileMap(track_lba, &current_file_start_lba, &current_file_end_lba);
if (current_file)
{

@ -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<Sector>(&sector, 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<Sector> 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);

@ -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<u32>(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;
};

@ -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<Sector> sectors, const Index& index, LBA lba_in_index,

@ -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

@ -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<CDImage::TrackMode> CDImageCueSheet::DetectSingleFileTrackMode(TrackFileInterface* fi, const char* path,

@ -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<Sector> 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<Sector> 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<Sector> sectors, const Index& index, LBA lba_in_index,

@ -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;
}

@ -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<Sector> sectors, const Index& index, LBA lba_in_index,

@ -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

@ -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)

Loading…
Cancel
Save