aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Blumenkrantz <zmike@osg.samsung.com>2015-10-21 17:17:49 -0400
committerMike Blumenkrantz <zmike@osg.samsung.com>2015-10-21 17:19:52 -0400
commit6eefae48229c76e9396602f39903ed9c396d2e3c (patch)
tree1077c249e329edc09f2280d38432c493427f992e
parentrequire efl >= 1.16 for wayland support (diff)
downloadenlightenment-6eefae48229c76e9396602f39903ed9c396d2e3c.tar.gz
add hacks to work around pulseaudio+xwayland integration deadlocks
enlightenment is (I think) the first wayland compositor to run with in-process pulseaudio integration for audio playback and not just mixer support. hooray. this results in a fun issue: if DISPLAY is set, as it must be for x11 clients to function, pulseaudio will unconditionally attempt to use a blocking socket connection to create a connection to the running xserver. the only exception here is if x11 support has been compiled out of pulseaudio, but probably no distro will do that ever. so, what happens when the compositor thread tries to create a socket connection to the xserver that the compositor thread has not yet started? absolutely nothing. forever. the easiest solution which continues to provide the key press sounds that everyone loves is to ensure that the pulseaudio connection is created before DISPLAY is ever set, namely in the xwayland module init. this will now occur automatically now in the case when the mixer module detects pulseaudio support. TL;DR: don't disable mixer module if you use xwayland
Notes
Notes: TIL mutter apparently does this too but doesn't deadlock
-rw-r--r--README.wayland3
-rw-r--r--configure.ac4
-rw-r--r--src/modules/xwayland/e_mod_main.c7
3 files changed, 12 insertions, 2 deletions
diff --git a/README.wayland b/README.wayland
index 53e9ee75f..61e357b2c 100644
--- a/README.wayland
+++ b/README.wayland
@@ -52,6 +52,9 @@ to try out XWayland support:
--enable-xwayland
+NOTE: DO NOT DISABLE THE MIXER MODULE BUILD IF YOU ARE USING XWAYLAND.
+You have been warned.
+
At this stage, you should have EFL properly built, and Enlightenment
properly built. Let's move on to running it...
diff --git a/configure.ac b/configure.ac
index cbcbac1c1..fcfeebd13 100644
--- a/configure.ac
+++ b/configure.ac
@@ -682,7 +682,7 @@ define([CHECK_MODULE_MIXER],
AC_E_CHECK_PKG(ALSA, [alsa >= 1.0.8],
[ ], [ ])
AC_E_CHECK_PKG([PULSE], [libpulse-simple libpulse],
- [ ], [ ])
+ [AC_DEFINE_UNQUOTED([HAVE_PULSE], [1], [have pulseaudio])], [ ])
])
SHM_OPEN_LIBS=""
@@ -837,7 +837,7 @@ HAVE_XWAYLAND_DEPS=false
define([CHECK_MODULE_XWAYLAND],
[
if test "x${have_wayland}" = "xyes"; then
- AC_E_CHECK_PKG(XWAYLAND, [ ecore >= ${efl_version} ecore-x >= ${efl_version} ], [HAVE_XWAYLAND_DEPS=true], [HAVE_XWAYLAND_DEPS=false])
+ AC_E_CHECK_PKG(XWAYLAND, [ ecore >= ${efl_version} ecore-x >= ${efl_version} ecore-audio >= ${efl_version} ], [HAVE_XWAYLAND_DEPS=true], [HAVE_XWAYLAND_DEPS=false])
AC_PATH_PROG([XWAYLAND_BIN], [Xwayland], [false])
else
HAVE_XWAYLAND_DEPS=false
diff --git a/src/modules/xwayland/e_mod_main.c b/src/modules/xwayland/e_mod_main.c
index 24fef04f7..e73e254b4 100644
--- a/src/modules/xwayland/e_mod_main.c
+++ b/src/modules/xwayland/e_mod_main.c
@@ -2,6 +2,9 @@
#include <dlfcn.h>
#include <sys/socket.h>
#include <sys/un.h>
+#ifdef HAVE_PULSE
+# include <Ecore_Audio.h>
+#endif
EINTERN void dnd_init(void);
EINTERN void dnd_shutdown(void);
@@ -351,6 +354,10 @@ e_modapi_init(E_Module *m)
if (!(exs = calloc(1, sizeof(E_XWayland_Server))))
return NULL;
+#ifdef HAVE_PULSE
+ eo_del(eo_add(ECORE_AUDIO_OUT_PULSE_CLASS, NULL));
+#endif
+
/* record wayland display */
exs->wl_disp = e_comp_wl->wl.disp;