Re: TC-Helicon Blender

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



--- Begin Message ---

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 ---

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux