violat jail_audio amb JA_CrossfadeMusic i globals a structs

fix: fade_initial_volume
This commit is contained in:
2026-04-12 17:12:52 +02:00
parent a5148f5ed5
commit 4da00d81c2
5 changed files with 138 additions and 44 deletions

View File

@@ -38,10 +38,15 @@ Audio::~Audio() {
// Método principal
void Audio::update() {
JA_Update();
// Sincronizar estado: detectar cuando la música se para (ej. fade-out completado)
if (instance && instance->music_.state == MusicState::PLAYING && JA_GetMusicState() != JA_MUSIC_PLAYING) {
instance->music_.state = MusicState::STOPPED;
}
}
// Reproduce la música
void Audio::playMusic(const std::string& name, const int loop) {
// Reproduce la música (con crossfade opcional)
void Audio::playMusic(const std::string& name, const int loop, const int crossfade_ms) {
bool new_loop = (loop != 0);
// Si ya está sonando exactamente la misma pista y mismo modo loop, no hacemos nada
@@ -51,20 +56,19 @@ void Audio::playMusic(const std::string& name, const int loop) {
// Intentar obtener recurso; si falla, no tocar estado
auto* resource = Resource::Cache::get()->getMusic(name);
if (resource == nullptr) {
// manejo de error opcional
return;
if (resource == nullptr) return;
if (crossfade_ms > 0 && music_.state == MusicState::PLAYING) {
// Crossfade: fade-out de la pista actual + fade-in de la nueva
JA_CrossfadeMusic(resource, crossfade_ms, loop);
} else {
// Cambio inmediato
if (music_.state == MusicState::PLAYING) {
JA_StopMusic();
}
JA_PlayMusic(resource, loop);
}
// Si hay algo reproduciéndose, detenerlo primero (si el backend lo requiere)
if (music_.state == MusicState::PLAYING) {
JA_StopMusic(); // sustituir por la función de stop real del API si tiene otro nombre
}
// Llamada al motor para reproducir la nueva pista
JA_PlayMusic(resource, loop);
// Actualizar estado y metadatos después de iniciar con éxito
music_.name = name;
music_.loop = new_loop;
music_.state = MusicState::PLAYING;