refactor(core/audio): Audio owns the engine (migration)
Audio guanya un std::unique_ptr<Ja::Engine> engine_ com a membre privat. Es construeix a initSDLAudio amb els defaults de Defaults::Audio; es destrueix sol al ~Audio (cap Ja::quit() explícit). Totes les crides Ja::funcióN(...) d'audio.cpp passen a engine_->funcióN: - playMusicInternal: crossfadeMusic/stopMusic/playMusic - pauseMusic, resumeMusic, stopMusic, fadeOutMusic - playSound x2, stopAllSounds - setSoundVolume, setMusicVolume - getMusicState (via instance->engine_ — és static però pot arribar-hi) Les free functions forwarder del commit 2 (Ja::init/quit/update/playMusic/ pauseMusic/resumeMusic/stopMusic/fadeOutMusic/crossfadeMusic/ getMusicState/setMusicVolume/enableMusic i els equivalents de so) es retiren del .hpp i del .cpp: ja no les crida ningú. Queden com a free functions permanents (les usa Resource::Cache): loadMusic (x2), loadSound, deleteMusic, deleteSound. Aquests darrers consulten Engine::active() per notificar el motor abans d'alliberar. audio.hpp forward-declara també `class Ja::Engine` perquè engine_ és un std::unique_ptr i el dtor es defineix out-of-line al .cpp (= default) — així no cal incloure jail_audio.hpp al header. Els NOLINT(readability-make-member-function-const) d'audio.cpp es mantenen amb raó actualitzada: std::unique_ptr::operator-> retorna T* (no const T*), per tant clang-tidy veu un mètode d'Audio que podria ser const encara que muti l'Engine via el punter. La mutació és real; el NOLINT segueix sent honest. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
1d124e967d
commit
961a59c460
4 files changed
+50
-165
No files matched your search
@@ -25,10 +25,6 @@ namespace Ja {
|
||||
// Umbral d'audio per davant del cursor de reproducció. Mantenim ≥ 0.5 s a
|
||||
// l'SDL_AudioStream per absorbir jitter de frame i evitar underruns.
|
||||
constexpr float MUSIC_LOW_WATER_SECONDS = 0.5F;
|
||||
|
||||
// Propietari únic de l'Engine que creen els forwarders Ja::init/quit.
|
||||
// Al commit 3 això desapareix: Audio agafarà ownership directe.
|
||||
std::unique_ptr<Engine> owned_engine;
|
||||
} // namespace
|
||||
|
||||
// --- Engine::active_ storage ---
|
||||
@@ -453,93 +449,6 @@ namespace Ja {
|
||||
}
|
||||
}
|
||||
|
||||
// --- Free-function forwarders ---
|
||||
// Mantenen l'API actual (Ja::update, Ja::playMusic, ...) contra el motor
|
||||
// actiu. Al commit 3 Audio els substituirà per crides directes a engine_->
|
||||
// i els forwarders de música/so desapareixeran; init/quit/update i els
|
||||
// factories queden de forma permanent.
|
||||
|
||||
void init(const int freq, const SDL_AudioFormat format, const int num_channels) {
|
||||
owned_engine = std::make_unique<Engine>(freq, format, num_channels);
|
||||
}
|
||||
|
||||
void quit() {
|
||||
owned_engine.reset();
|
||||
}
|
||||
|
||||
void update() {
|
||||
if (Engine* eng = Engine::active()) { eng->update(); }
|
||||
}
|
||||
|
||||
void playMusic(Music* music, const int loop) {
|
||||
if (Engine* eng = Engine::active()) { eng->playMusic(music, loop); }
|
||||
}
|
||||
|
||||
void pauseMusic() {
|
||||
if (Engine* eng = Engine::active()) { eng->pauseMusic(); }
|
||||
}
|
||||
|
||||
void resumeMusic() {
|
||||
if (Engine* eng = Engine::active()) { eng->resumeMusic(); }
|
||||
}
|
||||
|
||||
void stopMusic() {
|
||||
if (Engine* eng = Engine::active()) { eng->stopMusic(); }
|
||||
}
|
||||
|
||||
void fadeOutMusic(const int milliseconds) {
|
||||
if (Engine* eng = Engine::active()) { eng->fadeOutMusic(milliseconds); }
|
||||
}
|
||||
|
||||
void crossfadeMusic(Music* music, const int crossfade_ms, const int loop) {
|
||||
if (Engine* eng = Engine::active()) { eng->crossfadeMusic(music, crossfade_ms, loop); }
|
||||
}
|
||||
|
||||
auto getMusicState() -> MusicState {
|
||||
if (const Engine* eng = Engine::active()) { return eng->getMusicState(); }
|
||||
return MusicState::INVALID;
|
||||
}
|
||||
|
||||
auto setMusicVolume(float volume) -> float {
|
||||
if (Engine* eng = Engine::active()) { return eng->setMusicVolume(volume); }
|
||||
return 0.0F;
|
||||
}
|
||||
|
||||
void enableMusic(const bool value) {
|
||||
if (Engine* eng = Engine::active()) { eng->enableMusic(value); }
|
||||
}
|
||||
|
||||
auto playSound(Sound* sound, const int loop, const int group) -> int {
|
||||
if (Engine* eng = Engine::active()) { return eng->playSound(sound, loop, group); }
|
||||
return -1;
|
||||
}
|
||||
|
||||
auto playSoundOnChannel(Sound* sound, const int channel, const int loop, const int group) -> int {
|
||||
if (Engine* eng = Engine::active()) { return eng->playSoundOnChannel(sound, channel, loop, group); }
|
||||
return -1;
|
||||
}
|
||||
|
||||
void pauseChannel(const int channel) {
|
||||
if (Engine* eng = Engine::active()) { eng->pauseChannel(channel); }
|
||||
}
|
||||
|
||||
void resumeChannel(const int channel) {
|
||||
if (Engine* eng = Engine::active()) { eng->resumeChannel(channel); }
|
||||
}
|
||||
|
||||
void stopChannel(const int channel) {
|
||||
if (Engine* eng = Engine::active()) { eng->stopChannel(channel); }
|
||||
}
|
||||
|
||||
auto setSoundVolume(float volume, const int group) -> float {
|
||||
if (Engine* eng = Engine::active()) { return eng->setSoundVolume(volume, group); }
|
||||
return 0.0F;
|
||||
}
|
||||
|
||||
void enableSound(const bool value) {
|
||||
if (Engine* eng = Engine::active()) { eng->enableSound(value); }
|
||||
}
|
||||
|
||||
// --- Factories i destructors (permanents) ---
|
||||
|
||||
auto loadMusic(const Uint8* buffer, Uint32 length) -> Music* {
|
||||
|
||||
Reference in new issue
Block a user