Hi, I'm currently building a DIY High speed usb audio device and have come across some stange behaviour. When an audio stream starts (play), 12 urbs get sent (very close together) to the main isosynchronous end point, 4 urbs get sent to the sync endpoint. This is causing a buffer overrun on my DIY usb audio device. Using wireshark I've captured the traffic against my DIY device and also against an E-MU 0404 USB ( which handles the condition fine ) and the linux side behaves the same regardless of which device is used.
I enabled debugging on the usb audio module ( Kernel 3.16.7 ) and get the following output (E-MU 0404): ---cut--- [ 227.363434] [2474] usb 9-1.1.4: Setting params for ep #1 (type 0, 12 urbs), ret=0 [ 227.363440] [2474] usb 9-1.1.4: Setting params for ep #81 (type 1, 4 urbs), ret=0 ---cut--- As you can see 12 urbs are allocated for endpoint 1, and 4 urbs for the sync (81). The wireshark output looks like this, after which it calms down and sends urbs at the correct interval. No. Time Source Destination Protocol Length Info 13 15.783563000 host 6.0 USB 64 SET INTERFACE Request 14 15.783971000 6.0 host USB 64 SET INTERFACE Response 15 15.784085000 host 6.0 USB 65 URB_CONTROL out 16 15.784603000 6.0 host USB 64 URB_CONTROL out 17 15.784707000 host 6.1 USB 344 URB_ISOCHRONOUS out 18 15.784720000 host 6.1 USB 344 URB_ISOCHRONOUS out 19 15.784725000 host 6.1 USB 344 URB_ISOCHRONOUS out 20 15.784729000 host 6.1 USB 344 URB_ISOCHRONOUS out 21 15.784735000 host 6.1 USB 344 URB_ISOCHRONOUS out 22 15.784740000 host 6.1 USB 344 URB_ISOCHRONOUS out 23 15.784744000 host 6.1 USB 344 URB_ISOCHRONOUS out 24 15.784749000 host 6.1 USB 344 URB_ISOCHRONOUS out 25 15.784754000 host 6.1 USB 344 URB_ISOCHRONOUS out 26 15.784758000 host 6.1 USB 344 URB_ISOCHRONOUS out 27 15.784763000 host 6.1 USB 350 URB_ISOCHRONOUS out 28 15.784767000 host 6.1 USB 344 URB_ISOCHRONOUS out 29 15.784775000 host 6.1 USB 80 URB_ISOCHRONOUS in 30 15.784780000 host 6.1 USB 80 URB_ISOCHRONOUS in 31 15.784785000 host 6.1 USB 80 URB_ISOCHRONOUS in 32 15.784789000 host 6.1 USB 80 URB_ISOCHRONOUS in The payload on these urbs are all zero's. It seems to match up with the buffers allocated (setting params debug output above). You'll also notice that they are *very* close together. At this point it's not honouring the correct interval, but is honouring the correct packet size. It's almost like a buffer flush of some sort. So my question is: 1. Why does the driver do this? 2. Is there anything I can adjust in the USB descriptors to convince the driver NOT to do this with my DIY device. I've done a quick look through the driver code and I can't easily find where the logic is for where these 12 + 4 urbs are queued out.. As mentioned, it's only when a stream is initially started, such as right after a cold OS boot etc... Thanks, Phil.
------------------------------------------------------------------------------
_______________________________________________ Alsa-user mailing list Alsa-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/alsa-user