refactor(audio,transitions): durada de música pre-calculada al loadMusic i Direction (FADE_IN/FADE_OUT) a FadeToBlack
This commit is contained in:
1 parent
b6d6ee471c
commit
3f09858203
6 files changed
+58
-10
No files matched your search
@@ -194,6 +194,14 @@ void Audio::setOnMusicEnded(std::function<void()> callback) {
|
||||
if (engine_) { engine_->setOnMusicEnded(std::move(callback)); }
|
||||
}
|
||||
|
||||
// Resol el nom contra el cache de recursos i retorna la durada pre-calculada
|
||||
// al `loadMusic`. 0 si la pista no existeix — així el caller pot decidir
|
||||
// fallback (p. ex. usar un timeout fix) sense haver de propagar errors.
|
||||
auto Audio::getMusicDurationMs(const std::string& name) -> int {
|
||||
auto* music = AudioResource::getMusic(name);
|
||||
return (music != nullptr) ? music->duration_ms : 0;
|
||||
}
|
||||
|
||||
// Consulta directament l'estat a Ja i el projecta al subconjunt d'estats que
|
||||
// exposa Audio (INVALID/DISABLED de Ja col·lapsen a STOPPED — la capa d'usuari
|
||||
// només vol saber si està sonant, pausat o parat).
|
||||
|
||||
@@ -121,6 +121,11 @@ class Audio {
|
||||
[[nodiscard]] auto isMusicEnabled() const -> bool { return music_enabled_; }
|
||||
[[nodiscard]] static auto getMusicState() -> MusicState; // Estat real consultat a Ja::
|
||||
[[nodiscard]] auto getCurrentMusicName() const -> const std::string& { return music_.name; }
|
||||
// Durada de la pista resolta per nom (mil·lisegons). 0 si la pista no
|
||||
// existeix al cache de recursos o si el seu header OGG no permet
|
||||
// calcular-la. Pensat per a clients que necessiten un timeline
|
||||
// determinista (p. ex. RoomFsm) sense dependre de callbacks de fi.
|
||||
[[nodiscard]] static auto getMusicDurationMs(const std::string& name) -> int;
|
||||
|
||||
private:
|
||||
// --- Tipus anidats ---
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
#include <cstdint>
|
||||
#include <cstdio>
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
@@ -564,6 +565,15 @@ namespace Ja {
|
||||
music->spec.channels = static_cast<int>(INFO.channels);
|
||||
music->spec.freq = static_cast<int>(INFO.sample_rate);
|
||||
music->spec.format = SDL_AUDIO_S16;
|
||||
// Pre-càlcul de la durada en ms a partir del header. stb_vorbis ja
|
||||
// ha decodificat la informació necessària a `stb_vorbis_open_memory`;
|
||||
// aquesta consulta no descodifica àudio, només llig el comptador
|
||||
// de samples. Si el sample_rate fos 0 (header malmès) deixem
|
||||
// duration_ms a 0.
|
||||
if (INFO.sample_rate > 0) {
|
||||
const auto SAMPLES = stb_vorbis_stream_length_in_samples(music->vorbis);
|
||||
music->duration_ms = static_cast<int>((static_cast<std::uint64_t>(SAMPLES) * 1000ULL) / INFO.sample_rate);
|
||||
}
|
||||
music->state = MusicState::STOPPED;
|
||||
|
||||
return music.release();
|
||||
|
||||
@@ -112,6 +112,12 @@ namespace Ja {
|
||||
std::string filename;
|
||||
|
||||
int times{0}; // loops restants (-1 = infinit, 0 = un sol play)
|
||||
// Durada total de la pista en mil·lisegons, mesurada via
|
||||
// `stb_vorbis_stream_length_in_samples / sample_rate` al
|
||||
// `loadMusic`. 0 si el càlcul no és possible (header malmès).
|
||||
// L'usen consumidors que necessiten un timeline pre-calculat —
|
||||
// p. ex. la FSM de sala — sense dependre de callbacks de fi.
|
||||
int duration_ms{0};
|
||||
SDL_AudioStream* stream{nullptr};
|
||||
MusicState state{MusicState::INVALID};
|
||||
};
|
||||
|
||||
Reference in new issue
Block a user