PulseAudio 17.0 release notes

Notes for end users

Updates to ALSA UCM-based setups

An extensive set of changes landed which modify how ALSA UCM configuration is mapped to PulseAudio profiles and ports. Notably

  1. We no longer generate combined ports for non-conflicting devices, and instead create one profile for each set of non-conflicting devices. Devices that are not explicitly marked as conflicting but share the same PlaybackPCM or CapturePCM are considered conflicting.
  2. Instead of different inputs/outputs being exposed as ports on a source/sink, they will be exposed as separate sources/sinks. On some setups where two inputs or outputs can run concurrently and independently, you will now see more than one input/output sink available when selecting the appropriate profile.

Battery level indication to Bluetooth devices

This shares the battery level of a PulseAudio host to a Bluetooth headset (for example, if you're running a PulseAudio-based device connected to a car, the car can report the battery level of your device).

Support for the Bluetooth FastStream codec

Devices that support the FastStream codec (which provides higher quality bidirectional audio) are now supported.

webrtc-audio-processing dependency updated

We updated to a more recent version of the webrtc-audio-processing library with improvements in echo cancellation and higher tolerance for drift. Unfortunately, this does mean that beamforming support, which was dropped upstream, is no longer present.

Trigger role groups added to module-role-cork

module-role-cork now allows groups of roles (separated by /) as triggers.

XDG base directory spec for profile-set loading

The XDG base directory specification is now used for ALSA profile set loading ($XDG_DATA_HOME, followed by $XDG_DATA_DIRS, and finally falling back to the previous behaviour).

Notes for application developers

PA_RATE_MAX increased

The maximum supported sample rate is now 768kHz.

Notes for packagers

webrtc-audio-processing dependency updated

We now depend on version 1.3 of the library, which is parallel-installable with other API versions. As part of this change, the default cpp_std for the project has been set to c++17.

git shortlog

Alistair Leslie-Hughes (7):
      Propagate return value from pa_pstream_attach_memfd_shmid
      Ensure fds are closed when exec functions are used.
      pactl: Stop a crash when setting the volume which is out of range
      pulsecore: Set errno before calling read
      rtp-send: Use getaddrinfo to improve support for ipv6.
      rtp-send: Use getaddrinfo to improve support for ipv6 on source address
      rtp-recv: Use getaddrinfo to improve support for ipv6.

Alper Nebi Yasak (24):
      idxset: Add set contains() function
      idxset: Add set comparison operations
      idxset: Add reverse iteration functions
      alsa-ucm: Always create device conflicting/supported device idxsets
      alsa-ucm: Make modifiers track conflicting/supported devices as idxsets
      alsa-ucm: Add enable, disable, status helpers for devices
      alsa-ucm: Let profiles know their associated UCM verb
      alsa-ucm: Stop conflating profile name with UCM verb name
      alsa-ucm: Make mapping creation independent from indvidual profiles
      alsa-ucm: Split profile creation into verb and profile parts
      alsa-ucm: Rewrite conformant device group generation with idxsets
      alsa-ucm: Fix device conformance check
      alsa-ucm: Split out helpers for device set name, description, priority
      alsa-ucm: Make one input/output mapping per UCM device
      alsa-ucm: Remove combination port generation logic
      alsa-ucm: Make ports store only one device
      alsa-ucm: Make mapping UCM contexts have only one device
      alsa-ucm: Make mapping UCM contexts have only one modifier
      alsa-ucm: Disable old devices when switching profiles of same verb
      alsa-ucm: Create multiple profiles per verb for conflicting devices
      alsa-ucm: Add enable, disable, status helpers for modifiers
      alsa-ucm: Disable old modifiers when switching profiles of same verb
      alsa-ucm: Consider devices using the same PCM as incompatible
      alsa-ucm: Fix more instances of profile-verb conflation

Arun Raghavan (13):
      ci: Update to freedesktop/ci-templates
      ci: Use built-in distribution image name mechanism
      echo-cancel-test: Drop references to internal message queue
      build-sys: Bump webrtc-audio-processing dependency
      build-sys: Bump .so version 16.99.1
      build-sys: Bump cpp_std to c++17
      build-sys: Add a webrtc-audio-processing wrap file
      ci: Force build of webrtc-aec
      ci: Add doxygen to build image
      ci: Drop -werror in build
      build-sys: Bump webrtc-audio-processing wrap to 1.2
      build-sys: Bump webrtc-audio-processing wrap to 1.3
      Update NEWS for 17.0

Asier Sarasua Garmendia (2):
      Added translation using Weblate (Basque)
      Translated using Weblate (Basque)

Ataberk Özen (2):
      alsa-profiles: import Asus Xonar SE profile from pipewire
      alsa-profiles: rename mappings for Xonar SE

Balázs Meskó (1):
      Translated using Weblate (Hungarian)

Biswapriyo Nath (1):
      meson: Add DEF file to export APIs in Windows

Dylan Van Assche (4):
      bluez5-util: move pa_bluetooth_discovery to header
      bluetooth: add AT+BIA support
      bluetooth: add UPower backend
      bluetooth: hook up UPower backend

Eero Nurkkala (1):
      echo-cancel: add webrtc AEC3 support

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

Fabrice Fontaine (1):
      meson.build: fix build without C++

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

Georg Chini (7):
      combine-sink: Fix threading issue during underrun
      time-smoother-2: Fix stream time when stream starts paused
      stream-interaction: Extend trigger groups to module-role-cork
      stream-interaction: Fix regression when a trigger role is also a cork role
      tunnel-sink-new: Fix hang when used in combination with module-combine-sink
      switch-on-connect: Do not overwrite user configured default sink/source
      pactl, pacmd: Allow to unset the configured default sink or source

Gioele Barabucci (1):
      daemon/meson.build: Install dbus policy in /usr, not /etc

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

Hector Martin (1):
      alsa: ucm: Fix spurious mixer path removal on initial profile set

Hugo Carvalho (1):
      Translated using Weblate (Portuguese)

Hui Wang (1):
      backend-native: Handle multi AT commands in a buffer

Igor V. Kovalenko (26):
      rtp: Accept CRLF delimiters in SDP as required by RFC 4566
      rtp: Initialize SDP info struct field added for OPUS
      build-sys: meson: Make module-console-kit optional
      build-sys: meson: Move qpaeq to daemon build
      bluetooth: Free memblock after codec errors
      bluetooth: Do not use hardware volume control for A2DP backchannel
      bluetooth: Add faststream codec
      bluetooth: Use stereo sample spec for faststream backchannel
      bluetooth: Handle fragmented faststream frames
      bluetooth: Add 20dB boost for faststream source volume
      backend-native: Fix stack corruption reading RFCOMM AT+BIA= response
      module-combine-sink: Do not set up rate adjustment timer at load time
      module-combine-sink: Suspend while unloading to fix crash moving sinks
      backend-native: Fix parsing comma-delimited response
      alsa-util: Dump probed rates
      alsa-util: Add more standard sample rates.
      bluetooth: Amend writeout to send more initial frames
      resampler: Fix oversized memblock pushed from resampler
      bluetooth: Do not attempt decoding too short faststream packet data
      pstream: Pass frame size to keep split memblock parts aligned
      alsa-util: Perform format and rate detection before setting HW params
      alsa-util: Fix pa_alsa_get_supported_formats fallback.
      memblockq: Drop check for chunk index alignment, require aligned length
      shell-completion: Fix typo in --use-pid-file= suggestion
      memblockq: Adjust tail chunk offset into memblock after split
      Fix crash running in restricted environment.

Jaechul Lee (1):
      sound-file-stream: Fix crash when playing a file which is not aligned

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

Jan Palus (1):
      bluetooth/gst: Correct var type for GST_TYPE_BITMASK

Jaroslav Kysela (5):
      alsa-mixer: allow to re-attach the mixer control element
      alsa-ucm: Set profiles by their struct instance, not their name
      alsa-ucm: remove extra space from the device.intended_roles property
      alsa-mixer: fix the re-attach code for the mixer control element
      alsa-mixer: extend pa_alsa_mixer_find with the subdevice check

Jiri Grönroos (1):
      Translated using Weblate (Finnish)

Joachim Philipp (1):
      Translated using Weblate (German)

Jordi Mas (2):
      Translated using Weblate (Catalan)
      Translated using Weblate (Catalan)

Marijn Suijten (5):
      backend-native: Fix indentation and whitespace style
      backend-native: Add backend pointer to transport_data
      Revert "bluez5-util: move pa_bluetooth_discovery to header"
      backend-native: Update all CIND indicators
      backend-native: Remove uninformative "Profile unavailable" debug message

Mart Raudsepp (1):
      proplist-util: Don't assume gdkx is there as gtk could be built without it

Nicolas Cavallari (2):
      build-sys: Fix atomic support detection
      build-sys: Add missing libatomic_ops dependencies

Peter Meerwald-Stadler (5):
      module-combine-sink: Use fabs() instead of abs() for double
      module-combine-sink: Fix indentation
      module-tunnel: Fix typos
      volume: Fix typo
      raop-client: Fix typo

Philip Goto (1):
      Translated using Weblate (Dutch)

Rosen Penev (1):
      meson: fix meson warnings

Rudi Heitbaum (2):
      shm: use MFD_NOEXEC_SEAL for shared memory
      shm: allow for older versions of Linux without MFD_NOEXEC_SEAL

Sabri Ünal (1):
      Translated using Weblate (Turkish)

Sean Greenslade (1):
      pactl: fix parsing of percentages with decimal points

Seong-ho Cho (1):
      Translated using Weblate (Korean)

Shunsuke Shimizu (1):
      build-sys: Fix macOS build

SimonP (1):
      alsa-mixer: Respect XDG base directory spec when loading profile sets

Takashi Sakamoto (1):
      alsa-mixer: avoid assertion at alsa-lib mixer API when element removal

Tanu Kaskinen (2):
      i18n: Update .pot and .po files
      Update NEWS for 16.1

Temuri Doghonadze (10):
      Translated using Weblate (Georgian)
      Translated using Weblate (Georgian)
      Translated using Weblate (Georgian)
      Translated using Weblate (Georgian)
      Translated using Weblate (Georgian)
      Translated using Weblate (Georgian)
      Translated using Weblate (Georgian)
      Translated using Weblate (Georgian)
      Translated using Weblate (Georgian)
      Translated using Weblate (Georgian)

Toni Estevez (5):
      Translated using Weblate (Catalan)
      Translated using Weblate (Spanish)
      Translated using Weblate (Spanish)
      Translated using Weblate (Spanish)
      Translated using Weblate (Spanish)

Weijia Wang (1):
      echo-cancel: Fix macOS build

Wim Taymans (1):
      sndfile: handle sndfiles with s24 format

Yureka (1):
      Make gio-2.0 optional when gsettings is disabled

acheronfail (1):
      pactl: SUBSCRIBE add a newline after every json message

flyingOwl (1):
      time-smoother-2: Fix time calculation by comparing timestamps

grimst (1):
      Translated using Weblate (French)

hashitaku (2):
      shell-completion: add new subcommand get-* for bash
      shell-completion: add new subcommand get-* for zsh

mooo (1):
      Translated using Weblate (Lithuanian)

peijiankang (1):
      fix translation error of pulseaudio

redfast00 (1):
      rtp: fix 'size mismatch' on BSD style operating systems

wael (1):
      meson: use proper type for bools

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