summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mixer.c13
-rw-r--r--mixer.h3
-rw-r--r--mplayer.c1
3 files changed, 17 insertions, 0 deletions
diff --git a/mixer.c b/mixer.c
index ba58ed8a85..4c196e4bdf 100644
--- a/mixer.c
+++ b/mixer.c
@@ -35,6 +35,16 @@ char *mixer_channel = NULL;
int soft_vol = 0;
float soft_vol_max = 110.0;
+// Called after the audio filter chain is built or rebuilt.
+void mixer_reinit(mixer_t *mixer)
+{
+ if (mixer->restore_softvol) {
+ int muted = mixer->muted;
+ mixer_setvolume(mixer, mixer->softvol_l, mixer->softvol_r);
+ mixer->muted = muted;
+ }
+}
+
void mixer_getvolume(mixer_t *mixer, float *l, float *r)
{
ao_control_vol_t vol;
@@ -76,6 +86,9 @@ void mixer_setvolume(mixer_t *mixer, float l, float r)
// af_volume uses values in dB
float db_vals[AF_NCH];
int i;
+ mixer->softvol_l = l;
+ mixer->softvol_r = r;
+ mixer->restore_softvol = 1;
db_vals[0] = (l / 100.0) * (soft_vol_max / 100.0);
db_vals[1] = (r / 100.0) * (soft_vol_max / 100.0);
for (i = 2; i < AF_NCH; i++)
diff --git a/mixer.h b/mixer.h
index 23c7f3ade0..473933ecbe 100644
--- a/mixer.h
+++ b/mixer.h
@@ -33,8 +33,11 @@ typedef struct mixer_s {
int volstep;
int muted;
float last_l, last_r;
+ float softvol_l, softvol_r;
+ int restore_softvol;
} mixer_t;
+void mixer_reinit(mixer_t *mixer);
void mixer_getvolume(mixer_t *mixer, float *l, float *r);
void mixer_setvolume(mixer_t *mixer, float l, float r);
void mixer_incvolume(mixer_t *mixer);
diff --git a/mplayer.c b/mplayer.c
index d79d45f057..6b57c695e6 100644
--- a/mplayer.c
+++ b/mplayer.c
@@ -1448,6 +1448,7 @@ static int build_afilter_chain(struct MPContext *mpctx)
result = init_audio_filters(sh_audio, new_srate,
&ao->samplerate, &ao->channels, &ao->format);
mpctx->mixer.afilter = sh_audio->afilter;
+ mixer_reinit(&mpctx->mixer);
return result;
}