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

IMPORTANT: If you dualboot with Windows and run the Steelseries Engine software you should exercise caution when considering updating the headset firmware. Steelseries Engine version 3.2.18 introduced a new configuration of the headset that initially invalidated this fix (Thanks to Steve Brueggeman for help in making it work again). The Steelseries Engine Windows package itself is ‘safe’ to update – it’s only the headset firmware updates that may endanger the device’s working on linux.

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.

UPDATE SEPTEMBER 2018: A headset firmware update packaged into the Steelseries Engine package version 3.12.8 changed the idProduct attribute of the device from 1260 to 12ad. If you have applied this firmware update you should use the line below instead. Note that 3.12.8 is the version number of the Windows software package; the firmware itself follows a different versioning scheme. Check the About dialog in Steelseries Engine to see whether you may be affected.

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

You can check your device and it’s product id by running lsusb and looking for devices from Steelseries.

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

  1. Thanks for this. This is one of the most detailed post aside from the post of the one who made the fix in pulseaudio.

    I actually haven’t bought, Arctis 7 yet. But I need to know if once you’ve done this fix, does the bass sound good? Or is there a way to boost the bass from Ubuntu 17.10?

    Thanks.

    1. Thank you and apologies for the lateness of the reply – was on holiday πŸ™‚ I try to put some effort and thoroughness into these because I would be horrified to discover that my ‘fix’ only worked until you rebooted or something like that.

      As for bass… I don’t think I’m the right one to ask. I haven’t played around with the sound settings, or even the preconfigured profiles in Windows. It’s… sufficient for my tastes, is all I can say, I guess.

  2. Dude, you just made my favorite advice forever list. My use case is NOT gaming.. my use case is, I talk with my someone overseas for about 6 hours every day, but… I also would like to take advantage of my big screen TV to watch a movie.. but, she complains with bluetooth, webcam mic, etc it’s too noisy… Arctis-7 with the fixes you posted PERFECT…. I can watch a movie and dial in when she is saying something important, and dial the mono down when we’re just chill’n OMG, I cannot thank you enough for posting this. I almost NEVER go to windows, and considering how much we chat, I’d rather not go there just to experience the ability to have both a stereo & mono sound channel…

    1. You’re welcome and I’m glad it helped you and your significant other πŸ™‚ I’m also impressed with being able to wear the Arctis for a stretch of 6 hours because it’s comfortable but not that comfortable!

  3. Please help.. I updated the firmware and now Linux/pulse/alsa only sees the mono/chat output/mic again… No stereo output.. I’ve hit the semi-secret (supposedly) factory reset button.. in my opinion, the only thing the (supposedly) factory reset button on the left ear piece does is unpair the headset.. I suspect the problem is that now, after the firmware update, there is a whole lot more sub-devices listed for this usb device. I tried to figure this out, and I’ve seen a comment on an original post for this patch that the simple config for the stereo may (again, I am out of my element here), rely on mono and stereo being PCM devices…. my lsusb is now showing several PCM devices for the steelseries device… I’ve put in a request to the steelseries support asking how to ACTUALLY FORCE A DEVICE RESET.. I just want my stereo+mono back… it was working before..

    1. Hi Steve, That sounds awful. I have noticed a lot of Steelseries updates being pushed recently on Windows but I have as yet not noticed anything wrong on linux though it has been… a week-ish since I used it there. I’ll definitely have a look at what’s what when I get a chance. I must admit though that’s it’s already bugging me that I have accepted some firmware updates, knowing full well, that they always carry a risk of screwing up things on linux (looking at you, Razer).

    2. Hi Steve, Have you figured anything out yet? I think you may be on to something with your theory because the Steelseries Engine blog entry for update 3.2.18 (http://techblog.steelseries.com/2018/08/07/new-in-3.12.8.html) mention some control features for the Arctis 7 which would probably (IAMNE or I am No Engineer) be implemented by adding a lot of virtual devices that control other devices.

      Also see my response to dwodhghemonhswes down below. I am unaffected due to being a lazy updater.

      As the post mentions the way the fix is implemented is by having udev sniff for a device with the following attributes:

      ATTRS{idVendor}==”1038″, ATTRS{idProduct}==”1260″

      Could you run lsusb again and check whether there still (among all the other devices) is such a device present? In lsusb’s output that would come out as

      Bus 001 Device 004: ID 1038:1260 SteelSeries ApS

      My hope is that the “core functionality” device is still there, working as before, only it’s now say 1261 rather than 1260. But it’s a wild guess.

    3. I have a pretty fresh install of ubuntu 18.04.
      pulseaudio version: 11.1
      Steelseries Engine 3: 3.12.10
      Transmitter Version: 1.19.0.0
      Headset Version: 1.19.0.0
      Software Version: 2.1.1.0

      Followed the blog post directions, used ‘sudo cp’ to copy the 3 files to /usr/share/pulseaudio/alsa-mixer/paths and used the ‘sudo cp 90-pulseaudio-steelseries-arctis.rules /lib/udev/rules.d/’ method for udev. Restarted my machine and everything works as expected.

  4. Unfortunately, same for me as Steve is seeing. I even went back over this guide with a fine-toothed comb to make sure I did everything right. I wouldn’t have updated, had I any inkling this could happen — I wouldn’t even dual boot between Linux and Windows, except for some of the games which I must say I bought this headset primarily to use while playing, just aren’t Linux-able, regardless of Wine/PoL. So sad. But I thank you deeply for your efforts on this front!

    1. I have booted into Windows and back into linux many times and basically, the headset still works for me as it has since I implemented the solution. However, I have been sluggish to do implement the updates that Steelseries Engine – the Steelsereies Windows software update manager and configuration tool – has been asking me to for a while.

      From the about page I can see that I’m running version 3.2.18 of the Windows software with transmitter version 1.19 and headset software version 2.0 (and headset version 0.0 though that may simply be because I’m currently not running the Windows software at the same time that the headset is on out of an abundance of caution)

      I may or may probably not have allowed for the headset firmware to update along with the 3.2.18 update. The reason for this theory is that 3.2.18 (http://techblog.steelseries.com/2018/08/07/new-in-3.12.8.html) comes with a specific firmware update targeting the Arctis 7 and came out on August 7 and Steve first wrote just four days later.

      The weird thing is that reading the Steelseries blog it doesn’t sound like they completely reenginered it, just added some minor, non-audio features. Which actually gives me hope that maybe it’s just a slightly altered string variable or some such that spoils things for you guys. I’m no engineer but I’ll try to see if I figure something out.

  5. Ya, sorry for no reply, I was concentrating on another thread, and thank you mads for e-mailing me. I feel a little dumb after figuring it out…. πŸ™ for what ever reason, the firmware update changed the USB ID, so you’ll need to edit the /lib/udev/rules.d/90-pulseaudio-steelseries-arctis.rules to match what lsusb is showing.
    My lsusb | fgrep -i steel shows
    Bus 002 Device 012: ID 1038:12ad SteelSeries ApS

    So I edited my
    /lib/udev/rules.d/90-pulseaudio-steelseries-arctis.rules
    SUBSYSTEM==”sound”, ACTION==”change”, KERNEL==”card*”, SUBSYSTEMS==”usb”, ATTRS{idVendor}==”1038″, ATTRS{idProduct}==”12ad”, ENV{PULSE_PROFILE_SET}=”steelseries-arctis-usb-audio.conf”

    I’m pretty sure it’s only the ATTRS(idProduct)==”12ad that needed to be changed.

  6. This solution got the headset working for me. Thanks for figuring out how to do this and then publishing the fix!!

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.