From e6d4ec62ae25a42b99c51643f705236597e5f962 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 6 May 2014 20:09:36 +0200 Subject: 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. --- audio/mixer.c | 19 +++++++++++-------- 1 file 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 #include +#include #include @@ -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; } -- cgit v1.2.3