From 35c2fc2632da3cefff128602ca2de3fd3a6c5e91 Mon Sep 17 00:00:00 2001 From: Jason Dagit Date: Fri, 17 Mar 2023 11:42:46 -0700 Subject: [PATCH 1/4] Add (mixer) volume setting --- sm.ini | 3 +++ src/config.c | 3 +++ src/config.h | 1 + src/main.c | 3 +++ 4 files changed, 10 insertions(+) diff --git a/sm.ini b/sm.ini index 3b1a8ea..123e618 100644 --- a/sm.ini +++ b/sm.ini @@ -43,6 +43,9 @@ LinearFiltering = 0 [Sound] EnableAudio = 1 +# Default mixer volume +Volume = 10 + # DSP frequency in samples per second (e.g. 48000, 44100, 32000, 22050, 11025) AudioFreq = 32000 diff --git a/src/config.c b/src/config.c index 2d9f3d5..04f8124 100644 --- a/src/config.c +++ b/src/config.c @@ -403,6 +403,9 @@ static bool HandleIniConfig(int section, const char *key, char *value) { return true; } else if (StringEqualsNoCase(key, "ResumeMSU")) { return ParseBool(value, &g_config.resume_msu); + } else if (StringEqualsNoCase(key, "Volume")) { + g_config.volume = (uint8)strtol(value, (char**)NULL, 10); + return true; } } else if (section == 3) { if (StringEqualsNoCase(key, "Autosave")) { diff --git a/src/config.h b/src/config.h index 724965e..37257e7 100644 --- a/src/config.h +++ b/src/config.h @@ -64,6 +64,7 @@ typedef struct Config { uint8 enable_msu; bool resume_msu; bool disable_frame_delay; + uint8 volume; uint8 msuvolume; uint32 features0; diff --git a/src/main.c b/src/main.c index 64ececa..8b56c0a 100644 --- a/src/main.c +++ b/src/main.c @@ -357,6 +357,9 @@ int main(int argc, char** argv) { if (g_config.audio_samples <= 0 || ((g_config.audio_samples & (g_config.audio_samples - 1)) != 0)) g_config.audio_samples = kDefaultSamples; + // Load the volume level from the config file + g_sdl_audio_mixer_volume = g_config.volume; + // set up SDL if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_GAMECONTROLLER) != 0) { printf("Failed to init SDL: %s\n", SDL_GetError()); From 7ea7f7502466978679ba52cf6a578b95455a4281 Mon Sep 17 00:00:00 2001 From: Jason Dagit Date: Fri, 17 Mar 2023 11:46:12 -0700 Subject: [PATCH 2/4] Set default volume to 100 --- sm.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sm.ini b/sm.ini index 123e618..a8014b7 100644 --- a/sm.ini +++ b/sm.ini @@ -44,7 +44,7 @@ LinearFiltering = 0 EnableAudio = 1 # Default mixer volume -Volume = 10 +Volume = 100 # DSP frequency in samples per second (e.g. 48000, 44100, 32000, 22050, 11025) AudioFreq = 32000 From 6d4386e2bbf96fc1d70b7adc2002d45b760408b7 Mon Sep 17 00:00:00 2001 From: Jason Dagit Date: Fri, 17 Mar 2023 11:56:35 -0700 Subject: [PATCH 3/4] Clean up audio setting code a bit --- src/main.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main.c b/src/main.c index 8b56c0a..ef9ecda 100644 --- a/src/main.c +++ b/src/main.c @@ -32,6 +32,8 @@ static void SDLCALL AudioCallback(void *userdata, Uint8 *stream, int len); static void SwitchDirectory(); static void RenderNumber(uint8 *dst, size_t pitch, int n, uint8 big); static void OpenOneGamepad(int i); +static void SetVolumeLevel(int new_volume); +static int GetVolumeLevel(); static void HandleVolumeAdjustment(int volume_adjustment); static void HandleGamepadAxisInput(int gamepad_id, int axis, int value); static int RemapSdlButton(int button); @@ -358,7 +360,7 @@ int main(int argc, char** argv) { g_config.audio_samples = kDefaultSamples; // Load the volume level from the config file - g_sdl_audio_mixer_volume = g_config.volume; + SetVolumeLevel(g_config.volume); // set up SDL if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_GAMECONTROLLER) != 0) { @@ -736,18 +738,35 @@ static void HandleGamepadInput(int button, bool pressed) { HandleCommand(g_gamepad_last_cmd[button], pressed); } -static void HandleVolumeAdjustment(int volume_adjustment) { +static int GetVolumeLevel() { +#if SYSTEM_VOLUME_MIXER_AVAILABLE + return GetApplicationVolume(); +#else + return g_sdl_audio_mixer_volume; +#endif +} + +static void SetVolumeLevel(int new_volume) { #if SYSTEM_VOLUME_MIXER_AVAILABLE - int current_volume = GetApplicationVolume(); - int new_volume = IntMin(IntMax(0, current_volume + volume_adjustment * 5), 100); + int new_volume = IntMin(IntMax(0, new_volume), 100); SetApplicationVolume(new_volume); printf("[System Volume]=%i\n", new_volume); #else - g_sdl_audio_mixer_volume = IntMin(IntMax(0, g_sdl_audio_mixer_volume + volume_adjustment * (SDL_MIX_MAXVOLUME >> 4)), SDL_MIX_MAXVOLUME); + g_sdl_audio_mixer_volume = IntMin(IntMax(0, new_volume), SDL_MIX_MAXVOLUME); printf("[SDL mixer volume]=%i\n", g_sdl_audio_mixer_volume); #endif } +static void HandleVolumeAdjustment(int volume_adjustment) { + int current_volume = GetVolumeLevel(); +#if SYSTEM_VOLUME_MIXER_AVAILABLE + int new_volume = current_volume + volume_adjustment * 5; +#else + int new_volume = current_volume + volume_adjustment * (SDL_MIX_MAXVOLUME >> 4); +#endif + SetVolumeLevel(new_volume); +} + // Approximates atan2(y, x) normalized to the [0,4) range // with a maximum error of 0.1620 degrees // normalized_atan(x) ~ (b x + x^2) / (1 + 2 b x + x^2) From 19f231a3bdda71408b37f7f77fe365b7f9f85ce0 Mon Sep 17 00:00:00 2001 From: Jason Dagit Date: Mon, 20 Mar 2023 15:58:34 -0700 Subject: [PATCH 4/4] Store mixer volume in the range 0 to 100 internally --- src/main.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/main.c b/src/main.c index ef9ecda..047ad3a 100644 --- a/src/main.c +++ b/src/main.c @@ -78,7 +78,8 @@ static bool g_display_perf; static int g_curr_fps; static int g_ppu_render_flags = 0; static int g_snes_width, g_snes_height; -static int g_sdl_audio_mixer_volume = SDL_MIX_MAXVOLUME; +static const int MIX_MAXVOLUME = 100; +static int g_audio_mixer_volume = MIX_MAXVOLUME; static struct RendererFuncs g_renderer_funcs; static uint32 g_gamepad_modifiers; static uint16 g_gamepad_last_cmd[kGamepadBtn_Count]; @@ -224,11 +225,12 @@ static void SDLCALL AudioCallback(void *userdata, Uint8 *stream, int len) { g_audiobuffer_end = g_audiobuffer + g_frames_per_block * g_audio_channels * sizeof(int16); } int n = IntMin(len, g_audiobuffer_end - g_audiobuffer_cur); - if (g_sdl_audio_mixer_volume == SDL_MIX_MAXVOLUME) { + if (g_audio_mixer_volume == MIX_MAXVOLUME) { memcpy(stream, g_audiobuffer_cur, n); } else { SDL_memset(stream, 0, n); - SDL_MixAudioFormat(stream, g_audiobuffer_cur, AUDIO_S16, n, g_sdl_audio_mixer_volume); + const int current_volume = IntMin(IntMax(0, (SDL_MIX_MAXVOLUME*g_audio_mixer_volume)/MIX_MAXVOLUME), SDL_MIX_MAXVOLUME); + SDL_MixAudioFormat(stream, g_audiobuffer_cur, AUDIO_S16, n, current_volume); } g_audiobuffer_cur += n; stream += n; @@ -742,28 +744,21 @@ static int GetVolumeLevel() { #if SYSTEM_VOLUME_MIXER_AVAILABLE return GetApplicationVolume(); #else - return g_sdl_audio_mixer_volume; + return g_audio_mixer_volume; #endif } static void SetVolumeLevel(int new_volume) { + g_audio_mixer_volume = IntMin(IntMax(0, new_volume), MIX_MAXVOLUME); #if SYSTEM_VOLUME_MIXER_AVAILABLE - int new_volume = IntMin(IntMax(0, new_volume), 100); - SetApplicationVolume(new_volume); - printf("[System Volume]=%i\n", new_volume); -#else - g_sdl_audio_mixer_volume = IntMin(IntMax(0, new_volume), SDL_MIX_MAXVOLUME); - printf("[SDL mixer volume]=%i\n", g_sdl_audio_mixer_volume); + SetApplicationVolume(g_audio_mixer_volume); #endif + printf("[Mixer Volume]=%i\n", g_audio_mixer_volume); } static void HandleVolumeAdjustment(int volume_adjustment) { int current_volume = GetVolumeLevel(); -#if SYSTEM_VOLUME_MIXER_AVAILABLE int new_volume = current_volume + volume_adjustment * 5; -#else - int new_volume = current_volume + volume_adjustment * (SDL_MIX_MAXVOLUME >> 4); -#endif SetVolumeLevel(new_volume); }