summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/interface-changes/add-input-commands.txt1
-rw-r--r--DOCS/man/options.rst15
-rw-r--r--options/options.c1
-rw-r--r--options/options.h1
-rw-r--r--player/command.c28
-rw-r--r--player/command.h1
-rw-r--r--player/playloop.c1
7 files changed, 48 insertions, 0 deletions
diff --git a/DOCS/interface-changes/add-input-commands.txt b/DOCS/interface-changes/add-input-commands.txt
new file mode 100644
index 0000000000..3db6bd4055
--- /dev/null
+++ b/DOCS/interface-changes/add-input-commands.txt
@@ -0,0 +1 @@
+add `--input-comands` option
diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst
index 2299e3f14b..1b6e1465de 100644
--- a/DOCS/man/options.rst
+++ b/DOCS/man/options.rst
@@ -4101,6 +4101,21 @@ Input
``--input-cmdlist``
Prints all commands that can be bound to keys.
+``--input-commands=<cmd1,cmd2,...>``
+ Define a list of commands for mpv to run. The syntax is the same as format
+ as ``input.conf`` but without the key binding argument at the beginning.
+ When this option is set at startup, the commands will run after audio and
+ video playback are about to begin if applicable (in idle mode with no file,
+ it will run immediately). When changing values at runtime, the commands will
+ also run as soon as possible.
+
+ This is a string list option. See `List Options`_ for details.
+
+ .. admonition:: Example
+
+ ``--input-commands="playlist-play-index 1,set ao-volume 40"``
+ sets the playlist index to 1 and the ao-volume to 40
+
``--input-doubleclick-time=<milliseconds>``
Time in milliseconds to recognize two consecutive button presses as a
double-click (default: 300).
diff --git a/options/options.c b/options/options.c
index 80e0f6cc28..8640ecb27f 100644
--- a/options/options.c
+++ b/options/options.c
@@ -853,6 +853,7 @@ static const m_option_t mp_opts[] = {
{"idle", OPT_CHOICE(player_idle_mode,
{"no", 0}, {"once", 1}, {"yes", 2})},
+ {"input-commands", OPT_STRINGLIST(input_commands)},
{"input-terminal", OPT_BOOL(consolecontrols), .flags = UPDATE_TERM},
{"input-ipc-server", OPT_STRING(ipc_path), .flags = M_OPT_FILE},
diff --git a/options/options.h b/options/options.h
index 4d3d988789..69a50b3350 100644
--- a/options/options.h
+++ b/options/options.h
@@ -256,6 +256,7 @@ typedef struct MPOpts {
char *osd_status_msg;
char *osd_msg[3];
int player_idle_mode;
+ char **input_commands;
bool consolecontrols;
int playlist_pos;
struct m_rel_time play_start;
diff --git a/player/command.c b/player/command.c
index b5f9ad8065..ed4def2813 100644
--- a/player/command.c
+++ b/player/command.c
@@ -94,6 +94,8 @@ struct command_ctx {
char **warned_deprecated;
int num_warned_deprecated;
+ bool command_opts_processed;
+
struct overlay *overlays;
int num_overlays;
// One of these is in use by the OSD; the other one exists so that the
@@ -7161,6 +7163,27 @@ void handle_command_updates(struct MPContext *mpctx)
// Depends on polling demuxer wakeup callback notifications.
cache_dump_poll(mpctx);
+
+ // Potentially run the commands now (idle) instead of waiting for a file to load.
+ if (mpctx->stop_play == PT_STOP)
+ run_command_opts(mpctx);
+}
+
+void run_command_opts(struct MPContext *mpctx)
+{
+ struct MPOpts *opts = mpctx->opts;
+ struct command_ctx *ctx = mpctx->command_ctx;
+
+ if (!opts->input_commands || ctx->command_opts_processed)
+ return;
+
+ // Take easy way out and add these to the input queue.
+ for (int i = 0; opts->input_commands[i]; i++) {
+ struct mp_cmd *cmd = mp_input_parse_cmd(mpctx->input, bstr0(opts->input_commands[i]),
+ "the command line");
+ mp_input_queue_cmd(mpctx->input, cmd);
+ }
+ ctx->command_opts_processed = true;
}
void mp_notify(struct MPContext *mpctx, int event, void *arg)
@@ -7299,6 +7322,11 @@ void mp_option_change_callback(void *ctx, struct m_config_option *co, int flags,
vo_control(mpctx->video_out, VOCTRL_EXTERNAL_RESIZE, NULL);
}
+ if (opt_ptr == &opts->input_commands) {
+ mpctx->command_ctx->command_opts_processed = false;
+ run_command_opts(mpctx);
+ }
+
if (opt_ptr == &opts->playback_speed) {
update_playback_speed(mpctx);
mp_wakeup_core(mpctx);
diff --git a/player/command.h b/player/command.h
index 185b78fdbe..31e3b32a78 100644
--- a/player/command.h
+++ b/player/command.h
@@ -70,6 +70,7 @@ void run_command(struct MPContext *mpctx, struct mp_cmd *cmd,
struct mp_abort_entry *abort,
void (*on_completion)(struct mp_cmd_ctx *cmd),
void *on_completion_priv);
+void run_command_opts(struct MPContext *mpctx);
void mp_cmd_ctx_complete(struct mp_cmd_ctx *cmd);
PRINTF_ATTRIBUTE(3, 4)
void mp_cmd_msg(struct mp_cmd_ctx *cmd, int status, const char *msg, ...);
diff --git a/player/playloop.c b/player/playloop.c
index eccc432ffe..bf903e54f7 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -1140,6 +1140,7 @@ static void handle_playback_restart(struct MPContext *mpctx)
mpctx->hrseek_active = false;
mpctx->restart_complete = true;
mpctx->current_seek = (struct seek_params){0};
+ run_command_opts(mpctx);
handle_playback_time(mpctx);
mp_notify(mpctx, MPV_EVENT_PLAYBACK_RESTART, NULL);
update_core_idle_state(mpctx);