From 621d45456387f7ae019572d6e13dd771e2569ff6 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Mon, 20 Apr 2026 11:52:51 +0200 Subject: [PATCH] =?UTF-8?q?refactor(core/audio):=20static=5Fassert=20Audio?= =?UTF-8?q?::Group=20=E2=86=94=20Ja::MAX=5FGROUPS=20(HC-03)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ja::MAX_SIMULTANEOUS_CHANNELS i Ja::MAX_GROUPS són límits interns del motor. La proposta inicial era moure'ls a Defaults::Audio, però jail_audio és reutilitzable entre projectes (no depèn d'Options ni d'utils/); moure els límits trencaria aquesta independència. El valor real del hallazgo era la invariant Audio::Group ↔ MAX_GROUPS, que cap codi protegia. S'afegeix un static_assert a audio.cpp que falla en compilació si s'afegeix una entrada nova a Group sense tocar MAX_GROUPS. Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/audit-core-audio.md | 2 +- source/core/audio/audio.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/audit-core-audio.md b/docs/audit-core-audio.md index 727b649..23bba96 100644 --- a/docs/audit-core-audio.md +++ b/docs/audit-core-audio.md @@ -42,7 +42,7 @@ Los IDs se mantienen estables una vez asignados. Cada entrada apunta al(los) fic |----|---------------|----------|-----------|--------|-------| | HC-01 | `audio.hpp:53-55` | `VOLUME_STEP`, `FREQUENCY`, `DEFAULT_CROSSFADE_MS` viven en la clase, no en `Defaults::Audio` | Importante | DONE | Movidos a `Defaults::Audio::{VOLUME_STEP, FREQUENCY, CROSSFADE_MS}` en `utils/defaults.hpp` | | HC-02 | `jail_audio.hpp:57,76,110` + `audio.cpp:208` | `{SDL_AUDIO_S16, 2, 48000}` literal en 3 sitios; `S16LE` vs `S16` inconsistente | Importante | DONE | `Defaults::Audio::{FORMAT,CHANNELS,FREQUENCY}` al call-site d'`Audio::initSDLAudio`; `Ja::DEFAULT_SPEC` com a fallback local perquè l'engine no depengui del projecte | -| HC-03 | `jail_audio.hpp:53-54` | `MAX_SIMULTANEOUS_CHANNELS=20`, `MAX_GROUPS=2` fijos sin justificación | Menor | PENDING | `Defaults::Audio::MAX_CHANNELS/MAX_GROUPS` + `static_assert` | +| HC-03 | `jail_audio.hpp:53-54` | `MAX_SIMULTANEOUS_CHANNELS=20`, `MAX_GROUPS=2` fijos sin justificación | Menor | DONE | `static_assert` a `audio.cpp` protegeix `Audio::Group ↔ Ja::MAX_GROUPS`. No es mou a Defaults — el motor és independent del projecte per disseny | | HC-04 | `jail_audio.hpp:131,134` | `MUSIC_CHUNK_SHORTS=8192`, `MUSIC_LOW_WATER_SECONDS=0.5F` tuning hidden | Menor | PENDING | Mover a `Defaults::Audio` | | HC-05 | `jail_audio.hpp:266` | `fill(sound_volume, 0.5F)` valor mágico que se sobreescribe enseguida | Menor | PENDING | Eliminar o nombrar | diff --git a/source/core/audio/audio.cpp b/source/core/audio/audio.cpp index 36be546..e8dce69 100644 --- a/source/core/audio/audio.cpp +++ b/source/core/audio/audio.cpp @@ -24,6 +24,12 @@ #include "core/audio/jail_audio.hpp" // Para Ja::* (engine jailgames) #include "utils/defaults.hpp" // Para Defaults::Audio::FREQUENCY +// Invariant compile-time: tots els valors d'Audio::Group han de cabre als slots +// de volum per grup que manté l'engine. Si s'afegeix una nova entrada a Group +// i no s'incrementa Ja::MAX_GROUPS, aquest assert falla abans de compilar. +static_assert(static_cast(Audio::Group::INTERFACE) < Ja::MAX_GROUPS, + "Audio::Group té més entrades que slots té Ja::MAX_GROUPS"); + // Singleton std::unique_ptr