PulseAudio 14.0 release notes (draft)

Changes at a glance

  • Changing the default sink moves streams from the old default sink to the new
  • Moving a stream to the default sink removes the "manually routed" status of the stream
  • Manually routed streams move automatically to/from a sink when the sink changes status between available and unavailable.
  • Automatic switching to HDMI is now disabled by default
  • Better support for some USB gaming headsets
  • Flat volumes are now disabled by default
  • Improved support for ALSA UCM
  • Support for ALSA mixer elements with non-zero index
  • New xauthority argument for X11 modules
  • module-null-sink's compressed format support can now be configured at run-time
  • Workaround for Gnome sound settings stream routing behaviour
  • module-rescue-streams is deprecated, functionality moved to the core
  • New GStreamer-based RTP implementation
  • qpaeq switched from Python 2 to Python 3

Notes for end users

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

It used to be so that when the default sink changes, new streams went 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. This doesn't apply to streams that have been manually moved, so the 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 changes status to unavailable but is not removed (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.

Automatic switching to HDMI is now disabled by default

PulseAudio 13.0 started to switch output to HDMI automatically when module-switch-on-connect is 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:

  • LucidSound LS31
  • 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.

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.

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.

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).

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.

Notes for application developers

(Nothing here yet.)

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 old RTP implementation is still available as a compile time option (--disable-gstreamer with Autotools or -Dgstreamer=disabled with Meson), but the GStreamer implementation is used by default. The purpose of using GStreamer is to make it easier to add more advanced RTP features 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. TODO: Which tarballs provide these libraries? Are there additional runtime dependencies (required plugins)?

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.)

git shortlog