From eed8b6d47bf9c2437852cd99f53db18b3dff9ad7 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 12 Sep 2020 00:09:20 +0200 Subject: 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 --- player/command.c | 9 ++------- 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) -- cgit v1.2.3