diff options
-rw-r--r-- | DOCS/interface-changes/add-input-commands.txt | 1 | ||||
-rw-r--r-- | DOCS/man/options.rst | 15 | ||||
-rw-r--r-- | options/options.c | 1 | ||||
-rw-r--r-- | options/options.h | 1 | ||||
-rw-r--r-- | player/command.c | 28 | ||||
-rw-r--r-- | player/command.h | 1 | ||||
-rw-r--r-- | player/playloop.c | 1 |
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); |