diff --git a/source/audio.cpp b/source/audio.cpp index 3369145..0ecc50f 100644 --- a/source/audio.cpp +++ b/source/audio.cpp @@ -43,40 +43,40 @@ Audio::~Audio() { JA_Quit(); } // Reproduce la música void Audio::playMusic(const std::string &name, const int loop) { - music_name_ = name; - music_loop_ = loop; + music_.name = name; + 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); - } + JA_PlayMusic(Resource::get()->getMusic(name), loop); + music_.state = MusicState::PLAYING; } } // Pausa la música void Audio::pauseMusic() { - if (enabled_ && music_enabled_) + if (music_enabled_ && music_.state == MusicState::PLAYING) { JA_PauseMusic(); + music_.state = MusicState::PAUSED; } } // Detiene la música void Audio::stopMusic() { - if (enabled_ && music_enabled_) + if (music_enabled_) { JA_StopMusic(); + music_.state = MusicState::STOPPED; } } // Reproduce un sonido void Audio::playSound(const std::string &name) { - if (enabled_ && sound_enabled_) + if (sound_enabled_) { JA_PlaySound(Resource::get()->getSound(name)); } @@ -85,7 +85,7 @@ void Audio::playSound(const std::string &name) // Detiene todos los sonidos void Audio::stopAllSounds() { - if (enabled_ && sound_enabled_) + if (sound_enabled_) { JA_StopChannel(-1); } @@ -94,7 +94,7 @@ void Audio::stopAllSounds() // Realiza un fundido de salida de la música void Audio::fadeOutMusic(int milliseconds) { - if (enabled_ && music_enabled_) + if (music_enabled_) { JA_FadeOutMusic(milliseconds); } @@ -103,7 +103,7 @@ void Audio::fadeOutMusic(int milliseconds) // Establece el volumen de los sonidos void Audio::setSoundVolume(int sound_volume) { - if (enabled_ && sound_enabled_) + if (sound_enabled_) { sound_volume = std::clamp(sound_volume, 0, 100); 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 void Audio::setMusicVolume(int music_volume) { - if (enabled_ && music_enabled_) + if (music_enabled_) { music_volume = std::clamp(music_volume, 0, 100); 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); setMusicVolume(options.audio.music.volume); - - bool const PREVIOUS_ENABLED = enabled_; // Guarda el estado actual - enable(options.audio.enabled); // Modifica enabled_ - - // Solo ejecuta la acción si el estado ha cambiado - if (PREVIOUS_ENABLED != enabled_) - { - enabled_ ? JA_PlayMusic(Resource::get()->getMusic(music_name_), music_loop_) : JA_StopMusic(); - } + enable(options.audio.enabled); } + +// Establecer estado general +void Audio::enable(bool value) +{ + enabled_ = value; + + switch (enabled_) + { + case true: + setSoundVolume(options.audio.sound.volume); + setMusicVolume(options.audio.music.volume); + break; + case false: + setSoundVolume(0); + setMusicVolume(0); + break; + } +} \ No newline at end of file diff --git a/source/audio.h b/source/audio.h index ab9553e..8f8f57b 100644 --- a/source/audio.h +++ b/source/audio.h @@ -22,9 +22,7 @@ public: void stopAllSounds(); // Detener todos los sonidos // --- Configuración General --- - void enable() { enabled_ = true; } // Habilitar audio - void disable() { enabled_ = false; } // Deshabilitar audio - void enable(bool value) { enabled_ = value; } // Establecer estado general + void enable(bool value); // Establecer estado general void toggleEnabled() { enabled_ = !enabled_; } // Alternar estado general void applySettings(); // Aplica la configuración @@ -45,15 +43,34 @@ public: void setMusicVolume(int volume); // Ajustar volumen de música 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 --- bool enabled_ = true; // Estado general del audio bool sound_enabled_ = true; // Estado de los efectos de sonido 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 --- Audio(); // Constructor privado ~Audio(); // Destructor privado