1
0
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:
Jamiras 2020-07-11 10:56:09 -06:00
parent 5ebce6a238
commit 96c5f5dfb0
13 changed files with 105 additions and 37 deletions

@ -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),

@ -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