diff --git a/src/m_menu.c b/src/m_menu.c index da41af9f..1fea89e4 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -3710,7 +3710,6 @@ enum { // [FG] uncapped rendering frame rate general_uncapped, general_vsync, - general_stub1, general_trans, general_transpct, general_gamma, @@ -3718,6 +3717,7 @@ enum { general_title2, general_sndchan, + general_parallelsfx, general_pitch, // [FG] play sounds in full length general_fullsnd, @@ -3789,8 +3789,6 @@ setup_menu_t gen_settings1[] = { // General Settings screen1 {"Vertical Sync", S_YESNO, m_null, M_X, M_Y+ general_vsync*M_SPC, {"use_vsync"}, 0, I_ResetScreen}, - {"", S_SKIP, m_null, M_X, M_Y + general_stub1*M_SPC}, - {"Enable predefined translucency", S_YESNO, m_null, M_X, M_Y+ general_trans*M_SPC, {"translucency"}, 0, M_Trans}, @@ -3808,6 +3806,10 @@ setup_menu_t gen_settings1[] = { // General Settings screen1 {"Number of Sound Channels", S_NUM|S_PRGWARN, m_null, M_X, M_Y + general_sndchan*M_SPC, {"snd_channels"}}, + // [FG] parallel same-sound limit from DSDA-Doom + {"Parallel Same-Sound Limit", S_YESNO, m_null, M_X, + M_Y + general_parallelsfx*M_SPC, {"parallel_sfx"}}, + {"Enable v1.1 Pitch Effects", S_YESNO, m_null, M_X, M_Y + general_pitch*M_SPC, {"pitched_sounds"}}, diff --git a/src/m_misc.c b/src/m_misc.c index 0ef8f9f4..7b74cf97 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -1493,7 +1493,7 @@ default_t defaults[] = { { // killough "snd_channels", (config_t *) &default_numChannels, NULL, - {MAX_CHANNELS}, {1, MAX_CHANNELS}, 0, ss_gen, wad_no, + {16}, {1, MAX_CHANNELS}, 0, ss_gen, wad_no, "number of sound effects handled simultaneously" }, @@ -2253,6 +2253,28 @@ default_t defaults[] = { "1 to play sounds in full length" }, + // [FG] parallel same-sound limit + { + "parallel_sfx", + (config_t *) ¶llel_sfx, NULL, + {0}, {0, 1}, number, ss_gen, wad_no, + "1 to enable parallel same-sound limit" + }, + + { + "parallel_sfx_limit", + (config_t *) ¶llel_sfx_limit, NULL, + {2}, {0, 32}, number, ss_none, wad_no, + "parallel same-sound limit" + }, + + { + "parallel_sfx_window", + (config_t *) ¶llel_sfx_window, NULL, + {4}, {1, 32}, number, ss_none, wad_no, + "parallel same-sound limit window" + }, + // [FG] music backend { "midi_player", diff --git a/src/s_sound.c b/src/s_sound.c index 97b28dcf..2a8a2cb8 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -276,6 +276,27 @@ static int S_getChannel(const mobj_t *origin, sfxinfo_t *sfxinfo, return cnum; } +// [FG] parallel same-sound limit from DSDA-Doom + +boolean parallel_sfx; +int parallel_sfx_limit; +int parallel_sfx_window; + +static boolean BlockSFX(sfxinfo_t *sfx) +{ + if (!parallel_sfx) + return false; + + if (gametic - sfx->parallel_tic >= parallel_sfx_window) + { + sfx->parallel_tic = gametic; + sfx->parallel_count = 0; + } + + ++sfx->parallel_count; + + return sfx->parallel_count > parallel_sfx_limit; +} void S_StartSound(const mobj_t *origin, int sfx_id) { @@ -342,6 +363,10 @@ void S_StartSound(const mobj_t *origin, int sfx_id) sep = NORM_SEP; } + // [FG] parallel same-sound limit from DSDA-Doom + if (BlockSFX(sfx)) + return; + if(pitched_sounds) { // hacks to vary the sfx pitches diff --git a/src/sounds.h b/src/sounds.h index 213bd944..eb459773 100644 --- a/src/sounds.h +++ b/src/sounds.h @@ -78,8 +78,16 @@ typedef struct sfxinfo_struct { // haleyjd 04/23/08: additional caching data unsigned int alen; // length of converted sound pointed to by data + + // [FG] parallel same-sound limit from DSDA-Doom + int parallel_tic; + int parallel_count; } sfxinfo_t; +extern boolean parallel_sfx; +extern int parallel_sfx_limit; +extern int parallel_sfx_window; + // // MusicInfo struct. //