Merge pull request #11010 from Jamiras/cheevos_sound

(cheevos) add option to play custom sound on achievement unlock
This commit is contained in:
Autechre 2020-07-12 13:32:59 +02:00 committed by GitHub
commit 72edc1ac7c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 105 additions and 37 deletions

View File

@ -30,7 +30,7 @@ RETRO_BEGIN_DECLS
#define AUDIO_MIXER_MAX_STREAMS 16 #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) */ /* do not define more than (MAX_SYSTEM_STREAMS - MAX_STREAMS) */
enum audio_mixer_system_slot 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_OK = AUDIO_MIXER_MAX_STREAMS,
AUDIO_MIXER_SYSTEM_SLOT_CANCEL, AUDIO_MIXER_SYSTEM_SLOT_CANCEL,
AUDIO_MIXER_SYSTEM_SLOT_NOTICE, AUDIO_MIXER_SYSTEM_SLOT_NOTICE,
AUDIO_MIXER_SYSTEM_SLOT_BGM AUDIO_MIXER_SYSTEM_SLOT_BGM,
AUDIO_MIXER_SYSTEM_SLOT_ACHIEVEMENT_UNLOCK
}; };
enum audio_action enum audio_action

View File

@ -821,6 +821,11 @@ static void rcheevos_async_award_achievement(rcheevos_async_io_request* request)
rcheevos_log_url("rc_url_award_cheevo", buffer); 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); 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) static void rcheevos_award(rcheevos_cheevo_t* cheevo, int mode)

View File

@ -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_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_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_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_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_auto_screenshot", &settings->bools.cheevos_auto_screenshot, true, false, false);
SETTING_BOOL("cheevos_badges_enable", &settings->bools.cheevos_badges_enable, true, false, false); SETTING_BOOL("cheevos_badges_enable", &settings->bools.cheevos_badges_enable, true, false, false);

View File

@ -307,6 +307,7 @@ typedef struct settings
bool cheevos_verbose_enable; bool cheevos_verbose_enable;
bool cheevos_auto_screenshot; bool cheevos_auto_screenshot;
bool cheevos_start_active; bool cheevos_start_active;
bool cheevos_unlock_sound_enable;
/* Camera */ /* Camera */
bool camera_allow; bool camera_allow;

View File

@ -364,6 +364,10 @@ MSG_HASH(
MENU_ENUM_LABEL_CHEEVOS_USERNAME, MENU_ENUM_LABEL_CHEEVOS_USERNAME,
"cheevos_username" "cheevos_username"
) )
MSG_HASH(
MENU_ENUM_LABEL_CHEEVOS_UNLOCK_SOUND_ENABLE,
"cheevos_unlock_sound_enable"
)
MSG_HASH( MSG_HASH(
MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE, MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE,
"cheevos_verbose_enable" "cheevos_verbose_enable"

View File

@ -4402,6 +4402,14 @@ MSG_HASH(
MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL, MENU_ENUM_SUBLABEL_CHEEVOS_TEST_UNOFFICIAL,
"Use unofficial achievements and/or beta features for testing purposes." "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( MSG_HASH(
MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE, MENU_ENUM_LABEL_VALUE_CHEEVOS_VERBOSE_ENABLE,
"Verbose Mode" "Verbose Mode"

View File

@ -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_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_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_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_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_auto_screenshot, MENU_ENUM_SUBLABEL_CHEEVOS_AUTO_SCREENSHOT)
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_cheevos_start_active, MENU_ENUM_SUBLABEL_CHEEVOS_START_ACTIVE) 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: case MENU_ENUM_LABEL_CHEEVOS_BADGES_ENABLE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_badges_enable); BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_badges_enable);
break; 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: case MENU_ENUM_LABEL_CHEEVOS_VERBOSE_ENABLE:
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_verbose_enable); BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cheevos_verbose_enable);
break; break;

View File

@ -6786,6 +6786,9 @@ unsigned menu_displaylist_build_list(
{MENU_ENUM_LABEL_CHEEVOS_RICHPRESENCE_ENABLE, PARSE_ONLY_BOOL, false }, {MENU_ENUM_LABEL_CHEEVOS_RICHPRESENCE_ENABLE, PARSE_ONLY_BOOL, false },
{MENU_ENUM_LABEL_CHEEVOS_BADGES_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 }, {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_VERBOSE_ENABLE, PARSE_ONLY_BOOL, false },
{MENU_ENUM_LABEL_CHEEVOS_AUTO_SCREENSHOT, PARSE_ONLY_BOOL, false }, {MENU_ENUM_LABEL_CHEEVOS_AUTO_SCREENSHOT, PARSE_ONLY_BOOL, false },
{MENU_ENUM_LABEL_CHEEVOS_START_ACTIVE, PARSE_ONLY_BOOL, false }, {MENU_ENUM_LABEL_CHEEVOS_START_ACTIVE, PARSE_ONLY_BOOL, false },

View File

@ -7008,7 +7008,7 @@ static void general_write_handler(rarch_setting_t *setting)
case MENU_ENUM_LABEL_AUDIO_ENABLE_MENU: case MENU_ENUM_LABEL_AUDIO_ENABLE_MENU:
#ifdef HAVE_AUDIOMIXER #ifdef HAVE_AUDIOMIXER
if (settings->bools.audio_enable_menu) if (settings->bools.audio_enable_menu)
audio_driver_load_menu_sounds(); audio_driver_load_system_sounds();
else else
audio_driver_mixer_stop_stream(AUDIO_MIXER_SYSTEM_SLOT_BGM); audio_driver_mixer_stop_stream(AUDIO_MIXER_SYSTEM_SLOT_BGM);
#endif #endif
@ -7173,6 +7173,12 @@ static void general_write_handler(rarch_setting_t *setting)
/* when changing the password, clear out the token */ /* when changing the password, clear out the token */
settings->arrays.cheevos_token[0] = '\0'; settings->arrays.cheevos_token[0] = '\0';
break; 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: default:
break; break;
} }
@ -16129,6 +16135,24 @@ static bool setting_append_list(
SD_FLAG_NONE 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( CONFIG_BOOL(
list, list_info, list, list_info,
&settings->bools.cheevos_verbose_enable, &settings->bools.cheevos_verbose_enable,

View File

@ -1297,6 +1297,7 @@ enum msg_hash_enums
MENU_LABEL(CHEEVOS_BADGES_ENABLE), MENU_LABEL(CHEEVOS_BADGES_ENABLE),
MENU_LABEL(CHEEVOS_TEST_UNOFFICIAL), MENU_LABEL(CHEEVOS_TEST_UNOFFICIAL),
MENU_LABEL(CHEEVOS_VERBOSE_ENABLE), MENU_LABEL(CHEEVOS_VERBOSE_ENABLE),
MENU_LABEL(CHEEVOS_UNLOCK_SOUND_ENABLE),
MENU_LABEL(CHEEVOS_AUTO_SCREENSHOT), MENU_LABEL(CHEEVOS_AUTO_SCREENSHOT),
MENU_LABEL(CHEEVOS_START_ACTIVE), MENU_LABEL(CHEEVOS_START_ACTIVE),
MENU_LABEL(CHEEVOS_ENABLE), MENU_LABEL(CHEEVOS_ENABLE),

View File

@ -1143,7 +1143,7 @@ static const camera_driver_t *camera_drivers[] = {
#define AUDIO_BUFFER_FREE_SAMPLES_COUNT (8 * 1024) #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 #define MIDI_DRIVER_BUF_SIZE 4096
@ -29672,38 +29672,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); 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; struct rarch_state *p_rarch = &rarch_st;
settings_t *settings = p_rarch->configuration_settings; settings_t *settings = p_rarch->configuration_settings;
const char *dir_assets = settings->paths.directory_assets; const char *dir_assets = settings->paths.directory_assets;
bool audio_enable_menu_ok = settings->bools.audio_enable_menu_ok; const bool audio_enable_menu = settings->bools.audio_enable_menu;
bool audio_enable_menu_cancel = settings->bools.audio_enable_menu_cancel; const bool audio_enable_menu_ok = audio_enable_menu && settings->bools.audio_enable_menu_ok;
bool audio_enable_menu_notice = settings->bools.audio_enable_menu_notice; const bool audio_enable_menu_cancel = audio_enable_menu && settings->bools.audio_enable_menu_cancel;
bool audio_enable_menu_bgm = settings->bools.audio_enable_menu_bgm; const bool audio_enable_menu_notice = audio_enable_menu && settings->bools.audio_enable_menu_notice;
const char *path_ok = NULL; const bool audio_enable_menu_bgm = audio_enable_menu && settings->bools.audio_enable_menu_bgm;
const char *path_cancel = NULL; const bool audio_enable_cheevo_unlock = settings->bools.cheevos_unlock_sound_enable;
const char *path_notice = NULL; const char *path_ok = NULL;
const char *path_bgm = NULL; const char *path_cancel = NULL;
struct string_list *list = NULL; const char *path_notice = NULL;
struct string_list *list_fallback = NULL; const char *path_bgm = NULL;
unsigned i = 0; const char *path_cheevo_unlock = NULL;
char *sounds_path = (char*) struct string_list *list = NULL;
malloc(PATH_MAX_LENGTH * sizeof(char)); struct string_list *list_fallback = NULL;
char *sounds_fallback_path = (char*) unsigned i = 0;
malloc(PATH_MAX_LENGTH * sizeof(char)); 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'; sounds_path[0] = sounds_fallback_path[0] = '\0';
fill_pathname_join( fill_pathname_join(
sounds_fallback_path, sounds_fallback_path,
dir_assets, dir_assets,
"sounds", "sounds",
PATH_MAX_LENGTH * sizeof(char)); PATH_MAX_LENGTH);
fill_pathname_application_special( fill_pathname_application_special(
sounds_path, sounds_path,
PATH_MAX_LENGTH * sizeof(char), PATH_MAX_LENGTH,
APPLICATION_SPECIAL_DIRECTORY_ASSETS_SOUNDS); APPLICATION_SPECIAL_DIRECTORY_ASSETS_SOUNDS);
list = dir_list_new(sounds_path, MENU_SOUND_FORMATS, false, false, false, false); list = dir_list_new(sounds_path, MENU_SOUND_FORMATS, false, false, false, false);
@ -29730,26 +29737,27 @@ void audio_driver_load_menu_sounds(void)
} }
} }
basename_noext = (char*)malloc(PATH_MAX_LENGTH * sizeof(char));
for (i = 0; i < list->size; i++) for (i = 0; i < list->size; i++)
{ {
const char *path = list->elems[i].data; const char *path = list->elems[i].data;
const char *ext = path_get_extension(path); 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)) 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")) if (string_is_equal_noncase(basename_noext, "ok"))
path_ok = path; path_ok = path;
if (string_is_equal_noncase(basename_noext, "cancel")) else if (string_is_equal_noncase(basename_noext, "cancel"))
path_cancel = path; path_cancel = path;
if (string_is_equal_noncase(basename_noext, "notice")) else if (string_is_equal_noncase(basename_noext, "notice"))
path_notice = path; path_notice = path;
if (string_is_equal_noncase(basename_noext, "bgm")) else if (string_is_equal_noncase(basename_noext, "bgm"))
path_bgm = path; path_bgm = path;
else if (string_is_equal_noncase(basename_noext, "unlock"))
path_cheevo_unlock = path;
} }
} }
@ -29761,6 +29769,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); 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) 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); 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: end:
if (list) if (list)
@ -29771,6 +29781,8 @@ end:
free(sounds_path); free(sounds_path);
if (sounds_fallback_path) if (sounds_fallback_path)
free(sounds_fallback_path); free(sounds_fallback_path);
if (basename_noext)
free(basename_noext);
} }
void audio_driver_mixer_play_stream(unsigned i) void audio_driver_mixer_play_stream(unsigned i)
@ -36340,9 +36352,8 @@ bool retroarch_main_init(int argc, char *argv[])
} }
#endif #endif
#if defined(HAVE_MENU) && defined(HAVE_AUDIOMIXER) #if defined(HAVE_AUDIOMIXER)
if (p_rarch->configuration_settings->bools.audio_enable_menu) audio_driver_load_system_sounds();
audio_driver_load_menu_sounds();
#endif #endif
return true; return true;

View File

@ -866,6 +866,9 @@
# makes the achievements points double. # makes the achievements points double.
# cheevos_hardcore_mode_enable = false # 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 # Show RetroAchievements related messages right after loading a game, such as
# successfull login and the number of cheevos you have unlocked for the game. # successfull login and the number of cheevos you have unlocked for the game.
# cheevos_verbose_enable = false # cheevos_verbose_enable = false

View File

@ -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); 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 #endif