From e342a1101693b88f8f3b063939a62ae72ee3819a Mon Sep 17 00:00:00 2001 From: J-D-K Date: Thu, 9 Oct 2025 16:43:29 -0400 Subject: [PATCH] Update SDLLib. Add sound support and effect. --- Libraries/SDLLib | 2 +- include/appstates/MainMenuState.hpp | 3 +++ include/ui/PopMessageManager.hpp | 9 ++++++++- romfs/Sound/PopMessage.wav | Bin 0 -> 44262 bytes source/appstates/MainMenuState.cpp | 10 ++++++++++ source/ui/Menu.cpp | 4 ++-- source/ui/PopMessageManager.cpp | 16 ++++++++++++++++ 7 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 romfs/Sound/PopMessage.wav diff --git a/Libraries/SDLLib b/Libraries/SDLLib index 726c56c..7fdd7dc 160000 --- a/Libraries/SDLLib +++ b/Libraries/SDLLib @@ -1 +1 @@ -Subproject commit 726c56c1a2ed4065c2efaaf2a283aa3c7af75cb7 +Subproject commit 7fdd7dc872270ebd375e7571dbb83a3e9b16de82 diff --git a/include/appstates/MainMenuState.hpp b/include/appstates/MainMenuState.hpp index b2d9364..ae5eb52 100644 --- a/include/appstates/MainMenuState.hpp +++ b/include/appstates/MainMenuState.hpp @@ -104,6 +104,9 @@ class MainMenuState final : public BaseState /// @brief Silently checks for an update in the background. void check_for_update(); + /// @brief Plays the little boot sound. + void play_boot_sound(); + /// @brief Pushes the target state to the vector. void push_target_state(); diff --git a/include/ui/PopMessageManager.hpp b/include/ui/PopMessageManager.hpp index 6841ad9..3e93bc2 100644 --- a/include/ui/PopMessageManager.hpp +++ b/include/ui/PopMessageManager.hpp @@ -1,4 +1,5 @@ #pragma once +#include "sdl.hpp" #include "sys/sys.hpp" #include "ui/DialogBox.hpp" #include "ui/PopMessage.hpp" @@ -35,7 +36,7 @@ namespace ui private: // Only one instance allowed. - PopMessageManager() = default; + PopMessageManager(); // Returns the only instance. static PopMessageManager &get_instance() @@ -54,5 +55,11 @@ namespace ui std::mutex m_messageMutex{}; std::mutex m_queueMutex{}; + + /// @brief The little chirp that's played when messages pop. + sdl::SharedSound m_popSound{}; + + /// @brief Loads the pop message sound into memory. + void initialize_pop_sound(); }; } // namespace ui diff --git a/romfs/Sound/PopMessage.wav b/romfs/Sound/PopMessage.wav new file mode 100644 index 0000000000000000000000000000000000000000..558a545d372bcdd79447e1a2c40fa4371b994ea7 GIT binary patch literal 44262 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 +} + void MainMenuState::push_target_state() { const int popTicks = ui::PopMessageManager::DEFAULT_TICKS; diff --git a/source/ui/Menu.cpp b/source/ui/Menu.cpp index ddabd2a..94650e6 100644 --- a/source/ui/Menu.cpp +++ b/source/ui/Menu.cpp @@ -115,9 +115,9 @@ bool ui::Menu::is_empty() const noexcept { return m_options.empty(); } void ui::Menu::calculate_alignments() noexcept { - m_optionHeight = std::floor(static_cast(m_fontSize) * 1.8f); + m_optionHeight = std::round(static_cast(m_fontSize) * 1.8f); m_maxDisplayOptions = (m_renderTargetHeight - m_originalY) / m_optionHeight; - m_scrollLength = std::floor(static_cast(m_maxDisplayOptions) / 2.0f); + m_scrollLength = std::round(static_cast(m_maxDisplayOptions) / 2.0f); m_textY = (m_optionHeight / 2) - (m_fontSize / 2); } diff --git a/source/ui/PopMessageManager.cpp b/source/ui/PopMessageManager.cpp index 044f2e9..c1d296c 100644 --- a/source/ui/PopMessageManager.cpp +++ b/source/ui/PopMessageManager.cpp @@ -8,6 +8,8 @@ #include +ui::PopMessageManager::PopMessageManager() { PopMessageManager::initialize_pop_sound(); } + void ui::PopMessageManager::update() { static constexpr double COORD_INIT_Y = 594.0f; @@ -65,6 +67,7 @@ void ui::PopMessageManager::push_message(int displayTicks, std::string_view mess std::mutex &messageMutex = manager.m_messageMutex; auto &messageQueue = manager.m_messageQueue; auto &messages = manager.m_messages; + auto &popSound = manager.m_popSound; { std::lock_guard messageGuard{messageMutex}; @@ -79,6 +82,7 @@ void ui::PopMessageManager::push_message(int displayTicks, std::string_view mess std::lock_guard queueGuard(queueMutex); auto queuePair = std::make_pair(displayTicks, std::string{message}); messageQueue.push_back(std::move(queuePair)); + popSound->play(); } void ui::PopMessageManager::push_message(int displayTicks, std::string &message) @@ -88,6 +92,7 @@ void ui::PopMessageManager::push_message(int displayTicks, std::string &message) std::mutex &messageMutex = manager.m_messageMutex; auto &messageQueue = manager.m_messageQueue; auto &messages = manager.m_messages; + auto &popSound = manager.m_popSound; { std::lock_guard messageGuard{messageMutex}; @@ -102,4 +107,15 @@ void ui::PopMessageManager::push_message(int displayTicks, std::string &message) std::lock_guard queueGuard(queueMutex); auto queuePair = std::make_pair(displayTicks, std::move(message)); messageQueue.push_back(std::move(queuePair)); + popSound->play(); } + +void ui::PopMessageManager::initialize_pop_sound() +{ + static constexpr std::string_view POP_NAME = "PopSound"; + static constexpr const char *POP_PATH = "romfs:/Sound/PopMessage.wav"; + + if (m_popSound) { return; } + + m_popSound = sdl::SoundManager::load(POP_NAME, POP_PATH); +} \ No newline at end of file