diff --git a/src/common/cd_image_chd.cpp b/src/common/cd_image_chd.cpp index 682c25a55..b87b5dabb 100644 --- a/src/common/cd_image_chd.cpp +++ b/src/common/cd_image_chd.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include Log_SetChannel(CDImageCHD); @@ -51,6 +52,7 @@ public: bool ReadSubChannelQ(SubChannelQ* subq, const Index& index, LBA lba_in_index) override; bool HasNonStandardSubchannel() const override; + PrecacheResult Precache(ProgressCallback* progress) override; protected: bool ReadSectorFromIndex(void* buffer, const Index& index, LBA lba_in_index) override; @@ -299,6 +301,20 @@ bool CDImageCHD::HasNonStandardSubchannel() const return (m_sbi.GetReplacementSectorCount() > 0); } +CDImage::PrecacheResult CDImageCHD::Precache(ProgressCallback* progress) +{ + const std::string_view title(FileSystem::GetFileNameFromPath(m_filename)); + progress->SetFormattedStatusText("Precaching %.*s...", static_cast(title.size()), title.data()); + progress->SetProgressRange(100); + + auto callback = [](size_t pos, size_t total, void* param) { + const u32 percent = static_cast((pos * 100) / total); + static_cast(param)->SetProgressValue(std::min(percent, 100)); + }; + return (chd_precache_progress(m_chd, callback, progress) == CHDERR_NONE) ? CDImage::PrecacheResult::Success : + CDImage::PrecacheResult::ReadError; +} + // There's probably a more efficient way of doing this with vectorization... ALWAYS_INLINE static void CopyAndSwap(void* dst_ptr, const u8* src_ptr, u32 data_size) {