refactor(core/audio): Ja::* és l'única font de veritat de MusicState (INCONS-02)
music_.state era una cache d'estat que podia divergir del real —
precisament per això existia getRealMusicState() com a "consulta honesta".
Es descarta la cache:
- music_.state deixa d'existir; el struct privat Music només manté
name i loop.
- getMusicState() passa a ser static i consulta Ja::getMusicState(),
projectant INVALID/DISABLED al STOPPED que exposa Audio::MusicState.
- getRealMusicState() desapareix (getMusicState ja fa la consulta real).
- update() ja no necessita el bloc de sincronització.
- playMusicInternal/pauseMusic/resumeMusic/stopMusic/fadeOutMusic
llegeixen getMusicState() en comptes de music_.state i deixen de
reassignar-lo — Ja ja ho fa.
Externament: cap caller usa getMusicState/getRealMusicState, així que
canviar a static és segur (Audio::get()->getMusicState() continua
funcionant).
pauseMusic/resumeMusic/stopMusic es marquen amb NOLINT per
readability-make-member-function-const pel mateix motiu que INCONS-01
(muten globals de Ja::* que clang-tidy no veu).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
964ff104ce
commit
66c5801725
3 files changed
+28
-32
No files matched your search
+23
-25
@@ -51,14 +51,10 @@ Audio::~Audio() {
|
||||
Ja::quit();
|
||||
}
|
||||
|
||||
// Método principal
|
||||
// Método principal: l'estat de la música el manté Ja (única font de veritat),
|
||||
// per tant no cal cap sincronització aquí.
|
||||
void Audio::update() {
|
||||
Ja::update();
|
||||
|
||||
// Sincronitzar estat: detectar quan la música s'ha parat (p. ex. fade-out completat)
|
||||
if (instance && instance->music_.state == MusicState::PLAYING && Ja::getMusicState() != Ja::MusicState::PLAYING) {
|
||||
instance->music_.state = MusicState::STOPPED;
|
||||
}
|
||||
}
|
||||
|
||||
// Reproduce la música por nombre (con crossfade opcional)
|
||||
@@ -66,7 +62,7 @@ void Audio::playMusic(const std::string& name, const int loop, const int crossfa
|
||||
const bool NEW_LOOP = (loop != 0);
|
||||
|
||||
// Si ja sona exactament la mateixa pista i mateix mode loop, no fem res
|
||||
if (music_.state == MusicState::PLAYING && music_.name == name && music_.loop == NEW_LOOP) {
|
||||
if (getMusicState() == MusicState::PLAYING && music_.name == name && music_.loop == NEW_LOOP) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -88,43 +84,44 @@ void Audio::playMusic(Ja::Music* music, const int loop, const int crossfade_ms)
|
||||
}
|
||||
|
||||
// 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.
|
||||
// actualitza el loop cachejat. Els callers s'encarreguen del gating
|
||||
// (music_enabled_, nullptr, same-track early return) i del nom. L'estat el
|
||||
// manté Ja (Ja::playMusic posa PLAYING al Ja::Music* corresponent).
|
||||
void Audio::playMusicInternal(Ja::Music* music, const int loop, const int crossfade_ms) {
|
||||
if (crossfade_ms > 0 && music_.state == MusicState::PLAYING) {
|
||||
const bool CURRENTLY_PLAYING = (getMusicState() == MusicState::PLAYING);
|
||||
if (crossfade_ms > 0 && CURRENTLY_PLAYING) {
|
||||
Ja::crossfadeMusic(music, crossfade_ms, loop);
|
||||
} else {
|
||||
if (music_.state == MusicState::PLAYING) {
|
||||
if (CURRENTLY_PLAYING) {
|
||||
Ja::stopMusic();
|
||||
}
|
||||
Ja::playMusic(music, loop);
|
||||
}
|
||||
|
||||
music_.loop = (loop != 0);
|
||||
music_.state = MusicState::PLAYING;
|
||||
}
|
||||
|
||||
// Pausa la música
|
||||
// Pausa la música (l'estat el transiciona Ja::pauseMusic)
|
||||
// NOLINTNEXTLINE(readability-make-member-function-const) — muta Ja::current_music->state
|
||||
void Audio::pauseMusic() {
|
||||
if (music_enabled_ && music_.state == MusicState::PLAYING) {
|
||||
if (music_enabled_ && getMusicState() == MusicState::PLAYING) {
|
||||
Ja::pauseMusic();
|
||||
music_.state = MusicState::PAUSED;
|
||||
}
|
||||
}
|
||||
|
||||
// Continua la música pausada
|
||||
// Continua la música pausada (l'estat el transiciona Ja::resumeMusic)
|
||||
// NOLINTNEXTLINE(readability-make-member-function-const) — muta Ja::current_music->state
|
||||
void Audio::resumeMusic() {
|
||||
if (music_enabled_ && music_.state == MusicState::PAUSED) {
|
||||
if (music_enabled_ && getMusicState() == MusicState::PAUSED) {
|
||||
Ja::resumeMusic();
|
||||
music_.state = MusicState::PLAYING;
|
||||
}
|
||||
}
|
||||
|
||||
// Detiene la música
|
||||
// Detiene la música (l'estat el transiciona Ja::stopMusic)
|
||||
// NOLINTNEXTLINE(readability-make-member-function-const) — muta Ja::current_music/outgoing_music
|
||||
void Audio::stopMusic() {
|
||||
if (music_enabled_) {
|
||||
Ja::stopMusic();
|
||||
music_.state = MusicState::STOPPED;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,15 +152,16 @@ void Audio::stopAllSounds() {
|
||||
// Realiza un fundido de salida de la música
|
||||
// NOLINTNEXTLINE(readability-make-member-function-const) — muta Ja::outgoing_music/incoming_fade
|
||||
void Audio::fadeOutMusic(int milliseconds) {
|
||||
if (music_enabled_ && getRealMusicState() == MusicState::PLAYING) {
|
||||
if (music_enabled_ && getMusicState() == MusicState::PLAYING) {
|
||||
Ja::fadeOutMusic(milliseconds);
|
||||
}
|
||||
}
|
||||
|
||||
// Consulta directament l'estat real de la música a jail_audio
|
||||
auto Audio::getRealMusicState() -> MusicState {
|
||||
const Ja::MusicState JA_STATE = Ja::getMusicState();
|
||||
switch (JA_STATE) {
|
||||
// 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).
|
||||
auto Audio::getMusicState() -> MusicState {
|
||||
switch (Ja::getMusicState()) {
|
||||
case Ja::MusicState::PLAYING:
|
||||
return MusicState::PLAYING;
|
||||
case Ja::MusicState::PAUSED:
|
||||
|
||||
Reference in new issue
Block a user