diff options
author | wm4 <wm4@nowhere> | 2020-09-12 00:09:20 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2020-09-12 00:13:24 +0200 |
commit | eed8b6d47bf9c2437852cd99f53db18b3dff9ad7 (patch) | |
tree | e080057da3da8ca9861db12891f549b23dceb99a | |
parent | 98f9d50b306b6bd11a256d97a33a79acd7d160ec (diff) | |
download | mpv-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.c | 9 | ||||
-rw-r--r-- | player/playloop.c | 2 |
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) |