Audio: corregida la logica

This commit is contained in:
2025-06-13 18:57:48 +02:00
parent 5f52560ab5
commit 9b7da383ea
2 changed files with 57 additions and 30 deletions

View File

@@ -43,40 +43,40 @@ Audio::~Audio() { JA_Quit(); }
// Reproduce la música // Reproduce la música
void Audio::playMusic(const std::string &name, const int loop) void Audio::playMusic(const std::string &name, const int loop)
{ {
music_name_ = name; music_.name = name;
music_loop_ = loop; music_.loop = loop;
if (enabled_ && music_enabled_) if (music_enabled_ && music_.state != MusicState::PLAYING)
{ {
if (JA_GetMusicState() == JA_MUSIC_STOPPED) JA_PlayMusic(Resource::get()->getMusic(name), loop);
{ music_.state = MusicState::PLAYING;
JA_PlayMusic(Resource::get()->getMusic(name), loop);
}
} }
} }
// Pausa la música // Pausa la música
void Audio::pauseMusic() void Audio::pauseMusic()
{ {
if (enabled_ && music_enabled_) if (music_enabled_ && music_.state == MusicState::PLAYING)
{ {
JA_PauseMusic(); JA_PauseMusic();
music_.state = MusicState::PAUSED;
} }
} }
// Detiene la música // Detiene la música
void Audio::stopMusic() void Audio::stopMusic()
{ {
if (enabled_ && music_enabled_) if (music_enabled_)
{ {
JA_StopMusic(); JA_StopMusic();
music_.state = MusicState::STOPPED;
} }
} }
// Reproduce un sonido // Reproduce un sonido
void Audio::playSound(const std::string &name) void Audio::playSound(const std::string &name)
{ {
if (enabled_ && sound_enabled_) if (sound_enabled_)
{ {
JA_PlaySound(Resource::get()->getSound(name)); JA_PlaySound(Resource::get()->getSound(name));
} }
@@ -85,7 +85,7 @@ void Audio::playSound(const std::string &name)
// Detiene todos los sonidos // Detiene todos los sonidos
void Audio::stopAllSounds() void Audio::stopAllSounds()
{ {
if (enabled_ && sound_enabled_) if (sound_enabled_)
{ {
JA_StopChannel(-1); JA_StopChannel(-1);
} }
@@ -94,7 +94,7 @@ void Audio::stopAllSounds()
// Realiza un fundido de salida de la música // Realiza un fundido de salida de la música
void Audio::fadeOutMusic(int milliseconds) void Audio::fadeOutMusic(int milliseconds)
{ {
if (enabled_ && music_enabled_) if (music_enabled_)
{ {
JA_FadeOutMusic(milliseconds); JA_FadeOutMusic(milliseconds);
} }
@@ -103,7 +103,7 @@ void Audio::fadeOutMusic(int milliseconds)
// Establece el volumen de los sonidos // Establece el volumen de los sonidos
void Audio::setSoundVolume(int sound_volume) void Audio::setSoundVolume(int sound_volume)
{ {
if (enabled_ && sound_enabled_) if (sound_enabled_)
{ {
sound_volume = std::clamp(sound_volume, 0, 100); sound_volume = std::clamp(sound_volume, 0, 100);
const float CONVERTED_VOLUME = (sound_volume / 100.0f) * (options.audio.volume / 100.0f); const float CONVERTED_VOLUME = (sound_volume / 100.0f) * (options.audio.volume / 100.0f);
@@ -114,7 +114,7 @@ void Audio::setSoundVolume(int sound_volume)
// Establece el volumen de la música // Establece el volumen de la música
void Audio::setMusicVolume(int music_volume) void Audio::setMusicVolume(int music_volume)
{ {
if (enabled_ && music_enabled_) if (music_enabled_)
{ {
music_volume = std::clamp(music_volume, 0, 100); music_volume = std::clamp(music_volume, 0, 100);
const float CONVERTED_VOLUME = (music_volume / 100.0f) * (options.audio.volume / 100.0f); const float CONVERTED_VOLUME = (music_volume / 100.0f) * (options.audio.volume / 100.0f);
@@ -127,13 +127,23 @@ void Audio::applySettings()
{ {
setSoundVolume(options.audio.sound.volume); setSoundVolume(options.audio.sound.volume);
setMusicVolume(options.audio.music.volume); setMusicVolume(options.audio.music.volume);
enable(options.audio.enabled);
}
bool const PREVIOUS_ENABLED = enabled_; // Guarda el estado actual // Establecer estado general
enable(options.audio.enabled); // Modifica enabled_ void Audio::enable(bool value)
{
enabled_ = value;
// Solo ejecuta la acción si el estado ha cambiado switch (enabled_)
if (PREVIOUS_ENABLED != enabled_)
{ {
enabled_ ? JA_PlayMusic(Resource::get()->getMusic(music_name_), music_loop_) : JA_StopMusic(); case true:
setSoundVolume(options.audio.sound.volume);
setMusicVolume(options.audio.music.volume);
break;
case false:
setSoundVolume(0);
setMusicVolume(0);
break;
} }
} }

View File

@@ -22,9 +22,7 @@ public:
void stopAllSounds(); // Detener todos los sonidos void stopAllSounds(); // Detener todos los sonidos
// --- Configuración General --- // --- Configuración General ---
void enable() { enabled_ = true; } // Habilitar audio void enable(bool value); // Establecer estado general
void disable() { enabled_ = false; } // Deshabilitar audio
void enable(bool value) { enabled_ = value; } // Establecer estado general
void toggleEnabled() { enabled_ = !enabled_; } // Alternar estado general void toggleEnabled() { enabled_ = !enabled_; } // Alternar estado general
void applySettings(); // Aplica la configuración void applySettings(); // Aplica la configuración
@@ -45,15 +43,34 @@ public:
void setMusicVolume(int volume); // Ajustar volumen de música void setMusicVolume(int volume); // Ajustar volumen de música
private: private:
enum class MusicState
{
PLAYING,
PAUSED,
STOPPED,
};
struct Music
{
MusicState state; // Estado actual de la música (reproduciendo, detenido, en pausa)
std::string name; // Última pista de música reproducida
bool loop; // Indica si la última pista de música se debe reproducir en bucle
// Constructor para inicializar la música con valores predeterminados
Music() : state(MusicState::STOPPED), name(""), loop(false) {}
// Constructor para inicializar con valores específicos
Music(MusicState initState, const std::string &initName, bool initLoop)
: state(initState), name(initName), loop(initLoop) {}
};
Music music_;
// --- Variables de Estado --- // --- Variables de Estado ---
bool enabled_ = true; // Estado general del audio bool enabled_ = true; // Estado general del audio
bool sound_enabled_ = true; // Estado de los efectos de sonido bool sound_enabled_ = true; // Estado de los efectos de sonido
bool music_enabled_ = true; // Estado de la música bool music_enabled_ = true; // Estado de la música
// -- Variables de backup ---
std::string music_name_; // Última pista de música que se ha reproducido
bool music_loop_; // Parametros de la última pista de música reproducida
// --- Patrón Singleton --- // --- Patrón Singleton ---
Audio(); // Constructor privado Audio(); // Constructor privado
~Audio(); // Destructor privado ~Audio(); // Destructor privado