CDROM: Revamp/improve preload image procedure

This commit is contained in:
Connor McLaughlin
2022-07-23 13:23:54 +10:00
parent 8d7fdae683
commit a1edddc59d
9 changed files with 130 additions and 64 deletions

View File

@ -57,6 +57,45 @@ std::unique_ptr<CDImage> CDROMAsyncReader::RemoveMedia()
return std::move(m_media);
}
bool CDROMAsyncReader::Precache(ProgressCallback* callback)
{
WaitForIdle();
std::unique_lock lock(m_mutex);
if (!m_media)
return false;
else if (m_media->IsPrecached())
return true;
EmptyBuffers();
const CDImage::PrecacheResult res = m_media->Precache(callback);
if (res == CDImage::PrecacheResult::Unsupported)
{
// fall back to copy precaching
std::unique_ptr<CDImage> memory_image = CDImage::CreateMemoryImage(m_media.get(), callback);
if (memory_image)
{
const CDImage::LBA lba = m_media->GetPositionOnDisc();
if (!memory_image->Seek(lba))
{
Log_ErrorPrintf("Failed to seek to LBA %u in memory image", lba);
return false;
}
m_media.reset();
m_media = std::move(memory_image);
return true;
}
else
{
return false;
}
}
return (res == CDImage::PrecacheResult::Success);
}
void CDROMAsyncReader::QueueReadSector(CDImage::LBA lba)
{
if (!IsUsingThread())