From 562d8e6d3236022a77e49a17948e25e493538f04 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 19 May 2018 12:37:37 +0200 Subject: player: simplify edition switching The player fully restarts playback when the edition or disk title is changed. Before this, the player tried to reinitialized playback partially. For example, it did not print a new "Playing: " message, and did not send playback end to libmpv users (scripts or applications). This playback restart code was a bit messy and could have unforeseen interactions with various state. There have been bugs before. Since it's a mostly cosmetic thing for an obscure feature, just change it to a full restart. This works well, though since it may have consequences for scripts or client API users, mention it in interface-changes.rst. --- DOCS/interface-changes.rst | 2 ++ player/command.c | 4 ++-- player/core.h | 1 - player/loadfile.c | 10 ---------- 4 files changed, 4 insertions(+), 13 deletions(-) diff --git a/DOCS/interface-changes.rst b/DOCS/interface-changes.rst index 49c9bda9ba..b2974eff12 100644 --- a/DOCS/interface-changes.rst +++ b/DOCS/interface-changes.rst @@ -109,6 +109,8 @@ Interface changes - mpv_command_node() and mp.command_native() now support named arguments (see manpage). If you want to use them, use a new version of the manpage as reference, which lists the definitive names. + - edition and disc title switching will now fully reload playback (may have + consequences for scripts, client API, or when using file-local options) --- mpv 0.28.0 --- - rename --hwdec=mediacodec option to mediacodec-copy, to reflect conventions followed by other hardware video decoding APIs diff --git a/player/command.c b/player/command.c index 292384f2d9..4c46203ab4 100644 --- a/player/command.c +++ b/player/command.c @@ -928,7 +928,7 @@ static int mp_property_disc_title(void *ctx, struct m_property *prop, if (demux_stream_control(d, STREAM_CTRL_SET_CURRENT_TITLE, &title) < 0) return M_PROPERTY_NOT_IMPLEMENTED; if (!mpctx->stop_play) - mpctx->stop_play = PT_RELOAD_FILE; + mpctx->stop_play = PT_CURRENT_ENTRY; return M_PROPERTY_OK; } return M_PROPERTY_NOT_IMPLEMENTED; @@ -1145,7 +1145,7 @@ static int mp_property_edition(void *ctx, struct m_property *prop, if (edition != demuxer->edition) { mpctx->opts->edition_id = edition; if (!mpctx->stop_play) - mpctx->stop_play = PT_RELOAD_FILE; + mpctx->stop_play = PT_CURRENT_ENTRY; mp_wakeup_core(mpctx); break; // make it accessible to the demuxer via option change notify } diff --git a/player/core.h b/player/core.h index 43fc824e4f..39ea2fe07e 100644 --- a/player/core.h +++ b/player/core.h @@ -43,7 +43,6 @@ enum stop_play_reason { PT_NEXT_ENTRY, // prepare to play next entry in playlist PT_CURRENT_ENTRY, // prepare to play mpctx->playlist->current PT_STOP, // stop playback, clear playlist - PT_RELOAD_FILE, // restart playback PT_QUIT, // stop playback, quit player PT_ERROR, // play next playlist entry (due to an error) }; diff --git a/player/loadfile.c b/player/loadfile.c index dbee6ecd69..a948d1d03d 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -1344,10 +1344,6 @@ static void play_current_file(struct MPContext *mpctx) MP_INFO(mpctx, "Playing: %s\n", mpctx->filename); -reopen_file: - - reset_playback_state(mpctx); - assert(mpctx->demuxer == NULL); process_hooks(mpctx, "on_load"); @@ -1537,12 +1533,6 @@ terminate_playback: mpctx->playback_initialized = false; - if (mpctx->stop_play == PT_RELOAD_FILE) { - mpctx->stop_play = KEEP_PLAYING; - mp_cancel_reset(mpctx->playback_abort); - goto reopen_file; - } - m_config_restore_backups(mpctx->mconfig); TA_FREEP(&mpctx->filter_root); -- cgit v1.2.3