From 29df17d422bd4912987eda501e7d68c312763106 Mon Sep 17 00:00:00 2001 From: Pokechu22 Date: Thu, 6 Jan 2022 14:47:36 -0800 Subject: [PATCH] FifoPlayer: Allow changing loop option at runtime This option has always existed since it's used by FifoCI, but now it can be changed at runtime. Looping is something that should almost always be on, but it can be useful to turn it off when frame-dumping is enabled so that hundreds of copies of the same frame aren't created. Before, turning it off required restarting Dolphin. --- Source/Core/Core/FifoPlayer/FifoPlayer.cpp | 3 ++- Source/Core/Core/FifoPlayer/FifoPlayer.h | 2 +- Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.cpp | 12 +++++++++++- Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.h | 1 + 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Source/Core/Core/FifoPlayer/FifoPlayer.cpp b/Source/Core/Core/FifoPlayer/FifoPlayer.cpp index 4a3677b936..9117e4d0f4 100644 --- a/Source/Core/Core/FifoPlayer/FifoPlayer.cpp +++ b/Source/Core/Core/FifoPlayer/FifoPlayer.cpp @@ -163,7 +163,7 @@ void FifoPlaybackAnalyzer::OnCommand(const u8* data, u32 size) bool IsPlayingBackFifologWithBrokenEFBCopies = false; -FifoPlayer::FifoPlayer() : m_Loop{Config::Get(Config::MAIN_FIFOPLAYER_LOOP_REPLAY)} +FifoPlayer::FifoPlayer() { m_config_changed_callback_id = Config::AddConfigChangedCallback([this] { RefreshConfig(); }); RefreshConfig(); @@ -303,6 +303,7 @@ std::unique_ptr FifoPlayer::GetCPUCore() void FifoPlayer::RefreshConfig() { + m_Loop = Config::Get(Config::MAIN_FIFOPLAYER_LOOP_REPLAY); m_EarlyMemoryUpdates = Config::Get(Config::MAIN_FIFOPLAYER_EARLY_MEMORY_UPDATES); } diff --git a/Source/Core/Core/FifoPlayer/FifoPlayer.h b/Source/Core/Core/FifoPlayer/FifoPlayer.h index eb06012085..365add85fe 100644 --- a/Source/Core/Core/FifoPlayer/FifoPlayer.h +++ b/Source/Core/Core/FifoPlayer/FifoPlayer.h @@ -172,7 +172,7 @@ private: void RefreshConfig(); - bool m_Loop; + bool m_Loop = true; // If enabled then all memory updates happen at once before the first frame bool m_EarlyMemoryUpdates = false; diff --git a/Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.cpp b/Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.cpp index fcc1932e82..bda4da3d88 100644 --- a/Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.cpp +++ b/Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.cpp @@ -119,10 +119,12 @@ void FIFOPlayerWindow::CreateWidgets() auto* playback_group = new QGroupBox(tr("Playback Options")); auto* playback_layout = new QGridLayout; m_early_memory_updates = new ToolTipCheckBox(tr("Early Memory Updates")); + m_loop = new ToolTipCheckBox(tr("Loop")); playback_layout->addWidget(object_range_group, 0, 0); playback_layout->addWidget(frame_range_group, 0, 1); - playback_layout->addWidget(m_early_memory_updates, 1, 0, 1, -1); + playback_layout->addWidget(m_early_memory_updates, 1, 0); + playback_layout->addWidget(m_loop, 1, 1); playback_group->setLayout(playback_layout); // Recording Options @@ -171,6 +173,7 @@ void FIFOPlayerWindow::CreateWidgets() void FIFOPlayerWindow::LoadSettings() { m_early_memory_updates->setChecked(Config::Get(Config::MAIN_FIFOPLAYER_EARLY_MEMORY_UPDATES)); + m_loop->setChecked(Config::Get(Config::MAIN_FIFOPLAYER_LOOP_REPLAY)); } void FIFOPlayerWindow::ConnectWidgets() @@ -181,6 +184,7 @@ void FIFOPlayerWindow::ConnectWidgets() connect(m_stop, &QPushButton::clicked, this, &FIFOPlayerWindow::StopRecording); connect(m_button_box, &QDialogButtonBox::rejected, this, &FIFOPlayerWindow::hide); connect(m_early_memory_updates, &QCheckBox::toggled, this, &FIFOPlayerWindow::OnConfigChanged); + connect(m_loop, &QCheckBox::toggled, this, &FIFOPlayerWindow::OnConfigChanged); connect(m_frame_range_from, qOverload(&QSpinBox::valueChanged), this, &FIFOPlayerWindow::OnLimitsChanged); @@ -199,8 +203,13 @@ void FIFOPlayerWindow::AddDescriptions() "If enabled, then all memory updates happen at once before the first frame.

" "Causes issues with many fifologs, but can be useful for testing.

" "If unsure, leave this unchecked."); + static const char TR_LOOP_DESCRIPTION[] = + QT_TR_NOOP("If unchecked, then playback of the fifolog stops after the final frame.

" + "This is generally only useful when a frame-dumping option is enabled.

" + "If unsure, leave this checked."); m_early_memory_updates->SetDescription(tr(TR_MEMORY_UPDATES_DESCRIPTION)); + m_loop->SetDescription(tr(TR_LOOP_DESCRIPTION)); } void FIFOPlayerWindow::LoadRecording() @@ -345,6 +354,7 @@ void FIFOPlayerWindow::OnConfigChanged() { Config::SetBase(Config::MAIN_FIFOPLAYER_EARLY_MEMORY_UPDATES, m_early_memory_updates->isChecked()); + Config::SetBase(Config::MAIN_FIFOPLAYER_LOOP_REPLAY, m_loop->isChecked()); } void FIFOPlayerWindow::OnLimitsChanged() diff --git a/Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.h b/Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.h index 292e2783c7..a5e2562c1f 100644 --- a/Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.h +++ b/Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.h @@ -65,6 +65,7 @@ private: QSpinBox* m_object_range_to; QLabel* m_object_range_to_label; ToolTipCheckBox* m_early_memory_updates; + ToolTipCheckBox* m_loop; QDialogButtonBox* m_button_box; QWidget* m_main_widget;