[LAU] re Zoom R16

jmancine jason at mancine.net
Mon Mar 10 14:25:52 UTC 2014


A few things:

First, many of my original posts to the mailing list did not actually end up
on the mailing list!  You can go back through here to see the full history
of how we got to where we are:

http://linux-audio.4202.n7.nabble.com/re-Zoom-R16-td87487.html


Second, we should all be aware that kernels 3.11 and greater have support
for the "ANY INTERFACE" and "AUTODETECT" tags.   For the R16, this means
that this quirk (yes that is the whole thing!) will work for capture only.

/* ZOOM R16 in USB 2.0 mode */
{
        .match_flags = USB_DEVICE_ID_MATCH_VENDOR |
                       USB_DEVICE_ID_MATCH_INT_CLASS,
        .idVendor = 0x1686,
        .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
        .driver_info = (unsigned long) &(const struct snd_usb_audio_quirk) {
                .ifnum = QUIRK_ANY_INTERFACE,
                .type = QUIRK_AUTODETECT
        }
},

If you are after capture only, and are on a kernel >3.11, this is your
quirk.


Third, the problem with playback is (I believe) narrowed down to ALSA not
being able to set set the bit rate.  Until we are able to figure out how to
make ALSA see the R16 as 24-bit integer, everything else is irrelevant.


millerthegorilla wrote
> Notice that I have put a bunch of sample formats so that the correct one
> can be selected.

The R16 does not support 8, 16 or 32... it is only 24 (in interface mode). 
The problem is that none of the 24 bit formats I am aware of WORK.  ALSA has
some kind of problem with the R16 when it comes to initializig it, and
always sets it to 32 bit (or technically 24 in 32) which it does not
support.  It is 24 bit INTEGER meaning exactly 24 bits.  Again, until we can
find a .format that will set the R16 to 24 bits, it will not support
playback.


Fourth, on the subject of  ifnums and ifaces:


millerthegorilla wrote
> Hmm, I have been compiling my kernel for a couple of days now and no joy.
> I have the information from lsusb -vv, cat /proc/asound/R16/stream0 / 1,
> etc but I'm a little confused about the terminology of quirks-table.h.
> What is the difference between .ifnum and .iface?    is the first (ifnum)
> a
> reference to the usb bus?

.ifnum is the hardware interface number, it can be derived from the variable
"bInterfaceNumber" in the output of lsusb -v

Here is the problem....  there is NO interface #4 despite the quirk working
as such.  When I initially was testing quirks for the R16, I just added that
(and #5) as a placeholders on top of the standard audio quirk!  I was as
surprised as everyone when #4 enabled capture.  It is a working hack, but it
is accidental.   To my knowledge, these are the correct interface numbers
and functions:

The correct interfaces are:

0 - device (hardware comm)
1 - PLAYBACK 
2 - CAPTURE
3 - MIDI

If you move your .ifnum=4 section into the .ifnum=2 section (and delete #4)
it will work, and will be in the right place for further testing. 

Similarly, .iface correlates with the iInterface variable that you can also
view in the output of lsusb.  The correct setting is zero, like this:

 .iface = 0,'

I noticed you also changed .attributes to USB_ENDPOINT_XFER_ISOC... any
reason for that?


And finally, here is the THEORETICAL quirk that *should* work for playback,
capture and MIDI.   By all accounts, this *should* work... BUT IT DOES NOT.   
My best guess is that this is indeed the right quirk, but that the .formats
setting of 24 bits is not accepted and ALSA defaults to 32 (or 24 packed in
32).  

{ 
        /* 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,  /*PLAYBACK*/ 
                                .type = QUIRK_AUDIO_FIXED_ENDPOINT, 
                                .data = & (const struct audioformat) { 
                                .formats = SNDRV_PCM_FMTBIT_S24_LE, 
                                .channels = 2, 
                                .iface = 0, 
                                .altsetting = 1, 
                                 altset_idx = 1, 
                                .attributes = UAC_EP_CS_ATTR_SAMPLE_RATE, 
                                .endpoint = 0x03, 
                                .ep_attr = 9,               
                                .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 
                                 } 
                              } 
                           }, 

                        { 
                               .ifnum = 2,  /*CAPTURE*/ 
                              .type = QUIRK_AUDIO_FIXED_ENDPOINT, 
                              .data = & (const struct audioformat) { 
                                 .formats = SNDRV_PCM_FMTBIT_S24_LE, 
                                 .channels = 8, 
                                 .iface = 0, 
                                 .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 
                                 } 
                              } 
                           }, 

                        { 
                                .ifnum = 3, 
                                .type = QUIRK_MIDI_STANDARD_INTERFACE 
                        }, 


                        { 
                                .ifnum = .1 
                        }, 
             	

                        } 

       	 } 

}, 










--
View this message in context: http://linux-audio.4202.n7.nabble.com/re-Zoom-R16-tp87487p89773.html
Sent from the linux-audio-user mailing list archive at Nabble.com.


More information about the Linux-audio-user mailing list