diff --git a/docs/audit-core-audio.md b/docs/audit-core-audio.md index 02c309b..e3dffc2 100644 --- a/docs/audit-core-audio.md +++ b/docs/audit-core-audio.md @@ -30,7 +30,7 @@ Los IDs se mantienen estables una vez asignados. Cada entrada apunta al(los) fic | ID | Fichero:línea | Hallazgo | Severidad | Estado | Notas | |----|---------------|----------|-----------|--------|-------| -| DUP-01 | `audio.cpp:58-101` | Dos `playMusic` (nombre/puntero) repiten el bloque crossfade/stop+play | Menor | PENDING | Extraer `playMusicInternal(Ja::Music*, loop, crossfade_ms)` privado | +| DUP-01 | `audio.cpp:58-101` | Dos `playMusic` (nombre/puntero) repiten el bloque crossfade/stop+play | Menor | DONE | `playMusicInternal(Ja::Music*, loop, crossfade_ms)` privat; els dos overloads fan gating + name-handling i deleguen el dispatch | | DUP-02 | `audio.cpp:172-185` | `setSoundVolume`/`setMusicVolume` idéntica estructura de clamp+gate+producto | Menor | PENDING | Helper `effectiveVolume(bool, float)` | | DUP-03 | `jail_audio.hpp:196-222` | `updateOutgoingFade`/`updateIncomingFade` comparten la curva lineal | Menor | PENDING | Helper `fadeProgress(FadeState&) -> float` | | DUP-04 | `jail_audio.hpp:391-471` | `fadeOutMusic`/`crossfadeMusic` repiten "destruir outgoing + pre-fill + robar stream + reset vorbis" | Importante | PENDING | Función privada `stealCurrentIntoOutgoing(int ms)` | diff --git a/source/core/audio/audio.cpp b/source/core/audio/audio.cpp index 4d3fb5f..4e16700 100644 --- a/source/core/audio/audio.cpp +++ b/source/core/audio/audio.cpp @@ -75,24 +75,22 @@ void Audio::playMusic(const std::string& name, const int loop, const int crossfa auto* resource = AudioResource::getMusic(name); if (resource == nullptr) { return; } - if (crossfade_ms > 0 && music_.state == MusicState::PLAYING) { - Ja::crossfadeMusic(resource, crossfade_ms, loop); - } else { - if (music_.state == MusicState::PLAYING) { - Ja::stopMusic(); - } - Ja::playMusic(resource, loop); - } - + playMusicInternal(resource, loop, crossfade_ms); music_.name = name; - music_.loop = NEW_LOOP; - music_.state = MusicState::PLAYING; } // Reproduce la música por puntero (con crossfade opcional) void Audio::playMusic(Ja::Music* music, const int loop, const int crossfade_ms) { if (!music_enabled_ || music == nullptr) { return; } + playMusicInternal(music, loop, crossfade_ms); + music_.name.clear(); // nom desconegut quan es passa per punter (PATCH-02 el recuperarà de music->filename) +} + +// Camí comú dels dos overloads: fa el dispatch crossfade vs stop+play i +// actualitza state/loop. Els callers s'encarreguen del gating (music_enabled_, +// nullptr, same-track early return) i d'actualitzar music_.name. +void Audio::playMusicInternal(Ja::Music* music, const int loop, const int crossfade_ms) { if (crossfade_ms > 0 && music_.state == MusicState::PLAYING) { Ja::crossfadeMusic(music, crossfade_ms, loop); } else { @@ -102,7 +100,6 @@ void Audio::playMusic(Ja::Music* music, const int loop, const int crossfade_ms) Ja::playMusic(music, loop); } - music_.name.clear(); // nom desconegut quan es passa per punter music_.loop = (loop != 0); music_.state = MusicState::PLAYING; } diff --git a/source/core/audio/audio.hpp b/source/core/audio/audio.hpp index c5dc874..152d857 100644 --- a/source/core/audio/audio.hpp +++ b/source/core/audio/audio.hpp @@ -124,8 +124,9 @@ class Audio { }; // --- Métodos --- - explicit Audio(const Config& config); // Constructor privat: rep la config - void initSDLAudio(); // Inicializa SDL Audio + explicit Audio(const Config& config); // Constructor privat: rep la config + void initSDLAudio(); // Inicializa SDL Audio + void playMusicInternal(Ja::Music* music, int loop, int crossfade_ms); // Camí comú dels dos overloads de playMusic // --- Variables miembro --- static std::unique_ptr