diff --git a/android/app/src/cpp/android_host_interface.cpp b/android/app/src/cpp/android_host_interface.cpp index 3c64a7a68..1f1f7c4e8 100644 --- a/android/app/src/cpp/android_host_interface.cpp +++ b/android/app/src/cpp/android_host_interface.cpp @@ -1,9 +1,9 @@ #include "android_host_interface.h" #include "android_gles_host_display.h" #include "common/assert.h" +#include "common/audio_stream.h" #include "common/log.h" #include "common/string.h" -#include "common/audio_stream.h" #include "core/controller.h" #include "core/game_list.h" #include "core/gpu.h" @@ -67,11 +67,6 @@ bool AndroidHostInterface::Initialize() if (!HostInterface::Initialize()) return false; - // check settings version, if invalid set defaults, then load settings - INISettingsInterface settings_interface(GetSettingsFileName()); - CheckSettings(settings_interface); - UpdateSettings([this, &settings_interface]() { m_settings.Load(settings_interface); }); - return true; } @@ -96,14 +91,22 @@ void AndroidHostInterface::SetUserDirectory() m_user_directory = "/sdcard/duckstation"; } +void AndroidHostInterface::LoadSettings() +{ + // check settings version, if invalid set defaults, then load settings + INISettingsInterface settings_interface(GetSettingsFileName()); + CheckSettings(settings_interface); + UpdateSettings([this, &settings_interface]() { m_settings.Load(settings_interface); }); +} + bool AndroidHostInterface::StartEmulationThread(ANativeWindow* initial_surface, SystemBootParameters boot_params) { Assert(!IsEmulationThreadRunning()); Log_DevPrintf("Starting emulation thread..."); m_emulation_thread_stop_request.store(false); - m_emulation_thread = std::thread(&AndroidHostInterface::EmulationThreadEntryPoint, this, initial_surface, - std::move(boot_params)); + m_emulation_thread = + std::thread(&AndroidHostInterface::EmulationThreadEntryPoint, this, initial_surface, std::move(boot_params)); m_emulation_thread_started.Wait(); if (!m_emulation_thread_start_result.load()) { @@ -458,7 +461,7 @@ DEFINE_JNI_ARGS_METHOD(jint, AndroidHostInterface_getControllerButtonCode, jobje DEFINE_JNI_ARGS_METHOD(jarray, GameList_getEntries, jobject unused, jstring j_cache_path, jstring j_redump_dat_path, jarray j_search_directories, jboolean search_recursively) { - //const std::string cache_path = JStringToString(env, j_cache_path); + // const std::string cache_path = JStringToString(env, j_cache_path); std::string redump_dat_path = JStringToString(env, j_redump_dat_path); // TODO: This should use the base HostInterface. diff --git a/android/app/src/cpp/android_host_interface.h b/android/app/src/cpp/android_host_interface.h index e79d22ef8..56115ca25 100644 --- a/android/app/src/cpp/android_host_interface.h +++ b/android/app/src/cpp/android_host_interface.h @@ -36,6 +36,7 @@ public: protected: void SetUserDirectory() override; + void LoadSettings() override; bool AcquireHostDisplay() override; void ReleaseHostDisplay() override; std::unique_ptr CreateAudioStream(AudioBackend backend) override; diff --git a/src/core/host_interface.cpp b/src/core/host_interface.cpp index cd672a83d..b99be449c 100644 --- a/src/core/host_interface.cpp +++ b/src/core/host_interface.cpp @@ -61,6 +61,7 @@ bool HostInterface::Initialize() { SetUserDirectory(); InitializeUserDirectory(); + LoadSettings(); m_game_list = std::make_unique(); m_game_list->SetCacheFilename(GetGameListCacheFileName()); m_game_list->SetDatabaseFilename(GetGameListDatabaseFileName()); diff --git a/src/core/host_interface.h b/src/core/host_interface.h index c98c3a098..0eb7276a5 100644 --- a/src/core/host_interface.h +++ b/src/core/host_interface.h @@ -158,8 +158,8 @@ protected: /// Sets the base path for the user directory. Can be overridden by platform/frontend/command line. virtual void SetUserDirectory(); - /// Ensures all subdirectories of the user directory are created. - void CreateUserDirectorySubdirectories(); + /// Performs the initial load of settings. Should call CheckSettings() and m_settings.Load(). + virtual void LoadSettings() = 0; /// Returns the path of the settings file. std::string GetSettingsFileName() const; diff --git a/src/duckstation-qt/qthostinterface.cpp b/src/duckstation-qt/qthostinterface.cpp index c734d1f76..7c29bf3e8 100644 --- a/src/duckstation-qt/qthostinterface.cpp +++ b/src/duckstation-qt/qthostinterface.cpp @@ -59,22 +59,6 @@ bool QtHostInterface::initializeOnThread() if (m_controller_interface) m_controller_interface->PollEvents(); - // no need to lock here because the main thread is waiting for us - m_qsettings = std::make_unique(QString::fromStdString(GetSettingsFileName()), QSettings::IniFormat); - QtSettingsInterface si(m_qsettings.get()); - - // check settings validity - const QSettings::Status settings_status = m_qsettings->status(); - if (settings_status != QSettings::NoError) - { - m_qsettings->clear(); - SetDefaultSettings(si); - } - - // load in settings - CheckSettings(si); - m_settings.Load(si); - // bind buttons/axises updateInputMap(); return true; @@ -417,6 +401,25 @@ void QtHostInterface::OnSystemStateSaved(bool global, s32 slot) emit stateSaved(QString::fromStdString(m_system->GetRunningCode()), global, slot); } +void QtHostInterface::LoadSettings() +{ + // no need to lock here because the main thread is waiting for us + m_qsettings = std::make_unique(QString::fromStdString(GetSettingsFileName()), QSettings::IniFormat); + QtSettingsInterface si(m_qsettings.get()); + + // check settings validity + const QSettings::Status settings_status = m_qsettings->status(); + if (settings_status != QSettings::NoError) + { + m_qsettings->clear(); + SetDefaultSettings(si); + } + + // load in settings + CheckSettings(si); + m_settings.Load(si); +} + void QtHostInterface::SetDefaultSettings(SettingsInterface& si) { CommonHostInterface::SetDefaultSettings(si); diff --git a/src/duckstation-qt/qthostinterface.h b/src/duckstation-qt/qthostinterface.h index 401725254..4d15939c8 100644 --- a/src/duckstation-qt/qthostinterface.h +++ b/src/duckstation-qt/qthostinterface.h @@ -133,6 +133,7 @@ protected: void OnRunningGameChanged() override; void OnSystemStateSaved(bool global, s32 slot) override; + void LoadSettings() override; void SetDefaultSettings(SettingsInterface& si) override; void UpdateInputMap() override; diff --git a/src/duckstation-sdl/sdl_host_interface.cpp b/src/duckstation-sdl/sdl_host_interface.cpp index 995726b00..be1524de5 100644 --- a/src/duckstation-sdl/sdl_host_interface.cpp +++ b/src/duckstation-sdl/sdl_host_interface.cpp @@ -295,12 +295,6 @@ bool SDLHostInterface::Initialize() if (!FileSystem::SetWorkingDirectory(m_user_directory.c_str())) Log_ErrorPrintf("Failed to set working directory to '%s'", m_user_directory.c_str()); - // Settings need to be loaded prior to creating the window for OpenGL bits. - INISettingsInterface si(GetSettingsFileName()); - m_settings_copy.Load(si); - m_settings = m_settings_copy; - m_fullscreen = m_settings_copy.start_fullscreen; - if (!CreateSDLWindow()) { Log_ErrorPrintf("Failed to create SDL window"); @@ -334,6 +328,15 @@ void SDLHostInterface::Shutdown() HostInterface::Shutdown(); } +void SDLHostInterface::LoadSettings() +{ + // Settings need to be loaded prior to creating the window for OpenGL bits. + INISettingsInterface si(GetSettingsFileName()); + m_settings_copy.Load(si); + m_settings = m_settings_copy; + m_fullscreen = m_settings_copy.start_fullscreen; +} + void SDLHostInterface::ReportError(const char* message) { SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, "DuckStation", message, m_window); diff --git a/src/duckstation-sdl/sdl_host_interface.h b/src/duckstation-sdl/sdl_host_interface.h index 147da2485..5cc635082 100644 --- a/src/duckstation-sdl/sdl_host_interface.h +++ b/src/duckstation-sdl/sdl_host_interface.h @@ -29,19 +29,21 @@ public: void ReportMessage(const char* message) override; bool ConfirmMessage(const char* message) override; - bool Initialize(); + bool Initialize() override; void Shutdown() override; void Run(); protected: + void LoadSettings() override; + bool AcquireHostDisplay() override; void ReleaseHostDisplay() override; std::unique_ptr CreateAudioStream(AudioBackend backend) override; void OnSystemCreated() override; void OnSystemPaused(bool paused) override; - void OnSystemDestroyed(); + void OnSystemDestroyed() override; void OnControllerTypeChanged(u32 slot) override; private: