diff --git a/src/cvars.cpp b/src/cvars.cpp index bc247a3d4..447fa8911 100644 --- a/src/cvars.cpp +++ b/src/cvars.cpp @@ -409,6 +409,11 @@ consvar_t cv_netticbuffer = Player("netticbuffer", "1").min_max(0, 3); void SetChannelsNum(void); consvar_t cv_numChannels = Player("snd_channels", "64").values(CV_Unsigned).onchange(SetChannelsNum); +extern CV_PossibleValue_t soundmixingbuffersize_cons_t[]; +consvar_t cv_soundmixingbuffersize = Player("snd_mixingbuffersize", "2048") + .values(soundmixingbuffersize_cons_t) + .onchange_noinit([]() { COM_ImmedExecute("restartaudio"); }); + extern CV_PossibleValue_t perfstats_cons_t[]; consvar_t cv_perfstats = Player("perfstats", "Off").dont_save().values(perfstats_cons_t); diff --git a/src/menus/options-sound.cpp b/src/menus/options-sound.cpp index 370dab611..fd7b1b701 100644 --- a/src/menus/options-sound.cpp +++ b/src/menus/options-sound.cpp @@ -304,6 +304,9 @@ menuitem_t OPTIONS_Sound[] = {IT_STRING | IT_CVAR, "Hear Tabbed-out", "Keep playing game audio when the window is out of focus (FOCUS LOST).", NULL, {.cvar = &cv_bgaudio}, 0, 0}, + {IT_STRING | IT_CVAR, "Mixing Buffer Size", "Audio buffer size. Higher is faster but more delay.", + NULL, {.cvar = &cv_soundmixingbuffersize}, 0, 0}, + {IT_SPACE | IT_NOTHING, NULL, NULL, NULL, {NULL}, 0, 0}, diff --git a/src/s_sound.c b/src/s_sound.c index c4d1993bf..c1d9a4df2 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -43,6 +43,15 @@ extern consvar_t cv_mastervolume; +CV_PossibleValue_t soundmixingbuffersize_cons_t[] = { + {256, "256"}, + {512, "512"}, + {1024, "1024"}, + {2048, "2048"}, + {4096, "4096"}, + {0, NULL} +}; + static boolean S_AdjustSoundParams(const mobj_t *listener, const mobj_t *source, INT32 *vol, INT32 *sep, INT32 *pitch, sfxinfo_t *sfxinfo); static void Command_Tunes_f(void); @@ -2424,8 +2433,6 @@ static void Command_RestartAudio_f(void) S_SetMusicVolume(); S_SetMasterVolume(); - S_StartSound(NULL, sfx_strpst); - S_AttemptToRestoreMusic(); } diff --git a/src/s_sound.h b/src/s_sound.h index 981d1bd5c..1a7b6a8c9 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -38,6 +38,8 @@ extern consvar_t cv_soundvolume, cv_closedcaptioning, cv_digmusicvolume; extern consvar_t surround; extern consvar_t cv_numChannels; +extern CV_PossibleValue_t soundmixingbuffersize_cons_t[]; +extern consvar_t cv_soundmixingbuffersize; extern consvar_t cv_gamedigimusic; diff --git a/src/sdl/new_sound.cpp b/src/sdl/new_sound.cpp index a55fafd1c..5330b8aff 100644 --- a/src/sdl/new_sound.cpp +++ b/src/sdl/new_sound.cpp @@ -183,7 +183,7 @@ void initialize_sound() SDL_AudioSpec desired; desired.format = AUDIO_F32SYS; desired.channels = 2; - desired.samples = 1024; + desired.samples = cv_soundmixingbuffersize.value; desired.freq = 44100; desired.callback = audio_callback; @@ -215,6 +215,7 @@ void initialize_sound() master->add_source(gain_sound_effects); master->add_source(gain_music_channel); mixer_music->add_source(gain_music_player); + sound_effect_channels.clear(); for (size_t i = 0; i < static_cast(cv_numChannels.value); i++) { shared_ptr player = make_shared(); @@ -236,13 +237,10 @@ void I_StartupSound(void) void I_ShutdownSound(void) { - SdlAudioLockHandle _; + SDL_CloseAudio(); + SDL_QuitSubSystem(SDL_INIT_AUDIO); - for (auto& channel : sound_effect_channels) - { - if (channel) - *channel = audio::SoundEffectPlayer(); - } + sound_started = false; } void I_UpdateSound(void)