mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
(libretro) Update core options to v2 format
This commit is contained in:
parent
e86583124e
commit
8b2f9d02f5
4 changed files with 1293 additions and 222 deletions
|
@ -69,7 +69,7 @@ extern "C" {
|
|||
# endif
|
||||
# endif
|
||||
# else
|
||||
# if defined(__GNUC__) && __GNUC__ >= 4 && !defined(__CELLOS_LV2__)
|
||||
# if defined(__GNUC__) && __GNUC__ >= 4
|
||||
# define RETRO_API RETRO_CALLCONV __attribute__((__visibility__("default")))
|
||||
# else
|
||||
# define RETRO_API RETRO_CALLCONV
|
||||
|
@ -282,6 +282,7 @@ enum retro_language
|
|||
RETRO_LANGUAGE_PERSIAN = 20,
|
||||
RETRO_LANGUAGE_HEBREW = 21,
|
||||
RETRO_LANGUAGE_ASTURIAN = 22,
|
||||
RETRO_LANGUAGE_FINNISH = 23,
|
||||
RETRO_LANGUAGE_LAST,
|
||||
|
||||
/* Ensure sizeof(enum) == sizeof(int) */
|
||||
|
@ -712,6 +713,9 @@ enum retro_mod
|
|||
* state of rumble motors in controllers.
|
||||
* A strong and weak motor is supported, and they can be
|
||||
* controlled indepedently.
|
||||
* Should be called from either retro_init() or retro_load_game().
|
||||
* Should not be called from retro_set_environment().
|
||||
* Returns false if rumble functionality is unavailable.
|
||||
*/
|
||||
#define RETRO_ENVIRONMENT_GET_INPUT_DEVICE_CAPABILITIES 24
|
||||
/* uint64_t * --
|
||||
|
@ -1127,6 +1131,13 @@ enum retro_mod
|
|||
* retro_core_option_definition structs to RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL.
|
||||
* This allows the core to additionally set option sublabel information
|
||||
* and/or provide localisation support.
|
||||
*
|
||||
* If version is >= 2, core options may instead be set by passing
|
||||
* a retro_core_options_v2 struct to RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2,
|
||||
* or an array of retro_core_options_v2 structs to
|
||||
* RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2_INTL. This allows the core
|
||||
* to additionally set optional core option category information
|
||||
* for frontends with core option category support.
|
||||
*/
|
||||
|
||||
#define RETRO_ENVIRONMENT_SET_CORE_OPTIONS 53
|
||||
|
@ -1168,7 +1179,7 @@ enum retro_mod
|
|||
* default value is NULL, the first entry in the
|
||||
* retro_core_option_definition::values array is treated as the default.
|
||||
*
|
||||
* The number of possible options should be very limited,
|
||||
* The number of possible option values should be very limited,
|
||||
* and must be less than RETRO_NUM_CORE_OPTION_VALUES_MAX.
|
||||
* i.e. it should be feasible to cycle through options
|
||||
* without a keyboard.
|
||||
|
@ -1201,6 +1212,7 @@ enum retro_mod
|
|||
* This should only be called if RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION
|
||||
* returns an API version of >= 1.
|
||||
* This should be called instead of RETRO_ENVIRONMENT_SET_VARIABLES.
|
||||
* This should be called instead of RETRO_ENVIRONMENT_SET_CORE_OPTIONS.
|
||||
* This should be called the first time as early as
|
||||
* possible (ideally in retro_set_environment).
|
||||
* Afterwards it may be called again for the core to communicate
|
||||
|
@ -1374,6 +1386,373 @@ enum retro_mod
|
|||
* call will target the newly initialized driver.
|
||||
*/
|
||||
|
||||
#define RETRO_ENVIRONMENT_SET_FASTFORWARDING_OVERRIDE 64
|
||||
/* const struct retro_fastforwarding_override * --
|
||||
* Used by a libretro core to override the current
|
||||
* fastforwarding mode of the frontend.
|
||||
* If NULL is passed to this function, the frontend
|
||||
* will return true if fastforwarding override
|
||||
* functionality is supported (no change in
|
||||
* fastforwarding state will occur in this case).
|
||||
*/
|
||||
|
||||
#define RETRO_ENVIRONMENT_SET_CONTENT_INFO_OVERRIDE 65
|
||||
/* const struct retro_system_content_info_override * --
|
||||
* Allows an implementation to override 'global' content
|
||||
* info parameters reported by retro_get_system_info().
|
||||
* Overrides also affect subsystem content info parameters
|
||||
* set via RETRO_ENVIRONMENT_SET_SUBSYSTEM_INFO.
|
||||
* This function must be called inside retro_set_environment().
|
||||
* If callback returns false, content info overrides
|
||||
* are unsupported by the frontend, and will be ignored.
|
||||
* If callback returns true, extended game info may be
|
||||
* retrieved by calling RETRO_ENVIRONMENT_GET_GAME_INFO_EXT
|
||||
* in retro_load_game() or retro_load_game_special().
|
||||
*
|
||||
* 'data' points to an array of retro_system_content_info_override
|
||||
* structs terminated by a { NULL, false, false } element.
|
||||
* If 'data' is NULL, no changes will be made to the frontend;
|
||||
* a core may therefore pass NULL in order to test whether
|
||||
* the RETRO_ENVIRONMENT_SET_CONTENT_INFO_OVERRIDE and
|
||||
* RETRO_ENVIRONMENT_GET_GAME_INFO_EXT callbacks are supported
|
||||
* by the frontend.
|
||||
*
|
||||
* For struct member descriptions, see the definition of
|
||||
* struct retro_system_content_info_override.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* - struct retro_system_info:
|
||||
* {
|
||||
* "My Core", // library_name
|
||||
* "v1.0", // library_version
|
||||
* "m3u|md|cue|iso|chd|sms|gg|sg", // valid_extensions
|
||||
* true, // need_fullpath
|
||||
* false // block_extract
|
||||
* }
|
||||
*
|
||||
* - Array of struct retro_system_content_info_override:
|
||||
* {
|
||||
* {
|
||||
* "md|sms|gg", // extensions
|
||||
* false, // need_fullpath
|
||||
* true // persistent_data
|
||||
* },
|
||||
* {
|
||||
* "sg", // extensions
|
||||
* false, // need_fullpath
|
||||
* false // persistent_data
|
||||
* },
|
||||
* { NULL, false, false }
|
||||
* }
|
||||
*
|
||||
* Result:
|
||||
* - Files of type m3u, cue, iso, chd will not be
|
||||
* loaded by the frontend. Frontend will pass a
|
||||
* valid path to the core, and core will handle
|
||||
* loading internally
|
||||
* - Files of type md, sms, gg will be loaded by
|
||||
* the frontend. A valid memory buffer will be
|
||||
* passed to the core. This memory buffer will
|
||||
* remain valid until retro_deinit() returns
|
||||
* - Files of type sg will be loaded by the frontend.
|
||||
* A valid memory buffer will be passed to the core.
|
||||
* This memory buffer will remain valid until
|
||||
* retro_load_game() (or retro_load_game_special())
|
||||
* returns
|
||||
*
|
||||
* NOTE: If an extension is listed multiple times in
|
||||
* an array of retro_system_content_info_override
|
||||
* structs, only the first instance will be registered
|
||||
*/
|
||||
|
||||
#define RETRO_ENVIRONMENT_GET_GAME_INFO_EXT 66
|
||||
/* const struct retro_game_info_ext ** --
|
||||
* Allows an implementation to fetch extended game
|
||||
* information, providing additional content path
|
||||
* and memory buffer status details.
|
||||
* This function may only be called inside
|
||||
* retro_load_game() or retro_load_game_special().
|
||||
* If callback returns false, extended game information
|
||||
* is unsupported by the frontend. In this case, only
|
||||
* regular retro_game_info will be available.
|
||||
* RETRO_ENVIRONMENT_GET_GAME_INFO_EXT is guaranteed
|
||||
* to return true if RETRO_ENVIRONMENT_SET_CONTENT_INFO_OVERRIDE
|
||||
* returns true.
|
||||
*
|
||||
* 'data' points to an array of retro_game_info_ext structs.
|
||||
*
|
||||
* For struct member descriptions, see the definition of
|
||||
* struct retro_game_info_ext.
|
||||
*
|
||||
* - If function is called inside retro_load_game(),
|
||||
* the retro_game_info_ext array is guaranteed to
|
||||
* have a size of 1 - i.e. the returned pointer may
|
||||
* be used to access directly the members of the
|
||||
* first retro_game_info_ext struct, for example:
|
||||
*
|
||||
* struct retro_game_info_ext *game_info_ext;
|
||||
* if (environ_cb(RETRO_ENVIRONMENT_GET_GAME_INFO_EXT, &game_info_ext))
|
||||
* printf("Content Directory: %s\n", game_info_ext->dir);
|
||||
*
|
||||
* - If the function is called inside retro_load_game_special(),
|
||||
* the retro_game_info_ext array is guaranteed to have a
|
||||
* size equal to the num_info argument passed to
|
||||
* retro_load_game_special()
|
||||
*/
|
||||
|
||||
#define RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2 67
|
||||
/* const struct retro_core_options_v2 * --
|
||||
* Allows an implementation to signal the environment
|
||||
* which variables it might want to check for later using
|
||||
* GET_VARIABLE.
|
||||
* This allows the frontend to present these variables to
|
||||
* a user dynamically.
|
||||
* This should only be called if RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION
|
||||
* returns an API version of >= 2.
|
||||
* This should be called instead of RETRO_ENVIRONMENT_SET_VARIABLES.
|
||||
* This should be called instead of RETRO_ENVIRONMENT_SET_CORE_OPTIONS.
|
||||
* This should be called the first time as early as
|
||||
* possible (ideally in retro_set_environment).
|
||||
* Afterwards it may be called again for the core to communicate
|
||||
* updated options to the frontend, but the number of core
|
||||
* options must not change from the number in the initial call.
|
||||
* If RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION returns an API
|
||||
* version of >= 2, this callback is guaranteed to succeed
|
||||
* (i.e. callback return value does not indicate success)
|
||||
* If callback returns true, frontend has core option category
|
||||
* support.
|
||||
* If callback returns false, frontend does not have core option
|
||||
* category support.
|
||||
*
|
||||
* 'data' points to a retro_core_options_v2 struct, containing
|
||||
* of two pointers:
|
||||
* - retro_core_options_v2::categories is an array of
|
||||
* retro_core_option_v2_category structs terminated by a
|
||||
* { NULL, NULL, NULL } element. If retro_core_options_v2::categories
|
||||
* is NULL, all core options will have no category and will be shown
|
||||
* at the top level of the frontend core option interface. If frontend
|
||||
* does not have core option category support, categories array will
|
||||
* be ignored.
|
||||
* - retro_core_options_v2::definitions is an array of
|
||||
* retro_core_option_v2_definition structs terminated by a
|
||||
* { NULL, NULL, NULL, NULL, NULL, NULL, {{0}}, NULL }
|
||||
* element.
|
||||
*
|
||||
* >> retro_core_option_v2_category notes:
|
||||
*
|
||||
* - retro_core_option_v2_category::key should contain string
|
||||
* that uniquely identifies the core option category. Valid
|
||||
* key characters are [a-z, A-Z, 0-9, _, -]
|
||||
* Namespace collisions with other implementations' category
|
||||
* keys are permitted.
|
||||
* - retro_core_option_v2_category::desc should contain a human
|
||||
* readable description of the category key.
|
||||
* - retro_core_option_v2_category::info should contain any
|
||||
* additional human readable information text that a typical
|
||||
* user may need to understand the nature of the core option
|
||||
* category.
|
||||
*
|
||||
* Example entry:
|
||||
* {
|
||||
* "advanced_settings",
|
||||
* "Advanced",
|
||||
* "Options affecting low-level emulation performance and accuracy."
|
||||
* }
|
||||
*
|
||||
* >> retro_core_option_v2_definition notes:
|
||||
*
|
||||
* - retro_core_option_v2_definition::key should be namespaced to not
|
||||
* collide with other implementations' keys. e.g. A core called
|
||||
* 'foo' should use keys named as 'foo_option'. Valid key characters
|
||||
* are [a-z, A-Z, 0-9, _, -].
|
||||
* - retro_core_option_v2_definition::desc should contain a human readable
|
||||
* description of the key. Will be used when the frontend does not
|
||||
* have core option category support. Examples: "Aspect Ratio" or
|
||||
* "Video > Aspect Ratio".
|
||||
* - retro_core_option_v2_definition::desc_categorized should contain a
|
||||
* human readable description of the key, which will be used when
|
||||
* frontend has core option category support. Example: "Aspect Ratio",
|
||||
* where associated retro_core_option_v2_category::desc is "Video".
|
||||
* If empty or NULL, the string specified by
|
||||
* retro_core_option_v2_definition::desc will be used instead.
|
||||
* retro_core_option_v2_definition::desc_categorized will be ignored
|
||||
* if retro_core_option_v2_definition::category_key is empty or NULL.
|
||||
* - retro_core_option_v2_definition::info should contain any additional
|
||||
* human readable information text that a typical user may need to
|
||||
* understand the functionality of the option.
|
||||
* - retro_core_option_v2_definition::info_categorized should contain
|
||||
* any additional human readable information text that a typical user
|
||||
* may need to understand the functionality of the option, and will be
|
||||
* used when frontend has core option category support. This is provided
|
||||
* to accommodate the case where info text references an option by
|
||||
* name/desc, and the desc/desc_categorized text for that option differ.
|
||||
* If empty or NULL, the string specified by
|
||||
* retro_core_option_v2_definition::info will be used instead.
|
||||
* retro_core_option_v2_definition::info_categorized will be ignored
|
||||
* if retro_core_option_v2_definition::category_key is empty or NULL.
|
||||
* - retro_core_option_v2_definition::category_key should contain a
|
||||
* category identifier (e.g. "video" or "audio") that will be
|
||||
* assigned to the core option if frontend has core option category
|
||||
* support. A categorized option will be shown in a subsection/
|
||||
* submenu of the frontend core option interface. If key is empty
|
||||
* or NULL, or if key does not match one of the
|
||||
* retro_core_option_v2_category::key values in the associated
|
||||
* retro_core_option_v2_category array, option will have no category
|
||||
* and will be shown at the top level of the frontend core option
|
||||
* interface.
|
||||
* - retro_core_option_v2_definition::values is an array of
|
||||
* retro_core_option_value structs terminated by a { NULL, NULL }
|
||||
* element.
|
||||
* --> retro_core_option_v2_definition::values[index].value is an
|
||||
* expected option value.
|
||||
* --> retro_core_option_v2_definition::values[index].label is a
|
||||
* human readable label used when displaying the value on screen.
|
||||
* If NULL, the value itself is used.
|
||||
* - retro_core_option_v2_definition::default_value is the default
|
||||
* core option setting. It must match one of the expected option
|
||||
* values in the retro_core_option_v2_definition::values array. If
|
||||
* it does not, or the default value is NULL, the first entry in the
|
||||
* retro_core_option_v2_definition::values array is treated as the
|
||||
* default.
|
||||
*
|
||||
* The number of possible option values should be very limited,
|
||||
* and must be less than RETRO_NUM_CORE_OPTION_VALUES_MAX.
|
||||
* i.e. it should be feasible to cycle through options
|
||||
* without a keyboard.
|
||||
*
|
||||
* Example entries:
|
||||
*
|
||||
* - Uncategorized:
|
||||
*
|
||||
* {
|
||||
* "foo_option",
|
||||
* "Speed hack coprocessor X",
|
||||
* NULL,
|
||||
* "Provides increased performance at the expense of reduced accuracy.",
|
||||
* NULL,
|
||||
* NULL,
|
||||
* {
|
||||
* { "false", NULL },
|
||||
* { "true", NULL },
|
||||
* { "unstable", "Turbo (Unstable)" },
|
||||
* { NULL, NULL },
|
||||
* },
|
||||
* "false"
|
||||
* }
|
||||
*
|
||||
* - Categorized:
|
||||
*
|
||||
* {
|
||||
* "foo_option",
|
||||
* "Advanced > Speed hack coprocessor X",
|
||||
* "Speed hack coprocessor X",
|
||||
* "Setting 'Advanced > Speed hack coprocessor X' to 'true' or 'Turbo' provides increased performance at the expense of reduced accuracy",
|
||||
* "Setting 'Speed hack coprocessor X' to 'true' or 'Turbo' provides increased performance at the expense of reduced accuracy",
|
||||
* "advanced_settings",
|
||||
* {
|
||||
* { "false", NULL },
|
||||
* { "true", NULL },
|
||||
* { "unstable", "Turbo (Unstable)" },
|
||||
* { NULL, NULL },
|
||||
* },
|
||||
* "false"
|
||||
* }
|
||||
*
|
||||
* Only strings are operated on. The possible values will
|
||||
* generally be displayed and stored as-is by the frontend.
|
||||
*/
|
||||
|
||||
#define RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2_INTL 68
|
||||
/* const struct retro_core_options_v2_intl * --
|
||||
* Allows an implementation to signal the environment
|
||||
* which variables it might want to check for later using
|
||||
* GET_VARIABLE.
|
||||
* This allows the frontend to present these variables to
|
||||
* a user dynamically.
|
||||
* This should only be called if RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION
|
||||
* returns an API version of >= 2.
|
||||
* This should be called instead of RETRO_ENVIRONMENT_SET_VARIABLES.
|
||||
* This should be called instead of RETRO_ENVIRONMENT_SET_CORE_OPTIONS.
|
||||
* This should be called instead of RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL.
|
||||
* This should be called instead of RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2.
|
||||
* This should be called the first time as early as
|
||||
* possible (ideally in retro_set_environment).
|
||||
* Afterwards it may be called again for the core to communicate
|
||||
* updated options to the frontend, but the number of core
|
||||
* options must not change from the number in the initial call.
|
||||
* If RETRO_ENVIRONMENT_GET_CORE_OPTIONS_VERSION returns an API
|
||||
* version of >= 2, this callback is guaranteed to succeed
|
||||
* (i.e. callback return value does not indicate success)
|
||||
* If callback returns true, frontend has core option category
|
||||
* support.
|
||||
* If callback returns false, frontend does not have core option
|
||||
* category support.
|
||||
*
|
||||
* This is fundamentally the same as RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2,
|
||||
* with the addition of localisation support. The description of the
|
||||
* RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2 callback should be consulted
|
||||
* for further details.
|
||||
*
|
||||
* 'data' points to a retro_core_options_v2_intl struct.
|
||||
*
|
||||
* - retro_core_options_v2_intl::us is a pointer to a
|
||||
* retro_core_options_v2 struct defining the US English
|
||||
* core options implementation. It must point to a valid struct.
|
||||
*
|
||||
* - retro_core_options_v2_intl::local is a pointer to a
|
||||
* retro_core_options_v2 struct defining core options for
|
||||
* the current frontend language. It may be NULL (in which case
|
||||
* retro_core_options_v2_intl::us is used by the frontend). Any items
|
||||
* missing from this struct will be read from
|
||||
* retro_core_options_v2_intl::us instead.
|
||||
*
|
||||
* NOTE: Default core option values are always taken from the
|
||||
* retro_core_options_v2_intl::us struct. Any default values in
|
||||
* the retro_core_options_v2_intl::local struct will be ignored.
|
||||
*/
|
||||
|
||||
#define RETRO_ENVIRONMENT_SET_CORE_OPTIONS_UPDATE_DISPLAY_CALLBACK 69
|
||||
/* const struct retro_core_options_update_display_callback * --
|
||||
* Allows a frontend to signal that a core must update
|
||||
* the visibility of any dynamically hidden core options,
|
||||
* and enables the frontend to detect visibility changes.
|
||||
* Used by the frontend to update the menu display status
|
||||
* of core options without requiring a call of retro_run().
|
||||
* Must be called in retro_set_environment().
|
||||
*/
|
||||
|
||||
#define RETRO_ENVIRONMENT_SET_VARIABLE 70
|
||||
/* const struct retro_variable * --
|
||||
* Allows an implementation to notify the frontend
|
||||
* that a core option value has changed.
|
||||
*
|
||||
* retro_variable::key and retro_variable::value
|
||||
* must match strings that have been set previously
|
||||
* via one of the following:
|
||||
*
|
||||
* - RETRO_ENVIRONMENT_SET_VARIABLES
|
||||
* - RETRO_ENVIRONMENT_SET_CORE_OPTIONS
|
||||
* - RETRO_ENVIRONMENT_SET_CORE_OPTIONS_INTL
|
||||
* - RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2
|
||||
* - RETRO_ENVIRONMENT_SET_CORE_OPTIONS_V2_INTL
|
||||
*
|
||||
* After changing a core option value via this
|
||||
* callback, RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE
|
||||
* will return true.
|
||||
*
|
||||
* If data is NULL, no changes will be registered
|
||||
* and the callback will return true; an
|
||||
* implementation may therefore pass NULL in order
|
||||
* to test whether the callback is supported.
|
||||
*/
|
||||
|
||||
#define RETRO_ENVIRONMENT_GET_THROTTLE_STATE (71 | RETRO_ENVIRONMENT_EXPERIMENTAL)
|
||||
/* struct retro_throttle_state * --
|
||||
* Allows an implementation to get details on the actual rate
|
||||
* the frontend is attempting to call retro_run().
|
||||
*/
|
||||
|
||||
/* VFS functionality */
|
||||
|
||||
/* File paths:
|
||||
|
@ -2777,6 +3156,213 @@ struct retro_system_info
|
|||
bool block_extract;
|
||||
};
|
||||
|
||||
/* Defines overrides which modify frontend handling of
|
||||
* specific content file types.
|
||||
* An array of retro_system_content_info_override is
|
||||
* passed to RETRO_ENVIRONMENT_SET_CONTENT_INFO_OVERRIDE
|
||||
* NOTE: In the following descriptions, references to
|
||||
* retro_load_game() may be replaced with
|
||||
* retro_load_game_special() */
|
||||
struct retro_system_content_info_override
|
||||
{
|
||||
/* A list of file extensions for which the override
|
||||
* should apply, delimited by a 'pipe' character
|
||||
* (e.g. "md|sms|gg")
|
||||
* Permitted file extensions are limited to those
|
||||
* included in retro_system_info::valid_extensions
|
||||
* and/or retro_subsystem_rom_info::valid_extensions */
|
||||
const char *extensions;
|
||||
|
||||
/* Overrides the need_fullpath value set in
|
||||
* retro_system_info and/or retro_subsystem_rom_info.
|
||||
* To reiterate:
|
||||
*
|
||||
* If need_fullpath is true and retro_load_game() is called:
|
||||
* - retro_game_info::path is guaranteed to contain a valid
|
||||
* path to an existent file
|
||||
* - retro_game_info::data and retro_game_info::size are invalid
|
||||
*
|
||||
* If need_fullpath is false and retro_load_game() is called:
|
||||
* - retro_game_info::path may be NULL
|
||||
* - retro_game_info::data and retro_game_info::size are guaranteed
|
||||
* to be valid
|
||||
*
|
||||
* In addition:
|
||||
*
|
||||
* If need_fullpath is true and retro_load_game() is called:
|
||||
* - retro_game_info_ext::full_path is guaranteed to contain a valid
|
||||
* path to an existent file
|
||||
* - retro_game_info_ext::archive_path may be NULL
|
||||
* - retro_game_info_ext::archive_file may be NULL
|
||||
* - retro_game_info_ext::dir is guaranteed to contain a valid path
|
||||
* to the directory in which the content file exists
|
||||
* - retro_game_info_ext::name is guaranteed to contain the
|
||||
* basename of the content file, without extension
|
||||
* - retro_game_info_ext::ext is guaranteed to contain the
|
||||
* extension of the content file in lower case format
|
||||
* - retro_game_info_ext::data and retro_game_info_ext::size
|
||||
* are invalid
|
||||
*
|
||||
* If need_fullpath is false and retro_load_game() is called:
|
||||
* - If retro_game_info_ext::file_in_archive is false:
|
||||
* - retro_game_info_ext::full_path is guaranteed to contain
|
||||
* a valid path to an existent file
|
||||
* - retro_game_info_ext::archive_path may be NULL
|
||||
* - retro_game_info_ext::archive_file may be NULL
|
||||
* - retro_game_info_ext::dir is guaranteed to contain a
|
||||
* valid path to the directory in which the content file exists
|
||||
* - retro_game_info_ext::name is guaranteed to contain the
|
||||
* basename of the content file, without extension
|
||||
* - retro_game_info_ext::ext is guaranteed to contain the
|
||||
* extension of the content file in lower case format
|
||||
* - If retro_game_info_ext::file_in_archive is true:
|
||||
* - retro_game_info_ext::full_path may be NULL
|
||||
* - retro_game_info_ext::archive_path is guaranteed to
|
||||
* contain a valid path to an existent compressed file
|
||||
* inside which the content file is located
|
||||
* - retro_game_info_ext::archive_file is guaranteed to
|
||||
* contain a valid path to an existent content file
|
||||
* inside the compressed file referred to by
|
||||
* retro_game_info_ext::archive_path
|
||||
* e.g. for a compressed file '/path/to/foo.zip'
|
||||
* containing 'bar.sfc'
|
||||
* > retro_game_info_ext::archive_path will be '/path/to/foo.zip'
|
||||
* > retro_game_info_ext::archive_file will be 'bar.sfc'
|
||||
* - retro_game_info_ext::dir is guaranteed to contain a
|
||||
* valid path to the directory in which the compressed file
|
||||
* (containing the content file) exists
|
||||
* - retro_game_info_ext::name is guaranteed to contain
|
||||
* EITHER
|
||||
* 1) the basename of the compressed file (containing
|
||||
* the content file), without extension
|
||||
* OR
|
||||
* 2) the basename of the content file inside the
|
||||
* compressed file, without extension
|
||||
* In either case, a core should consider 'name' to
|
||||
* be the canonical name/ID of the the content file
|
||||
* - retro_game_info_ext::ext is guaranteed to contain the
|
||||
* extension of the content file inside the compressed file,
|
||||
* in lower case format
|
||||
* - retro_game_info_ext::data and retro_game_info_ext::size are
|
||||
* guaranteed to be valid */
|
||||
bool need_fullpath;
|
||||
|
||||
/* If need_fullpath is false, specifies whether the content
|
||||
* data buffer available in retro_load_game() is 'persistent'
|
||||
*
|
||||
* If persistent_data is false and retro_load_game() is called:
|
||||
* - retro_game_info::data and retro_game_info::size
|
||||
* are valid only until retro_load_game() returns
|
||||
* - retro_game_info_ext::data and retro_game_info_ext::size
|
||||
* are valid only until retro_load_game() returns
|
||||
*
|
||||
* If persistent_data is true and retro_load_game() is called:
|
||||
* - retro_game_info::data and retro_game_info::size
|
||||
* are valid until retro_deinit() returns
|
||||
* - retro_game_info_ext::data and retro_game_info_ext::size
|
||||
* are valid until retro_deinit() returns */
|
||||
bool persistent_data;
|
||||
};
|
||||
|
||||
/* Similar to retro_game_info, but provides extended
|
||||
* information about the source content file and
|
||||
* game memory buffer status.
|
||||
* And array of retro_game_info_ext is returned by
|
||||
* RETRO_ENVIRONMENT_GET_GAME_INFO_EXT
|
||||
* NOTE: In the following descriptions, references to
|
||||
* retro_load_game() may be replaced with
|
||||
* retro_load_game_special() */
|
||||
struct retro_game_info_ext
|
||||
{
|
||||
/* - If file_in_archive is false, contains a valid
|
||||
* path to an existent content file (UTF-8 encoded)
|
||||
* - If file_in_archive is true, may be NULL */
|
||||
const char *full_path;
|
||||
|
||||
/* - If file_in_archive is false, may be NULL
|
||||
* - If file_in_archive is true, contains a valid path
|
||||
* to an existent compressed file inside which the
|
||||
* content file is located (UTF-8 encoded) */
|
||||
const char *archive_path;
|
||||
|
||||
/* - If file_in_archive is false, may be NULL
|
||||
* - If file_in_archive is true, contain a valid path
|
||||
* to an existent content file inside the compressed
|
||||
* file referred to by archive_path (UTF-8 encoded)
|
||||
* e.g. for a compressed file '/path/to/foo.zip'
|
||||
* containing 'bar.sfc'
|
||||
* > archive_path will be '/path/to/foo.zip'
|
||||
* > archive_file will be 'bar.sfc' */
|
||||
const char *archive_file;
|
||||
|
||||
/* - If file_in_archive is false, contains a valid path
|
||||
* to the directory in which the content file exists
|
||||
* (UTF-8 encoded)
|
||||
* - If file_in_archive is true, contains a valid path
|
||||
* to the directory in which the compressed file
|
||||
* (containing the content file) exists (UTF-8 encoded) */
|
||||
const char *dir;
|
||||
|
||||
/* Contains the canonical name/ID of the content file
|
||||
* (UTF-8 encoded). Intended for use when identifying
|
||||
* 'complementary' content named after the loaded file -
|
||||
* i.e. companion data of a different format (a CD image
|
||||
* required by a ROM), texture packs, internally handled
|
||||
* save files, etc.
|
||||
* - If file_in_archive is false, contains the basename
|
||||
* of the content file, without extension
|
||||
* - If file_in_archive is true, then string is
|
||||
* implementation specific. A frontend may choose to
|
||||
* set a name value of:
|
||||
* EITHER
|
||||
* 1) the basename of the compressed file (containing
|
||||
* the content file), without extension
|
||||
* OR
|
||||
* 2) the basename of the content file inside the
|
||||
* compressed file, without extension
|
||||
* RetroArch sets the 'name' value according to (1).
|
||||
* A frontend that supports routine loading of
|
||||
* content from archives containing multiple unrelated
|
||||
* content files may set the 'name' value according
|
||||
* to (2). */
|
||||
const char *name;
|
||||
|
||||
/* - If file_in_archive is false, contains the extension
|
||||
* of the content file in lower case format
|
||||
* - If file_in_archive is true, contains the extension
|
||||
* of the content file inside the compressed file,
|
||||
* in lower case format */
|
||||
const char *ext;
|
||||
|
||||
/* String of implementation specific meta-data. */
|
||||
const char *meta;
|
||||
|
||||
/* Memory buffer of loaded game content. Will be NULL:
|
||||
* IF
|
||||
* - retro_system_info::need_fullpath is true and
|
||||
* retro_system_content_info_override::need_fullpath
|
||||
* is unset
|
||||
* OR
|
||||
* - retro_system_content_info_override::need_fullpath
|
||||
* is true */
|
||||
const void *data;
|
||||
|
||||
/* Size of game content memory buffer, in bytes */
|
||||
size_t size;
|
||||
|
||||
/* True if loaded content file is inside a compressed
|
||||
* archive */
|
||||
bool file_in_archive;
|
||||
|
||||
/* - If data is NULL, value is unset/ignored
|
||||
* - If data is non-NULL:
|
||||
* - If persistent_data is false, data and size are
|
||||
* valid only until retro_load_game() returns
|
||||
* - If persistent_data is true, data and size are
|
||||
* are valid until retro_deinit() returns */
|
||||
bool persistent_data;
|
||||
};
|
||||
|
||||
struct retro_game_geometry
|
||||
{
|
||||
unsigned base_width; /* Nominal video width of game. */
|
||||
|
@ -2888,6 +3474,143 @@ struct retro_core_options_intl
|
|||
struct retro_core_option_definition *local;
|
||||
};
|
||||
|
||||
struct retro_core_option_v2_category
|
||||
{
|
||||
/* Variable uniquely identifying the
|
||||
* option category. Valid key characters
|
||||
* are [a-z, A-Z, 0-9, _, -] */
|
||||
const char *key;
|
||||
|
||||
/* Human-readable category description
|
||||
* > Used as category menu label when
|
||||
* frontend has core option category
|
||||
* support */
|
||||
const char *desc;
|
||||
|
||||
/* Human-readable category information
|
||||
* > Used as category menu sublabel when
|
||||
* frontend has core option category
|
||||
* support
|
||||
* > Optional (may be NULL or an empty
|
||||
* string) */
|
||||
const char *info;
|
||||
};
|
||||
|
||||
struct retro_core_option_v2_definition
|
||||
{
|
||||
/* Variable to query in RETRO_ENVIRONMENT_GET_VARIABLE.
|
||||
* Valid key characters are [a-z, A-Z, 0-9, _, -] */
|
||||
const char *key;
|
||||
|
||||
/* Human-readable core option description
|
||||
* > Used as menu label when frontend does
|
||||
* not have core option category support
|
||||
* e.g. "Video > Aspect Ratio" */
|
||||
const char *desc;
|
||||
|
||||
/* Human-readable core option description
|
||||
* > Used as menu label when frontend has
|
||||
* core option category support
|
||||
* e.g. "Aspect Ratio", where associated
|
||||
* retro_core_option_v2_category::desc
|
||||
* is "Video"
|
||||
* > If empty or NULL, the string specified by
|
||||
* desc will be used as the menu label
|
||||
* > Will be ignored (and may be set to NULL)
|
||||
* if category_key is empty or NULL */
|
||||
const char *desc_categorized;
|
||||
|
||||
/* Human-readable core option information
|
||||
* > Used as menu sublabel */
|
||||
const char *info;
|
||||
|
||||
/* Human-readable core option information
|
||||
* > Used as menu sublabel when frontend
|
||||
* has core option category support
|
||||
* (e.g. may be required when info text
|
||||
* references an option by name/desc,
|
||||
* and the desc/desc_categorized text
|
||||
* for that option differ)
|
||||
* > If empty or NULL, the string specified by
|
||||
* info will be used as the menu sublabel
|
||||
* > Will be ignored (and may be set to NULL)
|
||||
* if category_key is empty or NULL */
|
||||
const char *info_categorized;
|
||||
|
||||
/* Variable specifying category (e.g. "video",
|
||||
* "audio") that will be assigned to the option
|
||||
* if frontend has core option category support.
|
||||
* > Categorized options will be displayed in a
|
||||
* subsection/submenu of the frontend core
|
||||
* option interface
|
||||
* > Specified string must match one of the
|
||||
* retro_core_option_v2_category::key values
|
||||
* in the associated retro_core_option_v2_category
|
||||
* array; If no match is not found, specified
|
||||
* string will be considered as NULL
|
||||
* > If specified string is empty or NULL, option will
|
||||
* have no category and will be shown at the top
|
||||
* level of the frontend core option interface */
|
||||
const char *category_key;
|
||||
|
||||
/* Array of retro_core_option_value structs, terminated by NULL */
|
||||
struct retro_core_option_value values[RETRO_NUM_CORE_OPTION_VALUES_MAX];
|
||||
|
||||
/* Default core option value. Must match one of the values
|
||||
* in the retro_core_option_value array, otherwise will be
|
||||
* ignored */
|
||||
const char *default_value;
|
||||
};
|
||||
|
||||
struct retro_core_options_v2
|
||||
{
|
||||
/* Array of retro_core_option_v2_category structs,
|
||||
* terminated by NULL
|
||||
* > If NULL, all entries in definitions array
|
||||
* will have no category and will be shown at
|
||||
* the top level of the frontend core option
|
||||
* interface
|
||||
* > Will be ignored if frontend does not have
|
||||
* core option category support */
|
||||
struct retro_core_option_v2_category *categories;
|
||||
|
||||
/* Array of retro_core_option_v2_definition structs,
|
||||
* terminated by NULL */
|
||||
struct retro_core_option_v2_definition *definitions;
|
||||
};
|
||||
|
||||
struct retro_core_options_v2_intl
|
||||
{
|
||||
/* Pointer to a retro_core_options_v2 struct
|
||||
* > US English implementation
|
||||
* > Must point to a valid struct */
|
||||
struct retro_core_options_v2 *us;
|
||||
|
||||
/* Pointer to a retro_core_options_v2 struct
|
||||
* - Implementation for current frontend language
|
||||
* - May be NULL */
|
||||
struct retro_core_options_v2 *local;
|
||||
};
|
||||
|
||||
/* Used by the frontend to monitor changes in core option
|
||||
* visibility. May be called each time any core option
|
||||
* value is set via the frontend.
|
||||
* - On each invocation, the core must update the visibility
|
||||
* of any dynamically hidden options using the
|
||||
* RETRO_ENVIRONMENT_SET_CORE_OPTIONS_DISPLAY environment
|
||||
* callback.
|
||||
* - On the first invocation, returns 'true' if the visibility
|
||||
* of any core option has changed since the last call of
|
||||
* retro_load_game() or retro_load_game_special().
|
||||
* - On each subsequent invocation, returns 'true' if the
|
||||
* visibility of any core option has changed since the last
|
||||
* time the function was called. */
|
||||
typedef bool (RETRO_CALLCONV *retro_core_options_update_display_callback_t)(void);
|
||||
struct retro_core_options_update_display_callback
|
||||
{
|
||||
retro_core_options_update_display_callback_t callback;
|
||||
};
|
||||
|
||||
struct retro_game_info
|
||||
{
|
||||
const char *path; /* Path to game, UTF-8 encoded.
|
||||
|
@ -2934,6 +3657,84 @@ struct retro_framebuffer
|
|||
Set by frontend in GET_CURRENT_SOFTWARE_FRAMEBUFFER. */
|
||||
};
|
||||
|
||||
/* Used by a libretro core to override the current
|
||||
* fastforwarding mode of the frontend */
|
||||
struct retro_fastforwarding_override
|
||||
{
|
||||
/* Specifies the runtime speed multiplier that
|
||||
* will be applied when 'fastforward' is true.
|
||||
* For example, a value of 5.0 when running 60 FPS
|
||||
* content will cap the fast-forward rate at 300 FPS.
|
||||
* Note that the target multiplier may not be achieved
|
||||
* if the host hardware has insufficient processing
|
||||
* power.
|
||||
* Setting a value of 0.0 (or greater than 0.0 but
|
||||
* less than 1.0) will result in an uncapped
|
||||
* fast-forward rate (limited only by hardware
|
||||
* capacity).
|
||||
* If the value is negative, it will be ignored
|
||||
* (i.e. the frontend will use a runtime speed
|
||||
* multiplier of its own choosing) */
|
||||
float ratio;
|
||||
|
||||
/* If true, fastforwarding mode will be enabled.
|
||||
* If false, fastforwarding mode will be disabled. */
|
||||
bool fastforward;
|
||||
|
||||
/* If true, and if supported by the frontend, an
|
||||
* on-screen notification will be displayed while
|
||||
* 'fastforward' is true.
|
||||
* If false, and if supported by the frontend, any
|
||||
* on-screen fast-forward notifications will be
|
||||
* suppressed */
|
||||
bool notification;
|
||||
|
||||
/* If true, the core will have sole control over
|
||||
* when fastforwarding mode is enabled/disabled;
|
||||
* the frontend will not be able to change the
|
||||
* state set by 'fastforward' until either
|
||||
* 'inhibit_toggle' is set to false, or the core
|
||||
* is unloaded */
|
||||
bool inhibit_toggle;
|
||||
};
|
||||
|
||||
/* During normal operation. Rate will be equal to the core's internal FPS. */
|
||||
#define RETRO_THROTTLE_NONE 0
|
||||
|
||||
/* While paused or stepping single frames. Rate will be 0. */
|
||||
#define RETRO_THROTTLE_FRAME_STEPPING 1
|
||||
|
||||
/* During fast forwarding.
|
||||
* Rate will be 0 if not specifically limited to a maximum speed. */
|
||||
#define RETRO_THROTTLE_FAST_FORWARD 2
|
||||
|
||||
/* During slow motion. Rate will be less than the core's internal FPS. */
|
||||
#define RETRO_THROTTLE_SLOW_MOTION 3
|
||||
|
||||
/* While rewinding recorded save states. Rate can vary depending on the rewind
|
||||
* speed or be 0 if the frontend is not aiming for a specific rate. */
|
||||
#define RETRO_THROTTLE_REWINDING 4
|
||||
|
||||
/* While vsync is active in the video driver and the target refresh rate is
|
||||
* lower than the core's internal FPS. Rate is the target refresh rate. */
|
||||
#define RETRO_THROTTLE_VSYNC 5
|
||||
|
||||
/* When the frontend does not throttle in any way. Rate will be 0.
|
||||
* An example could be if no vsync or audio output is active. */
|
||||
#define RETRO_THROTTLE_UNBLOCKED 6
|
||||
|
||||
struct retro_throttle_state
|
||||
{
|
||||
/* The current throttling mode. Should be one of the values above. */
|
||||
unsigned mode;
|
||||
|
||||
/* How many times per second the frontend aims to call retro_run.
|
||||
* Depending on the mode, it can be 0 if there is no known fixed rate.
|
||||
* This won't be accurate if the total processing time of the core and
|
||||
* the frontend is longer than what is available for one frame. */
|
||||
float rate;
|
||||
};
|
||||
|
||||
/* Callbacks */
|
||||
|
||||
/* Environment callback. Gives implementations a way of performing
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue