From f984b797201309206e3821ead83c1ce49cee19da Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 2 Dec 2014 20:35:18 +0100 Subject: client API: allow multiple mpv instances with terminal=yes This is simply not allowed, and doing it triggered an assertion. It's still not allowed, because the terminal and related functionality is a global resource, and there doesn't seem to be a sane way to manage the signal handlers. But be a bit nicer, and just the terminal if it's already in use. Note that terminal _output_ happens anyway. This becomes usable with this commit. To facilitate logging-only usage further, also explicitly disable terminal input, so that "terminal=yes" can be used for logging without much interference with other things. (It'll still overwrite some signal handlers, though.) --- player/client.c | 1 + player/main.c | 36 ++++++++++++++++++++---------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/player/client.c b/player/client.c index 4d903941d7..d86217106e 100644 --- a/player/client.c +++ b/player/client.c @@ -409,6 +409,7 @@ mpv_handle *mpv_create(void) mpv_set_option_string(ctx, "config", "no"); mpv_set_option_string(ctx, "idle", "yes"); mpv_set_option_string(ctx, "terminal", "no"); + mpv_set_option_string(ctx, "input-terminal", "no"); mpv_set_option_string(ctx, "osc", "no"); mpv_set_option_string(ctx, "ytdl", "no"); mpv_set_option_string(ctx, "input-default-bindings", "no"); diff --git a/player/main.c b/player/main.c index ead6807b1e..52bbc97733 100644 --- a/player/main.c +++ b/player/main.c @@ -77,12 +77,6 @@ #include "osdep/macosx_events.h" #endif -#ifdef PTW32_STATIC_LIB -#include -#endif - -static bool terminal_initialized; - enum exit_reason { EXIT_NONE, EXIT_NORMAL, @@ -103,6 +97,19 @@ const char mp_help_text[] = " --list-options list all mpv options\n" "\n"; +static pthread_mutex_t terminal_owner_lock = PTHREAD_MUTEX_INITIALIZER; +static struct MPContext *terminal_owner; + +static bool cas_terminal_owner(struct MPContext *old, struct MPContext *new) +{ + pthread_mutex_lock(&terminal_owner_lock); + bool r = terminal_owner == old; + if (r) + terminal_owner = new; + pthread_mutex_unlock(&terminal_owner_lock); + return r; +} + void mp_print_version(struct mp_log *log, int always) { int v = always ? MSGL_INFO : MSGL_V; @@ -147,9 +154,9 @@ void mp_destroy(struct MPContext *mpctx) osd_free(mpctx->osd); - if (mpctx->opts->use_terminal && terminal_initialized) { + if (cas_terminal_owner(mpctx, mpctx)) { terminal_uninit(); - terminal_initialized = false; + cas_terminal_owner(mpctx, NULL); } mp_dispatch_set_wakeup_fn(mpctx->dispatch, NULL, NULL); @@ -378,11 +385,10 @@ int mp_initialize(struct MPContext *mpctx) } MP_STATS(mpctx, "start init"); - if (mpctx->opts->use_terminal && !terminal_initialized) { - terminal_initialized = true; + if (mpctx->opts->use_terminal && cas_terminal_owner(NULL, mpctx)) terminal_init(); - mp_msg_update_msglevels(mpctx->global); - } + + mp_msg_update_msglevels(mpctx->global); if (opts->slave_mode) { MP_WARN(mpctx, "--slave-broken is deprecated (see manpage).\n"); @@ -417,7 +423,7 @@ int mp_initialize(struct MPContext *mpctx) } #endif - if (opts->use_terminal && opts->consolecontrols && terminal_initialized) + if (opts->consolecontrols && cas_terminal_owner(mpctx, mpctx)) terminal_setup_getch(mpctx->input); #if !HAVE_LIBASS @@ -486,10 +492,8 @@ int mpv_main(int argc, char *argv[]) // Preparse the command line m_config_preparse_command_line(mpctx->mconfig, mpctx->global, argc, argv); - if (mpctx->opts->use_terminal && !terminal_initialized) { - terminal_initialized = true; + if (mpctx->opts->use_terminal && cas_terminal_owner(NULL, mpctx)) terminal_init(); - } mp_msg_update_msglevels(mpctx->global); -- cgit v1.2.3