diff --git a/docs/audit-core-audio.md b/docs/audit-core-audio.md index e3dffc2..924c444 100644 --- a/docs/audit-core-audio.md +++ b/docs/audit-core-audio.md @@ -31,7 +31,7 @@ Los IDs se mantienen estables una vez asignados. Cada entrada apunta al(los) fic | ID | Fichero:línea | Hallazgo | Severidad | Estado | Notas | |----|---------------|----------|-----------|--------|-------| | DUP-01 | `audio.cpp:58-101` | Dos `playMusic` (nombre/puntero) repiten el bloque crossfade/stop+play | Menor | DONE | `playMusicInternal(Ja::Music*, loop, crossfade_ms)` privat; els dos overloads fan gating + name-handling i deleguen el dispatch | -| DUP-02 | `audio.cpp:172-185` | `setSoundVolume`/`setMusicVolume` idéntica estructura de clamp+gate+producto | Menor | PENDING | Helper `effectiveVolume(bool, float)` | +| DUP-02 | `audio.cpp:172-185` | `setSoundVolume`/`setMusicVolume` idéntica estructura de clamp+gate+producto | Menor | DONE | `effectiveVolume(volume, channel_enabled)` privat; els dos setters deleguen | | DUP-03 | `jail_audio.hpp:196-222` | `updateOutgoingFade`/`updateIncomingFade` comparten la curva lineal | Menor | PENDING | Helper `fadeProgress(FadeState&) -> float` | | DUP-04 | `jail_audio.hpp:391-471` | `fadeOutMusic`/`crossfadeMusic` repiten "destruir outgoing + pre-fill + robar stream + reset vorbis" | Importante | PENDING | Función privada `stealCurrentIntoOutgoing(int ms)` | | DUP-05 | `jail_audio.hpp:575-631` | `pauseChannel`/`resumeChannel`/`stopChannel` repiten dispatch `channel==-1 / [0,MAX)` | Menor | PENDING | Helper `forEachTargetChannel(int, fn)` | diff --git a/source/core/audio/audio.cpp b/source/core/audio/audio.cpp index 4e16700..989337e 100644 --- a/source/core/audio/audio.cpp +++ b/source/core/audio/audio.cpp @@ -172,20 +172,22 @@ auto Audio::getRealMusicState() -> MusicState { } } +// Aplica el gate master (enabled_) + el gate del canal (sound/music_enabled_) +// i retorna el volum escalat pel master config_.volume. 0 si algun gate està +// tancat. Així els dos setters comparteixen la mateixa política. +auto Audio::effectiveVolume(float volume, bool channel_enabled) const -> float { + volume = std::clamp(volume, MIN_VOLUME, MAX_VOLUME); + return (enabled_ && channel_enabled) ? volume * config_.volume : 0.0F; +} + // Estableix el volum dels sons (float 0.0..1.0) void Audio::setSoundVolume(float sound_volume, Group group) const { - sound_volume = std::clamp(sound_volume, MIN_VOLUME, MAX_VOLUME); - const bool ACTIVE = enabled_ && sound_enabled_; - const float CONVERTED_VOLUME = ACTIVE ? sound_volume * config_.volume : 0.0F; - Ja::setSoundVolume(CONVERTED_VOLUME, static_cast(group)); + Ja::setSoundVolume(effectiveVolume(sound_volume, sound_enabled_), static_cast(group)); } // Estableix el volum de la música (float 0.0..1.0) void Audio::setMusicVolume(float music_volume) const { - music_volume = std::clamp(music_volume, MIN_VOLUME, MAX_VOLUME); - const bool ACTIVE = enabled_ && music_enabled_; - const float CONVERTED_VOLUME = ACTIVE ? music_volume * config_.volume : 0.0F; - Ja::setMusicVolume(CONVERTED_VOLUME); + Ja::setMusicVolume(effectiveVolume(music_volume, music_enabled_)); } // Aplica una nova configuració (substitueix la cache i reaplica enables/volums) diff --git a/source/core/audio/audio.hpp b/source/core/audio/audio.hpp index 152d857..ca6c1dd 100644 --- a/source/core/audio/audio.hpp +++ b/source/core/audio/audio.hpp @@ -124,9 +124,10 @@ class Audio { }; // --- Métodos --- - explicit Audio(const Config& config); // Constructor privat: rep la config - void initSDLAudio(); // Inicializa SDL Audio - void playMusicInternal(Ja::Music* music, int loop, int crossfade_ms); // Camí comú dels dos overloads de playMusic + explicit Audio(const Config& config); // Constructor privat: rep la config + void initSDLAudio(); // Inicializa SDL Audio + void playMusicInternal(Ja::Music* music, int loop, int crossfade_ms); // Camí comú dels dos overloads de playMusic + [[nodiscard]] auto effectiveVolume(float volume, bool channel_enabled) const -> float; // Gate master+channel: 0 si algun està off, clamp 0..1 altrament // --- Variables miembro --- static std::unique_ptr