--- Begin Message ---
- To: alsa-devel@xxxxxxxxxxxxxxxx
- Subject: Re: TC-Helicon Blender
- From: Florian Hänel <florian.haenel@echtzeit.solutions>
- Date: Fri, 10 Mar 2023 14:43:25 +0100
- In-reply-to: <87fsafiy9t.wl-tiwai@suse.de>
- References: <948733d5-cbea-2c9f-95c7-6e95fdcacaba@echtzeit.solutions> <87fsafiy9t.wl-tiwai@suse.de>
- User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.7.1
On 08.03.23 06:54, Takashi Iwai wrote:
On Mon, 13 Feb 2023 08:57:19 +0100,
Florian Hänel wrote:
I have this USB device called TC-Helicon Blender which provides 12
input streams, 8 output streams (6/4 stereo plugs), in addition to
some midi interface and internal playback and record channel.
Bus 005 Device 016: ID 1220:8fe1 TC Electronic Blender
If I power the device on while connected to a windows machine with its
driver installed, then plug it into my linux machine, it appears to
work correctly:
arecord -D front:CARD=Blender -r48000 -fS32_LE -c 12 blender.wav -d 20
Recording WAVE 'blender.wav' : Signed 32 bit Little Endian, Rate 48000
Hz, Channels 12
46080044 blender.wav
However if I have it on my linux machine while powering it on, I only
get timeouts and no samples from arecord:
arecord -D front:CARD=Blender -r48000 -fS32_LE -c 12 blender.wav -d 20
Recording WAVE 'blender.wav' : Signed 32 bit Little Endian, Rate 48000
Hz, Channels 12
arecord: pcm_read:2221: read error: Input/output error
44 blender.wav
So the device didn't give any data.
The maintainer of the userland utility that makes a device of the same
manufacturer work on osx and linux has provided this experimental patch.
Could you provide some feedback if this approach would be welcomed into
alsa?
As I understand it it requires sending some vendor configuration packets.
- Florian
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index 3ecd1ba7fd4b..36ea5aabd41d 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -1390,6 +1390,25 @@ static int snd_usb_motu_m_series_boot_quirk(struct usb_device *dev)
return 0;
}
+static int snd_usb_goxlr_boot_quirk(struct usb_device *dev)
+{
+ /* Load the 48000Hz rate into a buffer */
+ u8 srate[4] = {0x80, 0xbb, 0x00, 0x00};
+ u8 temp[24];
+
+ /* Clear the Vendor buffer, we don't need to do anything with this data */
+ snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev,0), 0x00,
+ USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
+ 0, 0, &temp, 0x0018);
+
+ /* Send the packet to activate the audio at 48000Hz */
+ snd_usb_ctl_msg(dev, usb_sndctrlpipe(dev, 0), 0x01,
+ USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE,
+ 0x0100, 0x2900, &srate, 0x0004);
+
+ return 0;
+}
+
/*
* Setup quirks
*/
@@ -1617,6 +1636,10 @@ int snd_usb_apply_boot_quirk(struct usb_device *dev,
get_iface_desc(intf->altsetting)->bInterfaceNumber < 3)
return snd_usb_motu_microbookii_boot_quirk(dev);
break;
+
+ case USB_ID(0x1220, 0x8fe0): /* TC-Helicon GoXLR */
+ case USB_ID(0x1220, 0x8fe4): /* TC-Helicon GoXLR Mini */
+ return snd_usb_goxlr_boot_quirk(dev);
}
return 0;
--- End Message ---