PulseAudio 16.0 release notes

Notes for end users

Opus support in the RTP modules

The audio sent with module-rtp-send can now be compressed with the Opus codec. To use it, pass enable_opus=true as a module argument to module-rtp-send. This feature works only when PulseAudio is compiled with GStreamer enabled (both sending and receiving end).

Stereo output support for EPOS/Sennheiser GSP 670 USB/wireless headset and SteelSeries GameDAC

The EPOS/Sennheiser GSP 670 headset has separate mono and stereo output ALSA devices, but with the default configuration only mono worked with PulseAudio. Now both outputs work. The support includes both direct USB connection and the GSA 70 wireless dongle.

The same fix was applied to SteelSeries GameDAC.

Fix input issues for Texas Instruments PCM2902 based sound cards

Texas Instruments PCM2902 is a generic audio chip that is used in multiple USB sound cards. We had custom configuration for Behringer UMC22, which turned out to affect multiple sound cards because they use the same USB ID. The PCM2902 sound cards vary in their capabilities, while our configuration was tailored only for the UMC22 card, which caused some trouble with recording on multiple PCM2902 sound cards. The reported issues have now been fixed.

Native Instruments Komplete Audio 6 MK2 profiles

The Native Instruments Komplete Audio 6 MK2 is similar to the Komplete Audio 6 and is now supported as well.

Tunnel latency is now configurable

The tunnel sink and source modules used to have a fixed 250 ms latency. The desired latency can now be configured with the latency_msec module argument.

Tunnel modules can now reconnect to remote server

A new reconnect_interval_ms argument was added to all four tunnel sink and source modules. When the argument is specified, the tunnel module will try automatic re-connection to the remote server if the connection fails. The argument specifies the time interval in ms after which a connection attempt is repeated. In particular, this allows to load tunnel sinks and sources from default.pa which will become available as soon as the remote server becomes available.

Bluetooth device battery level reporting added

If a bluetooth device supports battery level reporting, PulseAudio now is able to forward the information to other software. In case your desktop environment doesn't yet support showing the battery level in a nice GUI, the level is also available in the device's card object properties with the bluetooth.battery key. The property can be read with pactl list cards, for example.

Tunnel and combine-sink latency fixes

The tunnel and combine-sink latency reporting accuracy has been improved, which should help with audio synchronization issues.

module-loopback improvements

As part of a set of improvements to module-loopback's latency stability, a new argument, adjust_threshold_usec, was added to module-loopback to fine-tune the controller algorithm. The default value is 250 (microseconds), which should be sufficient in most cases. If it's not enough (caused by inaccurate latency reports from the sink or source), the loopback's sample rate will oscillate, while unnecessarily high values will increase variance in the loopback latency.

Another change is the ability to set the adjust_time argument to smaller values than 1 second, for example 0.5 sets the adjustment interval to half a second. The default value was changed from 10 seconds to 1 second to make the latency control tighter.

module-loopback used to log a bunch of status information every time it adjusted the playback rate. Now that the default adjustment interval is down from 10 seconds to 1 second, the logging became a bit too much, and the logging was disabled by default. It can now be enabled by setting the log_interval module argument. The value is given in seconds, it doesn't have to be an integer. The logging still happens at the time the rate adjustment is done, so if log_interval is less than adjust_time, then the logging will happen once per adjustment cycle.

Increased flexibility for module-jackdbus-detect

module-jackdbus-detect is used for loading a JACK sink and source when JACK starts up. The module now has new sink_enabled and source_enabled arguments that accept boolean values. The new arguments can be used to disable either the sink or the source if loading both is not desired.

module-jackdbus-detect can now also be loaded more than once, allowing multiple JACK sinks or sources with different configurations to be created.

pactl can show information in JSON format

pactl has a new option --format, which accepts values text and json. text shows the pactl output in the traditional way, json shows it in the JSON format for easier interfacing with other software.

Channel remixing can be disabled for module-combine-sink

module-combine-sink now accepts a boolean remix argument, which can be used to disable normal remixing. This is useful when combining multiple sound cards for surround output: if there are 3 stereo sound cards, you might want to set the channel map of one card to front-left,front-right, another to rear-left,rear-right and the third to front-center,lfe. If a combine sink is then created with a 5.1 surround channel map using these sound cards as slaves, audio is copied to all these sound cards, but by default the audio is downmixed to stereo for each card, which doesn't result in proper surround audio. By disabling remixing, no downmixing is done, the channels that don't fit the slave channel map are just dropped, which means that each sound card gets audio only for the intended channels.

Notes for application developers

Stream latency reports now include resampler delay

Sink input and source output latency reporting now includes resampler delay. This delay is bundled into the sink and source latency, respectively. While this is minor semantic change, it should allow for more accurate A/V sync for applications.

Bluetooth device battery level reporting added

If a bluetooth device supports battery level reporting, the level is now reported to BlueZ. Applications can get the battery level using the BlueZ D-Bus Battery API.

The battery level is also available in the device's card object properties with the bluetooth.battery key. There are no notifications when the property value changes, however (bug reported: #1314).

Notes for packagers

Module installation location changed, remember to upgrade paprefs to the latest version!

Modules are now installed to $libdir/pulseaudio/modules, previously they were installed to $libdir/pulse-$version/modules. paprefs has some logic that is sensitive to the module installation path, so if you ship paprefs in your distribution, make sure to upgrade paprefs to version 1.2. Earlier paprefs versions won't work properly with PulseAudio 16.0.

Opus support in the RTP modules requires enabling GStreamer

The new Opus compression is available only when PulseAudio is built with the gstreamer Meson option enabled (previously it was disabled by default, now it's automatically enabled if the necessary dependencies are found).

Bluetooth battery level reporting via BlueZ requires enabling experimentals features in BlueZ

The Battery API is still marked as an experimental feature in BlueZ, and if you wish to have PulseAudio use it, bluetoothd has to be started with the --experimental command line argument.

New time smoother implementation

There's a new algorithm for keeping latency stable during adaptive resampling in module-loopback and elsewhere. Part of that is a new "time smoother" implementation. It will deliver more accurate and stable latency estimations compared to the current algorithm. This is mainly important where a fixed relationship between different streams is required (A/V sync, module-loopback, module-combine-sink, module-echo cancel, ...). Since this is a fair bit of complex new code in the core audio processing parts, the old implementation is kept around for a while to have a backup in case bugs show up. The new time smoother can be disabled with the enable-smoother-2=false Meson option.

Possibility to build the daemon without the client parts

It's now possible to build the daemon without building the client parts at the same time, by using the -Dclient=false Meson option. The daemon will still need the client libraries during the build, the libraries installed in the system will be used. Apparently this kind of scheme is useful for Gentoo.

git shortlog

Alexey Rubtsov (1):
      Translated using Weblate (Russian)

Anders Jonsson (3):
      Translated using Weblate (Swedish)
      Translated using Weblate (Swedish)
      Translated using Weblate (Swedish)

Andika Triwidada (3):
      Translated using Weblate (Indonesian)
      Translated using Weblate (Indonesian)
      Translated using Weblate (Indonesian)

Arun Raghavan (5):
      combine-sink: Set origin_sink for each output stream
      tests: Add passthrough test back to daemon tests
      build-sys: Bump libpulse soversion for 16.0
      Update NEWS for 16.0
      build-sys: Bump soversion for 16.0 release

Biswapriyo Nath (2):
      Fix pointer to integer cast warnings
      Install modules in bindir for Windows

BtbN (1):
      channelmap: make channel map tables static

Chengyi Zhao (2):
      alsa-mixer: Recognize rear mic jack mixer of USB audio
      bluetooth: Try to reconnect SCO

Chupligin Sergey (1):
      Fix spelling of warning

Craig Howard (5):
      tunnel-sink-new: refactor sink creation
      tunnel-sink-new: create sink *after* connection
      tunnel-sink-new: reinit module
      tunnel-source-new: add restart/reconnect logic
      module-tunnel: restart module

Daniel Dantur (1):
      Translated using Weblate (Spanish)

Daniel Hernandez (1):
      Translated using Weblate (Spanish)

Diederik de Haas (1):
      conf: Note configuration snippets must end in .pa

Dylan Van Assche (1):
      Update NEWS for 16.0

Emilio Herrera (1):
      Translated using Weblate (Spanish)

Ettore Atalan (1):
      Translated using Weblate (German)

Fran Diéguez (1):
      Translated using Weblate (Galician)

Georg Chini (43):
      combine-sink: Fix latency calculations
      combine-sink: Add rate controller
      combine-sink: Improve initial latency reports
      combine-sink: Use configured resampler, reduce update time to 1s
      tunnel: Fix latency calculations
      tunnel: Make fixed latency configurable
      sink-input: Add history memblockq
      resampler: Add pa_resampler_prepare() and pa_resampler_get_delay() functions
      sink-input: Implement resampler pseudo rewinding
      sink-input: Change move logic
      source-output: Fix rewinding
      virtual sources: Include resampler delay in latency reports
      loopback: Add resampler delay to latency snapshots
      sink-input: Limit rewinding to max_rewind for virtual sinks
      sink-input: Query sink inputs for max_rewind value when setting max_rewind
      tests: Add resampler rewind test
      pulsecore: Add alternative time smoother implementation
      Add configuration option enable-smoother-2 to enable alternative smoother code
      alsa sink/source: Allow alsa to use alternative smoother code
      bluetooth: Allow bluetooth to use alternative smoother code
      stream: Allow stream.c to use alternative smoother code
      combine-sink: Allow module-combine-sink to use alternative smoother code
      tunnel: Allow module-tunnel to use alternative smoother code
      esound-sink: Allow module-esound-sink to use alternative smoother code
      raop-sink: Allow module-raop-sink to use alternative smoother code
      solaris: Allow module-solaris to use alternative smoother code
      loopback: Do not detect underruns during initial latency adjustments
      loopback: Limit controller step size to 2.01‰
      loopback: Optimize adaptive re-sampling
      loopback: Add latency prediction and Kalman filter
      loopback: Track prediction error; debug and cosmetic changes
      loopback: Add adjust_threshold_usec parameter
      loopback: Only use controller weight after target latency has been crossed twice
      loopback: Change adjust_time parameter to double to allow adjust times below 1s
      loopback: Add log_interval parameter
      module-tunnel-sink/source-new: Add PA_STREAM_ADJUST_LATENCY flag at stream creation
      time-smoother-2: Fix integer type problem
      tunnel modules: Fix threading issues
      tunnel modules: Fix crash when the module was unloaded while waiting for re-init
      module-tunnel: Improve latency calculation
      zeroconf-publish: Fix crash when avahi_client_new() fails
      various places: Include resampler delay to latency reports and calculations
      combine-sink: Fix latency reports

Gogo Gogsi (4):
      Translated using Weblate (Croatian)
      Translated using Weblate (Croatian)
      Translated using Weblate (Croatian)
      Translated using Weblate (Croatian)

Göran Uddeborg (3):
      Translated using Weblate (Swedish)
      Translated using Weblate (Swedish)
      Translated using Weblate (Swedish)

Hela Basa (1):
      Translated using Weblate (Sinhala)

Hui Wang (1):
      card-restore: setting preferred ports in entry_from_card

Igor V. Kovalenko (35):
      alsa-mixer: Set mdev to NULL if there is no mapping
      rtp: Initialize adapter to NULL for early pipeline error
      build-sys: meson: Require xice, xsm and xtst for daemon only
      build-sys: meson: Check if cpuid.h header is usable
      alsa-mixer: Add EPOS/Sennheiser GSP 670 and GSA 70
      bluetooth: Allow SCO socket packet size to be larger than mSBC frame
      mainloop-test: Disarm io callback on EOF
      alsa-mixer: add support for SteelSeries Arctis Pro + GameDAC
      combine-sink: Add remix modarg
      ladspa-sink: fix compiled in default LADSPA_PATH string
      socket-server: Move systemd socket activation code to pulsecore
      Fix expression with side effect in pa_assert
      thread-mainloop: Release once_unlocked_data object after callback
      bluetooth: Add missing breaks to profile availability check
      message-params: If message paremeters is not JSON, wrap into JSON string
      bluetooth: Release container with device UUID strings
      message-params: Remove unwanted translations from log statements
      x11: Close session manager connection on ICE I/O error callback
      null-sink: Recalculate max_request and max_rewind while resuming sink
      lirc: Fix module version
      bluetooth: Fix device->adapter dependency while releasing discovery
      build-sys: meson: change daemon-only to client
      build-sys: meson: Move remaining tests under daemon and client builds
      build-sys: meson: Rearrange dependencies under client and daemon options
      build-sys: meson: Rearrange shell completion between daemon and client
      build-sys: meson: Fix indentation in daemon/client blocks
      build-sys: meson: Make glib and fftw common dependencies
      thread-test: Increase test timeout
      bluetooth: Limit effective SBC bitpool of incoming bluetooth connection
      bluetooth: Make sure there is at least one SBC frame to encode
      module-suspend-on-idle: Allow suspending a sink when the monitor source becomes idle
      module-device-destore: Log restored port name
      pa-info: Handle configuration files from .d directories
      module-tunnel: Initialize `auto` param default value to false
      bluetooth: mSBC: Decode packets larger than mSBC frame

Jan Kuparinen (6):
      Translated using Weblate (Finnish)
      Translated using Weblate (Finnish)
      Translated using Weblate (Finnish)
      Translated using Weblate (Finnish)
      Translated using Weblate (Finnish)
      Translated using Weblate (Finnish)

Jaroslav Kysela (5):
      alsa: ucm - remove duplicate assignment
      alsa: ucm - fix h/w mute mixer control probe
      alsa: ucm - update the mixer path also after volume probe
      alsa: mixer - more clever alias cache implementation
      alsa: ucm - use possible mixer private device prefix for ELD controls

Josef Haider (1):
      alsa-profiles: Add NI Komplete Audio 6 MK2 profiles

João Paulo Rechi Vita (11):
      bluetooth: Keep a list of local adapters' UUIDs
      bluetooth: backend-native: Rename profile to object in register_profile*
      bluetooth: backend-native: Pass profile id in register_profile*
      bluetooth: Add mechanism to track profile's status
      bluetooth: backend-native: Keep track of profiles' status
      bluetooth: backend-native: Handle RegisterProfile failure
      bluetooth: Consider adapter UUIDs when evaluating profile support
      bluetooth: Add debug logging to pa_bluetooth_device_supports_profile
      bluetooth: Do not create a card profile for unsupported profiles
      bluetooth: Add debug logging to profile creation

Juho Hämäläinen (1):
      bluetooth: Only remove cards belonging to the device.

Karl Ove Hufthammer (4):
      Translated using Weblate (Norwegian Nynorsk)
      Translated using Weblate (Norwegian Nynorsk)
      Translated using Weblate (Norwegian Nynorsk)
      Translated using Weblate (Norwegian Nynorsk)

Laurent Bigonville (2):
      iochannel: Fix FTBFS on GNU/Hurd
      util: Fix getting the binary name for GNU/Hurd

Luna Jernberg (4):
      Translated using Weblate (Swedish)
      Translated using Weblate (Swedish)
      Translated using Weblate (Swedish)
      Translated using Weblate (Swedish)

Lv Genggeng (1):
      Translated using Weblate (Chinese (Simplified) (zh_CN))

Marijn Suijten (19):
      bt/bluez5-device: Update link to assigned Baseband numbers
      bluetooth/native: Signal support for dock status in XAPL reply
      bt/native: Answer AT command with ERROR if unhandled
      bt/native: Parse specified number of arguments in IPHONEACCEV
      bluetooth: Provide (HSP/HFP-received) battery level as device property
      bluetooth: Register as BlueZ experimental BatteryProvider1
      bluetooth: Deregister battery provider when profile disconnects
      bluetooth/native: Accept and report battery HF indicator value
      daemon/cmdline: Invert log-level list to match numerical values
      bluetooth/native: Include util header for pa_msleep
      gitlab-ci: Bump Ubuntu image to 20.04
      gitlab-ci: Turn on Werror for meson builds
      tests/mix-test: Don't pass unnecessary NULL fmt argument to fail_unless
      pulsecore/shm: Remove shm_marker struct packing for pa_atomic_t fields
      bluetooth/backend-native: Replace tab-indents with spaces
      bluetooth/gst: Use GStreamer synchronously within PA's IO thread
      bluetooth/gst: Replace buffer accumulation in adapter with direct pull
      bluetooth/gst: Timestamp encoding buffers according to PA clock
      bluetooth: Demote "No such property 'Volume'" error to warning

Mart Raudsepp (2):
      build-sys: meson: Relax sanity checks for daemonless builds
      build-sys: meson: Allow building the daemon only

Mathy Vanvoorden (2):
      jackdbus-detect: Make it possible to disable sink or source
      jackdbus-detect: Allow to configure multiple sinks/sources

Olivier Gayot (1):
      pactl: fix invalid JSON output by overriding LC_NUMERIC

Ovari (1):
      Translated using Weblate (Hungarian)

Oğuz Ersen (6):
      Translated using Weblate (Turkish)
      Translated using Weblate (Turkish)
      Translated using Weblate (Turkish)
      Translated using Weblate (Turkish)
      Translated using Weblate (Turkish)
      Translated using Weblate (Turkish)

Piotr Drąg (5):
      Translated using Weblate (Polish)
      Translated using Weblate (Polish)
      Translated using Weblate (Polish)
      Translated using Weblate (Polish)
      Translated using Weblate (Polish)

Rafael Fontenelle (1):
      Translated using Weblate (Portuguese (Brazil))

Rico Tzschichholz (1):
      vala: Couple of libpulse binding fixes

Sanchayan Maity (3):
      rtp: Enable support for OPUS
      bluetooth: ldac: Fix RTP payloading of encoded packet
      bluetooth: Rename rtp_sbc_payload to rtp_payload

Sebastian Reichel (1):
      bluetooth: backend-native: add battery level reporting

Sergey A (4):
      Translated using Weblate (Russian)
      Translated using Weblate (Russian)
      Translated using Weblate (Russian)
      Translated using Weblate (Russian)

Sibo Dong (1):
      shell-completion: bash: Localize word variable

Sungjoon Moon (2):
      Translated using Weblate (Korean)
      Translated using Weblate (Korean)

Takashi Sakamoto (1):
      Revert "udev: use ID_MODEL/ID_VENDOR to give friendly name for FireWire devices"

Takuro Onoue (1):
      Translated using Weblate (Japanese)

Tanu Kaskinen (8):
      build-sys: Remove version number from the module path
      i18n: Update .pot and .po files
      i18n: Update .pot and .po files
      alsa-mixer: Improve documentation in texas-instruments-pcm2902.conf
      i18n: Update .pot and .po files
      meson: Enable GStreamer-based RTP by default (when available)
      alsa-mixer: Add analog-input path to TI PCM2902 mappings
      i18n: Update .pot and .po files

Temuri Doghonadze (1):
      Added translation using Weblate (Georgian)

Will Thompson (2):
      CONTRIBUTING.md: fix typo
      CONTRIBUTING.md: fix another typo

Yuri Chornoivan (5):
      Translated using Weblate (Ukrainian)
      Translated using Weblate (Ukrainian)
      Translated using Weblate (Ukrainian)
      Translated using Weblate (Ukrainian)
      Translated using Weblate (Ukrainian)

acheronfail (1):
      pactl: add format flag for JSON output

baek inchan (1):
      Translated using Weblate (Korean)

guest271314 (1):
      pacat: Include the special default device names in documentation

liaohanqin (1):
      pactl: optimized code

simmon (5):
      Translated using Weblate (Korean)
      Translated using Weblate (Korean)
      Translated using Weblate (Korean)
      Translated using Weblate (Korean)
      Translated using Weblate (Korean)

simple (2):
      alsa-mixer: Fix mono input for Texas Instruments PCM2902
      alsa-mixer: Rename behringer-umc22.conf to texas-instruments-pcm2902.conf

tensorknower69 (1):
      fix a single typo in pulse-client.conf.5.xml.in

김인수 (1):
      Translated using Weblate (Korean)