ALSA: usb-audio: Add support for Zoom R16/24 capture and midi interfaces
authorPanu Matilainen <pmatilai@laiskiainen.org>
Sun, 30 Nov 2014 16:45:40 +0000 (18:45 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 1 Dec 2014 16:38:03 +0000 (17:38 +0100)
This makes the midi interface and capture work out of the box with
R16 (and presumably R24 too but untested). Playback stream would also
seem to function fine except for one caveat: no sound is produced,
so it is disabled for now. Mixer descriptors are garbage and will
require further quirks to enable functionality, also disabled here.

Signed-off-by: Panu Matilainen <pmatilai@laiskiainen.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/quirks-table.h
sound/usb/quirks.c

index 013cba8ee8a650e1bb3c92047637433b4e4f0fca..73d2ba47cc3192586e1051c54c2a3d5eff6acdd7 100644 (file)
@@ -3173,6 +3173,46 @@ YAMAHA_DEVICE(0x7010, "UB99"),
        }
 },
 
+{
+       /*
+        * ZOOM R16/24 in audio interface mode.
+        * Mixer descriptors are garbage, further quirks will be needed
+        * to make any of it functional, thus disabled for now.
+        * Playback stream appears to start and run fine but no sound
+        * is produced, so also disabled for now.
+        */
+       USB_DEVICE(0x1686, 0x00dd),
+       .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+               .ifnum = QUIRK_ANY_INTERFACE,
+               .type = QUIRK_COMPOSITE,
+               .data = (const struct snd_usb_audio_quirk[]) {
+                       {
+                               /* Mixer */
+                               .ifnum = 0,
+                               .type = QUIRK_IGNORE_INTERFACE,
+                       },
+                       {
+                               /* Playback  */
+                               .ifnum = 1,
+                               .type = QUIRK_IGNORE_INTERFACE,
+                       },
+                       {
+                               /* Capture */
+                               .ifnum = 2,
+                               .type = QUIRK_AUDIO_STANDARD_INTERFACE,
+                       },
+                       {
+                               /* Midi */
+                               .ifnum = 3,
+                               .type = QUIRK_MIDI_STANDARD_INTERFACE
+                       },
+                       {
+                               .ifnum = -1
+                       },
+               }
+       }
+},
+
 {
        /*
         * Some USB MIDI devices don't have an audio control interface,
index e45cc3af9b9c859fa6187de6fc5ca32795880f98..4dbfb3d18ee2356c95c30974c8a778570ef4da47 100644 (file)
@@ -1207,6 +1207,14 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
                        break;
                }
        }
+
+       /* Zoom R16/24 needs a tiny delay here, otherwise requests like
+        * get/set frequency return as failed despite actually succeeding.
+        */
+       if ((le16_to_cpu(dev->descriptor.idVendor) == 0x1686) &&
+           (le16_to_cpu(dev->descriptor.idProduct) == 0x00dd) &&
+           (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
+               mdelay(1);
 }
 
 /*