commit c6b17e39cf56fabc91d42565da5e85113e443718
Author: CentOS Sources
Date: Fri Aug 2 14:49:06 2019 -0400
import pulseaudio-11.1-22.el8
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..527e24f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+SOURCES/pulseaudio-11.1.tar.xz
diff --git a/.pulseaudio.metadata b/.pulseaudio.metadata
new file mode 100644
index 0000000..70ef86f
--- /dev/null
+++ b/.pulseaudio.metadata
@@ -0,0 +1 @@
+53bde72b6bfe715c19b1519db8845f7a58346b67 SOURCES/pulseaudio-11.1.tar.xz
diff --git a/SOURCES/0001-qpaeq-fix-Qt5-mainloop-use.patch b/SOURCES/0001-qpaeq-fix-Qt5-mainloop-use.patch
new file mode 100644
index 0000000..7e0e02f
--- /dev/null
+++ b/SOURCES/0001-qpaeq-fix-Qt5-mainloop-use.patch
@@ -0,0 +1,35 @@
+From ba2b748d40f78b9d9f945b5422ca74d05f8d0d07 Mon Sep 17 00:00:00 2001
+From: Felipe Sateler
+Date: Wed, 11 Apr 2018 15:26:19 +0300
+Subject: [PATCH] qpaeq: fix Qt5 mainloop use
+
+This change was missed in the Qt4 -> Qt5 conversion.
+---
+ src/utils/qpaeq | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/utils/qpaeq b/src/utils/qpaeq
+index 651d3a4e9..53b0ca3e3 100755
+--- a/src/utils/qpaeq
++++ b/src/utils/qpaeq
+@@ -20,7 +20,7 @@ import os,math,sys
+ try:
+ import PyQt5,sip
+ from PyQt5 import QtWidgets,QtCore
+- import dbus.mainloop.qt
++ import dbus.mainloop.pyqt5
+ import dbus
+ except ImportError as e:
+ sys.stderr.write('There was an error importing needed libraries\n'
+@@ -565,7 +565,7 @@ def subdivide(xs, t_points):
+ return left+right
+
+ def main():
+- dbus.mainloop.qt.DBusQtMainLoop(set_as_default=True)
++ dbus.mainloop.pyqt5.DBusQtMainLoop(set_as_default=True)
+ app=QtWidgets.QApplication(sys.argv)
+ qpaeq_main=QPaeq()
+ qpaeq_main.show()
+--
+2.17.1
+
diff --git a/SOURCES/0004-alsa-mixer-Add-support-for-usb-audio-in-the-Dell-doc.patch b/SOURCES/0004-alsa-mixer-Add-support-for-usb-audio-in-the-Dell-doc.patch
new file mode 100644
index 0000000..1d83034
--- /dev/null
+++ b/SOURCES/0004-alsa-mixer-Add-support-for-usb-audio-in-the-Dell-doc.patch
@@ -0,0 +1,96 @@
+From 60c0edd5286dbb731c671ad3e6886c1e3e1eb067 Mon Sep 17 00:00:00 2001
+From: Hui Wang
+Date: Fri, 26 May 2017 15:42:40 +0800
+Subject: [PATCH 04/48] alsa-mixer: Add support for usb audio in the Dell dock
+ TB16
+
+There are one headset jack on the front panel of TB16, through this
+jack, we have one stereo headphone output (hw:%f,0,0) and one mono
+headset-mic input (hw:%f,0,0); and there is one speaker output jack
+(hw:%f,1,0) on the rear panel of TB16.
+
+The detail information of the Dell dock TB16:
+http://www.dell.com/support/article/sg/en/sgbsdt1/SLN301105
+
+Signed-off-by: Hui Wang
+---
+ .../alsa/mixer/profile-sets/90-pulseaudio.rules | 1 +
+ .../profile-sets/dell-dock-tb16-usb-audio.conf | 55 ++++++++++++++++++++++
+ 2 files changed, 56 insertions(+)
+ create mode 100644 src/modules/alsa/mixer/profile-sets/dell-dock-tb16-usb-audio.conf
+
+diff --git a/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules b/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules
+index 70e34e6f..805a05b2 100644
+--- a/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules
++++ b/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules
+@@ -98,5 +98,6 @@ ATTRS{idVendor}=="17cc", ATTRS{idProduct}=="1021", ENV{PULSE_PROFILE_SET}="nativ
+ ATTRS{idVendor}=="0763", ATTRS{idProduct}=="2012", ENV{PULSE_PROFILE_SET}="maudio-fasttrack-pro.conf"
+ ATTRS{idVendor}=="045e", ATTRS{idProduct}=="02bb", ENV{PULSE_PROFILE_SET}="kinect-audio.conf"
+ ATTRS{idVendor}=="041e", ATTRS{idProduct}=="322c", ENV{PULSE_PROFILE_SET}="sb-omni-surround-5.1.conf"
++ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="4014", ENV{PULSE_PROFILE_SET}="dell-dock-tb16-usb-audio.conf"
+
+ LABEL="pulseaudio_end"
+diff --git a/src/modules/alsa/mixer/profile-sets/dell-dock-tb16-usb-audio.conf b/src/modules/alsa/mixer/profile-sets/dell-dock-tb16-usb-audio.conf
+new file mode 100644
+index 00000000..11865524
+--- /dev/null
++++ b/src/modules/alsa/mixer/profile-sets/dell-dock-tb16-usb-audio.conf
+@@ -0,0 +1,55 @@
++# This file is part of PulseAudio.
++#
++# PulseAudio is free software; you can redistribute it and/or modify
++# it under the terms of the GNU Lesser General Public License as
++# published by the Free Software Foundation; either version 2.1 of the
++# License, or (at your option) any later version.
++#
++# PulseAudio is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# General Public License for more details.
++#
++# You should have received a copy of the GNU Lesser General Public License
++# along with PulseAudio; if not, see .
++
++; Dell Dock TB16 USB audio
++;
++; This card has two stereo pairs of output, One Mono input.
++;
++; See default.conf for an explanation on the directives used here.
++
++[General]
++auto-profiles = no
++
++[Mapping analog-stereo-headphone]
++description = Headphone
++device-strings = hw:%f,0,0
++channel-map = left,right
++direction = output
++
++[Mapping analog-stereo-speaker]
++description = Speaker
++device-strings = hw:%f,1,0
++channel-map = left,right
++direction = output
++
++[Mapping analog-stereo-mic]
++description = Headset-Mic
++device-strings = hw:%f,0,0
++channel-map = left,right
++direction = input
++
++
++[Profile output:analog-stereo-speaker]
++description = Speaker
++output-mappings = analog-stereo-speaker
++priority = 60
++skip-probe = yes
++
++[Profile output:analog-stereo-headphone+input:analog-stereo-mic]
++description = Headset
++output-mappings = analog-stereo-headphone
++input-mappings = analog-stereo-mic
++priority = 80
++skip-probe = yes
+--
+2.13.6
+
diff --git a/SOURCES/0009-alsa-mixer-set-PCM-Capture-Source-for-iec958-input.patch b/SOURCES/0009-alsa-mixer-set-PCM-Capture-Source-for-iec958-input.patch
new file mode 100644
index 0000000..4689456
--- /dev/null
+++ b/SOURCES/0009-alsa-mixer-set-PCM-Capture-Source-for-iec958-input.patch
@@ -0,0 +1,48 @@
+From ec325304cdca5e2a46f5a84f93c8b614a204d87f Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen
+Date: Fri, 4 Aug 2017 11:14:43 +0300
+Subject: [PATCH 09/48] alsa-mixer: set PCM Capture Source for iec958 input
+
+It was reported that on a certain USB card, identified as
+"0d8c:0102 C-Media Electronics, Inc. CM106 Like Sound Device",
+the "PCM Capture Source" element had to be set to "IEC958 In" before
+the iec958 input would work.
+
+The iec958-stereo-input.conf file didn't exist before, although the path
+was referenced in the default.conf profile configuration file.
+
+BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=101973
+---
+ .../alsa/mixer/paths/iec958-stereo-input.conf | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+ create mode 100644 src/modules/alsa/mixer/paths/iec958-stereo-input.conf
+
+diff --git a/src/modules/alsa/mixer/paths/iec958-stereo-input.conf b/src/modules/alsa/mixer/paths/iec958-stereo-input.conf
+new file mode 100644
+index 00000000..babc8398
+--- /dev/null
++++ b/src/modules/alsa/mixer/paths/iec958-stereo-input.conf
+@@ -0,0 +1,20 @@
++# This file is part of PulseAudio.
++#
++# PulseAudio is free software; you can redistribute it and/or modify
++# it under the terms of the GNU Lesser General Public License as
++# published by the Free Software Foundation; either version 2.1 of the
++# License, or (at your option) any later version.
++#
++# PulseAudio is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# General Public License for more details.
++#
++# You should have received a copy of the GNU Lesser General Public License
++# along with PulseAudio; if not, see .
++
++[Element PCM Capture Source]
++enumeration = select
++
++[Option PCM Capture Source:IEC958 In]
++name = iec958-input
+--
+2.13.6
+
diff --git a/SOURCES/0010-build-sys-add-iec958-stereo-input.conf-to-dist_alsap.patch b/SOURCES/0010-build-sys-add-iec958-stereo-input.conf-to-dist_alsap.patch
new file mode 100644
index 0000000..3238bd5
--- /dev/null
+++ b/SOURCES/0010-build-sys-add-iec958-stereo-input.conf-to-dist_alsap.patch
@@ -0,0 +1,25 @@
+From 4e6d9e321400cbb660b4373db6b50bea71707641 Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen
+Date: Fri, 4 Aug 2017 16:43:02 +0300
+Subject: [PATCH 10/48] build-sys: add iec958-stereo-input.conf to
+ dist_alsapaths_DATA
+
+---
+ src/Makefile.am | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/Makefile.am b/src/Makefile.am
+index 3ff1139f..1d974037 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -1343,6 +1343,7 @@ dist_alsapaths_DATA = \
+ modules/alsa/mixer/paths/analog-output-headphones-2.conf \
+ modules/alsa/mixer/paths/analog-output-lineout.conf \
+ modules/alsa/mixer/paths/analog-output-mono.conf \
++ modules/alsa/mixer/paths/iec958-stereo-input.conf \
+ modules/alsa/mixer/paths/iec958-stereo-output.conf \
+ modules/alsa/mixer/paths/hdmi-output-0.conf \
+ modules/alsa/mixer/paths/hdmi-output-1.conf \
+--
+2.13.6
+
diff --git a/SOURCES/0015-alsa-mixer-round-not-truncate-in-to_alsa_dB.patch b/SOURCES/0015-alsa-mixer-round-not-truncate-in-to_alsa_dB.patch
new file mode 100644
index 0000000..45fff8c
--- /dev/null
+++ b/SOURCES/0015-alsa-mixer-round-not-truncate-in-to_alsa_dB.patch
@@ -0,0 +1,45 @@
+From 739a4b3d2318f05eb7101c2baa861e5c636125a5 Mon Sep 17 00:00:00 2001
+From: Ian Ray
+Date: Wed, 30 Aug 2017 11:09:48 +0300
+Subject: [PATCH 15/48] alsa-mixer: round, not truncate, in to_alsa_dB
+
+to_alsa_dB() returns a result rounded to two decimal places (instead of
+using integer truncation) to avoid small errors when converting between
+dB and volume.
+
+Consider playback at -22 dB (which is supported by ALSA) but results in
+the higher level of -21 dB plus software attenuation.
+
+ pa_sw_volume_from_dB(-22) = 28172
+ pa_sw_volume_to_dB(28172) = -21.9997351
+ to_alsa_dB(-21.9997351) = -2199
+
+ ALSA value 106 = -2200
+ ALSA value 107 = -2100
+ ...
+
+ rounding = +1 /* "accurate or first above" */
+ snd_mixer_selem_ask_playback_dB_vol(me, -2199, rounding, &alsa_val)
+ alsa_val = -2100
+
+Signed-off-by: Ian Ray
+---
+ src/modules/alsa/alsa-mixer.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
+index f59cad39..aeaf12c4 100644
+--- a/src/modules/alsa/alsa-mixer.c
++++ b/src/modules/alsa/alsa-mixer.c
+@@ -700,7 +700,7 @@ void pa_alsa_path_set_free(pa_alsa_path_set *ps) {
+ }
+
+ static long to_alsa_dB(pa_volume_t v) {
+- return (long) (pa_sw_volume_to_dB(v) * 100.0);
++ return lround(pa_sw_volume_to_dB(v) * 100.0);
+ }
+
+ static pa_volume_t from_alsa_dB(long v) {
+--
+2.13.6
+
diff --git a/SOURCES/0016-alsa-mixer-add-support-for-Steelseries-Arctis-7-head.patch b/SOURCES/0016-alsa-mixer-add-support-for-Steelseries-Arctis-7-head.patch
new file mode 100644
index 0000000..55e65b8
--- /dev/null
+++ b/SOURCES/0016-alsa-mixer-add-support-for-Steelseries-Arctis-7-head.patch
@@ -0,0 +1,193 @@
+From 15386a710c1500f70085a6312fb4d84be4d254c9 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Johan=20Heikkil=C3=A4?=
+Date: Sun, 27 Aug 2017 16:29:37 +0300
+Subject: [PATCH 16/48] alsa-mixer: add support for Steelseries Arctis 7
+ headset
+
+---
+ src/modules/alsa/alsa-mixer.c | 1 +
+ .../alsa/mixer/paths/steelseries-arctis-input.conf | 25 +++++++++++++
+ .../paths/steelseries-arctis-output-mono.conf | 29 +++++++++++++++
+ .../paths/steelseries-arctis-output-stereo.conf | 27 ++++++++++++++
+ .../alsa/mixer/profile-sets/90-pulseaudio.rules | 1 +
+ .../profile-sets/steelseries-arctis-usb-audio.conf | 43 ++++++++++++++++++++++
+ 6 files changed, 126 insertions(+)
+ create mode 100644 src/modules/alsa/mixer/paths/steelseries-arctis-input.conf
+ create mode 100644 src/modules/alsa/mixer/paths/steelseries-arctis-output-mono.conf
+ create mode 100644 src/modules/alsa/mixer/paths/steelseries-arctis-output-stereo.conf
+ create mode 100644 src/modules/alsa/mixer/profile-sets/steelseries-arctis-usb-audio.conf
+
+diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
+index aeaf12c4..08ea45d3 100644
+--- a/src/modules/alsa/alsa-mixer.c
++++ b/src/modules/alsa/alsa-mixer.c
+@@ -2469,6 +2469,7 @@ static int path_verify(pa_alsa_path *p) {
+ { "analog-input-video", N_("Video") },
+ { "analog-output", N_("Analog Output") },
+ { "analog-output-headphones", N_("Headphones") },
++ { "analog-output-headphones-mono", N_("Headphones Mono Output") },
+ { "analog-output-lfe-on-mono", N_("LFE on Separate Mono Output") },
+ { "analog-output-lineout", N_("Line Out") },
+ { "analog-output-mono", N_("Analog Mono Output") },
+diff --git a/src/modules/alsa/mixer/paths/steelseries-arctis-input.conf b/src/modules/alsa/mixer/paths/steelseries-arctis-input.conf
+new file mode 100644
+index 00000000..f3115ba6
+--- /dev/null
++++ b/src/modules/alsa/mixer/paths/steelseries-arctis-input.conf
+@@ -0,0 +1,25 @@
++# This file is part of PulseAudio.
++#
++# PulseAudio is free software; you can redistribute it and/or modify
++# it under the terms of the GNU Lesser General Public License as
++# published by the Free Software Foundation; either version 2.1 of the
++# License, or (at your option) any later version.
++#
++# PulseAudio is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# General Public License for more details.
++#
++# You should have received a copy of the GNU Lesser General Public License
++# along with PulseAudio; if not, see .
++
++; Steelseries Arctis 7 USB headset microphone path.
++
++[General]
++description-key = analog-input-microphone-headset
++
++[Element Headset]
++volume = merge
++switch = mute
++override-map.1 = all
++override-map.2 = all-left,all-right
+diff --git a/src/modules/alsa/mixer/paths/steelseries-arctis-output-mono.conf b/src/modules/alsa/mixer/paths/steelseries-arctis-output-mono.conf
+new file mode 100644
+index 00000000..67950618
+--- /dev/null
++++ b/src/modules/alsa/mixer/paths/steelseries-arctis-output-mono.conf
+@@ -0,0 +1,29 @@
++# This file is part of PulseAudio.
++#
++# PulseAudio is free software; you can redistribute it and/or modify
++# it under the terms of the GNU Lesser General Public License as
++# published by the Free Software Foundation; either version 2.1 of the
++# License, or (at your option) any later version.
++#
++# PulseAudio is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# General Public License for more details.
++#
++# You should have received a copy of the GNU Lesser General Public License
++# along with PulseAudio; if not, see .
++
++; Steelseries Arctis 7 USB headset mono output path. The headset has two
++; output devices. The first one is mono, meant for voice audio, and the
++; second one is stereo, meant for everything else. The purpose of this
++; unusual design is to provide separate volume controls for voice and
++; other audio, which can be useful in gaming.
++
++[General]
++description-key = analog-output-headphones-mono
++
++[Element PCM]
++volume = merge
++switch = mute
++override-map.1 = all
++override-map.2 = all-left,all-right
+diff --git a/src/modules/alsa/mixer/paths/steelseries-arctis-output-stereo.conf b/src/modules/alsa/mixer/paths/steelseries-arctis-output-stereo.conf
+new file mode 100644
+index 00000000..4e10c800
+--- /dev/null
++++ b/src/modules/alsa/mixer/paths/steelseries-arctis-output-stereo.conf
+@@ -0,0 +1,27 @@
++# This file is part of PulseAudio.
++#
++# PulseAudio is free software; you can redistribute it and/or modify
++# it under the terms of the GNU Lesser General Public License as
++# published by the Free Software Foundation; either version 2.1 of the
++# License, or (at your option) any later version.
++#
++# PulseAudio is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# General Public License for more details.
++#
++# You should have received a copy of the GNU Lesser General Public License
++# along with PulseAudio; if not, see .
++
++; Steelseries Arctis 7 USB headset stereo output path. The headset has two
++; output devices. The first one is mono, meant for voice audio, and the
++; second one is stereo, meant for everything else. The purpose of this
++; unusual design is to provide separate volume controls for voice and
++; other audio, which can be useful in gaming.
++;
++; This path doesn't provide hardware volume control, because the stereo
++; output is controlled by the PCM element with index 1, and currently
++; PulseAudio only supports elements with index 0.
++
++[General]
++description-key = analog-output-headphones
+diff --git a/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules b/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules
+index 805a05b2..2392ca50 100644
+--- a/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules
++++ b/src/modules/alsa/mixer/profile-sets/90-pulseaudio.rules
+@@ -99,5 +99,6 @@ ATTRS{idVendor}=="0763", ATTRS{idProduct}=="2012", ENV{PULSE_PROFILE_SET}="maudi
+ ATTRS{idVendor}=="045e", ATTRS{idProduct}=="02bb", ENV{PULSE_PROFILE_SET}="kinect-audio.conf"
+ ATTRS{idVendor}=="041e", ATTRS{idProduct}=="322c", ENV{PULSE_PROFILE_SET}="sb-omni-surround-5.1.conf"
+ ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="4014", ENV{PULSE_PROFILE_SET}="dell-dock-tb16-usb-audio.conf"
++ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1260", ENV{PULSE_PROFILE_SET}="steelseries-arctis-usb-audio.conf"
+
+ LABEL="pulseaudio_end"
+diff --git a/src/modules/alsa/mixer/profile-sets/steelseries-arctis-usb-audio.conf b/src/modules/alsa/mixer/profile-sets/steelseries-arctis-usb-audio.conf
+new file mode 100644
+index 00000000..d3563a16
+--- /dev/null
++++ b/src/modules/alsa/mixer/profile-sets/steelseries-arctis-usb-audio.conf
+@@ -0,0 +1,43 @@
++# This file is part of PulseAudio.
++#
++# PulseAudio is free software; you can redistribute it and/or modify
++# it under the terms of the GNU Lesser General Public License as
++# published by the Free Software Foundation; either version 2.1 of the
++# License, or (at your option) any later version.
++#
++# PulseAudio is distributed in the hope that it will be useful, but
++# WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++# General Public License for more details.
++#
++# You should have received a copy of the GNU Lesser General Public License
++# along with PulseAudio; if not, see .
++
++; Steelseries Arctis 7 USB headset. The headset has a microphone and two output
++; devices. The first output device is mono, meant for voice audio, and the
++; second one is stereo, meant for everything else. The purpose of this unusual
++; design is to provide separate volume controls for voice and other audio,
++; which can be useful in gaming.
++;
++; See default.conf for an explanation on the directives used here.
++
++[General]
++auto-profiles = yes
++
++[Mapping analog-mono]
++device-strings = hw:%f,0,0
++channel-map = mono
++paths-output = steelseries-arctis-output-mono
++paths-input = steelseries-arctis-input
++
++[Mapping analog-stereo]
++device-strings = hw:%f,1,0
++channel-map = left,right
++paths-output = steelseries-arctis-output-stereo
++direction = output
++
++[Profile output:analog-mono+output:analog-stereo+input:analog-mono]
++output-mappings = analog-mono analog-stereo
++input-mappings = analog-mono
++priority = 5100
++skip-probe = yes
+--
+2.13.6
+
diff --git a/SOURCES/0018-build-sys-add-the-Arctis-configuration.patch b/SOURCES/0018-build-sys-add-the-Arctis-configuration.patch
new file mode 100644
index 0000000..948aa38
--- /dev/null
+++ b/SOURCES/0018-build-sys-add-the-Arctis-configuration.patch
@@ -0,0 +1,38 @@
+From c7fe78c9f73ded2c3428666722ec9c1af4b82812 Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen
+Date: Sat, 2 Sep 2017 18:23:12 +0300
+Subject: [PATCH 18/48] build-sys: add the Arctis configuration
+
+---
+ src/Makefile.am | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/src/Makefile.am b/src/Makefile.am
+index 1d974037..ba2ea97e 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -1310,7 +1310,8 @@ dist_alsaprofilesets_DATA = \
+ modules/alsa/mixer/profile-sets/native-instruments-traktorkontrol-s4.conf \
+ modules/alsa/mixer/profile-sets/native-instruments-korecontroller.conf \
+ modules/alsa/mixer/profile-sets/kinect-audio.conf \
+- modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf
++ modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf \
++ modules/alsa/mixer/profile-sets/steelseries-arctis-usb-audio.conf
+
+ if HAVE_UDEV
+ dist_udevrules_DATA = \
+@@ -1352,7 +1353,10 @@ dist_alsapaths_DATA = \
+ modules/alsa/mixer/paths/hdmi-output-4.conf \
+ modules/alsa/mixer/paths/hdmi-output-5.conf \
+ modules/alsa/mixer/paths/hdmi-output-6.conf \
+- modules/alsa/mixer/paths/hdmi-output-7.conf
++ modules/alsa/mixer/paths/hdmi-output-7.conf \
++ modules/alsa/mixer/paths/steelseries-arctis-input.conf \
++ modules/alsa/mixer/paths/steelseries-arctis-output-mono.conf \
++ modules/alsa/mixer/paths/steelseries-arctis-output-stereo.conf
+
+ endif
+
+--
+2.13.6
+
diff --git a/SOURCES/0033-qpaeq-change-license-from-AGPL-to-LGPL-v2.1.patch b/SOURCES/0033-qpaeq-change-license-from-AGPL-to-LGPL-v2.1.patch
new file mode 100644
index 0000000..5e4b46e
--- /dev/null
+++ b/SOURCES/0033-qpaeq-change-license-from-AGPL-to-LGPL-v2.1.patch
@@ -0,0 +1,740 @@
+From 61217528a1cb5043ca3fa1051a73ad3268cfb3d8 Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen
+Date: Tue, 19 Sep 2017 17:25:47 +0300
+Subject: [PATCH 033/106] qpaeq: change license from AGPL to LGPL v2.1
+
+This removes one unnecessary exception in the PulseAudio licensing
+terms. In December 2016 I asked permission from all qpaeq contributors
+for the license change, and all gave the permission. I have archived the
+emails here:
+https://www.freedesktop.org/software/pulseaudio/misc/qpaeq_relicensing_emails.txt
+---
+ AGPL | 661 --------------------------------------------------------
+ LICENSE | 4 -
+ Makefile.am | 1 -
+ src/utils/qpaeq | 8 +-
+ 4 files changed, 4 insertions(+), 670 deletions(-)
+ delete mode 100644 AGPL
+
+diff --git a/AGPL b/AGPL
+deleted file mode 100644
+index dba13ed2..00000000
+--- a/AGPL
++++ /dev/null
+@@ -1,661 +0,0 @@
+- GNU AFFERO GENERAL PUBLIC LICENSE
+- Version 3, 19 November 2007
+-
+- Copyright (C) 2007 Free Software Foundation, Inc.
+- Everyone is permitted to copy and distribute verbatim copies
+- of this license document, but changing it is not allowed.
+-
+- Preamble
+-
+- The GNU Affero General Public License is a free, copyleft license for
+-software and other kinds of works, specifically designed to ensure
+-cooperation with the community in the case of network server software.
+-
+- The licenses for most software and other practical works are designed
+-to take away your freedom to share and change the works. By contrast,
+-our General Public Licenses are intended to guarantee your freedom to
+-share and change all versions of a program--to make sure it remains free
+-software for all its users.
+-
+- When we speak of free software, we are referring to freedom, not
+-price. Our General Public Licenses are designed to make sure that you
+-have the freedom to distribute copies of free software (and charge for
+-them if you wish), that you receive source code or can get it if you
+-want it, that you can change the software or use pieces of it in new
+-free programs, and that you know you can do these things.
+-
+- Developers that use our General Public Licenses protect your rights
+-with two steps: (1) assert copyright on the software, and (2) offer
+-you this License which gives you legal permission to copy, distribute
+-and/or modify the software.
+-
+- A secondary benefit of defending all users' freedom is that
+-improvements made in alternate versions of the program, if they
+-receive widespread use, become available for other developers to
+-incorporate. Many developers of free software are heartened and
+-encouraged by the resulting cooperation. However, in the case of
+-software used on network servers, this result may fail to come about.
+-The GNU General Public License permits making a modified version and
+-letting the public access it on a server without ever releasing its
+-source code to the public.
+-
+- The GNU Affero General Public License is designed specifically to
+-ensure that, in such cases, the modified source code becomes available
+-to the community. It requires the operator of a network server to
+-provide the source code of the modified version running there to the
+-users of that server. Therefore, public use of a modified version, on
+-a publicly accessible server, gives the public access to the source
+-code of the modified version.
+-
+- An older license, called the Affero General Public License and
+-published by Affero, was designed to accomplish similar goals. This is
+-a different license, not a version of the Affero GPL, but Affero has
+-released a new version of the Affero GPL which permits relicensing under
+-this license.
+-
+- The precise terms and conditions for copying, distribution and
+-modification follow.
+-
+- TERMS AND CONDITIONS
+-
+- 0. Definitions.
+-
+- "This License" refers to version 3 of the GNU Affero General Public License.
+-
+- "Copyright" also means copyright-like laws that apply to other kinds of
+-works, such as semiconductor masks.
+-
+- "The Program" refers to any copyrightable work licensed under this
+-License. Each licensee is addressed as "you". "Licensees" and
+-"recipients" may be individuals or organizations.
+-
+- To "modify" a work means to copy from or adapt all or part of the work
+-in a fashion requiring copyright permission, other than the making of an
+-exact copy. The resulting work is called a "modified version" of the
+-earlier work or a work "based on" the earlier work.
+-
+- A "covered work" means either the unmodified Program or a work based
+-on the Program.
+-
+- To "propagate" a work means to do anything with it that, without
+-permission, would make you directly or secondarily liable for
+-infringement under applicable copyright law, except executing it on a
+-computer or modifying a private copy. Propagation includes copying,
+-distribution (with or without modification), making available to the
+-public, and in some countries other activities as well.
+-
+- To "convey" a work means any kind of propagation that enables other
+-parties to make or receive copies. Mere interaction with a user through
+-a computer network, with no transfer of a copy, is not conveying.
+-
+- An interactive user interface displays "Appropriate Legal Notices"
+-to the extent that it includes a convenient and prominently visible
+-feature that (1) displays an appropriate copyright notice, and (2)
+-tells the user that there is no warranty for the work (except to the
+-extent that warranties are provided), that licensees may convey the
+-work under this License, and how to view a copy of this License. If
+-the interface presents a list of user commands or options, such as a
+-menu, a prominent item in the list meets this criterion.
+-
+- 1. Source Code.
+-
+- The "source code" for a work means the preferred form of the work
+-for making modifications to it. "Object code" means any non-source
+-form of a work.
+-
+- A "Standard Interface" means an interface that either is an official
+-standard defined by a recognized standards body, or, in the case of
+-interfaces specified for a particular programming language, one that
+-is widely used among developers working in that language.
+-
+- The "System Libraries" of an executable work include anything, other
+-than the work as a whole, that (a) is included in the normal form of
+-packaging a Major Component, but which is not part of that Major
+-Component, and (b) serves only to enable use of the work with that
+-Major Component, or to implement a Standard Interface for which an
+-implementation is available to the public in source code form. A
+-"Major Component", in this context, means a major essential component
+-(kernel, window system, and so on) of the specific operating system
+-(if any) on which the executable work runs, or a compiler used to
+-produce the work, or an object code interpreter used to run it.
+-
+- The "Corresponding Source" for a work in object code form means all
+-the source code needed to generate, install, and (for an executable
+-work) run the object code and to modify the work, including scripts to
+-control those activities. However, it does not include the work's
+-System Libraries, or general-purpose tools or generally available free
+-programs which are used unmodified in performing those activities but
+-which are not part of the work. For example, Corresponding Source
+-includes interface definition files associated with source files for
+-the work, and the source code for shared libraries and dynamically
+-linked subprograms that the work is specifically designed to require,
+-such as by intimate data communication or control flow between those
+-subprograms and other parts of the work.
+-
+- The Corresponding Source need not include anything that users
+-can regenerate automatically from other parts of the Corresponding
+-Source.
+-
+- The Corresponding Source for a work in source code form is that
+-same work.
+-
+- 2. Basic Permissions.
+-
+- All rights granted under this License are granted for the term of
+-copyright on the Program, and are irrevocable provided the stated
+-conditions are met. This License explicitly affirms your unlimited
+-permission to run the unmodified Program. The output from running a
+-covered work is covered by this License only if the output, given its
+-content, constitutes a covered work. This License acknowledges your
+-rights of fair use or other equivalent, as provided by copyright law.
+-
+- You may make, run and propagate covered works that you do not
+-convey, without conditions so long as your license otherwise remains
+-in force. You may convey covered works to others for the sole purpose
+-of having them make modifications exclusively for you, or provide you
+-with facilities for running those works, provided that you comply with
+-the terms of this License in conveying all material for which you do
+-not control copyright. Those thus making or running the covered works
+-for you must do so exclusively on your behalf, under your direction
+-and control, on terms that prohibit them from making any copies of
+-your copyrighted material outside their relationship with you.
+-
+- Conveying under any other circumstances is permitted solely under
+-the conditions stated below. Sublicensing is not allowed; section 10
+-makes it unnecessary.
+-
+- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+-
+- No covered work shall be deemed part of an effective technological
+-measure under any applicable law fulfilling obligations under article
+-11 of the WIPO copyright treaty adopted on 20 December 1996, or
+-similar laws prohibiting or restricting circumvention of such
+-measures.
+-
+- When you convey a covered work, you waive any legal power to forbid
+-circumvention of technological measures to the extent such circumvention
+-is effected by exercising rights under this License with respect to
+-the covered work, and you disclaim any intention to limit operation or
+-modification of the work as a means of enforcing, against the work's
+-users, your or third parties' legal rights to forbid circumvention of
+-technological measures.
+-
+- 4. Conveying Verbatim Copies.
+-
+- You may convey verbatim copies of the Program's source code as you
+-receive it, in any medium, provided that you conspicuously and
+-appropriately publish on each copy an appropriate copyright notice;
+-keep intact all notices stating that this License and any
+-non-permissive terms added in accord with section 7 apply to the code;
+-keep intact all notices of the absence of any warranty; and give all
+-recipients a copy of this License along with the Program.
+-
+- You may charge any price or no price for each copy that you convey,
+-and you may offer support or warranty protection for a fee.
+-
+- 5. Conveying Modified Source Versions.
+-
+- You may convey a work based on the Program, or the modifications to
+-produce it from the Program, in the form of source code under the
+-terms of section 4, provided that you also meet all of these conditions:
+-
+- a) The work must carry prominent notices stating that you modified
+- it, and giving a relevant date.
+-
+- b) The work must carry prominent notices stating that it is
+- released under this License and any conditions added under section
+- 7. This requirement modifies the requirement in section 4 to
+- "keep intact all notices".
+-
+- c) You must license the entire work, as a whole, under this
+- License to anyone who comes into possession of a copy. This
+- License will therefore apply, along with any applicable section 7
+- additional terms, to the whole of the work, and all its parts,
+- regardless of how they are packaged. This License gives no
+- permission to license the work in any other way, but it does not
+- invalidate such permission if you have separately received it.
+-
+- d) If the work has interactive user interfaces, each must display
+- Appropriate Legal Notices; however, if the Program has interactive
+- interfaces that do not display Appropriate Legal Notices, your
+- work need not make them do so.
+-
+- A compilation of a covered work with other separate and independent
+-works, which are not by their nature extensions of the covered work,
+-and which are not combined with it such as to form a larger program,
+-in or on a volume of a storage or distribution medium, is called an
+-"aggregate" if the compilation and its resulting copyright are not
+-used to limit the access or legal rights of the compilation's users
+-beyond what the individual works permit. Inclusion of a covered work
+-in an aggregate does not cause this License to apply to the other
+-parts of the aggregate.
+-
+- 6. Conveying Non-Source Forms.
+-
+- You may convey a covered work in object code form under the terms
+-of sections 4 and 5, provided that you also convey the
+-machine-readable Corresponding Source under the terms of this License,
+-in one of these ways:
+-
+- a) Convey the object code in, or embodied in, a physical product
+- (including a physical distribution medium), accompanied by the
+- Corresponding Source fixed on a durable physical medium
+- customarily used for software interchange.
+-
+- b) Convey the object code in, or embodied in, a physical product
+- (including a physical distribution medium), accompanied by a
+- written offer, valid for at least three years and valid for as
+- long as you offer spare parts or customer support for that product
+- model, to give anyone who possesses the object code either (1) a
+- copy of the Corresponding Source for all the software in the
+- product that is covered by this License, on a durable physical
+- medium customarily used for software interchange, for a price no
+- more than your reasonable cost of physically performing this
+- conveying of source, or (2) access to copy the
+- Corresponding Source from a network server at no charge.
+-
+- c) Convey individual copies of the object code with a copy of the
+- written offer to provide the Corresponding Source. This
+- alternative is allowed only occasionally and noncommercially, and
+- only if you received the object code with such an offer, in accord
+- with subsection 6b.
+-
+- d) Convey the object code by offering access from a designated
+- place (gratis or for a charge), and offer equivalent access to the
+- Corresponding Source in the same way through the same place at no
+- further charge. You need not require recipients to copy the
+- Corresponding Source along with the object code. If the place to
+- copy the object code is a network server, the Corresponding Source
+- may be on a different server (operated by you or a third party)
+- that supports equivalent copying facilities, provided you maintain
+- clear directions next to the object code saying where to find the
+- Corresponding Source. Regardless of what server hosts the
+- Corresponding Source, you remain obligated to ensure that it is
+- available for as long as needed to satisfy these requirements.
+-
+- e) Convey the object code using peer-to-peer transmission, provided
+- you inform other peers where the object code and Corresponding
+- Source of the work are being offered to the general public at no
+- charge under subsection 6d.
+-
+- A separable portion of the object code, whose source code is excluded
+-from the Corresponding Source as a System Library, need not be
+-included in conveying the object code work.
+-
+- A "User Product" is either (1) a "consumer product", which means any
+-tangible personal property which is normally used for personal, family,
+-or household purposes, or (2) anything designed or sold for incorporation
+-into a dwelling. In determining whether a product is a consumer product,
+-doubtful cases shall be resolved in favor of coverage. For a particular
+-product received by a particular user, "normally used" refers to a
+-typical or common use of that class of product, regardless of the status
+-of the particular user or of the way in which the particular user
+-actually uses, or expects or is expected to use, the product. A product
+-is a consumer product regardless of whether the product has substantial
+-commercial, industrial or non-consumer uses, unless such uses represent
+-the only significant mode of use of the product.
+-
+- "Installation Information" for a User Product means any methods,
+-procedures, authorization keys, or other information required to install
+-and execute modified versions of a covered work in that User Product from
+-a modified version of its Corresponding Source. The information must
+-suffice to ensure that the continued functioning of the modified object
+-code is in no case prevented or interfered with solely because
+-modification has been made.
+-
+- If you convey an object code work under this section in, or with, or
+-specifically for use in, a User Product, and the conveying occurs as
+-part of a transaction in which the right of possession and use of the
+-User Product is transferred to the recipient in perpetuity or for a
+-fixed term (regardless of how the transaction is characterized), the
+-Corresponding Source conveyed under this section must be accompanied
+-by the Installation Information. But this requirement does not apply
+-if neither you nor any third party retains the ability to install
+-modified object code on the User Product (for example, the work has
+-been installed in ROM).
+-
+- The requirement to provide Installation Information does not include a
+-requirement to continue to provide support service, warranty, or updates
+-for a work that has been modified or installed by the recipient, or for
+-the User Product in which it has been modified or installed. Access to a
+-network may be denied when the modification itself materially and
+-adversely affects the operation of the network or violates the rules and
+-protocols for communication across the network.
+-
+- Corresponding Source conveyed, and Installation Information provided,
+-in accord with this section must be in a format that is publicly
+-documented (and with an implementation available to the public in
+-source code form), and must require no special password or key for
+-unpacking, reading or copying.
+-
+- 7. Additional Terms.
+-
+- "Additional permissions" are terms that supplement the terms of this
+-License by making exceptions from one or more of its conditions.
+-Additional permissions that are applicable to the entire Program shall
+-be treated as though they were included in this License, to the extent
+-that they are valid under applicable law. If additional permissions
+-apply only to part of the Program, that part may be used separately
+-under those permissions, but the entire Program remains governed by
+-this License without regard to the additional permissions.
+-
+- When you convey a copy of a covered work, you may at your option
+-remove any additional permissions from that copy, or from any part of
+-it. (Additional permissions may be written to require their own
+-removal in certain cases when you modify the work.) You may place
+-additional permissions on material, added by you to a covered work,
+-for which you have or can give appropriate copyright permission.
+-
+- Notwithstanding any other provision of this License, for material you
+-add to a covered work, you may (if authorized by the copyright holders of
+-that material) supplement the terms of this License with terms:
+-
+- a) Disclaiming warranty or limiting liability differently from the
+- terms of sections 15 and 16 of this License; or
+-
+- b) Requiring preservation of specified reasonable legal notices or
+- author attributions in that material or in the Appropriate Legal
+- Notices displayed by works containing it; or
+-
+- c) Prohibiting misrepresentation of the origin of that material, or
+- requiring that modified versions of such material be marked in
+- reasonable ways as different from the original version; or
+-
+- d) Limiting the use for publicity purposes of names of licensors or
+- authors of the material; or
+-
+- e) Declining to grant rights under trademark law for use of some
+- trade names, trademarks, or service marks; or
+-
+- f) Requiring indemnification of licensors and authors of that
+- material by anyone who conveys the material (or modified versions of
+- it) with contractual assumptions of liability to the recipient, for
+- any liability that these contractual assumptions directly impose on
+- those licensors and authors.
+-
+- All other non-permissive additional terms are considered "further
+-restrictions" within the meaning of section 10. If the Program as you
+-received it, or any part of it, contains a notice stating that it is
+-governed by this License along with a term that is a further
+-restriction, you may remove that term. If a license document contains
+-a further restriction but permits relicensing or conveying under this
+-License, you may add to a covered work material governed by the terms
+-of that license document, provided that the further restriction does
+-not survive such relicensing or conveying.
+-
+- If you add terms to a covered work in accord with this section, you
+-must place, in the relevant source files, a statement of the
+-additional terms that apply to those files, or a notice indicating
+-where to find the applicable terms.
+-
+- Additional terms, permissive or non-permissive, may be stated in the
+-form of a separately written license, or stated as exceptions;
+-the above requirements apply either way.
+-
+- 8. Termination.
+-
+- You may not propagate or modify a covered work except as expressly
+-provided under this License. Any attempt otherwise to propagate or
+-modify it is void, and will automatically terminate your rights under
+-this License (including any patent licenses granted under the third
+-paragraph of section 11).
+-
+- However, if you cease all violation of this License, then your
+-license from a particular copyright holder is reinstated (a)
+-provisionally, unless and until the copyright holder explicitly and
+-finally terminates your license, and (b) permanently, if the copyright
+-holder fails to notify you of the violation by some reasonable means
+-prior to 60 days after the cessation.
+-
+- Moreover, your license from a particular copyright holder is
+-reinstated permanently if the copyright holder notifies you of the
+-violation by some reasonable means, this is the first time you have
+-received notice of violation of this License (for any work) from that
+-copyright holder, and you cure the violation prior to 30 days after
+-your receipt of the notice.
+-
+- Termination of your rights under this section does not terminate the
+-licenses of parties who have received copies or rights from you under
+-this License. If your rights have been terminated and not permanently
+-reinstated, you do not qualify to receive new licenses for the same
+-material under section 10.
+-
+- 9. Acceptance Not Required for Having Copies.
+-
+- You are not required to accept this License in order to receive or
+-run a copy of the Program. Ancillary propagation of a covered work
+-occurring solely as a consequence of using peer-to-peer transmission
+-to receive a copy likewise does not require acceptance. However,
+-nothing other than this License grants you permission to propagate or
+-modify any covered work. These actions infringe copyright if you do
+-not accept this License. Therefore, by modifying or propagating a
+-covered work, you indicate your acceptance of this License to do so.
+-
+- 10. Automatic Licensing of Downstream Recipients.
+-
+- Each time you convey a covered work, the recipient automatically
+-receives a license from the original licensors, to run, modify and
+-propagate that work, subject to this License. You are not responsible
+-for enforcing compliance by third parties with this License.
+-
+- An "entity transaction" is a transaction transferring control of an
+-organization, or substantially all assets of one, or subdividing an
+-organization, or merging organizations. If propagation of a covered
+-work results from an entity transaction, each party to that
+-transaction who receives a copy of the work also receives whatever
+-licenses to the work the party's predecessor in interest had or could
+-give under the previous paragraph, plus a right to possession of the
+-Corresponding Source of the work from the predecessor in interest, if
+-the predecessor has it or can get it with reasonable efforts.
+-
+- You may not impose any further restrictions on the exercise of the
+-rights granted or affirmed under this License. For example, you may
+-not impose a license fee, royalty, or other charge for exercise of
+-rights granted under this License, and you may not initiate litigation
+-(including a cross-claim or counterclaim in a lawsuit) alleging that
+-any patent claim is infringed by making, using, selling, offering for
+-sale, or importing the Program or any portion of it.
+-
+- 11. Patents.
+-
+- A "contributor" is a copyright holder who authorizes use under this
+-License of the Program or a work on which the Program is based. The
+-work thus licensed is called the contributor's "contributor version".
+-
+- A contributor's "essential patent claims" are all patent claims
+-owned or controlled by the contributor, whether already acquired or
+-hereafter acquired, that would be infringed by some manner, permitted
+-by this License, of making, using, or selling its contributor version,
+-but do not include claims that would be infringed only as a
+-consequence of further modification of the contributor version. For
+-purposes of this definition, "control" includes the right to grant
+-patent sublicenses in a manner consistent with the requirements of
+-this License.
+-
+- Each contributor grants you a non-exclusive, worldwide, royalty-free
+-patent license under the contributor's essential patent claims, to
+-make, use, sell, offer for sale, import and otherwise run, modify and
+-propagate the contents of its contributor version.
+-
+- In the following three paragraphs, a "patent license" is any express
+-agreement or commitment, however denominated, not to enforce a patent
+-(such as an express permission to practice a patent or covenant not to
+-sue for patent infringement). To "grant" such a patent license to a
+-party means to make such an agreement or commitment not to enforce a
+-patent against the party.
+-
+- If you convey a covered work, knowingly relying on a patent license,
+-and the Corresponding Source of the work is not available for anyone
+-to copy, free of charge and under the terms of this License, through a
+-publicly available network server or other readily accessible means,
+-then you must either (1) cause the Corresponding Source to be so
+-available, or (2) arrange to deprive yourself of the benefit of the
+-patent license for this particular work, or (3) arrange, in a manner
+-consistent with the requirements of this License, to extend the patent
+-license to downstream recipients. "Knowingly relying" means you have
+-actual knowledge that, but for the patent license, your conveying the
+-covered work in a country, or your recipient's use of the covered work
+-in a country, would infringe one or more identifiable patents in that
+-country that you have reason to believe are valid.
+-
+- If, pursuant to or in connection with a single transaction or
+-arrangement, you convey, or propagate by procuring conveyance of, a
+-covered work, and grant a patent license to some of the parties
+-receiving the covered work authorizing them to use, propagate, modify
+-or convey a specific copy of the covered work, then the patent license
+-you grant is automatically extended to all recipients of the covered
+-work and works based on it.
+-
+- A patent license is "discriminatory" if it does not include within
+-the scope of its coverage, prohibits the exercise of, or is
+-conditioned on the non-exercise of one or more of the rights that are
+-specifically granted under this License. You may not convey a covered
+-work if you are a party to an arrangement with a third party that is
+-in the business of distributing software, under which you make payment
+-to the third party based on the extent of your activity of conveying
+-the work, and under which the third party grants, to any of the
+-parties who would receive the covered work from you, a discriminatory
+-patent license (a) in connection with copies of the covered work
+-conveyed by you (or copies made from those copies), or (b) primarily
+-for and in connection with specific products or compilations that
+-contain the covered work, unless you entered into that arrangement,
+-or that patent license was granted, prior to 28 March 2007.
+-
+- Nothing in this License shall be construed as excluding or limiting
+-any implied license or other defenses to infringement that may
+-otherwise be available to you under applicable patent law.
+-
+- 12. No Surrender of Others' Freedom.
+-
+- If conditions are imposed on you (whether by court order, agreement or
+-otherwise) that contradict the conditions of this License, they do not
+-excuse you from the conditions of this License. If you cannot convey a
+-covered work so as to satisfy simultaneously your obligations under this
+-License and any other pertinent obligations, then as a consequence you may
+-not convey it at all. For example, if you agree to terms that obligate you
+-to collect a royalty for further conveying from those to whom you convey
+-the Program, the only way you could satisfy both those terms and this
+-License would be to refrain entirely from conveying the Program.
+-
+- 13. Remote Network Interaction; Use with the GNU General Public License.
+-
+- Notwithstanding any other provision of this License, if you modify the
+-Program, your modified version must prominently offer all users
+-interacting with it remotely through a computer network (if your version
+-supports such interaction) an opportunity to receive the Corresponding
+-Source of your version by providing access to the Corresponding Source
+-from a network server at no charge, through some standard or customary
+-means of facilitating copying of software. This Corresponding Source
+-shall include the Corresponding Source for any work covered by version 3
+-of the GNU General Public License that is incorporated pursuant to the
+-following paragraph.
+-
+- Notwithstanding any other provision of this License, you have
+-permission to link or combine any covered work with a work licensed
+-under version 3 of the GNU General Public License into a single
+-combined work, and to convey the resulting work. The terms of this
+-License will continue to apply to the part which is the covered work,
+-but the work with which it is combined will remain governed by version
+-3 of the GNU General Public License.
+-
+- 14. Revised Versions of this License.
+-
+- The Free Software Foundation may publish revised and/or new versions of
+-the GNU Affero General Public License from time to time. Such new versions
+-will be similar in spirit to the present version, but may differ in detail to
+-address new problems or concerns.
+-
+- Each version is given a distinguishing version number. If the
+-Program specifies that a certain numbered version of the GNU Affero General
+-Public License "or any later version" applies to it, you have the
+-option of following the terms and conditions either of that numbered
+-version or of any later version published by the Free Software
+-Foundation. If the Program does not specify a version number of the
+-GNU Affero General Public License, you may choose any version ever published
+-by the Free Software Foundation.
+-
+- If the Program specifies that a proxy can decide which future
+-versions of the GNU Affero General Public License can be used, that proxy's
+-public statement of acceptance of a version permanently authorizes you
+-to choose that version for the Program.
+-
+- Later license versions may give you additional or different
+-permissions. However, no additional obligations are imposed on any
+-author or copyright holder as a result of your choosing to follow a
+-later version.
+-
+- 15. Disclaimer of Warranty.
+-
+- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+-
+- 16. Limitation of Liability.
+-
+- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+-SUCH DAMAGES.
+-
+- 17. Interpretation of Sections 15 and 16.
+-
+- If the disclaimer of warranty and limitation of liability provided
+-above cannot be given local legal effect according to their terms,
+-reviewing courts shall apply local law that most closely approximates
+-an absolute waiver of all civil liability in connection with the
+-Program, unless a warranty or assumption of liability accompanies a
+-copy of the Program in return for a fee.
+-
+- END OF TERMS AND CONDITIONS
+-
+- How to Apply These Terms to Your New Programs
+-
+- If you develop a new program, and you want it to be of the greatest
+-possible use to the public, the best way to achieve this is to make it
+-free software which everyone can redistribute and change under these terms.
+-
+- To do so, attach the following notices to the program. It is safest
+-to attach them to the start of each source file to most effectively
+-state the exclusion of warranty; and each file should have at least
+-the "copyright" line and a pointer to where the full notice is found.
+-
+-
+- Copyright (C)
+-
+- This program is free software: you can redistribute it and/or modify
+- it under the terms of the GNU Affero General Public License as published by
+- the Free Software Foundation, either version 3 of the License, or
+- (at your option) any later version.
+-
+- This program is distributed in the hope that it will be useful,
+- but WITHOUT ANY WARRANTY; without even the implied warranty of
+- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- GNU Affero General Public License for more details.
+-
+- You should have received a copy of the GNU Affero General Public License
+- along with this program. If not, see .
+-
+-Also add information on how to contact you by electronic and paper mail.
+-
+- If your software can interact with users remotely through a computer
+-network, you should also make sure that it provides a way for users to
+-get its source. For example, if your program is a web application, its
+-interface could display a "Source" link that leads users to an archive
+-of the code. There are many ways you could offer source, and different
+-solutions will be better for different programs; see section 13 for the
+-specific requirements.
+-
+- You should also get your employer (if you work as a programmer) or school,
+-if any, to sign a "copyright disclaimer" for the program, if necessary.
+-For more information on this, and how to apply and follow the GNU AGPL, see
+-.
+diff --git a/LICENSE b/LICENSE
+index 817427ae..8dfc62ad 100644
+--- a/LICENSE
++++ b/LICENSE
+@@ -35,10 +35,6 @@ src/pulsecore/filter/LICENSE.WEBKIT for details.
+ Additionally, a more permissive Sun license is used for code that performs
+ u-law, A-law and linear PCM conversions.
+
+-The qpaeq program (src/utils/qpaeq) is licensed under the GNU Affero General
+-Public License (version 3, or any later version at your discretion). See the
+-file AGPL for details.
+-
+ While we attempt to provide a summary here, it is the ultimate responsibility of
+ the packager to ensure the components they use in their build of PulseAudio
+ meets their license requirements.
+diff --git a/Makefile.am b/Makefile.am
+index 1f460a97..9a6b42a9 100644
+--- a/Makefile.am
++++ b/Makefile.am
+@@ -16,7 +16,6 @@
+ ACLOCAL_AMFLAGS = -I m4
+
+ EXTRA_DIST = \
+- AGPL \
+ bootstrap.sh \
+ coverity/model.c \
+ git-version-gen \
+diff --git a/src/utils/qpaeq b/src/utils/qpaeq
+index ac4b9e4a..f657659d 100755
+--- a/src/utils/qpaeq
++++ b/src/utils/qpaeq
+@@ -3,16 +3,16 @@
+ # Copyright (C) 2009 Jason Newton .
+
+
+--
+2.14.3
+
diff --git a/SOURCES/0035-alsa-mixer-Prioritize-hdmi-mappings-over-iec958-mapp.patch b/SOURCES/0035-alsa-mixer-Prioritize-hdmi-mappings-over-iec958-mapp.patch
new file mode 100644
index 0000000..b2e54ba
--- /dev/null
+++ b/SOURCES/0035-alsa-mixer-Prioritize-hdmi-mappings-over-iec958-mapp.patch
@@ -0,0 +1,380 @@
+From 184c28795bb98ad14bdfcef01a475d5ba11e40d5 Mon Sep 17 00:00:00 2001
+From: Kristian Klausen
+Date: Fri, 22 Sep 2017 17:54:14 +0000
+Subject: [PATCH 35/48] alsa-mixer: Prioritize hdmi-* mappings over iec958-*
+ mappings
+
+Pulseaudio tries to pick the best profile (on startup or
+hotplugged), the best profile is the profile with the highest
+priority which isn't unavailable.
+Due to the facts that iec958 ports available status always (?)
+is unknown, and that it is generally more likely that a user use
+hdmi than iec958, lets prioritze hdmi over iec958.
+
+This patch shift the analog-* mappings +5 and hdmi-* mappings +5.
+---
+ src/modules/alsa/mixer/profile-sets/default.conf | 80 ++++++++++++------------
+ 1 file changed, 40 insertions(+), 40 deletions(-)
+
+diff --git a/src/modules/alsa/mixer/profile-sets/default.conf b/src/modules/alsa/mixer/profile-sets/default.conf
+index c360e772..f5093830 100644
+--- a/src/modules/alsa/mixer/profile-sets/default.conf
++++ b/src/modules/alsa/mixer/profile-sets/default.conf
+@@ -106,14 +106,14 @@ device-strings = hw:%f
+ channel-map = mono
+ paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2 analog-output-mono
+ paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headset-mic
+-priority = 2
++priority = 7
+
+ [Mapping analog-stereo]
+ device-strings = front:%f
+ channel-map = left,right
+ paths-output = analog-output analog-output-lineout analog-output-speaker analog-output-headphones analog-output-headphones-2
+ paths-input = analog-input-front-mic analog-input-rear-mic analog-input-internal-mic analog-input-dock-mic analog-input analog-input-mic analog-input-linein analog-input-aux analog-input-video analog-input-tvtuner analog-input-fm analog-input-mic-line analog-input-headphone-mic analog-input-headset-mic
+-priority = 10
++priority = 15
+
+ # If everything else fails, try to use hw:0 as a stereo device.
+ [Mapping stereo-fallback]
+@@ -128,35 +128,35 @@ priority = 1
+ device-strings = surround21:%f
+ channel-map = front-left,front-right,lfe
+ paths-output = analog-output analog-output-lineout analog-output-speaker
+-priority = 8
++priority = 13
+ direction = output
+
+ [Mapping analog-surround-40]
+ device-strings = surround40:%f
+ channel-map = front-left,front-right,rear-left,rear-right
+ paths-output = analog-output analog-output-lineout analog-output-speaker
+-priority = 7
++priority = 12
+ direction = output
+
+ [Mapping analog-surround-41]
+ device-strings = surround41:%f
+ channel-map = front-left,front-right,rear-left,rear-right,lfe
+ paths-output = analog-output analog-output-lineout analog-output-speaker
+-priority = 8
++priority = 13
+ direction = output
+
+ [Mapping analog-surround-50]
+ device-strings = surround50:%f
+ channel-map = front-left,front-right,rear-left,rear-right,front-center
+ paths-output = analog-output analog-output-lineout analog-output-speaker
+-priority = 7
++priority = 12
+ direction = output
+
+ [Mapping analog-surround-51]
+ device-strings = surround51:%f
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+ paths-output = analog-output analog-output-lineout analog-output-speaker
+-priority = 8
++priority = 13
+ direction = output
+
+ [Mapping analog-surround-71]
+@@ -164,7 +164,7 @@ device-strings = surround71:%f
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
+ description = Analog Surround 7.1
+ paths-output = analog-output analog-output-lineout analog-output-speaker
+-priority = 7
++priority = 12
+ direction = output
+
+ [Mapping iec958-stereo]
+@@ -200,7 +200,7 @@ description = Digital Stereo (HDMI)
+ device-strings = hdmi:%f
+ paths-output = hdmi-output-0
+ channel-map = left,right
+-priority = 4
++priority = 9
+ direction = output
+
+ [Mapping hdmi-surround]
+@@ -208,7 +208,7 @@ description = Digital Surround 5.1 (HDMI)
+ device-strings = hdmi:%f
+ paths-output = hdmi-output-0
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 3
++priority = 8
+ direction = output
+
+ [Mapping hdmi-surround71]
+@@ -216,7 +216,7 @@ description = Digital Surround 7.1 (HDMI)
+ device-strings = hdmi:%f
+ paths-output = hdmi-output-0
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
+-priority = 3
++priority = 8
+ direction = output
+
+ [Mapping hdmi-dts-surround]
+@@ -224,7 +224,7 @@ description = Digital Surround 5.1 (HDMI/DTS)
+ device-strings = dcahdmi:%f
+ paths-output = hdmi-output-0
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-stereo-extra1]
+@@ -232,7 +232,7 @@ description = Digital Stereo (HDMI 2)
+ device-strings = hdmi:%f,1
+ paths-output = hdmi-output-1
+ channel-map = left,right
+-priority = 2
++priority = 7
+ direction = output
+
+ [Mapping hdmi-surround-extra1]
+@@ -240,7 +240,7 @@ description = Digital Surround 5.1 (HDMI 2)
+ device-strings = hdmi:%f,1
+ paths-output = hdmi-output-1
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-surround71-extra1]
+@@ -248,7 +248,7 @@ description = Digital Surround 7.1 (HDMI 2)
+ device-strings = hdmi:%f,1
+ paths-output = hdmi-output-1
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-dts-surround-extra1]
+@@ -256,7 +256,7 @@ description = Digital Surround 5.1 (HDMI 2/DTS)
+ device-strings = dcahdmi:%f,1
+ paths-output = hdmi-output-1
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-stereo-extra2]
+@@ -264,7 +264,7 @@ description = Digital Stereo (HDMI 3)
+ device-strings = hdmi:%f,2
+ paths-output = hdmi-output-2
+ channel-map = left,right
+-priority = 2
++priority = 7
+ direction = output
+
+ [Mapping hdmi-surround-extra2]
+@@ -272,7 +272,7 @@ description = Digital Surround 5.1 (HDMI 3)
+ device-strings = hdmi:%f,2
+ paths-output = hdmi-output-2
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-surround71-extra2]
+@@ -280,7 +280,7 @@ description = Digital Surround 7.1 (HDMI 3)
+ device-strings = hdmi:%f,2
+ paths-output = hdmi-output-2
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-dts-surround-extra2]
+@@ -288,7 +288,7 @@ description = Digital Surround 5.1 (HDMI 3/DTS)
+ device-strings = dcahdmi:%f,2
+ paths-output = hdmi-output-2
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-stereo-extra3]
+@@ -296,7 +296,7 @@ description = Digital Stereo (HDMI 4)
+ device-strings = hdmi:%f,3
+ paths-output = hdmi-output-3
+ channel-map = left,right
+-priority = 2
++priority = 7
+ direction = output
+
+ [Mapping hdmi-surround-extra3]
+@@ -304,7 +304,7 @@ description = Digital Surround 5.1 (HDMI 4)
+ device-strings = hdmi:%f,3
+ paths-output = hdmi-output-3
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-surround71-extra3]
+@@ -312,7 +312,7 @@ description = Digital Surround 7.1 (HDMI 4)
+ device-strings = hdmi:%f,3
+ paths-output = hdmi-output-3
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-dts-surround-extra3]
+@@ -320,7 +320,7 @@ description = Digital Surround 5.1 (HDMI 4/DTS)
+ device-strings = dcahdmi:%f,3
+ paths-output = hdmi-output-3
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-stereo-extra4]
+@@ -328,7 +328,7 @@ description = Digital Stereo (HDMI 5)
+ device-strings = hdmi:%f,4
+ paths-output = hdmi-output-4
+ channel-map = left,right
+-priority = 2
++priority = 7
+ direction = output
+
+ [Mapping hdmi-surround-extra4]
+@@ -336,7 +336,7 @@ description = Digital Surround 5.1 (HDMI 5)
+ device-strings = hdmi:%f,4
+ paths-output = hdmi-output-4
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-surround71-extra4]
+@@ -344,7 +344,7 @@ description = Digital Surround 7.1 (HDMI 5)
+ device-strings = hdmi:%f,4
+ paths-output = hdmi-output-4
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-dts-surround-extra4]
+@@ -352,7 +352,7 @@ description = Digital Surround 5.1 (HDMI 5/DTS)
+ device-strings = dcahdmi:%f,4
+ paths-output = hdmi-output-4
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-stereo-extra5]
+@@ -360,7 +360,7 @@ description = Digital Stereo (HDMI 6)
+ device-strings = hdmi:%f,5
+ paths-output = hdmi-output-5
+ channel-map = left,right
+-priority = 2
++priority = 7
+ direction = output
+
+ [Mapping hdmi-surround-extra5]
+@@ -368,7 +368,7 @@ description = Digital Surround 5.1 (HDMI 6)
+ device-strings = hdmi:%f,5
+ paths-output = hdmi-output-5
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-surround71-extra5]
+@@ -376,7 +376,7 @@ description = Digital Surround 7.1 (HDMI 6)
+ device-strings = hdmi:%f,5
+ paths-output = hdmi-output-5
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-dts-surround-extra5]
+@@ -384,7 +384,7 @@ description = Digital Surround 5.1 (HDMI 6/DTS)
+ device-strings = dcahdmi:%f,5
+ paths-output = hdmi-output-5
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-stereo-extra6]
+@@ -392,7 +392,7 @@ description = Digital Stereo (HDMI 7)
+ device-strings = hdmi:%f,6
+ paths-output = hdmi-output-6
+ channel-map = left,right
+-priority = 2
++priority = 7
+ direction = output
+
+ [Mapping hdmi-surround-extra6]
+@@ -400,7 +400,7 @@ description = Digital Surround 5.1 (HDMI 7)
+ device-strings = hdmi:%f,6
+ paths-output = hdmi-output-6
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-surround71-extra6]
+@@ -408,7 +408,7 @@ description = Digital Surround 7.1 (HDMI 7)
+ device-strings = hdmi:%f,6
+ paths-output = hdmi-output-6
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-dts-surround-extra6]
+@@ -416,7 +416,7 @@ description = Digital Surround 5.1 (HDMI 7/DTS)
+ device-strings = dcahdmi:%f,6
+ paths-output = hdmi-output-6
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-stereo-extra7]
+@@ -424,7 +424,7 @@ description = Digital Stereo (HDMI 8)
+ device-strings = hdmi:%f,7
+ paths-output = hdmi-output-7
+ channel-map = left,right
+-priority = 2
++priority = 7
+ direction = output
+
+ [Mapping hdmi-surround-extra7]
+@@ -432,7 +432,7 @@ description = Digital Surround 5.1 (HDMI 8)
+ device-strings = hdmi:%f,7
+ paths-output = hdmi-output-7
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-surround71-extra7]
+@@ -440,7 +440,7 @@ description = Digital Surround 7.1 (HDMI 8)
+ device-strings = hdmi:%f,7
+ paths-output = hdmi-output-7
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe,side-left,side-right
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping hdmi-dts-surround-extra7]
+@@ -448,7 +448,7 @@ description = Digital Surround 5.1 (HDMI 8/DTS)
+ device-strings = dcahdmi:%f,7
+ paths-output = hdmi-output-7
+ channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
+-priority = 1
++priority = 6
+ direction = output
+
+ [Mapping multichannel-output]
+--
+2.13.6
+
diff --git a/SOURCES/0074-build-sys-add-the-Dell-dock-TB16-configuration.patch b/SOURCES/0074-build-sys-add-the-Dell-dock-TB16-configuration.patch
new file mode 100644
index 0000000..dd5dc96
--- /dev/null
+++ b/SOURCES/0074-build-sys-add-the-Dell-dock-TB16-configuration.patch
@@ -0,0 +1,27 @@
+From 2f1dcea363342154a1f6af7bd4ade3f87403b744 Mon Sep 17 00:00:00 2001
+From: Hui Wang
+Date: Mon, 13 Nov 2017 10:17:19 +0800
+Subject: [PATCH 74/85] build-sys: add the Dell dock TB16 configuration
+
+Signed-off-by: Hui Wang
+---
+ src/Makefile.am | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/src/Makefile.am b/src/Makefile.am
+index e610db74..03482502 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -1312,7 +1312,8 @@ dist_alsaprofilesets_DATA = \
+ modules/alsa/mixer/profile-sets/native-instruments-korecontroller.conf \
+ modules/alsa/mixer/profile-sets/kinect-audio.conf \
+ modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf \
+- modules/alsa/mixer/profile-sets/steelseries-arctis-usb-audio.conf
++ modules/alsa/mixer/profile-sets/steelseries-arctis-usb-audio.conf \
++ modules/alsa/mixer/profile-sets/dell-dock-tb16-usb-audio.conf
+
+ if HAVE_UDEV
+ dist_udevrules_DATA = \
+--
+2.14.3
+
diff --git a/SOURCES/0084-sink-source-Don-t-finish-move-if-unlink-happens-afte.patch b/SOURCES/0084-sink-source-Don-t-finish-move-if-unlink-happens-afte.patch
new file mode 100644
index 0000000..afd14bc
--- /dev/null
+++ b/SOURCES/0084-sink-source-Don-t-finish-move-if-unlink-happens-afte.patch
@@ -0,0 +1,59 @@
+From 59d264ac56d644f626251daa44ef7b39a9a9fe03 Mon Sep 17 00:00:00 2001
+From: Georg Chini
+Date: Sun, 3 Dec 2017 22:29:09 +0100
+Subject: [PATCH 84/85] sink, source: Don't finish move if unlink happens after
+ pa_*_move_all_start()
+
+When a sink input was unlinked between the calls to pa_sink_move_all_start() and
+pa_sink_move_all_finish(), pa_sink_move_all_finish() tried to finish the move
+of the already unlinked sink input, which lead to an assertion in
+pa_sink_input_finish_move(). The same applies for the source side.
+
+This patch fixes the problem by checking the state of the sink input or
+source output in pa_*_move_all_finish().
+
+Bug report: https://bugs.freedesktop.org/show_bug.cgi?id=103752
+---
+ src/pulsecore/sink.c | 6 ++++--
+ src/pulsecore/source.c | 6 ++++--
+ 2 files changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
+index 017b9539..39bf18f1 100644
+--- a/src/pulsecore/sink.c
++++ b/src/pulsecore/sink.c
+@@ -920,9 +920,11 @@ void pa_sink_move_all_finish(pa_sink *s, pa_queue *q, bool save) {
+ pa_assert(q);
+
+ while ((i = PA_SINK_INPUT(pa_queue_pop(q)))) {
+- if (pa_sink_input_finish_move(i, s, save) < 0)
+- pa_sink_input_fail_move(i);
++ if (PA_SINK_INPUT_IS_LINKED(i->state)) {
++ if (pa_sink_input_finish_move(i, s, save) < 0)
++ pa_sink_input_fail_move(i);
+
++ }
+ pa_sink_input_unref(i);
+ }
+
+diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
+index d579c357..6099c10d 100644
+--- a/src/pulsecore/source.c
++++ b/src/pulsecore/source.c
+@@ -860,9 +860,11 @@ void pa_source_move_all_finish(pa_source *s, pa_queue *q, bool save) {
+ pa_assert(q);
+
+ while ((o = PA_SOURCE_OUTPUT(pa_queue_pop(q)))) {
+- if (pa_source_output_finish_move(o, s, save) < 0)
+- pa_source_output_fail_move(o);
++ if (PA_SOURCE_OUTPUT_IS_LINKED(o->state)) {
++ if (pa_source_output_finish_move(o, s, save) < 0)
++ pa_source_output_fail_move(o);
+
++ }
+ pa_source_output_unref(o);
+ }
+
+--
+2.14.3
+
diff --git a/SOURCES/0085-client-conf-Add-a-default-value-for-disable-memfd.patch b/SOURCES/0085-client-conf-Add-a-default-value-for-disable-memfd.patch
new file mode 100644
index 0000000..e298aae
--- /dev/null
+++ b/SOURCES/0085-client-conf-Add-a-default-value-for-disable-memfd.patch
@@ -0,0 +1,25 @@
+From 2062fc8b0e69f383cfd4c4773bf8b9dcef20e035 Mon Sep 17 00:00:00 2001
+From: Arun Raghavan
+Date: Fri, 27 Oct 2017 09:29:19 +0530
+Subject: [PATCH 085/106] client-conf: Add a default value for disable-memfd
+
+This got missed while adding the client option.
+---
+ src/pulse/client-conf.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/pulse/client-conf.c b/src/pulse/client-conf.c
+index a3c9486d..1daaf911 100644
+--- a/src/pulse/client-conf.c
++++ b/src/pulse/client-conf.c
+@@ -65,6 +65,7 @@ static const pa_client_conf default_conf = {
+ .cookie_file_from_client_conf = NULL,
+ .autospawn = true,
+ .disable_shm = false,
++ .disable_memfd = false,
+ .shm_size = 0,
+ .auto_connect_localhost = false,
+ .auto_connect_display = false
+--
+2.14.3
+
diff --git a/SOURCES/0090-qpaeq-port-to-PyQt5.patch b/SOURCES/0090-qpaeq-port-to-PyQt5.patch
new file mode 100644
index 0000000..aa4495e
--- /dev/null
+++ b/SOURCES/0090-qpaeq-port-to-PyQt5.patch
@@ -0,0 +1,201 @@
+From 480e0e74f43565d7ece72141666961ae8cc2ed75 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Andrius=20=C5=A0tikonas?=
+Date: Mon, 20 Nov 2017 19:56:53 +0000
+Subject: [PATCH 090/106] qpaeq: port to PyQt5
+
+---
+ src/utils/qpaeq | 68 ++++++++++++++++++++++++++++-----------------------------
+ 1 file changed, 34 insertions(+), 34 deletions(-)
+
+diff --git a/src/utils/qpaeq b/src/utils/qpaeq
+index f657659d..651d3a4e 100755
+--- a/src/utils/qpaeq
++++ b/src/utils/qpaeq
+@@ -18,13 +18,13 @@
+
+ import os,math,sys
+ try:
+- import PyQt4,sip
+- from PyQt4 import QtGui,QtCore
++ import PyQt5,sip
++ from PyQt5 import QtWidgets,QtCore
+ import dbus.mainloop.qt
+ import dbus
+ except ImportError as e:
+ sys.stderr.write('There was an error importing needed libraries\n'
+- 'Make sure you have qt4 and dbus-python installed\n'
++ 'Make sure you have qt5 and dbus-python installed\n'
+ 'The error that occured was:\n'
+ '\t%s\n' % (str(e)))
+ sys.exit(-1)
+@@ -62,7 +62,7 @@ def connect():
+ prop_iface='org.freedesktop.DBus.Properties'
+ eq_iface='org.PulseAudio.Ext.Equalizing1.Equalizer'
+ device_iface='org.PulseAudio.Core1.Device'
+-class QPaeq(QtGui.QWidget):
++class QPaeq(QtWidgets.QWidget):
+ manager_path='/org/pulseaudio/equalizing1'
+ manager_iface='org.PulseAudio.Ext.Equalizing1.Manager'
+ core_iface='org.PulseAudio.Core1'
+@@ -70,7 +70,7 @@ class QPaeq(QtGui.QWidget):
+ module_name='module-equalizer-sink'
+
+ def __init__(self):
+- QtGui.QWidget.__init__(self)
++ QtWidgets.QWidget.__init__(self)
+ self.setWindowTitle('qpaeq')
+ self.slider_widget=None
+ self.sink_name=None
+@@ -84,50 +84,50 @@ class QPaeq(QtGui.QWidget):
+ self.setMinimumSize(self.sizeHint())
+
+ def create_layout(self):
+- self.main_layout=QtGui.QVBoxLayout()
++ self.main_layout=QtWidgets.QVBoxLayout()
+ self.setLayout(self.main_layout)
+- toprow_layout=QtGui.QHBoxLayout()
+- sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
++ toprow_layout=QtWidgets.QHBoxLayout()
++ sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
+ sizePolicy.setHorizontalStretch(0)
+ sizePolicy.setVerticalStretch(0)
+ #sizePolicy.setHeightForWidth(self.profile_box.sizePolicy().hasHeightForWidth())
+
+- toprow_layout.addWidget(QtGui.QLabel('Sink'))
+- self.sink_box = QtGui.QComboBox()
++ toprow_layout.addWidget(QtWidgets.QLabel('Sink'))
++ self.sink_box = QtWidgets.QComboBox()
+ self.sink_box.setSizePolicy(sizePolicy)
+ self.sink_box.setDuplicatesEnabled(False)
+- self.sink_box.setInsertPolicy(QtGui.QComboBox.InsertAlphabetically)
+- #self.sink_box.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
++ self.sink_box.setInsertPolicy(QtWidgets.QComboBox.InsertAlphabetically)
++ #self.sink_box.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContents)
+ toprow_layout.addWidget(self.sink_box)
+
+- toprow_layout.addWidget(QtGui.QLabel('Channel'))
+- self.channel_box = QtGui.QComboBox()
++ toprow_layout.addWidget(QtWidgets.QLabel('Channel'))
++ self.channel_box = QtWidgets.QComboBox()
+ self.channel_box.setSizePolicy(sizePolicy)
+ toprow_layout.addWidget(self.channel_box)
+
+- toprow_layout.addWidget(QtGui.QLabel('Preset'))
+- self.profile_box = QtGui.QComboBox()
++ toprow_layout.addWidget(QtWidgets.QLabel('Preset'))
++ self.profile_box = QtWidgets.QComboBox()
+ self.profile_box.setSizePolicy(sizePolicy)
+- self.profile_box.setInsertPolicy(QtGui.QComboBox.InsertAlphabetically)
+- #self.profile_box.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
++ self.profile_box.setInsertPolicy(QtWidgets.QComboBox.InsertAlphabetically)
++ #self.profile_box.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContents)
+ toprow_layout.addWidget(self.profile_box)
+
+- large_icon_size=self.style().pixelMetric(QtGui.QStyle.PM_LargeIconSize)
++ large_icon_size=self.style().pixelMetric(QtWidgets.QStyle.PM_LargeIconSize)
+ large_icon_size=QtCore.QSize(large_icon_size,large_icon_size)
+- save_profile=QtGui.QToolButton()
+- save_profile.setIcon(self.style().standardIcon(QtGui.QStyle.SP_DriveFDIcon))
++ save_profile=QtWidgets.QToolButton()
++ save_profile.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_DriveFDIcon))
+ save_profile.setIconSize(large_icon_size)
+ save_profile.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
+ save_profile.clicked.connect(self.save_profile)
+- remove_profile=QtGui.QToolButton()
+- remove_profile.setIcon(self.style().standardIcon(QtGui.QStyle.SP_TrashIcon))
++ remove_profile=QtWidgets.QToolButton()
++ remove_profile.setIcon(self.style().standardIcon(QtWidgets.QStyle.SP_TrashIcon))
+ remove_profile.setIconSize(large_icon_size)
+ remove_profile.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
+ remove_profile.clicked.connect(self.remove_profile)
+ toprow_layout.addWidget(save_profile)
+ toprow_layout.addWidget(remove_profile)
+
+- reset_button = QtGui.QPushButton('Reset')
++ reset_button = QtWidgets.QPushButton('Reset')
+ reset_button.clicked.connect(self.reset)
+ toprow_layout.addStretch()
+ toprow_layout.addWidget(reset_button)
+@@ -192,11 +192,11 @@ class QPaeq(QtGui.QWidget):
+ def save_profile(self):
+ #popup dialog box for name
+ current=self.profile_box.currentIndex()
+- profile,ok=QtGui.QInputDialog.getItem(self,'Preset Name','Preset',self.profiles,current)
++ profile,ok=QtWidgets.QInputDialog.getItem(self,'Preset Name','Preset',self.profiles,current)
+ if not ok or profile=='':
+ return
+ if profile in self.profiles:
+- mbox=QtGui.QMessageBox(self)
++ mbox=QtWidgets.QMessageBox(self)
+ mbox.setText('%s preset already exists'%(profile,))
+ mbox.setInformativeText('Do you want to save over it?')
+ mbox.setStandardButtons(mbox.Save|mbox.Discard|mbox.Cancel)
+@@ -217,7 +217,7 @@ class QPaeq(QtGui.QWidget):
+ profile=self.profile_box.itemText(x)
+ self.filter_state.load_profile(profile)
+ def select_channel(self,x):
+- self.filter_state.channel = self.channel_box.itemData(x).toPyObject()
++ self.filter_state.channel = self.channel_box.itemData(x)
+ self._set_profile_name()
+ self.filter_state.readback()
+
+@@ -295,13 +295,13 @@ class QPaeq(QtGui.QWidget):
+ self.profile_box.blockSignals(False)
+
+
+-class SliderArray(QtGui.QWidget):
++class SliderArray(QtWidgets.QWidget):
+ def __init__(self,filter_state,parent=None):
+ super(SliderArray,self).__init__(parent)
+ #self.setStyleSheet('padding: 0px; border-width: 0px; margin: 0px;')
+ #self.setStyleSheet('font-family: monospace;'+outline%('blue'))
+ self.filter_state=filter_state
+- self.setLayout(QtGui.QHBoxLayout())
++ self.setLayout(QtWidgets.QHBoxLayout())
+ self.sub_array=None
+ self.set_sub_array(SliderArraySub(self.filter_state))
+ self.inhibit_resize=0
+@@ -359,11 +359,11 @@ class SliderArray(QtGui.QWidget):
+ self.set_sub_array(SliderArraySub(self.filter_state))
+ self.inhibit_resize-=1
+
+-class SliderArraySub(QtGui.QWidget):
++class SliderArraySub(QtWidgets.QWidget):
+ def __init__(self,filter_state,parent=None):
+ super(SliderArraySub,self).__init__(parent)
+ self.filter_state=filter_state
+- self.setLayout(QtGui.QGridLayout())
++ self.setLayout(QtWidgets.QGridLayout())
+ self.slider=[None]*len(self.filter_state.frequencies)
+ self.label=[None]*len(self.slider)
+ #self.setStyleSheet('padding: 0px; border-width: 0px; margin: 0px;')
+@@ -375,7 +375,7 @@ class SliderArraySub(QtGui.QWidget):
+ self.layout().addWidget(label,1,c,qt.AlignHCenter)
+ self.layout().setColumnMinimumWidth(c,max(label.sizeHint().width(),slider.sizeHint().width()))
+ def create_slider(slider_label):
+- slider=QtGui.QSlider(QtCore.Qt.Vertical,self)
++ slider=QtWidgets.QSlider(QtCore.Qt.Vertical,self)
+ label=SliderLabel(slider_label,filter_state,self)
+ slider.setRange(-1000,2000)
+ slider.setSingleStep(1)
+@@ -461,7 +461,7 @@ class SliderArraySub(QtGui.QWidget):
+ return int((x-1.0)*1000)
+ outline='border-width: 1px; border-style: solid; border-color: %s;'
+
+-class SliderLabel(QtGui.QLabel):
++class SliderLabel(QtWidgets.QLabel):
+ clicked=QtCore.pyqtSignal()
+ def __init__(self,label_text,filter_state,parent=None):
+ super(SliderLabel,self).__init__(parent)
+@@ -566,7 +566,7 @@ def subdivide(xs, t_points):
+
+ def main():
+ dbus.mainloop.qt.DBusQtMainLoop(set_as_default=True)
+- app=QtGui.QApplication(sys.argv)
++ app=QtWidgets.QApplication(sys.argv)
+ qpaeq_main=QPaeq()
+ qpaeq_main.show()
+ sys.exit(app.exec_())
+--
+2.14.3
+
diff --git a/SOURCES/0093-alsa-fix-infinite-loop-with-Intel-HDMI-LPE.patch b/SOURCES/0093-alsa-fix-infinite-loop-with-Intel-HDMI-LPE.patch
new file mode 100644
index 0000000..ddd7abd
--- /dev/null
+++ b/SOURCES/0093-alsa-fix-infinite-loop-with-Intel-HDMI-LPE.patch
@@ -0,0 +1,142 @@
+From 94fc586c011537536cfb434376354699357af785 Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen
+Date: Thu, 28 Dec 2017 12:09:17 +0200
+Subject: [PATCH 093/106] alsa: fix infinite loop with Intel HDMI LPE
+
+The Intel HDMI LPE driver works in a peculiar way when the HDMI cable is
+not plugged in: any written audio is immediately discarded and underrun
+is reported. That resulted in an infinite loop, because PulseAudio tried
+to keep the buffer filled, which was futile since the written audio was
+immediately consumed/discarded.
+
+This patch adds special handling for the LPE driver: if the active port
+of the sink is unavailable, the sink suspends itself. A new suspend
+cause is added: PA_SUSPEND_UNAVAILABLE.
+
+BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=100488
+---
+ src/modules/alsa/alsa-mixer.h | 1 +
+ src/modules/alsa/alsa-sink.c | 22 ++++++++++++++++++++++
+ src/modules/alsa/module-alsa-card.c | 34 ++++++++++++++++++++++++++++++++++
+ src/pulsecore/core.h | 1 +
+ 4 files changed, 58 insertions(+)
+
+diff --git a/src/modules/alsa/alsa-mixer.h b/src/modules/alsa/alsa-mixer.h
+index 4ebf1922..3577f435 100644
+--- a/src/modules/alsa/alsa-mixer.h
++++ b/src/modules/alsa/alsa-mixer.h
+@@ -364,6 +364,7 @@ int pa_alsa_set_mixer_rtpoll(struct pa_alsa_mixer_pdata *pd, snd_mixer_t *mixer,
+ struct pa_alsa_port_data {
+ pa_alsa_path *path;
+ pa_alsa_setting *setting;
++ bool suspend_when_unavailable;
+ };
+
+ void pa_alsa_add_ports(void *sink_or_source_new_data, pa_alsa_path_set *ps, pa_card *card);
+diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
+index 7936cfac..a80caab2 100644
+--- a/src/modules/alsa/alsa-sink.c
++++ b/src/modules/alsa/alsa-sink.c
+@@ -1527,6 +1527,11 @@ static int sink_set_port_cb(pa_sink *s, pa_device_port *p) {
+ s->set_volume(s);
+ }
+
++ if (data->suspend_when_unavailable && p->available == PA_AVAILABLE_NO)
++ pa_sink_suspend(s, true, PA_SUSPEND_UNAVAILABLE);
++ else
++ pa_sink_suspend(s, false, PA_SUSPEND_UNAVAILABLE);
++
+ return 0;
+ }
+
+@@ -2460,6 +2465,23 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
+ if (profile_set)
+ pa_alsa_profile_set_free(profile_set);
+
++ /* Suspend if necessary. FIXME: It would be better to start suspended, but
++ * that would require some core changes. It's possible to set
++ * pa_sink_new_data.suspend_cause, but that has to be done before the
++ * pa_sink_new() call, and we know if we need to suspend only after the
++ * pa_sink_new() call when the initial port has been chosen. Calling
++ * pa_sink_suspend() between pa_sink_new() and pa_sink_put() would
++ * otherwise work, but currently pa_sink_suspend() will crash if
++ * pa_sink_put() hasn't been called. */
++ if (u->sink->active_port) {
++ pa_alsa_port_data *port_data;
++
++ port_data = PA_DEVICE_PORT_DATA(u->sink->active_port);
++
++ if (port_data->suspend_when_unavailable && u->sink->active_port->available == PA_AVAILABLE_NO)
++ pa_sink_suspend(u->sink, true, PA_SUSPEND_UNAVAILABLE);
++ }
++
+ return u->sink;
+
+ fail:
+diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c
+index 804b4f87..b193d40c 100644
+--- a/src/modules/alsa/module-alsa-card.c
++++ b/src/modules/alsa/module-alsa-card.c
+@@ -426,6 +426,22 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
+ if (tp->avail == PA_AVAILABLE_NO)
+ pa_device_port_set_available(tp->port, tp->avail);
+
++ for (tp = tports; tp->port; tp++) {
++ pa_alsa_port_data *data;
++ pa_sink *sink;
++ uint32_t idx;
++
++ data = PA_DEVICE_PORT_DATA(tp->port);
++
++ if (!data->suspend_when_unavailable)
++ continue;
++
++ PA_IDXSET_FOREACH(sink, u->core->sinks, idx) {
++ if (sink->active_port == tp->port)
++ pa_sink_suspend(sink, tp->avail == PA_AVAILABLE_NO, PA_SUSPEND_UNAVAILABLE);
++ }
++ }
++
+ /* Update profile availabilities. The logic could be improved; for now we
+ * only set obviously unavailable profiles (those that contain only
+ * unavailable ports) to PA_AVAILABLE_NO and all others to
+@@ -836,6 +852,24 @@ int pa__init(pa_module *m) {
+ goto fail;
+ }
+
++ /* The Intel HDMI LPE driver needs some special handling. When the HDMI
++ * cable is not plugged in, trying to play audio doesn't work. Any written
++ * audio is immediately discarded and an underrun is reported, and that
++ * results in an infinite loop of "fill buffer, handle underrun". To work
++ * around this issue, the suspend_when_unavailable flag is used to stop
++ * playback when the HDMI cable is unplugged. */
++ if (pa_safe_streq(pa_proplist_gets(data.proplist, "alsa.driver_name"), "snd_hdmi_lpe_audio")) {
++ pa_device_port *port;
++ void *state;
++
++ PA_HASHMAP_FOREACH(port, data.ports, state) {
++ pa_alsa_port_data *port_data;
++
++ port_data = PA_DEVICE_PORT_DATA(port);
++ port_data->suspend_when_unavailable = true;
++ }
++ }
++
+ u->card = pa_card_new(m->core, &data);
+ pa_card_new_data_done(&data);
+
+diff --git a/src/pulsecore/core.h b/src/pulsecore/core.h
+index 79a095d2..afe6c25e 100644
+--- a/src/pulsecore/core.h
++++ b/src/pulsecore/core.h
+@@ -34,6 +34,7 @@ typedef enum pa_suspend_cause {
+ PA_SUSPEND_SESSION = 8, /* Used by module-hal for mark inactive sessions */
+ PA_SUSPEND_PASSTHROUGH = 16, /* Used to suspend monitor sources when the sink is in passthrough mode */
+ PA_SUSPEND_INTERNAL = 32, /* This is used for short period server-internal suspends, such as for sample rate updates */
++ PA_SUSPEND_UNAVAILABLE = 64, /* Used by device implementations that have to suspend when the device is unavailable */
+ PA_SUSPEND_ALL = 0xFFFF /* Magic cause that can be used to resume forcibly */
+ } pa_suspend_cause_t;
+
+--
+2.14.3
+
diff --git a/SOURCES/0106-memfd-wrappers-only-define-memfd_create-if-not-alrea.patch b/SOURCES/0106-memfd-wrappers-only-define-memfd_create-if-not-alrea.patch
new file mode 100644
index 0000000..f3d3b61
--- /dev/null
+++ b/SOURCES/0106-memfd-wrappers-only-define-memfd_create-if-not-alrea.patch
@@ -0,0 +1,63 @@
+From dfb0460fb4743aec047cdf755a660a9ac2d0f3fb Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen
+Date: Wed, 24 Jan 2018 03:51:49 +0200
+Subject: [PATCH 106/106] memfd-wrappers: only define memfd_create() if not
+ already defined
+
+glibc 2.27 is to be released soon, and it will provide memfd_create().
+If glibc provides the function, we must not define it ourselves,
+otherwise building fails due to conflict between the two implementations
+of the same function.
+
+BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=104733
+---
+ configure.ac | 3 +++
+ src/pulsecore/memfd-wrappers.h | 7 ++++---
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 0084c86e..0eb44b08 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -610,6 +610,9 @@ AS_IF([test "x$enable_memfd" = "xyes" && test "x$HAVE_MEMFD" = "x0"],
+ [AC_MSG_ERROR([*** Your Linux kernel does not support memfd shared memory.
+ *** Use linux v3.17 or higher for such a feature.])])
+
++AS_IF([test "x$HAVE_MEMFD" = "x1"],
++ AC_CHECK_FUNCS([memfd_create]))
++
+ AC_SUBST(HAVE_MEMFD)
+ AM_CONDITIONAL([HAVE_MEMFD], [test "x$HAVE_MEMFD" = x1])
+ AS_IF([test "x$HAVE_MEMFD" = "x1"], AC_DEFINE([HAVE_MEMFD], 1, [Have memfd shared memory.]))
+diff --git a/src/pulsecore/memfd-wrappers.h b/src/pulsecore/memfd-wrappers.h
+index 3bed9b2b..c7aadfd3 100644
+--- a/src/pulsecore/memfd-wrappers.h
++++ b/src/pulsecore/memfd-wrappers.h
+@@ -20,13 +20,14 @@
+ License along with PulseAudio; if not, see .
+ ***/
+
+-#ifdef HAVE_MEMFD
++#if defined(HAVE_MEMFD) && !defined(HAVE_MEMFD_CREATE)
+
+ #include
+ #include
+
+ /*
+- * No glibc wrappers exist for memfd_create(2), so provide our own.
++ * Before glibc version 2.27 there was no wrapper for memfd_create(2),
++ * so we have to provide our own.
+ *
+ * Also define memfd fcntl sealing macros. While they are already
+ * defined in the kernel header file , that file as
+@@ -63,6 +64,6 @@ static inline int memfd_create(const char *name, unsigned int flags) {
+ #define F_SEAL_WRITE 0x0008 /* prevent writes */
+ #endif
+
+-#endif /* HAVE_MEMFD */
++#endif /* HAVE_MEMFD && !HAVE_MEMFD_CREATE */
+
+ #endif
+--
+2.14.3
+
diff --git a/SOURCES/Fix-Intel-HDMI-LPE-problems.patch b/SOURCES/Fix-Intel-HDMI-LPE-problems.patch
new file mode 100644
index 0000000..cb31b30
--- /dev/null
+++ b/SOURCES/Fix-Intel-HDMI-LPE-problems.patch
@@ -0,0 +1,621 @@
+From patchwork Sun Oct 8 16:48:24 2017
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [v2,1/3] alsa-mixer: add hw_device_index to pa_alsa_mapping
+From: Tanu Kaskinen
+X-Patchwork-Id: 181163
+Message-Id: <20171008164826.7588-2-tanuk@iki.fi>
+To: pulseaudio-discuss@lists.freedesktop.org
+Date: Sun, 8 Oct 2017 19:48:24 +0300
+
+We have so far assumed that HDMI always uses device indexes 3, 7, 8, 9,
+10, 11, 12 and 13. These values are hardcoded in the path configuration.
+The Intel HDMI LPE driver, however, uses different device numbering
+scheme. Since the indexes aren't always the same, we need to query the
+hw device index from ALSA.
+
+Later patches will use the queried index for HDMI jack detection and ELD
+information reading.
+
+BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=100488
+---
+ src/modules/alsa/alsa-mixer.c | 26 ++++++++++++++++++++++++++
+ src/modules/alsa/alsa-mixer.h | 4 ++++
+ 2 files changed, 30 insertions(+)
+
+diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
+index 7de1c7deb..02ab4a611 100644
+--- a/src/modules/alsa/alsa-mixer.c
++++ b/src/modules/alsa/alsa-mixer.c
+@@ -3505,6 +3505,7 @@ pa_alsa_mapping *pa_alsa_mapping_get(pa_alsa_profile_set *ps, const char *name)
+ pa_sample_spec_init(&m->sample_spec);
+ pa_channel_map_init(&m->channel_map);
+ m->proplist = pa_proplist_new();
++ m->hw_device_index = -1;
+
+ pa_hashmap_put(ps->mappings, m->name, m);
+
+@@ -4532,6 +4533,25 @@ static int add_profiles_to_probe(
+ return i;
+ }
+
++static void mapping_query_hw_device(pa_alsa_mapping *mapping, snd_pcm_t *pcm) {
++ int r;
++ snd_pcm_info_t* pcm_info;
++ snd_pcm_info_alloca(&pcm_info);
++
++ r = snd_pcm_info(pcm, pcm_info);
++ if (r < 0) {
++ pa_log("Mapping %s: snd_pcm_info() failed %s: ", mapping->name, pa_alsa_strerror(r));
++ return;
++ }
++
++ /* XXX: It's not clear what snd_pcm_info_get_device() does if the device is
++ * not backed by a hw device or if it's backed by multiple hw devices. We
++ * only use hw_device_index for HDMI devices, however, and for those the
++ * return value is expected to be always valid, so this shouldn't be a
++ * significant problem. */
++ mapping->hw_device_index = snd_pcm_info_get_device(pcm_info);
++}
++
+ void pa_alsa_profile_set_probe(
+ pa_alsa_profile_set *ps,
+ const char *dev_id,
+@@ -4622,6 +4642,9 @@ void pa_alsa_profile_set_probe(
+ }
+ break;
+ }
++
++ if (m->hw_device_index < 0)
++ mapping_query_hw_device(m, m->output_pcm);
+ }
+
+ if (p->input_mappings && p->supported)
+@@ -4643,6 +4666,9 @@ void pa_alsa_profile_set_probe(
+ }
+ break;
+ }
++
++ if (m->hw_device_index < 0)
++ mapping_query_hw_device(m, m->input_pcm);
+ }
+
+ last = p;
+diff --git a/src/modules/alsa/alsa-mixer.h b/src/modules/alsa/alsa-mixer.h
+index 4ebf1922b..cb482906b 100644
+--- a/src/modules/alsa/alsa-mixer.h
++++ b/src/modules/alsa/alsa-mixer.h
+@@ -275,6 +275,10 @@ struct pa_alsa_mapping {
+ bool exact_channels:1;
+ bool fallback:1;
+
++ /* The "y" in "hw:x,y". This is set to -1 before the device index has been
++ * queried, or if the query failed. */
++ int hw_device_index;
++
+ /* Temporarily used during probing */
+ snd_pcm_t *input_pcm;
+ snd_pcm_t *output_pcm;
+
+From patchwork Sun Oct 8 16:48:25 2017
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [v2,2/3] alsa-mixer: autodetect the HDMI jack PCM device
+From: Tanu Kaskinen
+X-Patchwork-Id: 181164
+Message-Id: <20171008164826.7588-3-tanuk@iki.fi>
+To: pulseaudio-discuss@lists.freedesktop.org
+Date: Sun, 8 Oct 2017 19:48:25 +0300
+
+This removes the need to hardcode the PCM device index in the HDMI jack
+names. The hardcoded values don't work with the Intel HDMI LPE driver.
+
+BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=100488
+---
+ src/modules/alsa/alsa-mixer.c | 53 ++++++++++++++++++++--
+ src/modules/alsa/alsa-mixer.h | 4 +-
+ src/modules/alsa/alsa-sink.c | 2 +-
+ src/modules/alsa/alsa-source.c | 2 +-
+ .../alsa/mixer/paths/analog-output.conf.common | 4 ++
+ src/modules/alsa/mixer/paths/hdmi-output-0.conf | 3 +-
+ src/modules/alsa/mixer/paths/hdmi-output-1.conf | 3 +-
+ src/modules/alsa/mixer/paths/hdmi-output-2.conf | 3 +-
+ src/modules/alsa/mixer/paths/hdmi-output-3.conf | 3 +-
+ src/modules/alsa/mixer/paths/hdmi-output-4.conf | 3 +-
+ src/modules/alsa/mixer/paths/hdmi-output-5.conf | 3 +-
+ src/modules/alsa/mixer/paths/hdmi-output-6.conf | 3 +-
+ src/modules/alsa/mixer/paths/hdmi-output-7.conf | 3 +-
+ 13 files changed, 73 insertions(+), 16 deletions(-)
+
+diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
+index 02ab4a611..eaee7ea0a 100644
+--- a/src/modules/alsa/alsa-mixer.c
++++ b/src/modules/alsa/alsa-mixer.c
+@@ -1812,12 +1812,31 @@ static int element_probe(pa_alsa_element *e, snd_mixer_t *m) {
+ return 0;
+ }
+
+-static int jack_probe(pa_alsa_jack *j, snd_mixer_t *m) {
++static int jack_probe(pa_alsa_jack *j, pa_alsa_mapping *mapping, snd_mixer_t *m) {
+ bool has_control;
+
+ pa_assert(j);
+ pa_assert(j->path);
+
++ if (j->append_pcm_to_name) {
++ char *new_name;
++
++ if (!mapping) {
++ /* This could also be an assertion, because this should never
++ * happen. At the time of writing, mapping can only be NULL when
++ * module-alsa-sink/source synthesizes a path, and those
++ * synthesized paths never have any jacks, so jack_probe() should
++ * never be called with a NULL mapping. */
++ pa_log("Jack %s: append_pcm_to_name is set, but mapping is NULL. Can't use this jack.", j->name);
++ return -1;
++ }
++
++ new_name = pa_sprintf_malloc("%s,pcm=%i Jack", j->name, mapping->hw_device_index);
++ pa_xfree(j->alsa_name);
++ j->alsa_name = new_name;
++ j->append_pcm_to_name = false;
++ }
++
+ has_control = pa_alsa_mixer_find(m, j->alsa_name, 0) != NULL;
+ pa_alsa_jack_set_has_control(j, has_control);
+
+@@ -2326,6 +2345,30 @@ static int jack_parse_state(pa_config_parser_state *state) {
+ return 0;
+ }
+
++static int jack_parse_append_pcm_to_name(pa_config_parser_state *state) {
++ pa_alsa_path *path;
++ pa_alsa_jack *jack;
++ int b;
++
++ pa_assert(state);
++
++ path = state->userdata;
++ if (!(jack = jack_get(path, state->section))) {
++ pa_log("[%s:%u] Option 'append_pcm_to_name' not expected in section '%s'",
++ state->filename, state->lineno, state->section);
++ return -1;
++ }
++
++ b = pa_parse_boolean(state->rvalue);
++ if (b < 0) {
++ pa_log("[%s:%u] Invalid value for 'append_pcm_to_name': %s", state->filename, state->lineno, state->rvalue);
++ return -1;
++ }
++
++ jack->append_pcm_to_name = b;
++ return 0;
++}
++
+ static int element_set_option(pa_alsa_element *e, snd_mixer_t *m, int alsa_idx) {
+ snd_mixer_selem_id_t *sid;
+ snd_mixer_elem_t *me;
+@@ -2534,6 +2577,7 @@ pa_alsa_path* pa_alsa_path_new(const char *paths_dir, const char *fname, pa_alsa
+ /* [Jack ...] */
+ { "state.plugged", jack_parse_state, NULL, NULL },
+ { "state.unplugged", jack_parse_state, NULL, NULL },
++ { "append-pcm-to-name", jack_parse_append_pcm_to_name, NULL, NULL },
+
+ /* [Element ...] */
+ { "switch", element_parse_switch, NULL, NULL },
+@@ -2746,7 +2790,7 @@ static void path_create_settings(pa_alsa_path *p) {
+ element_create_settings(p->elements, NULL);
+ }
+
+-int pa_alsa_path_probe(pa_alsa_path *p, snd_mixer_t *m, bool ignore_dB) {
++int pa_alsa_path_probe(pa_alsa_path *p, pa_alsa_mapping *mapping, snd_mixer_t *m, bool ignore_dB) {
+ pa_alsa_element *e;
+ pa_alsa_jack *j;
+ double min_dB[PA_CHANNEL_POSITION_MAX], max_dB[PA_CHANNEL_POSITION_MAX];
+@@ -2766,7 +2810,7 @@ int pa_alsa_path_probe(pa_alsa_path *p, snd_mixer_t *m, bool ignore_dB) {
+ pa_log_debug("Probing path '%s'", p->name);
+
+ PA_LLIST_FOREACH(j, p->jacks) {
+- if (jack_probe(j, m) < 0) {
++ if (jack_probe(j, mapping, m) < 0) {
+ p->supported = false;
+ pa_log_debug("Probe of jack '%s' failed.", j->alsa_name);
+ return -1;
+@@ -3968,9 +4012,8 @@ static void mapping_paths_probe(pa_alsa_mapping *m, pa_alsa_profile *profile,
+ }
+
+ PA_HASHMAP_FOREACH(p, ps->paths, state) {
+- if (pa_alsa_path_probe(p, mixer_handle, m->profile_set->ignore_dB) < 0) {
++ if (pa_alsa_path_probe(p, m, mixer_handle, m->profile_set->ignore_dB) < 0)
+ pa_hashmap_remove(ps->paths, p);
+- }
+ }
+
+ path_set_condense(ps, mixer_handle);
+diff --git a/src/modules/alsa/alsa-mixer.h b/src/modules/alsa/alsa-mixer.h
+index cb482906b..7ae40511c 100644
+--- a/src/modules/alsa/alsa-mixer.h
++++ b/src/modules/alsa/alsa-mixer.h
+@@ -171,6 +171,8 @@ struct pa_alsa_jack {
+
+ pa_dynarray *ucm_devices; /* pa_alsa_ucm_device */
+ pa_dynarray *ucm_hw_mute_devices; /* pa_alsa_ucm_device */
++
++ bool append_pcm_to_name;
+ };
+
+ pa_alsa_jack *pa_alsa_jack_new(pa_alsa_path *path, const char *name);
+@@ -234,7 +236,7 @@ void pa_alsa_element_dump(pa_alsa_element *e);
+
+ pa_alsa_path *pa_alsa_path_new(const char *paths_dir, const char *fname, pa_alsa_direction_t direction);
+ pa_alsa_path *pa_alsa_path_synthesize(const char *element, pa_alsa_direction_t direction);
+-int pa_alsa_path_probe(pa_alsa_path *p, snd_mixer_t *m, bool ignore_dB);
++int pa_alsa_path_probe(pa_alsa_path *p, pa_alsa_mapping *mapping, snd_mixer_t *m, bool ignore_dB);
+ void pa_alsa_path_dump(pa_alsa_path *p);
+ int pa_alsa_path_get_volume(pa_alsa_path *p, snd_mixer_t *m, const pa_channel_map *cm, pa_cvolume *v);
+ int pa_alsa_path_get_mute(pa_alsa_path *path, snd_mixer_t *m, bool *muted);
+diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
+index 827a65081..99ca5061b 100644
+--- a/src/modules/alsa/alsa-sink.c
++++ b/src/modules/alsa/alsa-sink.c
+@@ -1912,7 +1912,7 @@ static void find_mixer(struct userdata *u, pa_alsa_mapping *mapping, const char
+ if (!(u->mixer_path = pa_alsa_path_synthesize(element, PA_ALSA_DIRECTION_OUTPUT)))
+ goto fail;
+
+- if (pa_alsa_path_probe(u->mixer_path, u->mixer_handle, ignore_dB) < 0)
++ if (pa_alsa_path_probe(u->mixer_path, NULL, u->mixer_handle, ignore_dB) < 0)
+ goto fail;
+
+ pa_log_debug("Probed mixer path %s:", u->mixer_path->name);
+diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
+index 6bec188ea..84abbf1d9 100644
+--- a/src/modules/alsa/alsa-source.c
++++ b/src/modules/alsa/alsa-source.c
+@@ -1615,7 +1615,7 @@ static void find_mixer(struct userdata *u, pa_alsa_mapping *mapping, const char
+ if (!(u->mixer_path = pa_alsa_path_synthesize(element, PA_ALSA_DIRECTION_INPUT)))
+ goto fail;
+
+- if (pa_alsa_path_probe(u->mixer_path, u->mixer_handle, ignore_dB) < 0)
++ if (pa_alsa_path_probe(u->mixer_path, NULL, u->mixer_handle, ignore_dB) < 0)
+ goto fail;
+
+ pa_log_debug("Probed mixer path %s:", u->mixer_path->name);
+diff --git a/src/modules/alsa/mixer/paths/analog-output.conf.common b/src/modules/alsa/mixer/paths/analog-output.conf.common
+index 17b45278a..baf37660e 100644
+--- a/src/modules/alsa/mixer/paths/analog-output.conf.common
++++ b/src/modules/alsa/mixer/paths/analog-output.conf.common
+@@ -122,6 +122,10 @@
+ ; # the required-any are present.
+ ; state.plugged = yes | no | unknown # Normally a plugged jack would mean the port becomes available, and an unplugged means it's
+ ; state.unplugged = yes | no | unknown # unavailable, but the port status can be overridden by specifying state.plugged and/or state.unplugged.
++; append-pcm-to-name = no | yes # Add ",pcm=N" to the jack name? N is the hw PCM device index. HDMI jacks have
++; # the PCM device index in their name, but different drivers use different
++; # numbering schemes, so we can't hardcode the full jack name in our configuration
++; # files.
+
+ [Element PCM]
+ switch = mute
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-0.conf b/src/modules/alsa/mixer/paths/hdmi-output-0.conf
+index 331014709..a87205cea 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-0.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-0.conf
+@@ -6,5 +6,6 @@ eld-device = 3
+ [Properties]
+ device.icon_name = video-display
+
+-[Jack HDMI/DP,pcm=3]
++[Jack HDMI/DP]
++append-pcm-to-name = yes
+ required = ignore
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-1.conf b/src/modules/alsa/mixer/paths/hdmi-output-1.conf
+index d81ee789c..b513ffd70 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-1.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-1.conf
+@@ -6,5 +6,6 @@ eld-device = 7
+ [Properties]
+ device.icon_name = video-display
+
+-[Jack HDMI/DP,pcm=7]
++[Jack HDMI/DP]
++append-pcm-to-name = yes
+ required = ignore
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-2.conf b/src/modules/alsa/mixer/paths/hdmi-output-2.conf
+index 349812fc2..a2386650e 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-2.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-2.conf
+@@ -6,5 +6,6 @@ eld-device = 8
+ [Properties]
+ device.icon_name = video-display
+
+-[Jack HDMI/DP,pcm=8]
++[Jack HDMI/DP]
++append-pcm-to-name = yes
+ required = ignore
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-3.conf b/src/modules/alsa/mixer/paths/hdmi-output-3.conf
+index 81463c946..edceb36e1 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-3.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-3.conf
+@@ -6,5 +6,6 @@ eld-device = 9
+ [Properties]
+ device.icon_name = video-display
+
+-[Jack HDMI/DP,pcm=9]
++[Jack HDMI/DP]
++append-pcm-to-name = yes
+ required = ignore
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-4.conf b/src/modules/alsa/mixer/paths/hdmi-output-4.conf
+index d61ec7547..0d1401eef 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-4.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-4.conf
+@@ -6,5 +6,6 @@ eld-device = 10
+ [Properties]
+ device.icon_name = video-display
+
+-[Jack HDMI/DP,pcm=10]
++[Jack HDMI/DP]
++append-pcm-to-name = yes
+ required = ignore
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-5.conf b/src/modules/alsa/mixer/paths/hdmi-output-5.conf
+index 02c15e893..883cccc20 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-5.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-5.conf
+@@ -6,5 +6,6 @@ eld-device = 11
+ [Properties]
+ device.icon_name = video-display
+
+-[Jack HDMI/DP,pcm=11]
++[Jack HDMI/DP]
++append-pcm-to-name = yes
+ required = ignore
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-6.conf b/src/modules/alsa/mixer/paths/hdmi-output-6.conf
+index 188a1adb3..d8ac2f55c 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-6.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-6.conf
+@@ -6,5 +6,6 @@ eld-device = 12
+ [Properties]
+ device.icon_name = video-display
+
+-[Jack HDMI/DP,pcm=12]
++[Jack HDMI/DP]
++append-pcm-to-name = yes
+ required = ignore
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-7.conf b/src/modules/alsa/mixer/paths/hdmi-output-7.conf
+index 80f4e3722..dd090855f 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-7.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-7.conf
+@@ -6,5 +6,6 @@ eld-device = 13
+ [Properties]
+ device.icon_name = video-display
+
+-[Jack HDMI/DP,pcm=13]
++[Jack HDMI/DP]
++append-pcm-to-name = yes
+ required = ignore
+
+From patchwork Sun Oct 8 16:48:26 2017
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [v2,3/3] alsa-mixer: autodetect the ELD device
+From: Tanu Kaskinen
+X-Patchwork-Id: 181165
+Message-Id: <20171008164826.7588-4-tanuk@iki.fi>
+To: pulseaudio-discuss@lists.freedesktop.org
+Date: Sun, 8 Oct 2017 19:48:26 +0300
+
+This removes the need to hardcode the ELD device index in the path
+configuration. The hardcoded values don't work with the Intel HDMI LPE
+driver.
+
+BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=100488
+---
+ src/modules/alsa/alsa-mixer.c | 28 ++++++++++++++++++++--
+ src/modules/alsa/alsa-mixer.h | 1 +
+ .../alsa/mixer/paths/analog-output.conf.common | 8 +++++--
+ src/modules/alsa/mixer/paths/hdmi-output-0.conf | 2 +-
+ src/modules/alsa/mixer/paths/hdmi-output-1.conf | 2 +-
+ src/modules/alsa/mixer/paths/hdmi-output-2.conf | 2 +-
+ src/modules/alsa/mixer/paths/hdmi-output-3.conf | 2 +-
+ src/modules/alsa/mixer/paths/hdmi-output-4.conf | 2 +-
+ src/modules/alsa/mixer/paths/hdmi-output-5.conf | 2 +-
+ src/modules/alsa/mixer/paths/hdmi-output-6.conf | 2 +-
+ src/modules/alsa/mixer/paths/hdmi-output-7.conf | 2 +-
+ 11 files changed, 41 insertions(+), 12 deletions(-)
+
+diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
+index eaee7ea0a..a524d6d64 100644
+--- a/src/modules/alsa/alsa-mixer.c
++++ b/src/modules/alsa/alsa-mixer.c
+@@ -2051,6 +2051,28 @@ static int element_parse_enumeration(pa_config_parser_state *state) {
+ return 0;
+ }
+
++static int parse_eld_device(pa_config_parser_state *state) {
++ pa_alsa_path *path;
++ uint32_t eld_device;
++
++ path = state->userdata;
++
++ if (pa_atou(state->rvalue, &eld_device) >= 0) {
++ path->autodetect_eld_device = false;
++ path->eld_device = eld_device;
++ return 0;
++ }
++
++ if (pa_streq(state->rvalue, "auto")) {
++ path->autodetect_eld_device = true;
++ path->eld_device = -1;
++ return 0;
++ }
++
++ pa_log("[%s:%u] Invalid value for option 'eld-device': %s", state->filename, state->lineno, state->rvalue);
++ return -1;
++}
++
+ static int option_parse_priority(pa_config_parser_state *state) {
+ pa_alsa_path *p;
+ pa_alsa_option *o;
+@@ -2568,7 +2590,7 @@ pa_alsa_path* pa_alsa_path_new(const char *paths_dir, const char *fname, pa_alsa
+ { "description-key", pa_config_parse_string, NULL, "General" },
+ { "description", pa_config_parse_string, NULL, "General" },
+ { "mute-during-activation", pa_config_parse_bool, NULL, "General" },
+- { "eld-device", pa_config_parse_int, NULL, "General" },
++ { "eld-device", parse_eld_device, NULL, "General" },
+
+ /* [Option ...] */
+ { "priority", option_parse_priority, NULL, NULL },
+@@ -2608,7 +2630,6 @@ pa_alsa_path* pa_alsa_path_new(const char *paths_dir, const char *fname, pa_alsa
+ items[1].data = &p->description_key;
+ items[2].data = &p->description;
+ items[3].data = &mute_during_activation;
+- items[4].data = &p->eld_device;
+
+ if (!paths_dir)
+ paths_dir = get_default_paths_dir();
+@@ -4012,6 +4033,9 @@ static void mapping_paths_probe(pa_alsa_mapping *m, pa_alsa_profile *profile,
+ }
+
+ PA_HASHMAP_FOREACH(p, ps->paths, state) {
++ if (p->autodetect_eld_device)
++ p->eld_device = m->hw_device_index;
++
+ if (pa_alsa_path_probe(p, m, mixer_handle, m->profile_set->ignore_dB) < 0)
+ pa_hashmap_remove(ps->paths, p);
+ }
+diff --git a/src/modules/alsa/alsa-mixer.h b/src/modules/alsa/alsa-mixer.h
+index 7ae40511c..15615a615 100644
+--- a/src/modules/alsa/alsa-mixer.h
++++ b/src/modules/alsa/alsa-mixer.h
+@@ -193,6 +193,7 @@ struct pa_alsa_path {
+ char *description_key;
+ char *description;
+ unsigned priority;
++ bool autodetect_eld_device;
+ int eld_device;
+ pa_proplist *proplist;
+
+diff --git a/src/modules/alsa/mixer/paths/analog-output.conf.common b/src/modules/alsa/mixer/paths/analog-output.conf.common
+index baf37660e..e52830d99 100644
+--- a/src/modules/alsa/mixer/paths/analog-output.conf.common
++++ b/src/modules/alsa/mixer/paths/analog-output.conf.common
+@@ -64,8 +64,12 @@
+ ; mute-during-activation = yes | no # If this path supports hardware mute, should the hw mute be used while activating this
+ ; # path? In some cases this can reduce extra noises during port switching, while in other
+ ; # cases this can increase such noises. Default: no.
+-; eld-device = ... # If this is an HDMI port, here's where to specify the device number for the ELD mixer
+-; # control. The default is to not make use of ELD information.
++; eld-device = ... # If this is an HDMI port, set to "auto" so that PulseAudio will try to read
++; # the monitor ELD information from the ALSA mixer. By default the ELD information
++; # is not read, because it's only applicable with HDMI. Earlier the "auto" option
++; # didn't exist, and the hw device index had to be manually configured. For
++; # backwards compatibility, it's still possible to manually configure the device
++; # index using this option.
+ ;
+ ; [Properties] # Property list for this path. The list is merged into the port property list.
+ ; = # Each property is defined on its own line.
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-0.conf b/src/modules/alsa/mixer/paths/hdmi-output-0.conf
+index a87205cea..95b1342e9 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-0.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-0.conf
+@@ -1,7 +1,7 @@
+ [General]
+ description = HDMI / DisplayPort
+ priority = 59
+-eld-device = 3
++eld-device = auto
+
+ [Properties]
+ device.icon_name = video-display
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-1.conf b/src/modules/alsa/mixer/paths/hdmi-output-1.conf
+index b513ffd70..37b945204 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-1.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-1.conf
+@@ -1,7 +1,7 @@
+ [General]
+ description = HDMI / DisplayPort 2
+ priority = 58
+-eld-device = 7
++eld-device = auto
+
+ [Properties]
+ device.icon_name = video-display
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-2.conf b/src/modules/alsa/mixer/paths/hdmi-output-2.conf
+index a2386650e..19c38f2e8 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-2.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-2.conf
+@@ -1,7 +1,7 @@
+ [General]
+ description = HDMI / DisplayPort 3
+ priority = 57
+-eld-device = 8
++eld-device = auto
+
+ [Properties]
+ device.icon_name = video-display
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-3.conf b/src/modules/alsa/mixer/paths/hdmi-output-3.conf
+index edceb36e1..8551570ac 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-3.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-3.conf
+@@ -1,7 +1,7 @@
+ [General]
+ description = HDMI / DisplayPort 4
+ priority = 56
+-eld-device = 9
++eld-device = auto
+
+ [Properties]
+ device.icon_name = video-display
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-4.conf b/src/modules/alsa/mixer/paths/hdmi-output-4.conf
+index 0d1401eef..e36128921 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-4.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-4.conf
+@@ -1,7 +1,7 @@
+ [General]
+ description = HDMI / DisplayPort 5
+ priority = 55
+-eld-device = 10
++eld-device = auto
+
+ [Properties]
+ device.icon_name = video-display
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-5.conf b/src/modules/alsa/mixer/paths/hdmi-output-5.conf
+index 883cccc20..82dc3be79 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-5.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-5.conf
+@@ -1,7 +1,7 @@
+ [General]
+ description = HDMI / DisplayPort 6
+ priority = 54
+-eld-device = 11
++eld-device = auto
+
+ [Properties]
+ device.icon_name = video-display
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-6.conf b/src/modules/alsa/mixer/paths/hdmi-output-6.conf
+index d8ac2f55c..92e8fd1e2 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-6.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-6.conf
+@@ -1,7 +1,7 @@
+ [General]
+ description = HDMI / DisplayPort 7
+ priority = 53
+-eld-device = 12
++eld-device = auto
+
+ [Properties]
+ device.icon_name = video-display
+diff --git a/src/modules/alsa/mixer/paths/hdmi-output-7.conf b/src/modules/alsa/mixer/paths/hdmi-output-7.conf
+index dd090855f..abe2b60e6 100644
+--- a/src/modules/alsa/mixer/paths/hdmi-output-7.conf
++++ b/src/modules/alsa/mixer/paths/hdmi-output-7.conf
+@@ -1,7 +1,7 @@
+ [General]
+ description = HDMI / DisplayPort 8
+ priority = 52
+-eld-device = 13
++eld-device = auto
+
+ [Properties]
+ device.icon_name = video-display
diff --git a/SOURCES/Fix-realtime-scheduling-on-byt-cht.patch b/SOURCES/Fix-realtime-scheduling-on-byt-cht.patch
new file mode 100644
index 0000000..810c1ce
--- /dev/null
+++ b/SOURCES/Fix-realtime-scheduling-on-byt-cht.patch
@@ -0,0 +1,62 @@
+From patchwork Wed Nov 8 12:20:22 2017
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [1/2] card-restore: log the correct profile name
+From: Tanu Kaskinen
+X-Patchwork-Id: 187101
+Message-Id: <20171108122023.8147-2-tanuk@iki.fi>
+To: pulseaudio-discuss@lists.freedesktop.org
+Date: Wed, 8 Nov 2017 14:20:22 +0200
+
+---
+ src/modules/module-card-restore.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/modules/module-card-restore.c b/src/modules/module-card-restore.c
+index 3c0307bee..2d3a91c01 100644
+--- a/src/modules/module-card-restore.c
++++ b/src/modules/module-card-restore.c
+@@ -561,7 +561,7 @@ static pa_hook_result_t card_choose_initial_profile_callback(pa_core *core, pa_c
+
+ profile = pa_hashmap_get(card->profiles, e->profile);
+ if (profile) {
+- pa_log_info("Restoring profile '%s' for card %s.", card->active_profile->name, card->name);
++ pa_log_info("Restoring profile '%s' for card %s.", profile->name, card->name);
+ pa_card_set_profile(card, profile, true);
+ } else {
+ pa_log_debug("Tried to restore profile %s for card %s, but the card doesn't have such profile.",
+From patchwork Wed Nov 8 12:20:23 2017
+Content-Type: text/plain; charset="utf-8"
+MIME-Version: 1.0
+Content-Transfer-Encoding: 7bit
+Subject: [2/2] card-restore: don't restore unavailable profiles
+From: Tanu Kaskinen
+X-Patchwork-Id: 187102
+Message-Id: <20171108122023.8147-3-tanuk@iki.fi>
+To: pulseaudio-discuss@lists.freedesktop.org
+Date: Wed, 8 Nov 2017 14:20:23 +0200
+
+---
+ src/modules/module-card-restore.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/src/modules/module-card-restore.c b/src/modules/module-card-restore.c
+index 2d3a91c01..b7189ad53 100644
+--- a/src/modules/module-card-restore.c
++++ b/src/modules/module-card-restore.c
+@@ -561,8 +561,12 @@ static pa_hook_result_t card_choose_initial_profile_callback(pa_core *core, pa_c
+
+ profile = pa_hashmap_get(card->profiles, e->profile);
+ if (profile) {
+- pa_log_info("Restoring profile '%s' for card %s.", profile->name, card->name);
+- pa_card_set_profile(card, profile, true);
++ if (profile->available != PA_AVAILABLE_NO) {
++ pa_log_info("Restoring profile '%s' for card %s.", profile->name, card->name);
++ pa_card_set_profile(card, profile, true);
++ } else
++ pa_log_debug("Not restoring profile %s for card %s, because the profile is currently unavailable.",
++ profile->name, card->name);
+ } else {
+ pa_log_debug("Tried to restore profile %s for card %s, but the card doesn't have such profile.",
+ e->profile, card->name);
diff --git a/SOURCES/default.pa-for-gdm b/SOURCES/default.pa-for-gdm
new file mode 100644
index 0000000..d633aee
--- /dev/null
+++ b/SOURCES/default.pa-for-gdm
@@ -0,0 +1,10 @@
+load-module module-device-restore
+load-module module-card-restore
+load-module module-udev-detect
+load-module module-native-protocol-unix
+load-module module-default-device-restore
+load-module module-rescue-streams
+load-module module-always-sink
+load-module module-intended-roles
+load-module module-suspend-on-idle
+load-module module-position-event-sounds
diff --git a/SOURCES/pulseaudio-11.1-autospawn_disable.patch b/SOURCES/pulseaudio-11.1-autospawn_disable.patch
new file mode 100644
index 0000000..48ce987
--- /dev/null
+++ b/SOURCES/pulseaudio-11.1-autospawn_disable.patch
@@ -0,0 +1,24 @@
+diff -up pulseaudio-11.1/src/pulse/client-conf.c.autospawn pulseaudio-11.1/src/pulse/client-conf.c
+--- pulseaudio-11.1/src/pulse/client-conf.c.autospawn 2018-03-01 15:52:25.304612437 -0600
++++ pulseaudio-11.1/src/pulse/client-conf.c 2018-03-01 15:56:17.643552698 -0600
+@@ -63,7 +63,7 @@ static const pa_client_conf default_conf
+ .cookie_from_x11_valid = false,
+ .cookie_file_from_application = NULL,
+ .cookie_file_from_client_conf = NULL,
+- .autospawn = true,
++ .autospawn = false,
+ .disable_shm = false,
+ .disable_memfd = false,
+ .shm_size = 0,
+diff -up pulseaudio-11.1/src/pulse/client.conf.in.autospawn pulseaudio-11.1/src/pulse/client.conf.in
+--- pulseaudio-11.1/src/pulse/client.conf.in.autospawn 2016-08-23 07:50:10.000000000 -0500
++++ pulseaudio-11.1/src/pulse/client.conf.in 2018-03-01 15:56:01.201344622 -0600
+@@ -22,7 +22,7 @@
+ ; default-server =
+ ; default-dbus-server =
+
+-; autospawn = yes
++; autospawn = no
+ ; daemon-binary = @PA_BINARY@
+ ; extra-arguments = --log-target=syslog
+
diff --git a/SOURCES/pulseaudio-11.1-exit_idle_time-2.patch b/SOURCES/pulseaudio-11.1-exit_idle_time-2.patch
new file mode 100644
index 0000000..e648398
--- /dev/null
+++ b/SOURCES/pulseaudio-11.1-exit_idle_time-2.patch
@@ -0,0 +1,102 @@
+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/SOURCES/pulseaudio-11.1-glibc_memfd.patch b/SOURCES/pulseaudio-11.1-glibc_memfd.patch
new file mode 100644
index 0000000..085b7c9
--- /dev/null
+++ b/SOURCES/pulseaudio-11.1-glibc_memfd.patch
@@ -0,0 +1,15 @@
+diff -up pulseaudio-11.1/src/pulsecore/memfd-wrappers.h.glibc_memfd pulseaudio-11.1/src/pulsecore/memfd-wrappers.h
+--- pulseaudio-11.1/src/pulsecore/memfd-wrappers.h.glibc_memfd 2016-08-23 07:50:11.000000000 -0500
++++ pulseaudio-11.1/src/pulsecore/memfd-wrappers.h 2018-01-22 12:30:23.322574380 -0600
+@@ -33,9 +33,9 @@
+ * a whole conflicts with the original glibc header .
+ */
+
+-static inline int memfd_create(const char *name, unsigned int flags) {
++/* static inline int memfd_create(const char *name, unsigned int flags) {
+ return syscall(SYS_memfd_create, name, flags);
+-}
++} */
+
+ /* memfd_create(2) flags */
+
diff --git a/SOURCES/pulseaudio-11.1.tar.xz.md5 b/SOURCES/pulseaudio-11.1.tar.xz.md5
new file mode 100644
index 0000000..b9ad33e
--- /dev/null
+++ b/SOURCES/pulseaudio-11.1.tar.xz.md5
@@ -0,0 +1 @@
+390de38231d5cdd6b43ada8939eb74f1 pulseaudio-11.1.tar.xz
diff --git a/SOURCES/pulseaudio-11.1.tar.xz.sha1 b/SOURCES/pulseaudio-11.1.tar.xz.sha1
new file mode 100644
index 0000000..ce5f6d9
--- /dev/null
+++ b/SOURCES/pulseaudio-11.1.tar.xz.sha1
@@ -0,0 +1 @@
+53bde72b6bfe715c19b1519db8845f7a58346b67 pulseaudio-11.1.tar.xz
diff --git a/SOURCES/pulseaudio-8.99.2-getaffinity.patch b/SOURCES/pulseaudio-8.99.2-getaffinity.patch
new file mode 100644
index 0000000..adc0f14
--- /dev/null
+++ b/SOURCES/pulseaudio-8.99.2-getaffinity.patch
@@ -0,0 +1,12 @@
+diff -up pulseaudio-8.99.2/src/tests/once-test.c.than pulseaudio-8.99.2/src/tests/once-test.c
+--- pulseaudio-8.99.2/src/tests/once-test.c.than 2016-06-22 10:20:57.127583628 -0400
++++ pulseaudio-8.99.2/src/tests/once-test.c 2016-06-22 10:59:38.905573634 -0400
+@@ -70,7 +70,7 @@ static void thread_func(void *data) {
+ #endif
+
+ CPU_ZERO(&mask);
+- CPU_SET((size_t) (pa_atomic_inc(&i_cpu) % n_cpu), &mask);
++ CPU_SET(pthread_getaffinity_np(pthread_self(), sizeof(mask), &mask), &mask);
+ fail_unless(pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) == 0);
+ #endif
+
diff --git a/SOURCES/pulseaudio-9.0-disable_flat_volumes.patch b/SOURCES/pulseaudio-9.0-disable_flat_volumes.patch
new file mode 100644
index 0000000..3e489d6
--- /dev/null
+++ b/SOURCES/pulseaudio-9.0-disable_flat_volumes.patch
@@ -0,0 +1,48 @@
+diff -up pulseaudio-8.99.2/man/pulse-daemon.conf.5.xml.in.disable_flat_volumes pulseaudio-8.99.2/man/pulse-daemon.conf.5.xml.in
+--- pulseaudio-8.99.2/man/pulse-daemon.conf.5.xml.in.disable_flat_volumes 2016-05-26 23:21:17.000000000 -0500
++++ pulseaudio-8.99.2/man/pulse-daemon.conf.5.xml.in 2016-05-31 10:01:55.679976730 -0500
+@@ -220,7 +220,7 @@ License along with PulseAudio; if not, s
+ flat-volumes= Enable 'flat' volumes, i.e. where
+ possible let the sink volume equal the maximum of the volumes of
+ the inputs connected to it. Takes a boolean argument, defaults
+- to yes.
++ to no.
+
+
+
+diff -up pulseaudio-8.99.2/src/daemon/daemon-conf.c.disable_flat_volumes pulseaudio-8.99.2/src/daemon/daemon-conf.c
+--- pulseaudio-8.99.2/src/daemon/daemon-conf.c.disable_flat_volumes 2016-05-26 23:21:17.000000000 -0500
++++ pulseaudio-8.99.2/src/daemon/daemon-conf.c 2016-05-31 10:01:55.680976735 -0500
+@@ -68,7 +68,7 @@ static const pa_daemon_conf default_conf
+ .realtime_priority = 5, /* Half of JACK's default rtprio */
+ .disallow_module_loading = false,
+ .disallow_exit = false,
+- .flat_volumes = true,
++ .flat_volumes = false,
+ .exit_idle_time = 20,
+ .scache_idle_time = 20,
+ .script_commands = NULL,
+diff -up pulseaudio-8.99.2/src/daemon/daemon.conf.in.disable_flat_volumes pulseaudio-8.99.2/src/daemon/daemon.conf.in
+--- pulseaudio-8.99.2/src/daemon/daemon.conf.in.disable_flat_volumes 2016-05-31 10:01:55.680976735 -0500
++++ pulseaudio-8.99.2/src/daemon/daemon.conf.in 2016-05-31 10:02:28.048133267 -0500
+@@ -57,7 +57,7 @@ ifelse(@HAVE_DBUS@, 1, [dnl
+ ; enable-lfe-remixing = no
+ ; lfe-crossover-freq = 0
+
+-; flat-volumes = yes
++; flat-volumes = no
+
+ ifelse(@HAVE_SYS_RESOURCE_H@, 1, [dnl
+ ; rlimit-fsize = -1
+diff -up pulseaudio-8.99.2/src/pulsecore/core.c.disable_flat_volumes pulseaudio-8.99.2/src/pulsecore/core.c
+--- pulseaudio-8.99.2/src/pulsecore/core.c.disable_flat_volumes 2016-05-26 23:21:17.000000000 -0500
++++ pulseaudio-8.99.2/src/pulsecore/core.c 2016-05-31 10:01:55.681976740 -0500
+@@ -135,7 +135,7 @@ pa_core* pa_core_new(pa_mainloop_api *m,
+ c->exit_idle_time = -1;
+ c->scache_idle_time = 20;
+
+- c->flat_volumes = true;
++ c->flat_volumes = false;
+ c->disallow_module_loading = false;
+ c->disallow_exit = false;
+ c->running_as_daemon = false;
diff --git a/SOURCES/pulseaudio-autostart.patch b/SOURCES/pulseaudio-autostart.patch
new file mode 100644
index 0000000..eb44bdb
--- /dev/null
+++ b/SOURCES/pulseaudio-autostart.patch
@@ -0,0 +1,13 @@
+diff -up pulseaudio-6.0/src/daemon/start-pulseaudio-x11.in.autostart pulseaudio-6.0/src/daemon/start-pulseaudio-x11.in
+--- pulseaudio-6.0/src/daemon/start-pulseaudio-x11.in.autostart 2015-02-12 08:10:35.000000000 -0600
++++ pulseaudio-6.0/src/daemon/start-pulseaudio-x11.in 2015-06-22 11:24:13.561614127 -0500
+@@ -17,6 +17,9 @@
+
+ set -e
+
++# probe to test if autospawn works, else resort to starting manually
++@PACTL_BINARY@ info > /dev/null 2>&1 || @PA_BINARY@ --start "$@"
++
+ if [ x"$DISPLAY" != x ] ; then
+
+ @PACTL_BINARY@ load-module module-x11-publish "display=$DISPLAY" > /dev/null
diff --git a/SOURCES/pulseaudio-python3.patch b/SOURCES/pulseaudio-python3.patch
new file mode 100644
index 0000000..adec1d4
--- /dev/null
+++ b/SOURCES/pulseaudio-python3.patch
@@ -0,0 +1,34 @@
+diff -up pulseaudio-11.1/src/depmod.py.me pulseaudio-11.1/src/depmod.py
+--- pulseaudio-11.1/src/depmod.py.me 2018-06-22 11:18:07.718411268 +0200
++++ pulseaudio-11.1/src/depmod.py 2018-06-22 11:36:42.575023103 +0200
+@@ -1,4 +1,4 @@
+-#!/usr/bin/python
++#!/usr/bin/python3
+
+ # This file is part of PulseAudio.
+ #
+@@ -60,11 +60,10 @@ for fn in imported_symbols:
+ else:
+ unresolved_symbols[sym] = [fn]
+
+-for sym, files in unresolved_symbols.iteritems():
+- print "WARNING: Unresolved symbol '%s' in %s" % (sym, `files`)
++for sym, files in unresolved_symbols.items():
++ print ("WARNING: Unresolved symbol '%s' in %s" % (sym, files))
+
+-k = dependencies.keys()
+-k.sort()
++k = sorted(dependencies)
+ for fn in k:
+ dependencies[fn].sort()
+- print "%s: %s" % (fn, string.join(dependencies[fn], " "))
++ print ("%s: %s" % (fn, string.join(dependencies[fn], " ")))
+diff -up pulseaudio-11.1/src/utils/qpaeq.me pulseaudio-11.1/src/utils/qpaeq
+--- pulseaudio-11.1/src/utils/qpaeq.me 2018-06-22 11:16:31.966787327 +0200
++++ pulseaudio-11.1/src/utils/qpaeq 2018-06-22 11:17:57.482451346 +0200
+@@ -1,4 +1,4 @@
+-#!/usr/bin/env python
++#!/usr/bin/python3
+ # qpaeq is a equalizer interface for pulseaudio's equalizer sinks
+ # Copyright (C) 2009 Jason Newton profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT) {
++ if (t->profile == PA_BLUETOOTH_PROFILE_HSP_HS) {
+ len = sprintf(buf, "\r\n+VGS=%d\r\n", gain);
+ pa_log_debug("RFCOMM >> +VGS=%d", gain);
+ } else {
+@@ -476,7 +476,7 @@ static void set_microphone_gain(pa_bluetooth_transport *t, uint16_t gain) {
+ /* If we are in the AG role, we send a command to the head set to change
+ * the microphone gain. In the HS role, source and sink are swapped, so
+ * in this case we notify the AG that the speaker gain has changed */
+- if (t->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT) {
++ if (t->profile == PA_BLUETOOTH_PROFILE_HSP_HS) {
+ len = sprintf(buf, "\r\n+VGM=%d\r\n", gain);
+ pa_log_debug("RFCOMM >> +VGM=%d", gain);
+ } else {
+@@ -509,9 +509,9 @@ static DBusMessage *profile_new_connection(DBusConnection *conn, DBusMessage *m,
+
+ handler = dbus_message_get_path(m);
+ if (pa_streq(handler, HSP_AG_PROFILE)) {
+- p = PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT;
++ p = PA_BLUETOOTH_PROFILE_HSP_HS;
+ } else if (pa_streq(handler, HSP_HS_PROFILE)) {
+- p = PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY;
++ p = PA_BLUETOOTH_PROFILE_HFP_AG;
+ } else {
+ pa_log_error("Invalid handler");
+ goto fail;
+@@ -626,11 +626,11 @@ static void profile_init(pa_bluetooth_backend *b, pa_bluetooth_profile_t profile
+ pa_assert(b);
+
+ switch (profile) {
+- case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT:
++ case PA_BLUETOOTH_PROFILE_HSP_HS:
+ object_name = HSP_AG_PROFILE;
+ uuid = PA_BLUETOOTH_UUID_HSP_AG;
+ break;
+- case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY:
++ case PA_BLUETOOTH_PROFILE_HFP_AG:
+ object_name = HSP_HS_PROFILE;
+ uuid = PA_BLUETOOTH_UUID_HSP_HS;
+ break;
+@@ -647,10 +647,10 @@ static void profile_done(pa_bluetooth_backend *b, pa_bluetooth_profile_t profile
+ pa_assert(b);
+
+ switch (profile) {
+- case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT:
++ case PA_BLUETOOTH_PROFILE_HSP_HS:
+ dbus_connection_unregister_object_path(pa_dbus_connection_get(b->connection), HSP_AG_PROFILE);
+ break;
+- case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY:
++ case PA_BLUETOOTH_PROFILE_HFP_AG:
+ dbus_connection_unregister_object_path(pa_dbus_connection_get(b->connection), HSP_HS_PROFILE);
+ break;
+ default:
+@@ -665,9 +665,9 @@ void pa_bluetooth_native_backend_enable_hs_role(pa_bluetooth_backend *native_bac
+ return;
+
+ if (enable_hs_role)
+- profile_init(native_backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY);
++ profile_init(native_backend, PA_BLUETOOTH_PROFILE_HFP_AG);
+ else
+- profile_done(native_backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY);
++ profile_done(native_backend, PA_BLUETOOTH_PROFILE_HFP_AG);
+
+ native_backend->enable_hs_role = enable_hs_role;
+ }
+@@ -693,8 +693,8 @@ pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_d
+ backend->enable_hs_role = enable_hs_role;
+
+ if (enable_hs_role)
+- profile_init(backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY);
+- profile_init(backend, PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT);
++ profile_init(backend, PA_BLUETOOTH_PROFILE_HFP_AG);
++ profile_init(backend, PA_BLUETOOTH_PROFILE_HSP_HS);
+
+ return backend;
+ }
+@@ -705,8 +705,8 @@ void pa_bluetooth_native_backend_free(pa_bluetooth_backend *backend) {
+ pa_dbus_free_pending_list(&backend->pending);
+
+ if (backend->enable_hs_role)
+- profile_done(backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY);
+- profile_done(backend, PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT);
++ profile_done(backend, PA_BLUETOOTH_PROFILE_HFP_AG);
++ profile_done(backend, PA_BLUETOOTH_PROFILE_HSP_HS);
+
+ pa_dbus_connection_unref(backend->connection);
+
+diff --git a/src/modules/bluetooth/backend-ofono.c b/src/modules/bluetooth/backend-ofono.c
+index 2c51497f..85b9c477 100644
+--- a/src/modules/bluetooth/backend-ofono.c
++++ b/src/modules/bluetooth/backend-ofono.c
+@@ -223,7 +223,7 @@ static void hf_audio_agent_card_found(pa_bluetooth_backend *backend, const char
+ const char *key, *value;
+ struct hf_audio_card *card;
+ pa_bluetooth_device *d;
+- pa_bluetooth_profile_t p = PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY;
++ pa_bluetooth_profile_t p = PA_BLUETOOTH_PROFILE_HFP_AG;
+
+ pa_assert(backend);
+ pa_assert(path);
+@@ -257,7 +257,7 @@ static void hf_audio_agent_card_found(pa_bluetooth_backend *backend, const char
+ card->local_address = pa_xstrdup(value);
+ } else if (pa_streq(key, "Type")) {
+ if (pa_streq(value, "gateway"))
+- p = PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT;
++ p = PA_BLUETOOTH_PROFILE_HSP_HS;
+ }
+
+ pa_log_debug("%s: %s", key, value);
+diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c
+index c9283232..4470f2ef 100644
+--- a/src/modules/bluetooth/bluez5-util.c
++++ b/src/modules/bluetooth/bluez5-util.c
+@@ -174,10 +174,10 @@ static bool device_supports_profile(pa_bluetooth_device *device, pa_bluetooth_pr
+ return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_A2DP_SINK);
+ case PA_BLUETOOTH_PROFILE_A2DP_SOURCE:
+ return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_A2DP_SOURCE);
+- case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT:
++ case PA_BLUETOOTH_PROFILE_HSP_HS:
+ return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_HS)
+ || !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_HF);
+- case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY:
++ case PA_BLUETOOTH_PROFILE_HFP_AG:
+ return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_AG)
+ || !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_AG);
+ case PA_BLUETOOTH_PROFILE_OFF:
+@@ -1018,7 +1018,7 @@ void pa_bluetooth_discovery_set_ofono_running(pa_bluetooth_discovery *y, bool is
+ pa_bluetooth_device *d;
+
+ PA_HASHMAP_FOREACH(d, y->devices, state) {
+- if (device_supports_profile(d, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY)) {
++ if (device_supports_profile(d, PA_BLUETOOTH_PROFILE_HFP_AG)) {
+ DBusMessage *m;
+
+ pa_assert_se(m = dbus_message_new_method_call(BLUEZ_SERVICE, d->path, "org.bluez.Device1", "Disconnect"));
+@@ -1304,9 +1304,9 @@ const char *pa_bluetooth_profile_to_string(pa_bluetooth_profile_t profile) {
+ return "a2dp_sink";
+ case PA_BLUETOOTH_PROFILE_A2DP_SOURCE:
+ return "a2dp_source";
+- case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT:
++ case PA_BLUETOOTH_PROFILE_HSP_HS:
+ return "headset_head_unit";
+- case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY:
++ case PA_BLUETOOTH_PROFILE_HFP_AG:
+ return "headset_audio_gateway";
+ case PA_BLUETOOTH_PROFILE_OFF:
+ return "off";
+diff --git a/src/modules/bluetooth/bluez5-util.h b/src/modules/bluetooth/bluez5-util.h
+index a3e7bf3d..84c0c3f1 100644
+--- a/src/modules/bluetooth/bluez5-util.h
++++ b/src/modules/bluetooth/bluez5-util.h
+@@ -46,8 +46,8 @@ typedef enum pa_bluetooth_hook {
+ typedef enum profile {
+ PA_BLUETOOTH_PROFILE_A2DP_SINK,
+ PA_BLUETOOTH_PROFILE_A2DP_SOURCE,
+- PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT,
+- PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY,
++ PA_BLUETOOTH_PROFILE_HSP_HS,
++ PA_BLUETOOTH_PROFILE_HFP_AG,
+ PA_BLUETOOTH_PROFILE_OFF
+ } pa_bluetooth_profile_t;
+ #define PA_BLUETOOTH_PROFILE_COUNT PA_BLUETOOTH_PROFILE_OFF
+diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c
+index 530207a2..d076fbad 100644
+--- a/src/modules/bluetooth/module-bluez5-device.c
++++ b/src/modules/bluetooth/module-bluez5-device.c
+@@ -257,8 +257,8 @@ static int sco_process_render(struct userdata *u) {
+ pa_memchunk memchunk;
+
+ pa_assert(u);
+- pa_assert(u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT ||
+- u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY);
++ pa_assert(u->profile == PA_BLUETOOTH_PROFILE_HSP_HS ||
++ u->profile == PA_BLUETOOTH_PROFILE_HFP_AG);
+ pa_assert(u->sink);
+
+ pa_sink_render_full(u->sink, u->write_block_size, &memchunk);
+@@ -317,8 +317,8 @@ static int sco_process_push(struct userdata *u) {
+ pa_usec_t tstamp = 0;
+
+ pa_assert(u);
+- pa_assert(u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT ||
+- u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY);
++ pa_assert(u->profile == PA_BLUETOOTH_PROFILE_HSP_HS ||
++ u->profile == PA_BLUETOOTH_PROFILE_HFP_AG);
+ pa_assert(u->source);
+ pa_assert(u->read_smoother);
+
+@@ -784,7 +784,7 @@ static void transport_release(struct userdata *u) {
+
+ /* Run from I/O thread */
+ static void transport_config_mtu(struct userdata *u) {
+- if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT || u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY) {
++ if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS || u->profile == PA_BLUETOOTH_PROFILE_HFP_AG) {
+ u->read_block_size = u->read_link_mtu;
+ u->write_block_size = u->write_link_mtu;
+
+@@ -981,7 +981,7 @@ static void source_set_volume_cb(pa_source *s) {
+ pa_cvolume_set(&s->real_volume, u->sample_spec.channels, volume);
+
+ /* Set soft volume when in headset role */
+- if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY)
++ if (u->profile == PA_BLUETOOTH_PROFILE_HFP_AG)
+ pa_cvolume_set(&s->soft_volume, u->sample_spec.channels, volume);
+
+ /* If we are in the AG role, we send a command to the head set to change
+@@ -1004,7 +1004,7 @@ static int add_source(struct userdata *u) {
+ data.namereg_fail = false;
+ pa_proplist_sets(data.proplist, "bluetooth.protocol", pa_bluetooth_profile_to_string(u->profile));
+ pa_source_new_data_set_sample_spec(&data, &u->sample_spec);
+- if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT)
++ if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS)
+ pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
+
+ connect_ports(u, &data, PA_DIRECTION_INPUT);
+@@ -1012,10 +1012,10 @@ static int add_source(struct userdata *u) {
+ if (!u->transport_acquired)
+ switch (u->profile) {
+ case PA_BLUETOOTH_PROFILE_A2DP_SOURCE:
+- case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY:
++ case PA_BLUETOOTH_PROFILE_HFP_AG:
+ data.suspend_cause = PA_SUSPEND_USER;
+ break;
+- case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT:
++ case PA_BLUETOOTH_PROFILE_HSP_HS:
+ /* u->stream_fd contains the error returned by the last transport_acquire()
+ * EAGAIN means we are waiting for a NewConnection signal */
+ if (u->stream_fd == -EAGAIN)
+@@ -1039,7 +1039,7 @@ static int add_source(struct userdata *u) {
+ u->source->userdata = u;
+ u->source->parent.process_msg = source_process_msg;
+
+- if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT || u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY) {
++ if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS || u->profile == PA_BLUETOOTH_PROFILE_HFP_AG) {
+ pa_source_set_set_volume_callback(u->source, source_set_volume_cb);
+ u->source->n_volume_steps = 16;
+ }
+@@ -1151,7 +1151,7 @@ static void sink_set_volume_cb(pa_sink *s) {
+ pa_cvolume_set(&s->real_volume, u->sample_spec.channels, volume);
+
+ /* Set soft volume when in headset role */
+- if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY)
++ if (u->profile == PA_BLUETOOTH_PROFILE_HFP_AG)
+ pa_cvolume_set(&s->soft_volume, u->sample_spec.channels, volume);
+
+ /* If we are in the AG role, we send a command to the head set to change
+@@ -1174,17 +1174,17 @@ static int add_sink(struct userdata *u) {
+ data.namereg_fail = false;
+ pa_proplist_sets(data.proplist, "bluetooth.protocol", pa_bluetooth_profile_to_string(u->profile));
+ pa_sink_new_data_set_sample_spec(&data, &u->sample_spec);
+- if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT)
++ if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS)
+ pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
+
+ connect_ports(u, &data, PA_DIRECTION_OUTPUT);
+
+ if (!u->transport_acquired)
+ switch (u->profile) {
+- case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY:
++ case PA_BLUETOOTH_PROFILE_HFP_AG:
+ data.suspend_cause = PA_SUSPEND_USER;
+ break;
+- case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT:
++ case PA_BLUETOOTH_PROFILE_HSP_HS:
+ /* u->stream_fd contains the error returned by the last transport_acquire()
+ * EAGAIN means we are waiting for a NewConnection signal */
+ if (u->stream_fd == -EAGAIN)
+@@ -1210,7 +1210,7 @@ static int add_sink(struct userdata *u) {
+ u->sink->userdata = u;
+ u->sink->parent.process_msg = sink_process_msg;
+
+- if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT || u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY) {
++ if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS || u->profile == PA_BLUETOOTH_PROFILE_HFP_AG) {
+ pa_sink_set_set_volume_callback(u->sink, sink_set_volume_cb);
+ u->sink->n_volume_steps = 16;
+ }
+@@ -1219,7 +1219,7 @@ static int add_sink(struct userdata *u) {
+
+ /* Run from main thread */
+ static void transport_config(struct userdata *u) {
+- if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT || u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY) {
++ if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS || u->profile == PA_BLUETOOTH_PROFILE_HFP_AG) {
+ u->sample_spec.format = PA_SAMPLE_S16LE;
+ u->sample_spec.channels = 1;
+ u->sample_spec.rate = 8000;
+@@ -1349,7 +1349,7 @@ static int setup_transport(struct userdata *u) {
+
+ u->transport = t;
+
+- if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE || u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY)
++ if (u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE || u->profile == PA_BLUETOOTH_PROFILE_HFP_AG)
+ transport_acquire(u, true); /* In case of error, the sink/sources will be created suspended */
+ else {
+ int transport_error;
+@@ -1369,8 +1369,8 @@ static pa_direction_t get_profile_direction(pa_bluetooth_profile_t p) {
+ static const pa_direction_t profile_direction[] = {
+ [PA_BLUETOOTH_PROFILE_A2DP_SINK] = PA_DIRECTION_OUTPUT,
+ [PA_BLUETOOTH_PROFILE_A2DP_SOURCE] = PA_DIRECTION_INPUT,
+- [PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT] = PA_DIRECTION_INPUT | PA_DIRECTION_OUTPUT,
+- [PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY] = PA_DIRECTION_INPUT | PA_DIRECTION_OUTPUT,
++ [PA_BLUETOOTH_PROFILE_HSP_HS] = PA_DIRECTION_INPUT | PA_DIRECTION_OUTPUT,
++ [PA_BLUETOOTH_PROFILE_HFP_AG] = PA_DIRECTION_INPUT | PA_DIRECTION_OUTPUT,
+ [PA_BLUETOOTH_PROFILE_OFF] = 0
+ };
+
+@@ -1620,7 +1620,7 @@ static int start_thread(struct userdata *u) {
+
+ /* If we are in the headset role, the sink should not become default
+ * unless there is no other sound device available. */
+- if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY)
++ if (u->profile == PA_BLUETOOTH_PROFILE_HFP_AG)
+ u->sink->priority = 1500;
+
+ pa_sink_put(u->sink);
+@@ -1636,7 +1636,7 @@ static int start_thread(struct userdata *u) {
+ /* If we are in the headset role or the device is an a2dp source,
+ * the source should not become default unless there is no other
+ * sound device available. */
+- if (u->profile == PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY || u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE)
++ if (u->profile == PA_BLUETOOTH_PROFILE_HFP_AG || u->profile == PA_BLUETOOTH_PROFILE_A2DP_SOURCE)
+ u->source->priority = 1500;
+
+ pa_source_put(u->source);
+@@ -1873,7 +1873,7 @@ static pa_card_profile *create_card_profile(struct userdata *u, pa_bluetooth_pro
+ p = PA_CARD_PROFILE_DATA(cp);
+ break;
+
+- case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT:
++ case PA_BLUETOOTH_PROFILE_HSP_HS:
+ cp = pa_card_profile_new(name, _("Headset Head Unit (HSP/HFP)"), sizeof(pa_bluetooth_profile_t));
+ cp->priority = 20;
+ cp->n_sinks = 1;
+@@ -1886,7 +1886,7 @@ static pa_card_profile *create_card_profile(struct userdata *u, pa_bluetooth_pro
+ p = PA_CARD_PROFILE_DATA(cp);
+ break;
+
+- case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY:
++ case PA_BLUETOOTH_PROFILE_HFP_AG:
+ cp = pa_card_profile_new(name, _("Headset Audio Gateway (HSP/HFP)"), sizeof(pa_bluetooth_profile_t));
+ cp->priority = 20;
+ cp->n_sinks = 1;
+@@ -1961,9 +1961,9 @@ static int uuid_to_profile(const char *uuid, pa_bluetooth_profile_t *_r) {
+ else if (pa_streq(uuid, PA_BLUETOOTH_UUID_A2DP_SOURCE))
+ *_r = PA_BLUETOOTH_PROFILE_A2DP_SOURCE;
+ else if (pa_streq(uuid, PA_BLUETOOTH_UUID_HSP_HS) || pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_HF))
+- *_r = PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT;
++ *_r = PA_BLUETOOTH_PROFILE_HSP_HS;
+ else if (pa_streq(uuid, PA_BLUETOOTH_UUID_HSP_AG) || pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_AG))
+- *_r = PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY;
++ *_r = PA_BLUETOOTH_PROFILE_HFP_AG;
+ else
+ return -PA_ERR_INVALID;
+
+@@ -2174,7 +2174,7 @@ static pa_hook_result_t transport_speaker_gain_changed_cb(pa_bluetooth_discovery
+ volume++;
+
+ pa_cvolume_set(&v, u->sample_spec.channels, volume);
+- if (t->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT)
++ if (t->profile == PA_BLUETOOTH_PROFILE_HSP_HS)
+ pa_sink_volume_changed(u->sink, &v);
+ else
+ pa_sink_set_volume(u->sink, &v, true, true);
+@@ -2202,7 +2202,7 @@ static pa_hook_result_t transport_microphone_gain_changed_cb(pa_bluetooth_discov
+
+ pa_cvolume_set(&v, u->sample_spec.channels, volume);
+
+- if (t->profile == PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT)
++ if (t->profile == PA_BLUETOOTH_PROFILE_HSP_HS)
+ pa_source_volume_changed(u->source, &v);
+ else
+ pa_source_set_volume(u->source, &v, true, true);
diff --git a/SOURCES/v5-2-4-bluetooth-separate-HSP-and-HFP.patch b/SOURCES/v5-2-4-bluetooth-separate-HSP-and-HFP.patch
new file mode 100644
index 0000000..aac2954
--- /dev/null
+++ b/SOURCES/v5-2-4-bluetooth-separate-HSP-and-HFP.patch
@@ -0,0 +1,394 @@
+diff --git a/src/modules/bluetooth/backend-native.c b/src/modules/bluetooth/backend-native.c
+index f2009bfd..9ec9244b 100644
+--- a/src/modules/bluetooth/backend-native.c
++++ b/src/modules/bluetooth/backend-native.c
+@@ -62,6 +62,7 @@ struct transport_data {
+ #define BLUEZ_PROFILE_INTERFACE BLUEZ_SERVICE ".Profile1"
+
+ #define HSP_AG_PROFILE "/Profile/HSPAGProfile"
++#define HFP_AG_PROFILE "/Profile/HFPAGProfile"
+ #define HSP_HS_PROFILE "/Profile/HSPHSProfile"
+
+ /* RFCOMM channel for HSP headset role
+@@ -512,6 +513,8 @@ static DBusMessage *profile_new_connection(DBusConnection *conn, DBusMessage *m,
+ p = PA_BLUETOOTH_PROFILE_HSP_HS;
+ } else if (pa_streq(handler, HSP_HS_PROFILE)) {
+ p = PA_BLUETOOTH_PROFILE_HFP_AG;
++ } else if (pa_streq(handler, HFP_AG_PROFILE)) {
++ p = PA_BLUETOOTH_PROFILE_HFP_HF;
+ } else {
+ pa_log_error("Invalid handler");
+ goto fail;
+@@ -589,7 +592,8 @@ static DBusHandlerResult profile_handler(DBusConnection *c, DBusMessage *m, void
+
+ pa_log_debug("dbus: path=%s, interface=%s, member=%s", path, interface, member);
+
+- if (!pa_streq(path, HSP_AG_PROFILE) && !pa_streq(path, HSP_HS_PROFILE))
++ if (!pa_streq(path, HSP_AG_PROFILE) && !pa_streq(path, HSP_HS_PROFILE)
++ && !pa_streq(path, HFP_AG_PROFILE))
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+
+ if (dbus_message_is_method_call(m, "org.freedesktop.DBus.Introspectable", "Introspect")) {
+@@ -634,6 +638,10 @@ static void profile_init(pa_bluetooth_backend *b, pa_bluetooth_profile_t profile
+ object_name = HSP_HS_PROFILE;
+ uuid = PA_BLUETOOTH_UUID_HSP_HS;
+ break;
++ case PA_BLUETOOTH_PROFILE_HFP_HF:
++ object_name = HFP_AG_PROFILE;
++ uuid = PA_BLUETOOTH_UUID_HFP_AG;
++ break;
+ default:
+ pa_assert_not_reached();
+ break;
+@@ -653,6 +661,9 @@ static void profile_done(pa_bluetooth_backend *b, pa_bluetooth_profile_t profile
+ case PA_BLUETOOTH_PROFILE_HFP_AG:
+ dbus_connection_unregister_object_path(pa_dbus_connection_get(b->connection), HSP_HS_PROFILE);
+ break;
++ case PA_BLUETOOTH_PROFILE_HFP_HF:
++ dbus_connection_unregister_object_path(pa_dbus_connection_get(b->connection), HFP_AG_PROFILE);
++ break;
+ default:
+ pa_assert_not_reached();
+ break;
+@@ -695,6 +706,8 @@ pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_d
+ if (enable_hs_role)
+ profile_init(backend, PA_BLUETOOTH_PROFILE_HFP_AG);
+ profile_init(backend, PA_BLUETOOTH_PROFILE_HSP_HS);
++ if (pa_bluetooth_discovery_get_enable_native_hfp_hf(y))
++ profile_init(backend, PA_BLUETOOTH_PROFILE_HFP_HF);
+
+ return backend;
+ }
+@@ -707,6 +720,8 @@ void pa_bluetooth_native_backend_free(pa_bluetooth_backend *backend) {
+ if (backend->enable_hs_role)
+ profile_done(backend, PA_BLUETOOTH_PROFILE_HFP_AG);
+ profile_done(backend, PA_BLUETOOTH_PROFILE_HSP_HS);
++ if (pa_bluetooth_discovery_get_enable_native_hfp_hf(backend->discovery))
++ profile_done(backend, PA_BLUETOOTH_PROFILE_HFP_HF);
+
+ pa_dbus_connection_unref(backend->connection);
+
+diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c
+index 4470f2ef..80a025d5 100644
+--- a/src/modules/bluetooth/bluez5-util.c
++++ b/src/modules/bluetooth/bluez5-util.c
+@@ -92,6 +92,7 @@ struct pa_bluetooth_discovery {
+ int headset_backend;
+ pa_bluetooth_backend *ofono_backend, *native_backend;
+ PA_LLIST_HEAD(pa_dbus_pending, pending);
++ bool enable_native_hfp_hf;
+ };
+
+ static pa_dbus_pending* send_and_add_to_pending(pa_bluetooth_discovery *y, DBusMessage *m,
+@@ -169,14 +170,27 @@ static const char *transport_state_to_string(pa_bluetooth_transport_state_t stat
+ }
+
+ static bool device_supports_profile(pa_bluetooth_device *device, pa_bluetooth_profile_t profile) {
++ bool show_hfp, show_hsp, enable_native_hfp_hf;
++
++ enable_native_hfp_hf = pa_bluetooth_discovery_get_enable_native_hfp_hf(device->discovery);
++
++ if (enable_native_hfp_hf) {
++ show_hfp = pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_HF);
++ show_hsp = !show_hfp;
++ } else {
++ show_hfp = false;
++ show_hsp = true;
++ }
++
+ switch (profile) {
+ case PA_BLUETOOTH_PROFILE_A2DP_SINK:
+ return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_A2DP_SINK);
+ case PA_BLUETOOTH_PROFILE_A2DP_SOURCE:
+ return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_A2DP_SOURCE);
+ case PA_BLUETOOTH_PROFILE_HSP_HS:
+- return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_HS)
+- || !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_HF);
++ return show_hsp && !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_HS);
++ case PA_BLUETOOTH_PROFILE_HFP_HF:
++ return show_hfp && !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_HF);
+ case PA_BLUETOOTH_PROFILE_HFP_AG:
+ return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_AG)
+ || !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_AG);
+@@ -536,6 +550,14 @@ pa_bluetooth_device* pa_bluetooth_discovery_get_device_by_path(pa_bluetooth_disc
+ return NULL;
+ }
+
++bool pa_bluetooth_discovery_get_enable_native_hfp_hf(pa_bluetooth_discovery *y)
++{
++ pa_assert(y);
++ pa_assert(PA_REFCNT_VALUE(y) > 0);
++
++ return y->enable_native_hfp_hf;
++}
++
+ pa_bluetooth_device* pa_bluetooth_discovery_get_device_by_address(pa_bluetooth_discovery *y, const char *remote, const char *local) {
+ pa_bluetooth_device *d;
+ void *state = NULL;
+@@ -1306,6 +1328,8 @@ const char *pa_bluetooth_profile_to_string(pa_bluetooth_profile_t profile) {
+ return "a2dp_source";
+ case PA_BLUETOOTH_PROFILE_HSP_HS:
+ return "headset_head_unit";
++ case PA_BLUETOOTH_PROFILE_HFP_HF:
++ return "headset_handsfree";
+ case PA_BLUETOOTH_PROFILE_HFP_AG:
+ return "headset_audio_gateway";
+ case PA_BLUETOOTH_PROFILE_OFF:
+@@ -1727,7 +1751,7 @@ static void endpoint_done(pa_bluetooth_discovery *y, pa_bluetooth_profile_t prof
+ }
+ }
+
+-pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c, int headset_backend) {
++pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c, int headset_backend, bool enable_native_hfp_hf) {
+ pa_bluetooth_discovery *y;
+ DBusError err;
+ DBusConnection *conn;
+@@ -1737,6 +1761,7 @@ pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c, int headset_backe
+ PA_REFCNT_INIT(y);
+ y->core = c;
+ y->headset_backend = headset_backend;
++ y->enable_native_hfp_hf = enable_native_hfp_hf;
+ y->adapters = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL,
+ (pa_free_cb_t) adapter_free);
+ y->devices = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL,
+diff --git a/src/modules/bluetooth/bluez5-util.h b/src/modules/bluetooth/bluez5-util.h
+index 84c0c3f1..b077ca2c 100644
+--- a/src/modules/bluetooth/bluez5-util.h
++++ b/src/modules/bluetooth/bluez5-util.h
+@@ -47,6 +47,7 @@ typedef enum profile {
+ PA_BLUETOOTH_PROFILE_A2DP_SINK,
+ PA_BLUETOOTH_PROFILE_A2DP_SOURCE,
+ PA_BLUETOOTH_PROFILE_HSP_HS,
++ PA_BLUETOOTH_PROFILE_HFP_HF,
+ PA_BLUETOOTH_PROFILE_HFP_AG,
+ PA_BLUETOOTH_PROFILE_OFF
+ } pa_bluetooth_profile_t;
+@@ -161,8 +162,9 @@ const char *pa_bluetooth_profile_to_string(pa_bluetooth_profile_t profile);
+ #define HEADSET_BACKEND_NATIVE 1
+ #define HEADSET_BACKEND_AUTO 2
+
+-pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *core, int headset_backend);
++pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *core, int headset_backend, bool default_profile_hfp);
+ pa_bluetooth_discovery* pa_bluetooth_discovery_ref(pa_bluetooth_discovery *y);
+ void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y);
+ void pa_bluetooth_discovery_set_ofono_running(pa_bluetooth_discovery *y, bool is_running);
++bool pa_bluetooth_discovery_get_enable_native_hfp_hf(pa_bluetooth_discovery *y);
+ #endif
+diff --git a/src/modules/bluetooth/module-bluetooth-policy.c b/src/modules/bluetooth/module-bluetooth-policy.c
+index 316b9a82..b17c5d39 100644
+--- a/src/modules/bluetooth/module-bluetooth-policy.c
++++ b/src/modules/bluetooth/module-bluetooth-policy.c
+@@ -365,7 +365,8 @@ static pa_hook_result_t profile_available_hook_callback(pa_core *c, pa_card_prof
+ /* Do not automatically switch profiles for headsets, just in case */
+ /* TODO: remove a2dp and hsp when we remove BlueZ 4 support */
+ if (pa_streq(profile->name, "hsp") || pa_streq(profile->name, "a2dp") || pa_streq(profile->name, "a2dp_sink") ||
+- pa_streq(profile->name, "headset_head_unit"))
++ pa_streq(profile->name, "headset_head_unit") ||
++ pa_streq(profile->name, "headset_handsfree"))
+ return PA_HOOK_OK;
+
+ is_active_profile = card->active_profile == profile;
+diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c
+index d076fbad..d37ce9ce 100644
+--- a/src/modules/bluetooth/module-bluez5-device.c
++++ b/src/modules/bluetooth/module-bluez5-device.c
+@@ -258,6 +258,7 @@ static int sco_process_render(struct userdata *u) {
+
+ pa_assert(u);
+ pa_assert(u->profile == PA_BLUETOOTH_PROFILE_HSP_HS ||
++ u->profile == PA_BLUETOOTH_PROFILE_HFP_HF ||
+ u->profile == PA_BLUETOOTH_PROFILE_HFP_AG);
+ pa_assert(u->sink);
+
+@@ -318,6 +319,7 @@ static int sco_process_push(struct userdata *u) {
+
+ pa_assert(u);
+ pa_assert(u->profile == PA_BLUETOOTH_PROFILE_HSP_HS ||
++ u->profile == PA_BLUETOOTH_PROFILE_HFP_HF||
+ u->profile == PA_BLUETOOTH_PROFILE_HFP_AG);
+ pa_assert(u->source);
+ pa_assert(u->read_smoother);
+@@ -784,7 +786,9 @@ static void transport_release(struct userdata *u) {
+
+ /* Run from I/O thread */
+ static void transport_config_mtu(struct userdata *u) {
+- if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS || u->profile == PA_BLUETOOTH_PROFILE_HFP_AG) {
++ if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS
++ || u->profile == PA_BLUETOOTH_PROFILE_HFP_HF
++ || u->profile == PA_BLUETOOTH_PROFILE_HFP_AG) {
+ u->read_block_size = u->read_link_mtu;
+ u->write_block_size = u->write_link_mtu;
+
+@@ -1004,7 +1008,8 @@ static int add_source(struct userdata *u) {
+ data.namereg_fail = false;
+ pa_proplist_sets(data.proplist, "bluetooth.protocol", pa_bluetooth_profile_to_string(u->profile));
+ pa_source_new_data_set_sample_spec(&data, &u->sample_spec);
+- if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS)
++ if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS
++ || u->profile == PA_BLUETOOTH_PROFILE_HFP_HF)
+ pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
+
+ connect_ports(u, &data, PA_DIRECTION_INPUT);
+@@ -1016,6 +1021,7 @@ static int add_source(struct userdata *u) {
+ data.suspend_cause = PA_SUSPEND_USER;
+ break;
+ case PA_BLUETOOTH_PROFILE_HSP_HS:
++ case PA_BLUETOOTH_PROFILE_HFP_HF:
+ /* u->stream_fd contains the error returned by the last transport_acquire()
+ * EAGAIN means we are waiting for a NewConnection signal */
+ if (u->stream_fd == -EAGAIN)
+@@ -1039,7 +1045,9 @@ static int add_source(struct userdata *u) {
+ u->source->userdata = u;
+ u->source->parent.process_msg = source_process_msg;
+
+- if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS || u->profile == PA_BLUETOOTH_PROFILE_HFP_AG) {
++ if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS
++ || u->profile == PA_BLUETOOTH_PROFILE_HFP_AG
++ || u->profile == PA_BLUETOOTH_PROFILE_HFP_HF) {
+ pa_source_set_set_volume_callback(u->source, source_set_volume_cb);
+ u->source->n_volume_steps = 16;
+ }
+@@ -1174,7 +1182,8 @@ static int add_sink(struct userdata *u) {
+ data.namereg_fail = false;
+ pa_proplist_sets(data.proplist, "bluetooth.protocol", pa_bluetooth_profile_to_string(u->profile));
+ pa_sink_new_data_set_sample_spec(&data, &u->sample_spec);
+- if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS)
++ if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS
++ || u->profile == PA_BLUETOOTH_PROFILE_HFP_HF)
+ pa_proplist_sets(data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
+
+ connect_ports(u, &data, PA_DIRECTION_OUTPUT);
+@@ -1185,6 +1194,7 @@ static int add_sink(struct userdata *u) {
+ data.suspend_cause = PA_SUSPEND_USER;
+ break;
+ case PA_BLUETOOTH_PROFILE_HSP_HS:
++ case PA_BLUETOOTH_PROFILE_HFP_HF:
+ /* u->stream_fd contains the error returned by the last transport_acquire()
+ * EAGAIN means we are waiting for a NewConnection signal */
+ if (u->stream_fd == -EAGAIN)
+@@ -1210,7 +1220,9 @@ static int add_sink(struct userdata *u) {
+ u->sink->userdata = u;
+ u->sink->parent.process_msg = sink_process_msg;
+
+- if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS || u->profile == PA_BLUETOOTH_PROFILE_HFP_AG) {
++ if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS
++ || u->profile == PA_BLUETOOTH_PROFILE_HFP_AG
++ || u->profile == PA_BLUETOOTH_PROFILE_HFP_HF) {
+ pa_sink_set_set_volume_callback(u->sink, sink_set_volume_cb);
+ u->sink->n_volume_steps = 16;
+ }
+@@ -1219,7 +1231,9 @@ static int add_sink(struct userdata *u) {
+
+ /* Run from main thread */
+ static void transport_config(struct userdata *u) {
+- if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS || u->profile == PA_BLUETOOTH_PROFILE_HFP_AG) {
++ if (u->profile == PA_BLUETOOTH_PROFILE_HSP_HS
++ || u->profile == PA_BLUETOOTH_PROFILE_HFP_HF
++ || u->profile == PA_BLUETOOTH_PROFILE_HFP_AG) {
+ u->sample_spec.format = PA_SAMPLE_S16LE;
+ u->sample_spec.channels = 1;
+ u->sample_spec.rate = 8000;
+@@ -1370,6 +1384,7 @@ static pa_direction_t get_profile_direction(pa_bluetooth_profile_t p) {
+ [PA_BLUETOOTH_PROFILE_A2DP_SINK] = PA_DIRECTION_OUTPUT,
+ [PA_BLUETOOTH_PROFILE_A2DP_SOURCE] = PA_DIRECTION_INPUT,
+ [PA_BLUETOOTH_PROFILE_HSP_HS] = PA_DIRECTION_INPUT | PA_DIRECTION_OUTPUT,
++ [PA_BLUETOOTH_PROFILE_HFP_HF] = PA_DIRECTION_INPUT | PA_DIRECTION_OUTPUT,
+ [PA_BLUETOOTH_PROFILE_HFP_AG] = PA_DIRECTION_INPUT | PA_DIRECTION_OUTPUT,
+ [PA_BLUETOOTH_PROFILE_OFF] = 0
+ };
+@@ -1874,7 +1889,20 @@ static pa_card_profile *create_card_profile(struct userdata *u, pa_bluetooth_pro
+ break;
+
+ case PA_BLUETOOTH_PROFILE_HSP_HS:
+- cp = pa_card_profile_new(name, _("Headset Head Unit (HSP/HFP)"), sizeof(pa_bluetooth_profile_t));
++ cp = pa_card_profile_new(name, _("Headset Head Unit (HSP)"), sizeof(pa_bluetooth_profile_t));
++ cp->priority = 20;
++ cp->n_sinks = 1;
++ cp->n_sources = 1;
++ cp->max_sink_channels = 1;
++ cp->max_source_channels = 1;
++ pa_hashmap_put(input_port->profiles, cp->name, cp);
++ pa_hashmap_put(output_port->profiles, cp->name, cp);
++
++ p = PA_CARD_PROFILE_DATA(cp);
++ break;
++
++ case PA_BLUETOOTH_PROFILE_HFP_HF:
++ cp = pa_card_profile_new(name, _("Headset Handsfree (HFP)"), sizeof(pa_bluetooth_profile_t));
+ cp->priority = 20;
+ cp->n_sinks = 1;
+ cp->n_sources = 1;
+@@ -1960,8 +1988,10 @@ static int uuid_to_profile(const char *uuid, pa_bluetooth_profile_t *_r) {
+ *_r = PA_BLUETOOTH_PROFILE_A2DP_SINK;
+ else if (pa_streq(uuid, PA_BLUETOOTH_UUID_A2DP_SOURCE))
+ *_r = PA_BLUETOOTH_PROFILE_A2DP_SOURCE;
+- else if (pa_streq(uuid, PA_BLUETOOTH_UUID_HSP_HS) || pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_HF))
++ else if (pa_streq(uuid, PA_BLUETOOTH_UUID_HSP_HS))
+ *_r = PA_BLUETOOTH_PROFILE_HSP_HS;
++ else if (pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_HF))
++ *_r = PA_BLUETOOTH_PROFILE_HFP_HF;
+ else if (pa_streq(uuid, PA_BLUETOOTH_UUID_HSP_AG) || pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_AG))
+ *_r = PA_BLUETOOTH_PROFILE_HFP_AG;
+ else
+@@ -1980,6 +2010,7 @@ static int add_card(struct userdata *u) {
+ pa_bluetooth_profile_t *p;
+ const char *uuid;
+ void *state;
++ bool enable_native_hfp_hf, has_both;
+
+ pa_assert(u);
+ pa_assert(u->device);
+@@ -2010,9 +2041,22 @@ static int add_card(struct userdata *u) {
+
+ create_card_ports(u, data.ports);
+
++ enable_native_hfp_hf = pa_bluetooth_discovery_get_enable_native_hfp_hf(u->discovery);
++
++ has_both = enable_native_hfp_hf && pa_hashmap_get(d->uuids, PA_BLUETOOTH_UUID_HFP_HF) && pa_hashmap_get(d->uuids, PA_BLUETOOTH_UUID_HSP_HS);
+ PA_HASHMAP_FOREACH(uuid, d->uuids, state) {
+ pa_bluetooth_profile_t profile;
+
++ if (!enable_native_hfp_hf && pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_HF)) {
++ pa_log_info("device supports HFP but disabling profile as requested");
++ continue;
++ }
++
++ if (has_both && pa_streq(uuid, PA_BLUETOOTH_UUID_HSP_HS)) {
++ pa_log_info("device support HSP and HFP, selecting HFP only");
++ continue;
++ }
++
+ if (uuid_to_profile(uuid, &profile) < 0)
+ continue;
+
+diff --git a/src/modules/bluetooth/module-bluez5-discover.c b/src/modules/bluetooth/module-bluez5-discover.c
+index c535ead4..bfb361ae 100644
+--- a/src/modules/bluetooth/module-bluez5-discover.c
++++ b/src/modules/bluetooth/module-bluez5-discover.c
+@@ -104,6 +104,7 @@ int pa__init(pa_module *m) {
+ const char *headset_str;
+ int headset_backend;
+ bool autodetect_mtu;
++ bool enable_native_hfp_hf = true;
+
+ pa_assert(m);
+
+@@ -127,6 +128,9 @@ int pa__init(pa_module *m) {
+ autodetect_mtu = false;
+ if (pa_modargs_get_value_boolean(ma, "autodetect_mtu", &autodetect_mtu) < 0) {
+ pa_log("Invalid boolean value for autodetect_mtu parameter");
++ }
++ if (pa_modargs_get_value_boolean(ma, "enable_native_hfp_hf", &enable_native_hfp_hf) < 0) {
++ pa_log("enable_native_hfp_hf must be true or false");
+ goto fail;
+ }
+
+@@ -136,7 +140,7 @@ int pa__init(pa_module *m) {
+ u->autodetect_mtu = autodetect_mtu;
+ u->loaded_device_paths = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+
+- if (!(u->discovery = pa_bluetooth_discovery_get(u->core, headset_backend)))
++ if (!(u->discovery = pa_bluetooth_discovery_get(u->core, headset_backend, enable_native_hfp_hf)))
+ goto fail;
+
+ u->device_connection_changed_slot =
diff --git a/SOURCES/v5-3-4-bluetooth-add-correct-HFP-rfcomm-negotiation.patch b/SOURCES/v5-3-4-bluetooth-add-correct-HFP-rfcomm-negotiation.patch
new file mode 100644
index 0000000..c93c0f1
--- /dev/null
+++ b/SOURCES/v5-3-4-bluetooth-add-correct-HFP-rfcomm-negotiation.patch
@@ -0,0 +1,199 @@
+diff --git a/src/modules/bluetooth/backend-native.c b/src/modules/bluetooth/backend-native.c
+index 9ec9244b..99efa066 100644
+--- a/src/modules/bluetooth/backend-native.c
++++ b/src/modules/bluetooth/backend-native.c
+@@ -53,6 +53,43 @@ struct transport_data {
+ pa_mainloop_api *mainloop;
+ };
+
++struct hfp_config {
++ uint32_t capabilities;
++ int state;
++};
++
++/*
++ * the separate hansfree headset (HF) and Audio Gateway (AG) features
++ */
++enum hfp_hf_features {
++ HFP_HF_EC_NR = 0,
++ HFP_HF_CALL_WAITING = 1,
++ HFP_HF_CLI = 2,
++ HFP_HF_VR = 3,
++ HFP_HF_RVOL = 4,
++ HFP_HF_ESTATUS = 5,
++ HFP_HF_ECALL = 6,
++ HFP_HF_CODECS = 7,
++};
++
++enum hfp_ag_features {
++ HFP_AG_THREE_WAY = 0,
++ HFP_AG_EC_NR = 1,
++ HFP_AG_VR = 2,
++ HFP_AG_RING = 3,
++ HFP_AG_NUM_TAG = 4,
++ HFP_AG_REJECT = 5,
++ HFP_AG_ESTATUS = 6,
++ HFP_AG_ECALL = 7,
++ HFP_AG_EERR = 8,
++ HFP_AG_CODECS = 9,
++};
++
++/* gateway features we support, which is as little as we can get away with */
++static uint32_t hfp_features =
++ /* HFP 1.6 requires this */
++ (1 << HFP_AG_ESTATUS );
++
+ #define BLUEZ_SERVICE "org.bluez"
+ #define BLUEZ_MEDIA_TRANSPORT_INTERFACE BLUEZ_SERVICE ".MediaTransport1"
+
+@@ -109,6 +146,27 @@ static pa_dbus_pending* send_and_add_to_pending(pa_bluetooth_backend *backend, D
+ return p;
+ }
+
++static void rfcomm_write(int fd, const char *str)
++{
++ size_t len;
++ char buf[512];
++
++ pa_log_debug("RFCOMM >> %s", str);
++ sprintf(buf, "\r\n%s\r\n", str);
++ len = write(fd, buf, strlen(buf));
++
++ if (len != strlen(buf))
++ pa_log_error("RFCOMM write error: %s", pa_cstrerror(errno));
++}
++
++static void hfp_send_features(int fd)
++{
++ char buf[512];
++
++ sprintf(buf, "+BRSF: %d", hfp_features);
++ rfcomm_write(fd, buf);
++}
++
+ static int sco_do_connect(pa_bluetooth_transport *t) {
+ pa_bluetooth_device *d = t->device;
+ struct sockaddr_sco addr;
+@@ -352,6 +410,61 @@ static void register_profile(pa_bluetooth_backend *b, const char *profile, const
+ send_and_add_to_pending(b, m, register_profile_reply, pa_xstrdup(profile));
+ }
+
++static void transport_put(pa_bluetooth_transport *t)
++{
++ pa_bluetooth_transport_put(t);
++
++ pa_log_debug("Transport %s available for profile %s", t->path, pa_bluetooth_profile_to_string(t->profile));
++}
++
++static bool hfp_rfcomm_handle(int fd, pa_bluetooth_transport *t, const char *buf)
++{
++ struct hfp_config *c = t->config;
++ int val;
++
++ /* stateful negotiation */
++ if (c->state == 0 && sscanf(buf, "AT+BRSF=%d", &val) == 1) {
++ c->capabilities = val;
++ pa_log_info("HFP capabilities returns 0x%x", val);
++ hfp_send_features(fd);
++ c->state = 1;
++ return true;
++ } else if (c->state == 1 && pa_startswith(buf, "AT+CIND=?")) {
++ /* we declare minimal no indicators */
++ rfcomm_write(fd, "+CIND: "
++ /* many indicators can be supported, only call and
++ * callheld are mandatory, so that's all we repy */
++ "(\"call\",(0-1)),"
++ "(\"callheld\",(0-2))");
++ c->state = 2;
++ return true;
++ } else if (c->state == 2 && pa_startswith(buf, "AT+CIND?")) {
++ rfcomm_write(fd, "+CIND: 0,0");
++ c->state = 3;
++ return true;
++ } else if ((c->state == 2 || c->state == 3) && pa_startswith(buf, "AT+CMER=")) {
++ rfcomm_write(fd, "\r\nOK\r\n");
++ c->state = 4;
++ transport_put(t);
++ return false;
++ }
++
++ /* if we get here, negotiation should be complete */
++ if (c->state != 4) {
++ pa_log_error("HFP negotiation failed in state %d with inbound %s\n",
++ c->state, buf);
++ rfcomm_write(fd, "ERROR");
++ return false;
++ }
++
++ /*
++ * once we're fully connected, just reply OK to everything
++ * it will just be the headset sending the occasional status
++ * update, but we process only the ones we care about
++ */
++ return true;
++}
++
+ static void rfcomm_io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_io_event_flags_t events, void *userdata) {
+ pa_bluetooth_transport *t = userdata;
+
+@@ -398,6 +511,8 @@ static void rfcomm_io_callback(pa_mainloop_api *io, pa_io_event *e, int fd, pa_i
+ do_reply = true;
+ } else if (sscanf(buf, "AT+CKPD=%d", &dummy) == 1) {
+ do_reply = true;
++ } else if (t->config) { /* t->config is only non-null for hfp profile */
++ do_reply = hfp_rfcomm_handle(fd, t, buf);
+ } else {
+ do_reply = false;
+ }
+@@ -540,7 +655,9 @@ static DBusMessage *profile_new_connection(DBusConnection *conn, DBusMessage *m,
+ sender = dbus_message_get_sender(m);
+
+ pathfd = pa_sprintf_malloc ("%s/fd%d", path, fd);
+- t = pa_bluetooth_transport_new(d, sender, pathfd, p, NULL, 0);
++ t = pa_bluetooth_transport_new(d, sender, pathfd, p, NULL,
++ p == PA_BLUETOOTH_PROFILE_HFP_HF ?
++ sizeof(struct hfp_config) : 0);
+ pa_xfree(pathfd);
+
+ t->acquire = sco_acquire_cb;
+@@ -558,9 +675,8 @@ static DBusMessage *profile_new_connection(DBusConnection *conn, DBusMessage *m,
+
+ sco_listen(t);
+
+- pa_bluetooth_transport_put(t);
+-
+- pa_log_debug("Transport %s available for profile %s", t->path, pa_bluetooth_profile_to_string(t->profile));
++ if (p != PA_BLUETOOTH_PROFILE_HFP_HF)
++ transport_put(t);
+
+ pa_assert_se(r = dbus_message_new_method_return(m));
+
+diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c
+index 80a025d5..8be8a11d 100644
+--- a/src/modules/bluetooth/bluez5-util.c
++++ b/src/modules/bluetooth/bluez5-util.c
+@@ -150,7 +150,10 @@ pa_bluetooth_transport *pa_bluetooth_transport_new(pa_bluetooth_device *d, const
+
+ if (size > 0) {
+ t->config = pa_xnew(uint8_t, size);
+- memcpy(t->config, config, size);
++ if (config)
++ memcpy(t->config, config, size);
++ else
++ memset(t->config, 0, size);
+ }
+
+ return t;
+diff --git a/src/modules/bluetooth/bluez5-util.h b/src/modules/bluetooth/bluez5-util.h
+index b077ca2c..23f9a798 100644
+--- a/src/modules/bluetooth/bluez5-util.h
++++ b/src/modules/bluetooth/bluez5-util.h
+@@ -73,7 +73,7 @@ struct pa_bluetooth_transport {
+ pa_bluetooth_profile_t profile;
+
+ uint8_t codec;
+- uint8_t *config;
++ void *config;
+ size_t config_size;
+
+ uint16_t microphone_gain;
diff --git a/SOURCES/v5-4-4-bluetooth-make-native-the-default-backend.patch b/SOURCES/v5-4-4-bluetooth-make-native-the-default-backend.patch
new file mode 100644
index 0000000..b11d4c6
--- /dev/null
+++ b/SOURCES/v5-4-4-bluetooth-make-native-the-default-backend.patch
@@ -0,0 +1,32 @@
+diff --git a/src/modules/bluetooth/module-bluez5-discover.c b/src/modules/bluetooth/module-bluez5-discover.c
+index bfb361ae..d2a0420d 100644
+--- a/src/modules/bluetooth/module-bluez5-discover.c
++++ b/src/modules/bluetooth/module-bluez5-discover.c
+@@ -93,7 +93,7 @@ static pa_hook_result_t device_connection_changed_cb(pa_bluetooth_discovery *y,
+ }
+
+ #ifdef HAVE_BLUEZ_5_NATIVE_HEADSET
+-const char *default_headset_backend = "auto";
++const char *default_headset_backend = "native";
+ #else
+ const char *default_headset_backend = "ofono";
+ #endif
+@@ -104,7 +104,7 @@ int pa__init(pa_module *m) {
+ const char *headset_str;
+ int headset_backend;
+ bool autodetect_mtu;
+- bool enable_native_hfp_hf = true;
++ bool enable_native_hfp_hf;
+
+ pa_assert(m);
+
+@@ -125,6 +125,9 @@ int pa__init(pa_module *m) {
+ goto fail;
+ }
+
++ /* default value if no module parameter */
++ enable_native_hfp_hf = (headset_backend == HEADSET_BACKEND_NATIVE);
++
+ autodetect_mtu = false;
+ if (pa_modargs_get_value_boolean(ma, "autodetect_mtu", &autodetect_mtu) < 0) {
+ pa_log("Invalid boolean value for autodetect_mtu parameter");
diff --git a/SPECS/pulseaudio.spec b/SPECS/pulseaudio.spec
new file mode 100644
index 0000000..d54ce43
--- /dev/null
+++ b/SPECS/pulseaudio.spec
@@ -0,0 +1,1145 @@
+%global pa_major 11.1
+#global pa_minor 0
+
+#global snap 20141103
+#global gitrel 327
+#global gitcommit aec811798cd883a454b9b5cd82c77831906bbd2d
+#global shortcommit (c=%{gitcommit}; echo ${c:0:5})
+
+# webrtc bits go wonky without this
+# see also https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/JQQ66XJSIT2FGTK2YQY7AXMEH5IXMPUX/
+%undefine _strict_symbol_defs_build
+%global with_webrtc 1
+
+# https://bugzilla.redhat.com/983606
+%global _hardened_build 1
+
+## support systemd activation
+%global systemd 1
+## enable systemd activation by default (instead of autospawn)
+%if 0%{?fedora} || 0%{?rhel} > 7
+%global systemd_activation 1
+## TODO: ship preset to explicitly disable .service, enable .socket
+%else
+# gdm-hooks moved to gdm packaging f28+
+%global gdm_hooks 1
+%endif
+
+## tcp_wrapper support
+%if 0%{?fedora} < 28 && 0%{?rhel} <= 7
+%global tcpwrap 1
+%endif
+
+## comment to disable tests
+%global tests 1
+
+# where/how to apply multilib hacks
+%global multilib_archs x86_64 %{ix86} ppc64 ppc s390x s390 sparc64 sparcv9 ppc64le
+
+Name: pulseaudio
+Summary: Improved Linux Sound Server
+Version: %{pa_major}%{?pa_minor:.%{pa_minor}}
+Release: 22%{?snap:.%{snap}git%{shortcommit}}%{?dist}
+License: LGPLv2+
+URL: http://www.freedesktop.org/wiki/Software/PulseAudio
+%if 0%{?gitrel}
+# git clone git://anongit.freedesktop.org/pulseaudio/pulseaudio
+# cd pulseaudio; git reset --hard %{gitcommit}; ./autogen.sh; make; make distcheck
+Source0: pulseaudio-%{version}-%{gitrel}-g%{shortcommit}.tar.xz
+%else
+Source0: http://freedesktop.org/software/pulseaudio/releases/pulseaudio-%{version}.tar.xz
+Source1: http://freedesktop.org/software/pulseaudio/releases/pulseaudio-%{version}.tar.xz.md5
+Source2: http://freedesktop.org/software/pulseaudio/releases/pulseaudio-%{version}.tar.xz.sha1
+%endif
+
+Source5: default.pa-for-gdm
+
+# revert upstream commit to rely solely on autospawn for autostart, instead
+# include a fallback to manual launch when autospawn fails, like when
+# user disables autospawn, or logging in as root
+# valid even when using systemd socket activation too
+Patch201: pulseaudio-autostart.patch
+
+# disable flat-volumes by default
+# https://bugzilla.redhat.com/show_bug.cgi?id=1265267
+Patch202: pulseaudio-9.0-disable_flat_volumes.patch
+
+# bz#1067470, only start threads on activ CPUs
+# see also https://bugs.freedesktop.org/show_bug.cgi?id=96638
+Patch203: pulseaudio-8.99.2-getaffinity.patch
+
+# upstreamed exit_idle_time solution, set to 0 in managed environments
+Patch204: pulseaudio-11.1-exit_idle_time-2.patch
+
+# workaround rawhide build failures, avoid dup'd memfd_create declaration
+# https://bugs.freedesktop.org/show_bug.cgi?id=104733
+Patch205: pulseaudio-11.1-glibc_memfd.patch
+
+# disable autospawn
+Patch206: pulseaudio-11.1-autospawn_disable.patch
+
+## upstream patches
+Patch4: 0004-alsa-mixer-Add-support-for-usb-audio-in-the-Dell-doc.patch
+Patch9: 0009-alsa-mixer-set-PCM-Capture-Source-for-iec958-input.patch
+Patch10: 0010-build-sys-add-iec958-stereo-input.conf-to-dist_alsap.patch
+Patch15: 0015-alsa-mixer-round-not-truncate-in-to_alsa_dB.patch
+Patch16: 0016-alsa-mixer-add-support-for-Steelseries-Arctis-7-head.patch
+Patch18: 0018-build-sys-add-the-Arctis-configuration.patch
+Patch33: 0033-qpaeq-change-license-from-AGPL-to-LGPL-v2.1.patch
+Patch35: 0035-alsa-mixer-Prioritize-hdmi-mappings-over-iec958-mapp.patch
+Patch74: 0074-build-sys-add-the-Dell-dock-TB16-configuration.patch
+Patch84: 0084-sink-source-Don-t-finish-move-if-unlink-happens-afte.patch
+Patch85: 0085-client-conf-Add-a-default-value-for-disable-memfd.patch
+Patch90: 0090-qpaeq-port-to-PyQt5.patch
+Patch93: 0093-alsa-fix-infinite-loop-with-Intel-HDMI-LPE.patch
+Patch96: 0106-memfd-wrappers-only-define-memfd_create-if-not-alrea.patch
+Patch97: pulseaudio-python3.patch
+
+## upstreamable patches
+# patchset from https://bugs.freedesktop.org/show_bug.cgi?id=100488
+Patch100: Fix-Intel-HDMI-LPE-problems.patch
+# patchset from https://bugs.freedesktop.org/show_bug.cgi?id=93898
+Patch101: v5-1-4-bluetooth-use-consistent-profile-names.patch
+Patch102: v5-2-4-bluetooth-separate-HSP-and-HFP.patch
+Patch103: v5-3-4-bluetooth-add-correct-HFP-rfcomm-negotiation.patch
+Patch104: v5-4-4-bluetooth-make-native-the-default-backend.patch
+# patchset from https://bugs.freedesktop.org/show_bug.cgi?id=100488 fixing pa
+# crashing on Bay/Cherry Trail unless realtime-scheduling=no is set
+Patch106: Fix-realtime-scheduling-on-byt-cht.patch
+Patch107: 0001-qpaeq-fix-Qt5-mainloop-use.patch
+
+BuildRequires: automake libtool
+BuildRequires: gcc-c++
+BuildRequires: pkgconfig(bash-completion)
+%global bash_completionsdir %(pkg-config --variable=completionsdir bash-completion 2>/dev/null || echo '/etc/bash_completion.d')
+BuildRequires: m4
+BuildRequires: libtool-ltdl-devel
+BuildRequires: intltool
+BuildRequires: pkgconfig
+BuildRequires: doxygen
+BuildRequires: xmltoman
+# https://bugzilla.redhat.com/show_bug.cgi?id=1518777
+%if 0%{?tcpwrap}
+BuildRequires: tcp_wrappers-devel
+%endif
+BuildRequires: libsndfile-devel
+BuildRequires: alsa-lib-devel
+BuildRequires: glib2-devel
+BuildRequires: gtk2-devel
+BuildRequires: GConf2-devel
+BuildRequires: avahi-devel
+%if 0%{?fedora}
+%global enable_lirc 1
+%global enable_jack 1
+%endif
+BuildRequires: libatomic_ops-static, libatomic_ops-devel
+BuildRequires: pkgconfig(bluez) >= 5.0
+BuildRequires: sbc-devel
+BuildRequires: libXt-devel
+BuildRequires: xorg-x11-proto-devel
+BuildRequires: libXtst-devel
+BuildRequires: libXi-devel
+BuildRequires: libSM-devel
+BuildRequires: libX11-devel
+BuildRequires: libICE-devel
+BuildRequires: xcb-util-devel
+BuildRequires: openssl-devel
+BuildRequires: orc-devel
+BuildRequires: libtdb-devel
+%if 0%{?fedora}
+BuildRequires: pkgconfig(soxr)
+%endif
+BuildRequires: pkgconfig(speexdsp) >= 1.2
+BuildRequires: libasyncns-devel
+%if 0%{?systemd}
+BuildRequires: systemd-devel >= 184
+BuildRequires: systemd
+%endif
+%if 0%{?systemd_activation}
+%{?systemd_requires}
+%endif
+BuildRequires: dbus-devel
+BuildRequires: libcap-devel
+BuildRequires: pkgconfig(fftw3f)
+%if 0%{?with_webrtc}
+BuildRequires: pkgconfig(webrtc-audio-processing) >= 0.2
+%endif
+%if 0%{?tests}
+BuildRequires: pkgconfig(check)
+%endif
+
+# retired along with -libs-zeroconf, add Obsoletes here for lack of anything better
+Obsoletes: padevchooser < 1.0
+Requires(pre): shadow-utils
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: rtkit
+
+%description
+PulseAudio is a sound server for Linux and other Unix like operating
+systems. It is intended to be an improved drop-in replacement for the
+Enlightened Sound Daemon (ESOUND).
+
+%package qpaeq
+Summary: Pulseaudio equalizer interface
+Requires: %{name}%{?_isa} = %{version}-%{release}
+%if 0%{?fedora} || 0%{?rhel} > 7
+Requires: python3-qt5
+Requires: python3-dbus
+%else
+Requires: python-qt5
+Requires: dbus-python
+%endif
+%description qpaeq
+qpaeq is a equalizer interface for pulseaudio's equalizer sinks.
+
+%package esound-compat
+Summary: PulseAudio EsounD daemon compatibility script
+Requires: %{name}%{?_isa} = %{version}-%{release}
+%description esound-compat
+A compatibility script that allows applications to call /usr/bin/esd
+and start PulseAudio with EsounD protocol modules.
+
+%if 0%{?enable_lirc}
+%package module-lirc
+Summary: LIRC support for the PulseAudio sound server
+BuildRequires: lirc-devel
+Requires: %{name}%{?_isa} = %{version}-%{release}
+%description module-lirc
+LIRC volume control module for the PulseAudio sound server.
+%endif
+
+%package module-x11
+Summary: X11 support for the PulseAudio sound server
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: %{name}-utils
+
+%description module-x11
+X11 bell and security modules for the PulseAudio sound server.
+
+%package module-zeroconf
+Summary: Zeroconf support for the PulseAudio sound server
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: %{name}-utils
+
+%description module-zeroconf
+Zeroconf publishing module for the PulseAudio sound server.
+
+%package module-bluetooth
+Summary: Bluetooth support for the PulseAudio sound server
+Requires: %{name}%{?_isa} = %{version}-%{release}
+Requires: bluez >= 5.0
+
+%description module-bluetooth
+Contains Bluetooth audio (A2DP/HSP/HFP) support for the PulseAudio sound server.
+
+%if 0%{?enable_jack}
+%package module-jack
+Summary: JACK support for the PulseAudio sound server
+BuildRequires: jack-audio-connection-kit-devel
+Requires: %{name}%{?_isa} = %{version}-%{release}
+%description module-jack
+JACK sink and source modules for the PulseAudio sound server.
+%endif
+
+%package module-gconf
+Summary: GConf support for the PulseAudio sound server
+Requires: %{name}%{?_isa} = %{version}-%{release}
+
+%description module-gconf
+GConf configuration backend for the PulseAudio sound server.
+
+%package libs
+Summary: Libraries for PulseAudio clients
+License: LGPLv2+
+Obsoletes: pulseaudio-libs-zeroconf < 1.1
+
+%description libs
+This package contains the runtime libraries for any application that wishes
+to interface with a PulseAudio sound server.
+
+%package libs-glib2
+Summary: GLIB 2.x bindings for PulseAudio clients
+License: LGPLv2+
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+
+%description libs-glib2
+This package contains bindings to integrate the PulseAudio client library with
+a GLIB 2.x based application.
+
+%package libs-devel
+Summary: Headers and libraries for PulseAudio client development
+License: LGPLv2+
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+Requires: %{name}-libs-glib2%{?_isa} = %{version}-%{release}
+%description libs-devel
+Headers and libraries for developing applications that can communicate with
+a PulseAudio sound server.
+
+%package utils
+Summary: PulseAudio sound server utilities
+License: LGPLv2+
+Requires: %{name}-libs%{?_isa} = %{version}-%{release}
+# when made non-multilib'd, https://bugzilla.redhat.com/891425
+Obsoletes: pulseaudio-utils < 3.0-3
+
+%description utils
+This package contains command line utilities for the PulseAudio sound server.
+
+%if 0%{?gdm_hooks}
+%package gdm-hooks
+Summary: PulseAudio GDM integration
+License: LGPLv2+
+Requires: gdm >= 1:2.22.0
+# for the gdm user
+Requires(pre): gdm
+
+%description gdm-hooks
+This package contains GDM integration hooks for the PulseAudio sound server.
+%endif
+
+
+%prep
+%setup -q -T -b0 -n %{name}-%{version}%{?gitrel:-%{gitrel}-g%{shortcommit}}
+
+## upstream patches
+%patch4 -p1
+%patch9 -p1
+%patch10 -p1
+%patch15 -p1
+%patch16 -p1
+%patch18 -p1
+%patch33 -p1
+%patch35 -p1
+%patch74 -p1
+%patch84 -p1
+%patch85 -p1
+%patch90 -p1
+# skip patch, possibly regressionish, https://bugzilla.redhat.com/show_bug.cgi?id=1551270
+#patch93 -p1
+%patch96 -p1
+# python3
+%patch97 -p1
+## upstreamable patches
+## per comments in the upstream bug, it would *appear* this one is no longer needed after applying patch93
+#patch100 -p1
+# rawhide-only, for now, on hadess' advice --rex
+%if 0%{?fedora} || 0%{?rhel} > 7
+%patch101 -p1
+%patch102 -p1
+%patch103 -p1
+%patch104 -p1
+%endif
+%patch106 -p1
+%patch107 -p1
+
+%patch201 -p1 -b .autostart
+%patch202 -p1 -b .disable_flat_volumes
+#patch203 -p1 -b .affinity
+%patch204 -p1 -b .exit_idle_time
+#if 0%{?fedora} > 27
+#patch205 -p1 -b .glibc_memfd
+#endif
+%if 0%{?systemd_activation}
+%patch206 -p1 -b .autospawn_disable
+%endif
+
+sed -i.no_consolekit -e \
+ 's/^load-module module-console-kit/#load-module module-console-kit/' \
+ src/daemon/default.pa.in
+
+%if 0%{?gitrel:1}
+# fixup PACKAGE_VERSION that leaks into pkgconfig files and friends
+sed -i.PACKAGE_VERSION -e "s|^PACKAGE_VERSION=.*|PACKAGE_VERSION=\'%{version}\'|" configure
+%else
+## kill rpaths
+# needed for (at least) patch18
+NOCONFIGURE=1 ./bootstrap.sh
+
+#if "%{_libdir}" != "/usr/lib"
+#sed -i -e 's|"/lib /usr/lib|"/%{_lib} %{_libdir}|' configure
+#endif
+%endif
+
+
+%build
+%configure \
+ --disable-silent-rules \
+ --disable-static \
+ --disable-rpath \
+ --with-system-user=pulse \
+ --with-system-group=pulse \
+ --with-access-group=pulse-access \
+ --disable-oss-output \
+ %{?enable_jack:--enable-jack}%{!?enable_jack:--disable-jack} \
+ %{?enable_lirc:--enable-lirc}%{!?enable_lirc:--disable-lirc} \
+ %{?tcpwrap:--enable-tcpwrap}%{!?tcpwrap:--disable-tcpwrap} \
+ --disable-bluez4 \
+ --enable-bluez5 \
+%ifarch %{arm}
+ --disable-neon-opt \
+%endif
+%if 0%{?with_webrtc}
+ --enable-webrtc-aec \
+%endif
+ %{!?systemd:--disable-systemd-daemon} \
+ %{?tests:--enable-tests}
+
+# we really should preopen here --preopen-mods=module-udev-detect.la, --force-preopen
+%make_build V=1
+
+make doxygen
+
+
+%install
+%make_install
+
+## padsp multilib hack alert
+%ifarch %{multilib_archs}
+pushd %{buildroot}%{_bindir}
+# make 32 bit version available as padsp-32
+# %%{_libdir} == /usr/lib may be a naive check for 32bit-ness
+# but should be the only case we care about here -- rex
+%if "%{_libdir}" == "/usr/lib"
+ln -s padsp padsp-32
+%else
+cp -a padsp padsp-32
+sed -i -e "s|%{_libdir}/pulseaudio/libpulsedsp.so|/usr/lib/pulseaudio/libpulsedsp.so|g" padsp-32
+%endif
+popd
+%endif
+
+# upstream should use udev.pc
+mkdir -p $RPM_BUILD_ROOT%{_prefix}/lib/udev/rules.d
+mv -fv $RPM_BUILD_ROOT/lib/udev/rules.d/90-pulseaudio.rules $RPM_BUILD_ROOT%{_prefix}/lib/udev/rules.d
+
+%if 0%{?gdm_hooks}
+install -p -m644 -D %{SOURCE5} $RPM_BUILD_ROOT%{_localstatedir}/lib/gdm/.pulse/default.pa
+%endif
+
+# take cue from dbus and manually place wants symlink instead of
+# relying on scriptlets exclusively. Helps handle upgrade cases
+# that standard scriptlets miss.
+%if 0%{?systemd_activation}
+mkdir %{buildroot}%{_userunitdir}/sockets.target.wants
+ln -s ../pulseaudio.socket %{buildroot}%{_userunitdir}/sockets.target.wants/pulseaudio.socket
+%endif
+
+## unpackaged files
+# extraneous libtool crud
+rm -fv $RPM_BUILD_ROOT%{_libdir}/lib*.la
+rm -fv $RPM_BUILD_ROOT%{_libdir}/pulseaudio/lib*.la
+rm -fv $RPM_BUILD_ROOT%{_libdir}/pulse-%{pa_major}/modules/*.la
+# PA_MODULE_DEPRECATED("Please use module-udev-detect instead of module-detect!");
+rm -fv $RPM_BUILD_ROOT%{_libdir}/pulse-%{pa_major}/modules/module-detect.so
+
+%find_lang %{name}
+
+
+%check
+%if 0%{?tests}
+%ifarch %{ix86} s390x
+# FIXME: i686 FAIL: cpu-remap-test
+# FIXME: s390x FAIL: core-util-test
+%global tests_nonfatal 1
+%endif
+%if 0%{?fedora} || 0%{?rhel} > 7
+# regression'ish failures on rawhide, not worth failing build (for now) -- rex
+%global tests_nonfatal 1
+%endif
+%make_build check || TESTS_ERROR=$?
+if [ "${TESTS_ERROR}" != "" ]; then
+cat src/test-suite.log
+%{!?tests_nonfatal:exit $TESTS_ERROR}
+fi
+%endif
+
+
+%pre
+getent group pulse-access >/dev/null || groupadd -r pulse-access
+getent group pulse-rt >/dev/null || groupadd -r pulse-rt
+getent group pulse >/dev/null || groupadd -f -g 171 -r pulse
+if ! getent passwd pulse >/dev/null ; then
+ if ! getent passwd 171 >/dev/null ; then
+ useradd -r -u 171 -g pulse -d %{_localstatedir}/run/pulse -s /sbin/nologin -c "PulseAudio System Daemon" pulse
+ else
+ useradd -r -g pulse -d %{_localstatedir}/run/pulse -s /sbin/nologin -c "PulseAudio System Daemon" pulse
+ fi
+fi
+exit 0
+
+%posttrans
+# handle renamed module-cork-music-on-phone => module-role-cork
+(grep '^load-module module-cork-music-on-phone$' %{_sysconfdir}/pulse/default.pa > /dev/null && \
+ sed -i.rpmsave -e 's|^load-module module-cork-music-on-phone$|load-module module-role-cork|' \
+ %{_sysconfdir}/pulse/default.pa
+) ||:
+
+%post
+%{?ldconfig}
+%if 0%{?systemd_activation}
+# unsure if we want both .socket and .service here (or only socket)
+# play it safe and do both for now -- rex
+%systemd_user_post pulseaudio.service
+%systemd_user_post pulseaudio.socket
+%endif
+
+%if 0%{?systemd_activation}
+%preun
+%systemd_user_preun pulseaudio.service
+%systemd_user_preun pulseaudio.socket
+%endif
+
+%ldconfig_postun
+
+%files
+%doc README
+%license LICENSE GPL LGPL
+%config(noreplace) %{_sysconfdir}/pulse/daemon.conf
+%config(noreplace) %{_sysconfdir}/pulse/default.pa
+%config(noreplace) %{_sysconfdir}/pulse/system.pa
+%{_sysconfdir}/dbus-1/system.d/pulseaudio-system.conf
+%{bash_completionsdir}/*
+%if 0%{?systemd}
+%{_userunitdir}/pulseaudio.service
+%{_userunitdir}/pulseaudio.socket
+%{_userunitdir}/sockets.target.wants/pulseaudio.socket
+%endif
+%{_bindir}/pulseaudio
+%{_libdir}/pulseaudio/libpulsecore-%{pa_major}.so
+%dir %{_libdir}/pulse-%{pa_major}/
+%dir %{_libdir}/pulse-%{pa_major}/modules/
+%{_libdir}/pulse-%{pa_major}/modules/libalsa-util.so
+%{_libdir}/pulse-%{pa_major}/modules/libcli.so
+%{_libdir}/pulse-%{pa_major}/modules/libprotocol-cli.so
+%{_libdir}/pulse-%{pa_major}/modules/libprotocol-esound.so
+%{_libdir}/pulse-%{pa_major}/modules/libprotocol-http.so
+%{_libdir}/pulse-%{pa_major}/modules/libprotocol-native.so
+%{_libdir}/pulse-%{pa_major}/modules/libprotocol-simple.so
+%{_libdir}/pulse-%{pa_major}/modules/librtp.so
+%if 0%{?with_webrtc}
+%{_libdir}/pulse-%{pa_major}/modules/libwebrtc-util.so
+%endif
+#{_libdir}/pulse-%{pa_major}/modules/module-access.so
+%{_libdir}/pulse-%{pa_major}/modules/module-allow-passthrough.so
+%{_libdir}/pulse-%{pa_major}/modules/module-alsa-sink.so
+%{_libdir}/pulse-%{pa_major}/modules/module-alsa-source.so
+%{_libdir}/pulse-%{pa_major}/modules/module-alsa-card.so
+%{_libdir}/pulse-%{pa_major}/modules/module-cli-protocol-tcp.so
+%{_libdir}/pulse-%{pa_major}/modules/module-cli-protocol-unix.so
+%{_libdir}/pulse-%{pa_major}/modules/module-cli.so
+%{_libdir}/pulse-%{pa_major}/modules/module-combine.so
+%{_libdir}/pulse-%{pa_major}/modules/module-combine-sink.so
+%{_libdir}/pulse-%{pa_major}/modules/module-dbus-protocol.so
+%{_libdir}/pulse-%{pa_major}/modules/module-filter-apply.so
+%{_libdir}/pulse-%{pa_major}/modules/module-filter-heuristics.so
+#{_libdir}/pulse-%{pa_major}/modules/module-flatpak.so
+%{_libdir}/pulse-%{pa_major}/modules/module-device-manager.so
+%{_libdir}/pulse-%{pa_major}/modules/module-loopback.so
+%{_libdir}/pulse-%{pa_major}/modules/module-esound-compat-spawnfd.so
+%{_libdir}/pulse-%{pa_major}/modules/module-esound-compat-spawnpid.so
+%{_libdir}/pulse-%{pa_major}/modules/module-esound-protocol-tcp.so
+%{_libdir}/pulse-%{pa_major}/modules/module-esound-protocol-unix.so
+%{_libdir}/pulse-%{pa_major}/modules/module-esound-sink.so
+%{_libdir}/pulse-%{pa_major}/modules/module-udev-detect.so
+%{_libdir}/pulse-%{pa_major}/modules/module-hal-detect.so
+%{_libdir}/pulse-%{pa_major}/modules/module-http-protocol-tcp.so
+%{_libdir}/pulse-%{pa_major}/modules/module-http-protocol-unix.so
+%{_libdir}/pulse-%{pa_major}/modules/module-match.so
+%{_libdir}/pulse-%{pa_major}/modules/module-mmkbd-evdev.so
+%{_libdir}/pulse-%{pa_major}/modules/module-native-protocol-fd.so
+%{_libdir}/pulse-%{pa_major}/modules/module-native-protocol-tcp.so
+%{_libdir}/pulse-%{pa_major}/modules/module-native-protocol-unix.so
+%{_libdir}/pulse-%{pa_major}/modules/module-null-sink.so
+%{_libdir}/pulse-%{pa_major}/modules/module-null-source.so
+%{_libdir}/pulse-%{pa_major}/modules/module-pipe-sink.so
+%{_libdir}/pulse-%{pa_major}/modules/module-pipe-source.so
+%{_libdir}/pulse-%{pa_major}/modules/module-remap-source.so
+%{_libdir}/pulse-%{pa_major}/modules/module-rescue-streams.so
+%{_libdir}/pulse-%{pa_major}/modules/module-role-ducking.so
+%{_libdir}/pulse-%{pa_major}/modules/module-rtp-recv.so
+%{_libdir}/pulse-%{pa_major}/modules/module-rtp-send.so
+%{_libdir}/pulse-%{pa_major}/modules/module-simple-protocol-tcp.so
+%{_libdir}/pulse-%{pa_major}/modules/module-simple-protocol-unix.so
+%{_libdir}/pulse-%{pa_major}/modules/module-sine.so
+%{_libdir}/pulse-%{pa_major}/modules/module-switch-on-port-available.so
+%{_libdir}/pulse-%{pa_major}/modules/module-systemd-login.so
+%{_libdir}/pulse-%{pa_major}/modules/module-tunnel-sink-new.so
+%{_libdir}/pulse-%{pa_major}/modules/module-tunnel-sink.so
+%{_libdir}/pulse-%{pa_major}/modules/module-tunnel-source-new.so
+%{_libdir}/pulse-%{pa_major}/modules/module-tunnel-source.so
+%{_libdir}/pulse-%{pa_major}/modules/module-volume-restore.so
+%{_libdir}/pulse-%{pa_major}/modules/module-suspend-on-idle.so
+%{_libdir}/pulse-%{pa_major}/modules/module-default-device-restore.so
+%{_libdir}/pulse-%{pa_major}/modules/module-device-restore.so
+%{_libdir}/pulse-%{pa_major}/modules/module-stream-restore.so
+%{_libdir}/pulse-%{pa_major}/modules/module-card-restore.so
+%{_libdir}/pulse-%{pa_major}/modules/module-ladspa-sink.so
+%{_libdir}/pulse-%{pa_major}/modules/module-remap-sink.so
+%{_libdir}/pulse-%{pa_major}/modules/module-always-sink.so
+%{_libdir}/pulse-%{pa_major}/modules/module-console-kit.so
+%{_libdir}/pulse-%{pa_major}/modules/module-position-event-sounds.so
+%{_libdir}/pulse-%{pa_major}/modules/module-augment-properties.so
+%{_libdir}/pulse-%{pa_major}/modules/module-role-cork.so
+%{_libdir}/pulse-%{pa_major}/modules/module-sine-source.so
+%{_libdir}/pulse-%{pa_major}/modules/module-intended-roles.so
+%{_libdir}/pulse-%{pa_major}/modules/module-rygel-media-server.so
+%{_libdir}/pulse-%{pa_major}/modules/module-echo-cancel.so
+%{_libdir}/pulse-%{pa_major}/modules/module-switch-on-connect.so
+%{_libdir}/pulse-%{pa_major}/modules/module-virtual-sink.so
+%{_libdir}/pulse-%{pa_major}/modules/module-virtual-source.so
+%{_libdir}/pulse-%{pa_major}/modules/module-virtual-surround-sink.so
+%dir %{_datadir}/pulseaudio/
+%dir %{_datadir}/pulseaudio/alsa-mixer/
+%{_datadir}/pulseaudio/alsa-mixer/paths/
+%{_datadir}/pulseaudio/alsa-mixer/profile-sets/
+%{_mandir}/man1/pulseaudio.1*
+%{_mandir}/man5/default.pa.5*
+%{_mandir}/man5/pulse-cli-syntax.5*
+%{_mandir}/man5/pulse-client.conf.5*
+%{_mandir}/man5/pulse-daemon.conf.5*
+%{_prefix}/lib/udev/rules.d/90-pulseaudio.rules
+%dir %{_libexecdir}/pulse
+%dir %{_datadir}/zsh/
+%dir %{_datadir}/zsh/site-functions/
+%{_datadir}/zsh/site-functions/_pulseaudio
+
+%files qpaeq
+%{_bindir}/qpaeq
+%{_libdir}/pulse-%{pa_major}/modules/module-equalizer-sink.so
+
+%files esound-compat
+%{_bindir}/esdcompat
+%{_mandir}/man1/esdcompat.1.gz
+
+%if 0%{?enable_lirc}
+%files module-lirc
+%{_libdir}/pulse-%{pa_major}/modules/module-lirc.so
+%endif
+
+%files module-x11
+%{_sysconfdir}/xdg/autostart/pulseaudio.desktop
+#{_bindir}/start-pulseaudio-kde
+%{_bindir}/start-pulseaudio-x11
+%{_libdir}/pulse-%{pa_major}/modules/module-x11-bell.so
+%{_libdir}/pulse-%{pa_major}/modules/module-x11-publish.so
+%{_libdir}/pulse-%{pa_major}/modules/module-x11-xsmp.so
+%{_libdir}/pulse-%{pa_major}/modules/module-x11-cork-request.so
+%{_mandir}/man1/start-pulseaudio-x11.1.gz
+
+%files module-zeroconf
+%{_libdir}/pulse-%{pa_major}/modules/libavahi-wrap.so
+%{_libdir}/pulse-%{pa_major}/modules/module-zeroconf-publish.so
+%{_libdir}/pulse-%{pa_major}/modules/module-zeroconf-discover.so
+%{_libdir}/pulse-%{pa_major}/modules/libraop.so
+%{_libdir}/pulse-%{pa_major}/modules/module-raop-discover.so
+%{_libdir}/pulse-%{pa_major}/modules/module-raop-sink.so
+
+%if 0%{?enable_jack}
+%files module-jack
+%{_libdir}/pulse-%{pa_major}/modules/module-jackdbus-detect.so
+%{_libdir}/pulse-%{pa_major}/modules/module-jack-sink.so
+%{_libdir}/pulse-%{pa_major}/modules/module-jack-source.so
+%endif
+
+%files module-bluetooth
+%{_libdir}/pulse-%{pa_major}/modules/libbluez*-util.so
+%{_libdir}/pulse-%{pa_major}/modules/module-bluez*-device.so
+%{_libdir}/pulse-%{pa_major}/modules/module-bluez*-discover.so
+%{_libdir}/pulse-%{pa_major}/modules/module-bluetooth-discover.so
+%{_libdir}/pulse-%{pa_major}/modules/module-bluetooth-policy.so
+
+%files module-gconf
+%{_libdir}/pulse-%{pa_major}/modules/module-gconf.so
+%{_libexecdir}/pulse/gconf-helper
+
+%post libs -p /sbin/ldconfig
+%postun libs -p /sbin/ldconfig
+
+%files libs -f %{name}.lang
+%doc README LICENSE GPL LGPL
+%dir %{_sysconfdir}/pulse/
+%config(noreplace) %{_sysconfdir}/pulse/client.conf
+%{_libdir}/libpulse.so.0*
+%{_libdir}/libpulse-simple.so.0*
+%dir %{_libdir}/pulseaudio/
+%{_libdir}/pulseaudio/libpulsecommon-%{pa_major}.so
+%{_libdir}/pulseaudio/libpulsedsp.so
+
+%post libs-glib2 -p /sbin/ldconfig
+%postun libs-glib2 -p /sbin/ldconfig
+
+%files libs-glib2
+%{_libdir}/libpulse-mainloop-glib.so.0*
+
+%files libs-devel
+%doc doxygen/html
+%{_includedir}/pulse/
+%{_libdir}/libpulse.so
+%{_libdir}/libpulse-mainloop-glib.so
+%{_libdir}/libpulse-simple.so
+%{_libdir}/pkgconfig/libpulse*.pc
+%dir %{_datadir}/vala
+%dir %{_datadir}/vala/vapi
+%{_datadir}/vala/vapi/libpulse.vapi
+%{_datadir}/vala/vapi/libpulse.deps
+%{_datadir}/vala/vapi/libpulse-mainloop-glib.vapi
+%{_datadir}/vala/vapi/libpulse-mainloop-glib.deps
+%{_datadir}/vala/vapi/libpulse-simple.deps
+%{_datadir}/vala/vapi/libpulse-simple.vapi
+
+%dir %{_libdir}/cmake
+%{_libdir}/cmake/PulseAudio/
+
+%files utils
+%{_bindir}/pacat
+%{_bindir}/pacmd
+%{_bindir}/pactl
+%{_bindir}/paplay
+%{_bindir}/parec
+%{_bindir}/pamon
+%{_bindir}/parecord
+%{_bindir}/pax11publish
+%{_bindir}/padsp
+%ifarch %{multilib_archs}
+%{_bindir}/padsp-32
+%endif
+%{_bindir}/pasuspender
+%{_mandir}/man1/pacat.1*
+%{_mandir}/man1/pacmd.1*
+%{_mandir}/man1/pactl.1*
+%{_mandir}/man1/padsp.1*
+%{_mandir}/man1/pamon.1*
+%{_mandir}/man1/paplay.1*
+%{_mandir}/man1/parec.1*
+%{_mandir}/man1/parecord.1*
+%{_mandir}/man1/pasuspender.1*
+%{_mandir}/man1/pax11publish.1*
+
+%if 0%{?gdm_hooks}
+%files gdm-hooks
+%attr(0700, gdm, gdm) %dir %{_localstatedir}/lib/gdm/.pulse
+%attr(0600, gdm, gdm) %{_localstatedir}/lib/gdm/.pulse/default.pa
+%endif
+
+
+%changelog
+* Tue Sep 04 2018 Wim Taymans - 11.1-22
+- Use python3 version of qt5
+- Resolves: rhbz#1591134
+
+* Mon Sep 03 2018 Wim Taymans - 11.1-21
+- Fix port to qt5.
+- Resolves: rhbz#1591134
+
+* Fri Jul 13 2018 Petr Viktorin - 11.1-20
+- Fix dbus-python dependency
+
+* Fri Jun 22 2018 Than Ngo - 11.1-19
+- fixed bz#1580853, FTBFS
+
+* Wed Mar 21 2018 Rex Dieter - 11.1-18
+- manually package sockets.target.wants/pulseaudio.socket to help
+ handle socket activation on upgrades
+
+* Tue Mar 20 2018 Rex Dieter - 11.1-17
+- omit -gdm-hooks, moved to gdm (f28+)
+
+* Tue Mar 13 2018 Rex Dieter - 11.1-16
+- skip patch93, seems to cause crashes w/headphone jacks (#1544507,#1551270,#1554035)
+
+* Mon Mar 05 2018 Igor Gnatenko - 11.1-15
+- Fixup ldconfig scriptlets
+
+* Thu Mar 01 2018 Rex Dieter - 11.1-14
+- use %%make_build, %%make_install
+- enable systemd socket/service activation on f28+ (and disable autospawn)
+
+* Wed Feb 28 2018 Rex Dieter - 11.1-13
+- use %%license, %%ldconfig_scriptlets
+- use better upstream patch for exit-idle-time
+
+* Sun Feb 25 2018 Rex Dieter - 11.1-12
+- BR: gcc-c++
+
+* Fri Feb 09 2018 Igor Gnatenko - 11.1-11
+- Escape macros in %%changelog
+
+* Fri Feb 09 2018 Fedora Release Engineering - 11.1-10
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Thu Feb 01 2018 Rex Dieter - 11.1-9
+- backport upstream fixes: memfd, qpape PyQt5 port
+
+* Mon Jan 08 2018 Rex Dieter - 11.1-8
+- exit-idle-time = 4 (#1510301)
+- f28+ ftbfs: memfd_create conflicts
+- drop getaffinity.patch (no longer needed)
+- enable webrtc support for all archs
+- make tests non-fatal on i686,s390x
+
+* Mon Dec 04 2017 Rex Dieter - 11.1-7
+- backport 'pa_sink_input_assert_ref()' crashfix (#1472285)
+- --disable-tcpwrap on f28+ (#1518777)
+
+* Wed Nov 08 2017 Hans de Goede - 11.1-6
+- Fix pa crashing on Bay- and Cherry-Trail devices
+
+* Wed Nov 01 2017 Rex Dieter - 11.1-5
+- actually install new dell-dock-tb16-usb-audio.conf alsa profile (#1492344)
+
+* Thu Oct 12 2017 Rex Dieter - 11.1-4
+- experimental fixes bluetooth profile switching (f28+ only, fdo#93898)
+
+* Thu Oct 12 2017 Rex Dieter - 11.1-3
+- include experiemental Intel HDMI LPE fixes (fdo#100488)
+
+* Mon Oct 09 2017 Rex Dieter - 11.1-2
+- backport some alsa-mixer related fixes (#1492344)
+
+* Wed Sep 20 2017 Rex Dieter - 11.1-1
+- pulseaudio-11.1
+
+* Tue Sep 05 2017 Rex Dieter - 11.0-1
+- pulseaudio-11.0
+
+* Mon Aug 28 2017 Pete Walter - 10.99.1-6
+- Enable pulseaudio-module-bluetooth on s390x
+
+* Fri Aug 18 2017 Wim Taymans - 10.99.1-5
+- Remove /var/run/pulse and /var/lib/pulse, they are directories in tmpfs
+
+* Thu Aug 03 2017 Fedora Release Engineering - 10.99.1-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
+
+* Sun Jul 30 2017 Florian Weimer - 10.99.1-3
+- Rebuild with binutils fix for ppc64le (#1475636)
+
+* Thu Jul 27 2017 Fedora Release Engineering - 10.99.1-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
+
+* Tue Jul 25 2017 Rex Dieter - 10.99.1-1
+- pulseaudio-10.99.1 (#1474559)
+
+* Mon Feb 13 2017 Wim Taymans - 10.0-4
+- Add flatpak access control
+
+* Sat Feb 11 2017 Fedora Release Engineering - 10.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild
+
+* Thu Jan 19 2017 Kalev Lember - 10.0-2
+- Fix the build on RHEL
+
+* Thu Jan 19 2017 Kalev Lember - 10.0-1
+- Update to 10.0
+
+* Fri Jan 06 2017 Rex Dieter - 9.99.1-1
+- pulseaudio-9.99.1 (#1409939)
+- %%check: use %%_smp_mflags
+
+* Fri Jun 24 2016 Rex Dieter - 9.0-1
+- pulseaudio-9.0
+
+* Wed Jun 22 2016 Than Ngo - 8.99.2-3
+- enable %%check
+- fix bz#1345826, only start threads on activ CPUs
+
+* Mon Jun 13 2016 Rex Dieter - 8.99.2-2
+- %%check: make non-fatal, echo test-suite.log on failure (#1345826)
+
+* Tue May 31 2016 Rex Dieter - 8.99.2-1
+- pulseaudio-8.99.2
+
+* Thu May 12 2016 Rex Dieter - 8.99.1-2
+- re-enable webrtc support (arm,x86_64 only for now)
+
+* Thu May 12 2016 Rex Dieter - 8.99.1-1
+- pulseaudio-8.99.1 (#1335527)
+- disable webrtc support for now (waiting on #1335536)
+
+* Fri May 06 2016 Rex Dieter - 8.0-7
+- use %%tests macro, enable systemd socket activation (#1265720)
+
+* Sat Mar 05 2016 Rex Dieter - 8.0-6
+- respin disable_flat_volumes.patch harder
+
+* Sat Mar 05 2016 Rex Dieter - 8.0-5
+- respin disable_flat_volumes.patch
+
+* Fri Mar 04 2016 Rex Dieter - 8.0-4
+- RFE: Disable PulseAudio's flat volumes f24+ (#1265267)
+
+* Thu Feb 04 2016 Fedora Release Engineering - 8.0-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_24_Mass_Rebuild
+
+* Fri Jan 22 2016 Rex Dieter - 8.0-2
+- own /var/run/pulse (#1173811)
+
+* Fri Jan 22 2016 Rex Dieter - 8.0-1
+- pulseaudio-8.0 (#1301040)
+
+* Wed Jan 13 2016 Rex Dieter - 7.99.2-1
+- pulseaudio-7.99.2 (#1297774)
+
+* Mon Dec 28 2015 Rex Dieter - 7.99.1-1
+- pulseaudio-7.99.1 (8.0 rc1) (#1294555)
+
+* Sat Oct 31 2015 Rex Dieter - 7.1-1
+- pulseaudio-7.1 (#1276811)
+
+* Sat Oct 31 2015 Rex Dieter - 7.0-4
+- apply srbchannel patch
+
+* Tue Oct 27 2015 Rex Dieter - 7.0-3
+- backport srbchannel crasher fix
+
+* Sun Sep 27 2015 Rex Dieter - 7.0-2
+- PulseAudio doesn't load locales (fdo#92142)
+
+* Wed Sep 23 2015 Rex Dieter - 7.0-1
+- pulseaudio-7.0
+
+* Sat Sep 12 2015 Rex Dieter - 6.99.2-1
+- 6.99.2 (#1262579)
+
+* Sat Aug 29 2015 Rex Dieter - 6.99.1-2
+- enable libsoxr support
+
+* Fri Aug 28 2015 Rex Dieter - 6.99.1-1
+- 6.99.1 (#1257770)
+
+* Mon Jul 06 2015 Rex Dieter - 6.0-8
+- autostart.patch: fix stdout/stderr redirection
+
+* Mon Jul 06 2015 Rex Dieter - 6.0-7
+- fix resampler-related build dependencies (libsamplerate/speex) (#1239208)
+
+* Mon Jun 22 2015 Rex Dieter - 6.0-6
+- better autostart.patch, handle case were autospawn is disabled (or otherwise doesn't work, like for root user)
+
+* Thu Jun 18 2015 Fedora Release Engineering - 6.0-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_23_Mass_Rebuild
+
+* Thu Jun 11 2015 Rex Dieter - 6.0-4
+- pulseaudio 6.0 breaks 5.1 network sound configuration (#1230957)
+
+* Sat May 02 2015 Kalev Lember - 6.0-3
+- Rebuilt for GCC 5 C++11 ABI change
+
+* Tue Feb 17 2015 Rex Dieter 6.0-2
+- duplicate directory between pulseaudio and pulseaudio-libs (#909690)
+
+* Fri Feb 13 2015 Rex Dieter 6.0-1
+- pulseaudio-6.0 (#1192384)
+
+* Thu Jan 22 2015 Rex Dieter 5.99.3-1
+- pulseaudio-5.99.3 (6.0-rc3) (#1184850)
+
+* Sat Dec 20 2014 Rex Dieter 5.99.2-2
+- fix changelog
+
+* Fri Dec 19 2014 Rex Dieter 5.99.2-1
+- pulseaudio-5.99.2 (6.0-rc2)
+
+* Fri Nov 21 2014 Rex Dieter 5.99.1-1
+- pulseaudio-5.99.1 (6.0-rc1)
+
+* Fri Nov 14 2014 Rex Dieter 5.0-100.20141103gitaec81
+- artificially bump Release to 100, to ensure upgrade path
+
+* Thu Nov 06 2014 Rex Dieter 5.0-24.20141103gitaec81
+- --disable-systemd-daemon, revert to autospawn mode
+
+* Thu Nov 06 2014 Rex Dieter - 5.0-23.20141103gitaec81
+- 20141103 327-gaec81 snapshot, pulseaudio socket activation support
+- use bash completionsdir
+
+* Wed Nov 05 2014 Orion Poplawski 5.0-22.20141007git4971d
+- Really add pulse-rt group when needed (bug #885020)
+
+* Wed Oct 22 2014 Rex Dieter 5.0-21.20141007git4971d
+- BR: automake libtool (for bootstrap.sh)
+
+* Wed Oct 22 2014 Rex Dieter 5.0-20.20141007git4971d
+- snapshot, with wip bt headset2 patches (#1045548,#1067470)
+
+* Sun Aug 17 2014 Fedora Release Engineering - 5.0-10
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild
+
+* Tue Jul 29 2014 Kalev Lember - 5.0-9
+- Rebuilt once more for libjson-c
+
+* Mon Jul 28 2014 Peter Robinson 5.0-8
+- Rebuild (libjson-c)
+
+* Wed Jul 16 2014 Rex Dieter 5.0-7
+- Provide padsp-32, /usr/bin/padsp is native arch only (#856146)
+
+* Mon Jul 07 2014 Rex Dieter - 5.0-6
+- rtp-recv: fix crash on empty UDP packets (CVE-2014-3970,#1104835,#1108011)
+- name HDMI outputs uniquely
+
+* Sat Jun 07 2014 Fedora Release Engineering - 5.0-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_21_Mass_Rebuild
+
+* Tue May 13 2014 Dan Horák 5.0-4
+- always run tests, but don't fail the build on big endian arches (relates #1067470)
+
+* Sat Apr 12 2014 Rex Dieter 5.0-3
+- Pulse Audio settings lost after reboot / HDMI is set as default (#1035025)
+
+* Tue Mar 11 2014 Rex Dieter 5.0-2
+- drop Requires: kernel (per recent -devel ml thread)
+
+* Tue Mar 04 2014 Rex Dieter 5.0-1
+- 5.0 (#1072259)
+
+* Wed Feb 26 2014 Karsten Hopp 4.99.4-3
+- disable make check on PPC* (rhbz #1067470)
+
+* Mon Feb 17 2014 Rex Dieter 4.99.4-2
+- -qpaeq subpkg (#1002585)
+
+* Sat Feb 15 2014 Rex Dieter 4.99.4-1
+- 4.99.4
+
+* Wed Jan 29 2014 Rex Dieter 4.99.3-1
+- 4.99.3
+
+* Mon Jan 27 2014 Wim Taymans - 4.99.2-2
+- don't mark .desktop and dbus configurations as %%config
+
+* Fri Jan 24 2014 Rex Dieter - 4.99.2-1
+- 4.99.2 (#1057528)
+
+* Wed Jan 22 2014 Wim Taymans - 4.0-12.gitf81e3
+- Use the statically allocated UID and GID from /usr/share/doc/setup/uidgid (#1056656)
+- The pulse-rt group doesn't exist (#885020)
+
+* Wed Jan 22 2014 Rex Dieter - 4.0-11.gitf81e3
+- handle jack/lirc modules better (#1056619)
+- -libs-devel: own some dirs to avoid deps on cmake/vala
+- -module-bluetooth: make dep arch'd for consistency
+
+* Fri Jan 10 2014 Rex Dieter - 4.0-10.gitf81e3
+- enable hardened build (#983606)
+
+* Sat Dec 07 2013 Rex Dieter - 4.0-9.gitf81e3
+- X-KDE-autostart-phase=1
+
+* Wed Oct 30 2013 Rex Dieter - 4.0-8.gitf81e3
+- fix PACKAGE_VERSION
+
+* Mon Oct 14 2013 Rex Dieter - 4.0-7.gitf81e3
+- %%build fix typo, explicitly --enable-tests
+
+* Mon Oct 14 2013 Rex Dieter - 4.0-6.gitf81e3
+- ship a single autostart file
+
+* Fri Oct 11 2013 Rex Dieter - 4.0-5.gitf81e3
+- fresh snapshot
+
+* Mon Sep 23 2013 Kalev Lember - 4.0-4.gita89ca
+- Update to today's git snapshot
+- Backport a patch for pulseaudio crash at startup (#1000966)
+
+* Thu Aug 15 2013 Kalev Lember - 4.0-3.gitbf9b3
+- Update to git snapshot bf9b3f0 for BlueZ 5 support
+
+* Sun Aug 04 2013 Fedora Release Engineering - 4.0-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
+
+* Tue Jun 4 2013 Peter Robinson 4.0-1
+- New 4.0 stable release
+- http://www.freedesktop.org/wiki/Software/PulseAudio/Notes/4.0/
+
+* Thu May 30 2013 Rex Dieter 3.99.2-2
+- [RFE] Build with libcap (#969232)
+
+* Sun May 26 2013 Peter Robinson 3.99.2-1
+- pulseaudio-3.99.2 (#966631)
+
+* Fri May 03 2013 Rex Dieter 3.99.1-1
+- pulseaudio-3.99.1 (#952594)
+- RFE: Restore the pipe-sink and pipe-source modules (#958949)
+- prune (pre 1.x) changelog
+
+* Thu Apr 11 2013 Rex Dieter 3.0-7
+- pull a few more patches from upstream stable-3.x branch
+
+* Fri Feb 08 2013 Rex Dieter 3.0-6
+- default.pa: fix for renamed modules (#908117)
+
+* Sat Jan 19 2013 Ville Skyttä - 3.0-5
+- Own the %%{_libdir}/pulseaudio dir.
+- Fix bogus %%changelog dates.
+
+* Fri Jan 04 2013 Rex Dieter 3.0-4
+- alsa-mixer: Fix the analog-output-speaker-always path
+
+* Fri Jan 04 2013 Rex Dieter 3.0-3
+- move libpulsedsp plugin to -libs, avoids -utils multilib (#891425)
+
+* Wed Dec 19 2012 Dan Horák 3.0-2
+- SBC is needed only when BlueZ is used
+
+* Tue Dec 18 2012 Rex Dieter 3.0-1
+- pulseaudio-3.0
+
+* Tue Dec 11 2012 Peter Robinson 2.99.3-1
+- PulseAudio 2.99.3 (3.0 rc3)
+
+* Wed Oct 10 2012 Dan Horák 2.1-4
+- fix the with_webrtc condition
+
+* Tue Oct 09 2012 Dan Horák 2.1-3
+- webrtc-aec is x86 and ARM only for now
+
+* Mon Oct 08 2012 Debarshi Ray 2.1-2
+- Enable webrtc-aec
+
+* Tue Sep 25 2012 Rex Dieter 2.1-1
+- pulseaudio-2.1
+
+* Sat Jul 21 2012 Fedora Release Engineering - 2.0-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild
+
+* Sat Jun 23 2012 Kalev Lember - 2.0-3
+- Move module-jackdbus-detect.so to -module-jack subpackage with the
+ rest of the jack modules
+
+* Mon Jun 04 2012 Kay Sievers - 2.0-2
+- rebuild for libudev1
+
+* Sat May 12 2012 Rex Dieter 2.0-1
+- pulseaudio-2.0
+
+* Sat Apr 21 2012 Matthias Clasen - 1.1-9
+- Don't load the ck module in gdm, either
+
+* Tue Feb 28 2012 Bruno Wolff III - 1.1-8
+- Bring in Lennart's patch from f17
+- Temporary fix for CK/systemd move (#794690)
+
+* Tue Feb 28 2012 Bruno Wolff III - 1.1-7
+- Fix for building with gcc 4.7
+
+* Mon Jan 23 2012 Dan Horák - 1.1-6
+- rebuilt for json-c-0.9-4.fc17
+
+* Sat Jan 14 2012 Fedora Release Engineering - 1.1-5
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild
+
+* Tue Dec 13 2011 Adam Jackson 1.1-4
+- Fix RHEL build
+
+* Tue Nov 22 2011 Rex Dieter 1.1-3
+- Obsoletes: padevchooser < 1.0
+
+* Thu Nov 10 2011 Rex Dieter 1.1-2
+- -libs: Obsoletes: pulseaudio-libs-zeroconf
+- use versioned Obsoletes/Provides
+- tighten subpkg deps via %%_isa
+- remove autoconf/libtool hackery
+
+* Thu Nov 3 2011 Lennart Poettering - 1.1-1
+- New upstream release