
| Home | About | Community | Download | Documentation | Planet |
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
Updates for the Vala bindings
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
