February 2020


As I mentioned in the last report, Fedora offered to host a translation service (Weblate) for us. I (almost) finished the needed preparations: I added the translation template files to version control and merged translations from Fedora’s old translation service (Zanata). The merged translations are still pending review, though, so PulseAudio can’t quite yet be translated on Weblate, but pavucontrol and paprefs can. I added links to Weblate to the pavucontrol and paprefs home pages. If you’re interested in contributing translations, here’s the link for pavucontrol: https://translate.fedoraproject.org/projects/pulseaudio/pavucontrol/ and here’s the link for paprefs: https://translate.fedoraproject.org/projects/pulseaudio/paprefs/.

Arun released the first release candidate of PulseAudio 14.0. I worked on the release notes (there’s still a lot left to do).

I continued working on the UCM configuration for Sound Blaster Audigy Rx. I didn’t make much concrete progress, but I had a discussion on the alsa-devel mailing list with Jaroslav Kysela about the difference between the various ways to configure volume and mute controls elements in UCM. The thread evolved into a discussion about “device variants”, which are a planned UCM concept for dealing with variable channel counts on one device (for example, sometimes the “Speaker” device can have separate stereo and surround modes). Now I have much better understanding about how the ALSA developers think UCM configurations should be structured.

My patch reviews from the last month:

  • Georg Chini fixed a bug in the new stream rescuing logic. Streams weren’t being rescued if a device without any ports was removed.
  • Jaroslav Kysela fixed the default channel logic in PulseAudio’s UCM code. The fallback to two channels wasn’t being applied in many cases.
  • Jan Koester made it possible to configure custom installation directories for pkg-config and CMake files.
  • Lionel fixed a compilation issue in pavucontrol. I don’t know why I’m not seeing the issue on my machine, maybe I have an older or newer version of Gtk, but the fix was good in any case.
  • Patrick McLean added custom configuration for Sennheiser GSX 1000 gaming DAC. With the patch PulseAudio will show separate sinks for voice and other audio. There were some cleanups to be done, so the patch is not merged yet, but it won’t be merged until after PulseAudio 14.0 has been released anyway, due to the release freeze.


There’s a new mailing list for Yocto documentation patches. I updated the yocto-docs README to reflect the new patch submission process.

I added a version check to PulseAudio’s module loading code. With the patch PulseAudio will reject modules whose version doesn’t match the daemon’s version. This is related to my ongoing effort to remove the version number from the module installation path. The changing installation path is an inconvenience for me when doing recipe updates in OpenEmbedded.

PulseAudio has currently two build systems: the old one that uses autoconf and automake and the new one that uses Meson. I’m working on switching to Meson in OpenEmbedded, and I noticed that Pulseaudio’s Meson build system doesn’t have an option to enable or disable Valgrind (it’s automatically enabled if Valgrind is found in the build environment). I implemented a configuration option for controlling the Valgrind support.

The ALSA project made a new release, so I started updating the ALSA recipes.

This post was originally written on 2020-03-02, and first made available to my Patreon supporters. Speaking of Patreon – I’m using crowdfunding in an attempt to make it financially sustainable to continue my volunteer work as a PulseAudio maintainer. If you’d like to help, check out my Patreon page (or Liberapay).

January 2020


Paprefs has a feature to install missing PulseAudio modules if they are required for some functionality. However, the newest paprefs version crashes when clicking the install button. I fixed that bug.

I also fixed a crash in module-virtual-source. The module has an “uplink sink” that can be used to play audio to the source, which will then get mixed to the audio from the virtual source’s master source. I don’t know if that has ever worked, though. The uplink sink rewinding code was broken, causing a crash whenever trying to use the sink.

The PulseAudio 14.0 release is still in the preparation phase. I wrote some release notes, but the notes aren’t complete yet. There’s still one release blocker bug open. Sound Blaster Audigy Rx had a regression in 13.0: it wasn’t any more possible to simultaneously play and record audio with the card. The plan is to fix this by writing ALSA UCM configuration for the card, since that should be easier than fixing the problem in PulseAudio. I have started writing the UCM configuration. Since the only blocker bug doesn’t need changes in PulseAudio, we should release the first release candidate very soon.

The Fedora translation team is transitioning from the Zanata translation tool to Weblate, and as part of this process they proposed that PulseAudio upstream could start using Fedora’s Weblate for managing translations. Currently translators are required to send translations as patches, which isn’t a friendly process, and we’re happy to accept the Fedora translation team’s offer.

Here’s a list of patches I reviewed last month:

  • Georg Chini fixed a crash in virtual sources when the virtual source is moved to another master.
  • Ben Buchwald added a channel_map argument to module-jackdbus-detect, which allows the user to customize the channel positions of the jack sink and source.
  • After we made some significant changes to automatic stream moving, streams weren’t being any more rescued when they were being moved but the move failed, causing the streams to terminate. Georg Chini fixed this. He also added a new “rescue-streams” option to daemon.conf that can be used to disable stream rescuing (previously that would have been achieved by removing module-rescue-streams from the configuration, but that module is now deprecated and isn’t part of the default configuration any more).
  • I reviewed an old cleanup patch from Frédéric Danis that removes unnecessary checks of the EINTR error.
  • Jarno Suni made a couple of fixes to pactl’s bash completions: one patch fixed the completion of the set-default-sink and set-default-source commands, and another patch fixed how cards are listed.


I finished updating the ALSA recipes to version 1.2.1. I also updated the speexdsp recipe to version 1.2.0.

The PulseAudio module installation directory contains the version number, so when updating PulseAudio, the new version’s modules are installed to a different directory than the old version’s modules. When I have done PulseAudio recipe updates in OpenEmbedded, I’ve been annoyed by the directory change. There’s a “buildhistory-diff” tool that I use to see what changed in between the versions, and the tool lists all modules as removed and added files. Since there are many modules, the long list makes it hard to see if there were any actual file removals or additions. In order to improve this I made a patch that removes the version number from the installation directory. The Debian maintainer was concerned that the change could cause weird crashes rather than failures with clear error messages in case PulseAudio is updated only partially and old and new files are mixed. The discussion is not finished, but my patch may not get merged, which is fine, I can also solve my problem by altering the installation directory in the OpenEmbedded packaging (I’m not that worried about partial updates).

I started working on transitioning from the Autotools build system to Meson in the PulseAudio recipe.

This post was originally written on 2020-02-05, and first made available to my Patreon supporters. Speaking of Patreon – I’m using crowdfunding in an attempt to make it financially sustainable to continue my volunteer work as a PulseAudio maintainer. If you’d like to help, check out my Patreon page (or Liberapay).

December 2019


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. I changed module-switch-on-connect so that it again ignores HDMI by default.

Earlier in the autumn I started reviewing Arun Raghavan’s patch set for automatically switching device channel configuration when playing a passthrough stream that requires it (Dolby TrueHD and DTS-HD Master Audio), now I have finished the review. There were many things to fix, but the needed fixes are mostly small.

I fixed a buffer overflow bug in volume string parsing (the exact location of the bug was pointed out by Patricia Aas, so doing the fix was trivial).

I found and applied an old patch from Peter Meerwald that fixes a bug in the public API headers. PA_CLAMP_VOLUME is a macro that makes sure that a volume value is within the valid range. It’s part of the public API, but applications couldn’t use it, because it used other macros that were private. The necessary macros are now all public.

I made a small fix to the pa_stream_connect_playback() and pa_stream_connect_record() function documentation. The functions can be given a device name if the application wants to use a particular device, but if the name is omitted, the documentation said earlier that the default sink or source is used. I changed it to make clear that omitting the device name lets the server choose the device. The old wording caused some confusion, because if the server chooses the device, it doesn’t always pick the default sink or source. For example, module-stream-restore may pick a device that has been saved for the application, which often isn’t the global default device.

The preparations for the 14.0 release have started. If everything goes smoothly, we might be able to release it in January.


I continued updating the ALSA recipes to 1.2.1. Updating alsa-lib needed some extra work due to a change in the configure script that didn’t work on OpenEmbedded, and figuring out the reason for the failure took some time. Also, the UCM and topology configuration files were moved to separate repositories which required me to add new recipes for those files. I will still need to update the alsa-utils and alsa-plugins recipes, and then I’ll need to do some additional testing for the updates.

This post was originally written on 2020-01-02, and first made available to my Patreon supporters. Speaking of Patreon – I’m using crowdfunding in an attempt to make it financially sustainable to continue my volunteer work as a PulseAudio maintainer. If you’d like to help, check out my Patreon page (or Liberapay).

November 2019

The PulseAudio maintainers (me, Arun Raghavan and Georg Chini) started to have fortnightly patch prioritization meetings. As a result, the patches that are waiting for review are now ordered by priority, which helps us to focus on the important stuff, and the list is public, so it makes easier to answer questions like “when is my patch going to be reviewed”. The list can be seen here: https://www.freedesktop.org/wiki/Software/PulseAudio/PatchStatus/

It was reported that the pulseaudio man page contained outdated information about running the daemon with real-time scheduling. I improved the documentation.

I revieved a bunch of small patches:

  • Timo Gurr made it possible to disable the installation of shell scripts.
  • Rolf Eike Beer made patch that changes how temporary runtime file paths are constructed. The patch uses the “runstatedir” build variable instead of “localstatedir”, but the new variable is not universally supported, and the patch didn’t provide a fallback, so the patch was not merged at this time.
  • David Heidelberg made a couple of cleanups to the Meson build system.
  • Wim Taymans added an “xauthority” argument to the X11 modules, which is required on some systems to be able to authenticate to the X11 server.
  • Arun Raghavan changed the GitLab CI configuration so that updating the CI container image is easier.

I also did some light review on Hui Wang’s stream routing patches (Georg Chini did the main in-depth review). These patches improve the routing behaviour in multiple situations. So far it has been so that if the user moves an application stream once, module-stream-restore remembers that choice forever and it’s not possible to return the application back to default routing. Now if the user moves a stream to the current default sink, the stream switches back to default routing. Another change is that streams now move automatically when the default sink changes, which is probably the biggest improvement of the patch set.

I finished updating PulseAudio in OpenEmbedded to version 13.0, and I started updating the ALSA recipes to 1.2.1.

This post was originally written on 2019-12-10, and first made available to my Patreon supporters. Speaking of Patreon – I’m using crowdfunding in an attempt to make it financially sustainable to continue my volunteer work as a PulseAudio maintainer. If you’d like to help, check out my Patreon page (or Liberapay).

October 2019

Last month most of my time went into responding to messages on the mailing list and bug tracker. Other than that, I did the following things:

I applied an old patch of mine that made PulseAudio recognize an ALSA jack element called “Speaker”. It was required for PulseAudio to recognize that there’s a speaker output on some sound cards. The patch had been buried in the review queue, and now the user whose bug report originally prompted me to write the patch reminded that the bug was still not fixed after updating PulseAudio.

I reviewed a couple of patches:

  • Christophe Rodriguez fixed module-rtp-send’s “inhibit_auto_suspend” option handling. One of the possible values for the option is “only_with_non_monitor_sources”, which is intended to stop sending audio to the network when using a monitor source and nothing is playing to the monitored sink. That didn’t work, however, due to one inverted check, which is now fixed.
  • Rickie Schroeder fixed a bug in the “pulseaudio-start-x11” script that is usually run when starting a graphical login session. PulseAudio 13.0 added a KDE version check to determine whether module-device-manager should be loaded (it’s not needed with newer KDE versions), but that check didn’t work in all setups. Now the check is more reliable.

On OpenEmbedded front I worked on updating the PulseAudio recipe to 13.0. It still needs some more testing before I can submit the patch.

Some months ago the Raspberry Pi that I used for running a Quassel server (which I use to connect to IRC) managed to break its file system, and I decided to rent a virtual server in the hope that it would be more reliable (this was not the first time the Raspberry Pi broke its file system). The cheap virtual server turned out to constantly have huge latencies for some reason, however, and one morning last month it looked like the big latencies made Quassel unable to keep the connection open to the IRC network. I decided to set up the Raspberry Pi again (this time a RPi 2 rather than the original RPi 1, hopefully the newer model is more reliable).

This post was originally written on 2019-11-05, and first made available to my Patreon supporters. Speaking of Patreon – I’m using crowdfunding in an attempt to make it financially sustainable to continue my volunteer work as a PulseAudio maintainer. If you’d like to help, check out my Patreon page (or Liberapay).

September 2019

PulseAudio 13.0 is out now! Read the release notes to find out what’s new.

Last month I did some work on pavucontrol. I finished the patch that changes the stream device selection button to a drop-down list (that’s still pending review). I also fixed the logic of when pavucontrol shows advanced options for sinks and sources. It used to hide the compressed format configuration for all sinks that don’t have any ports. That didn’t cause problems before, because it used to be so that all sinks that support compressed formats happened to also have ports, but now the null sink also supports compressed format configuration, and the null sink doesn’t have ports. While working on that, I also noticed that the sink and source widgets didn’t handle updates from the server correctly. Every update caused pavucontrol to send a “set port” command to the server using the currently selected port, which often isn’t that harmful, but it could cause trouble in some cases, because PulseAudio needs to know when a port has been selected by the user and when it has been selected as part of some automatic policy. That’s now fixed.

module-null-sink can be configured at load time to support compressed formats, but it didn’t support changing the supported format list at runtime. All the “hard” parts of that were actually already implemented, the only thing missing was a flag that marks the sink as one that supports runtime format configuration. I added that flag, and together with the pavucontrol fixes it’s now possible to use pavucontrol (or pactl) to configure the null sink formats at runtime. That’s not particularly exciting for regular users, though; the compressed format support in the null sink is useful mainly for debugging and testing.

The Modules wiki page was missing documentation for module-null-sink’s “formats” argument, I fixed that shortcoming.

Flat volumes have always been a controversial feature in PulseAudio. If you’re not familiar with the feature, here’s a short summary: 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 application 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. I’ve been meaning for a long time to submit a patch to disable the feature by default also in upstream, and now that’s finally done.

Here’s a list of patches I reviewed last month:

  • Samuel Thibault submitted a patch by Svante Signell to make the webrtc-audio-processing library build on GNU/Hurd and GNU/kFreeBSD.
  • Jan Alexander Steffens fixed the module-tunnel-sink build when using Meson, and he also fixed the way how X11 compiler flags are passed to module-tunnel-source.
  • Rasmus Thomsen fixed the Meson build system to work with musl, which requires linking to an external libintl library.
  • Arun Raghavan updated an older merge request that implements automatic channel reconfiguration for passthrough streams. It’s needed for high bitrate passthrough streams (Dolby TrueHD and DTS-HD Master Audio). Support for those high bitrate passthrough streams were advertised in the 13.0 release notes, but it turned out that it didn’t actually work yet, because we forgot that these patches were needed for it to work. I reviewed the first three patches (and requested several changes), I will continue with the rest soon.
  • Peter Levine made a fix for a build failure with Clang 9.0.0. The new Clang version apparently doesn’t like implicit casts from void pointers to unsigned longs.

This post was originally written on 2019-10-10, and first made available to my Patreon supporters. Speaking of Patreon – I’m using crowdfunding in an attempt to make it financially sustainable to continue my volunteer work as a PulseAudio maintainer. If you’d like to help, check out my Patreon page (or Liberapay).

August 2019

There’s not much to report from August, other things distracted me from PulseAudio work. I just replied some issues and emails, and did the following:

  • I improved bootstrap.sh so that when installing from PulseAudio from source, the build system won’t overwrite files in /etc by default (configuration files now get installed under /usr/local/etc instead).
  • I reviewed a patch from Carlos Garnacho to not load settings from the X11 root window except when using SSH with X11 forwarding. This avoids unnecessary use of X11 under Wayland.
  • I started improving pavucontrol’s stream routing UI. Currently selecting the device of a stream is implemented as a button that opens a list of devices as radio buttons in a popup. There was a report that the popup opens in a completely wrong place (different screen) in some environments (the reason seems to have something to do with the popup being implemented using a deprecated API). A button plus popup doesn’t make much sense anyway, a drop-down list is the usual way to implement this kind of selection. Replacing a button with a drop-down list sounds like a simple change, and in some ways it is, but I’m not that experienced with the Gtk API, so this is still a work in progress.

This post was originally written on 2019-09-05, and first made available to my Patreon supporters. Speaking of Patreon – I’m using crowdfunding in an attempt to make it financially sustainable to continue my volunteer work as a PulseAudio maintainer. If you’d like to help, check out my Patreon page (or Liberapay).