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

PulseAudio

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.

OpenEmbedded

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

PulseAudio

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.

OpenEmbedded

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

PulseAudio

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.

OpenEmbedded

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

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.

OpenEmbedded

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