From e4404510f2de8a9982e01ecfa0a70f675605e08c Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: May 07 2019 09:30:01 +0000 Subject: 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