[alsa-devel] Zoom R16/24 playback slient

Ricard Wanderlof ricard.wanderlof at axis.com
Wed Oct 7 09:53:33 CEST 2015


On Tue, 6 Oct 2015, Panu Matilainen wrote:

> > Having dived into this, and looking carefully at the data produced by the
> > Windows driver, it appears that what's happening is that the driver stuffs
> > a 32-bit length specifier at the start of each isochronous data packet.
> >
> > So, for instance, instead of transferring the sample data
> >
> > 00 12 bf 34  00 98 87 76  00 3c 24 35  00 86 75 64 .. .. (40 bytes)
> >
> > the Zoom driver would send:
> >
> > 28 00 00 00  00 12 bf 34  00 98 87 76  00 3c 24 35  00 86 75 64 ... (44 bytes)
> >
> > At the moment I'm considering adding some additional code to
> > sound/usb/pcm.c: prepare_playback_urb(), governed by a new boolean in
> > struct snd_usb_substream in a similar vain as txfr_quirk in that structure
> > (which in turn is set in some quirk function detecting the R16).
> >
> > What needs to be done is to add 4 bytes to the length, and adjust the
> > offset accordingly, in urb->iso_frame_desc[i], and then add the additional
> > length descriptor for each packet when copying out the data further down
> > in the same function.
> >
> > It would be nice to add a foo_quirk() function but since the actual
> > copying of the data needs to be changed, it's not really possible to do
> > efficiently with a separate routine.
> 
> Sounds like a plan to me, but keep in mind I'm just another newbie in 
> all this. Anyway, I wouldn't worry about cleanest possible way at this 
> point, just do a quick-n-dirty hack to see if adding the length is 
> enough to get it working and worry about the rest later. I'll try to 
> have a look at it too as soon as time permits, but meanwhile if more 
> experienced people have better suggestions...

I tried this out yesterday, with good results. I only had time for limited 
testing, but I managed to playback a couple of 44.1 kHz files (didn't test 
anything else) without any hitches. So this is definitely the right way to 
go. Actually it was a real joy after the R16 has been silent for a week. 
:-)

Apart from prepare_playback_urb(), I had to make a similar change to 
endpoint.c:prepare_outound_urb() which outputs silence before there is 
data to send.

Patch to follow, but there are a couple of things I need to straighten out 
first:

- Since we're stuffing more data in the outgoing packets, some allowance 
  must be made for this when allocating the urb->transfer_buffer. I've got 
  to review that code so that we don't spill over the end of the allocated 
  buffer in some case.
- The best way to trigger the quirk. I'm thinking something along the
  lines of introducing a QUIRK_AUDIO_ZOOM_INTERFACE which enables the
  aforementioned bit in order to enable the quirk in 
  prepare_playback_urb() and prepare_output_urb(), and then calls
  create_standard_audio_quirk() (just as QUIRK_AUDIO_STANDARD_INTERFACE
  would have resulted in). Then it's clear in quirks-table.h that 
  something special is going on. (Currently I've added the quirk 
  initialization directly in create_standard_audio_quirk(), but it seems 
  wrong to hide it away in there).

And I also need to test some more.

Also, in the dump from the Windows driver I saw some form of sample rate 
control message being sent that Linux doesn't send, on the other hand, 
that was sent as part of starting capture, which already has been proven 
to work, so it might simply not be needed.

/Ricard
-- 
Ricard Wolf Wanderlöf                           ricardw(at)axis.com
Axis Communications AB, Lund, Sweden            www.axis.com
Phone +46 46 272 2016                           Fax +46 46 13 61 30


More information about the Alsa-devel mailing list