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