diff --git a/source/core/audio/audio.cpp b/source/core/audio/audio.cpp index 7e5e1a6..3d4a36c 100644 --- a/source/core/audio/audio.cpp +++ b/source/core/audio/audio.cpp @@ -281,6 +281,17 @@ void Audio::enableMusic(bool value) { setMusicVolume(config_.music_volume); } +// Silencia o restaura un grup de sons concret sense alterar config_ (el volum +// que l'usuari va triar) ni els altres grups. Silenciar posa la ganancia del +// grup a 0; restaurar-la torna al volum efectiu normal (que ja aplica els gates +// master/sound i el volum de l'usuari). A diferència de setSoundVolume, no +// xafa config_.sound_volume, así que el menu de servei segueix mostrant i +// operant el volum real durant la demo. +void Audio::silenceGroup(Group group, bool silenced) { + const float VOL = silenced ? 0.0F : effectiveVolume(config_.sound_volume, sound_enabled_); + engine_->setSoundVolume(VOL, static_cast(group)); +} + // Inicialitza SDL Audio y el motor Ja::Engine owned. void Audio::initSDLAudio() { if (!SDL_Init(SDL_INIT_AUDIO)) { diff --git a/source/core/audio/audio.hpp b/source/core/audio/audio.hpp index e7fed27..42195ed 100644 --- a/source/core/audio/audio.hpp +++ b/source/core/audio/audio.hpp @@ -128,6 +128,12 @@ class Audio { // --- Configuración de sons --- void enableSound(bool value); // Estableix l'estat dels sons (reaplica volum) void toggleSound() { enableSound(!sound_enabled_); } // Alterna l'estat dels sons (reaplica volum) + // Silencia (o restaura) un únic grup de sons sense tocar el volum cachejat + // de l'usuari ni la resta de grups. Pensat per a l'attract/demo: vol callar + // els SFX de joc (Group::GAME) pero mantenir els del menu de servei + // (Group::INTERFACE) i la música. En restaurar, reaplica el volum efectiu + // normal del canal (que ja respecta els gates master/sound). + void silenceGroup(Group group, bool silenced); // --- Configuración de música --- void enableMusic(bool value); // Estableix l'estat de la música (reaplica volum) diff --git a/source/game/scenes/game_scene.cpp b/source/game/scenes/game_scene.cpp index 058b1b1..7022008 100644 --- a/source/game/scenes/game_scene.cpp +++ b/source/game/scenes/game_scene.cpp @@ -170,10 +170,10 @@ GameScene::GameScene(SDLManager& sdl, SceneContext& context) context_.advanceDemoScenario(); stage_manager_->initDemo(SC.stage); demo_timer_ = DEMO_DURATION; - // Silenciar els SFX durant la demo (la música segueix). Guardem l'estat - // previ per restaurar-lo al destructor sense xafar la preferència de l'usuari. - sound_was_enabled_ = Audio::get()->isSoundEnabled(); - Audio::get()->enableSound(false); + // Silenciar només els SFX de joc (Group::GAME) durant la demo: la música + // i els sons del menu de servei (Group::INTERFACE) segueixen sonant. No + // toquem el volum global ni la preferència de l'usuari. + Audio::get()->silenceGroup(Audio::Group::GAME, true); // El fons (graella) ha d'aparèixer ja muntat: la demo és una partida en marxa. playfield_.completeBuild(); // La cortinilla arrenca tapant i cau per destapar la demo (continua el @@ -247,9 +247,14 @@ GameScene::GameScene(SDLManager& sdl, SceneContext& context) } GameScene::~GameScene() { - // Si la demo havia silenciat els SFX, restaurar l'estat previ en sortir. + // En sortir de la demo, primer parem qualsevol SFX encara sonant (p. ex. la + // veu de "fase completa" que la demo va llançar muteada): si no, en restaurar + // el volum del grup el motor reaplicaria la ganancia al canal viu i el so es + // colaria a la pantalla de títol. Després restaurem el grup GAME per al + // pròxim joc real. if (match_config_.mode == GameConfig::Mode::DEMO) { - Audio::get()->enableSound(sound_was_enabled_); + Audio::get()->stopAllSounds(); + Audio::get()->silenceGroup(Audio::Group::GAME, false); } } diff --git a/source/game/scenes/game_scene.hpp b/source/game/scenes/game_scene.hpp index 349a947..2b18e2e 100644 --- a/source/game/scenes/game_scene.hpp +++ b/source/game/scenes/game_scene.hpp @@ -110,7 +110,6 @@ class GameScene final : public Scene { std::array demo_pilots_; std::array demo_ctrls_{}; // Control per nau al frame actual float demo_timer_{0.0F}; // Temps restant de la demo (→ LOGO) - bool sound_was_enabled_{true}; // Estat dels SFX abans de la demo (per restaurar-lo) // Funciones privades // bullet_velocity: velocitat de la bala que ha causat la mort (Vec2{} si no