Move most helper logic from base HostInterface to FrontendCommon

This commit is contained in:
Connor McLaughlin 2020-06-09 02:05:55 +10:00
parent 444a09efd4
commit 075380f8e0
13 changed files with 1156 additions and 1086 deletions

File diff suppressed because it is too large Load diff

View file

@ -28,12 +28,6 @@ class HostInterface
friend System;
public:
enum : s32
{
PER_GAME_SAVE_STATE_SLOTS = 10,
GLOBAL_SAVE_STATE_SLOTS = 10
};
enum : u32
{
AUDIO_SAMPLE_RATE = 44100,
@ -41,29 +35,6 @@ public:
DEFAULT_AUDIO_BUFFER_SIZE = 2048
};
struct SaveStateInfo
{
std::string path;
u64 timestamp;
s32 slot;
bool global;
};
struct ExtendedSaveStateInfo
{
std::string path;
u64 timestamp;
s32 slot;
bool global;
std::string title;
std::string game_code;
u32 screenshot_width;
u32 screenshot_height;
std::vector<u32> screenshot_data;
};
HostInterface();
virtual ~HostInterface();
@ -76,9 +47,6 @@ public:
/// Returns a settings object which can be modified.
ALWAYS_INLINE Settings& GetSettings() { return m_settings; }
/// Returns the game list.
ALWAYS_INLINE const GameList* GetGameList() const { return m_game_list.get(); }
/// Access to emulated system.
ALWAYS_INLINE System* GetSystem() const { return m_system.get(); }
@ -91,41 +59,12 @@ public:
virtual bool BootSystem(const SystemBootParameters& parameters);
virtual void PowerOffSystem();
void PauseSystem(bool paused);
void ResetSystem();
void DestroySystem();
virtual void ResetSystem();
virtual void DestroySystem();
/// Loads state from the specified filename.
bool LoadState(const char* filename);
/// Loads the current emulation state from file. Specifying a slot of -1 loads the "resume" game state.
bool LoadState(bool global, s32 slot);
/// Saves the current emulation state to a file. Specifying a slot of -1 saves the "resume" save state.
bool SaveState(bool global, s32 slot);
/// Loads the resume save state for the given game. Optionally boots the game anyway if loading fails.
bool ResumeSystemFromState(const char* filename, bool boot_on_failure);
/// Loads the most recent resume save state. This may be global or per-game.
bool ResumeSystemFromMostRecentState();
/// Saves the resume save state, call when shutting down. Not called automatically on DestroySystem() since that can
/// be called as a result of an error.
bool SaveResumeSaveState();
/// Returns true if currently dumping audio.
bool IsDumpingAudio() const;
/// Starts dumping audio to a file. If no file name is provided, one will be generated automatically.
bool StartDumpingAudio(const char* filename = nullptr);
/// Stops dumping audio to file if it has been started.
void StopDumpingAudio();
/// Saves a screenshot to the specified file. IF no file name is provided, one will be generated automatically.
bool SaveScreenshot(const char* filename = nullptr, bool full_resolution = true, bool apply_aspect_ratio = true);
virtual void ReportError(const char* message);
virtual void ReportMessage(const char* message);
virtual bool ConfirmMessage(const char* message);
@ -135,7 +74,7 @@ public:
bool ConfirmFormattedMessage(const char* format, ...);
/// Adds OSD messages, duration is in seconds.
void AddOSDMessage(const char* message, float duration = 2.0f);
virtual void AddOSDMessage(std::string message, float duration = 2.0f);
void AddFormattedOSDMessage(float duration, const char* format, ...);
/// Returns the base user directory path.
@ -152,19 +91,10 @@ public:
/// Displays a loading screen with the logo, rendered with ImGui. Use when executing possibly-time-consuming tasks
/// such as compiling shaders when starting up.
void DisplayLoadingScreen(const char* message, int progress_min = -1, int progress_max = -1, int progress_value = -1);
virtual void DisplayLoadingScreen(const char* message, int progress_min = -1, int progress_max = -1, int progress_value = -1);
/// Returns a list of save states for the specified game code.
std::vector<SaveStateInfo> GetAvailableSaveStates(const char* game_code) const;
/// Returns save state info if present. If game_code is null or empty, assumes global state.
std::optional<SaveStateInfo> GetSaveStateInfo(const char* game_code, s32 slot);
/// Returns save state info if present. If game_code is null or empty, assumes global state.
std::optional<ExtendedSaveStateInfo> GetExtendedSaveStateInfo(const char* game_code, s32 slot);
/// Deletes save states for the specified game code. If resume is set, the resume state is deleted too.
void DeleteSaveStates(const char* game_code, bool resume);
/// Retrieves information about specified game from game list.
virtual void GetGameInfo(const char* path, CDImage* image, std::string* code, std::string* title);
/// Enables the software cursor. Can be called multiple times, but must be matched by a call to DisableSoftwareCursor().
void EnableSoftwareCursor();
@ -173,118 +103,59 @@ public:
void DisableSoftwareCursor();
protected:
enum : u32
{
SETTINGS_VERSION = 2
};
struct OSDMessage
{
std::string text;
Common::Timer time;
float duration;
};
virtual bool AcquireHostDisplay() = 0;
virtual void ReleaseHostDisplay() = 0;
virtual std::unique_ptr<AudioStream> CreateAudioStream(AudioBackend backend) = 0;
virtual void OnSystemCreated();
virtual void OnSystemPaused(bool paused);
virtual void OnSystemDestroyed();
virtual void OnSystemPerformanceCountersUpdated();
virtual void OnSystemStateSaved(bool global, s32 slot);
virtual void OnRunningGameChanged();
virtual void OnControllerTypeChanged(u32 slot);
virtual void DrawImGuiWindows();
/// Sets the base path for the user directory. Can be overridden by platform/frontend/command line.
virtual void SetUserDirectory();
/// Restores all settings to defaults.
virtual void SetDefaultSettings(SettingsInterface& si);
/// Loads settings to m_settings and any frontend-specific parameters.
virtual void LoadSettings(SettingsInterface& si);
/// Saves current settings variables to ini.
virtual void SaveSettings(SettingsInterface& si);
/// Checks for settings changes, std::move() the old settings away for comparing beforehand.
virtual void CheckForSettingsChanges(const Settings& old_settings);
/// Switches the GPU renderer by saving state, recreating the display window, and restoring state (if needed).
virtual void RecreateSystem();
/// Sets the user directory to the program directory, i.e. "portable mode".
void SetUserDirectoryToProgramDirectory();
/// Performs the initial load of settings. Should call CheckSettings() and ApplySettings().
virtual void LoadSettings() = 0;
/// Updates logging settings.
virtual void UpdateLogSettings(LOGLEVEL level, const char* filter, bool log_to_console, bool log_to_debug,
bool log_to_window, bool log_to_file);
/// Returns the path of the settings file.
std::string GetSettingsFileName() const;
/// Returns the path to a save state file. Specifying an index of -1 is the "resume" save state.
std::string GetGameSaveStateFileName(const char* game_code, s32 slot) const;
/// Returns the path to a save state file. Specifying an index of -1 is the "resume" save state.
std::string GetGlobalSaveStateFileName(s32 slot) const;
/// Returns the default path to a memory card.
std::string GetSharedMemoryCardPath(u32 slot) const;
/// Returns the default path to a memory card for a specific game.
std::string GetGameMemoryCardPath(const char* game_code, u32 slot) const;
/// Returns the most recent resume save state.
std::string GetMostRecentResumeSaveStatePath() const;
/// Loads the BIOS image for the specified region.
std::optional<std::vector<u8>> GetBIOSImage(ConsoleRegion region);
/// Ensures the settings is valid and the correct version. If not, resets to defaults.
void CheckSettings(SettingsInterface& si);
/// Restores all settings to defaults.
virtual void SetDefaultSettings(SettingsInterface& si);
/// Loads settings to m_settings and any frontend-specific parameters.
virtual void ApplySettings(SettingsInterface& si);
/// Saves current settings variables to ini.
virtual void ExportSettings(SettingsInterface& si);
/// Applies new settings, updating internal state as needed.
virtual void UpdateSettings(SettingsInterface& si);
/// Quick switch between software and hardware rendering.
void ToggleSoftwareRendering();
/// Adjusts the internal (render) resolution of the hardware backends.
void ModifyResolutionScale(s32 increment);
/// Switches the GPU renderer by saving state, recreating the display window, and restoring state (if needed).
void RecreateSystem();
/// Increases timer resolution when supported by the host OS.
void SetTimerResolutionIncreased(bool enabled);
void UpdateSpeedLimiterState();
void DrawFPSWindow();
void DrawOSDMessages();
void DrawDebugWindows();
bool SaveState(const char* filename);
void CreateAudioStream();
HostDisplay* m_display = nullptr;
std::unique_ptr<AudioStream> m_audio_stream;
std::unique_ptr<System> m_system;
std::unique_ptr<GameList> m_game_list;
Settings m_settings;
std::string m_program_directory;
std::string m_user_directory;
std::deque<OSDMessage> m_osd_messages;
std::mutex m_osd_messages_lock;
u32 m_software_cursor_use_count = 0;
bool m_paused = false;
bool m_speed_limiter_temp_disabled = false;
bool m_speed_limiter_enabled = false;
bool m_timer_resolution_increased = false;
private:
void InitializeUserDirectory();
void CreateAudioStream();
bool SaveState(const char* filename);
};

View file

@ -1,6 +1,7 @@
#include "memory_card.h"
#include "common/byte_stream.h"
#include "common/file_system.h"
#include "common/string_util.h"
#include "common/log.h"
#include "common/state_wrapper.h"
#include "host_interface.h"
@ -254,7 +255,7 @@ std::unique_ptr<MemoryCard> MemoryCard::Open(System* system, std::string_view fi
message.AppendString(filename.data(), static_cast<u32>(filename.length()));
message.AppendString("' could not be read, formatting.");
Log_ErrorPrint(message);
system->GetHostInterface()->AddOSDMessage(message, 5.0f);
system->GetHostInterface()->AddOSDMessage(message.GetCharArray(), 5.0f);
mc->Format();
}
@ -385,7 +386,7 @@ bool MemoryCard::SaveIfChanged(bool display_osd_message)
if (display_osd_message)
{
m_system->GetHostInterface()->AddOSDMessage(
SmallString::FromFormat("Saved memory card to '%s'", m_filename.c_str()));
StringUtil::StdStringFromFormat("Saved memory card to '%s'", m_filename.c_str()));
}
return true;

View file

@ -73,7 +73,7 @@ void Settings::Load(SettingsInterface& si)
gpu_max_run_ahead = si.GetIntValue("Hacks", "GPUMaxRunAhead", DEFAULT_GPU_MAX_RUN_AHEAD);
bios_path = si.GetStringValue("BIOS", "Path", "bios/scph1001.bin");
bios_patch_tty_enable = si.GetBoolValue("BIOS", "PatchTTYEnable", true);
bios_patch_tty_enable = si.GetBoolValue("BIOS", "PatchTTYEnable", false);
bios_patch_fast_boot = si.GetBoolValue("BIOS", "PatchFastBoot", false);
controller_types[0] = ParseControllerTypeName(si.GetStringValue("Controller1", "Type", "DigitalController").c_str())

View file

@ -1133,26 +1133,7 @@ void System::UpdateRunningGame(const char* path, CDImage* image)
if (path && std::strlen(path) > 0)
{
m_running_game_path = path;
const GameListEntry* list_entry = m_host_interface->GetGameList()->GetEntryForPath(path);
if (list_entry)
{
m_running_game_code = list_entry->code;
m_running_game_title = list_entry->title;
}
else
{
if (image)
m_running_game_code = GameList::GetGameCodeForImage(image);
const GameListDatabaseEntry* db_entry =
(!m_running_game_code.empty()) ? m_host_interface->GetGameList()->GetDatabaseEntryForCode(m_running_game_code) :
nullptr;
if (db_entry)
m_running_game_title = db_entry->title;
else
m_running_game_title = GameList::GetTitleForPath(path);
}
m_host_interface->GetGameInfo(path, image, &m_running_game_code, &m_running_game_title);
}
m_host_interface->OnRunningGameChanged();

View file

@ -90,6 +90,7 @@ public:
float GetEmulationSpeed() const { return m_speed; }
float GetAverageFrameTime() const { return m_average_frame_time; }
float GetWorstFrameTime() const { return m_worst_frame_time; }
float GetThrottleFrequency() const { return m_throttle_frequency; }
bool Boot(const SystemBootParameters& params);
void Reset();

View file

@ -144,13 +144,15 @@ void QtHostInterface::setDefaultSettings()
return;
}
QtSettingsInterface si(m_qsettings.get());
Settings old_settings(std::move(m_settings));
{
QtSettingsInterface si(m_qsettings.get());
std::lock_guard<std::recursive_mutex> guard(m_qsettings_mutex);
SetDefaultSettings(si);
CommonHostInterface::LoadSettings(si);
}
UpdateSettings(si);
CommonHostInterface::UpdateInputMap(si);
CheckForSettingsChanges(old_settings);
}
void QtHostInterface::applySettings()
@ -161,15 +163,19 @@ void QtHostInterface::applySettings()
return;
}
std::lock_guard<std::recursive_mutex> guard(m_qsettings_mutex);
QtSettingsInterface si(m_qsettings.get());
UpdateSettings(si);
CommonHostInterface::UpdateInputMap(si);
Settings old_settings(std::move(m_settings));
{
QtSettingsInterface si(m_qsettings.get());
std::lock_guard<std::recursive_mutex> guard(m_qsettings_mutex);
CommonHostInterface::LoadSettings(si);
}
CheckForSettingsChanges(old_settings);
// detect when render-to-main flag changes
if (m_system)
{
const bool render_to_main = m_qsettings->value("Main/RenderToMainWindow", true).toBool();
const bool render_to_main = getSettingValue("Main/RenderToMainWindow", true).toBool();
if (getHostDisplay() && !m_is_fullscreen && render_to_main != m_is_rendering_to_main)
{
m_is_rendering_to_main = render_to_main;
@ -224,9 +230,9 @@ void QtHostInterface::resumeSystemFromState(const QString& filename, bool boot_o
emit emulationStarting();
if (filename.isEmpty())
HostInterface::ResumeSystemFromMostRecentState();
ResumeSystemFromMostRecentState();
else
HostInterface::ResumeSystemFromState(filename.toStdString().c_str(), boot_on_failure);
ResumeSystemFromState(filename.toStdString().c_str(), boot_on_failure);
}
void QtHostInterface::resumeSystemFromMostRecentState()
@ -238,7 +244,7 @@ void QtHostInterface::resumeSystemFromMostRecentState()
}
emit emulationStarting();
HostInterface::ResumeSystemFromMostRecentState();
ResumeSystemFromMostRecentState();
}
void QtHostInterface::onDisplayWindowKeyEvent(int key, bool pressed)
@ -510,8 +516,8 @@ void QtHostInterface::LoadSettings()
}
// load in settings
CheckSettings(si);
ApplySettings(si);
CommonHostInterface::CheckSettings(si);
CommonHostInterface::LoadSettings(si);
}
void QtHostInterface::SetDefaultSettings(SettingsInterface& si)
@ -521,12 +527,6 @@ void QtHostInterface::SetDefaultSettings(SettingsInterface& si)
si.SetBoolValue("Main", "RenderToMainWindow", true);
}
void QtHostInterface::ApplySettings(SettingsInterface& si)
{
std::lock_guard<std::recursive_mutex> lock(m_qsettings_mutex);
CommonHostInterface::ApplySettings(si);
}
void QtHostInterface::UpdateInputMap()
{
updateInputMap();

View file

@ -158,7 +158,6 @@ protected:
void LoadSettings() override;
void SetDefaultSettings(SettingsInterface& si) override;
void ApplySettings(SettingsInterface& si) override;
void UpdateInputMap() override;
private:

View file

@ -299,7 +299,11 @@ void SDLHostInterface::RunLater(std::function<void()> callback)
void SDLHostInterface::SaveAndUpdateSettings()
{
m_settings_copy.Save(*m_settings_interface.get());
UpdateSettings(*m_settings_interface.get());
Settings old_settings(std::move(m_settings));
CommonHostInterface::LoadSettings(*m_settings_interface.get());
CheckForSettingsChanges(old_settings);
m_settings_interface->Save();
}
@ -382,7 +386,7 @@ void SDLHostInterface::LoadSettings()
{
// Settings need to be loaded prior to creating the window for OpenGL bits.
m_settings_interface = std::make_unique<INISettingsInterface>(GetSettingsFileName());
ApplySettings(*m_settings_interface.get());
CommonHostInterface::LoadSettings(*m_settings_interface.get());
m_settings_copy = m_settings;
}

File diff suppressed because it is too large Load diff

View file

@ -22,6 +22,12 @@ class CommonHostInterface : public HostInterface
public:
friend ControllerInterface;
enum : s32
{
PER_GAME_SAVE_STATE_SLOTS = 10,
GLOBAL_SAVE_STATE_SLOTS = 10
};
using HostKeyCode = s32;
using HostMouseButton = s32;
@ -39,6 +45,32 @@ public:
using HotkeyInfoList = std::vector<HotkeyInfo>;
struct SaveStateInfo
{
std::string path;
u64 timestamp;
s32 slot;
bool global;
};
struct ExtendedSaveStateInfo
{
std::string path;
u64 timestamp;
s32 slot;
bool global;
std::string title;
std::string game_code;
u32 screenshot_width;
u32 screenshot_height;
std::vector<u32> screenshot_data;
};
using HostInterface::LoadState;
using HostInterface::SaveState;
/// Returns the name of the frontend.
virtual const char* GetFrontendName() const = 0;
@ -47,6 +79,10 @@ public:
virtual bool BootSystem(const SystemBootParameters& parameters) override;
virtual void PowerOffSystem() override;
virtual void DestroySystem() override;
/// Returns the game list.
ALWAYS_INLINE const GameList* GetGameList() const { return m_game_list.get(); }
/// Returns a list of all available hotkeys.
ALWAYS_INLINE const HotkeyInfoList& GetHotkeyInfoList() const { return m_hotkeys; }
@ -57,10 +93,75 @@ public:
/// Returns true if running in batch mode, i.e. exit after emulation.
ALWAYS_INLINE bool InBatchMode() const { return m_batch_mode; }
void PauseSystem(bool paused);
/// Parses command line parameters for all frontends.
bool ParseCommandLineParameters(int argc, char* argv[], std::unique_ptr<SystemBootParameters>* out_boot_params);
/// Loads the current emulation state from file. Specifying a slot of -1 loads the "resume" game state.
bool LoadState(bool global, s32 slot);
/// Saves the current emulation state to a file. Specifying a slot of -1 saves the "resume" save state.
bool SaveState(bool global, s32 slot);
/// Loads the resume save state for the given game. Optionally boots the game anyway if loading fails.
bool ResumeSystemFromState(const char* filename, bool boot_on_failure);
/// Loads the most recent resume save state. This may be global or per-game.
bool ResumeSystemFromMostRecentState();
/// Saves the resume save state, call when shutting down. Not called automatically on DestroySystem() since that can
/// be called as a result of an error.
bool SaveResumeSaveState();
/// Returns a list of save states for the specified game code.
std::vector<SaveStateInfo> GetAvailableSaveStates(const char* game_code) const;
/// Returns save state info if present. If game_code is null or empty, assumes global state.
std::optional<SaveStateInfo> GetSaveStateInfo(const char* game_code, s32 slot);
/// Returns save state info if present. If game_code is null or empty, assumes global state.
std::optional<ExtendedSaveStateInfo> GetExtendedSaveStateInfo(const char* game_code, s32 slot);
/// Deletes save states for the specified game code. If resume is set, the resume state is deleted too.
void DeleteSaveStates(const char* game_code, bool resume);
/// Adds OSD messages, duration is in seconds.
void AddOSDMessage(std::string message, float duration = 2.0f) override;
/// Displays a loading screen with the logo, rendered with ImGui. Use when executing possibly-time-consuming tasks
/// such as compiling shaders when starting up.
void DisplayLoadingScreen(const char* message, int progress_min = -1, int progress_max = -1,
int progress_value = -1) override;
/// Retrieves information about specified game from game list.
void GetGameInfo(const char* path, CDImage* image, std::string* code, std::string* title) override;
/// Returns true if currently dumping audio.
bool IsDumpingAudio() const;
/// Starts dumping audio to a file. If no file name is provided, one will be generated automatically.
bool StartDumpingAudio(const char* filename = nullptr);
/// Stops dumping audio to file if it has been started.
void StopDumpingAudio();
/// Saves a screenshot to the specified file. IF no file name is provided, one will be generated automatically.
bool SaveScreenshot(const char* filename = nullptr, bool full_resolution = true, bool apply_aspect_ratio = true);
protected:
enum : u32
{
SETTINGS_VERSION = 2
};
struct OSDMessage
{
std::string text;
Common::Timer time;
float duration;
};
CommonHostInterface();
~CommonHostInterface();
@ -77,14 +178,10 @@ protected:
virtual std::unique_ptr<ControllerInterface> CreateControllerInterface();
virtual void OnSystemCreated() override;
virtual void OnSystemPaused(bool paused) override;
virtual void OnSystemPaused(bool paused);
virtual void OnSystemDestroyed() override;
virtual void OnRunningGameChanged() override;
virtual void OnControllerTypeChanged(u32 slot) override;
virtual void DrawImGuiWindows() override;
virtual void SetDefaultSettings(SettingsInterface& si) override;
virtual void ApplySettings(SettingsInterface& si) override;
virtual std::optional<HostKeyCode> GetHostKeyCode(const std::string_view key_code) const;
@ -118,9 +215,70 @@ protected:
void UpdateControllerRumble();
void StopControllerRumble();
/// Returns the path to a save state file. Specifying an index of -1 is the "resume" save state.
std::string GetGameSaveStateFileName(const char* game_code, s32 slot) const;
/// Returns the path to a save state file. Specifying an index of -1 is the "resume" save state.
std::string GetGlobalSaveStateFileName(s32 slot) const;
/// Sets the base path for the user directory. Can be overridden by platform/frontend/command line.
virtual void SetUserDirectory();
/// Performs the initial load of settings. Should call CheckSettings() and LoadSettings(SettingsInterface&).
virtual void LoadSettings() = 0;
/// Updates logging settings.
virtual void UpdateLogSettings(LOGLEVEL level, const char* filter, bool log_to_console, bool log_to_debug,
bool log_to_window, bool log_to_file);
/// Returns the path of the settings file.
std::string GetSettingsFileName() const;
/// Returns the most recent resume save state.
std::string GetMostRecentResumeSaveStatePath() const;
/// Ensures the settings is valid and the correct version. If not, resets to defaults.
void CheckSettings(SettingsInterface& si);
/// Restores all settings to defaults.
virtual void SetDefaultSettings(SettingsInterface& si);
/// Loads settings to m_settings and any frontend-specific parameters.
virtual void LoadSettings(SettingsInterface& si);
/// Saves current settings variables to ini.
virtual void SaveSettings(SettingsInterface& si);
/// Checks for settings changes, std::move() the old settings away for comparing beforehand.
virtual void CheckForSettingsChanges(const Settings& old_settings);
/// Increases timer resolution when supported by the host OS.
void SetTimerResolutionIncreased(bool enabled);
void UpdateSpeedLimiterState();
void RecreateSystem() override;
virtual void DrawImGuiWindows();
void DrawFPSWindow();
void DrawOSDMessages();
void DrawDebugWindows();
std::unique_ptr<GameList> m_game_list;
std::unique_ptr<ControllerInterface> m_controller_interface;
std::deque<OSDMessage> m_osd_messages;
std::mutex m_osd_messages_lock;
bool m_paused = false;
bool m_speed_limiter_temp_disabled = false;
bool m_speed_limiter_enabled = false;
bool m_timer_resolution_increased = false;
private:
void InitializeUserDirectory();
void RegisterGeneralHotkeys();
void RegisterGraphicsHotkeys();
void RegisterSaveStateHotkeys();

View file

@ -45,9 +45,9 @@ void SaveStateSelectorUI::RefreshList()
const System* system = m_host_interface->GetSystem();
if (system && !system->GetRunningCode().empty())
{
for (s32 i = 1; i <= HostInterface::GLOBAL_SAVE_STATE_SLOTS; i++)
for (s32 i = 1; i <= CommonHostInterface::GLOBAL_SAVE_STATE_SLOTS; i++)
{
std::optional<HostInterface::ExtendedSaveStateInfo> ssi =
std::optional<CommonHostInterface::ExtendedSaveStateInfo> ssi =
m_host_interface->GetExtendedSaveStateInfo(system->GetRunningCode().c_str(), i);
ListEntry li;
@ -60,9 +60,10 @@ void SaveStateSelectorUI::RefreshList()
}
}
for (s32 i = 1; i <= HostInterface::GLOBAL_SAVE_STATE_SLOTS; i++)
for (s32 i = 1; i <= CommonHostInterface::GLOBAL_SAVE_STATE_SLOTS; i++)
{
std::optional<HostInterface::ExtendedSaveStateInfo> ssi = m_host_interface->GetExtendedSaveStateInfo(nullptr, i);
std::optional<CommonHostInterface::ExtendedSaveStateInfo> ssi =
m_host_interface->GetExtendedSaveStateInfo(nullptr, i);
ListEntry li;
if (ssi)
@ -118,7 +119,7 @@ void SaveStateSelectorUI::SelectPreviousSlot()
(m_current_selection == 0) ? (static_cast<u32>(m_slots.size()) - 1u) : (m_current_selection - 1);
}
void SaveStateSelectorUI::InitializeListEntry(ListEntry* li, HostInterface::ExtendedSaveStateInfo* ssi)
void SaveStateSelectorUI::InitializeListEntry(ListEntry* li, CommonHostInterface::ExtendedSaveStateInfo* ssi)
{
li->title = std::move(ssi->title);
li->game_code = std::move(ssi->game_code);

View file

@ -48,7 +48,7 @@ private:
};
void InitializePlaceholderListEntry(ListEntry* li, s32 slot, bool global);
void InitializeListEntry(ListEntry* li, HostInterface::ExtendedSaveStateInfo* ssi);
void InitializeListEntry(ListEntry* li, CommonHostInterface::ExtendedSaveStateInfo* ssi);
CommonHostInterface* m_host_interface;
std::vector<ListEntry> m_slots;