[alsa-devel] Zoom R16

Jason Mancine jason at mancine.net
Fri Nov 22 19:12:17 CET 2013


Hello, I am looking for some assistance in getting the Zoom R16 working for
playback.  Please let me know if this is the right forum for this...

The device is recognized, but I just can't figure out which interface is
which, and how to configure them in quirks-table.h.   Any help would be
appreciated.


To start, the output of lsusb -v for the device is this:
 ---

Bus 001 Device 010: ID 1686:00dd ZOOM Corporation
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass         0
  bDeviceProtocol       255
  bMaxPacketSize0        64
  idVendor           0x1686 ZOOM Corporation
  idProduct          0x00dd
  bcdDevice            0.02
  iManufacturer           1
  iProduct                2 R16
  iSerial                 3 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength          259
    bNumInterfaces          4
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              480mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      1
      bInterfaceProtocol      0
      iInterface              0
      ** UNRECOGNIZED:  0b 24 01 00 01 35 00 03 01 02 03
      ** UNRECOGNIZED:  0c 24 02 05 01 01 00 02 03 00 00 00
      ** UNRECOGNIZED:  09 24 03 08 01 03 00 05 00
      ** UNRECOGNIZED:  0c 24 02 09 01 02 00 08 00 00 00 00
      ** UNRECOGNIZED:  09 24 03 0c 01 01 00 09 00
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      2
      bInterfaceProtocol      0
      iInterface              0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      2
      bInterfaceProtocol      0
      iInterface              0
      ** UNRECOGNIZED:  07 24 01 05 01 01 00
      ** UNRECOGNIZED:  14 24 02 01 02 04 18 04 44 ac 00 80 bb 00 88 58 01
00 77 01
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            9
          Transfer Type            Isochronous
          Synch Type               Adaptive
          Usage Type               Data
        wMaxPacketSize     0x006c  1x 108 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      2
      bInterfaceProtocol      0
      iInterface              0
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      2
      bInterfaceProtocol      0
      iInterface              0
      ** UNRECOGNIZED:  07 24 01 0c 01 01 00
      ** UNRECOGNIZED:  14 24 02 01 08 04 18 04 44 ac 00 80 bb 00 88 58 01
00 77 01
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x84  EP 4 IN
        bmAttributes           13
          Transfer Type            Isochronous
          Synch Type               Synchronous
          Usage Type               Data
        wMaxPacketSize     0x01a0  1x 416 bytes
        bInterval               1
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      3
      bInterfaceProtocol      0
      iInterface              0
      ** UNRECOGNIZED:  07 24 01 00 01 41 00
      ** UNRECOGNIZED:  06 24 02 01 01 00
      ** UNRECOGNIZED:  06 24 02 02 02 00
      ** UNRECOGNIZED:  09 24 03 01 03 01 02 01 00
      ** UNRECOGNIZED:  09 24 03 02 04 01 01 01 00
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0040  1x 64 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass         0
  bDeviceProtocol       255
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0001
  Self Powered

---

This is the quirk that Clemens provided on the linux-audio mail list...the
device is recognized, but no capture/playback:

{
        /* ZOOM R16 in USB 2.0 mode */
        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[]) {
                        {
                                .ifnum = 0,
                                .type = QUIRK_IGNORE_INTERFACE
                        },
                        {
                                .ifnum = 1,
                                .type = QUIRK_AUDIO_STANDARD_INTERFACE
                        },
                        {
                                .ifnum = 2,
                                .type = QUIRK_AUDIO_STANDARD_INTERFACE
                        },
                        {
                                .ifnum = 3,
                                .type = QUIRK_MIDI_STANDARD_INTERFACE
                        },
                        {
                                .ifnum = .1
                        },
                }
        }
},





Now....despite there being no #4 interface in lsusb, if I append the
following to the above quirk I get all 8 channels of capture working.  I am
more confused than ever. :)

      {
            .ifnum = 4,
            .type = QUIRK_AUDIO_FIXED_ENDPOINT,
            .data = & (const struct audioformat) {
               .formats = SNDRV_PCM_FMTBIT_S24_LE,
               .channels = 8,
               .iface = 1,
               .altsetting = 1,
               .altset_idx = 1,
               .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE,
                .endpoint = 0x84,
                .ep_attr = 13,
                .rates = SNDRV_PCM_RATE_44100 |
                    SNDRV_PCM_RATE_48000 |
                    SNDRV_PCM_RATE_88200 |
                  SNDRV_PCM_RATE_96000,
               .rate_min = 44100,
               .rate_max = 96000,
               .nr_rates = 4,
               .rate_table = (unsigned int[]) {
                     44100, 48000, 88200, 96000
               }
            }
         },


Obviously, this is not the correct solution and I can't make playback work
by adding additional .ifnums.    I am quite certain that interface 1 is
capture and 2 is playback but if I add the same info to either of those
sections my entire system freezes when I plug in the device.

Thanks,
jason


More information about the Alsa-devel mailing list