3#include <SDL3_mixer/SDL_mixer.h>
22 return std::clamp(volume, 0.0F, 1.0F);
28 return std::clamp(volume, 0.0F, 1.0F);
33 for (
size_t i = 0; i <
tracks.size(); ++i) {
34 if (!MIX_TrackPlaying(
tracks[i])) {
35 return static_cast<int>(i);
65 if (
mixer !=
nullptr) {
72 spec.format = SDL_AUDIO_S16LE;
76 mixer = MIX_CreateMixerDevice(SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK, &spec);
77 if (
mixer ==
nullptr) {
82 for (
auto& track :
tracks) {
83 track = MIX_CreateTrack(
mixer);
84 if (track ==
nullptr) {
104 auto& track =
tracks[channel];
105 MIX_SetTrackAudio(track, sample.get());
109 const float left = std::sqrtf((1.0F - pan) * 0.5F);
110 const float right = std::sqrtf((1.0F + pan) * 0.5F);
112 MIX_StereoGains gains;
115 MIX_SetTrackStereo(track, &gains);
118 const SDL_PropertiesID options = SDL_CreateProperties();
119 SDL_SetNumberProperty(options, MIX_PROP_PLAY_LOOPS_NUMBER, loop ? -1 : 0);
120 MIX_PlayTrack(track, options);
129 const SDL_PropertiesID options = SDL_CreateProperties();
130 SDL_SetNumberProperty(options, MIX_PROP_PLAY_LOOPS_NUMBER, -1);
131 SDL_SetNumberProperty(
132 options, MIX_PROP_PLAY_FADE_IN_MILLISECONDS_NUMBER,
static_cast<int>(fade_in_s * 1000.0F));
139 const auto fade_out_frames
140 = MIX_TrackMSToFrames(
music_track,
static_cast<Sint64
>(fade_out_s * 1000.0F));
Structured logging system.
std::array< MIX_Track *, 16 > tracks
float compute_music_volume(float vol)
float compute_sfx_volume(float vol)
void error(const std::string &message)
Log an error message.
void warn(const std::string &message)
Log a warning message.
bool is_music_paused()
Check if music is paused.
void pause_music()
Pause the currently playing music.
float get_master_volume()
Get the current master volume multiplier.
void play_music(const asw::Music &sample, float volume=1.0F, float fade_in_s=0.0F)
Play a music sample.
bool is_music_playing()
Check if music is currently playing.
void set_sfx_volume(float volume)
Set the SFX volume multiplier.
float get_music_volume()
Get the current music volume multiplier.
void resume_music()
Resume paused music.
void _shutdown()
Shut down the sound module. Called automatically by asw::core::shutdown().
MIX_Mixer * get_mixer()
Get the SDL mixer device.
float get_sfx_volume()
Get the current SFX volume multiplier.
void set_music_volume(float volume)
Set the music volume multiplier.
void set_master_volume(float volume)
Set the master volume multiplier (affects all audio).
void play(const asw::Sample &sample, float volume=1.0F, float pan=0.5F, bool loop=false)
Play a sample.
void stop_music(float fade_out_s=0.0F)
Stop the currently playing music.
bool _init()
Initialize the sound module. Called automatically by asw::core::init().
std::shared_ptr< MIX_Audio > Sample
Alias for a shared pointer to an MIX_Audio.
std::shared_ptr< MIX_Audio > Music
Alias for a shared pointer to an MIX_Audio.
Sound module for the ASW library.