summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/interface-changes.rst5
-rw-r--r--DOCS/man/input.rst4
-rw-r--r--DOCS/man/lua.rst5
-rw-r--r--player/loadfile.c10
-rw-r--r--player/scripting.c25
5 files changed, 27 insertions, 22 deletions
diff --git a/DOCS/interface-changes.rst b/DOCS/interface-changes.rst
index 576a472cd0..a39043dc9b 100644
--- a/DOCS/interface-changes.rst
+++ b/DOCS/interface-changes.rst
@@ -88,6 +88,11 @@ Interface changes
- deprecate the old command based hook API, and introduce a proper C API
(the high level Lua API for this does not change)
- rename the the lua-settings/ config directory to script-opts/
+ - the way the player waits for scripts getting loaded changes slightly. Now
+ scripts are loaded in parallel, and block the player from continuing
+ playback only in the player initialization phase. It could change again in
+ the future. (This kind of waiting was always a feature to prevent that
+ playback is started while scripts are only half-loaded.)
--- mpv 0.28.0 ---
- rename --hwdec=mediacodec option to mediacodec-copy, to reflect
conventions followed by other hardware video decoding APIs
diff --git a/DOCS/man/input.rst b/DOCS/man/input.rst
index 7efc700550..4a59a919f0 100644
--- a/DOCS/man/input.rst
+++ b/DOCS/man/input.rst
@@ -730,7 +730,9 @@ Input Commands that are Possibly Subject to Change
merely sets all option values listed within the profile.
``load-script "<path>"``
- Load a script, similar to the ``--script`` option.
+ Load a script, similar to the ``--script`` option. Whether this waits for
+ the script to finish initialization or not changed multiple times, and the
+ future behavior is left undefined.
``change-list "<option>" "<operation>" "<value>"``
This command changes list options as described in `List Options`_. The
diff --git a/DOCS/man/lua.rst b/DOCS/man/lua.rst
index f943f3421d..c0c4f9b00a 100644
--- a/DOCS/man/lua.rst
+++ b/DOCS/man/lua.rst
@@ -63,7 +63,10 @@ the player will more or less hang until the script returns from the main chunk
(and ``mp_event_loop`` is called), or the script calls ``mp_event_loop`` or
``mp.dispatch_events`` directly. This is done to make it possible for a script
to fully setup event handlers etc. before playback actually starts. In older
-mpv versions, this happened asynchronously.
+mpv versions, this happened asynchronously. With mpv 0.29.0, this changes
+slightly, and it merely waits for scripts to be loaded in this manner before
+starting playback as part of the player initialization phase. Scripts run though
+initialization in parallel. This might change again.
mp functions
------------
diff --git a/player/loadfile.c b/player/loadfile.c
index 673ede1a71..8065b6f007 100644
--- a/player/loadfile.c
+++ b/player/loadfile.c
@@ -31,6 +31,7 @@
#include "osdep/threads.h"
#include "osdep/timer.h"
+#include "client.h"
#include "common/msg.h"
#include "common/global.h"
#include "options/path.h"
@@ -1519,6 +1520,15 @@ struct playlist_entry *mp_next_file(struct MPContext *mpctx, int direction,
// Return if all done.
void mp_play_files(struct MPContext *mpctx)
{
+ // Wait for all scripts to load before possibly starting playback.
+ if (!mp_clients_all_initialized(mpctx)) {
+ MP_VERBOSE(mpctx, "Waiting for scripts...\n");
+ while (!mp_clients_all_initialized(mpctx))
+ mp_idle(mpctx);
+ mp_wakeup_core(mpctx); // avoid lost wakeups during waiting
+ MP_VERBOSE(mpctx, "Done loading scripts.\n");
+ }
+
prepare_playlist(mpctx, mpctx->playlist);
for (;;) {
diff --git a/player/scripting.c b/player/scripting.c
index b98588d948..bcb5ea65ef 100644
--- a/player/scripting.c
+++ b/player/scripting.c
@@ -100,13 +100,6 @@ static void *script_thread(void *p)
return NULL;
}
-static void wait_loaded(struct MPContext *mpctx)
-{
- while (!mp_clients_all_initialized(mpctx))
- mp_idle(mpctx);
- mp_wakeup_core(mpctx); // avoid lost wakeups during waiting
-}
-
static int mp_load_script(struct MPContext *mpctx, const char *fname)
{
char *ext = mp_splitext(fname, NULL);
@@ -150,9 +143,6 @@ static int mp_load_script(struct MPContext *mpctx, const char *fname)
return -1;
}
- wait_loaded(mpctx);
- MP_DBG(mpctx, "Done loading %s.\n", fname);
-
return 0;
}
@@ -203,16 +193,11 @@ static void load_builtin_script(struct MPContext *mpctx, bool enable,
if (enable) {
mp_load_script(mpctx, fname);
} else {
- // Try to unload it by sending a shutdown event. Wait until it has
- // terminated, or re-enabling the script could be racy (because it'd
- // recognize a still-terminating script as "loaded").
- while (mp_client_exists(mpctx, name)) {
- if (mp_client_send_event(mpctx, name, 0, MPV_EVENT_SHUTDOWN,
- NULL) < 0)
- break;
- mp_idle(mpctx);
- }
- mp_wakeup_core(mpctx); // avoid lost wakeups during waiting
+ // Try to unload it by sending a shutdown event. This can be
+ // unreliable, because user scripts could have clashing names, or
+ // disabling and then quickly re-enabling a builtin script might
+ // detect the still-terminating script as loaded.
+ mp_client_send_event(mpctx, name, 0, MPV_EVENT_SHUTDOWN, NULL);
}
}
talloc_free(tmp);