You are not logged in.

#1 2019-12-01 07:17:38

99lives
Member
Registered: 2015-09-28
Posts: 15

Sennheiser GSP 670 wireless headset mono only

I purchased a Sennheiser GSP 670 wireless gaming headset recently, and I cannot get stereo output to work on it. It connects via a 2.4ghz dongle, called the Sennheiser GSA 70.

This headset and dongle have some unique features. The headset has two volume knobs, and two audio channels. In Windows, the dongle shows up as two sound devices, a speaker called "GSA 70 Main Audio", and a headset called "GSA 70 Communication Audio".
The idea is that you can tell your voice chat software, like Discord, to output to the "Communication Audio" channel, and so you can control the volume from Discord with the secondary knob, independently from the "Main Audio" channel.

But with Linux/ALSA/PulseAudio, the headset and dongle show up as a single sound device, the "GSA 70", and is mono only.
Under linux, the GSA 70 shows up with eight profiles in PulseAudio, being each possible combination of "Multichannel", "Mono", and off, for both the output and input. You can see these profiles in the 'pacmd' output below.All these profiles are mono only, I have tested this.
In Windows, the "Communication Audio" device shows up as a headset, containing both headset output, and microphone input, and is mono only. It may be that linux is only using this device, and not the "Main Audio".

The headset can also be plugged in directly via USB, and then shows up as a GSP 670. All the above information applies to the headset as well when plugged in. It still has two audio devices in Windows, and is still mono only under linux. The names of the devices are just different.

I've included screenshots of how the dongle appears in Windows, and command outputs from linux.

Win10 screenshots: https://imgur.com/a/BjPQYWi

pacmd list-cards

    index: 3
        name: <alsa_card.usb-Sennheiser_Sennheiser_GSA_70-00>
        driver: <module-alsa-card.c>
        owner module: 9
        properties:
                alsa.card = "0"
                alsa.card_name = "Sennheiser GSA 70"
                alsa.long_card_name = "Sennheiser Sennheiser GSA 70 at usb-0000:29:00.3-4, full speed"
                alsa.driver_name = "snd_usb_audio"
                device.bus_path = "pci-0000:29:00.3-usb-0:4:1.0"
                sysfs.path = "/devices/pci0000:00/0000:00:07.1/0000:29:00.3/usb5/5-4/5-4:1.0/sound/card0"
                udev.id = "usb-Sennheiser_Sennheiser_GSA_70-00"
                device.bus = "usb"
                device.vendor.id = "1395"
                device.vendor.name = "Sennheiser Communications"
                device.product.id = "0089"
                device.product.name = "Sennheiser GSA 70"
                device.serial = "Sennheiser_Sennheiser_GSA_70"
                device.string = "0"
                device.description = "Sennheiser GSA 70"
                module-udev-detect.discovered = "1"
                device.icon_name = "audio-card-usb"
        profiles:
                input:mono-fallback: Mono Input (priority 1, available: unknown)
                input:multichannel-input: Multichannel Input (priority 1, available: unknown)
                output:mono-fallback: Mono Output (priority 100, available: unknown)
                output:mono-fallback+input:mono-fallback: Mono Output + Mono Input (priority 101, available: unknown)
                output:mono-fallback+input:multichannel-input: Mono Output + Multichannel Input (priority 101, available: unknown)
                output:multichannel-output: Multichannel Output (priority 100, available: unknown)
                output:multichannel-output+input:mono-fallback: Multichannel Output + Mono Input (priority 101, available: unknown)
                output:multichannel-output+input:multichannel-input: Multichannel Duplex (priority 101, available: unknown)
                off: Off (priority 0, available: unknown)
        active profile: <output:mono-fallback+input:mono-fallback>
        sinks:
                alsa_output.usb-Sennheiser_Sennheiser_GSA_70-00.mono-fallback/#0: Sennheiser GSA 70 Mono
        sources:
                alsa_output.usb-Sennheiser_Sennheiser_GSA_70-00.mono-fallback.monitor/#0: Monitor of Sennheiser GSA 70 Mono
                alsa_input.usb-Sennheiser_Sennheiser_GSA_70-00.mono-fallback/#1: Sennheiser GSA 70 Mono
        ports:
                analog-input: Analog Input (priority 10000, latency offset 0 usec, available: unknown)
                        properties:

                multichannel-input: Multichannel Input (priority 0, latency offset 0 usec, available: unknown)
                        properties:

                analog-output: Analog Output (priority 9900, latency offset 0 usec, available: unknown)
                        properties:

                multichannel-output: Multichannel Output (priority 0, latency offset 0 usec, available: unknown)

dmesg

[ 6103.447956] usb 5-4: new full-speed USB device number 4 using xhci_hcd
[ 6103.602665] usb 5-4: New USB device found, idVendor=1395, idProduct=0089, bcdDevice= 3.01
[ 6103.602668] usb 5-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[ 6103.602670] usb 5-4: Product: Sennheiser GSA 70
[ 6103.602672] usb 5-4: Manufacturer: Sennheiser
[ 6103.687239] input: Sennheiser Sennheiser GSA 70 as /devices/pci0000:00/0000:00:07.1/0000:29:00.3/usb5/5-4/5-4:1.5/0003:1395:0089.000C/input/input38
[ 6103.687380] input: Sennheiser Sennheiser GSA 70 Consumer Control as /devices/pci0000:00/0000:00:07.1/0000:29:00.3/usb5/5-4/5-4:1.5/0003:1395:0089.000C/input/input39
[ 6103.741641] hid-generic 0003:1395:0089.000C: input,hiddev2,hidraw6: USB HID v1.11 Device [Sennheiser Sennheiser GSA 70] on usb-0000:29:00.3-4/input5

I hope that this can be fixed with ALSA or PulseAudio configuration, but I'm worried that this can only be fixed with a custom USB driver.

Any help would be appreciated. Let me know if there is any more info I can supply to help.

Cheers

Offline

#2 Yesterday 01:04:15

Kealy
Member
Registered: Yesterday
Posts: 1

Re: Sennheiser GSP 670 wireless headset mono only

Yo,

I just received my GSP 670 yesterday and guess what! Same issue!
I spent 11 hours trying to figure out wtf is wrong with this headset, and I somehow managed to fix the issue. Somewhat.

Here's the thing: both outputs are seen by lsusb, so the issue is not at the USB driver layer.

    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol      0 
      iInterface              5 GSA 70 Communication Audio
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol      0 
      iInterface              6 GSA 70 Main Audio

My first thought when seeing this was "wait, what if ALSA only loads the first interface it finds (Communication Audio) and then ignores the rest?"
So I decided to look, for the first time in my life, into the linux kernel code; specifically into the snd_usb_audio driver, and after tinkering with it for endless hours, I got it to work.

My initial thoughts were spot-on. If the load order of the USB device's interfaces is reversed, stereo output and mono input (mic) both work like a charm.
I don't know why this solves the issue. My guess is that there is some other underlying problem that would best be solved by experienced kernel devs, rather than by a newbie like me.

To fix the issue, it's not necessary to recompile the entire kernel; it's enough to recompile the snd_usb_audio driver. Here's how:

mkdir ~/kernel
cd ~/kernel
curl -O https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.2.tar.xz
tar -xJf linux-5.4.2.tar.xz

cd linux-5.4.2
make mrproper
cp /usr/lib/modules/$(uname -r)/build/.config ./
cp /usr/lib/modules/$(uname -r)/build/Module.symvers ./

make EXTRAVERSION=-arch1-1 modules_prepare

# open and edit sound/usb/card.c
# refer to next code block

make M=sound/usb
xz -f sound/usb/snd-usb-audio.ko

# unplug the GSP670 USB dongle and any other USB audio device

sudo modprobe -r snd_usb_audio
sudo modprobe -r snd_usbmidi_lib

cp /usr/lib/modules/$(uname -r)/kernel/sound/usb/snd-usb-audio.ko.xz snd-usb-audio.ko.xz.backup
sudo cp -f sound/usb/snd-usb-audio.ko.xz /usr/lib/modules/$(uname -r)/kernel/sound/usb/

# plug the USB dongle and enjoy stereo sound and a working mic

sound/usb/card.c in function snd_usb_create_streams at the end of the switch case UAC_VERSION_1 block (should be line 270):

		if (rest_bytes < h1->bLength) {
			dev_err(&dev->dev, "invalid buffer length (v1)\n");
			return -EINVAL;
		}

		if (h1->bLength < sizeof(*h1) + h1->bInCollection) {
			dev_err(&dev->dev, "invalid UAC_HEADER (v1)\n");
			return -EINVAL;
		}

		// Sennheiser GSP 670: create streams in reverse order
		if (chip->usb_id == USB_ID(0x1395, 0x0089))
		{
			snd_usb_create_stream(chip, ctrlif, 4);
			snd_usb_create_stream(chip, ctrlif, 2);
			snd_usb_create_stream(chip, ctrlif, 1);
			return 0;
		}

		for (i = 0; i < h1->bInCollection; i++)
			snd_usb_create_stream(chip, ctrlif, h1->baInterfaceNr[i]);

		break;
	}

This isn't the best solution and definitely not the cleanest, but for a first attempt with 0 experience or knowledge of the linux kernel, I'd say it's not bad.
This whole procedure needs to be done all over again every time the kernel is updated.. At least doing this is a lot easier under archlinux than under ubuntu (I used that in a VM for my testing hmm)

I just hope someone better qualified will solve this issue properly and for good.

Cheers.

Offline

#3 Yesterday 02:11:52

99lives
Member
Registered: 2015-09-28
Posts: 15

Re: Sennheiser GSP 670 wireless headset mono only

I followed your instructions and it worked! That is seriously impressive Kealy, especially since that's your first time digging in to the kernel. Thank you so much.

I also have zero kernel development experience, but you've inspired me to look into how to create a kernel module (at least I think that's what will work) that can serve this purpose in the future. If I can manage it, I'll put it into the AUR and update this post.

Again, thank you so much for this!

Offline

Board footer

Powered by FluxBB