/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2014 - Hans-Kristian Arntzen
* Copyright (C) 2011-2016 - Daniel De Matteis
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see .
*/
#ifndef __RETROARCH_H
#define __RETROARCH_H
#include
#include
#include
#include
#include
#include "core_type.h"
#include "core.h"
#ifdef HAVE_MENU
#include "menu/menu_input.h"
#endif
RETRO_BEGIN_DECLS
#define RETRO_ENVIRONMENT_RETROARCH_START_BLOCK 0x800000
#define RETRO_ENVIRONMENT_SET_SAVE_STATE_IN_BACKGROUND (2 | RETRO_ENVIRONMENT_RETROARCH_START_BLOCK)
/* bool * --
* Boolean value that tells the front end to save states in the
* background or not.
*/
#define RETRO_ENVIRONMENT_GET_CLEAR_ALL_THREAD_WAITS_CB (3 | RETRO_ENVIRONMENT_RETROARCH_START_BLOCK)
/* retro_environment_t * --
* Provides the callback to the frontend method which will cancel
* all currently waiting threads. Used when coordination is needed
* between the core and the frontend to gracefully stop all threads.
*/
enum rarch_ctl_state
{
RARCH_CTL_NONE = 0,
/* Initialize all drivers. */
RARCH_CTL_INIT,
/* Deinitializes RetroArch. */
RARCH_CTL_MAIN_DEINIT,
RARCH_CTL_IS_INITED,
RARCH_CTL_IS_DUMMY_CORE,
RARCH_CTL_PREINIT,
RARCH_CTL_DESTROY,
RARCH_CTL_IS_BPS_PREF,
RARCH_CTL_UNSET_BPS_PREF,
RARCH_CTL_IS_PATCH_BLOCKED,
RARCH_CTL_SET_PATCH_BLOCKED,
RARCH_CTL_UNSET_PATCH_BLOCKED,
RARCH_CTL_IS_UPS_PREF,
RARCH_CTL_UNSET_UPS_PREF,
RARCH_CTL_IS_IPS_PREF,
RARCH_CTL_UNSET_IPS_PREF,
RARCH_CTL_IS_SRAM_USED,
RARCH_CTL_SET_SRAM_ENABLE,
RARCH_CTL_SET_SRAM_ENABLE_FORCE,
RARCH_CTL_UNSET_SRAM_ENABLE,
RARCH_CTL_IS_SRAM_LOAD_DISABLED,
RARCH_CTL_IS_SRAM_SAVE_DISABLED,
/* Block config read */
RARCH_CTL_SET_BLOCK_CONFIG_READ,
RARCH_CTL_UNSET_BLOCK_CONFIG_READ,
RARCH_CTL_IS_BLOCK_CONFIG_READ,
/* Username */
RARCH_CTL_HAS_SET_USERNAME,
RARCH_CTL_USERNAME_SET,
RARCH_CTL_USERNAME_UNSET,
RARCH_CTL_SET_FRAME_LIMIT,
RARCH_CTL_TASK_INIT,
RARCH_CTL_FRAME_TIME_FREE,
RARCH_CTL_SET_FRAME_TIME_LAST,
RARCH_CTL_SET_FRAME_TIME,
RARCH_CTL_IS_IDLE,
RARCH_CTL_SET_IDLE,
RARCH_CTL_GET_WINDOWED_SCALE,
RARCH_CTL_SET_WINDOWED_SCALE,
RARCH_CTL_IS_OVERRIDES_ACTIVE,
RARCH_CTL_SET_OVERRIDES_ACTIVE,
RARCH_CTL_UNSET_OVERRIDES_ACTIVE,
RARCH_CTL_IS_REMAPS_CORE_ACTIVE,
RARCH_CTL_SET_REMAPS_CORE_ACTIVE,
RARCH_CTL_UNSET_REMAPS_CORE_ACTIVE,
RARCH_CTL_IS_REMAPS_CONTENT_DIR_ACTIVE,
RARCH_CTL_SET_REMAPS_CONTENT_DIR_ACTIVE,
RARCH_CTL_UNSET_REMAPS_CONTENT_DIR_ACTIVE,
RARCH_CTL_IS_REMAPS_GAME_ACTIVE,
RARCH_CTL_SET_REMAPS_GAME_ACTIVE,
RARCH_CTL_UNSET_REMAPS_GAME_ACTIVE,
RARCH_CTL_IS_MISSING_BIOS,
RARCH_CTL_SET_MISSING_BIOS,
RARCH_CTL_UNSET_MISSING_BIOS,
RARCH_CTL_IS_GAME_OPTIONS_ACTIVE,
RARCH_CTL_IS_NONBLOCK_FORCED,
RARCH_CTL_SET_NONBLOCK_FORCED,
RARCH_CTL_UNSET_NONBLOCK_FORCED,
RARCH_CTL_SET_LIBRETRO_PATH,
RARCH_CTL_IS_PAUSED,
RARCH_CTL_SET_PAUSED,
RARCH_CTL_SET_CORE_SHUTDOWN,
RARCH_CTL_SET_SHUTDOWN,
RARCH_CTL_IS_SHUTDOWN,
/* Runloop state */
RARCH_CTL_STATE_FREE,
/* Performance counters */
RARCH_CTL_GET_PERFCNT,
RARCH_CTL_SET_PERFCNT_ENABLE,
RARCH_CTL_UNSET_PERFCNT_ENABLE,
RARCH_CTL_IS_PERFCNT_ENABLE,
/* Key event */
RARCH_CTL_FRONTEND_KEY_EVENT_GET,
RARCH_CTL_KEY_EVENT_GET,
RARCH_CTL_DATA_DEINIT,
/* Core options */
RARCH_CTL_HAS_CORE_OPTIONS,
RARCH_CTL_GET_CORE_OPTION_SIZE,
RARCH_CTL_IS_CORE_OPTION_UPDATED,
RARCH_CTL_CORE_OPTIONS_LIST_GET,
RARCH_CTL_CORE_OPTION_PREV,
RARCH_CTL_CORE_OPTION_NEXT,
RARCH_CTL_CORE_OPTIONS_GET,
RARCH_CTL_CORE_OPTIONS_INIT,
RARCH_CTL_CORE_OPTIONS_DEINIT,
/* System info */
RARCH_CTL_SYSTEM_INFO_INIT,
RARCH_CTL_SYSTEM_INFO_FREE,
/* HTTP server */
RARCH_CTL_HTTPSERVER_INIT,
RARCH_CTL_HTTPSERVER_DESTROY
};
enum rarch_capabilities
{
RARCH_CAPABILITIES_NONE = 0,
RARCH_CAPABILITIES_CPU,
RARCH_CAPABILITIES_COMPILER
};
enum rarch_override_setting
{
RARCH_OVERRIDE_SETTING_NONE = 0,
RARCH_OVERRIDE_SETTING_LIBRETRO,
RARCH_OVERRIDE_SETTING_VERBOSITY,
RARCH_OVERRIDE_SETTING_LIBRETRO_DIRECTORY,
RARCH_OVERRIDE_SETTING_SAVE_PATH,
RARCH_OVERRIDE_SETTING_STATE_PATH,
RARCH_OVERRIDE_SETTING_NETPLAY_MODE,
RARCH_OVERRIDE_SETTING_NETPLAY_IP_ADDRESS,
RARCH_OVERRIDE_SETTING_NETPLAY_IP_PORT,
RARCH_OVERRIDE_SETTING_NETPLAY_STATELESS_MODE,
RARCH_OVERRIDE_SETTING_NETPLAY_CHECK_FRAMES,
RARCH_OVERRIDE_SETTING_UPS_PREF,
RARCH_OVERRIDE_SETTING_BPS_PREF,
RARCH_OVERRIDE_SETTING_IPS_PREF,
RARCH_OVERRIDE_SETTING_LIBRETRO_DEVICE,
RARCH_OVERRIDE_SETTING_LAST
};
enum runloop_action
{
RUNLOOP_ACTION_NONE = 0,
RUNLOOP_ACTION_AUTOSAVE
};
struct rarch_main_wrap
{
char **argv;
const char *content_path;
const char *sram_path;
const char *state_path;
const char *config_path;
const char *libretro_path;
bool verbose;
bool no_content;
bool touched;
int argc;
};
typedef struct rarch_resolution
{
unsigned idx;
unsigned id;
} rarch_resolution_t;
/* All run-time- / command line flag-related globals go here. */
typedef struct global
{
struct
{
char savefile[8192];
char savestate[8192];
char cheatfile[8192];
char ups[8192];
char bps[8192];
char ips[8192];
char label[8192];
char *remapfile;
} name;
/* Recording. */
struct
{
bool use_output_dir;
char path[8192];
char config[8192];
char output_dir[8192];
char config_dir[8192];
unsigned width;
unsigned height;
size_t gpu_width;
size_t gpu_height;
} record;
/* Settings and/or global state that is specific to
* a console-style implementation. */
struct
{
bool flickerfilter_enable;
bool softfilter_enable;
struct
{
bool pal_enable;
bool pal60_enable;
unsigned char soft_filter_index;
unsigned gamma_correction;
unsigned int flicker_filter_index;
struct
{
bool check;
unsigned count;
uint32_t *list;
rarch_resolution_t current;
rarch_resolution_t initial;
} resolutions;
} screen;
} console;
/* Settings and/or global states specific to menus */
#ifdef HAVE_MENU
struct
{
retro_time_t prev_start_time ;
retro_time_t noop_press_time ;
retro_time_t noop_start_time ;
retro_time_t action_start_time ;
retro_time_t action_press_time ;
enum menu_action prev_action ;
} menu;
#endif
} global_t;
bool rarch_ctl(enum rarch_ctl_state state, void *data);
int retroarch_get_capabilities(enum rarch_capabilities type,
char *s, size_t len);
void retroarch_override_setting_set(enum rarch_override_setting enum_idx, void *data);
void retroarch_override_setting_unset(enum rarch_override_setting enum_idx, void *data);
bool retroarch_override_setting_is_set(enum rarch_override_setting enum_idx, void *data);
bool retroarch_validate_game_options(char *s, size_t len, bool mkdir);
bool retroarch_is_forced_fullscreen(void);
void retroarch_unset_forced_fullscreen(void);
void retroarch_set_current_core_type(enum rarch_core_type type, bool explicitly_set);
void retroarch_set_shader_preset(const char* preset);
void retroarch_unset_shader_preset(void);
char* retroarch_get_shader_preset(void);
bool retroarch_is_switching_display_mode(void);
void retroarch_set_switching_display_mode(void);
void retroarch_unset_switching_display_mode(void);
/**
* retroarch_fail:
* @error_code : Error code.
* @error : Error message to show.
*
* Sanely kills the program.
**/
void retroarch_fail(int error_code, const char *error);
/**
* retroarch_main_init:
* @argc : Count of (commandline) arguments.
* @argv : (Commandline) arguments.
*
* Initializes the program.
*
* Returns: 1 (true) on success, otherwise false (0) if there was an error.
**/
bool retroarch_main_init(int argc, char *argv[]);
bool retroarch_main_quit(void);
global_t *global_get_ptr(void);
/**
* runloop_iterate:
*
* Run Libretro core in RetroArch for one frame.
*
* Returns: 0 on successful run,
* Returns 1 if we have to wait until button input in order
* to wake up the loop.
* Returns -1 if we forcibly quit out of the
* RetroArch iteration loop.
**/
int runloop_iterate(unsigned *sleep_ms);
void runloop_msg_queue_push(const char *msg, unsigned prio,
unsigned duration, bool flush);
bool runloop_msg_queue_pull(const char **ret);
void runloop_get_status(bool *is_paused, bool *is_idle, bool *is_slowmotion,
bool *is_perfcnt_enable);
void runloop_set(enum runloop_action action);
void runloop_unset(enum runloop_action action);
void rarch_menu_running(void);
void rarch_menu_running_finished(void);
bool retroarch_is_on_main_thread(void);
rarch_system_info_t *runloop_get_system_info(void);
struct retro_system_info *runloop_get_libretro_system_info(void);
#ifdef HAVE_THREADS
void runloop_msg_queue_lock(void);
void runloop_msg_queue_unlock(void);
#endif
#ifdef HAVE_DYNAMIC
bool retroarch_core_set_on_cmdline(void);
#endif
RETRO_END_DECLS
#endif