diff --git a/src/core/cdrom.cpp b/src/core/cdrom.cpp index d4c03127e..8214dea5e 100644 --- a/src/core/cdrom.cpp +++ b/src/core/cdrom.cpp @@ -450,15 +450,15 @@ void CDROM::InsertMedia(std::unique_ptr<CDImage> media) m_reader.SetMedia(std::move(media)); } -void CDROM::RemoveMedia(bool force /* = false */) +std::unique_ptr<CDImage> CDROM::RemoveMedia(bool force /* = false */) { if (!HasMedia() && !force) - return; + return nullptr; const TickCount stop_ticks = GetTicksForStop(true); Log_InfoPrintf("Removing CD..."); - m_reader.RemoveMedia(); + std::unique_ptr<CDImage> image = m_reader.RemoveMedia(); m_last_sector_header_valid = false; @@ -484,6 +484,8 @@ void CDROM::RemoveMedia(bool force /* = false */) m_drive_state = DriveState::ShellOpening; m_drive_event->SetIntervalAndSchedule(stop_ticks); } + + return image; } void CDROM::SetUseReadThread(bool enabled) diff --git a/src/core/cdrom.h b/src/core/cdrom.h index c2d92be81..07cfcbd22 100644 --- a/src/core/cdrom.h +++ b/src/core/cdrom.h @@ -32,7 +32,7 @@ public: std::string GetMediaFileName() const { return m_reader.GetMediaFileName(); } void InsertMedia(std::unique_ptr<CDImage> media); - void RemoveMedia(bool force = false); + std::unique_ptr<CDImage> RemoveMedia(bool force = false); // I/O u8 ReadRegister(u32 offset); diff --git a/src/core/cdrom_async_reader.cpp b/src/core/cdrom_async_reader.cpp index 9da39d6fc..f5627fb4e 100644 --- a/src/core/cdrom_async_reader.cpp +++ b/src/core/cdrom_async_reader.cpp @@ -43,10 +43,10 @@ void CDROMAsyncReader::SetMedia(std::unique_ptr<CDImage> media) m_media = std::move(media); } -void CDROMAsyncReader::RemoveMedia() +std::unique_ptr<CDImage> CDROMAsyncReader::RemoveMedia() { WaitForReadToComplete(); - m_media.reset(); + return std::move(m_media); } void CDROMAsyncReader::QueueReadSector(CDImage::LBA lba) diff --git a/src/core/cdrom_async_reader.h b/src/core/cdrom_async_reader.h index 67737fd87..ef2804c17 100644 --- a/src/core/cdrom_async_reader.h +++ b/src/core/cdrom_async_reader.h @@ -26,7 +26,7 @@ public: void StopThread(); void SetMedia(std::unique_ptr<CDImage> media); - void RemoveMedia(); + std::unique_ptr<CDImage> RemoveMedia(); void QueueReadSector(CDImage::LBA lba); void QueueReadNextSector(); diff --git a/src/core/system.cpp b/src/core/system.cpp index 73ac290ef..d947dd88a 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -432,11 +432,17 @@ bool System::DoLoadState(ByteStream* state, bool init_components, bool force_sof return false; } - media = CDImage::Open(media_filename.c_str()); - if (!media) + media = m_cdrom->RemoveMedia(); + if (!media || media->GetFileName() != media_filename) { - m_host_interface->ReportFormattedError("Failed to open CD image from save state: '%s'.", media_filename.c_str()); - return false; + media.reset(); + media = CDImage::Open(media_filename.c_str()); + if (!media) + { + m_host_interface->ReportFormattedError("Failed to open CD image from save state: '%s'.", + media_filename.c_str()); + return false; + } } }