ed98ef612e
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<Ja::Music> / unique_ptr<Ja::Sound>.
- 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) <noreply@anthropic.com>
39 lines
1.5 KiB
C++
39 lines
1.5 KiB
C++
#pragma once
|
|
|
|
#include <SDL3/SDL.h>
|
|
|
|
#include <cstdint>
|
|
#include <optional>
|
|
#include <vector>
|
|
|
|
// Forward-declaració per no incloure jail_audio.hpp (cicle d'inclusió: este
|
|
// header viu sota los params declarats a jail_audio.hpp, i alhora jail_audio
|
|
// usa applyEcho/applyReverb).
|
|
namespace Ja {
|
|
struct Sound;
|
|
struct EchoParams;
|
|
struct ReverbParams;
|
|
} // namespace Ja
|
|
|
|
// Processadors d'efectes para sons puntuals. Reben un Ja::Sound (qualsevol
|
|
// format suportat pel decodificador WAV: U8/S16, mono o estèreo) i tornen un
|
|
// buffer PCM en S16 + el seu spec, llest per empenyer a un SDL_AudioStream.
|
|
//
|
|
// El buffer de sortida inclou la cua (decay) generada per l'efecte: per al
|
|
// reverb, hasta a 1500 ms; para l'eco, hasta a 800 ms. Aquests caps eviten
|
|
// allargar indefinidament la reproducció cuando los parámetros reinjecten mucho.
|
|
//
|
|
// Si el format del so d'origen no es pot processar, retornen std::nullopt
|
|
// (el caller ha de fer fallback a reproducció seca).
|
|
namespace AudioEffects {
|
|
|
|
struct ProcessedSound {
|
|
std::vector<std::uint8_t> bytes; // PCM S16 entrellaçat (LRLRLR... si stereo)
|
|
SDL_AudioSpec spec; // Format/canals/freqüència del buffer
|
|
};
|
|
|
|
[[nodiscard]] auto applyEcho(const Ja::Sound& src, const Ja::EchoParams& params) -> std::optional<ProcessedSound>;
|
|
[[nodiscard]] auto applyReverb(const Ja::Sound& src, const Ja::ReverbParams& params) -> std::optional<ProcessedSound>;
|
|
|
|
} // namespace AudioEffects
|