Add mute window when unfocused option

Co-Authored-By: Tulpen <63363329+tulpenkiste@users.noreply.github.com>
This commit is contained in:
Agent X 2024-06-30 11:42:37 -04:00
parent fa2a182830
commit 099b97b934
20 changed files with 51 additions and 15 deletions

View file

@ -362,6 +362,7 @@ MUSIC_VOLUME = "Hlasitost písničky"
SFX_VOLUME = "Hlasitost zvuků" SFX_VOLUME = "Hlasitost zvuků"
ENV_VOLUME = "Hlasitost prostředí" ENV_VOLUME = "Hlasitost prostředí"
FADEOUT = "Ztišit daleké zvuky" FADEOUT = "Ztišit daleké zvuky"
MUTE_FOCUS_LOSS = "Ztlumit, když je okno na pozadí"
[LANGUAGE] [LANGUAGE]
LANGUAGE = "JAZYK" LANGUAGE = "JAZYK"

View file

@ -362,6 +362,7 @@ MUSIC_VOLUME = "Muziek Geluid"
SFX_VOLUME = "Sfx Geluid" SFX_VOLUME = "Sfx Geluid"
ENV_VOLUME = "Env Geluid" ENV_VOLUME = "Env Geluid"
FADEOUT = "Vervaagd Geluid in de Verte" FADEOUT = "Vervaagd Geluid in de Verte"
MUTE_FOCUS_LOSS = "Dempen wanneer venster niet meer scherp is"
[LANGUAGE] [LANGUAGE]
LANGUAGE = "TAAL" LANGUAGE = "TAAL"

View file

@ -362,6 +362,7 @@ MUSIC_VOLUME = "Music Volume"
SFX_VOLUME = "Sound Effects Volume" SFX_VOLUME = "Sound Effects Volume"
ENV_VOLUME = "Environment Volume" ENV_VOLUME = "Environment Volume"
FADEOUT = "Fade Out Distant Sounds" FADEOUT = "Fade Out Distant Sounds"
MUTE_FOCUS_LOSS = "Mute When Window Unfocused"
[LANGUAGE] [LANGUAGE]
LANGUAGE = "LANGUAGE" LANGUAGE = "LANGUAGE"

View file

@ -362,6 +362,7 @@ MUSIC_VOLUME = "Volume de la musique"
SFX_VOLUME = "Volume des effets sonores" SFX_VOLUME = "Volume des effets sonores"
ENV_VOLUME = "Volume de l'environnement" ENV_VOLUME = "Volume de l'environnement"
FADEOUT = "Disparition des sons distants" FADEOUT = "Disparition des sons distants"
MUTE_FOCUS_LOSS = "Muet en arrière plan"
[LANGUAGE] [LANGUAGE]
LANGUAGE = "LANGUE" LANGUAGE = "LANGUE"

View file

@ -362,6 +362,7 @@ MUSIC_VOLUME = "Musiklautstärke"
SFX_VOLUME = "Effektlautstärke" SFX_VOLUME = "Effektlautstärke"
ENV_VOLUME = "Umgebungslautstärke" ENV_VOLUME = "Umgebungslautstärke"
FADEOUT = "Ausblenden" FADEOUT = "Ausblenden"
MUTE_FOCUS_LOSS = "Stumm wenn nicht fokussiert"
[LANGUAGE] [LANGUAGE]
LANGUAGE = "SPRACHE" LANGUAGE = "SPRACHE"

View file

@ -360,6 +360,7 @@ MUSIC_VOLUME = "Musica"
SFX_VOLUME = "Effetti sonori" SFX_VOLUME = "Effetti sonori"
ENV_VOLUME = "Ambiente" ENV_VOLUME = "Ambiente"
FADEOUT = "Suoni lontani in dissolvenza" FADEOUT = "Suoni lontani in dissolvenza"
MUTE_FOCUS_LOSS = "Disattiva l'audio quando la finestra non è a fuoco"
[LANGUAGE] [LANGUAGE]
LANGUAGE = "LINGUA" LANGUAGE = "LINGUA"

View file

@ -362,6 +362,7 @@ MUSIC_VOLUME = "Głośność Muzyki"
SFX_VOLUME = "Głośność Efektów" SFX_VOLUME = "Głośność Efektów"
ENV_VOLUME = "Głośność Środowiska" ENV_VOLUME = "Głośność Środowiska"
FADEOUT = "Zanikanie Odległych Dźwięków" FADEOUT = "Zanikanie Odległych Dźwięków"
MUTE_FOCUS_LOSS = "Wycisz dźwięk, gdy okno traci fokus"
[LANGUAGE] [LANGUAGE]
LANGUAGE = "JĘZYK" LANGUAGE = "JĘZYK"

View file

@ -362,6 +362,7 @@ MUSIC_VOLUME = "Volume da música"
SFX_VOLUME = "Volume dos efeitos" SFX_VOLUME = "Volume dos efeitos"
ENV_VOLUME = "Volume ambiente" ENV_VOLUME = "Volume ambiente"
FADEOUT = "Desvanecer sons distantes" FADEOUT = "Desvanecer sons distantes"
MUTE_FOCUS_LOSS = "Silenciar quando a janela estiver desfocada"
[LANGUAGE] [LANGUAGE]
LANGUAGE = "IDIOMA" LANGUAGE = "IDIOMA"

View file

@ -361,6 +361,7 @@ MUSIC_VOLUME = "Громкость музыки"
SFX_VOLUME = "Громкость звуков" SFX_VOLUME = "Громкость звуков"
ENV_VOLUME = "Объёмное звучание" ENV_VOLUME = "Объёмное звучание"
FADEOUT = "Затухание звуков на расстоянии" FADEOUT = "Затухание звуков на расстоянии"
MUTE_FOCUS_LOSS = "Выключить звук когда окно не выбрано"
[LANGUAGE] [LANGUAGE]
LANGUAGE = "LANGUAGE" LANGUAGE = "LANGUAGE"

View file

@ -362,6 +362,7 @@ MUSIC_VOLUME = "Volumen de Música"
SFX_VOLUME = "Volumen de Efectos de Sonido" SFX_VOLUME = "Volumen de Efectos de Sonido"
ENV_VOLUME = "Volumen de Entorno" ENV_VOLUME = "Volumen de Entorno"
FADEOUT = "Disminuir sonidos lejanos" FADEOUT = "Disminuir sonidos lejanos"
MUTE_FOCUS_LOSS = "Muda sonido cuando ventana esta desenfocado"
[LANGUAGE] [LANGUAGE]
LANGUAGE = "IDIOMA" LANGUAGE = "IDIOMA"

View file

@ -71,7 +71,7 @@ ConfigWindow configWindow = {
.y = WAPI_WIN_CENTERPOS, .y = WAPI_WIN_CENTERPOS,
.w = DESIRED_SCREEN_WIDTH, .w = DESIRED_SCREEN_WIDTH,
.h = DESIRED_SCREEN_HEIGHT, .h = DESIRED_SCREEN_HEIGHT,
.vsync = 0, .vsync = 1,
.reset = false, .reset = false,
.fullscreen = false, .fullscreen = false,
.exiting_fullscreen = false, .exiting_fullscreen = false,
@ -82,7 +82,7 @@ ConfigWindow configWindow = {
// display settings // display settings
unsigned int configFiltering = 2; // 0 = Nearest, 1 = Bilinear, 2 = Trilinear unsigned int configFiltering = 2; // 0 = Nearest, 1 = Bilinear, 2 = Trilinear
bool configShowFPS = false; bool configShowFPS = false;
bool configUncappedFramerate = false; bool configUncappedFramerate = true;
unsigned int configFrameLimit = 60; unsigned int configFrameLimit = 60;
unsigned int configInterpolationMode = 1; unsigned int configInterpolationMode = 1;
unsigned int configDrawDistance = 4; unsigned int configDrawDistance = 4;
@ -92,6 +92,7 @@ unsigned int configMusicVolume = MAX_VOLUME;
unsigned int configSfxVolume = MAX_VOLUME; unsigned int configSfxVolume = MAX_VOLUME;
unsigned int configEnvVolume = MAX_VOLUME; unsigned int configEnvVolume = MAX_VOLUME;
bool configFadeoutDistantSounds = false; bool configFadeoutDistantSounds = false;
bool configMuteFocusLoss = false;
// control binds // control binds
unsigned int configKeyA[MAX_BINDS] = { 0x0026, 0x1000, 0x1103 }; unsigned int configKeyA[MAX_BINDS] = { 0x0026, 0x1000, 0x1103 };
unsigned int configKeyB[MAX_BINDS] = { 0x0033, 0x1001, 0x1101 }; unsigned int configKeyB[MAX_BINDS] = { 0x0033, 0x1001, 0x1101 };
@ -207,6 +208,7 @@ static const struct ConfigOption options[] = {
{.name = "sfx_volume", .type = CONFIG_TYPE_UINT, .uintValue = &configSfxVolume}, {.name = "sfx_volume", .type = CONFIG_TYPE_UINT, .uintValue = &configSfxVolume},
{.name = "env_volume", .type = CONFIG_TYPE_UINT, .uintValue = &configEnvVolume}, {.name = "env_volume", .type = CONFIG_TYPE_UINT, .uintValue = &configEnvVolume},
{.name = "fade_distant_sounds", .type = CONFIG_TYPE_BOOL, .boolValue = &configFadeoutDistantSounds}, {.name = "fade_distant_sounds", .type = CONFIG_TYPE_BOOL, .boolValue = &configFadeoutDistantSounds},
{.name = "mute_focus_loss", .type = CONFIG_TYPE_BOOL, .boolValue = &configMuteFocusLoss},
// control binds // control binds
{.name = "key_a", .type = CONFIG_TYPE_BIND, .uintValue = configKeyA}, {.name = "key_a", .type = CONFIG_TYPE_BIND, .uintValue = configKeyA},
{.name = "key_b", .type = CONFIG_TYPE_BIND, .uintValue = configKeyB}, {.name = "key_b", .type = CONFIG_TYPE_BIND, .uintValue = configKeyB},

View file

@ -43,6 +43,7 @@ extern unsigned int configMusicVolume;
extern unsigned int configSfxVolume; extern unsigned int configSfxVolume;
extern unsigned int configEnvVolume; extern unsigned int configEnvVolume;
extern bool configFadeoutDistantSounds; extern bool configFadeoutDistantSounds;
extern bool configMuteFocusLoss;
// control binds // control binds
extern unsigned int configKeyA[MAX_BINDS]; extern unsigned int configKeyA[MAX_BINDS];
extern unsigned int configKeyB[MAX_BINDS]; extern unsigned int configKeyB[MAX_BINDS];

View file

@ -173,7 +173,7 @@ static void controller_sdl_read(OSContPad *pad) {
return; return;
} }
if ((newcam_mouse == 1 || gFirstPersonCamera.enabled || gDjuiHudLockMouse) && gMenuMode == -1 && !gDjuiInMainMenu && !gDjuiChatBoxFocus && !gDjuiConsoleFocus) { if ((newcam_mouse == 1 || gFirstPersonCamera.enabled || gDjuiHudLockMouse) && gMenuMode == -1 && !gDjuiInMainMenu && !gDjuiChatBoxFocus && !gDjuiConsoleFocus && WAPI.has_focus()) {
SDL_SetRelativeMouseMode(SDL_TRUE); SDL_SetRelativeMouseMode(SDL_TRUE);
} else { } else {
SDL_SetRelativeMouseMode(SDL_FALSE); SDL_SetRelativeMouseMode(SDL_FALSE);

View file

@ -18,6 +18,7 @@ void djui_panel_sound_create(struct DjuiBase* caller) {
djui_slider_create(body, DLANG(SOUND, SFX_VOLUME), &configSfxVolume, 0, 127, djui_panel_sound_value_change); djui_slider_create(body, DLANG(SOUND, SFX_VOLUME), &configSfxVolume, 0, 127, djui_panel_sound_value_change);
djui_slider_create(body, DLANG(SOUND, ENV_VOLUME), &configEnvVolume, 0, 127, djui_panel_sound_value_change); djui_slider_create(body, DLANG(SOUND, ENV_VOLUME), &configEnvVolume, 0, 127, djui_panel_sound_value_change);
djui_checkbox_create(body, DLANG(SOUND, FADEOUT), &configFadeoutDistantSounds, NULL); djui_checkbox_create(body, DLANG(SOUND, FADEOUT), &configFadeoutDistantSounds, NULL);
djui_checkbox_create(body, DLANG(SOUND, MUTE_FOCUS_LOSS), &configMuteFocusLoss, NULL);
djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back); djui_button_create(body, DLANG(MENU, BACK), DJUI_BUTTON_STYLE_BACK, djui_panel_menu_back);
} }

View file

@ -80,14 +80,14 @@ static void gfx_dummy_wm_delay(u32 ms) {
sleep_ms(ms); sleep_ms(ms);
} }
static int gfx_dummy_get_max_msaa(void) { static int gfx_dummy_wm_get_max_msaa(void) {
return 0; return 0;
} }
static void gfx_dummy_set_window_title(UNUSED const char* title) { static void gfx_dummy_wm_set_window_title(UNUSED const char* title) {
} }
static void gfx_dummy_reset_window_title(void) { static void gfx_dummy_wm_reset_window_title(void) {
} }
static void gfx_dummy_wm_swap_buffers_begin(void) { static void gfx_dummy_wm_swap_buffers_begin(void) {
@ -119,6 +119,10 @@ static void gfx_dummy_wm_set_clipboard_text(UNUSED char* text) {
static void gfx_dummy_wm_set_cursor_visible(UNUSED bool visible) { static void gfx_dummy_wm_set_cursor_visible(UNUSED bool visible) {
} }
static bool gfx_dummy_wm_has_focus(void) {
return true;
}
static bool gfx_dummy_renderer_z_is_from_0_to_1(void) { static bool gfx_dummy_renderer_z_is_from_0_to_1(void) {
return false; return false;
} }
@ -212,9 +216,10 @@ struct GfxWindowManagerAPI gfx_dummy_wm_api = {
gfx_dummy_wm_set_clipboard_text, gfx_dummy_wm_set_clipboard_text,
gfx_dummy_wm_set_cursor_visible, gfx_dummy_wm_set_cursor_visible,
gfx_dummy_wm_delay, gfx_dummy_wm_delay,
gfx_dummy_get_max_msaa, gfx_dummy_wm_get_max_msaa,
gfx_dummy_set_window_title, gfx_dummy_wm_set_window_title,
gfx_dummy_reset_window_title gfx_dummy_wm_reset_window_title,
gfx_dummy_wm_has_focus
}; };
struct GfxRenderingAPI gfx_dummy_renderer_api = { struct GfxRenderingAPI gfx_dummy_renderer_api = {

View file

@ -704,6 +704,10 @@ static void gfx_dxgi_reset_window_title(void) {
SetWindowTextA(dxgi.h_wnd, TITLE); SetWindowTextA(dxgi.h_wnd, TITLE);
} }
static bool gfx_dxgi_has_focus(void) {
return GetFocus() == dxgi.h_wnd;
}
HWND gfx_dxgi_get_h_wnd(void) { HWND gfx_dxgi_get_h_wnd(void) {
return dxgi.h_wnd; return dxgi.h_wnd;
} }
@ -775,7 +779,8 @@ struct GfxWindowManagerAPI gfx_dxgi = {
gfx_dxgi_delay, gfx_dxgi_delay,
gfx_dxgi_get_max_msaa, gfx_dxgi_get_max_msaa,
gfx_dxgi_set_window_title, gfx_dxgi_set_window_title,
gfx_dxgi_reset_window_title gfx_dxgi_reset_window_title,
gfx_dxgi_has_focus
}; };
#endif #endif

View file

@ -205,6 +205,10 @@ static void gfx_sdl_shutdown(void) {
SDL_Quit(); SDL_Quit();
} }
static bool gfx_sdl_has_focus(void) {
return SDL_GetAppState() & SDL_APPINPUTFOCUS;
}
static void gfx_sdl_start_text_input(void) { return; } static void gfx_sdl_start_text_input(void) { return; }
static void gfx_sdl_stop_text_input(void) { return; } static void gfx_sdl_stop_text_input(void) { return; }
static char* gfx_sdl_get_clipboard_text(void) { return NULL; } static char* gfx_sdl_get_clipboard_text(void) { return NULL; }
@ -230,7 +234,8 @@ struct GfxWindowManagerAPI gfx_sdl = {
gfx_sdl_delay, gfx_sdl_delay,
gfx_sdl_get_max_msaa, gfx_sdl_get_max_msaa,
gfx_sdl_set_window_title, gfx_sdl_set_window_title,
gfx_sdl_reset_window_title gfx_sdl_reset_window_title,
gfx_sdl_has_focus
}; };
#endif // BACKEND_WM #endif // BACKEND_WM

View file

@ -298,6 +298,10 @@ static void gfx_sdl_shutdown(void) {
} }
} }
static bool gfx_sdl_has_focus(void) {
return (SDL_GetWindowFlags(wnd) & SDL_WINDOW_INPUT_FOCUS);
}
static void gfx_sdl_start_text_input(void) { SDL_StartTextInput(); } static void gfx_sdl_start_text_input(void) { SDL_StartTextInput(); }
static void gfx_sdl_stop_text_input(void) { SDL_StopTextInput(); } static void gfx_sdl_stop_text_input(void) { SDL_StopTextInput(); }
static char* gfx_sdl_get_clipboard_text(void) { return SDL_GetClipboardText(); } static char* gfx_sdl_get_clipboard_text(void) { return SDL_GetClipboardText(); }
@ -323,7 +327,8 @@ struct GfxWindowManagerAPI gfx_sdl = {
gfx_sdl_delay, gfx_sdl_delay,
gfx_sdl_get_max_msaa, gfx_sdl_get_max_msaa,
gfx_sdl_set_window_title, gfx_sdl_set_window_title,
gfx_sdl_reset_window_title gfx_sdl_reset_window_title,
gfx_sdl_has_focus
}; };
#endif // BACKEND_WM #endif // BACKEND_WM

View file

@ -29,6 +29,7 @@ struct GfxWindowManagerAPI {
int (*get_max_msaa)(void); int (*get_max_msaa)(void);
void (*set_window_title)(const char* title); void (*set_window_title)(const char* title);
void (*reset_window_title)(void); void (*reset_window_title)(void);
bool (*has_focus)(void);
}; };
#endif #endif

View file

@ -218,10 +218,11 @@ void produce_interpolation_frames_and_delay(void) {
} }
inline static void buffer_audio(void) { inline static void buffer_audio(void) {
bool shouldMute = configMuteFocusLoss && !WAPI.has_focus();
const f32 masterMod = (f32)configMasterVolume / 127.0f * (f32)gLuaVolumeMaster / 127.0f; const f32 masterMod = (f32)configMasterVolume / 127.0f * (f32)gLuaVolumeMaster / 127.0f;
set_sequence_player_volume(SEQ_PLAYER_LEVEL, (f32)configMusicVolume / 127.0f * (f32)gLuaVolumeLevel / 127.0f * masterMod); set_sequence_player_volume(SEQ_PLAYER_LEVEL, shouldMute ? 0 : (f32)configMusicVolume / 127.0f * (f32)gLuaVolumeLevel / 127.0f * masterMod);
set_sequence_player_volume(SEQ_PLAYER_SFX, (f32)configSfxVolume / 127.0f * (f32)gLuaVolumeSfx / 127.0f * masterMod); set_sequence_player_volume(SEQ_PLAYER_SFX, shouldMute ? 0 : (f32)configSfxVolume / 127.0f * (f32)gLuaVolumeSfx / 127.0f * masterMod);
set_sequence_player_volume(SEQ_PLAYER_ENV, (f32)configEnvVolume / 127.0f * (f32)gLuaVolumeEnv / 127.0f * masterMod); set_sequence_player_volume(SEQ_PLAYER_ENV, shouldMute ? 0 : (f32)configEnvVolume / 127.0f * (f32)gLuaVolumeEnv / 127.0f * masterMod);
int samplesLeft = audio_api->buffered(); int samplesLeft = audio_api->buffered();
u32 numAudioSamples = samplesLeft < audio_api->get_desired_buffered() ? SAMPLES_HIGH : SAMPLES_LOW; u32 numAudioSamples = samplesLeft < audio_api->get_desired_buffered() ? SAMPLES_HIGH : SAMPLES_LOW;