CDROMAsyncReader: Support reading ahead more sectors

This commit is contained in:
Connor McLaughlin
2021-07-12 21:08:04 +10:00
parent 552b0098ef
commit a32ef4a963
10 changed files with 351 additions and 162 deletions

View File

@ -99,8 +99,8 @@ void CDROM::Initialize()
[](void* param, TickCount ticks, TickCount ticks_late) { static_cast<CDROM*>(param)->ExecuteDrive(ticks_late); },
this, false);
if (g_settings.cdrom_read_thread)
m_reader.StartThread();
if (g_settings.cdrom_readahead_sectors > 0)
m_reader.StartThread(g_settings.cdrom_readahead_sectors);
Reset();
}
@ -232,7 +232,8 @@ void CDROM::SoftReset(TickCount ticks_late)
{
m_drive_state = DriveState::SeekingImplicit;
m_drive_event->SetIntervalAndSchedule(total_ticks);
m_reader.QueueReadSector(0);
m_requested_lba = 0;
m_reader.QueueReadSector(m_requested_lba);
m_seek_start_lba = m_current_lba;
m_seek_end_lba = 0;
}
@ -306,14 +307,12 @@ bool CDROM::DoState(StateWrapper& sw)
}
sw.Do(&m_audio_fifo);
u32 requested_sector = (sw.IsWriting() ? (m_reader.WaitForReadToComplete(), m_reader.GetLastReadSector()) : 0);
sw.Do(&requested_sector);
sw.Do(&m_requested_lba);
if (sw.IsReading())
{
if (m_reader.HasMedia())
m_reader.QueueReadSector(requested_sector);
m_reader.QueueReadSector(m_requested_lba);
UpdateCommandEvent();
m_drive_event->SetState(!IsDriveIdle());
}
@ -397,15 +396,18 @@ std::unique_ptr<CDImage> CDROM::RemoveMedia(bool force /* = false */)
return image;
}
void CDROM::SetUseReadThread(bool enabled)
void CDROM::SetReadaheadSectors(u32 readahead_sectors)
{
if (enabled == m_reader.IsUsingThread())
const bool want_thread = (readahead_sectors > 0);
if (want_thread == m_reader.IsUsingThread() && m_reader.GetReadaheadCount() == readahead_sectors)
return;
if (enabled)
m_reader.StartThread();
if (want_thread)
m_reader.StartThread(readahead_sectors);
else
m_reader.StopThread();
m_reader.QueueReadSector(m_requested_lba);
}
void CDROM::CPUClockChanged()
@ -1417,8 +1419,6 @@ void CDROM::ExecuteCommand(TickCount ticks_late)
Log_DebugPrintf("CDROM GetTN command");
if (CanReadMedia())
{
m_reader.WaitForReadToComplete();
Log_DevPrintf("GetTN -> %u %u", m_reader.GetMedia()->GetFirstTrackNumber(),
m_reader.GetMedia()->GetLastTrackNumber());
@ -1757,7 +1757,8 @@ void CDROM::BeginReading(TickCount ticks_late /* = 0 */, bool after_seek /* = fa
m_current_read_sector_buffer = 0;
m_current_write_sector_buffer = 0;
m_reader.QueueReadSector(m_current_lba);
m_requested_lba = m_current_lba;
m_reader.QueueReadSector(m_requested_lba);
}
void CDROM::BeginPlaying(u8 track, TickCount ticks_late /* = 0 */, bool after_seek /* = false */)
@ -1799,7 +1800,8 @@ void CDROM::BeginPlaying(u8 track, TickCount ticks_late /* = 0 */, bool after_se
m_current_read_sector_buffer = 0;
m_current_write_sector_buffer = 0;
m_reader.QueueReadSector(m_current_lba);
m_requested_lba = m_current_lba;
m_reader.QueueReadSector(m_requested_lba);
}
void CDROM::BeginSeeking(bool logical, bool read_after_seek, bool play_after_seek)
@ -1828,7 +1830,8 @@ void CDROM::BeginSeeking(bool logical, bool read_after_seek, bool play_after_see
m_seek_start_lba = m_current_lba;
m_seek_end_lba = seek_lba;
m_reader.QueueReadSector(seek_lba);
m_requested_lba = seek_lba;
m_reader.QueueReadSector(m_requested_lba);
}
void CDROM::UpdatePositionWhileSeeking()
@ -2022,9 +2025,10 @@ bool CDROM::CompleteSeek()
}
}
}
m_current_lba = m_reader.GetLastReadSector();
}
m_current_lba = m_reader.GetLastReadSector();
m_physical_lba = m_current_lba;
m_physical_lba_update_tick = TimingEvents::GetGlobalTickCounter();
m_physical_lba_update_carry = 0;
@ -2275,7 +2279,8 @@ void CDROM::DoSectorRead()
is_data_sector ? "data" : "audio", is_data_sector ? "reading" : "playing");
}
m_reader.QueueReadSector(next_sector);
m_requested_lba = next_sector;
m_reader.QueueReadSector(m_requested_lba);
}
void CDROM::ProcessDataSectorHeader(const u8* raw_sector)
@ -2698,12 +2703,13 @@ void CDROM::DrawDebugWindow()
if (media->HasSubImages())
{
ImGui::Text("Filename: %s [Subimage %u of %u]", media->GetFileName().c_str(), media->GetCurrentSubImage() + 1u,
media->GetSubImageCount());
ImGui::Text("Filename: %s [Subimage %u of %u] [%u buffered sectors]", media->GetFileName().c_str(),
media->GetCurrentSubImage() + 1u, media->GetSubImageCount(), m_reader.GetBufferedSectorCount());
}
else
{
ImGui::Text("Filename: %s", media->GetFileName().c_str());
ImGui::Text("Filename: %s [%u buffered sectors]", media->GetFileName().c_str(),
m_reader.GetBufferedSectorCount());
}
ImGui::Text("Disc Position: MSF[%02u:%02u:%02u] LBA[%u]", disc_position.minute, disc_position.second,