media-sound/pulseaudio: Fix relogin issues and alsa-lib compat
authorPacho Ramos <pacho@gentoo.org>
Sun, 30 Jun 2019 11:20:56 +0000 (13:20 +0200)
committerPacho Ramos <pacho@gentoo.org>
Sun, 30 Jun 2019 11:22:50 +0000 (13:22 +0200)
Closes: https://bugs.gentoo.org/686206
Package-Manager: Portage-2.3.67, Repoman-2.3.16
Signed-off-by: Pacho Ramos <pacho@gentoo.org>
media-sound/pulseaudio/files/pulseaudio-12.2-alsa-header-path.patch [new file with mode: 0644]
media-sound/pulseaudio/files/pulseaudio-12.2-alsa-header-path2.patch [new file with mode: 0644]
media-sound/pulseaudio/files/pulseaudio-12.2-exit-time-session.patch [new file with mode: 0644]
media-sound/pulseaudio/pulseaudio-12.2-r2.ebuild [new file with mode: 0644]

diff --git a/media-sound/pulseaudio/files/pulseaudio-12.2-alsa-header-path.patch b/media-sound/pulseaudio/files/pulseaudio-12.2-alsa-header-path.patch
new file mode 100644 (file)
index 0000000..334af3e
--- /dev/null
@@ -0,0 +1,130 @@
+From 993d3fd89e5611997f1e165bf03edefb0204b0a4 Mon Sep 17 00:00:00 2001
+From: Olaf Hering <olaf@aepfle.de>
+Date: Wed, 27 Mar 2019 09:35:05 +0100
+Subject: [PATCH 287/375] alsa: Use correct header path
+
+Consumers are expected to use <alsa/asoundlib.h> instead of
+<asoundlib.h>.
+
+This is in preparation of an change to pkgconfig(alsa) to
+not pollute CFLAGS with -I/usr/include/alsa anymore.
+
+Signed-off-by: Olaf Hering <olaf@aepfle.de>
+---
+ src/modules/alsa/alsa-mixer.c         | 2 +-
+ src/modules/alsa/alsa-mixer.h         | 2 +-
+ src/modules/alsa/alsa-sink.c          | 2 +-
+ src/modules/alsa/alsa-source.c        | 2 +-
+ src/modules/alsa/alsa-ucm.c           | 2 +-
+ src/modules/alsa/alsa-util.c          | 2 +-
+ src/modules/alsa/alsa-util.h          | 2 +-
+ src/modules/alsa/module-alsa-source.c | 2 +-
+ 8 files changed, 8 insertions(+), 8 deletions(-)
+
+diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
+index 5cb99c8fd..cd99a75f8 100644
+--- a/src/modules/alsa/alsa-mixer.c
++++ b/src/modules/alsa/alsa-mixer.c
+@@ -23,7 +23,7 @@
+ #endif
+ #include <sys/types.h>
+-#include <asoundlib.h>
++#include <alsa/asoundlib.h>
+ #include <math.h>
+ #ifdef HAVE_VALGRIND_MEMCHECK_H
+diff --git a/src/modules/alsa/alsa-mixer.h b/src/modules/alsa/alsa-mixer.h
+index 3ea4d7329..65b071165 100644
+--- a/src/modules/alsa/alsa-mixer.h
++++ b/src/modules/alsa/alsa-mixer.h
+@@ -21,7 +21,7 @@
+   along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
+ ***/
+-#include <asoundlib.h>
++#include <alsa/asoundlib.h>
+ #include <pulse/sample.h>
+ #include <pulse/mainloop-api.h>
+diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
+index 28143402a..4b46708ce 100644
+--- a/src/modules/alsa/alsa-sink.c
++++ b/src/modules/alsa/alsa-sink.c
+@@ -25,7 +25,7 @@
+ #include <signal.h>
+ #include <stdio.h>
+-#include <asoundlib.h>
++#include <alsa/asoundlib.h>
+ #ifdef HAVE_VALGRIND_MEMCHECK_H
+ #include <valgrind/memcheck.h>
+diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
+index 8129220b0..c8bf649e1 100644
+--- a/src/modules/alsa/alsa-source.c
++++ b/src/modules/alsa/alsa-source.c
+@@ -25,7 +25,7 @@
+ #include <signal.h>
+ #include <stdio.h>
+-#include <asoundlib.h>
++#include <alsa/asoundlib.h>
+ #include <pulse/rtclock.h>
+ #include <pulse/timeval.h>
+diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c
+index 341c8012e..0a40ca8fe 100644
+--- a/src/modules/alsa/alsa-ucm.c
++++ b/src/modules/alsa/alsa-ucm.c
+@@ -27,7 +27,7 @@
+ #include <ctype.h>
+ #include <sys/types.h>
+ #include <limits.h>
+-#include <asoundlib.h>
++#include <alsa/asoundlib.h>
+ #ifdef HAVE_VALGRIND_MEMCHECK_H
+ #include <valgrind/memcheck.h>
+diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
+index e8d712e72..bd0a47e50 100644
+--- a/src/modules/alsa/alsa-util.c
++++ b/src/modules/alsa/alsa-util.c
+@@ -23,7 +23,7 @@
+ #endif
+ #include <sys/types.h>
+-#include <asoundlib.h>
++#include <alsa/asoundlib.h>
+ #include <pulse/sample.h>
+ #include <pulse/xmalloc.h>
+diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h
+index 6b27339ec..4ceaa06ee 100644
+--- a/src/modules/alsa/alsa-util.h
++++ b/src/modules/alsa/alsa-util.h
+@@ -21,7 +21,7 @@
+   along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
+ ***/
+-#include <asoundlib.h>
++#include <alsa/asoundlib.h>
+ #include <pulse/sample.h>
+ #include <pulse/channelmap.h>
+diff --git a/src/modules/alsa/module-alsa-source.c b/src/modules/alsa/module-alsa-source.c
+index af6800dd2..747ba9342 100644
+--- a/src/modules/alsa/module-alsa-source.c
++++ b/src/modules/alsa/module-alsa-source.c
+@@ -24,7 +24,7 @@
+ #include <stdio.h>
+-#include <asoundlib.h>
++#include <alsa/asoundlib.h>
+ #ifdef HAVE_VALGRIND_MEMCHECK_H
+ #include <valgrind/memcheck.h>
+-- 
+2.21.0
+
diff --git a/media-sound/pulseaudio/files/pulseaudio-12.2-alsa-header-path2.patch b/media-sound/pulseaudio/files/pulseaudio-12.2-alsa-header-path2.patch
new file mode 100644 (file)
index 0000000..c592da2
--- /dev/null
@@ -0,0 +1,45 @@
+From b89d33bb182c42db5ad3987b0e91b7bf62f421e8 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Sun, 21 Apr 2019 11:59:30 +0200
+Subject: [PATCH 304/375] alsa: Fix inclusion of use-case.h
+
+The recent change in ALSA upstream stripped -I$include/alsa path from
+pkgconfig.  We already fixed for this change in some places but still
+the code for UCM was overlooked, and this resulted in the unresolved
+symbols in alsa card module. Fix them as well.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+---
+ configure.ac                | 2 +-
+ src/modules/alsa/alsa-ucm.h | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index c004bd70d..b44ed1595 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -826,7 +826,7 @@ AS_IF([test "x$enable_alsa" = "xyes" && test "x$HAVE_ALSA" = "x0"],
+ AS_IF([test "x$HAVE_ALSA" = "x1"],
+     [
+         save_CPPFLAGS="$CPPFLAGS"; CPPFLAGS="$CPPFLAGS $ASOUNDLIB_CFLAGS"
+-        AC_CHECK_HEADERS([use-case.h], HAVE_ALSA_UCM=1, HAVE_ALSA_UCM=0)
++        AC_CHECK_HEADERS([alsa/use-case.h], HAVE_ALSA_UCM=1, HAVE_ALSA_UCM=0)
+         CPPFLAGS="$save_CPPFLAGS"
+     ],
+     HAVE_ALSA_UCM=0)
+diff --git a/src/modules/alsa/alsa-ucm.h b/src/modules/alsa/alsa-ucm.h
+index 53abf3f90..c926f3cc3 100644
+--- a/src/modules/alsa/alsa-ucm.h
++++ b/src/modules/alsa/alsa-ucm.h
+@@ -23,7 +23,7 @@
+ ***/
+ #ifdef HAVE_ALSA_UCM
+-#include <use-case.h>
++#include <alsa/use-case.h>
+ #else
+ typedef void snd_use_case_mgr_t;
+ #endif
+-- 
+2.21.0
+
diff --git a/media-sound/pulseaudio/files/pulseaudio-12.2-exit-time-session.patch b/media-sound/pulseaudio/files/pulseaudio-12.2-exit-time-session.patch
new file mode 100644 (file)
index 0000000..045ab55
--- /dev/null
@@ -0,0 +1,181 @@
+From de705a0eeaa27a8ac1abdc2625e639340323595a Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen <tanuk@iki.fi>
+Date: Tue, 6 Mar 2018 15:09:06 +0200
+Subject: [PATCH 08/77] set exit_idle_time to 0 when we detect a session
+
+As the comments explain, this fixes relogin problems on some systems
+that remove our sockets on logout without terminating the daemon.
+---
+ man/pulse-daemon.conf.5.xml.in     | 15 ++++++++++++---
+ man/pulseaudio.1.xml.in            | 17 +++++++++++++++--
+ src/modules/module-console-kit.c   | 13 +++++++++++++
+ src/modules/module-systemd-login.c | 14 ++++++++++++++
+ src/modules/x11/module-x11-xsmp.c  | 13 +++++++++++++
+ src/pulsecore/core.c               | 10 ++++++++++
+ src/pulsecore/core.h               |  2 ++
+ 7 files changed, 79 insertions(+), 5 deletions(-)
+
+diff --git a/man/pulse-daemon.conf.5.xml.in b/man/pulse-daemon.conf.5.xml.in
+index f0550f3b..f49fa9b0 100644
+--- a/man/pulse-daemon.conf.5.xml.in
++++ b/man/pulse-daemon.conf.5.xml.in
+@@ -292,9 +292,18 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
+     <option>
+       <p><opt>exit-idle-time=</opt> Terminate the daemon after the
+       last client quit and this time in seconds passed. Use a negative value to
+-      disable this feature. Defaults to 20. The
+-      <opt>--exit-idle-time</opt> command line option takes
+-      precedence.</p>
++      disable this feature. Defaults to 20. The <opt>--exit-idle-time</opt>
++      command line option takes precedence.</p>
++
++      <p>When PulseAudio runs in the per-user mode and detects a login
++      session, then any positive value will be reset to 0 so that PulseAudio
++      will terminate immediately on logout. A positive value therefore has
++      effect only in environments where there's no support for login session
++      tracking. A negative value can still be used to disable any automatic
++      exit.</p>
++
++      <p>When PulseAudio runs in the system mode, automatic exit is always
++      disabled, so this option does nothing.</p>
+     </option>
+     <option>
+diff --git a/man/pulseaudio.1.xml.in b/man/pulseaudio.1.xml.in
+index f732b8ae..824eddb4 100644
+--- a/man/pulseaudio.1.xml.in
++++ b/man/pulseaudio.1.xml.in
+@@ -189,8 +189,21 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
+     <option>
+       <p><opt>--exit-idle-time</opt><arg>=SECS</arg></p>
+-      <optdesc><p>Terminate the daemon when idle and the specified
+-      number of seconds passed.</p></optdesc>
++      <optdesc>
++        <p>Terminate the daemon after the last client quit and this time in
++        seconds passed. Use a negative value to disable this feature. Defaults
++        to 20.</p>
++
++        <p>When PulseAudio runs in the per-user mode and detects a login
++        session, then any positive value will be reset to 0 so that PulseAudio
++        will terminate immediately on logout. A positive value therefore has
++        effect only in environments where there's no support for login session
++        tracking. A negative value can still be used to disable any automatic
++        exit.</p>
++
++        <p>When PulseAudio runs in the system mode, automatic exit is always
++        disabled, so this option does nothing.</p>
++      </optdesc>
+     </option>
+     <option>
+diff --git a/src/modules/module-console-kit.c b/src/modules/module-console-kit.c
+index c7938849..c8fe2ed2 100644
+--- a/src/modules/module-console-kit.c
++++ b/src/modules/module-console-kit.c
+@@ -118,6 +118,19 @@ static void add_session(struct userdata *u, const char *id) {
+     pa_log_debug("Added new session %s", id);
++    /* Positive exit_idle_time is only useful when we have no session tracking
++     * capability, so we can set it to 0 now that we have detected a session.
++     * The benefit of setting exit_idle_time to 0 is that pulseaudio will exit
++     * immediately when the session ends. That in turn is useful, because some
++     * systems (those that use pam_systemd but don't use systemd for managing
++     * pulseaudio) clean $XDG_RUNTIME_DIR on logout, but fail to terminate all
++     * services that depend on the files in $XDG_RUNTIME_DIR. The directory
++     * contains our sockets, and if the sockets are removed without terminating
++     * pulseaudio, a quick relogin will likely cause trouble, because a new
++     * instance will be spawned while the old instance is still running. */
++    if (u->core->exit_idle_time > 0)
++        pa_core_set_exit_idle_time(u->core, 0);
++
+ fail:
+     if (m)
+diff --git a/src/modules/module-systemd-login.c b/src/modules/module-systemd-login.c
+index 87981592..51401575 100644
+--- a/src/modules/module-systemd-login.c
++++ b/src/modules/module-systemd-login.c
+@@ -84,6 +84,20 @@ static int add_session(struct userdata *u, const char *id) {
+     pa_hashmap_put(u->sessions, session->id, session);
+     pa_log_debug("Added new session %s", id);
++
++    /* Positive exit_idle_time is only useful when we have no session tracking
++     * capability, so we can set it to 0 now that we have detected a session.
++     * The benefit of setting exit_idle_time to 0 is that pulseaudio will exit
++     * immediately when the session ends. That in turn is useful, because some
++     * systems (those that use pam_systemd but don't use systemd for managing
++     * pulseaudio) clean $XDG_RUNTIME_DIR on logout, but fail to terminate all
++     * services that depend on the files in $XDG_RUNTIME_DIR. The directory
++     * contains our sockets, and if the sockets are removed without terminating
++     * pulseaudio, a quick relogin will likely cause trouble, because a new
++     * instance will be spawned while the old instance is still running. */
++    if (u->core->exit_idle_time > 0)
++        pa_core_set_exit_idle_time(u->core, 0);
++
+     return 0;
+ }
+diff --git a/src/modules/x11/module-x11-xsmp.c b/src/modules/x11/module-x11-xsmp.c
+index 0238e516..6f801237 100644
+--- a/src/modules/x11/module-x11-xsmp.c
++++ b/src/modules/x11/module-x11-xsmp.c
+@@ -206,6 +206,19 @@ int pa__init(pa_module*m) {
+     if (!u->client)
+         goto fail;
++    /* Positive exit_idle_time is only useful when we have no session tracking
++     * capability, so we can set it to 0 now that we have detected a session.
++     * The benefit of setting exit_idle_time to 0 is that pulseaudio will exit
++     * immediately when the session ends. That in turn is useful, because some
++     * systems (those that use pam_systemd but don't use systemd for managing
++     * pulseaudio) clean $XDG_RUNTIME_DIR on logout, but fail to terminate all
++     * services that depend on the files in $XDG_RUNTIME_DIR. The directory
++     * contains our sockets, and if the sockets are removed without terminating
++     * pulseaudio, a quick relogin will likely cause trouble, because a new
++     * instance will be spawned while the old instance is still running. */
++    if (u->core->exit_idle_time > 0)
++        pa_core_set_exit_idle_time(u->core, 0);
++
+     pa_modargs_free(ma);
+     return 0;
+diff --git a/src/pulsecore/core.c b/src/pulsecore/core.c
+index 79abbc04..da42a13e 100644
+--- a/src/pulsecore/core.c
++++ b/src/pulsecore/core.c
+@@ -426,6 +426,16 @@ void pa_core_update_default_source(pa_core *core) {
+     pa_hook_fire(&core->hooks[PA_CORE_HOOK_DEFAULT_SOURCE_CHANGED], core->default_source);
+ }
++void pa_core_set_exit_idle_time(pa_core *core, int time) {
++    pa_assert(core);
++
++    if (time == core->exit_idle_time)
++        return;
++
++    pa_log_info("exit_idle_time: %i -> %i", core->exit_idle_time, time);
++    core->exit_idle_time = time;
++}
++
+ static void exit_callback(pa_mainloop_api *m, pa_time_event *e, const struct timeval *t, void *userdata) {
+     pa_core *c = userdata;
+     pa_assert(c->exit_event == e);
+diff --git a/src/pulsecore/core.h b/src/pulsecore/core.h
+index 213964ce..38622f61 100644
+--- a/src/pulsecore/core.h
++++ b/src/pulsecore/core.h
+@@ -258,6 +258,8 @@ void pa_core_set_configured_default_source(pa_core *core, const char *source);
+ void pa_core_update_default_sink(pa_core *core);
+ void pa_core_update_default_source(pa_core *core);
++void pa_core_set_exit_idle_time(pa_core *core, int time);
++
+ /* Check whether no one is connected to this core */
+ void pa_core_check_idle(pa_core *c);
+-- 
+2.17.1
+
diff --git a/media-sound/pulseaudio/pulseaudio-12.2-r2.ebuild b/media-sound/pulseaudio/pulseaudio-12.2-r2.ebuild
new file mode 100644 (file)
index 0000000..4e7497c
--- /dev/null
@@ -0,0 +1,366 @@
+# Copyright 1999-2019 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=6
+inherit autotools bash-completion-r1 flag-o-matic gnome2-utils linux-info systemd user udev multilib-minimal
+
+DESCRIPTION="A networked sound server with an advanced plugin system"
+HOMEPAGE="https://www.freedesktop.org/wiki/Software/PulseAudio/"
+SRC_URI="https://freedesktop.org/software/pulseaudio/releases/${P}.tar.xz"
+
+# libpulse-simple and libpulse link to libpulse-core; this is daemon's
+# library and can link to gdbm and other GPL-only libraries. In this
+# cases, we have a fully GPL-2 package. Leaving the rest of the
+# GPL-forcing USE flags for those who use them.
+LICENSE="!gdbm? ( LGPL-2.1 ) gdbm? ( GPL-2 )"
+
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~ppc ~ppc64 ~sh ~sparc ~x86 ~amd64-fbsd ~amd64-linux ~x86-linux"
+
+# +alsa-plugin as discussed in bug #519530
+IUSE="+alsa +alsa-plugin +asyncns bluetooth +caps dbus doc equalizer elogind gconf
++gdbm +glib gtk ipv6 jack libsamplerate libressl lirc native-headset neon
+ofono-headset +orc oss qt5 realtime selinux sox ssl systemd system-wide tcpd test
++udev +webrtc-aec +X zeroconf"
+
+# See "*** BLUEZ support not found (requires D-Bus)" in configure.ac
+REQUIRED_USE="
+       ?? ( elogind systemd )
+       bluetooth? ( dbus )
+       equalizer? ( dbus )
+       ofono-headset? ( bluetooth )
+       native-headset? ( bluetooth )
+       realtime? ( dbus )
+       udev? ( || ( alsa oss ) )
+"
+
+# libpcre needed in some cases, bug #472228
+CDEPEND="
+       || (
+               elibc_glibc? ( virtual/libc )
+               elibc_uclibc? ( virtual/libc )
+               dev-libs/libpcre
+       )
+       >=media-libs/libsndfile-1.0.20[${MULTILIB_USEDEP}]
+       X? (
+               >=x11-libs/libX11-1.4.0[${MULTILIB_USEDEP}]
+               >=x11-libs/libxcb-1.6[${MULTILIB_USEDEP}]
+               x11-libs/libSM[${MULTILIB_USEDEP}]
+               x11-libs/libICE[${MULTILIB_USEDEP}]
+               x11-libs/libXtst[${MULTILIB_USEDEP}]
+       )
+       caps? ( >=sys-libs/libcap-2.22-r2[${MULTILIB_USEDEP}] )
+       libsamplerate? ( >=media-libs/libsamplerate-0.1.1-r1 )
+       alsa? ( >=media-libs/alsa-lib-1.0.19 )
+       glib? ( >=dev-libs/glib-2.26.0:2[${MULTILIB_USEDEP}] )
+       zeroconf? ( >=net-dns/avahi-0.6.12[dbus] )
+       jack? ( virtual/jack )
+       tcpd? ( sys-apps/tcp-wrappers[${MULTILIB_USEDEP}] )
+       lirc? ( app-misc/lirc )
+       dbus? ( >=sys-apps/dbus-1.0.0[${MULTILIB_USEDEP}] )
+       gtk? ( x11-libs/gtk+:3 )
+       bluetooth? (
+               >=net-wireless/bluez-5
+               >=sys-apps/dbus-1.0.0
+               media-libs/sbc
+       )
+       asyncns? ( net-libs/libasyncns[${MULTILIB_USEDEP}] )
+       udev? ( >=virtual/udev-143[hwdb(+)] )
+       equalizer? ( sci-libs/fftw:3.0 )
+       ofono-headset? ( >=net-misc/ofono-1.13 )
+       orc? ( >=dev-lang/orc-0.4.15 )
+       sox? ( >=media-libs/soxr-0.1.1 )
+       ssl? (
+               !libressl? ( dev-libs/openssl:0= )
+               libressl? ( dev-libs/libressl:= )
+       )
+       media-libs/speexdsp
+       gdbm? ( sys-libs/gdbm:= )
+       webrtc-aec? ( >=media-libs/webrtc-audio-processing-0.2 )
+       elogind? ( sys-auth/elogind )
+       systemd? ( sys-apps/systemd:0=[${MULTILIB_USEDEP}] )
+       dev-libs/libltdl:0
+       selinux? ( sec-policy/selinux-pulseaudio )
+" # libltdl is a valid RDEPEND, libltdl.so is used for native abi in pulsecore and daemon
+
+RDEPEND="${CDEPEND}
+       realtime? ( sys-auth/rtkit )
+       gconf? ( >=gnome-base/gconf-3.2.6 )
+"
+
+DEPEND="${RDEPEND}
+       sys-devel/m4
+       doc? ( app-doc/doxygen )
+       test? ( >=dev-libs/check-0.9.10 )
+       X? (
+               x11-base/xorg-proto
+               >=x11-libs/libXtst-1.0.99.2[${MULTILIB_USEDEP}]
+       )
+       dev-libs/libatomic_ops
+       virtual/pkgconfig
+       system-wide? ( || ( dev-util/unifdef sys-freebsd/freebsd-ubin ) )
+       dev-util/intltool
+       >=sys-devel/gettext-0.18.1
+"
+# This is a PDEPEND to avoid a circular dep
+PDEPEND="
+       alsa? ( alsa-plugin? ( >=media-plugins/alsa-plugins-1.0.27-r1[pulseaudio,${MULTILIB_USEDEP}] ) )
+"
+
+# alsa-utils dep is for the alsasound init.d script (see bug #155707)
+# bluez dep is for the bluetooth init.d script
+# PyQt5 dep is for the qpaeq script
+RDEPEND="${RDEPEND}
+       equalizer? ( qt5? ( dev-python/PyQt5[dbus,widgets] ) )
+       system-wide? (
+               alsa? ( media-sound/alsa-utils )
+               bluetooth? ( >=net-wireless/bluez-5 )
+       )
+"
+
+PATCHES=(
+       "${FILESDIR}"/pulseaudio-11.1-disable-flat-volumes.patch # bug 627894
+       # Backports from Fedora
+       "${FILESDIR}"/${P}-exit-time-session.patch
+       "${FILESDIR}"/${P}-alsa-header-path.patch
+       "${FILESDIR}"/${P}-alsa-header-path2.patch
+)
+
+pkg_pretend() {
+       CONFIG_CHECK="~HIGH_RES_TIMERS"
+       WARNING_HIGH_RES_TIMERS="CONFIG_HIGH_RES_TIMERS:\tis not set (required for enabling timer-based scheduling in pulseaudio)\n"
+       check_extra_config
+
+       if linux_config_exists; then
+               local snd_hda_prealloc_size=$(linux_chkconfig_string SND_HDA_PREALLOC_SIZE)
+               if [ -n "${snd_hda_prealloc_size}" ] && [ "${snd_hda_prealloc_size}" -lt 2048 ]; then
+                       ewarn "A preallocated buffer-size of 2048 (kB) or higher is recommended for the HD-audio driver!"
+                       ewarn "CONFIG_SND_HDA_PREALLOC_SIZE=${snd_hda_prealloc_size}"
+               fi
+       fi
+}
+
+pkg_setup() {
+       linux-info_pkg_setup
+       gnome2_environment_reset #543364
+
+       enewgroup audio 18 # Just make sure it exists
+
+       if use system-wide; then
+               enewgroup pulse-access
+               enewgroup pulse
+               enewuser pulse -1 -1 /var/run/pulse pulse,audio
+       fi
+}
+
+src_prepare() {
+       default
+
+       # Skip test that cannot work with sandbox, bug #501846
+       sed -i -e '/lock-autospawn-test /d' src/Makefile.am || die
+       sed -i -e 's/lock-autospawn-test$(EXEEXT) //' src/Makefile.in || die
+
+       eautoreconf
+}
+
+multilib_src_configure() {
+       local myconf=(
+               --disable-adrian-aec
+               --disable-bluez4
+               --disable-esound
+               --disable-gconf
+               --disable-solaris
+               --enable-largefile
+               --localstatedir="${EPREFIX}"/var
+               --with-systemduserunitdir=$(systemd_get_userunitdir)
+               --with-udev-rules-dir="${EPREFIX}/$(get_udevdir)"/rules.d
+               $(multilib_native_use_enable alsa)
+               $(multilib_native_use_enable bluetooth bluez5)
+               $(multilib_native_use_enable glib gsettings)
+               $(multilib_native_use_enable gtk gtk3)
+               $(multilib_native_use_enable jack)
+               $(multilib_native_use_enable libsamplerate samplerate)
+               $(multilib_native_use_enable lirc)
+               $(multilib_native_use_enable orc)
+               $(multilib_native_use_enable oss oss-output)
+               $(multilib_native_use_enable ssl openssl)
+               # tests involve random modules, so just do them for the native
+               $(multilib_native_use_enable test default-build-tests)
+               $(multilib_native_use_enable udev)
+               $(multilib_native_use_enable webrtc-aec)
+               $(multilib_native_use_enable zeroconf avahi)
+               $(multilib_native_use_with equalizer fftw)
+               $(multilib_native_use_with sox soxr)
+               $(multilib_native_usex gdbm '--with-database=gdbm' '--with-database=simple')
+               $(use_enable glib glib2)
+               $(use_enable asyncns)
+               $(use_enable neon neon-opt)
+               $(use_enable tcpd tcpwrap)
+               $(use_enable dbus)
+               $(use_enable X x11)
+               $(use_enable systemd systemd-daemon)
+               # systemd-login isn't necessary for non-native, but the rest of systemd are; not changing it at this point close to a meson port
+               $(use_enable systemd systemd-login)
+               $(use_enable systemd systemd-journal)
+               $(use_enable ipv6)
+               $(use_with caps)
+       )
+
+       if use elogind && multilib_is_native_abi; then
+               myconf+=(
+                       --enable-systemd-login
+                       SYSTEMDLOGIN_CFLAGS=`pkg-config --cflags "libelogind" 2>/dev/null`
+                       SYSTEMDLOGIN_LIBS=`pkg-config --libs "libelogind" 2>/dev/null`
+               )
+       fi
+
+       if use bluetooth; then
+               myconf+=(
+                       $(multilib_native_use_enable native-headset bluez5-native-headset)
+                       $(multilib_native_use_enable ofono-headset bluez5-ofono-headset)
+               )
+       fi
+
+       if ! multilib_is_native_abi; then
+               myconf+=(
+                       # hack around unnecessary checks
+                       # (results don't matter, we're not building anything using it)
+                       ac_cv_lib_ltdl_lt_dladvise_init=yes
+                       LIBSPEEX_CFLAGS=' '
+                       LIBSPEEX_LIBS=' '
+               )
+       else
+               # Make padsp work for non-native ABI, supposedly only possible with glibc; this is used by /usr/bin/padsp that comes from native build, thus we need this argument for native build
+               if use elibc_glibc ; then
+                       myconf+=( --with-pulsedsp-location="${EPREFIX}"'/usr/\\$$LIB/pulseaudio' )
+               fi
+       fi
+
+       ECONF_SOURCE=${S} \
+       econf "${myconf[@]}"
+}
+
+multilib_src_compile() {
+       if multilib_is_native_abi; then
+               emake
+               use doc && emake doxygen
+       else
+               local targets=( libpulse.la libpulsedsp.la libpulse-simple.la )
+               use glib && targets+=( libpulse-mainloop-glib.la )
+               emake -C src ${targets[*]}
+       fi
+}
+
+multilib_src_test() {
+       # We avoid running the toplevel check target because that will run
+       # po/'s tests too, and they are broken. Officially, it should work
+       # with intltool 0.41, but that doesn't look like a stable release.
+       if multilib_is_native_abi; then
+               emake -C src check
+       fi
+}
+
+multilib_src_install() {
+       if multilib_is_native_abi; then
+               emake -j1 DESTDIR="${D}" bashcompletiondir="$(get_bashcompdir)" install
+               if use doc ; then
+                       docinto html
+                       dodoc -r doxygen/html/
+               fi
+       else
+               local targets=( libpulse.la libpulse-simple.la )
+               use glib && targets+=( libpulse-mainloop-glib.la )
+               emake DESTDIR="${D}" install-pkgconfigDATA
+               emake DESTDIR="${D}" -C src \
+                       install-libLTLIBRARIES \
+                       install-padsplibLTLIBRARIES \
+                       lib_LTLIBRARIES="${targets[*]}" \
+                       install-pulseincludeHEADERS
+       fi
+}
+
+multilib_src_install_all() {
+       if use system-wide; then
+               newconfd "${FILESDIR}/pulseaudio.conf.d" pulseaudio
+
+               use_define() {
+                       local define=${2:-$(echo $1 | tr '[:lower:]' '[:upper:]')}
+
+                       use "$1" && echo "-D$define" || echo "-U$define"
+               }
+
+               unifdef $(use_define zeroconf AVAHI) \
+                       $(use_define alsa) \
+                       $(use_define bluetooth) \
+                       $(use_define udev) \
+                       "${FILESDIR}/pulseaudio.init.d-5" \
+                       > "${T}/pulseaudio"
+
+               doinitd "${T}/pulseaudio"
+
+               systemd_dounit "${FILESDIR}/${PN}.service"
+
+               # We need /var/run/pulse, bug #442852
+               systemd_newtmpfilesd "${FILESDIR}/${PN}.tmpfiles" "${PN}.conf"
+       else
+               # Prevent warnings when system-wide is not used, bug #447694
+               if use dbus ; then
+                       rm "${ED%/}"/etc/dbus-1/system.d/pulseaudio-system.conf || die
+               fi
+       fi
+
+       if use zeroconf ; then
+               sed -e '/module-zeroconf-publish/s:^#::' \
+                       -i "${ED%/}/etc/pulse/default.pa" || die
+       fi
+
+       dodoc NEWS README todo
+
+       # Create the state directory
+       use prefix || diropts -o pulse -g pulse -m0755
+
+       find "${ED}" \( -name '*.a' -o -name '*.la' \) -delete || die
+}
+
+pkg_postinst() {
+       gnome2_schemas_update
+       if use system-wide; then
+               elog "You have enabled the 'system-wide' USE flag for pulseaudio."
+               elog "This mode should only be used on headless servers, embedded systems,"
+               elog "or thin clients. It will usually require manual configuration, and is"
+               elog "incompatible with many expected pulseaudio features."
+               elog "On normal desktop systems, system-wide mode is STRONGLY DISCOURAGED."
+               elog "For more information, see"
+               elog "    https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/WhatIsWrongWithSystemWide/"
+               elog "    https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/SystemWide/"
+               elog "    https://wiki.gentoo.org/wiki/PulseAudio#Headless_server"
+       fi
+
+       if use equalizer && ! use qt5; then
+               elog "You've enabled the 'equalizer' USE-flag but not the 'qt5' USE-flag."
+               elog "This will build the equalizer module, but the 'qpaeq' tool"
+               elog "which is required to set equalizer levels will not work."
+       fi
+
+       if use equalizer && use qt5; then
+               elog "You will need to load some extra modules to make qpaeq work."
+               elog "You can do that by adding the following two lines in"
+               elog "/etc/pulse/default.pa and restarting pulseaudio:"
+               elog "load-module module-equalizer-sink"
+               elog "load-module module-dbus-protocol"
+       fi
+
+       if use native-headset && use ofono-headset; then
+               elog "You have enabled both native and ofono headset profiles. The runtime decision"
+               elog "which to use is done via the 'headset' argument of module-bluetooth-discover."
+       fi
+
+       if use libsamplerate; then
+               elog "The libsamplerate based resamplers are now deprecated, because they offer no"
+               elog "particular advantage over speex. Upstream suggests disabling them."
+       fi
+}
+
+pkg_postrm() {
+       gnome2_schemas_update
+}