Subsistema d'àudio: port de ../aee/core/audio refactoritzat amb namespace Ja, desacoblat d'Options via Audio::Config i extensió de Resource::Cache per preloading de música i sons; pyramid_1.ogg sona a GameScene (v0.15.0)

This commit is contained in:
JailDesigner committed 2026-04-19 23:19:20 +02:00
1 parent 6f3fafbfff
commit e2b8d0e459
16 files changed
+6796 -5

No files matched your search

+20 -4
View File
@@ -10,6 +10,7 @@
#include <memory>
#include <utility>
#include "core/audio/audio.hpp"
#include "core/input/key_config.hpp"
#include "core/locale/locale.hpp"
#include "core/rendering/notifier.hpp"
@@ -69,6 +70,15 @@ Director::Director() {
Resource::Cache::get().loadSurface("8bithud.gif", "data/font/8bithud.gif");
Resource::Cache::get().getSurface("8bithud.gif")->setPalette(Resource::Cache::get().getPalette("ui"));
// Música de la piràmide 1 (primer i únic track de moment). Carreguem ací
// perquè forma part del preload d'assets, com la font i la paleta.
Resource::Cache::get().loadMusic("pyramid_1.ogg", "data/music/pyramid_1.ogg");
// Audio: singleton manual propietari d'un SDL audio device. Es destrueix
// explícitament a ~Director abans que Resource::Cache (Meyers) buide els
// JA_Music_t que continga, així que no queden streams orfes.
Audio::init(Options::buildAudioConfig());
RenderInfo::get().init();
Notifier::get().init();
@@ -77,11 +87,16 @@ Director::Director() {
}
Director::~Director() {
// Ordre imprescindible: primer l'escena (pot tenir recursos), després
// Screen (GPU device, finestra, subsystem de vídeo), i finalment SDL_Quit.
// Fer-ho així -- NO via atexit -- evita crashes a vkDestroyInstance quan
// el runtime desfà les llibreries abans que corren els destructors estàtics.
// Ordre imprescindible: primer l'escena (pot tenir recursos); després
// alliberem els recursos d'àudio del Cache mentre SDL encara està viu
// (en Meyers, el Cache es destrueix després de SDL_Quit i els streams
// dels JA_Music_t quedarien invalidats); després Audio (tanca l'audio
// device), Screen (GPU + finestra) i finalment SDL_Quit. Fer-ho així --
// NO via atexit -- evita crashes a vkDestroyInstance quan el runtime
// desfà les llibreries abans que corren els destructors estàtics.
current_scene_.reset();
Resource::Cache::get().clearAudio();
Audio::destroy();
Screen::get().shutdown();
SDL_Quit();
}
@@ -136,6 +151,7 @@ auto Director::iterate() -> SDL_AppResult {
delta_ms = std::max(delta_ms, 0);
last_ticks_ms_ = NOW_MS;
Audio::update();
current_scene_->update(delta_ms);
current_scene_->render();