From: Rudolf Polzer Date: Sat, 10 Mar 2012 17:22:21 +0000 (+0100) Subject: fix a VERY stupid sound menu bug: use correct scale of decibels. -20dB is 0.1, not... X-Git-Tag: xonotic-v0.7.0~366 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=78a1769930e8b3d121cbdef5e52bda2c4ae03de4;p=xonotic%2Fxonotic-data.pk3dir.git fix a VERY stupid sound menu bug: use correct scale of decibels. -20dB is 0.1, not -10dB! This is because the sound level cvars in DP indicate voltage level, not sound pressure (which behaves like power, i.e. voltage * current) --- diff --git a/qcsrc/menu/xonotic/dialog_settings_audio.c b/qcsrc/menu/xonotic/dialog_settings_audio.c index 8e8049532..1f1ee385b 100644 --- a/qcsrc/menu/xonotic/dialog_settings_audio.c +++ b/qcsrc/menu/xonotic/dialog_settings_audio.c @@ -23,14 +23,14 @@ void XonoticAudioSettingsTab_fill(entity me) entity e, s, sl; me.TR(me); - s = makeXonoticDecibelsSlider(-20, 0, 0.5, "mastervolume"); + s = makeXonoticDecibelsSlider(-40, 0, 1, "mastervolume"); me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Master:"))); if(s.value != e.savedValue) e.savedValue = 0; // default me.TD(me, 1, 2, s); me.TR(me); me.TDempty(me, 0.2); - s = makeXonoticDecibelsSlider(-20, 0, 0.5, "bgmvolume"); + s = makeXonoticDecibelsSlider(-40, 0, 1, "bgmvolume"); makeMulti(s, "snd_channel8volume"); me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Music:"))); if(s.value != e.savedValue) @@ -40,7 +40,7 @@ void XonoticAudioSettingsTab_fill(entity me) setDependentStringNotEqual(s, "mastervolume", "0"); me.TR(me); me.TDempty(me, 0.2); - s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_staticvolume"); + s = makeXonoticDecibelsSlider(-40, 0, 1, "snd_staticvolume"); makeMulti(s, "snd_channel9volume"); me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, ZCTX(_("VOL^Ambient:")))); if(s.value != e.savedValue) @@ -50,7 +50,7 @@ void XonoticAudioSettingsTab_fill(entity me) setDependentStringNotEqual(s, "mastervolume", "0"); me.TR(me); me.TDempty(me, 0.2); - s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel0volume"); + s = makeXonoticDecibelsSlider(-40, 0, 1, "snd_channel0volume"); me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Info:"))); if(s.value != e.savedValue) e.savedValue = 0; // default @@ -59,7 +59,7 @@ void XonoticAudioSettingsTab_fill(entity me) setDependentStringNotEqual(s, "mastervolume", "0"); me.TR(me); me.TDempty(me, 0.2); - s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel3volume"); + s = makeXonoticDecibelsSlider(-40, 0, 1, "snd_channel3volume"); me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Items:"))); if(s.value != e.savedValue) e.savedValue = 0; // default @@ -68,7 +68,7 @@ void XonoticAudioSettingsTab_fill(entity me) setDependentStringNotEqual(s, "mastervolume", "0"); me.TR(me); me.TDempty(me, 0.2); - s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel6volume"); + s = makeXonoticDecibelsSlider(-40, 0, 1, "snd_channel6volume"); me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Pain:"))); if(s.value != e.savedValue) e.savedValue = 0; // default @@ -77,7 +77,7 @@ void XonoticAudioSettingsTab_fill(entity me) setDependentStringNotEqual(s, "mastervolume", "0"); me.TR(me); me.TDempty(me, 0.2); - s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel7volume"); + s = makeXonoticDecibelsSlider(-40, 0, 1, "snd_channel7volume"); me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Player:"))); if(s.value != e.savedValue) e.savedValue = 0; // default @@ -86,7 +86,7 @@ void XonoticAudioSettingsTab_fill(entity me) setDependentStringNotEqual(s, "mastervolume", "0"); me.TR(me); me.TDempty(me, 0.2); - s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel4volume"); + s = makeXonoticDecibelsSlider(-40, 0, 1, "snd_channel4volume"); me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Shots:"))); if(s.value != e.savedValue) e.savedValue = 0; // default @@ -95,7 +95,7 @@ void XonoticAudioSettingsTab_fill(entity me) setDependentStringNotEqual(s, "mastervolume", "0"); me.TR(me); me.TDempty(me, 0.2); - s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel2volume"); + s = makeXonoticDecibelsSlider(-40, 0, 1, "snd_channel2volume"); me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Voice:"))); if(s.value != e.savedValue) e.savedValue = 0; // default @@ -104,7 +104,7 @@ void XonoticAudioSettingsTab_fill(entity me) setDependentStringNotEqual(s, "mastervolume", "0"); me.TR(me); me.TDempty(me, 0.2); - s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel1volume"); + s = makeXonoticDecibelsSlider(-40, 0, 1, "snd_channel1volume"); makeMulti(s, "snd_channel5volume"); // @!#%'n Tuba me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Weapons:"))); if(s.value != e.savedValue) diff --git a/qcsrc/menu/xonotic/slider_decibels.c b/qcsrc/menu/xonotic/slider_decibels.c index 24edb4cb9..729bec006 100644 --- a/qcsrc/menu/xonotic/slider_decibels.c +++ b/qcsrc/menu/xonotic/slider_decibels.c @@ -9,6 +9,16 @@ entity makeXonoticDecibelsSlider(float, float, float, string); #ifdef IMPLEMENTATION +float toDecibelOfSquare(float f) +{ + return 20.0 * log10(f); +} + +float fromDecibelOfSquare(float f) +{ + return pow(10, f / 20.0); +} + entity makeXonoticDecibelsSlider(float theValueMin, float theValueMax, float theValueStep, string theCvar) { entity me; @@ -24,32 +34,34 @@ void XonoticDecibelsSlider_loadCvars(entity me) return; v = cvar(me.cvarName); - if(v >= 0.98) - Slider_setValue( me, 0 ); - else if(v < 0.0005) - Slider_setValue( me, -1000000 ); + + // snapping + if(v > fromDecibelOfSquare(me.valueMax - 0.5 * me.valueStep)) + Slider_setValue(me, me.valueMax); + else if(v < fromDecibelOfSquare(me.valueMin - 0.5 * me.valueStep)) + Slider_setValue(me, -1000000); // virtually infinite else - Slider_setValue( me, 0.1 * floor(0.5 + 10.0 * log10(cvar(me.cvarName)) * 10) ); + Slider_setValue(me, me.valueStep * floor(0.5 + toDecibelOfSquare(v) / me.valueStep) ); } void XonoticDecibelsSlider_saveCvars(entity me) { if not(me.cvarName) return; - if(me.value >= -0.1) - cvar_set(me.cvarName, "1"); - if(me.value < -33) + if(me.value > me.valueMax - 0.5 * me.valueStep) + cvar_set(me.cvarName, ftos(fromDecibelOfSquare(me.valueMax))); + else if(me.value < me.valueMin - 0.5 * me.valueStep) cvar_set(me.cvarName, "0"); else - cvar_set(me.cvarName, ftos(pow(10, me.value / 10))); + cvar_set(me.cvarName, ftos(fromDecibelOfSquare(me.value))); } string XonoticDecibelsSlider_valueToText(entity me, float v) { - if(v < -33) - return CTX(_("VOL^OFF")); - else if(v >= -0.1) + if(v > me.valueMax - 0.5 * me.valueStep) return CTX(_("VOL^MAX")); + else if(v < me.valueMin - 0.5 * me.valueStep) + return CTX(_("VOL^OFF")); return sprintf(_("%s dB"), SUPER(XonoticDecibelsSlider).valueToText(me, v)); }