From c2f4b7e7b8383509233ee7033d3a573b3d5c46b7 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Tue, 26 Jul 2022 20:14:45 +1000 Subject: [PATCH] CDROM: Only apply extra remove delay on disc swap --- src/core/cdrom.cpp | 12 +++++++----- src/core/cdrom.h | 2 +- src/core/system.cpp | 8 ++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/core/cdrom.cpp b/src/core/cdrom.cpp index 126c66b54..288854708 100644 --- a/src/core/cdrom.cpp +++ b/src/core/cdrom.cpp @@ -347,7 +347,7 @@ bool CDROM::DoesMediaRegionMatchConsole() const void CDROM::InsertMedia(std::unique_ptr media) { if (CanReadMedia()) - RemoveMedia(); + RemoveMedia(true); // set the region from the system area of the disc m_disc_region = System::GetRegionForImage(media.get()); @@ -362,13 +362,15 @@ void CDROM::InsertMedia(std::unique_ptr media) SetHoldPosition(0, true); } -std::unique_ptr CDROM::RemoveMedia(bool force /* = false */) +std::unique_ptr CDROM::RemoveMedia(bool for_disc_swap) { - if (!HasMedia() && !force) + if (!HasMedia()) return nullptr; // Add an additional two seconds to the disc swap, some games don't like it happening too quickly. - const TickCount stop_ticks = GetTicksForStop(true) + System::ScaleTicksToOverclock(System::MASTER_CLOCK * 2); + TickCount stop_ticks = GetTicksForStop(true); + if (for_disc_swap) + stop_ticks += System::ScaleTicksToOverclock(System::MASTER_CLOCK * 2); Log_InfoPrintf("Removing CD..."); std::unique_ptr image = m_reader.RemoveMedia(); @@ -392,7 +394,7 @@ std::unique_ptr CDROM::RemoveMedia(bool force /* = false */) SendAsyncErrorResponse(STAT_ERROR, 0x08); // Begin spin-down timer, we can't swap the new disc in immediately for some games (e.g. Metal Gear Solid). - if (!force) + if (for_disc_swap) { m_drive_state = DriveState::ShellOpening; m_drive_event->SetIntervalAndSchedule(stop_ticks); diff --git a/src/core/cdrom.h b/src/core/cdrom.h index c12d538ad..14a136cf2 100644 --- a/src/core/cdrom.h +++ b/src/core/cdrom.h @@ -36,7 +36,7 @@ public: bool DoesMediaRegionMatchConsole() const; void InsertMedia(std::unique_ptr media); - std::unique_ptr RemoveMedia(bool force = false); + std::unique_ptr RemoveMedia(bool for_disc_swap); bool PrecacheMedia(); void CPUClockChanged(); diff --git a/src/core/system.cpp b/src/core/system.cpp index 54c02aa8d..42eb8f5a0 100644 --- a/src/core/system.cpp +++ b/src/core/system.cpp @@ -1713,7 +1713,7 @@ bool System::DoLoadState(ByteStream* state, bool force_software_renderer, bool u return false; } - std::unique_ptr old_media = g_cdrom.RemoveMedia(); + std::unique_ptr old_media = g_cdrom.RemoveMedia(false); if (old_media && old_media->GetFileName() == media_filename) { Log_InfoPrintf("Re-using same media '%s'", media_filename.c_str()); @@ -1776,7 +1776,7 @@ bool System::DoLoadState(ByteStream* state, bool force_software_renderer, bool u } else { - g_cdrom.RemoveMedia(); + g_cdrom.RemoveMedia(false); } // ensure the correct card is loaded @@ -2803,7 +2803,7 @@ bool System::InsertMedia(const char* path) void System::RemoveMedia() { - g_cdrom.RemoveMedia(); + g_cdrom.RemoveMedia(false); ClearMemorySaveStates(); } @@ -2955,7 +2955,7 @@ bool System::SwitchMediaSubImage(u32 index) if (!g_cdrom.HasMedia()) return false; - std::unique_ptr image = g_cdrom.RemoveMedia(); + std::unique_ptr image = g_cdrom.RemoveMedia(true); Assert(image); Common::Error error;