summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-09-19 14:31:55 +0200
committerwm4 <wm4@nowhere>2013-09-19 14:31:55 +0200
commit4ba52a9e821486d9d9b076a5187583af144b8cec (patch)
treed96f2d08e929c7a8a8e41fe8eeb009b637a3dcd0
parent296531ad0050fbc38fb1cf7823f6e22f97d502b1 (diff)
downloadmpv-4ba52a9e821486d9d9b076a5187583af144b8cec.tar.bz2
mpv-4ba52a9e821486d9d9b076a5187583af144b8cec.tar.xz
mixer, af_volume: use linear values instead of dB
Softvol always used a linear multiplier for volume control. This was converted to dB, and then back to linear in af_volume. Remove this non- sense. We still try to keep the command line argument to af_volume in dB, though.
-rw-r--r--audio/filter/af_volume.c13
-rw-r--r--audio/mixer.c29
2 files changed, 21 insertions, 21 deletions
diff --git a/audio/filter/af_volume.c b/audio/filter/af_volume.c
index 82c31eaa12..a766b97ec6 100644
--- a/audio/filter/af_volume.c
+++ b/audio/filter/af_volume.c
@@ -81,17 +81,22 @@ static int control(struct af_instance* af, int cmd, void* arg)
}
return af_test_output(af,(struct mp_audio*)arg);
case AF_CONTROL_COMMAND_LINE:{
- float v=0.0;
+ float v=1000.0;
float vol[AF_NCH];
int i;
sscanf((char*)arg,"%f:%i:%i", &v, &s->soft, &s->fast);
- for(i=0;i<AF_NCH;i++) vol[i]=v;
+ float dest = 0.0;
+ if (v < 1000)
+ af_from_dB(1,&v,&dest,20.0,-200.0,60.0);
+ for(i=0;i<AF_NCH;i++) vol[i]=dest;
return control(af,AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_SET, vol);
}
case AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_SET:
- return af_from_dB(AF_NCH,(float*)arg,s->level,20.0,-200.0,60.0);
+ memcpy(s->level, arg, sizeof(float) * AF_NCH);
+ return AF_OK;
case AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_GET:
- return af_to_dB(AF_NCH,s->level,(float*)arg,20.0);
+ memcpy(arg, s->level, sizeof(float) * AF_NCH);
+ return AF_OK;
case AF_CONTROL_PRE_DESTROY:{
float m = 0.0;
int i;
diff --git a/audio/mixer.c b/audio/mixer.c
index 6b68ee2e58..97e9417fc1 100644
--- a/audio/mixer.c
+++ b/audio/mixer.c
@@ -44,14 +44,12 @@ static void checkvolume(struct mixer *mixer)
mixer->softvol = SOFTVOL_YES;
if (!mixer->af)
return;
- float db_vals[AF_NCH];
+ float vals[AF_NCH];
if (!af_control_any_rev(mixer->af,
- AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_GET, db_vals))
- db_vals[0] = db_vals[1] = 1.0;
- else
- af_from_dB(2, db_vals, db_vals, 20.0, -200.0, 60.0);
- vol.left = (db_vals[0] / (mixer->opts->softvol_max / 100.0)) * 100.0;
- vol.right = (db_vals[1] / (mixer->opts->softvol_max / 100.0)) * 100.0;
+ AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_GET, vals))
+ vals[0] = vals[1] = 1.0;
+ vol.left = (vals[0] / (mixer->opts->softvol_max / 100.0)) * 100.0;
+ vol.right = (vals[1] / (mixer->opts->softvol_max / 100.0)) * 100.0;
}
float l = mixer->vol_l;
float r = mixer->vol_r;
@@ -99,24 +97,21 @@ static void setvolume_internal(mixer_t *mixer, float l, float r)
mixer->restore_volume = "softvol";
if (!mixer->af)
return;
- // af_volume uses values in dB
- float db_vals[AF_NCH];
- int i;
- db_vals[0] = (l / 100.0) * (mixer->opts->softvol_max / 100.0);
- db_vals[1] = (r / 100.0) * (mixer->opts->softvol_max / 100.0);
- for (i = 2; i < AF_NCH; i++)
- db_vals[i] = ((l + r) / 100.0) * (mixer->opts->softvol_max / 100.0) / 2.0;
- af_to_dB(AF_NCH, db_vals, db_vals, 20.0);
+ float vals[AF_NCH];
+ vals[0] = l / 100.0 * mixer->opts->softvol_max / 100.0;
+ vals[1] = r / 100.0 * mixer->opts->softvol_max / 100.0;
+ for (int i = 2; i < AF_NCH; i++)
+ vals[i] = (vals[0] + vals[1]) / 2.0;
if (!af_control_any_rev(mixer->af,
AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_SET,
- db_vals))
+ vals))
{
mp_tmsg(MSGT_GLOBAL, mixer->softvol ? MSGL_V : MSGL_WARN,
"[Mixer] No hardware mixing, inserting volume filter.\n");
if (!(af_add(mixer->af, "volume", NULL)
&& af_control_any_rev(mixer->af,
AF_CONTROL_VOLUME_LEVEL | AF_CONTROL_SET,
- db_vals)))
+ vals)))
mp_tmsg(MSGT_GLOBAL, MSGL_ERR,
"[Mixer] No volume control available.\n");
}