summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2020-09-12 00:09:20 +0200
committerwm4 <wm4@nowhere>2020-09-12 00:13:24 +0200
commiteed8b6d47bf9c2437852cd99f53db18b3dff9ad7 (patch)
treee080057da3da8ca9861db12891f549b23dceb99a
parent98f9d50b306b6bd11a256d97a33a79acd7d160ec (diff)
downloadmpv-eed8b6d47bf9c2437852cd99f53db18b3dff9ad7.tar.bz2
mpv-eed8b6d47bf9c2437852cd99f53db18b3dff9ad7.tar.xz
player: fix inconsistent AO pause state in certain situations
Pause can be changed during a file change, such as with for example --reset-on-next-file=pause, or in hooks, or by being quick, and in this case the AO's pause state was not updated correctly. mpctx->ao_chain is only set if playback is fully initialized, while the AO itself in mpctx->ao can be reused across files. Fix this by always running set_pause_state() if the pause option is changed. Could cause new bugs since running this used to be explicitly avoided outside of the loaded state. The handling of time_frame is potentially worrisome. Regression due to recent audio refactor; before that, the AO didn't have a separate/persistent pause state. Fixes: #8079
-rw-r--r--player/command.c9
-rw-r--r--player/playloop.c2
2 files changed, 3 insertions, 8 deletions
diff --git a/player/command.c b/player/command.c
index 723996d9be..572d0874d0 100644
--- a/player/command.c
+++ b/player/command.c
@@ -6493,13 +6493,8 @@ void mp_option_change_callback(void *ctx, struct m_config_option *co, int flags,
}
}
- if (opt_ptr == &opts->pause) {
- if (mpctx->playback_initialized) {
- int val = opts->pause;
- opts->pause = !val; // temporary hack to force update
- set_pause_state(mpctx, val);
- }
- }
+ if (opt_ptr == &opts->pause)
+ set_pause_state(mpctx, opts->pause);
if (opt_ptr == &opts->audio_delay) {
if (mpctx->ao_chain) {
diff --git a/player/playloop.c b/player/playloop.c
index d36eed2090..7b99a3b4cd 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -159,7 +159,7 @@ void set_pause_state(struct MPContext *mpctx, bool user_pause)
if (internal_paused != mpctx->paused) {
mpctx->paused = internal_paused;
- if (mpctx->ao && mpctx->ao_chain)
+ if (mpctx->ao)
ao_set_paused(mpctx->ao, internal_paused);
if (mpctx->video_out)