137 lines
3.1 KiB
C++
137 lines
3.1 KiB
C++
#include "audio.h"
|
|
#include "jail_audio.h"
|
|
#include "options.h"
|
|
#include "resource.h"
|
|
#include <SDL3/SDL.h>
|
|
|
|
// Singleton
|
|
Audio *Audio::instance_ = nullptr;
|
|
|
|
// Inicializa la instancia única del singleton
|
|
void Audio::init() { Audio::instance_ = new Audio(); }
|
|
|
|
// Libera la instancia
|
|
void Audio::destroy() { delete Audio::instance_; }
|
|
|
|
// Obtiene la instancia
|
|
Audio *Audio::get() { return Audio::instance_; }
|
|
|
|
// Constructor
|
|
Audio::Audio()
|
|
{
|
|
// Inicializa SDL
|
|
if (!SDL_Init(SDL_INIT_AUDIO))
|
|
{
|
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "SDL_AUDIO could not initialize! SDL Error: %s", SDL_GetError());
|
|
}
|
|
else
|
|
{
|
|
SDL_LogInfo(SDL_LOG_CATEGORY_TEST, "\n** SDL_AUDIO: INITIALIZING\n");
|
|
|
|
JA_Init(48000, SDL_AUDIO_S16LE, 2);
|
|
enable(options.audio.enabled);
|
|
setMusicVolume(options.audio.music.volume);
|
|
setSoundVolume(options.audio.sound.volume);
|
|
|
|
SDL_LogInfo(SDL_LOG_CATEGORY_TEST, "** SDL_AUDIO: INITIALIZATION COMPLETE\n");
|
|
}
|
|
}
|
|
|
|
// Destructor
|
|
Audio::~Audio() { JA_Quit(); }
|
|
|
|
// Reproduce la música
|
|
void Audio::playMusic(const std::string &name, const int loop)
|
|
{
|
|
music_name_ = name;
|
|
music_loop_ = loop;
|
|
|
|
if (enabled_ && music_enabled_)
|
|
{
|
|
JA_PlayMusic(Resource::get()->getMusic(name), loop);
|
|
}
|
|
}
|
|
|
|
// Pausa la música
|
|
void Audio::pauseMusic()
|
|
{
|
|
if (enabled_ && music_enabled_)
|
|
{
|
|
JA_PauseMusic();
|
|
}
|
|
}
|
|
|
|
// Detiene la música
|
|
void Audio::stopMusic()
|
|
{
|
|
if (enabled_ && music_enabled_)
|
|
{
|
|
JA_StopMusic();
|
|
}
|
|
}
|
|
|
|
// Reproduce un sonido
|
|
void Audio::playSound(const std::string &name)
|
|
{
|
|
if (enabled_ && sound_enabled_)
|
|
{
|
|
JA_PlaySound(Resource::get()->getSound(name));
|
|
}
|
|
}
|
|
|
|
// Detiene todos los sonidos
|
|
void Audio::stopAllSounds()
|
|
{
|
|
if (enabled_ && sound_enabled_)
|
|
{
|
|
JA_StopChannel(-1);
|
|
}
|
|
}
|
|
|
|
// Realiza un fundido de salida de la música
|
|
void Audio::fadeOutMusic(int milliseconds)
|
|
{
|
|
if (enabled_ && music_enabled_)
|
|
{
|
|
JA_FadeOutMusic(milliseconds);
|
|
}
|
|
}
|
|
|
|
// Establece el volumen de los sonidos
|
|
void Audio::setSoundVolume(int sound_volume)
|
|
{
|
|
if (enabled_ && sound_enabled_)
|
|
{
|
|
sound_volume = std::clamp(sound_volume, 0, 100);
|
|
const float CONVERTED_VOLUME = (sound_volume / 100.0f) * (options.audio.volume / 100.0f);
|
|
JA_SetSoundVolume(CONVERTED_VOLUME);
|
|
}
|
|
}
|
|
|
|
// Establece el volumen de la música
|
|
void Audio::setMusicVolume(int music_volume)
|
|
{
|
|
if (enabled_ && music_enabled_)
|
|
{
|
|
music_volume = std::clamp(music_volume, 0, 100);
|
|
const float CONVERTED_VOLUME = (music_volume / 100.0f) * (options.audio.volume / 100.0f);
|
|
JA_SetMusicVolume(CONVERTED_VOLUME);
|
|
}
|
|
}
|
|
|
|
// Aplica la configuración
|
|
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();
|
|
}
|
|
}
|