From ed98ef612e8d3782cdfa7250a6916afb84d09776 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 19 May 2026 12:43:01 +0200 Subject: [PATCH] Fase 3: import del subsistema de audio desde AEEA MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reemplaza el audio antiguo de orni_attack (singleton con new/delete raw, sin efectos, sin crossfade) por el subsistema moderno de AEEA (unique_ptr, RAII, crossfade nativo, echo/reverb, pitch-shift, callbacks de fin de pista, getMusicDurationMs para timelines deterministas). Eliminados: - source/core/audio/audio_cache.{hpp,cpp} (1 cache por subsistema) - source/core/audio/jail_audio.hpp viejo (motor inline globals) - source/external/stb_vorbis.h (v1.20) Añadidos (copiados de AEEA, traducidos comentarios al castellano): - source/core/audio/audio.{hpp,cpp} — singleton con Audio::Config inyectada - source/core/audio/audio_adapter.{hpp,cpp} — adapter para getMusic/getSound - source/core/audio/audio_effects.{hpp,cpp} — Schroeder reverb + echo DSP - source/core/audio/jail_audio.{hpp,cpp} — Ja::Engine class-based, streaming - source/core/audio/sound_effects_config.{hpp,cpp} — presets YAML (opcional) - source/external/stb_vorbis.c (v1.22) — OGG decoder, versión más reciente - source/external/stb_vorbis_impl.cpp — TU aislada para evitar clang-tidy Adaptaciones: - audio_adapter.cpp implementado a medida para orni: usa Resource::Helper::loadFile (no Resource::Cache de AEEA que orni no tiene). Cache local con unique_ptr / unique_ptr. - Includes: utils/defaults.hpp -> core/defaults.hpp, utils/log.hpp reemplazado por iostream con std::cerr/std::cout. API breaking changes (callsites migrados): - Audio::init() -> Audio::init(Config); el Director construye la Config desde Defaults::Audio::* (ENABLED, VOLUME, MUSIC_*, SOUND_*). - Audio::get()->getMusicState() -> Audio::getMusicState() (ahora static). - AudioCache::getMusic/getSound -> AudioResource::getMusic/getSound. Defaults::Audio consolidado: ahora aglutina las constantes que antes estaban repartidas entre namespace Audio (VOLUME, ENABLED), namespace Music (VOLUME, ENABLED), namespace Sound (VOLUME, ENABLED). Las pistas y rutas de efectos siguen en Music::* / Sound::*. Añadidas FREQUENCY, FORMAT, CHANNELS, CROSSFADE_MS, VOLUME_STEP para el motor. Beneficios para fases siguientes: - Crossfade en transiciones de escena (uso: playMusic(name, -1, 1500)). - Pitch-shift para variaciones de SFX (Audio::playSound(name, group, 0.95)). - Echo/reverb DSP via playSoundWithEcho/Reverb (sounds.yaml presets). - Callbacks setOnMusicEnded para sincronizar eventos con el fin de pista. Compila y enlaza. Pendiente: test runtime del usuario. Co-Authored-By: Claude Opus 4.7 (1M context) --- source/core/audio/audio.cpp | 328 +++++--- source/core/audio/audio.hpp | 222 ++++-- source/core/audio/audio_adapter.cpp | 99 +++ source/core/audio/audio_adapter.hpp | 19 + source/core/audio/audio_cache.cpp | 142 ---- source/core/audio/audio_cache.hpp | 42 -- source/core/audio/audio_effects.cpp | 251 +++++++ source/core/audio/audio_effects.hpp | 38 + source/core/audio/jail_audio.cpp | 645 ++++++++++++++++ source/core/audio/jail_audio.hpp | 708 ++++++------------ source/core/audio/sound_effects_config.cpp | 80 ++ source/core/audio/sound_effects_config.hpp | 36 + source/core/defaults.hpp | 19 +- source/core/system/director.cpp | 26 +- .../external/{stb_vorbis.h => stb_vorbis.c} | 117 +-- source/external/stb_vorbis_impl.cpp | 13 + source/game/options.cpp | 20 +- source/game/scenes/title_scene.cpp | 2 +- source/game/stage_system/stage_manager.cpp | 2 +- 19 files changed, 1893 insertions(+), 916 deletions(-) create mode 100644 source/core/audio/audio_adapter.cpp create mode 100644 source/core/audio/audio_adapter.hpp delete mode 100644 source/core/audio/audio_cache.cpp delete mode 100644 source/core/audio/audio_cache.hpp create mode 100644 source/core/audio/audio_effects.cpp create mode 100644 source/core/audio/audio_effects.hpp create mode 100644 source/core/audio/jail_audio.cpp create mode 100644 source/core/audio/sound_effects_config.cpp create mode 100644 source/core/audio/sound_effects_config.hpp rename source/external/{stb_vorbis.h => stb_vorbis.c} (98%) create mode 100644 source/external/stb_vorbis_impl.cpp diff --git a/source/core/audio/audio.cpp b/source/core/audio/audio.cpp index 6adf336..8bb79d0 100644 --- a/source/core/audio/audio.cpp +++ b/source/core/audio/audio.cpp @@ -1,183 +1,291 @@ -#include "audio.hpp" +#include "core/audio/audio.hpp" -#include // Para SDL_LogInfo, SDL_LogCategory, SDL_G... +#include // Para SDL_GetError, SDL_Init #include // Para clamp -#include // Para std::cout +#include // Para std::fprintf -// Implementación de stb_vorbis (debe estar ANTES de incluir jail_audio.hpp) -// clang-format off -#undef STB_VORBIS_HEADER_ONLY -#include "external/stb_vorbis.h" -// clang-format on +#include "core/audio/audio_adapter.hpp" // Para AudioResource::getMusic/getSound +#include "core/audio/jail_audio.hpp" // Para Ja::* (motor jailgames) +#include "core/audio/sound_effects_config.hpp" // Para SoundEffectsConfig +#include "core/defaults.hpp" // Para Defaults::Audio::FREQUENCY -#include "core/audio/audio_cache.hpp" // Para AudioCache -#include "core/audio/jail_audio.hpp" // Para JA_FadeOutMusic, JA_Init, JA_PauseM... -#include "game/options.hpp" // Para AudioOptions, audio, MusicOptions +// Invariant compile-time: tots los valors d'Audio::Group han de cabre als slots +// de volum per grup que manté l'engine. Si s'afegeix una nueva entrada a Group +// y no s'incrementa Ja::MAX_GROUPS, este assert falla antes 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 -Audio* Audio::instance = nullptr; +std::unique_ptr