September 2020

It was reported that Creative X-Fi cards have the center speaker muted by default, because PulseAudio doesn’t understand the “Center/LFE” mixer element. PulseAudio already supports the “CLFE” mixer element, which is semantically the same, so this was easy to fix simply by copying the CLFE sections in the mixer configuration files.

PulseAudio has always been able to start automatically when some client tries to connect to it, and there’s a configuration option called “autospawn” that can be used to enable or disable this. Nowadays PulseAudio is usually managed by systemd, which has its own mechanism for doing the same thing, and the autospawn option doesn’t affect systemd. This has been causing some confusion, so I added a note about this to the pulse-client.conf man page.

It was reported that when jackd is started and PulseAudio creates the JACK sink and source, those virtual devices aren’t automatically made the default, so the user has to manually do that. The JACK sink and source have very low priorities, and I tried to fix the problem by making the priorities very high instead, but that doesn’t help if the user has earlier manually set the default devices to the sound card that is taken over by jackd. A better fix would be more complicated. Oh well, at least the situation is a bit better, since with my patch things work as expected when the default devices haven’t been manually set.

I submitted a patch to set the LC_NUMERIC locale variable to “C” in PulseAudio, meaning that number formatting is not localized. This was done so that floating point numbers are parsed consistently regardless of the user’s locale settings. Parsing the beamforming parameters in module-echo-cancel didn’t work for some users, because if the locale used a comma for the decimal point, that made the parameter string ambiguous, since commas are also used for separating parameters from each other.

A pthread_mutex_unlock() failure was observed on FreeBSD, which is unnecessarily difficult to debug, because PulseAudio doesn’t log the reason for the failure. I made a patch that improves the logging.

I continued working on the messaging API documentation. While doing that I noticed that there are still a couple of things in the API that I want to change, which I will have to sort out with Georg.

Last month’s reviews:

  • Kevin Degelin updated the freedesktop runtime in the pavucontrol flatpak and contributed some other improvements as well.
  • Alper Nebi Yasak tried fixing duplication in UCM sink descriptions, but I rejected that, because the duplication in the description seemed to happen due to some deeper problem that needs to be fixed.
  • I finished the review of Nazar Mokrynskyi’s old patch to improve mono recording on Behringer UMC22. It had mostly been reviewed already, but the latest changes hadn’t been checked yet.
  • Libin Yang made a fix for nonsensical port switches (unplugging HDMI would change output from speakers to headphones). Usually PulseAudio creates only one sink per sound card, but new machines that use UCM sometimes create multiple sinks and module-switch-on-port-available doesn’t yet handle that well. Libin’s original patch had some issues and discussion is ongoing about how to fix the bug without introducing new ones.
  • Christopher Snowhill submitted improvements for module-virtual-surround-sink. Alexander Patrakov reviewed the difficult signal processing parts, I reviewed the higher-level changes in the module.
  • Assigning the new “availability groups” to ports is currently badly broken for non-UCM cards, which Jaroslav Kysela tried to fix. I rejected the fix, because Jaroslav’s fix would have introduced new configuration that seemed unnecessary. (At the time of writing I have submitted a different fix, but apparently it doesn’t work well either.) Jaroslav’s merge request contained also two smaller fixes for parsing port types and setting a correct type for the headset mic port, which were merged.

This post was originally written on 2020-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 2020


Some months ago I made a fix for the HyperX Cloud Orbit S USB headset, which didn’t work with PulseAudio, because PulseAudio generates the internal card name using the device serial number and in this case the serial number was so long that the card name exceeded the maximum allowed length. I wrote some udev rules to make the card name shorter, but since I didn’t have the headset myself, I didn’t want to submit a merge request before the bug reporter had confirmed that the udev rules work. I now received the confirmation, so I submitted the fix (patch 1, patch 2).

It was reported that an atomic operation test fails to build on Hurd. I fixed that.

I added a target to Meson for building the Doxygen documentation (patch 1, patch 2).

I submitted the availability group fixes that I worked on in July.

I fixed the memory leaks that I had introduced in my fixups for the message API merge request. It’s been a long journey to get the message API finished, but now it’s finally ready to merged as soon as 14.0 gets released. I still have some documentation improvements in progress, though, but I’ll submit those separately.

Last month’s reviews:

  • Hubenchang submitted fixes for some compiler warnings. I reviewed the initial submission and requested changes, I haven’t yet reviewed the updated patches.
  • Rosen Penev fixed a failure building against an OpenSSL version that is built without deprecated APIs.
  • Rosen Penev also fixed some printf format specifiers that were incorrect for 32-bit builds.
  • Arun Raghavan wrote configuration for the Audigy line of PCI sound cards by Creative Technologies. PulseAudio 13.0 broke the simultaneous output and input support on these cards, the new configuration makes the cards work properly again.
  • I continued reviewing Jaroslav Kysela’s patch to skip sound cards whose UCM configuration says that they should be skipped. The review process is still ongoing.
  • Tom Yan fixed a code ordering issue in the startup code: the exit-idle-time configuration option value wasn’t taken into consideration during the startup.
  • Kai-Heng Feng added configuration for HP Thunderbolt Dock 120W G2 and its speakerphone module (the dock and the module appear as separate sound cards). The sound cards work to some extent also without custom configuration, but the configuration improves the device descriptions and adds a hint that the speakerphone is intended for phone streams. Due to the ongoing code freeze, the patches will be merged after 14.0 has been released.


I continued working on swithing the pulseaudio recipe from Autotools to Meson. Apart from final testing, I completed the work. At the time of writing, I’ve done the testing too; I will submit the patches once the freeze in OpenEmbedded ends.

This post was originally written on 2020-09-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).

July 2020


While reviewing a null pointer dereferencing fix in the UCM volume probing code, I noticed another null pointer bug in the same function and fixed it.

The protocol version was recently incremented, but it was incremented only in the Autotools build system, the change was missing from the Meson build system. I fixed that.

I finished reviewing Georg Chini’s message API patches and did some fixups myself based on the review. My fixups contained a memory leak bug that I still haven’t fixed. That’s the last remaining issue before the feature can be merged. I also worked on better documentation for the message API, that work is not yet finished.

I made some fixes for the availability group logic, but I didn’t publish those yet, because I have other cleanups for the availability group feature in progress and I plan to put all those changes in one merge request.

Device port availability changes didn’t emit all necessary notifications to clients, causing pavucontrol and other GUI applictions to show outdated port status. I fixed that.

Last month’s reviews:

  • Eero Nurkkala fixed a crash when a UCM device doesn’t have a mixer device configured for it.
  • Yousuf Philips added “Settings” to the list of categories that pavucontrol is in.
  • UCM configuration can indicate that a sound card should be ignored, because another sound card’s configuration contains the configuration also for this card. Jaroslav Kysela implemented the sound card skipping feature for PulseAudio, but it needs more work and is not yet merged.
  • Tomasz Kontusz added support for the Astro A50 gaming headset.
  • Zhaochengyi fixed a crash when reading or writing fails in the connection between PulseAudio and the application.
  • Arun Raghavan got rid of compiler warnings caused by deprecated GLib macro and function calls, and by potential unaligned variable access to a packed struct.


I upgraded the alsa-lib recipe from to

I fixed PulseAudio’s ARM assembly code that used the r7 register, which doesn’t work when using the Thumb instruction set with stack pointers enabled, because Thumb reserves r7 for the stack pointer. I also replaced an older workaround for that problem in the pulseaudio recipe using the patch I wrote.

As part of the effort to convert the pulseaudio recipe to use Meson instead of Autotools, I investigated whether it’s necessary to explicitly disable ARM Neon code if the target machine doesn’t support Neon. Currently the recipe does that disabling, but PulseAudio’s Meson build system doesn’t have an option to do that. The disabling was apparently added to work around a bug in the Neon detection part in PulseAudio’s Autoconf code, but that was a long time ago and the bug has been fixed. I found out that it’s still possible to set up the configuration flags so that the build will fail if the explicit Neon disabling is removed, but it has to be done in a way that is probably unlikely to happen in practice. Furthermore, the same problem doesn’t occur when using Meson, so it appears that I won’t have to replicate the Neon disabling part with Meson.

This post was originally written on 2020-08-06, 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).

June 2020

In last month’s report I mentioned a rejected patch that wanted to change the semantics of the –check option from checking for a running server process to attempting connection. Even though the patch got rejected, something good came out of it: I improved the documentation of the option to make its limitations clear.

I fixed a bug in our “fallback mapping” code. The term fallback mapping means alsa device configuration that is used when none of the normal device configurations work. We have three fallback configurations for input, and when we resort to the fallback configurations, only one should be used. However, certain hardware showed that PulseAudio actually uses all fallbacks that work, in this case resulting in two input devices, even though in reality there’s only one hardware device. This is now fixed, only one fallback is used.

When PulseAudio uses ALSA UCM to configure the hardware, PulseAudio runs a “disable sequence” and an “enable sequence” when switching ports on a device. I made a patch that runs the disable sequence also when suspending a device, after a concern was raised that if the disable sequence isn’t run always when not using a device, it may result in some amplifiers or other hardware components left active, consuming power unnecessarily. I’m not sure if that’s a real issue, since closing the device should be enough for the kernel to know to turn off all components, and even if it’s a real issue, then the issue has existed forever (also when not using UCM). Nevertheless, the feature wasn’t hard to implement so I wrote a patch… but somehow my patch breaks mute handling. I haven’t yet investigated the bug (the patch hasn’t been merged yet, so the bug doesn’t affect users).

It was reported that the “avoid-resampling” option in daemon.conf didn’t have any effect on module-null-sink. The avoid-resampling option means that sinks reconfigure their sample rate to whatever applications are using. The null sink should support this, but the reconfiguration just wasn’t happening. I fixed this bug.

I worked on improving the documentation and doing some other cleanup of the new availability group stuff that Jaroslav Kysela contributed recently. This is still work in progress.

Last month’s reviews:

  • Klaus Frank proposed a patch for adding configuration for xrdp source and sink to This was rejected, because the xrdp modules are not part of upstream PulseAudio. As an alternative solution we discussed adding support for installing configuration snippets to a directory, where the xrdp package could install its configuration. Let’s see if Klaus will implement it at some point.
  • Hugo Osvaldo Barrera removed an obsolete Travis CI configuration file.
  • Leon Kowarschick added a style class to the pavucontrol window, which allows users or themes to use Gtk CSS rules that target pavucontrol specifically.
  • I continued reviewing Georg Chini’s messaging API patches.
  • Libin Yang fixed a crash when building PulseAudio with the DEBUG flag.
  • Yousuf Philips tagged pavucontrol with some Xfce specific categories to make pavucontrol appear in Xfce’s settings dialog.
  • Jaroslav Kysela implemented the API changes that are needed for making GNOME’s “What did you plug in?” dialog work with UCM devices.
  • Libin Yang fixed the order of event notifications when plugging in headphones, if that also causes an automatic default sink change. The wrong event order confused GNOME’s sound settings.

This post was originally written on 2020-07-09, 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).

May 2020

This May was a very unproductive month for me, but I did something at least:

When the user selects a device for output in the GNOME sound settings application, the application moves current streams to the selected device, and in order to have consistent routing also for streams not currently playing, it overwrites all stream routing settings in PulseAudio’s stream-restore database. That’s pretty ugly and sometimes causes problems, but it was necessary in order to make the routing take effect immediately when selecting a new output device. PulseAudio doesn’t automatically move streams when changing the default sink. Or it didn’t in the past. In the upcoming 14.0 release streams will be automatically moved, so the GNOME sound settings application won’t need to do any stream moving and it doesn’t need to overwrite the stream-restore database. There’s still a problem: the database modifications done earlier will still have effect, and the effects can be pretty bad: for example, it was reported that after upgrading to the latest release candidate, GNOME’s audio test played to the wrong device. I made a heavy-handed fix: when upgrading to PulseAudio 14.0, all old per-stream routing settings will be forgotten. We can’t distinguish between valid per-stream routing settings and invalid settings that were done by the GNOME sound settings, so we had to decide between keeping the invalid settings or forgetting valid settings. Forgetting valid settings seemed like the less bad option. (Systems that don’t use GNOME can build PulseAudio without the “forget old settings” feature, so this is not forced on everyone.)

I also fixed a few compiler warnings in the RAOP sink, and clarified the threaded mainloop API documentation after discussing with someone who had misunderstood the locking rules.

I reviewed the following patches last month:

  • Simon Pilkington implemented the XDG base directory specification for loading the ALSA path configuration files. This will allow users to customize the path configuration without editing files under /usr/share. The patch only applies to the path configuration files, not to the closely related profile set files, but Simon plans to implement the same also for the profile set files.
  • Felix Dörre made a patch that changes PulseAudio’s –check option so that instead of checking whether a pulseaudio process is running, a connection attempt is done. I rejected the patch, because changing option semantics is risky. People may be depending on the old documented behaviour (although in this case it’s possible that people would actually prefer a connection check in most cases, but there’s no way to know for sure).
  • Rafał Mikrut made a patch that changes how the Meson build system figures out the PulseAudio version number. When building PulseAudio from a git checkout, the version number comes from git tags, and Rafał’s checkout apparently was missing the tags and the build failed. I rejected the patch, because it didn’t make sense to me to allow invalid version numbers.

This post was originally written on 2020-06-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).

April 2020

A user complained about unclear information in the module-null-sink documentation about what compressed formats it supports. Since the list of supported formats is needed in multiple places in command line and configuration file documentation, I created the SupportedAudioFormats wiki page that lists all supported formats, both PCM and compressed, and then I went through the documentation and added links to that page where appropriate.

My reviews in April:

  • Mattias Jernberg added hardware volume control support for the SteelSeries Arctis 7 USB headset. The patch will be merged after the freeze.
  • Jaroslav Kysela fixed a bug in UCM port activation: the UCM device enable sequence was not run when the UCM configuration didn’t specify any hardware volume control.
  • Georg Chini fixed a bug in module-stream-restore: the module saves the preferred device of streams in a database, but that was not being restored if the preferred device happened not to exist at the stream creation time, and the lack of a preferred device was also propagated back to the database, causing PulseAudio to completely forget the device that the user had previously chosen for the stream.
  • Arnaud Ferraris submitted a patch for modifying the logic in module-switch-on-port-available regarding when (not) to switch card profiles. I had to reject that, because the change would probably have had unwanted effects for other users. I proposed an alternative solution to the problem he’s facing on the PinePhone, and he said he’d work on it.
  • Stefan Bruens made module-raop-sink work in environments that have firewalls that allow incoming UDP packets only after the host has sent a UDP packet first.
  • I reviewed one more patch from Georg Chini’s messaging API patches.
  • In the last monthly report I mentioned that PulseAudio’s client API should provide some more information in order to make GNOME’s “What did you plug in?” dialog work on new laptops that use ALSA UCM for setting up the mixer. Jaroslav Kysela implemented that API and I made the first review pass. There were things to improve, and I haven’t yet reviewed the latest version of the patches.

This post was originally written on 2020-05-12, 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).

March 2020


There are several people working on getting new laptops working using the SOF (Sound Open Firmware) kernel driver and ALSA’s UCM configuration system. The UCM code in PulseAudio isn’t completely mature yet, and there have been several issues to work through to get the laptops working. One issue is that the “What did you plug in?” dialog in GNOME doesn’t work with UCM, because the port names in PulseAudio are different. (The dialog is used to select between headphones, headset or microphone when the hardware doesn’t provide information about which of those was plugged in.) One option would be to try to converting the port names that the UCM code generates to the old port names that GNOME is assuming PulseAudio to use, but the old port names aren’t really ideal either. The GNOME code also pokes at the ALSA mixer, because PulseAudio doesn’t provide enough information, which would be nice to fix. I discussed the topic and came up with a proposal for making more information available through the PulseAudio client API. Jaroslav Kysela from ALSA offered to implement the proposal.

It was pointed out that the documentation for module-switch-on-connect and module-switch-on-port-available was lacking. I improved the documentation.

I revisited an old bug report about S/PDIF devices appearing in PulseAudio despite the sound card not having any S/PDIF outputs or inputs. I fixed the problem by adding the sound card in question to a S/PDIF blacklist in alsa-lib.

Some users have reported getting memfd related errors spammed to the system log when using PulseEffects. The root cause is still unknown, but I submitted a patch for logging the error only once.

Some USB headsets (and also a Sennheiser DAC) have separate sinks for voice audio and everything else. PulseAudio currently assigns the same priority to both, and it’s seemingly random which one gets to be the default sink. I submitted a patch for reducing the voice sink priority.

The UCM code logged messages about falling back to default channel count as errors. I lowered the log level.

I noticed that the Meson build system made libpulsecore depend on libpulse. Neither library is supposed to depend on the other, I fixed this issue.

Last month’s patch reviews:

  • Patrick McLean submitted configuration for the Sennheiser GSX 1000 USB DAC. There were things to fix, I haven’t yet reviewed the latest iteration.
  • Khem Raj fixed a problem with GCC 10 in PulseAudio’s NEON assembly code.
  • PulseAudio’s CI system uses some external templates, which changed and broke PulseAudio’s CI system. Arun Raghavan adapted our CI system to the changes.
  • I haven’t had time to review Georg Chini’s messaging API patches for a long time, now I got one more patch reviewed.


I finished updating the ALSA recipes to version 1.2.2. I didn’t submit the patches yet, because OpenEmbedded was preparing for a release and a freeze was ongoing.

I continued converting the PulseAudio recipe to use Meson instead of Autotools. The recipe had some old stuff in the recipe that I didn’t quite understand but that looked like it could be relevant for the build system, and I spent some time digging up the origin of that stuff. At least the OE_LT_RPATH_ALLOW variable seemed to be useless cruft that can be removed. The recipe also explicitly disables NEON optimizations if the target CPU doesn’t support NEON, but the Meson build system doesn’t support doing that. It looks like the explicit disabling shouldn’t be necessary any more even with Autotools, the build system should auto-detect NEON support, but I will have to verify that.

A patch was submitted to the openembedded-core mailing list that fixes a PulseAudio compilation problem with the Thumb instruction set. The fix isn’t the best possible, and I’d like to fix the problem in upstream, so I tried to reproduce the problem. I didn’t yet manage to get a test setup working, I’ll continue working on this.

This post was originally written on 2020-04-12, 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).

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: and here’s the link for 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).