From 7d99b6c1bcf32093ee158ee17a803b04159e0583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 28 Jan 2024 11:22:19 +0100 Subject: [PATCH] Add volume slider for retroachievements --- Core/Config.cpp | 1 + Core/Config.h | 1 + UI/BackgroundAudio.cpp | 2 +- UI/EmuScreen.cpp | 7 ++++--- UI/GameSettingsScreen.cpp | 4 ++++ UI/RetroAchievementScreens.cpp | 7 ++++++- 6 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index fdee6796d4..7897749967 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -694,6 +694,7 @@ static const ConfigSetting soundSettings[] = { ConfigSetting("GlobalVolume", &g_Config.iGlobalVolume, VOLUME_FULL, CfgFlag::PER_GAME), ConfigSetting("ReverbVolume", &g_Config.iReverbVolume, VOLUME_FULL, CfgFlag::PER_GAME), ConfigSetting("AltSpeedVolume", &g_Config.iAltSpeedVolume, -1, CfgFlag::PER_GAME), + ConfigSetting("AchievementSoundVolume", &g_Config.iAchievementSoundVolume, 6, CfgFlag::PER_GAME), ConfigSetting("AudioDevice", &g_Config.sAudioDevice, "", CfgFlag::DEFAULT), ConfigSetting("AutoAudioDevice", &g_Config.bAutoAudioDevice, true, CfgFlag::DEFAULT), }; diff --git a/Core/Config.h b/Core/Config.h index 06d7265364..28e186725a 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -269,6 +269,7 @@ public: int iGlobalVolume; int iReverbVolume; int iAltSpeedVolume; + int iAchievementSoundVolume; bool bExtraAudioBuffering; // For bluetooth std::string sAudioDevice; bool bAutoAudioDevice; diff --git a/UI/BackgroundAudio.cpp b/UI/BackgroundAudio.cpp index 344d65ed68..7602e3c2d8 100644 --- a/UI/BackgroundAudio.cpp +++ b/UI/BackgroundAudio.cpp @@ -147,7 +147,7 @@ void WavData::Read(RIFFReader &file_) { numFrames = numBytes / raw_bytes_per_frame; // numFrames // It seems the atrac3 codec likes to read a little bit outside. - int padding = 16; + const int padding = 32; // 32 is the value FFMPEG uses. raw_data = (uint8_t *)malloc(numBytes + padding); raw_data_size = numBytes; diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 2666260ca8..1f37cb9f19 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -592,13 +592,14 @@ void EmuScreen::sendMessage(UIMessage message, const char *value) { } } } else if (message == UIMessage::REQUEST_PLAY_SOUND) { - if (g_Config.bAchievementsSoundEffects) { + if (g_Config.bAchievementsSoundEffects && g_Config.bEnableSound) { + float achievementVolume = g_Config.iAchievementSoundVolume * 0.1f; // TODO: Handle this some nicer way. if (!strcmp(value, "achievement_unlocked")) { - g_BackgroundAudio.SFX().Play(UI::UISound::ACHIEVEMENT_UNLOCKED, 0.6f); + g_BackgroundAudio.SFX().Play(UI::UISound::ACHIEVEMENT_UNLOCKED, achievementVolume * 1.0f); } if (!strcmp(value, "leaderboard_submitted")) { - g_BackgroundAudio.SFX().Play(UI::UISound::LEADERBOARD_SUBMITTED, 0.6f); + g_BackgroundAudio.SFX().Play(UI::UISound::LEADERBOARD_SUBMITTED, achievementVolume * 1.0f); } } } diff --git a/UI/GameSettingsScreen.cpp b/UI/GameSettingsScreen.cpp index 56ce793f65..0deb2074e1 100644 --- a/UI/GameSettingsScreen.cpp +++ b/UI/GameSettingsScreen.cpp @@ -625,6 +625,10 @@ void GameSettingsScreen::CreateAudioSettings(UI::ViewGroup *audioSettings) { reverbVolume->SetEnabledPtr(&g_Config.bEnableSound); reverbVolume->SetZeroLabel(a->T("Disabled")); + PopupSliderChoice *achievementVolume = audioSettings->Add(new PopupSliderChoice(&g_Config.iAchievementSoundVolume, VOLUME_OFF, VOLUME_FULL, VOLUME_FULL, a->T("Achievement sound volume"), screenManager())); + achievementVolume->SetEnabledPtr(&g_Config.bEnableSound); + achievementVolume->SetZeroLabel(a->T("Mute")); + // Hide the backend selector in UWP builds (we only support XAudio2 there). #if PPSSPP_PLATFORM(WINDOWS) && !PPSSPP_PLATFORM(UWP) if (IsVistaOrHigher()) { diff --git a/UI/RetroAchievementScreens.cpp b/UI/RetroAchievementScreens.cpp index 203a074b58..2dfc3ea62c 100644 --- a/UI/RetroAchievementScreens.cpp +++ b/UI/RetroAchievementScreens.cpp @@ -35,7 +35,8 @@ AudioFileChooser::AudioFileChooser(RequesterToken token, std::string *value, con layoutParams_->height = ITEM_HEIGHT; } Add(new Choice(ImageID("I_PLAY"), new LinearLayoutParams(ITEM_HEIGHT, ITEM_HEIGHT)))->OnClick.Add([=](UI::EventParams &) { - g_BackgroundAudio.SFX().Play(sound_, 0.6f); + float achievementVolume = g_Config.iAchievementSoundVolume * 0.1f; + g_BackgroundAudio.SFX().Play(sound_, achievementVolume); return UI::EVENT_DONE; }); Add(new FileChooserChoice(token, value, title, BrowseFileType::SOUND_EFFECT, new LinearLayoutParams(1.0f)))->OnChange.Add([=](UI::EventParams &e) { @@ -354,11 +355,15 @@ void RetroAchievementsSettingsScreen::CreateAccountTab(UI::ViewGroup *viewGroup) void RetroAchievementsSettingsScreen::CreateCustomizeTab(UI::ViewGroup *viewGroup) { auto ac = GetI18NCategory(I18NCat::ACHIEVEMENTS); + auto a = GetI18NCategory(I18NCat::AUDIO); using namespace UI; viewGroup->Add(new ItemHeader(ac->T("Sound Effects"))); viewGroup->Add(new AudioFileChooser(GetRequesterToken(), &g_Config.sAchievementsUnlockAudioFile, ac->T("Achievement unlocked"), UISound::ACHIEVEMENT_UNLOCKED)); viewGroup->Add(new AudioFileChooser(GetRequesterToken(), &g_Config.sAchievementsLeaderboardSubmitAudioFile, ac->T("Leaderboard score submission"), UISound::LEADERBOARD_SUBMITTED)); + PopupSliderChoice *volume = viewGroup->Add(new PopupSliderChoice(&g_Config.iAchievementSoundVolume, VOLUME_OFF, VOLUME_FULL, VOLUME_FULL, a->T("Achievement sound volume"), screenManager())); + volume->SetEnabledPtr(&g_Config.bEnableSound); + volume->SetZeroLabel(a->T("Mute")); static const char *positions[] = { "None", "Bottom Left", "Bottom Center", "Bottom Right", "Top Left", "Top Center", "Top Right", "Center Left", "Center Right" };