CDROM: Revamp/improve preload image procedure
This commit is contained in:
@ -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())
|
||||
|
||||
Reference in New Issue
Block a user