Fixing the SteelSeries Arctis 7 outputs on Ubuntu 18.04/PulseAudio 11

The SteelSeries Arctis 7 headset works out of the box on linux. Sort of. You get a mono input from the mic and a mono output from the cans.

Mono output? Yup. The reason for this is that the Arctis 7 features two virtual output devices, one mono and one stereo. The headset then mixes these two channels in the hardware according to a conveniently placed mixer knob going from 100% channel 0 (mono) to 100% channel 1 (stereo). When it is working you can have two entirely different streams going to each device and mix them on the go. While there is no reason you cannot use it to have a movie playing in one channel and an opera in the other, the idea is to direct chat and phone applications (discord, Skype, etc.) to use the mono channel while everything else (including games) goes to the stereo channel. This allows you to give audio preference to the in-game footsteps coming up from behind you or idle coop chit-chat. Alas, PulseAudio only recognises the first of these two devices.

The good news is somebody has pushed a fix to the Pulseaudio git repository. The bad news is that it didn’t make it into the 11.x releases of Pulseaudio which is what is included in the spring of 2018 batch of distro releases (e.g. Ubuntu 18.04, Fedora 28).

The patch is tagged 11.99.1 which means that it will in all probability be included in version 12.0. Looking back at Ubuntu LTS releases, however, none of them ever upgraded to a major new version of Pulseaudio during their lifetime. 14.04 stays on 4.0, 16.04 stays on 8.0. So it’s probably a fool’s errand sitting around waiting for 12.0 to arrive on my new bionic install. Time for some DIY.

I could download the recent 11.99.1 release from github and learn to compile it myself… or I can download the files added by the patch and add them to my install manually. Given everything that can go wrong with tearing out a vital piece of plumbing and stuffing in your own handiwork instead, I’ll go for the second option.

Seeing as Github does not allow for shallow cloning a single commit I have taken the liberty of creating a repository with only the relevant files and the relevant license (LGPL). Feel free to download them from there or grab them off of the merge page, if your prefer.

What the patch does is inform Pulseaudio of the particularities of the Arctis 7 layout so that when it encounters the headset, it can use it correctly, i.e. as two output devices rather than the single, first one encountered, it recognizes out of the box. It also includes a handy udev rule so that the hardware is matched to the layout description.

The first part consists of three files, each defining one device:

  • One for the mono input: steelseries-arctis-input.conf
  • One for mono output: steelseries-arctis-output-mono.conf
  • And one for stereo output: steelseries-arctis-output-stereo.conf

These should simply be copied into the directory /usr/share/pulseaudio/alsa-mixer/paths. The only change made to them is that I have changed the description-key line in the steelseries-arctis-output-mono.conf. The analog-output-headphones-mono key is added in a source file in the patch and seeing as I am not recompiling PulseAudio, this particular key would not be in the version of the dictionary on my system. Therefore I have changed it to a more generic (and existing in older versions of PA) analog-output-mono. This is only a description and so it does not affect functionality.

The second part is adding a single file, steelseries-arctis-usb-audio.conf, to the directory /usr/share/pulseaudio/alsa-mixer/profile-sets. This is the crucial part that lets PulseAudio know that the single piece of hardware that’s been detected is really three devices (the ones defined in the three files above), one input, two output.

Finally, I need the udev rule in place. This links adding the hardware to PulseAudio identifying it as the profile I just added. It would appear that udev is instructed to set an environment variable with the name of the profile upon discovery. The variable is then picked up by PulseAudio. Here I can add the single line to the end of the 90-pulseaudio.rules file in /lib/udev/rules.d (around line 102, right after the “dell-dock” line, the same as the patch does) or create my own additional rules file, say 90-pulseaudio-steelseries-arctis.rules. The included file warns “# do not edit this file, it will be overwritten on update” but as I discovered looking at LTS releases, no update is likely forthcoming. So I would say it’s a matter of personal preference. [Note of June 16th: Turns out Ubuntu does rebuild PA and issue updates even if no major updates are out and those updates obviously overwrite 90-pulseaudio.rules. So the standalone rule should be preferred]

SUBSYSTEM=="sound", ACTION=="change", KERNEL=="card*", SUBSYSTEMS=="usb", ATTRS{idVendor}=="1038", ATTRS{idProduct}=="1260", ENV{PULSE_PROFILE_SET}="steelseries-arctis-usb-audio.conf"

Rebooting and I find that the device is now correctly identified as two output devices. First order of business: Set discord to always go in the mono output so that I can tune coop team mates in or out depending on their noise level and my mood.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.