



PulseAudio 12.0 release notes

Changes at a glance

Better latency reporting (and hence better A/V sync) with the A2DP bluetooth profile

Much more accurate latency reporting for AirPlay devices

Fixed a crash or high CPU use problem with Intel HDMI LPE

module-switch-on-connect now ignores virtual devices

When using passthrough for compressed audio, set the "non-audio" bit

Prioritize HDMI output over S/PDIF output

HSP support for more bluetooth headsets

Choose the A2DP bluetooth profile by default instead of HSP

New "sink_input_properties" module argument for module-ladspa-sink

New "use_system_clock_for_timing" module argument for module-pipe-sink

module-pipe-sink can now use an existing pipe

Steelseries Arctis 7 USB headset stereo output support

Dell Thunderbolt Dock TB16 speaker jack support

Fixed digital input support for some USB sound cards

Fixed Native Instruments Traktor Audio 6 detection

Ability to disable input or output on macOS

New "dereverb" option for the Speex echo canceller

New module: module-always-source

State files not any more readable by all users in the system mode

module-augment-properties now uses XDG_DATA_DIRS to find .desktop files

Updates for the Vala bindings

The GConf dependency can now be avoided

qpaeq license changed from AGPL to LGPL

qpaeq ported to Qt 5

Compatibility with glibc 2.27

The esdcompat tool isn't any more installed if esound support is disabled

Notes for end users

Better latency reporting (and hence better A/V sync) with the A2DP bluetooth profile

When playing videos, it's important that the audio latency is known so that the video can be synchronized accurately. PulseAudio doesn't get good latency information from the kernel with A2DP playback, which has caused A/V sync problems for many people when watching videos. Now PulseAudio makes the audio buffer in the kernel much smaller, which reduces the problem a lot.

Much more accurate latency reporting for AirPlay devices

The AirPlay protocol has a large latency, but PulseAudio didn't previously report that latency to applications. Now it reports it, or at least something much closer to the reality than before.

The AirPlay protocol doesn't provide a mechanism for getting the exact latency (or if it does, we're not aware of that). PulseAudio makes an educated guess, and a significant part of that guess is a latency constant that is added to each latency report. The default value for that constant is exactly 2 seconds, but that's not optimal for all devices. PulseAudio uses a different constant for some known devices, and we'd like to expand the set of known devices. If you find that audio-video synchronization is bad with your AirPlay device, you can experiment with different latency constants by passing argument "latency_msec=2000" to module-raop-discover in /etc/pulse/default.pa. Change the number 2000 to something that works better. Once you find a better latency value, we'd be happy hear from you so that we can add your device to the list of known devices.

Fixed a crash or high CPU use problem with Intel HDMI LPE

Many recent computers use the Intel HDMI LPE kernel driver for HDMI audio, and that driver has some unususal behaviour that made PulseAudio enter an infinite loop with 100% CPU use, if the HDMI cable is unplugged and PulseAudio tries to play to the HDMI output. Usually the playback thread runs with realtime scheduling, and using too much CPU in that situation makes the kernel kill PulseAudio, so effectively PulseAudio appeared to be crashing. This problem has now been fixed.

module-switch-on-connect now ignores virtual devices

When a new device appears, module-switch-on-connect makes the new device the default device and moves existing streams there. The module is not loaded by default, because there are cases where this is not what users generally want. One of those cases has been virtual devices - for example, if the user (or some application) creates a null sink for some purpose, it's probably not a good idea to make the null sink the default device, but previously module-switch-on-connect didn't make any distinction between different kinds of devices. Now the module ignores virtual devices, unless the "ignore_virtual=no" argument is passed when loading it.

When using passthrough for compressed audio, set the "non-audio" bit

When playing compressed audio through S/PDIF or HDMI, it should be indicated that the data is not normal uncompressed audio, otherwise the receiver might play some horrible noise. It seems that PulseAudio never set the "non-audio" bit properly. There hasn't been any complaints about this until recently, so apparently receivers generally detect compressed audio pretty well even without the "non-audio" bit being set, but in any case, now PulseAudio does set that bit.

Prioritize HDMI output over S/PDIF output

HDMI output is probably used more often than S/PDIF output, so if PulseAudio has to pick one, it's better to pick HDMI. Previously S/PDIF had higher priority than HDMI.

HSP support for more bluetooth headsets

When connecting a bluetooth headset, the headset sends a list of features that it supports. Headsets can indicate HSP support in two different ways, but PulseAudio used to recognize only one way, so to PulseAudio it seemed that some headsets didn't support HSP even when in reality they did. Now both kinds of headsets are supported.

Choose the A2DP bluetooth profile by default instead of HSP

When connecting a new bluetooth headset, PulseAudio used to activate the HSP profile by default. Now A2DP has higher priority. A2DP is a better default, because it has better audio quality. HSP is needed with phone applications, but we already have automatic profile switching when a phone application appears, so using A2DP as the default profile shouldn't cause problems even when using bluetooth primarily for phone calls.

New "sink_input_properties" argument for module-ladspa-sink

The new "sink_input_properties" argument for module-ladspa-sink makes it possible to control the properties that are set on the sink input that the module creates. For example, passing "sink_input_properties=media.name=foo" sets the stream description to "foo", which will be shown in volume control applications.

New "use_system_clock_for_timing" module argument for module-pipe-sink

module-pipe-sink plays audio to a pipe file, and it has so far relied on the program reading from the pipe to provide timing. That is, module-pipe-sink writes to the pipe as fast as the data is read from the pipe. If the program reading the data doesn't do any timing, and simply reads as fast as data becomes available, the playback pipeline runs too fast and applications playing to the pipe sink won't be able to provide data fast enough, causing silence to be added to the audio stream.

Now it's possible to pass the "use_system_clock_for_timing=yes" option to module-pipe-sink to support simple programs (e.g. "cat") that just read from the pipe as fast as data becomes available. When the option is enabled, PulseAudio uses the system clock to make writes happen at the normal rate.

module-pipe-sink can now use an existing pipe

module-pipe-sink used to fail always if it failed to create the pipe file. If the failure happens because the file already exists, module-pipe-sink will now use the already existing file.

Steelseries Arctis 7 USB headset stereo output support

The headset is unusual in that it presents itself as two output devices: a mono device (meant for voice audio) and a stereo device (for everything else), and both devices have separate volume control at the hardware level. PulseAudio used to make only the mono device available by default, now both devices can be used at the same time.

Dell Thunderbolt Dock TB16 speaker jack support

TB16 has a speaker jack that PulseAudio didn't previously make available by default. That has now been fixed.

Fixed digital input support for some USB sound cards

Some USB sound cards require the "PCM Capture Source" control in the ALSA mixer to be set to "IEC958 In" in order to be able to record from the digital input, but PulseAudio didn't do that. Now it does.

Fixed Native Instruments Traktor Audio 6 detection

PulseAudio has custom configuration for the Traktor Audio 6 USB sound card, but either the device ID that PulseAudio used to detect the card was wrong, or maybe some units use one ID and some use another. PulseAudio now detects the card with either ID.

Ability to disable input or output on macOS

module-coreaudio-detect and module-coreaudio-device now have the "record" and "playback" boolean options that can be used to disable the respective functionality.

New "dereverb" option for the Speex echo canceller

The Speex backend of module-echo-cancel has a new "dereverb" boolean option. The option is enabled by default. It helps remove reverberation effects in the capture path, usually occurring when the user is in a room which echoes.

New module: module-always-source

The new module makes sure that there's always at least one non-monitor source available in the system. If you're running into situations where there are no "proper" input devices, and you'd rather use a null source that only produces silence as the default input device rather than a monitor source that copies the audio from the default output, this is for you.

module-always-source is not loaded by default.

State files not any more readable by all users in the system mode

PulseAudio used to set the process umask to 022. That meant that the state files that PulseAudio writes on disk were readable by all users when running PulseAudio in the "system mode", i.e. only one instance that all users share. Now the umask is 077, so users can't read the state files any more, which is a slight improvement in privacy, because the state files might contain e.g. information about what applications users use.

The umask change also affects the file permissions in the default setup where each user runs their own PulseAudio instance, but in that mode the files are written in a directory that other users can't access, so there shouldn't be any practical difference.

module-augment-properties now uses XDG_DATA_DIRS to find .desktop files

module-augment-properties reads .desktop files to get more information about applications that connect to the server. Previously the .desktop files were searched only from one fixed location (/usr/share/applications), but now the module supports also the XDG_DATA_DIRS environment variable for specifying additional search paths.

Notes for application developers

There are a few fixes in the Vala bindings:

Added the set_source_output_volume() and set_source_output_mute() functions.

The SourceOutputInfo struct had an incorrect field name: "sink_usec" has now been changed to "source_usec".

The "ports" arrays in the SinkInfo and SourceInfo structs weren't properly annotated, so the Vala compiler didn't know that the "n_ports" field contained the array length.

Notes for packagers

The GConf dependency can now be avoided

paprefs has so far required module-gconf to be loaded in the PulseAudio daemon, which is bad, because the GConf project is deprecated and unmaintained. paprefs 1.0 is expected to be released shortly, and that will use GSettings instead of GConf. The new paprefs version requires module-gsettings to be loaded in the PulseAudio daemon.

PulseAudio still provides module-gconf in case there's need for it. GSettings and GConf can both be enabled when building PulseAudio, but note that both modules should not be installed at the same time, so distributions should make module-gconf conflict with module-gsettings in their packaging system. It may be useful to enable both when building PulseAudio, so that PulseAudio can be updated before paprefs. If only GSettings is enabled, PulseAudio and paprefs need to be updated at the same time.

There can be some problems for users after updating paprefs. When module-gsettings is installed along with the new paprefs version, the module won't be automatically loaded by the PulseAudio daemon that is already running during the update, so any configuration changes done with paprefs will have effect only after the daemon has been restarted. Another issue is that if the gsettings-data-convert program is not installed, the old settings from GConf won't be migrated to GSettings. gsettings-data-convert is provided by GConf, so to ensure that the program is installed, the module-gsettings package would have to depend on GConf, but since the whole point of this exercise is to get rid of GConf, such dependency may not be feasible.

qpaeq license changed from AGPL to LGPL

Most of PulseAudio's code is licensed under LGPLv2.1, but the equalizer GUI qpaeq was licensed under AGPL. qpaeq is now licensed under LGPLv2.1, so there's one less exception in PulseAudio's licensing terms.

qpaeq ported to Qt 5

qpaeq used to depend on Qt 4, which was not nice, since the Qt project has stopped supporting the 4.x releases. qpaeq has now been ported to Qt 5.

Compatibility with glibc 2.27

PulseAudio defines the memfd_create() syscall wrapper, because glibc previously didn't provide the wrapper. Starting from 2.27, glibc now provides it too, and that caused build failure in PulseAudio due to the duplicate definition. Now PulseAudio doesn't define memfd_create() if it's already available.

The esdcompat tool isn't any more installed if esound support is disabled

The esdcompat tool is not useful if the esound modules haven't been built.

git shortlog

Andika Triwidada (1): i18n: update the Indonesian translation Andrius Štikonas (1): qpaeq: port to PyQt5 Arun Raghavan (9): always-source: Fix pa_module_load() usage bluez: Don't autodetect MTU by default bluez: Don't crash on strange MTU sizes sink, source: Rework reconfiguration logic to apply to more than rate echo-cancel: Fix speex echo state setting echo-cancel: Expose dereverb in the speex canceller client-conf: Add a default value for disable-memfd build-sys: Stop using symdef headers for modules module-allow-passthrough: Don't crash if we can't find a sink Cheng-Chia Tseng (1): i18n: update the Chinese (Taiwan) translation Colin Leroy (5): cli-command: don't exit on "module already loaded" errors RAOP: Announce real latency raop: add latency value for Shairport RAOP server raop: Show device codename in sink properties raop: Init dummy port and card for latency change Constantine Kharlamov (1): sconv-s16be: declaration/implementation mismatches Daniel Rusek (1): i18n: update the Czech translation David Henningsson (1): switch-on-port-available: Add some basic properties David Hewitt (1): vala: Fix lengths for source/sink port arrays Felipe Sateler (4): launch: avoid autostarting pulseaudio systemd units for root build-sys: test for cxx-11 after AC_USE_SYSTEM_EXTENSIONS build-sys: don't install esdcompat tool if building without esound support qpaeq: fix Qt5 mainloop use Georg Chini (10): loopback: Use new allow_negative flag of pa_{source, sink}_get_latency_within_thread() bluez5-device: Set transport state correctly for AG role loopback: Track and use average adjust time switch-on-connect: add option to ignore virtual sinks/sources sink, source: Don't finish move if unlink happens after pa_*_move_all_start() filter-apply: Ignore monitor source of filter in find_paired_master() bluez5-device: Rewrite of thread function, reduce send buffer size for a2dp sink bluez5-device: Fix memory leak in sco_process_render() alsa-util: Set ALSA report_delay flag in pa_alsa_safe_delay() alsa-util: Use time stamp config only for alsa versions >= 1.1.0 Guenter Milde (1): alsa-mixer: fix speaker output on a couple of Asus EeePC machines Hui Wang (2): alsa-mixer: Add support for usb audio in the Dell dock TB16 build-sys: add the Dell dock TB16 configuration Ian Ray (1): alsa-mixer: round, not truncate, in to_alsa_dB Iceyer (1): augment-properties: support XDG_DATA_DIRS when find desktop files Johan Heikkilä (1): alsa-mixer: add support for Steelseries Arctis 7 headset Josef Andersson (1): i18n: update the Swedish translation Jungsup Lee (1): Fix memory leaks Khem Raj (1): padsp: Make it compile on musl KimJeongYeon (2): filter-apply: Do not re-route stream to master sink/source when manually moved to filter filter-apply: Eliminate nested and redundant hook events Kristian Klausen (1): alsa-mixer: Prioritize hdmi-* mappings over iec958-* mappings Laurent Bigonville (1): i18n: fix French translation of "Line Out" Mihai Moldovan (2): module-coreaudio-{device, detect}: implement record and playback modargs, curtesy of module-waveout. svolume: disable incompatible MMX and SSE code on x86 macOS Mr. M (1): i18n: update the Lithuanian translation Peter Meerwald-Stadler (7): json-test: Fix Coverity warning bluetooth: bluez5: Fix Coverity warning raop: Fix gcc-7 warnings, EWOULDBLOCK raop: Fix typo core: Fix gcc-7 -Wimplicit-fallthrough= warnings core: Fix typo and gcc-7 -Wimplicit-fallthrough= warnings core: Fix gcc-7 -Wimplicit-fallthrough= warnings by rearranging comment Pierre-Louis Bossart (1): sink: force suspend/resume on passthrough transitions Piotr Drąg (1): i18n: update Polish translation Roliga (1): ladspa-sink: add module argument to set sink input properties Russell Treleaven (1): build-sys: make bootstrap.sh fail if autopoint or intltoolize are not available Salvador Fandino (3): proplist-util: fix compilation on Windows without NLS ladspa-sink: fix Windows compilation build-sys: simulate ln -s correctly on Windows Samo Pogačnik (2): pipe-sink: new option "use_system_clock_for_timing" pipe-sink: use existing fifo Sangchul Lee (2): alsa-sink/source: always set reconfiguration callback ladspa-sink: fix incorrect error conditions Sebastian Dröge (1): Implement module-always-source Sylvain Baubeau (1): module-gsettings: new module to store configuration using gsettings Tanu Kaskinen (81): NEWS: add GNU Hurd support equalizer-sink: update sink description when moving raop: silence a Coverity complaint alsa-mixer: set PCM Capture Source for iec958 input build-sys: add iec958-stereo-input.conf to dist_alsapaths_DATA device-port, switch-on-port-available: fix automatic profile changing when current profile is off cli-command: unload modules synchronously main: set umask to 077 instead of 022 bluetooth: recognize another HSP HS UUID build-sys: add the Arctis configuration sink, source: don't try to update volumes of not-yet-linked devices sink, source: fix out of date comments sink: remove priority bonus for the "internal" form factor alsa-mixer: add mixer handling to the fallback stereo case update NEWS LICENSE: fix typo qpaeq: change license from AGPL to LGPL v2.1 thread-mq: create event on the right mainloop i18n: add raop files to POTFILES.in Revert "alsa-mixer: fix speaker output on a couple of Asus EeePC machines" source-output: fix copy-paste error bluetooth: set better priorities for profiles volume: improve documentation mention the sound card clock and system clock difference in libpulse docs system.pa: load module-device-restore before module-udev-detect system.pa: load module-card-restore sink-input, source-output: add a couple of assertions alsa-sink: update max_rewind when updating the latency remap-source, virtual-source: fix max_rewind handling card-restore: log the correct profile name card-restore: don't restore unavailable profiles echo-cancel: ignore remaining canceller messages after the module has been unloaded echo-cancel: fix a memory leak sink-input, source-output: add sink/source_requested_by_application flag device-manager: don't override application routing requests core-util, cpu-x86: use __get_cpuid() instead of homegrown assembly augment-properties: fix a memory leak map-file: add pa_encoding_from_string alsa: fix infinite loop with Intel HDMI LPE sink, source: improve state change logging sink, source: improve suspend cause logging build-sys: fix PA_MODULE_NAME for module-default-device-restore switch-on-port-available: remove unused return values alsa-mixer: add another hardware ID for Traktor Audio 6 bluetooth: don't send unsolicted replies to the endpoint Release() call memfd-wrappers: only define memfd_create() if not already defined alsa-mixer: add hw_device_index to pa_alsa_mapping alsa-mixer: autodetect the HDMI jack PCM device alsa-mixer: autodetect the ELD device sink, source: redo state changing code pass pa_suspend_cause_t to set_state() callbacks sink: don't sync monitor suspend state when unlinking alsa, solaris, oss: remove unnecessary error handling when suspending alsa: add a couple of FIXME comments null-sink, pipe-sink: some state variable cleanups bluetooth: fix resume error handling sink, source: rename set_state() to set_state_in_main_thread() oss: don't fail resume if trigger() fails replace sink/source SET_STATE handlers with callbacks pass pa_suspend_cause_t to set_state_in_io_thread() callbacks fix a call to pa_sink_suspend() from an incorrect thread man: unify pactl and pacmd suspend command documentation .gitignore: add module-gsettings related things default.pa: add module-gsettings gsettings: add the modules schema to the schema description file gconf, gsettings: fix config.h includes gsettings: rename "module" to "module-group" build-sys: remove a redundant enable_gsettings check gsettings: check that children haven't been deleted before using them gsettings: remove bad signal connection gsettings: free the module-group GSettings objects after use gsettings: free group_names after use build-sys: enable GSettings by default gsettings: run gsettings-data-convert from gsettings-helper allow-passthrough: fix hook return value build-sys: bump sonames build-sys: fix distribution of GSettings files build-sys: remove module-defs.h.m4 from EXTRA_DIST alsa-card: fix null dereference sink-input, source-output: fix uninitialized variable access update NEWS Vivek Dasmohapatra (1): daemon: don't re-exec if the linker supports the -z,now option Yuri Chornoivan (1): i18n: update the Ukrainian translation jnqnfe (4): volume: pa_cvolume_scale_mask: constify param volume: slight simplification of code api documentation improvements merge and deduplicate some pa_buffer_attr documentation wellington wallace (1): vala: fix a struct field name and add missing source output volume/mute functions