ASW Lib
A.D.S. Games SDL Wrapper Library. A library targeted at Allegro4 users who want to switch to SDL3 and use modern c++.
Loading...
Searching...
No Matches
sound.cpp
Go to the documentation of this file.
2
3#include <algorithm>
4
5#include <SDL3_mixer/SDL_mixer.h>
6
7namespace {
8float master_volume = 1.0F;
9float sfx_volume = 1.0F;
10float music_volume = 1.0F;
11
12int compute_sfx_volume(float vol)
13{
14 auto volume = vol * 255.0F * sfx_volume * master_volume;
15 return static_cast<int>(volume);
16}
17
19{
20 auto volume = vol * 255.0F * music_volume * master_volume;
21 return static_cast<int>(volume);
22}
23} // namespace
24
25void asw::sound::play(const asw::Sample& sample, float volume, float pan, bool loop)
26{
27 const int channel = Mix_PlayChannel(-1, sample.get(), loop ? -1 : 0);
28 if (channel >= 0) {
29 Mix_Volume(channel, compute_sfx_volume(volume));
30
31 auto panning = (std::clamp(pan, -1.0F, 1.0F) + 1.0F) * 127.5F;
32 auto int_pan = static_cast<unsigned char>(panning);
33
34 Mix_SetPanning(channel, 255 - int_pan, int_pan);
35 }
36}
37
38void asw::sound::play_music(const asw::Music& sample, float volume)
39{
40 Mix_VolumeMusic(compute_music_volume(volume));
41 Mix_PlayMusic(sample.get(), -1);
42}
43
45{
46 Mix_HaltMusic();
47}
48
49void asw::sound::fade_in_music(const asw::Music& music, float volume, float duration)
50{
51 Mix_FadeInMusic(music.get(), -1, static_cast<int>(duration * 1000.0F));
52 Mix_VolumeMusic(compute_music_volume(volume));
53}
54
55void asw::sound::fade_out_music(float duration)
56{
57 Mix_FadeOutMusic(static_cast<int>(duration * 1000.0F));
58}
59
61{
62 Mix_PauseMusic();
63}
64
66{
67 Mix_ResumeMusic();
68}
69
71{
72 return Mix_PlayingMusic();
73}
74
76{
77 return Mix_PausedMusic();
78}
79
81{
82 master_volume = std::clamp(volume, 0.0F, 1.0F);
83}
84
86{
87 sfx_volume = std::clamp(volume, 0.0F, 1.0F);
88}
89
91{
92 music_volume = std::clamp(volume, 0.0F, 1.0F);
93}
94
99
101{
102 return sfx_volume;
103}
104
106{
107 return music_volume;
108}
int compute_music_volume(float vol)
Definition sound.cpp:18
int compute_sfx_volume(float vol)
Definition sound.cpp:12
void stop_music()
Stop the currently playing music.
Definition sound.cpp:44
bool is_music_paused()
Check if music is paused.
Definition sound.cpp:75
void pause_music()
Pause the currently playing music.
Definition sound.cpp:60
float get_master_volume()
Get the current master volume multiplier.
Definition sound.cpp:95
bool is_music_playing()
Check if music is currently playing.
Definition sound.cpp:70
void set_sfx_volume(float volume)
Set the SFX volume multiplier.
Definition sound.cpp:85
float get_music_volume()
Get the current music volume multiplier.
Definition sound.cpp:105
void resume_music()
Resume paused music.
Definition sound.cpp:65
void fade_in_music(const asw::Music &music, float volume, float duration)
Fade in music over a duration.
Definition sound.cpp:49
void play_music(const asw::Music &sample, float volume=1.0F)
Play a music sample.
Definition sound.cpp:38
float get_sfx_volume()
Get the current SFX volume multiplier.
Definition sound.cpp:100
void set_music_volume(float volume)
Set the music volume multiplier.
Definition sound.cpp:90
void set_master_volume(float volume)
Set the master volume multiplier (affects all audio).
Definition sound.cpp:80
void play(const asw::Sample &sample, float volume=1.0F, float pan=0.0F, bool loop=false)
Play a sample.
Definition sound.cpp:25
void fade_out_music(float duration)
Fade out the currently playing music.
Definition sound.cpp:55
std::shared_ptr< Mix_Chunk > Sample
Alias for a shared pointer to an Mix_Chunk.
Definition types.h:44
std::shared_ptr< Mix_Music > Music
Alias for a shared pointer to an Mix_Music.
Definition types.h:47
Sound module for the ASW library.