diff options
author | wm4 <wm4@nowhere> | 2014-05-06 20:09:36 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2014-05-24 16:32:00 +0200 |
commit | e6d4ec62ae25a42b99c51643f705236597e5f962 (patch) | |
tree | 90bb92004d124733c5c26cec47e571e0a1a8f2dd | |
parent | e7e2a6c8f77e4e6dce92652668b849dc9fc933e2 (diff) | |
download | mpv-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.c | 19 |
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; } |