October 2017

Last month I continued reviewing Georg Chini’s patches for improving the infrastructure for adding new module specific client APIs.

The webrtc backend of module-echo-cancel had locale-dependent parsing code for the beamforming parameters, which meant that parsing failed on those locales that use a comma as the decimal mark. I made the parsing locale-independent.

I found out that the alsa-lib configuration for Intel HDMI LPE contained a definition for the “front” device, which PulseAudio assumes to be analog output. That’s not strictly speaking a valid assumption, but without that assumption it becomes ambiguous whether the sound card has one or two devices if both “front” and “hdmi” exist. I made a patch for alsa-lib that removes the “front” device. With that alsa-lib patch and the earlier pulseaudio patches (of which I made a new version, still pending review) for autodetecting the HDMI device index the Intel HDMI LPE driver reportedly is finally working properly with PulseAudio!

When connecting a new bluetooth headset, PulseAudio used to activate the HSP profile by default. I made a patch that changes the profile priorities so that A2DP has higher priority. A2DP is a better default, because it has better audio quality. HSP is needed with phone applications, but we already have automatic profile switching when a phone application appears.

I updated some outdated volume documentation for libpulse, and also added some documentation about the difference between the sound card clock and the system clock.

I silenced one Coverity warning by adding a couple of assertions in the code. The warning was a false positive, but figuring that out was quite difficult, so I also added comments why the assertions are valid.

It was reported that having module-remap-source on top of a monitor source caused high latency. That was weird, because the processing that module-remap-source does shouldn’t cause any extra latency. I learned that monitor sources cause extra latency if they monitor a sink that supports rewinding. The amount of extra latency changes depending on the latency of streams connected to the monitored sink, but module-remap-source and module-virtual-source didn’t take those changes into account, often causing more latency than necessary. The alsa sink also was overly conservative when setting its “max rewind” value, which made the problem worse. I made fixes for both issues.

This post was originally written on 2017-11-03, 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.

September 2017

Last month PulseAudio 11.0 got released, hooray! The new stuff is documented in the release notes, and I’ve probably linked to the draft version before in these reports, but here’s the link again (this time not a draft): https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/11.0/

Quickly after the release some bad regressions were reported, boo! Some filter sinks were crashing in the new version if the flat volumes feature was enabled. Also, the ALSA mixer handling was broken for sound cards that don’t have any configuration in alsa-lib. I made a fix for both of these issues.

Also, the new bluetooth MTU autodetection feature was known to cause regressions, but it was enabled by default anyway in 11.0. That was deemed a bad idea after all, and the feature was disabled in 11.1. Arun also fixed a crash in the MTU autodetection code.

Another change in 11.1 was that I removed a priority boost for devices that report their form factor as “internal”. The 11.0 release notes advertised that bluetooth and USB sound cards are now prioritized over internal sound cards by default, but actually that was true only for bluetooth devices. The change had not been properly tested for USB, and the internal sound card priority boost still made internal sound cards have higher priority than USB sound cards (at least in cases where the USB sound card doesn’t provide any form factor information).

That’s enough about the releases. Now on to other stuff.

It was reported that on a certain sound card PulseAudio didn’t detect the speaker output. That was because ALSA didn’t indicate the existence of that port except by providing a jack detection mixer control named “Speaker Jack”, and PulseAudio didn’t have configuration for that. I made a patch for that.

When bluetooth headsets advertise their capabilities, they can choose from two different identifiers for the HSP Headset role, which was news to me. PulseAudio used to recognize only one of the identifiers, so to PulseAudio it seemed like the headset didn’t support the HSP profile at all, and naturally that prevented users from using that profile. Now both HSP HS identifiers are recognized.

The equalizer GUI “qpaeq” that is shipped with PulseAudio used to be licensed under AGPL, unlike all other PulseAudio code. Back in December I sent emails to all qpaeq contributors asking for a permission to relicense qpaeq under LGPL. It took some time to receive replies from all contributors, and then it took even longer time for me to take the next step, but now the qpaeq license has finally been changed to LGPL.

I improved the initial ALSA card profile selection. When a new sound card appears (either during PulseAudio startup or when hotplugging a card), PulseAudio will try to choose the best available profile for the card. In case of ALSA cards, the profile availability is based on what has been plugged in (assuming that ALSA provides that information). Previously the algorithm for setting the profile availability was very simplistic: only profiles whose all ports have been indicated as unplugged by ALSA were marked as unavailable. If for example a profile has a sink and a source, and only the sink is unavailable, PulseAudio used to mark the profile as available, which meant that PulseAudio could by default activate a profile whose output was not functional. Now all profiles (apart from some rare exceptions – the algorithm is still not perfect) that don’t have all of their devices available are marked as unavailable.

Victor Gaydov published a very long blog post that explains very comprehensively the PulseAudio design. I have read it all, and I can recommend you to have a look as well. The official PulseAudio documentation is severely lacking in providing an overview of all the core concepts, so this was a very welcome post.

This post was originally written on 2017-10-04, 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.

August 2017

A crash was reported when using an echo canceller together with a jack sink. The root cause was a recently introduced bug in how module-echo-cancel configures its latency range. Fixed.

It turned out that on some sound cards the digital input doesn’t work unless the “PCM Capture Source” ALSA mixer control is set to “IEC958 In”, which PulseAudio didn’t do. Now it does.

While explaining to a user how to use module-remap-sink, I found the existing documentation of the module to be lacking, so I improved it a bit.

I got introduced to the Steelseries Arctis headsets, which have the unusual feature that they have two separate playback volume controls: one for voice audio (mono) and another for all other audio (stereo). Gamers are supposed to appreciate that. In ALSA the headset appears as two devices, but the default configuration in PulseAudio only used the mono device, which was not nice. Johan Heikkilä wrote configuration that makes both devices show up in PulseAudio, but I claim some credit for the configuration too.

PulseAudio used to set the process umask to 022, meaning that the state information that PulseAudio writes on disk was readable by all users. Well, not really, because the files are written in a location that is not accessible to other users, but the files themselves had their permissions set up that way. This was noticed by a user, because at his workplace there’s a strict policy that files must never be readable by other users. The umask that PulseAudio was changed to 077 (i.e. the files are not readable by other users any more).

It was reported that loading, unloading and then loading again a module in the module configuration file didn’t work. Doing that may sound silly, but there’s actually a use case. PulseAudio loads the configuration from the home directory if it exists there, and if it doesn’t, then PulseAudio loads the configuration from /etc. It’s an either/or situation, but it would be useful to put some per-user modifications in the home directory and otherwise use the default system configuration in /etc. It’s possible to reference another file from the configuration, so the bug reporter referenced the system configuration from the per-user configuration and then unloaded module-stream-restore and reloaded it with different parameters. This didn’t work, because the “unload-module” command didn’t unload the module immediately, so the module was still loaded when trying to load it for the second time, and that caused an error. I fixed this simply by modifying the “unload-module” command so that it unloads the module immediately.

The new default device selection code that I wrote recently turned out to have a bug: it could pick a device that hadn’t yet been fully initialized. Fixed.

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

July 2017

This month saw the release of PulseAudio 10.99.1, i.e. the first release candidate (RC) of 11.0. I’m not sure if there will be another RC. The Intel HDMI LPE fix was not included in the first RC, and it’s not clear if it will be included in the release at all. There still hasn’t been much testing, but one user had problems with the patch, so it doesn’t seem safe to apply it (unfortunately the user with the problem hasn’t responded to requests for more information). I will be getting some HDMI hardware myself soon. I don’t know what HDMI driver that computer will have, but if it doesn’t have the LPE driver, at least I can check that the patch doesn’t break non-LPE systems.

There are several bluetooth related changes in the upcoming release, and I updated the bluetooth wiki page to reflect those changes. Georg Chini wrote the updated oFono section. I also added a section for listing what features have been added in which PulseAudio version.

Georg Chini is working on a new mechanisms for applications to send messages to and receive notifications from modules. Currently it’s quite cumbersome to add module-specific functionality to the client API, and the new messaging API should help with that. I discussed the new API with Georg in some length.

As I noted in last month’s report, the latency reporting functionality in the “simple API” got an improvement, but there was still some weird behaviour. I managed to track down the remaining bug and fixed it. It turned out to not affect only the simple API, but also the normal streaming API. Basically all recording applications have been getting bad latency information if the recording stream has a different number of channels than the recording source. When recording, the latency information is often not very important (except in a recording studio setting, but those use cases usually use Jack anyway instead of PulseAudio), maybe that’s why we haven’t got much complaints about the bad latency reports.

I fixed a bunch of D-Bus message object leaks related to the dbus_connection_send_with_reply_and_block() function that turned out to be prone to such leaks.

The default equalizer sink description contains the description of the master sink, but the equalizer description was not updated when moving to another master sink. I fixed that.

It was reported that if the current card profile is “off”, because none of the outputs are plugged in, the profile doesn’t get automatically changed when plugging in headphones. I made a fix for that.

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

June 2017

I finished the Intel HDMI LPE jack detection fix. Since I don’t have any HDMI audio hardware (except Raspberry Pi, but that has too unusual HDMI implementation to count in this case), the patch isn’t tested on real hardware yet. If you have Intel HDMI LPE hardware and you’d like to test, let me know. Also, if you have some other HDMI audio hardware that currently has working jack detection, it would be good to test that the jack detection still works, because the patches affect all HDMI devices.

I made a patch that changes how the default sink and source settings are internally stored by PulseAudio. The previous mechanism didn’t allow the default sink to point to a non-existent sink, which meant that if the user configured a USB device as the default sink, and then unplugged the device, the default sink setting was lost. My patch (not yet applied) removes that limitation, so it should finally be possible to set USB devices as default and have PulseAudio remember that choice.

The pa_simple_get_latency function in the “simple API” hasn’t been working correctly, the latency reports have been jumpy. Ted Ying sent a fix, which is now applied. The code still has some issues, but when I tried to fix them, the latency report behaviour got worse, so I didn’t apply my changes. I don’t fully understand why it’s working as well as it does without my changes, that’s something to figure out at a later time.

I made some improvements to the bluetooth documentation (added some troubleshooting tips and added links to bluetooth specification documents).

I finished fixing the MIPS build of webrtc-audio-processing. The PowerPC build turned out to be broken as well, and I fixed that too.

This post was originally written on 2017-07-04, 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.

May 2017

Release preparations have been going on. The first release candidate for 11.0 probably isn’t far away. There are two blocker bugs open, and neither seems particularly tricky to resolve.

The topic of translation workflow came up. A long time ago we used Transifex, but since it stopped providing good author information in the translation patches, we stopped using it, and since then we haven’t used any translation platform. Translation updates have been submitted as regular patches or plain .po files via the bug tracker or mailing list. There hasn’t been a lot of complaining about this, but translators would probably prefer to use a web platform. I looked into Zanata and Weblate, and Weblate seems like it meets our demands about crediting the translation authors properly, so hopefully we’ll try that out soon.

I fixed a bug in the new default device handling code I made earlier. The default device was not always updated properly when something was plugged in our out.

I started working on fixing the Intel LPE HDMI issues. I made a patch that should prevent PulseAudio from thinking that the HDMI device is an analog output, and fixing jack detection is in progress.

I started updating the alsa recipes in OpenEmbedded. That’s mostly finished, just build testing remains to be done.

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

April 2017

The current system of scheduling PulseAudio releases is to freeze the master branch three months after the last release. Those three months have passed, so the focus has again moved to the release preparations. There are release blocker bugs open, so a release candidate has not yet been published. The release notes draft is pretty complete already, so you can check out what will be in PulseAudio 11.0: https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/11.0/

I continued reviewing the big patch set from Georg Chini for improving module-loopback, and did other reviews too.

ALSA has a new driver for Intel HDMI LPE, and it doesn’t currently work with PulseAudio. The biggest issue is that trying to use the driver causes PulseAudio to be killed due to using too much CPU time in a realtime thread. It’s unclear what causes that, but there are some definite issues in PulseAudio that affect the new driver. One of those issues is that an analog profile is created for the card, even though it has no analog outputs. I made a fix for that.

The master sink handling was recently changed in module-ladspa-sink and module-virtual-surround-sink, and some bugs were introduced in the new code. I fixed those issues.

The volume control thing in the Budgie desktop environment sometimes does unwanted profile changes when unplugging headphones, and the sound configuration application in Gnome also is known to do that. Debugging this was annoyingly complicated, so I added some more logging about who’s responsible for profile changes.

I updated the libsndfile recipe in OpenEmbedded, and started to package webrtc-audio-processing, because someone wanted to use the webrtc echo canceller in PulseAudio on OpenEmbedded. The webrtc-audio-processing library fails to build on MIPS, I’m currently trying to fix that.

This post was originally written on 2017-05-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.