mirror of
https://github.com/libretro/RetroArch
synced 2025-02-14 15:39:59 +00:00
add option to play custom sound on achievement unlock
This commit is contained in:
parent
5ebce6a238
commit
96c5f5dfb0
@ -30,7 +30,7 @@ RETRO_BEGIN_DECLS
|
||||
|
||||
#define AUDIO_MIXER_MAX_STREAMS 16
|
||||
|
||||
#define AUDIO_MIXER_MAX_SYSTEM_STREAMS (AUDIO_MIXER_MAX_STREAMS + 4)
|
||||
#define AUDIO_MIXER_MAX_SYSTEM_STREAMS (AUDIO_MIXER_MAX_STREAMS + 5)
|
||||
|
||||
/* do not define more than (MAX_SYSTEM_STREAMS - MAX_STREAMS) */
|
||||
enum audio_mixer_system_slot
|
||||
@ -38,7 +38,8 @@ enum audio_mixer_system_slot
|
||||
AUDIO_MIXER_SYSTEM_SLOT_OK = AUDIO_MIXER_MAX_STREAMS,
|
||||
AUDIO_MIXER_SYSTEM_SLOT_CANCEL,
|
||||
AUDIO_MIXER_SYSTEM_SLOT_NOTICE,
|
||||
AUDIO_MIXER_SYSTEM_SLOT_BGM
|
||||
AUDIO_MIXER_SYSTEM_SLOT_BGM,
|
||||
AUDIO_MIXER_SYSTEM_SLOT_ACHIEVEMENT_UNLOCK
|
||||
};
|
||||
|
||||
enum audio_action
|
||||
|
@ -821,6 +821,11 @@ static void rcheevos_async_award_achievement(rcheevos_async_io_request* request)
|
||||
|
||||
rcheevos_log_url("rc_url_award_cheevo", buffer);
|
||||
task_push_http_transfer_with_user_agent(buffer, true, NULL, request->user_agent, rcheevos_async_task_callback, request);
|
||||
|
||||
#ifdef HAVE_AUDIOMIXER
|
||||
if (settings->bools.cheevos_unlock_sound_enable)
|
||||
audio_driver_mixer_play_menu_sound(AUDIO_MIXER_SYSTEM_SLOT_ACHIEVEMENT_UNLOCK);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void rcheevos_award(rcheevos_cheevo_t* cheevo, int mode)
|
||||
|
@ -1638,6 +1638,7 @@ static struct config_bool_setting *populate_settings_bool(
|
||||
SETTING_BOOL("cheevos_hardcore_mode_enable", &settings->bools.cheevos_hardcore_mode_enable, true, false, false);
|
||||
SETTING_BOOL("cheevos_leaderboards_enable", &settings->bools.cheevos_leaderboards_enable, true, false, false);
|
||||
SETTING_BOOL("cheevos_richpresence_enable", &settings->bools.cheevos_richpresence_enable, true, true, false);
|
||||
SETTING_BOOL("cheevos_unlock_sound_enable", &settings->bools.cheevos_unlock_sound_enable, true, false, false);
|
||||
SETTING_BOOL("cheevos_verbose_enable", &settings->bools.cheevos_verbose_enable, true, false, false);
|
||||
SETTING_BOOL("cheevos_auto_screenshot", &settings->bools.cheevos_auto_screenshot, true, false, false);
|
||||
SETTING_BOOL("cheevos_badges_enable", &settings->bools.cheevos_badges_enable, true, false, false);
|
||||
|
@ -307,6 +307,7 @@ typedef struct settings
|
||||
bool cheevos_verbose_enable;
|
||||
bool cheevos_auto_screenshot;
|
||||
bool cheevos_start_active;
|
||||
bool cheevos_unlock_sound_enable;
|
||||
|
||||
/* Camera */
|
||||
bool camera_allow;
|
||||
|
@ -364,6 +364,10 @@ MSG_HASH(
|
||||
MENU_ENUM_LABEL_CHEEVOS_USERNAME,
|
||||
"cheevos_username"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_CHEEVOS_UNLOCK_SOUND_ENABLE,
|
||||
"cheevos_unlock_sound_enable"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE,
|
||||
"cheevos_verbose_enable"
|
||||
|
@ -4402,6 +4402,14 @@ MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL,
|
||||
"Use unofficial achievements and/or beta features for testing purposes."
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCK_SOUND_ENABLE,
|
||||
"Unlock Sound"
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_SUBLABEL_CHEEVOS_UNLOCK_SOUND_ENABLE,
|
||||
"Plays a sound when an achievement is unlocked."
|
||||
)
|
||||
MSG_HASH(
|
||||
MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE,
|
||||
"Verbose Mode"
|
||||
|
@ -168,6 +168,7 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cheevos_hardcore_mode_enable, MENU_
|
||||
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cheevos_leaderboards_enable, MENU_ENUM_SUBLABEL_CHEEVOS_LEADERBOARDS_ENABLE)
|
||||
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cheevos_richpresence_enable, MENU_ENUM_SUBLABEL_CHEEVOS_RICHPRESENCE_ENABLE)
|
||||
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cheevos_badges_enable, MENU_ENUM_SUBLABEL_CHEEVOS_BADGES_ENABLE)
|
||||
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cheevos_unlock_sound_enable, MENU_ENUM_SUBLABEL_CHEEVOS_UNLOCK_SOUND_ENABLE)
|
||||
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cheevos_verbose_enable, MENU_ENUM_SUBLABEL_CHEEVOS_VERBOSE_ENABLE)
|
||||
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cheevos_auto_screenshot, MENU_ENUM_SUBLABEL_CHEEVOS_AUTO_SCREENSHOT)
|
||||
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cheevos_start_active, MENU_ENUM_SUBLABEL_CHEEVOS_START_ACTIVE)
|
||||
@ -3184,6 +3185,11 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
|
||||
case MENU_ENUM_LABEL_CHEEVOS_BADGES_ENABLE:
|
||||
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_badges_enable);
|
||||
break;
|
||||
case MENU_ENUM_LABEL_CHEEVOS_UNLOCK_SOUND_ENABLE:
|
||||
#ifdef HAVE_AUDIOMIXER
|
||||
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_unlock_sound_enable);
|
||||
#endif
|
||||
break;
|
||||
case MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE:
|
||||
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_verbose_enable);
|
||||
break;
|
||||
|
@ -6786,6 +6786,9 @@ unsigned menu_displaylist_build_list(
|
||||
{MENU_ENUM_LABEL_CHEEVOS_RICHPRESENCE_ENABLE, PARSE_ONLY_BOOL, false },
|
||||
{MENU_ENUM_LABEL_CHEEVOS_BADGES_ENABLE, PARSE_ONLY_BOOL, false },
|
||||
{MENU_ENUM_LABEL_CHEEVOS_TEST_UNOFFICIAL, PARSE_ONLY_BOOL, false },
|
||||
#ifdef HAVE_AUDIOMIXER
|
||||
{MENU_ENUM_LABEL_CHEEVOS_UNLOCK_SOUND_ENABLE, PARSE_ONLY_BOOL, false },
|
||||
#endif
|
||||
{MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE, PARSE_ONLY_BOOL, false },
|
||||
{MENU_ENUM_LABEL_CHEEVOS_AUTO_SCREENSHOT, PARSE_ONLY_BOOL, false },
|
||||
{MENU_ENUM_LABEL_CHEEVOS_START_ACTIVE, PARSE_ONLY_BOOL, false },
|
||||
|
@ -7008,7 +7008,7 @@ static void general_write_handler(rarch_setting_t *setting)
|
||||
case MENU_ENUM_LABEL_AUDIO_ENABLE_MENU:
|
||||
#ifdef HAVE_AUDIOMIXER
|
||||
if (settings->bools.audio_enable_menu)
|
||||
audio_driver_load_menu_sounds();
|
||||
audio_driver_load_system_sounds();
|
||||
else
|
||||
audio_driver_mixer_stop_stream(AUDIO_MIXER_SYSTEM_SLOT_BGM);
|
||||
#endif
|
||||
@ -7173,6 +7173,12 @@ static void general_write_handler(rarch_setting_t *setting)
|
||||
/* when changing the password, clear out the token */
|
||||
settings->arrays.cheevos_token[0] = '\0';
|
||||
break;
|
||||
case MENU_ENUM_LABEL_CHEEVOS_UNLOCK_SOUND_ENABLE:
|
||||
#ifdef HAVE_AUDIOMIXER
|
||||
if (settings->bools.cheevos_unlock_sound_enable)
|
||||
audio_driver_load_system_sounds();
|
||||
#endif
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@ -16129,6 +16135,24 @@ static bool setting_append_list(
|
||||
SD_FLAG_NONE
|
||||
);
|
||||
|
||||
#ifdef HAVE_AUDIOMIXER
|
||||
CONFIG_BOOL(
|
||||
list, list_info,
|
||||
&settings->bools.cheevos_unlock_sound_enable,
|
||||
MENU_ENUM_LABEL_CHEEVOS_UNLOCK_SOUND_ENABLE,
|
||||
MENU_ENUM_LABEL_VALUE_CHEEVOS_UNLOCK_SOUND_ENABLE,
|
||||
false,
|
||||
MENU_ENUM_LABEL_VALUE_OFF,
|
||||
MENU_ENUM_LABEL_VALUE_ON,
|
||||
&group_info,
|
||||
&subgroup_info,
|
||||
parent_group,
|
||||
general_write_handler,
|
||||
general_read_handler,
|
||||
SD_FLAG_NONE
|
||||
);
|
||||
#endif
|
||||
|
||||
CONFIG_BOOL(
|
||||
list, list_info,
|
||||
&settings->bools.cheevos_verbose_enable,
|
||||
|
@ -1297,6 +1297,7 @@ enum msg_hash_enums
|
||||
MENU_LABEL(CHEEVOS_BADGES_ENABLE),
|
||||
MENU_LABEL(CHEEVOS_TEST_UNOFFICIAL),
|
||||
MENU_LABEL(CHEEVOS_VERBOSE_ENABLE),
|
||||
MENU_LABEL(CHEEVOS_UNLOCK_SOUND_ENABLE),
|
||||
MENU_LABEL(CHEEVOS_AUTO_SCREENSHOT),
|
||||
MENU_LABEL(CHEEVOS_START_ACTIVE),
|
||||
MENU_LABEL(CHEEVOS_ENABLE),
|
||||
|
77
retroarch.c
77
retroarch.c
@ -1141,7 +1141,7 @@ static const camera_driver_t *camera_drivers[] = {
|
||||
|
||||
#define AUDIO_BUFFER_FREE_SAMPLES_COUNT (8 * 1024)
|
||||
|
||||
#define MENU_SOUND_FORMATS "ogg|mod|xm|s3m|mp3|flac"
|
||||
#define MENU_SOUND_FORMATS "ogg|mod|xm|s3m|mp3|flac|wav"
|
||||
|
||||
#define MIDI_DRIVER_BUF_SIZE 4096
|
||||
|
||||
@ -29670,38 +29670,45 @@ static void audio_driver_load_menu_bgm_callback(retro_task_t *task,
|
||||
audio_driver_mixer_play_menu_sound_looped(AUDIO_MIXER_SYSTEM_SLOT_BGM);
|
||||
}
|
||||
|
||||
void audio_driver_load_menu_sounds(void)
|
||||
void audio_driver_load_system_sounds(void)
|
||||
{
|
||||
struct rarch_state *p_rarch = &rarch_st;
|
||||
settings_t *settings = p_rarch->configuration_settings;
|
||||
const char *dir_assets = settings->paths.directory_assets;
|
||||
bool audio_enable_menu_ok = settings->bools.audio_enable_menu_ok;
|
||||
bool audio_enable_menu_cancel = settings->bools.audio_enable_menu_cancel;
|
||||
bool audio_enable_menu_notice = settings->bools.audio_enable_menu_notice;
|
||||
bool audio_enable_menu_bgm = settings->bools.audio_enable_menu_bgm;
|
||||
const char *path_ok = NULL;
|
||||
const char *path_cancel = NULL;
|
||||
const char *path_notice = NULL;
|
||||
const char *path_bgm = NULL;
|
||||
struct string_list *list = NULL;
|
||||
struct string_list *list_fallback = NULL;
|
||||
unsigned i = 0;
|
||||
char *sounds_path = (char*)
|
||||
malloc(PATH_MAX_LENGTH * sizeof(char));
|
||||
char *sounds_fallback_path = (char*)
|
||||
malloc(PATH_MAX_LENGTH * sizeof(char));
|
||||
struct rarch_state *p_rarch = &rarch_st;
|
||||
settings_t *settings = p_rarch->configuration_settings;
|
||||
const char *dir_assets = settings->paths.directory_assets;
|
||||
const bool audio_enable_menu = settings->bools.audio_enable_menu;
|
||||
const bool audio_enable_menu_ok = audio_enable_menu && settings->bools.audio_enable_menu_ok;
|
||||
const bool audio_enable_menu_cancel = audio_enable_menu && settings->bools.audio_enable_menu_cancel;
|
||||
const bool audio_enable_menu_notice = audio_enable_menu && settings->bools.audio_enable_menu_notice;
|
||||
const bool audio_enable_menu_bgm = audio_enable_menu && settings->bools.audio_enable_menu_bgm;
|
||||
const bool audio_enable_cheevo_unlock = settings->bools.cheevos_unlock_sound_enable;
|
||||
const char *path_ok = NULL;
|
||||
const char *path_cancel = NULL;
|
||||
const char *path_notice = NULL;
|
||||
const char *path_bgm = NULL;
|
||||
const char *path_cheevo_unlock = NULL;
|
||||
struct string_list *list = NULL;
|
||||
struct string_list *list_fallback = NULL;
|
||||
unsigned i = 0;
|
||||
char *sounds_path = NULL;
|
||||
char *sounds_fallback_path = NULL;
|
||||
char *basename_noext = NULL;
|
||||
|
||||
if (!audio_enable_menu && !audio_enable_cheevo_unlock)
|
||||
goto end;
|
||||
|
||||
sounds_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char));
|
||||
sounds_fallback_path = (char*)malloc(PATH_MAX_LENGTH * sizeof(char));
|
||||
sounds_path[0] = sounds_fallback_path[0] = '\0';
|
||||
|
||||
fill_pathname_join(
|
||||
sounds_fallback_path,
|
||||
dir_assets,
|
||||
"sounds",
|
||||
PATH_MAX_LENGTH * sizeof(char));
|
||||
PATH_MAX_LENGTH);
|
||||
|
||||
fill_pathname_application_special(
|
||||
sounds_path,
|
||||
PATH_MAX_LENGTH * sizeof(char),
|
||||
PATH_MAX_LENGTH,
|
||||
APPLICATION_SPECIAL_DIRECTORY_ASSETS_SOUNDS);
|
||||
|
||||
list = dir_list_new(sounds_path, MENU_SOUND_FORMATS, false, false, false, false);
|
||||
@ -29728,26 +29735,27 @@ void audio_driver_load_menu_sounds(void)
|
||||
}
|
||||
}
|
||||
|
||||
basename_noext = (char*)malloc(PATH_MAX_LENGTH * sizeof(char));
|
||||
for (i = 0; i < list->size; i++)
|
||||
{
|
||||
const char *path = list->elems[i].data;
|
||||
const char *ext = path_get_extension(path);
|
||||
char basename_noext[PATH_MAX_LENGTH];
|
||||
|
||||
basename_noext[0] = '\0';
|
||||
|
||||
fill_pathname_base_noext(basename_noext, path, sizeof(basename_noext));
|
||||
|
||||
if (audio_driver_mixer_extension_supported(ext))
|
||||
{
|
||||
basename_noext[0] = '\0';
|
||||
fill_pathname_base_noext(basename_noext, path, PATH_MAX_LENGTH);
|
||||
|
||||
if (string_is_equal_noncase(basename_noext, "ok"))
|
||||
path_ok = path;
|
||||
if (string_is_equal_noncase(basename_noext, "cancel"))
|
||||
else if (string_is_equal_noncase(basename_noext, "cancel"))
|
||||
path_cancel = path;
|
||||
if (string_is_equal_noncase(basename_noext, "notice"))
|
||||
else if (string_is_equal_noncase(basename_noext, "notice"))
|
||||
path_notice = path;
|
||||
if (string_is_equal_noncase(basename_noext, "bgm"))
|
||||
else if (string_is_equal_noncase(basename_noext, "bgm"))
|
||||
path_bgm = path;
|
||||
else if (string_is_equal_noncase(basename_noext, "unlock"))
|
||||
path_cheevo_unlock = path;
|
||||
}
|
||||
}
|
||||
|
||||
@ -29759,6 +29767,8 @@ void audio_driver_load_menu_sounds(void)
|
||||
task_push_audio_mixer_load(path_notice, NULL, NULL, true, AUDIO_MIXER_SLOT_SELECTION_MANUAL, AUDIO_MIXER_SYSTEM_SLOT_NOTICE);
|
||||
if (path_bgm && audio_enable_menu_bgm)
|
||||
task_push_audio_mixer_load(path_bgm, audio_driver_load_menu_bgm_callback, NULL, true, AUDIO_MIXER_SLOT_SELECTION_MANUAL, AUDIO_MIXER_SYSTEM_SLOT_BGM);
|
||||
if (path_cheevo_unlock && audio_enable_cheevo_unlock)
|
||||
task_push_audio_mixer_load(path_cheevo_unlock, NULL, NULL, true, AUDIO_MIXER_SLOT_SELECTION_MANUAL, AUDIO_MIXER_SYSTEM_SLOT_ACHIEVEMENT_UNLOCK);
|
||||
|
||||
end:
|
||||
if (list)
|
||||
@ -29769,6 +29779,8 @@ end:
|
||||
free(sounds_path);
|
||||
if (sounds_fallback_path)
|
||||
free(sounds_fallback_path);
|
||||
if (basename_noext)
|
||||
free(basename_noext);
|
||||
}
|
||||
|
||||
void audio_driver_mixer_play_stream(unsigned i)
|
||||
@ -36338,9 +36350,8 @@ bool retroarch_main_init(int argc, char *argv[])
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_MENU) && defined(HAVE_AUDIOMIXER)
|
||||
if (p_rarch->configuration_settings->bools.audio_enable_menu)
|
||||
audio_driver_load_menu_sounds();
|
||||
#if defined(HAVE_AUDIOMIXER)
|
||||
audio_driver_load_system_sounds();
|
||||
#endif
|
||||
|
||||
return true;
|
||||
|
@ -866,6 +866,9 @@
|
||||
# makes the achievements points double.
|
||||
# cheevos_hardcore_mode_enable = false
|
||||
|
||||
# Play the 'unlock' audio sound when an achievement is unlocked.
|
||||
# cheevos_unlock_sound_enable = false
|
||||
|
||||
# Show RetroAchievements related messages right after loading a game, such as
|
||||
# successfull login and the number of cheevos you have unlocked for the game.
|
||||
# cheevos_verbose_enable = false
|
||||
|
@ -574,7 +574,7 @@ enum audio_mixer_state audio_driver_mixer_get_stream_state(unsigned i);
|
||||
|
||||
const char *audio_driver_mixer_get_stream_name(unsigned i);
|
||||
|
||||
void audio_driver_load_menu_sounds(void);
|
||||
void audio_driver_load_system_sounds(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user