diff --git a/DOCS/client-api-changes.rst b/DOCS/client-api-changes.rst index 009aab7ac7..6dc473caba 100644 --- a/DOCS/client-api-changes.rst +++ b/DOCS/client-api-changes.rst @@ -25,10 +25,11 @@ API changes :: + 1.17 - mpv_initialize() now blocks SIGPIPE (details see client.h) --- mpv 0.9.0 is released --- - 1.17 - add MPV_FORMAT_BYTE_ARRAY 1.16 - add mpv_opengl_cb_report_flip() - introduce mpv_opengl_cb_draw() and deprecate mpv_opengl_cb_render() + - add MPV_FORMAT_BYTE_ARRAY 1.15 - mpv_initialize() will now load config files. This requires setting the "config" and "config-dir" options. In particular, it will load mpv.conf. diff --git a/libmpv/client.h b/libmpv/client.h index 5a7a54ad67..8958865c79 100644 --- a/libmpv/client.h +++ b/libmpv/client.h @@ -118,8 +118,10 @@ extern "C" { * (used through libass), ALSA, FFmpeg, and possibly more. * - The FPU precision must be set at least to double precision. * - On Windows, mpv will call timeBeginPeriod(1). - * - SIGPIPE should be blocked. Some parts rely on this signal not crashing the - * process (such as ffmpeg OpenSSL support, or the mpv IPC code). + * - On UNIX, every mpv_initialize() call will block SIGPIPE. This is done + * because FFmpeg makes unsafe use of OpenSSL and GnuTLS, which can raise + * this signal under certain circumstances. Once these libraries (or FFmpeg) + * are fixed, libmpv will not block the signal anymore. * - On memory exhaustion, mpv will kill the process. * * Encoding of filenames @@ -196,7 +198,7 @@ extern "C" { * relational operators (<, >, <=, >=). */ #define MPV_MAKE_VERSION(major, minor) (((major) << 16) | (minor) | 0UL) -#define MPV_CLIENT_API_VERSION MPV_MAKE_VERSION(1, 16) +#define MPV_CLIENT_API_VERSION MPV_MAKE_VERSION(1, 17) /** * Return the MPV_CLIENT_API_VERSION the mpv source has been compiled with. diff --git a/osdep/terminal-unix.c b/osdep/terminal-unix.c index f43376b088..478b613999 100644 --- a/osdep/terminal-unix.c +++ b/osdep/terminal-unix.c @@ -488,9 +488,6 @@ int terminal_init(void) setsigaction(SIGTTIN, SIG_IGN, 0, true); setsigaction(SIGTTOU, SIG_IGN, 0, true); - // get sane behavior, instead of hysteric UNIX-nonsense - setsigaction(SIGPIPE, SIG_IGN, 0, true); - getch2_poll(); return 0; diff --git a/player/main.c b/player/main.c index b80bc994bb..bc08310e9c 100644 --- a/player/main.c +++ b/player/main.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "config.h" #include "talloc.h" @@ -489,6 +490,12 @@ int mp_initialize(struct MPContext *mpctx, char **options) if (opts->w32_priority > 0) SetPriorityClass(GetCurrentProcess(), opts->w32_priority); #endif +#ifndef _WIN32 + // Deal with OpenSSL and GnuTLS not using MSG_NOSIGNAL. + struct sigaction sa = { .sa_handler = SIG_IGN, .sa_flags = SA_RESTART }; + sigfillset(&sa.sa_mask); + sigaction(SIGPIPE, &sa, NULL); +#endif prepare_playlist(mpctx, mpctx->playlist);