diff --git a/CVARS.rst b/CVARS.rst index 98ba0431..629600a4 100644 --- a/CVARS.rst +++ b/CVARS.rst @@ -284,6 +284,22 @@ Client-Side quality video drivers. Small negative values (eg "-0.2") can help with distant textures appearing blurry. +.. + +:Name: s_muteWhenMinimized +:Values: "0", "1" +:Default: "1" +:Description: + Mute all sounds when client window is minimized. + +.. + +:Name: s_muteWhenUnfocused +:Values: "0", "1" +:Default: "1" +:Description: + Mute all sounds when client window is unfocused. + ----------- Server-Side ----------- diff --git a/src/client/snd_dma.cpp b/src/client/snd_dma.cpp index d059de05..f0462375 100644 --- a/src/client/snd_dma.cpp +++ b/src/client/snd_dma.cpp @@ -109,6 +109,7 @@ int numLoopChannels; static qboolean s_soundStarted; qboolean s_soundMuted; +static int s_lastMuteModCount; dma_t dma; @@ -139,7 +140,8 @@ cvar_t *s_musicMult; cvar_t *s_separation; cvar_t *s_doppler; cvar_t *s_s_language; - +cvar_t *s_muteWhenMinimized; +cvar_t *s_muteWhenUnfocused; static loopSound_t loopSounds[MAX_GENTITIES]; static channel_t *freelist = NULL; @@ -303,6 +305,10 @@ void S_Init( void ) s_testsound = Cvar_Get ("s_testsound", "0", CVAR_CHEAT); s_s_language = Cvar_Get("s_language", "english", CVAR_ARCHIVE | CVAR_NORESTART | CVAR_GLOBAL); + s_muteWhenUnfocused = Cvar_Get("s_muteWhenUnfocused", "1", CVAR_ARCHIVE | CVAR_GLOBAL); + s_muteWhenMinimized = Cvar_Get("s_muteWhenMinimized", "1", CVAR_ARCHIVE | CVAR_GLOBAL); + + s_lastMuteModCount = -1; MP3_InitCvars(); @@ -1562,6 +1568,22 @@ void S_Activate(qboolean activate) } } +void S_CheckMuteWhenMinimized(void) +{ + if (com_minimized->modificationCount + + com_unfocused->modificationCount != s_lastMuteModCount) + { + int disable = + (com_minimized->integer && s_muteWhenMinimized->integer) || + (com_unfocused->integer && s_muteWhenUnfocused->integer); + + S_Activate((qboolean)!disable); + + s_lastMuteModCount = com_minimized->modificationCount + + com_unfocused->modificationCount; + } +} + /* ============================================================== @@ -2231,6 +2253,8 @@ void S_Update( void ) { return; } + S_CheckMuteWhenMinimized(); + #ifdef USE_OPENAL if (s_UseOpenAL) { diff --git a/src/sdl/sdl_input.cpp b/src/sdl/sdl_input.cpp index b2f83093..326e203b 100644 --- a/src/sdl/sdl_input.cpp +++ b/src/sdl/sdl_input.cpp @@ -2,7 +2,6 @@ #include "../qcommon/qcommon.h" #include "../qcommon/q_shared.h" #include "../client/client.h" -#include "../client/snd_public.h" #include "../sys/sys_local.h" static cvar_t *in_keyboardDebug = NULL; @@ -854,19 +853,8 @@ static void IN_ProcessEvents( int eventTime ) case SDL_WINDOWEVENT_SHOWN: case SDL_WINDOWEVENT_RESTORED: case SDL_WINDOWEVENT_MAXIMIZED: Cvar_SetValue( "com_minimized", 0 ); break; - case SDL_WINDOWEVENT_FOCUS_LOST: - { - Cvar_SetValue( "com_unfocused", 1 ); - S_Activate(qfalse); - break; - } - - case SDL_WINDOWEVENT_FOCUS_GAINED: - { - Cvar_SetValue( "com_unfocused", 0 ); - S_Activate(qtrue); - break; - } + case SDL_WINDOWEVENT_FOCUS_LOST: Cvar_SetValue( "com_unfocused", 1 ); break; + case SDL_WINDOWEVENT_FOCUS_GAINED: Cvar_SetValue( "com_unfocused", 0 ); break; } break; diff --git a/src/sdl/sdl_sound.cpp b/src/sdl/sdl_sound.cpp index a81eed21..e4974e69 100644 --- a/src/sdl/sdl_sound.cpp +++ b/src/sdl/sdl_sound.cpp @@ -310,5 +310,9 @@ SNDDMA_BeginPainting */ void SNDDMA_Activate(qboolean activate) { - SDL_PauseAudioDevice(dev, !activate); + qboolean isActive = (qboolean)(SDL_GetAudioDeviceStatus(dev) == SDL_AUDIO_PLAYING); + + if (isActive != activate) { + SDL_PauseAudioDevice(dev, !activate); + } }