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)
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)
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
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
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
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
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
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
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)
#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;
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));
}