Afig una capa d'efectes oberta a la unitat d'àudio. Els sons puntuals
es poden reproduir processats per un eco o un reverb (Freeverb 8C/4AP)
sense afectar la música ni canviar el camí ràpid existent (playSound
sense efecte segueix sent una sola crida sense cost extra).
- data/sounds.yaml: catàleg de presets nominats (echo: cave/short,
reverb: stone_hall/small_room).
- core/audio/audio_effects: processadors purs que prenen un Ja::Sound
(U8/S16, mono o estèreo) i tornen PCM S16 amb la cua de l'efecte
(cap a 800 ms eco, 1500 ms reverb).
- core/audio/sound_effects_config: Meyers singleton que parseja
sounds.yaml a EchoParams/ReverbParams indexats per nom; l'API
pública d'Audio fa el lookup per nom.
- jail_audio::Engine: nou camí playSoundWith{Echo,Reverb} que empenta
el buffer ja processat a un canal lliure marcat com a has_effect.
El cap MAX_EFFECT_CHANNELS limita a 4 sons amb efecte simultanis;
si està al límit, l'engine retorna -1 i Audio cau a la versió seca.
- Audio::playSoundWith{Echo,Reverb}(name, preset, group) com a única
via pública. Si el preset no existeix, fallback dry amb avís.
- director: load("data/sounds.yaml") abans d'Audio::init.
37 lines
1.4 KiB
C++
37 lines
1.4 KiB
C++
#pragma once
|
|
|
|
#include <string>
|
|
#include <unordered_map>
|
|
|
|
#include "core/audio/jail_audio.hpp" // Per a Ja::EchoParams / Ja::ReverbParams
|
|
|
|
// Catàleg de presets d'efectes carregat des de data/sounds.yaml. La capa
|
|
// Audio (playSoundWithEcho/playSoundWithReverb) hi accedeix per nom: si el
|
|
// preset no existeix, el so es reprodueix sec amb un avís a stderr.
|
|
//
|
|
// Patró Meyers idèntic a UiConfig/Locale: un sol load() a l'arrencada, sense
|
|
// hot-reload. Si el fitxer no existeix, el catàleg queda buit (cap preset
|
|
// disponible) i tots els playSoundWith* es comporten com playSound dry.
|
|
class SoundEffectsConfig {
|
|
public:
|
|
static auto get() -> SoundEffectsConfig&;
|
|
|
|
SoundEffectsConfig(const SoundEffectsConfig&) = delete;
|
|
SoundEffectsConfig(SoundEffectsConfig&&) = delete;
|
|
auto operator=(const SoundEffectsConfig&) -> SoundEffectsConfig& = delete;
|
|
auto operator=(SoundEffectsConfig&&) -> SoundEffectsConfig& = delete;
|
|
|
|
void load(const std::string& file_path);
|
|
|
|
// Retorna nullptr si el preset no existeix.
|
|
[[nodiscard]] auto findEcho(const std::string& name) const -> const Ja::EchoParams*;
|
|
[[nodiscard]] auto findReverb(const std::string& name) const -> const Ja::ReverbParams*;
|
|
|
|
private:
|
|
SoundEffectsConfig() = default;
|
|
~SoundEffectsConfig() = default;
|
|
|
|
std::unordered_map<std::string, Ja::EchoParams> echoes_;
|
|
std::unordered_map<std::string, Ja::ReverbParams> reverbs_;
|
|
};
|