From 96c5f5dfb07454c972c50838815330382d6b1911 Mon Sep 17 00:00:00 2001 From: Jamiras Date: Sat, 11 Jul 2020 10:56:09 -0600 Subject: [PATCH] add option to play custom sound on achievement unlock --- audio/audio_defines.h | 5 ++- cheevos/cheevos.c | 5 +++ configuration.c | 1 + configuration.h | 1 + intl/msg_hash_lbl.h | 4 ++ intl/msg_hash_us.h | 8 ++++ menu/cbs/menu_cbs_sublabel.c | 6 +++ menu/menu_displaylist.c | 3 ++ menu/menu_setting.c | 26 +++++++++++- msg_hash.h | 1 + retroarch.c | 77 ++++++++++++++++++++---------------- retroarch.cfg | 3 ++ retroarch.h | 2 +- 13 files changed, 105 insertions(+), 37 deletions(-) diff --git a/audio/audio_defines.h b/audio/audio_defines.h index 14693aa296..c9c1264f4d 100644 --- a/audio/audio_defines.h +++ b/audio/audio_defines.h @@ -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 diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 2f67420056..435fa3ea26 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -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) diff --git a/configuration.c b/configuration.c index c770c26f41..b3941b4657 100644 --- a/configuration.c +++ b/configuration.c @@ -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); diff --git a/configuration.h b/configuration.h index 17b6b1924c..6d777adb25 100644 --- a/configuration.h +++ b/configuration.h @@ -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; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index caf61ee284..f3f5bf5d10 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -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" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 42b9f739a4..4c77e26af4 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -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" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index e2466dfdfb..00b4c3439f 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -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; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index cfeaba6bf7..b8a5d96418 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -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 }, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index ead4d66d81..ac940a6a69 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -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, diff --git a/msg_hash.h b/msg_hash.h index a8dfcc3869..74ebf54223 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -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), diff --git a/retroarch.c b/retroarch.c index 8cdb46826f..2f61a0de49 100644 --- a/retroarch.c +++ b/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; diff --git a/retroarch.cfg b/retroarch.cfg index bac9093d3e..03895f1115 100644 --- a/retroarch.cfg +++ b/retroarch.cfg @@ -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 diff --git a/retroarch.h b/retroarch.h index e9a7531c8c..aa6cd0fca4 100644 --- a/retroarch.h +++ b/retroarch.h @@ -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