summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-05-06 20:09:36 +0200
committerwm4 <wm4@nowhere>2014-05-24 16:32:00 +0200
commite6d4ec62ae25a42b99c51643f705236597e5f962 (patch)
tree90bb92004d124733c5c26cec47e571e0a1a8f2dd
parente7e2a6c8f77e4e6dce92652668b849dc9fc933e2 (diff)
downloadmpv-e6d4ec62ae25a42b99c51643f705236597e5f962.tar.bz2
mpv-e6d4ec62ae25a42b99c51643f705236597e5f962.tar.xz
mixer: don't restore volume with different --softvol-max settings
Changing --softvol-max and then resuming would change the volume level on resume to something different than the original volume. This is because the user volume setting is always between 0-100, and 100 corresponds to --softvol-max gain. Avoid that changing -softvol-max and resuming an older file could lead to a too loud volume level by refusing to restore if --softvol-max changed.
-rw-r--r--audio/mixer.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/audio/mixer.c b/audio/mixer.c
index 162d9d5a0a..8ff9504fac 100644
--- a/audio/mixer.c
+++ b/audio/mixer.c
@@ -18,6 +18,7 @@
#include <string.h>
#include <stdio.h>
+#include <math.h>
#include <libavutil/common.h>
@@ -245,8 +246,9 @@ char *mixer_get_volume_restore_data(struct mixer *mixer)
{
if (!mixer->driver[0])
return NULL;
- return talloc_asprintf(NULL, "%s:%f:%f:%d", mixer->driver, mixer->vol_l,
- mixer->vol_r, mixer->muted_by_us);
+ return talloc_asprintf(NULL, "%s:%f:%f:%d:%f", mixer->driver, mixer->vol_l,
+ mixer->vol_r, mixer->muted_by_us,
+ mixer->opts->softvol_max);
}
static void probe_softvol(struct mixer *mixer)
@@ -307,19 +309,20 @@ static void restore_volume(struct mixer *mixer)
force_mute = opts->mixer_init_mute;
// Set parameters from playback resume.
- char *restore_data = mixer->opts->mixer_restore_volume_data;
- if (restore && restore_data && restore_data[0]) {
+ char *data = mixer->opts->mixer_restore_volume_data;
+ if (restore && data && data[0]) {
char drv[40];
- float v_l, v_r;
+ float v_l, v_r, s;
int m;
- if (sscanf(restore_data, "%39[^:]:%f:%f:%d", drv, &v_l, &v_r, &m) == 4) {
- if (strcmp(mixer->driver, drv) == 0) {
+ if (sscanf(data, "%39[^:]:%f:%f:%d:%f", drv, &v_l, &v_r, &m, &s) == 5) {
+ float diff = fabs(mixer->opts->softvol_max - s);
+ if (strcmp(mixer->driver, drv) == 0 && diff < 0.01) {
force_vol_l = v_l;
force_vol_r = v_r;
force_mute = !!m;
}
}
- talloc_free(restore_data);
+ talloc_free(mixer->opts->mixer_restore_volume_data);
mixer->opts->mixer_restore_volume_data = NULL;
}