Skip to content
Permalink
Browse files
Merge pull request #6024 from ligfx/coreonstatechangedcallback
Qt: use Settings::EmulationStateChanged
  • Loading branch information
leoetlino committed Sep 15, 2017
2 parents 30dd544 + 3e1072b commit 0d07821
Show file tree
Hide file tree
Showing 31 changed files with 156 additions and 199 deletions.
@@ -98,11 +98,12 @@ static Common::Flag s_is_booting;
static void* s_window_handle = nullptr;
static std::string s_state_filename;
static std::thread s_emu_thread;
static StoppedCallbackFunc s_on_stopped_callback;
static StateChangedCallbackFunc s_on_state_changed_callback;

static std::thread s_cpu_thread;
static bool s_request_refresh_info = false;
static bool s_is_throttler_temp_disabled = false;
static bool s_frame_step = false;

struct HostJob
{
@@ -454,14 +455,16 @@ static void EmuThread(std::unique_ptr<BootParameters> boot)
{
const SConfig& core_parameter = SConfig::GetInstance();
s_is_booting.Set();
if (s_on_state_changed_callback)
s_on_state_changed_callback(State::Starting);
Common::ScopeGuard flag_guard{[] {
s_is_booting.Clear();
s_is_started = false;
s_is_stopping = false;
s_wants_determinism = false;

if (s_on_stopped_callback)
s_on_stopped_callback();
if (s_on_state_changed_callback)
s_on_state_changed_callback(State::Uninitialized);

INFO_LOG(CONSOLE, "Stop\t\t---- Shutdown complete ----");
}};
@@ -473,6 +476,7 @@ static void EmuThread(std::unique_ptr<BootParameters> boot)

// For a time this acts as the CPU thread...
DeclareAsCPUThread();
s_frame_step = false;

Movie::Init(*boot);
Common::ScopeGuard movie_guard{Movie::Shutdown};
@@ -683,6 +687,9 @@ void SetState(State state)
PanicAlert("Invalid state");
break;
}

if (s_on_state_changed_callback)
s_on_state_changed_callback(GetState());
}

State GetState()
@@ -698,6 +705,9 @@ State GetState()
return State::Running;
}

if (s_is_booting.IsSet())
return State::Starting;

return State::Uninitialized;
}

@@ -859,6 +869,14 @@ void Callback_VideoCopiedToXFB(bool video_update)
s_drawn_frame++;

Movie::FrameUpdate();

if (s_frame_step)
{
s_frame_step = false;
CPU::Break();
if (s_on_state_changed_callback)
s_on_state_changed_callback(Core::GetState());
}
}

void UpdateTitle()
@@ -951,9 +969,9 @@ void Shutdown()
HostDispatchJobs();
}

void SetOnStoppedCallback(StoppedCallbackFunc callback)
void SetOnStateChangedCallback(StateChangedCallbackFunc callback)
{
s_on_stopped_callback = std::move(callback);
s_on_state_changed_callback = std::move(callback);
}

void UpdateWantDeterminism(bool initial)
@@ -1024,4 +1042,21 @@ void HostDispatchJobs()
}
}

// NOTE: Host Thread
void DoFrameStep()
{
if (GetState() == State::Paused)
{
// if already paused, frame advance for 1 frame
s_frame_step = true;
RequestRefreshInfo();
SetState(State::Running);
}
else if (!s_frame_step)
{
// if not paused yet, pause immediately instead
SetState(State::Paused);
}
}

} // Core
@@ -31,7 +31,8 @@ enum class State
Uninitialized,
Paused,
Running,
Stopping
Stopping,
Starting,
};

bool Init(std::unique_ptr<BootParameters> boot);
@@ -84,8 +85,8 @@ void UpdateTitle();
void RunAsCPUThread(std::function<void()> function);

// for calling back into UI code without introducing a dependency on it in core
using StoppedCallbackFunc = std::function<void()>;
void SetOnStoppedCallback(StoppedCallbackFunc callback);
using StateChangedCallbackFunc = std::function<void(Core::State)>;
void SetOnStateChangedCallback(StateChangedCallbackFunc callback);

// Run on the Host thread when the factors change. [NOT THREADSAFE]
void UpdateWantDeterminism(bool initial = false);
@@ -105,4 +106,6 @@ void QueueHostJob(std::function<void()> job, bool run_during_stop = false);
// WM_USER_JOB_DISPATCH will be sent when something is added to the queue.
void HostDispatchJobs();

void DoFrameStep();

} // namespace
@@ -63,7 +63,6 @@

namespace Movie
{
static bool s_bFrameStep = false;
static bool s_bReadOnly = true;
static u32 s_rerecords = 0;
static PlayMode s_playMode = MODE_NONE;
@@ -192,11 +191,6 @@ void FrameUpdate()
s_totalFrames = s_currentFrame;
s_totalLagCount = s_currentLagCount;
}
if (s_bFrameStep)
{
s_bFrameStep = false;
CPU::Break();
}

s_bPolled = false;
}
@@ -215,7 +209,6 @@ void Init(const BootParameters& boot)
s_current_file_name.clear();

s_bPolled = false;
s_bFrameStep = false;
s_bSaveConfig = false;
if (IsPlayingInput())
{
@@ -274,23 +267,6 @@ void SetPolledDevice()
s_bPolled = true;
}

// NOTE: Host Thread
void DoFrameStep()
{
if (Core::GetState() == Core::State::Paused)
{
// if already paused, frame advance for 1 frame
s_bFrameStep = true;
Core::RequestRefreshInfo();
Core::SetState(Core::State::Running);
}
else if (!s_bFrameStep)
{
// if not paused yet, pause immediately instead
Core::SetState(Core::State::Paused);
}
}

// NOTE: Host Thread
void SetReadOnly(bool bEnabled)
{
@@ -148,7 +148,6 @@ bool IsUsingBongo(int controller);
void ChangePads(bool instantly = false);
void ChangeWiiPads(bool instantly = false);

void DoFrameStep();
void SetReadOnly(bool bEnabled);

bool BeginRecordingInput(int controllers);
@@ -392,7 +392,10 @@ int main(int argc, char* argv[])
UICommon::SetUserDirectory(user_directory);
UICommon::Init();

Core::SetOnStoppedCallback([]() { s_running.Clear(); });
Core::SetOnStateChangedCallback([](Core::State state) {
if (state == Core::State::Uninitialized)
s_running.Clear();
});
platform->Init();

// Shut down cleanly on SIGINT and SIGTERM
@@ -21,6 +21,7 @@
#include <map>

#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "Core/HW/SI/SI.h"
#include "Core/HW/Wiimote.h"
#include "Core/HW/WiimoteReal/WiimoteReal.h"
@@ -238,6 +239,9 @@ void ControllersWindow::CreateMainLayout()

void ControllersWindow::ConnectWidgets()
{
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
[=](Core::State state) { OnEmulationStateChanged(state != Core::State::Uninitialized); });

connect(m_wiimote_passthrough, &QRadioButton::toggled, this,
&ControllersWindow::OnWiimoteModeChanged);

@@ -25,9 +25,9 @@ class ControllersWindow final : public QDialog
Q_OBJECT
public:
explicit ControllersWindow(QWidget* parent);
void OnEmulationStateChanged(bool running);

private:
void OnEmulationStateChanged(bool running);
void OnWiimoteModeChanged(bool passthrough);
void OnWiimoteTypeChanged(int state);
void OnGCTypeChanged(int state);
@@ -11,9 +11,11 @@

#include "Core/Config/GraphicsSettings.h"
#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "DolphinQt2/Config/Graphics/GraphicsBool.h"
#include "DolphinQt2/Config/Graphics/GraphicsChoice.h"
#include "DolphinQt2/Config/Graphics/GraphicsWindow.h"
#include "DolphinQt2/Settings.h"
#include "VideoCommon/VideoConfig.h"

AdvancedWidget::AdvancedWidget(GraphicsWindow* parent) : GraphicsWidget(parent)
@@ -24,8 +26,8 @@ AdvancedWidget::AdvancedWidget(GraphicsWindow* parent) : GraphicsWidget(parent)
AddDescriptions();

connect(parent, &GraphicsWindow::BackendChanged, this, &AdvancedWidget::OnBackendChanged);
connect(parent, &GraphicsWindow::EmulationStarted, [this] { OnEmulationStateChanged(true); });
connect(parent, &GraphicsWindow::EmulationStopped, [this] { OnEmulationStateChanged(false); });
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
[=](Core::State state) { OnEmulationStateChanged(state != Core::State::Uninitialized); });

OnBackendChanged();
}
@@ -15,9 +15,11 @@

#include "Core/Config/GraphicsSettings.h"
#include "Core/ConfigManager.h"
#include "Core/Core.h"
#include "DolphinQt2/Config/Graphics/GraphicsBool.h"
#include "DolphinQt2/Config/Graphics/GraphicsChoice.h"
#include "DolphinQt2/Config/Graphics/GraphicsWindow.h"
#include "DolphinQt2/Settings.h"
#include "UICommon/VideoUtils.h"
#include "VideoCommon/VideoBackendBase.h"
#include "VideoCommon/VideoConfig.h"
@@ -32,8 +34,8 @@ GeneralWidget::GeneralWidget(X11Utils::XRRConfiguration* xrr_config, GraphicsWin
emit BackendChanged(QString::fromStdString(SConfig::GetInstance().m_strVideoBackend));

connect(parent, &GraphicsWindow::BackendChanged, this, &GeneralWidget::OnBackendChanged);
connect(parent, &GraphicsWindow::EmulationStarted, [this] { OnEmulationStateChanged(true); });
connect(parent, &GraphicsWindow::EmulationStopped, [this] { OnEmulationStateChanged(false); });
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
[=](Core::State state) { OnEmulationStateChanged(state != Core::State::Uninitialized); });
}

void GeneralWidget::CreateWidgets()
@@ -29,9 +29,6 @@ GraphicsWindow::GraphicsWindow(X11Utils::XRRConfiguration* xrr_config, MainWindo
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);

OnBackendChanged(QString::fromStdString(SConfig::GetInstance().m_strVideoBackend));

connect(parent, &MainWindow::EmulationStarted, this, &GraphicsWindow::EmulationStarted);
connect(parent, &MainWindow::EmulationStopped, this, &GraphicsWindow::EmulationStopped);
}

void GraphicsWindow::CreateMainLayout()
@@ -33,8 +33,6 @@ class GraphicsWindow final : public QDialog
bool eventFilter(QObject* object, QEvent* event) override;
signals:
void BackendChanged(const QString& backend);
void EmulationStarted();
void EmulationStopped();

private:
void CreateMainLayout();
@@ -40,15 +40,9 @@ SettingsWindow::SettingsWindow(QWidget* parent) : QDialog(parent)

AddTab(m_tabs, tr("General"), new GeneralPane(), "config");
AddTab(m_tabs, tr("Interface"), new InterfacePane(), "browse");
auto* audio_pane = new AudioPane;
m_audio_pane_index = AddTab(m_tabs, tr("Audio"), audio_pane, "play");
m_audio_pane_index = AddTab(m_tabs, tr("Audio"), new AudioPane(), "play");
AddTab(m_tabs, tr("Paths"), new PathPane(), "browse");

connect(this, &SettingsWindow::EmulationStarted,
[audio_pane] { audio_pane->OnEmulationStateChanged(true); });
connect(this, &SettingsWindow::EmulationStopped,
[audio_pane] { audio_pane->OnEmulationStateChanged(false); });

// Dialog box buttons
QDialogButtonBox* ok_box = new QDialogButtonBox(QDialogButtonBox::Ok);
connect(ok_box, &QDialogButtonBox::accepted, this, &SettingsWindow::accept);
@@ -15,10 +15,6 @@ class SettingsWindow final : public QDialog
explicit SettingsWindow(QWidget* parent = nullptr);
void SelectAudioPane();

signals:
void EmulationStarted();
void EmulationStopped();

private:
ListTabWidget* m_tabs;
int m_audio_pane_index = -1;
@@ -174,11 +174,8 @@ void GameList::ShowContextMenu(const QPoint&)

QAction* change_disc = AddAction(menu, tr("Change &Disc"), this, &GameList::ChangeDisc);

connect(this, &GameList::EmulationStarted, change_disc,
[change_disc] { change_disc->setEnabled(true); });
connect(this, &GameList::EmulationStopped, change_disc,
[change_disc] { change_disc->setEnabled(false); });

connect(&Settings::Instance(), &Settings::EmulationStateChanged, change_disc,
[change_disc] { change_disc->setEnabled(Core::IsRunning()); });
change_disc->setEnabled(Core::IsRunning());

menu->addSeparator();
@@ -202,15 +199,13 @@ void GameList::ShowContextMenu(const QPoint&)

for (QAction* a : {wad_install_action, wad_uninstall_action})
{
connect(this, &GameList::EmulationStarted, a, [a] { a->setEnabled(false); });
a->setEnabled(!Core::IsRunning());
menu->addAction(a);
}

connect(this, &GameList::EmulationStopped, wad_install_action,
[wad_install_action] { wad_install_action->setEnabled(true); });
connect(this, &GameList::EmulationStopped, wad_uninstall_action, [wad_uninstall_action, game] {
wad_uninstall_action->setEnabled(game->IsInstalled());
connect(&Settings::Instance(), &Settings::EmulationStateChanged, menu, [=](Core::State state) {
wad_install_action->setEnabled(state == Core::State::Uninitialized);
wad_uninstall_action->setEnabled(state == Core::State::Uninitialized && game->IsInstalled());
});

menu->addSeparator();
@@ -231,10 +226,9 @@ void GameList::ShowContextMenu(const QPoint&)
connect(netplay_host, &QAction::triggered,
[this, game] { emit NetPlayHost(game->GetUniqueID()); });

connect(this, &GameList::EmulationStarted, netplay_host,
[netplay_host] { netplay_host->setEnabled(false); });
connect(this, &GameList::EmulationStopped, netplay_host,
[netplay_host] { netplay_host->setEnabled(true); });
connect(&Settings::Instance(), &Settings::EmulationStateChanged, menu, [=](Core::State state) {
netplay_host->setEnabled(state == Core::State::Uninitialized);
});
netplay_host->setEnabled(!Core::IsRunning());

menu->addAction(netplay_host);
@@ -29,8 +29,6 @@ class GameList final : public QStackedWidget

signals:
void GameSelected();
void EmulationStarted();
void EmulationStopped();
void NetPlayHost(const QString& game_id);
void SelectionChanged(QSharedPointer<GameFile> game_file);

0 comments on commit 0d07821

Please sign in to comment.