Logo

Home About Community Download Documentation Planet


PulseAudio 14.0 release notes

  1. Notes for end users
    1. Significant routing changes to default sinks/sources
      1. Changing the default sink moves streams from the old default sink to the new
      2. Moving a stream to the default sink removes the "manually routed" status of the stream
      3. If a sink changes status to available, streams that prefer that sink move there automatically
      4. The same changes have been applied to the source stream routing
      5. Workaround for GNOME Sound Settings' stream routing behaviour
      6. module-rescue-streams is deprecated, functionality moved to the core
      7. New rescue-streams option in daemon.conf
    2. Automatic switching to HDMI is now disabled by default
    3. Better support for some USB gaming headsets
    4. Flat volumes are now disabled by default
    5. The RAOP sink can be configured to automatically reconnect on connection failures
    6. Separate sink_channels and source_channels for module-jackdbus-detect
    7. Improved support for ALSA UCM
    8. Support for ALSA mixer controls with non-zero index
    9. It's now possible to set intended roles for devices in the ALSA profile configuration
    10. Ports now have a type associated with them
    11. Mappings have a new "description-key" option in the ALSA profile configuration
    12. New xauthority argument for X11 modules
    13. module-null-sink's compressed format support can now be configured at run-time
    14. The enable-lfe-remixing option in daemon.conf was split into remixing-produce-lfe and remixing-consume-lfe
    15. New channel_map argument for module-raop-sink
  2. Notes for application developers
    1. pa_mainloop_prepare interprets the timeout argument as microseconds again
    2. New availability_group and type fields in the port info structs
    3. New macros: PA_LIKELY(), PA_UNLIKELY(), PA_CLAMP() and PA_CLAMP_UNLIKELY()
  3. Notes for packagers
    1. New GStreamer-based RTP implementation
    2. qpaeq switched from Python 2 to Python 3
    3. Compile-time option to forget pre-14.0 stream routing
    4. The install path of the ALSA configuration files is now configurable
    5. GNU gettext minimum version requirement bumped from 0.19.3 to 0.19.8
    6. Heads-up: dropping autotools build system
    7. Heads-up: dropping EsounD support is considered, tell us if you still need it
    8. Heads-up: dropping GConf support
  4. git shortlog

Notes for end users

Significant routing changes to default sinks/sources

Changing the default sink moves streams from the old default sink to the new

Previously, when the default sink changed, new streams were routed to the new default sink, but existing streams stayed on the old sink. Now streams are moved from the old default sink to the new one as well. This doesn't apply to streams that have been manually moved, so per-stream routing is retained.

Moving a stream to the default sink removes the "manually routed" status of the stream

When a stream is playing to a non-default sink and the user moves it to the current default sink, that is now interpreted as a request to remove the "manually routed" status from the stream, so from that point on the stream will automatically move when the default sink changes. Previously it was a problem that if an application was once moved manually, the choice was remembered permanently and there was no good way to clear the manual routing choice.

If a sink changes status to available, streams that prefer that sink move there automatically

Let's assume a situation where a stream has been moved manually to a sink, and then the sink is removed or changes status to unavailable (this can happen for example when headphones are unplugged). Let's also assume that some other sink is the default sink. The stream is now automatically moved to the default sink in this situation, and when the unavailable sink becomes available again, the stream moves back to that.

The same changes have been applied to the source stream routing

A similar logic is applied to source streams. Changing the default source will move streams from the old to the new default source, manually moving a stream to the default source will remove the "manually routed" status and streams will be moved to the preferred source if it becomes available.

Workaround for GNOME Sound Settings' stream routing behaviour

When changing the output device in GNOME Sound Settings, it tries to improve the user experience by moving existing streams to the selected device. It also changes the routing database so that also applications that aren't currently running get routed to the new device, so all applications behave consistently. To PulseAudio this looks like all applications have been manually moved by the user, which causes problems when the default device changes, because manually moved streams don't follow default sink changes.

Despite those problems, it made sense for GNOME Sound Settings to do this, because the alternative was considered worse: streams didn't move when changing the default device. Now that PulseAudio handles the automatic stream moving, there's no more justification for doing manual stream moving and stream database modifications in GNOME Sound Settings. We can't remove the functionality from GNOME Sound Settings when updating to the new PulseAudio version, but we wanted to solve this anyway without waiting for a new GNOME version, so we ended up adding some special code that ignores the stream routing changes when the changes come from GNOME Sound Settings.

module-rescue-streams is deprecated, functionality moved to the core

module-rescue-stream doesn't do anything any more, and is deprecated. When a device is removed, the module used to move streams on that device to some other device, but that is now handled by the core, so the module has nothing to do. If you have custom configuration that loads module-rescue-streams, you should remove the module from the configuration. Having it in the configuration doesn't do harm, but there will be warnings in the PulseAudio log.

New rescue-streams option in daemon.conf

After moving the rescue functionality to the core, stream rescuing could no longer be disabled. Therefore a new boolean option rescue-streams was added to daemon.conf which is true by default. Set it to false to disable stream rescuing.

Automatic switching to HDMI is now disabled by default

PulseAudio 13.0 started to switch output to HDMI automatically when module-switch-on-connect was loaded (upstream PulseAudio doesn't load it by default, but some distributions do). This change was not intentional, and caused very annoying behaviour in cases where waking up the monitor from sleep appears as a plug-in event in ALSA. Now module-switch-on-connect has a configurable blacklist, which by default prevents switching to HDMI devices. The blacklist is configured with a module argument, named "blacklist", which takes a regular expression that is matched against sink and source names. The default blacklist regular expression is "hdmi". To disable all blacklisting, you can pass "" (empty string) as the module argument value.

Better support for some USB gaming headsets

Custom configuration was enabled for a few headset models:

  • HyperX Cloud Orbit S
  • LucidSound LS31
  • Razer Kraken Tournament Edition
  • SteelSeries Arctis 5 (2019 edition)
  • SteelSeries Arctis Pro (2019 edition)

PulseAudio now creates separate stereo and mono (voice) sinks for these headsets.

Flat volumes are now disabled by default

Flat volumes have always been a controversial feature in PulseAudio. With flat volumes the stream volumes control also the sink volume. In the simple case of only one stream, the stream and the sink volume are always the same. In case of multiple streams, the sink volume is set to the maximum of the stream volumes. The purpose of this is to simplify the volume control of an application: the full volume range is always available via the application volume slider, so there's no need to think about the sink volume. In practice, however, this has caused more harm than good (the worst problem is that some applications automatically set their stream volume to 100%, causing the audio to be played at the maximum volume that the hardware can produce), and most large distributions have patched PulseAudio to disable flat volumes by default. Now that patching won't be needed any more.

Flat volumes can be enabled by setting "flat-volumes = yes" in ~/.config/pulse/daemon.conf.

The RAOP sink can be configured to automatically reconnect on connection failures

When a RAOP sink is created by manually loading module-raop-sink (rather than automatically by module-raop-discover), it's now possible to keep the RAOP sink present even if the connection to the remote device is lost. This is done by setting the "autoreconnect=true" module argument.

The RAOP sink acts as a "null sink" (discarding audio played to it) during the time the connection is down.

Separate sink_channels and source_channels for module-jackdbus-detect

Previously module-jackdbus-detect had only a single channels argument, which was used for configuring how many channels the JACK sink and source would have. New sink_channels and source_channels arguments have been added that allows configuring different channel count for output and input.

Improved support for ALSA UCM

PulseAudio now supports hardware volume when using ALSA UCM. Hardware mute is supported with the PlaybackMasterElem and CaptureMasterElem options but not yet with PlaybackSwitch or CaptureSwitch.

It's now possible to use multiple sound cards with the same name simultaneously with UCM. An example of this situation is having multiple identical USB sound cards plugged in. This requires alsa-lib version 1.2.1 or higher.

There are many other improvements and fixes too.

Support for ALSA mixer controls with non-zero index

On some hardware there can be multiple ALSA mixer controls with the same name, in which case they're distinguished by their index. PulseAudio has so far always used only the control with index 0, now it's possible to write configuration for hardware that requires using non-zero indexes. Wherever a mixer control name could be used before, it's now possible to append the index to the name using a comma as the separator. For example: Headphone,1.

It's now possible to set intended roles for devices in the ALSA profile configuration

There's a new intended-roles option in the [Mapping] section of the profile-set configuration files. The new option can be used to set the device.intended-roles property for the sink or source that the mapping corresponds to. Currently we use this to tag the voice sink of gaming headsets.

Ports now have a type associated with them

The port type tells what kind of device it corresponds to (speakers, headphones, microphone etc.). The type is automatically set for bluetooth and ALSA UCM devices, for non-UCM ALSA devices it's configured with the type option in the [General] section of the path configuration files. pactl list cards shows the type in the port list.

Mappings have a new "description-key" option in the ALSA profile configuration

There's a new description-key option in the [Mapping] section of the profile-set configuration files. Usually the mapping description is looked up using the mapping name as the key, but the description-key option can be used to set some other key. This is currently used in the USB gaming headset configuration, which defines separate mono and stereo mappings for chat audio (some headsets support stereo and some support mono audio). Those mappings have different names, but they should use the same description, which is why the description-key option was added.

New xauthority argument for X11 modules

The X11 modules (module-x11-bell, module-x11-cork-request, module-x11-publish and module-x11-xsmp) now accept the "xauthority" module argument. It's used by the start-pulseaudio-x11 to pass the value of the XAUTHORITY environment variable to the PulseAudio daemon so that the daemon can set the same environment variable in its own environment. This is required in some systems to make it possible for the X11 modules to connect to the X11 server.

module-null-sink's compressed format support can now be configured at run-time

In the previous release it became possible to configure module-null-sink to accept compressed formats. That had to be done with module arguments when loading the module, now the configuration can be done at any time using "pactl set-sink-formats" or pavucontrol (pavucontrol 4.0 has a bug that prevents this from working, though, but the next pavucontrol version will have that bug fixed).

The enable-lfe-remixing option in daemon.conf was split into remixing-produce-lfe and remixing-consume-lfe

Splitting the option into two allows to separately control the use of the lfe channel in upmixing and downmixing. The old enable-lfe-remixing option is deprecated and should be replaced. If the old option is encountered, both new options will be set to the value of enable-lfe-remixing.

New channel_map argument for module-raop-sink

The channel_map module argument allows setting a different channel map for the RAOP sink than the default map that is configured in deamon.conf.

Notes for application developers

pa_mainloop_prepare interprets the timeout argument as microseconds again

PulseAudio 13.0 accidentally changed the pa_mainloop_prepare timeout argument interpretation from microseconds to milliseconds. That change is now reverted - we apologize for this breaking API change. We hope reverting the change will cause less harm than keeping the code from 13.0.

New availability_group and type fields in the port info structs

The pa_sink_port_info, pa_source_port_info and pa_card_port_info structs have two new fields: availability_group (string) and type (enum). These were added in order to provide a better API for the "What did you plug in?" dialog that at least GNOME shows when a device is plugged in to a connector that supports headphones, headsets and microphones but doesn't provide information about which one was plugged in. The availability group is used to mark ports that share jack detection with each other. The type field can be more generally useful if applications want to know the type of a device.

New macros: PA_LIKELY(), PA_UNLIKELY(), PA_CLAMP() and PA_CLAMP_UNLIKELY()

The "likely" macro provides a hint for the compiler that the condition is usually true, similarly "unlikely" is a hint that the condition is usually false. The clamping macros change a value to the given range if it's originally outside the range. The reason these were added to the public API was that we already had the PA_CLAMP_VOLUME() macro in the API, but it couldn't actually be used, because it needed the PA_CLAMP_UNLIKELY() macro that wasn't available to applications before.

Notes for packagers

New GStreamer-based RTP implementation

module-rtp-send and module-rtp-recv can now use GStreamer to implement the RTP protocol. The GStreamer backend is disabled by default, and should be considered experimental for this release, and testing is welcome (use --enable-gstreamer with Autotools or -Dgstreamer=enabled with Meson).

The purpose of using GStreamer is to make it easier to add more advanced RTP features in the future such as RTCP, non-PCM audio, and potentially synchronized playback.

This adds new dependencies: gstreamer-1.0, gstreamer-app-1.0 and gstreamer-rtp-1.0. GStreamer plugins from the gst-plugins-good package are required as well for the udpsrc and rtpbin elements (the plugins are a run-time dependency, there is no compile-time check for these).

qpaeq switched from Python 2 to Python 3

The Python interpreter that qpaeq invokes was switched from python to python3. Also, qpaeq doesn't import the SIP module any more (it wasn't used anyway), so if your qpaeq package currently has an explicit dependency to python-sip, that can be dropped. (There's still an implicit dependency to SIP via PyQt, though.)

Compile-time option to forget pre-14.0 stream routing

A new --enable-stream-restore-clear-old-devices (Autotools) or -Dstream-restore-clear-old-devices=true (Meson) build option was introduced which instructs pulesaudio to discard pre-14.0 stream routing information. This was necessary because, prior to 14.0, GNOME sound settings used to manipulate the stream-restore database when the default device was switched. The resulting old settings can conflict with the current changed routing logic and can lead to inconsistent stream routing. See https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/832. The option is disabled by default because it will cause data loss but should be enabled in distributions using GNOME.

The install path of the ALSA configuration files is now configurable

Previously the ALSA configuration files were always installed to $datadir/pulseaudio/alsa-mixer, now the location can be customized using the -Dalsadatadir Meson option or the --with-alsa-data-dir Autotools configure option. At least Arch uses this to install the files to /usr/share/alsa-card-profile to make it easier to share the files between PulseAudio and PipeWire.

GNU gettext minimum version requirement bumped from 0.19.3 to 0.19.8

A newer gettext version was needed for distcheck to work with a checked-in pulseaudio.pot.

Heads-up: dropping autotools build system

Given that the meson build system runs much faster and is now is more-or-less on par with the autotools build, we will be dropping support for the autotools build in 15.0. Please let us know if you have a dependency on autotools for any reason.

One difference from Autotools is that the --disable-neon-opt option for disabling NEON optimizations doesn't have a counterpart in Meson due to how Meson's NEON detection works. NEON will always be enabled if the compiler supports it, but even if the target machine doesn't support NEON, that shouldn't be a problem, because PulseAudio disables NEON at run-time if the processor doesn't support it.

Update 2020-11-28: With Meson the database files in ~/.config/pulse/ have different names than with Autotools, which means that when switching to Meson, user settings will be forgotten. This needs to be fixed, the bug is tracked here: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/issues/1062

Heads-up: dropping EsounD support is considered, tell us if you still need it

EsounD has been obsolete for over 10 years, but PulseAudio still supports EsounD applications by implementing the EsounD protocol. We plan to drop all EsounD functionality in 15.0, because probably nobody needs it. Please tell us if you still use an application that requires EsounD support.

Heads-up: dropping GConf support

PulseAudio 12.0 introduced module-gsettings, which superseded the old module-gconf, but module-gconf was kept around for making transitioning easier. Both modules are used (or at least supposed to be used) only by paprefs to save its settings, which requires module-gconf prior to version 1.0 and module-gsettings from version 1.0 onwards. The plan is to remove module-gconf in PulseAudio 15.0.

git shortlog

Alexander E. Patrakov (1):
      man: Deprecate the enable-remixing option

Alexander Patrakov (1):
      Split the enable-lfe-remixing setting into two

Arun Raghavan (28):
      rtp: Make init return a value for success/failure
      rtp: Don't use cookie for SSRC
      rtp: Drop support for non-L16 media
      rtp: Move MTU handling to the RTP implementation
      rtp: Hide RTP implementation details from module-rtp-*
      rtpoll: Separate out before/after/work callback userdata
      rtp: Add a GStreamer-based RTP implementation
      rtp: Add some logging to know what backend is being used
      switch-on-connect: Fix warning on discarded const qualifier
      alsa-ucm: Support Playback/CaptureVolume
      gitlab: Make container updates automatic
      build: Bump soversion for libpulse
      ci: Update for changes in CI template
      ci: Go back to using CI templates from master
      alsa-mixer: Add an explicit profile-set for Audigy devices
      build-sys: Bump soversions
      build-sys: Add doxygen/meson.build to distfiles
      build-sys: Bump gettext dependency
      Revert "alsa-mixer: support up to 8 channels per mixer element"
      build-sys: meson: Add libm dep to raop module
      rtp: gstreamer: Don't count on buffer DTS for capture time
      rtp: gstreamer: Account for rounding errors in RTP timestamp conversion
      build-sys: Set the GStreamer RTP backend to disabled by default
      sink, source: Skip filter streams while changing default sink/source
      switch-on-port-available: Switch to headphones on unknown availability
      module-alsa-card: Drop availability groups with only one port
      Revert "mainloop: fix timeout assignment in pa_mainloop_prepare"
      build-sys: Bump libpulse soversion

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

Baurzhan Muftakhidinov (1):
      i18n: Add initial Kazakh translation

Ben Buchwald (2):
      module-jackdbus-detect: Allow omitting channels argument
      module-jackdbus-detect: Separate sink/source channels arguments

Daniil Kovalev (1):
      Fix memory leak in context_free

Dave Chiluk (1):
      alsa-mixer: add support for LucidSound LS31, and create usb-gaming-headset profile

David Heidelberg (2):
      meson: convert post-install.sh to python
      meson: convert to install_headers

Dusan Kazik (1):
      Translated using Weblate (Slovak)

Eero Nurkkala (3):
      alsa-ucm: disallow null mdev argument into pa_alsa_open_mixer_by_name()
      tests: hashmap-test.c: fix memory leak
      tests: cpu-remap-test.c: fix memory leaks

Emanuil Novachev (1):
      Translated using Weblate (Bulgarian)

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

Felipe Sateler (2):
      qpaeq: Drop unused imports
      qpaeq: use python3 instead of python 2

Felix Yan (1):
      shell-completion: zsh: Correct a typo

Geert Warrink (1):
      Translated using Weblate (Dutch)

Georg Chini (5):
      virtual sources: Propagate asyncmsgq change after source-output move
      sink-input, source-output: Fix stream rescue if a move fails
      daemon.conf: Add boolean rescue_streams parameter
      sink, source: Fix stream rescue from sinks or sources without port
      stream-restore: Restore preferred device for new streams

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

Hugo Osvaldo Barrera (1):
      Delete .travis.yml

Hui Wang (19):
      sink-input: change bool save_sink to char *preferred_sink
      sink-input: add a new API pa_sink_input_set_preferred_sink
      sink-input: clear the preferred_sink if it is default_sink
      core: move sink-inputs conditionally when update default_sink
      sink: move streams to new appeared sinks if they prefer these sinks
      device-port: moving streams due to changing the status of active_port
      sink: move the streams to the default_sink when the sink is unlinked
      stream-restore: skip entries setting action from gnome-control-center
      source-output: change bool save_source to char *preferred_source
      source-output: add a new API pa_source_output_set_preferred_source
      source-output: clear the preferred_source if it is default_source
      core: move source-outputs conditionally when update default_source
      source: move streams to new appeared sources if they prefer these sources
      device-port: moving streams since active_port on source changes status
      source: move the streams to the default_source when the source unlink
      stream-restore: skip entries set on source from gnome-control-center
      alsa-mixer: store the ucm_device with the order of their priority
      alsa: make the unsuspend more robust
      alsa: adjust ucm sink/source priority according to ports priority

Igor V. Kovalenko (9):
      module-stream-restore: log error writing volume/mute/device entry to database
      module-stream-restore: check if dbus entry exists in dbus_entries map before creating it
      device-port: fire port available changed hook after streams are moved
      build-sys: meson: adjust path to gsettings-helper runing from build tree
      module-bluez5-discover: avoid use after free on de-init
      pactl: explicitly print if port availability is unknown
      i18n: Update pulseaudio.pot
      module-alsa-card: Add debug logging if availability group was pruned
      switch-on-port-available: Add logging for port availability group

Jan Alexander Steffens (heftig) (5):
      autotools: Put module-tunnel-source X11_CFLAGS into CFLAGS instead of LDFLAGS
      meson: Define TUNNEL_SINK for module-tunnel-sink
      build-sys: meson: Fix detection of SYS_memfd_create
      meson: Add missing thread_dep to atomic-test
      build: Make alsadatadir configurable

Jarno Suni (2):
      shell-completions/bash: Add pactl set-default-sink and set-default-source
      shell-completion: Do not use 'awk -e' in bash completion

Jaroslav Kysela (40):
      alsa-ucm: use ucm2 name for the direct card index open
      alsa-ucm: add mixer IDs to ucm_items
      alsa-mixer: handle the index for ALSA mixer element identifiers
      alsa-mixer: improve alsa_id_decode() function
      alsa-ucm: use the correct mixer identifiers as first
      alsa-ucm: add support for master volume
      alsa-ucm: split correctly JackHWMute device names
      alsa-ucm: fix parsing for JackControl
      alsa-ucm: add comments to ucm_get_mixer_id()
      alsa-ucm: validate access to PA_DEVICE_PORT_DATA()
      alsa-ucm: parse correctly the device values
      alsa-ucm: do not try to use UCM device name as jack name by default
      alsa-util: do not try to guess the mixer name from the PCM name
      alsa-ucm: add control and mixer device items
      alsa-ucm: get the mixer names from ucm, don't guess
      alsa-ucm: use the proper mixer name for ucm pcm sink/source
      alsa-mixer: handle interface type (CARD,PCM) for mixer element lookups
      alsa: rewrite mixer open/close, cache mixer accesses in probe
      alsa-ucm: add support for HDMI ELD
      alsa-mixer: do the quick card number lookup to save mixer instances
      alsa-mixer: improve check for the empty path set for sink/source
      alsa-ucm: allow to set profile priority from UCM value
      alsa-ucm: correct the channel default logic (stereo)
      alsa ucm: do not assign JackHWMute when JackControl is missing for the UCM device
      ucm: fix the port / ucm device activation on boot
      alsa sink/source: fix the mixer initialization
      device-port: introduce available_group member
      device-port: add type member
      protocol: describe v34 (available_group, port type)
      alsa-ucm: set available_group (use jack name)
      alsa: legacy card - set available_group
      alsa: legacy card - implement device port type parser and assignment
      alsa ucm: set device port type
      pactl: print device port type and available group
      ucm: add possibility to skip the UCM card completely (Linked)
      alsa: mixer - reorder the type field in path parser
      alsa: fix analog-input-microphone-headset device type
      alsa: fix type for legacy hdmi devices
      alsa-mixer: support up to 8 channels per mixer element
      alsa: move the exceptionally large value errors from error to debug level

Jaska Uimonen (1):
      alsa-ucm: Fix volume control based on review

Jean-Baptiste Holcroft (1):
      Translated using Weblate (French)

Josh (1):
      alsa-mixer: add support for SteelSeries Arctis Pro 2019 headset

Juliano de Souza Camargo (1):
      Update Portuguese translation

Kai-Heng Feng (3):
      alsa: Skip resume PCM if hardware doesn't support it
      alsa-mixer: Recognize USB audio jack mixer
      module-alsa-card: Set a minimum profile priority if it's not set

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

Khem Raj (1):
      remap/arm: Adjust inline asm constraints

Krzysztof Stasiowski (1):
      alsa-mixer: Add support for SteelSeries Arctis 5 2019 headset

Laurent Bigonville (2):
      alsa-mixer: Add the ability to pass the intended-role to the mapping
      alsa-mixer: Set the intended-role of Steelseries Arctis 5/7 headset as phone

Libin Yang (2):
      core-subscribe: add PA_SUBSCRIPTION_EVENT_CARD in dump_event
      device-port: queue CARD CHANGE event before update default sink

Marc Ranolfi (1):
      card-restore: prevent segfault caused by 'restore_bluetooth_profile=true'

Michael Pivonka (1):
      alsa-mixer: Add Razer Kraken Tournament Edition USB headset

Milo Casagrande (2):
      l10n: Update Italian translation
      Translated using Weblate (Italian)

Milo Ivir (1):
      Translated using Weblate (Croatian)

Nick Moriarty (1):
      Permit root-owned home directory

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

Pali Rohár (5):
      bluetooth: Implement reading SO_TIMESTAMP for A2DP source
      bluetooth: Print SO_TIMESTAMP warning for SCO source only once
      bluetooth: Ensure that only one A2DP codec is registered to bluez
      bluetooth: policy: Remove BlueZ 4 related code
      alsa: Fix compile warnings

Peter Levine (1):
      atomic: Explicitly cast void* to unsigned long

Peter Meerwald (1):
      macro: Move PA_LIKELY()/PA_UNLIKELY(), PA_CLAMP()/PA_CLAMP_UNLIKELY() to pulse/gccmacro.h

Philip Withnall (1):
      daemon: Add --log-target=journal to pulseaudio.service

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

RODRIGUEZ Christophe (1):
      raop: Allow channel map module argument

Rafael Fontenelle (3):
      i18n: Update Brazilian Portuguese translation
      Update Brazilian Portuguese translation
      Update Brazilian Portuguese translation

Ralph Seichter (1):
      macos: Add missing import statement

Rasmus Thomsen (1):
      meson: link libintl if it's not provided by libc

Rickie Schroeder (1):
      start-pulseaudio-x11: fix KDE version check

Rosen Penev (2):
      modules: fix wrong formats under 32-bit
      raop-crypto: add missing header

Ryszard Knop (1):
      switch-on-connect: Add blacklisting

Sanchayan Maity (2):
      modules: rtp-gstreamer: Fix RTP sound lag
      rtp: Fix sending of small packets

Sebastian Dröge (3):
      rtp: Use yes/no in configure instead of 1/0
      rtp: Use udpsink instead of fdsink for the GStreamer RTP implementation
      rtp: Properly timestamp buffers in the GStreamer sender pipeline

Sebastien (1):
      Update configure.ac to fix the enable_gstreamer summary

StefanBruens (1):
      raop: Send initial timing packet to prime UDP connection tracking

Taahir Ahmed (1):
      Add a basic test suite for pa_hashmap

Tanu Kaskinen (56):
      Update NEWS
      alsa-mixer-path-test: Hide unused functions when building with Meson
      daemon-conf: disable flat-volumes by default
      null-sink: allow clients to configure the supported formats
      alsa-mixer: recognize the "Speaker Jack" control
      man: remove outdated information about real-time scheduling
      gitlab: explain the container image tag better
      stream: clarify the meaning of NULL device
      core-util: Handle zero-length volume string
      switch-on-connect: Blacklist HDMI devices by default
      virtual-source: Don't process the rewind during requesting it
      virtual-surround-sink: Use correct sample spec with memblockq
      sink, source: Fix inaccurate log message
      alsa: Document that mixer elements can be identified by a combination of name and index
      ucm: Don't log errors during normal operation
      protocol-native: Fix error code
      i18n: Import Bulgarian translation from fedora.zanata.org
      i18n: Merge Catalan translation from fedora.zanata.org
      i18n: Replace po/ja.po with the Fedora Zanata version
      i18n: Replace po/es.po with the Fedora Zanata version
      i18n: Add pulseaudio.pot to version control
      meson: Remove libpulse dep from libpulsecore
      Point to SupportedAudioFormats wiki page where appropriate
      thread-mainloop: Extend the locking documentation a bit
      stream-restore: Drop the version field from the entry struct
      stream-restore: Fix a potential crash in pa_namereg_is_valid_name()
      stream-restore: Forget pre-14.0 stream routing
      raop-sink: Fix compiler warnings
      sink, source: Use the global configuration for the avoid_resampling default
      man: Explain the limitations of "pulseaudio --check"
      alsa-ucm: Fix NULL pointer handling
      i18n: Update pulseaudio.pot
      build-sys: meson: bump protocol version
      remap_neon: use register r12 instead of r7
      device-port: send sink and source change events when availability changes
      build-sys: Build atomic-test only if pthread_setaffinity_np() is available
      meson: Build atomic-test
      udev: fix too long card name with HyperX Cloud Orbit S
      gitignore: Ignore hashmap-test
      build-sys: Configure doxygen.conf.in a bit differently
      meson: Add doxygen target
      Improve the port available_group and type documentation
      alsa-mixer: Fix mapping_group_available() logic
      Rename "available group" to "availability group"
      alsa-mixer: Fix indentation
      i18n: Update pulseaudio.pot
      man: client.conf: Explain that autospawn=no doesn't disable systemd autostarting
      alsa-mixer: Document the intended-roles mapping option
      ci: Fix comment
      alsa-mixer: Set availability groups once per card
      alsa-mixer: Fix jack name comparison
      gitlab: Remove trailing whitespace from the issue template
      alsa-mixer: Remove references to non-existent multichannel paths
      alsa-mixer: Document the description and description-key mapping options
      switch-on-port-available: Fix switching away from unplugged headphones
      build-sys: Disable GStreamer by default with Autotools

Timo Gurr (1):
      meson: allow to disable installing completions

Tom Yan (2):
      main, core: check idle after loading conf
      man: mention that exit-idle-time is complied if the user is lingering

Tomasz Kontusz (4):
      alsa-mixer: Fix well-known descriptions for steelseries game/chat outputs
      alsa-mixer: Remove unused iec958-passthrough* descriptions
      alsa-mixer: add description-key to Mappings and Profiles
      alsa-mixer: add support for Astro A50 gaming headset

Vasilis Tsiligiannis (1):
      start-pulseaudio-x11: Make 'plasma' version check shell portable

Wim Taymans (5):
      X11: Add xauthority parameter
      alsa: handle unavailbale HW volume in UCM
      alsa-ucm: use the right profile name
      modules: fix some small memory leaks
      alsa-util: fix check for digit

Yi-Jyun Pan (1):
      l10n: zh_TW: update translation

Yuri Chornoivan (1):
      i18n: Update poulseaudio.pot

ckdo (8):
      raop: Fix non working tcp mode
      rtp: Fix reverted test for INHIBIT_AUTO_SUSPEND_ONLY_WITH_NON_MONITOR_SOURCES
      raop: Fix soft volume not applied on initial volume
      raop: Fix rewinding handling : process just after request received
      raop: Fix callback call in raop client after auth : only call once everything is freed
      raop: Code clarification : Detect raop_client recording state in a proper way
      raop: Code clarification : Only free the I/O thread when everything is initialized
      raop: Add autoreconnect feature

efim (1):
      add comma

itsthem (1):
      pulsecore: Replace gendered pronouns with gender neutral ones

muzena (1):
      i18n: Update the Croatian translation

roshal (1):
      man: remove space

zhaochengyi (1):
      pulsecore: Add exception judgment to fix the crash when playing music