From f434422554ae11bd51325aa72beb15e773cb6306 Mon Sep 17 00:00:00 2001
From: Rex Dieter
Date: Sun, 1 Jul 2018 21:31:44 -0500
Subject: [PATCH] switch-on-port-available-ignore-bluetooth-cards.patch
(#1594596, fdo#107044) use upstreamed exit-idle-time.patch
---
...e_time-to-0-when-we-detect-a-session.patch | 181 ++++++++++++++++++
pulseaudio-11.1-exit_idle_time-2.patch | 102 ----------
pulseaudio.spec | 17 +-
...ort-available-ignore-bluetooth-cards.patch | 43 +++++
4 files changed, 236 insertions(+), 107 deletions(-)
create mode 100644 0008-set-exit_idle_time-to-0-when-we-detect-a-session.patch
delete mode 100644 pulseaudio-11.1-exit_idle_time-2.patch
create mode 100644 switch-on-port-available-ignore-bluetooth-cards.patch
diff --git a/0008-set-exit_idle_time-to-0-when-we-detect-a-session.patch b/0008-set-exit_idle_time-to-0-when-we-detect-a-session.patch
new file mode 100644
index 0000000..045ab55
--- /dev/null
+++ b/0008-set-exit_idle_time-to-0-when-we-detect-a-session.patch
@@ -0,0 +1,181 @@
+From de705a0eeaa27a8ac1abdc2625e639340323595a Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen
+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 .
+
+ exit-idle-time= 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
+- --exit-idle-time command line option takes
+- precedence.
++ disable this feature. Defaults to 20. The --exit-idle-time
++ command line option takes precedence.
++
++ 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.
++
++ When PulseAudio runs in the system mode, automatic exit is always
++ disabled, so this option does nothing.
+
+
+
+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 .
+
+ --exit-idle-time =SECS
+
+- Terminate the daemon when idle and the specified
+- number of seconds passed.
++
++ 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.
++
++ 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.
++
++ When PulseAudio runs in the system mode, automatic exit is always
++ disabled, so this option does nothing.
++
+
+
+
+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/pulseaudio-11.1-exit_idle_time-2.patch b/pulseaudio-11.1-exit_idle_time-2.patch
deleted file mode 100644
index e648398..0000000
--- a/pulseaudio-11.1-exit_idle_time-2.patch
+++ /dev/null
@@ -1,102 +0,0 @@
-diff -up pulseaudio-11.1/src/modules/module-console-kit.c.foo pulseaudio-11.1/src/modules/module-console-kit.c
---- pulseaudio-11.1/src/modules/module-console-kit.c.foo 2016-08-23 07:50:10.000000000 -0500
-+++ pulseaudio-11.1/src/modules/module-console-kit.c 2018-02-28 11:01:50.138465311 -0600
-@@ -120,6 +120,19 @@ static void add_session(struct userdata
-
- 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 -up pulseaudio-11.1/src/modules/module-systemd-login.c.foo pulseaudio-11.1/src/modules/module-systemd-login.c
---- pulseaudio-11.1/src/modules/module-systemd-login.c.foo 2018-02-28 11:01:50.138465311 -0600
-+++ pulseaudio-11.1/src/modules/module-systemd-login.c 2018-02-28 11:03:06.053396460 -0600
-@@ -86,6 +86,20 @@ static int add_session(struct userdata *
- 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 -up pulseaudio-11.1/src/modules/x11/module-x11-xsmp.c.foo pulseaudio-11.1/src/modules/x11/module-x11-xsmp.c
---- pulseaudio-11.1/src/modules/x11/module-x11-xsmp.c.foo 2016-08-23 07:50:10.000000000 -0500
-+++ pulseaudio-11.1/src/modules/x11/module-x11-xsmp.c 2018-02-28 11:01:50.138465311 -0600
-@@ -208,6 +208,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 -up pulseaudio-11.1/src/pulsecore/core.c.foo pulseaudio-11.1/src/pulsecore/core.c
---- pulseaudio-11.1/src/pulsecore/core.c.foo 2018-02-28 11:01:50.137465298 -0600
-+++ pulseaudio-11.1/src/pulsecore/core.c 2018-02-28 11:01:50.139465323 -0600
-@@ -426,6 +426,16 @@ void pa_core_update_default_source(pa_co
- 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 -up pulseaudio-11.1/src/pulsecore/core.h.foo pulseaudio-11.1/src/pulsecore/core.h
---- pulseaudio-11.1/src/pulsecore/core.h.foo 2018-02-28 11:01:50.120465090 -0600
-+++ pulseaudio-11.1/src/pulsecore/core.h 2018-02-28 11:01:50.139465323 -0600
-@@ -255,6 +255,8 @@ void pa_core_set_configured_default_sour
- 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);
-
diff --git a/pulseaudio.spec b/pulseaudio.spec
index 974673b..f5cac76 100644
--- a/pulseaudio.spec
+++ b/pulseaudio.spec
@@ -39,7 +39,7 @@
Name: pulseaudio
Summary: Improved Linux Sound Server
Version: %{pa_major}%{?pa_minor:.%{pa_minor}}
-Release: 1%{?snap:.%{snap}git%{shortcommit}}%{?dist}
+Release: 2%{?snap:.%{snap}git%{shortcommit}}%{?dist}
License: LGPLv2+
URL: http://www.freedesktop.org/wiki/Software/PulseAudio
%if 0%{?gitrel}
@@ -64,15 +64,17 @@ Patch201: pulseaudio-autostart.patch
# https://bugzilla.redhat.com/show_bug.cgi?id=1265267
Patch202: pulseaudio-9.0-disable_flat_volumes.patch
-# upstreamed exit_idle_time solution, set to 0 in managed environments
-Patch204: pulseaudio-11.1-exit_idle_time-2.patch
-
# disable autospawn
Patch206: pulseaudio-11.1-autospawn_disable.patch
## upstream patches
+Patch8: 0008-set-exit_idle_time-to-0-when-we-detect-a-session.patch
## upstreamable patches
+# candidate fix for
+#https://bugzilla.redhat.com/show_bug.cgi?id=1594596
+#https://bugs.freedesktop.org/show_bug.cgi?id=107044
+Patch100: switch-on-port-available-ignore-bluetooth-cards.patch
BuildRequires: automake libtool
BuildRequires: gcc-c++
@@ -272,12 +274,13 @@ This package contains GDM integration hooks for the PulseAudio sound server.
%setup -q -T -b0 -n %{name}-%{version}%{?gitrel:-%{gitrel}-g%{shortcommit}}
## upstream patches
+%patch8 -p1 -b .0008
## upstreamable patches
+%patch100 -p1 -b .switch-on-port-available-ignore-bluetooth-cards
%patch201 -p1 -b .autostart
%patch202 -p1 -b .disable_flat_volumes
-%patch204 -p1 -b .exit_idle_time
%if 0%{?systemd_activation}
%patch206 -p1 -b .autospawn_disable
%endif
@@ -672,6 +675,10 @@ exit 0
%changelog
+* Sun Jul 01 2018 Rex Dieter - 12.0-2
+- switch-on-port-available-ignore-bluetooth-cards.patch (#1594596, fdo#107044)
+- use upstreamed exit-idle-time.patch
+
* Thu Jun 21 2018 Rex Dieter - 12.0-1
- pulseaudio-12.0 is available (#1593489)
- -libs: use %%license
diff --git a/switch-on-port-available-ignore-bluetooth-cards.patch b/switch-on-port-available-ignore-bluetooth-cards.patch
new file mode 100644
index 0000000..08f97cf
--- /dev/null
+++ b/switch-on-port-available-ignore-bluetooth-cards.patch
@@ -0,0 +1,43 @@
+From patchwork Fri Jun 29 11:33:44 2018
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: switch-on-port-available: ignore bluetooth cards
+From: Tanu Kaskinen
+X-Patchwork-Id: 233880
+Message-Id: <20180629113344.31555-1-tanuk@iki.fi>
+To: pulseaudio-discuss@lists.freedesktop.org
+Date: Fri, 29 Jun 2018 14:33:44 +0300
+
+When the user manually switches the profile of a bluetooth headset from
+"off" to "a2dp_sink", the port availability changes from "unknown" to
+"yes", which triggered a recursive profile change in
+module-switch-on-port-available. Such recursivity isn't (and possibly
+can't) be handled well (that is, PulseAudio crashed), so let's avoid
+doing bluetooth profile changes from module-switch-on-port-available
+(they're useless anyway).
+
+Bug link: https://bugs.freedesktop.org/show_bug.cgi?id=107044
+---
+ src/modules/module-switch-on-port-available.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/src/modules/module-switch-on-port-available.c b/src/modules/module-switch-on-port-available.c
+index 8fd3c9e5f..321db361f 100644
+--- a/src/modules/module-switch-on-port-available.c
++++ b/src/modules/module-switch-on-port-available.c
+@@ -281,6 +281,14 @@ static pa_hook_result_t port_available_hook_callback(pa_core *c, pa_device_port
+ return PA_HOOK_OK;
+ }
+
++ /* Our profile switching logic caused trouble with bluetooth headsets (see
++ * https://bugs.freedesktop.org/show_bug.cgi?id=107044) and
++ * module-bluetooth-policy takes care of automatic profile switching
++ * anyway, so we ignore bluetooth cards in
++ * module-switch-on-port-available. */
++ if (pa_safe_streq(pa_proplist_gets(port->card->proplist, PA_PROP_DEVICE_BUS), "bluetooth"))
++ return PA_HOOK_OK;
++
+ switch (port->available) {
+ case PA_AVAILABLE_YES:
+ switch_to_port(port);