mirror of
https://github.com/libretro/libretro-common.git
synced 2024-11-27 18:31:05 +00:00
Updates
This commit is contained in:
parent
96b7bae6d3
commit
8553d3626b
@ -328,14 +328,21 @@ audio_mixer_sound_t* audio_mixer_load_wav(void *buffer, int32_t size)
|
||||
#ifdef HAVE_RWAV
|
||||
/* WAV data */
|
||||
rwav_t wav;
|
||||
enum rwav_state rwav_ret;
|
||||
/* WAV samples converted to float */
|
||||
float* pcm = NULL;
|
||||
size_t samples = 0;
|
||||
/* Result */
|
||||
audio_mixer_sound_t* sound = NULL;
|
||||
enum rwav_state rwav_ret = rwav_load(&wav, buffer, size);
|
||||
|
||||
if (rwav_ret != RWAV_ITERATE_DONE)
|
||||
wav.bitspersample = 0;
|
||||
wav.numchannels = 0;
|
||||
wav.samplerate = 0;
|
||||
wav.numsamples = 0;
|
||||
wav.subchunk2size = 0;
|
||||
wav.samples = NULL;
|
||||
|
||||
if ((rwav_ret = rwav_load(&wav, buffer, size)) != RWAV_ITERATE_DONE)
|
||||
return NULL;
|
||||
|
||||
samples = wav.numsamples * 2;
|
||||
|
@ -1131,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
|
||||
@ -1172,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.
|
||||
@ -1205,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
|
||||
@ -1493,6 +1501,217 @@ enum retro_mod
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* VFS functionality */
|
||||
|
||||
/* File paths:
|
||||
@ -3214,6 +3433,124 @@ 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;
|
||||
};
|
||||
|
||||
struct retro_game_info
|
||||
{
|
||||
const char *path; /* Path to game, UTF-8 encoded.
|
||||
|
@ -51,3 +51,9 @@ if (strcmp(key, "mycore_show_speedhacks") == 0)
|
||||
```
|
||||
|
||||
For any cores that require this functionality, `example_hide_option/libretro_core_options.h` should be used as a template in place of `example_default/libretro_core_options.h`
|
||||
|
||||
## Adding core option categories
|
||||
|
||||
Core options v2 adds a mechanism for assigning categories to options. On supported fontends, options of a particular category will be displayed in a submenu/subsection of the main core options menu. This functionality may be used to reduce visual clutter, or to effectively 'hide' advanced settings without requiring a dedicated 'toggle display' option.
|
||||
|
||||
A template for enabling categories via the core options v2 interface is provided in `example_categories`. The usage of this code is identical to that described in the `Adding 'enhanced' core options to a core` section, with one addition: the `libretro_set_core_options()` function here includes an additional argument identifying whether the frontend has option category support (a core may wish to selectively hide or reorganise options based upon this variable).
|
||||
|
Loading…
Reference in New Issue
Block a user