summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-12-02 20:35:18 +0100
committerwm4 <wm4@nowhere>2014-12-02 20:36:55 +0100
commitf984b797201309206e3821ead83c1ce49cee19da (patch)
treecf0982b905a59e575ddc8c1ca5d39afe977ed15c /player
parentef1c7563c530bebf01493d494b960da4a06fa242 (diff)
downloadmpv-f984b797201309206e3821ead83c1ce49cee19da.tar.bz2
mpv-f984b797201309206e3821ead83c1ce49cee19da.tar.xz
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.)
Diffstat (limited to 'player')
-rw-r--r--player/client.c1
-rw-r--r--player/main.c36
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 <pthread.h>
-#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);