All of lore.kernel.org
 help / color / mirror / Atom feed
* Missing exactly 3 of 8 audio packets?
@ 2012-11-21 20:13 Daniel Griscom
  2012-11-22 21:01 ` Daniel Mack
  2012-11-22 21:32 ` Daniel Mack
  0 siblings, 2 replies; 19+ messages in thread
From: Daniel Griscom @ 2012-11-21 20:13 UTC (permalink / raw)
  To: Alsa Developer

On to the next problem we're having with our USB audio card. Recap: 
simple USB Audio Class embedded stereo audio card, running at 44.1kHz 
or 48kHz, using the 3.6.6 kernel and its associated ALSA modules to 
drive it, running on Jetway ND9D-2700, with an Atom D2700 and NM10 
chipset. Output of "sudo lsusb -v" for card is appended below.

Problem: we're experiencing strange hiccups in the delivery of audio 
from the motherboard to the card. At 48kHz, the motherboard should 
send a 6-frame packet to the card once per high-speed microframe 
(every 125us). This usually works, but sometimes there are two 
closely related failures:

1) Once in a while (every few seconds or minutes) a single packet 
will be missed

2) Once in a longer while (every few minutes or hours), the system 
will go into a continuing error condition where three of every eight 
packets are missed.

In both cases, "missed" means that ALSA consumes the output audio 
from my motherboard application, but never sends a packet to the 
audio card. No USB errors, no logged messages; it just disappears.


The second case has one very interesting symptom. The pattern of 
missed frames is amazingly rigid, and repeats the following pattern 
endlessly (each character is a 125us slot for a packet, "F" is a 
transmitted packet, "-" is a missing packet):

FFFF--F-

So, with eight microframes per millisecond where packets can be sent, 
the fifth, sixth and eighth packets are missed, and this repeats for 
at least a number of seconds. Very, very strange.

Using a Beagle 1200 I can see that there are no USB errors: the 
packet is just not sent. Audio continues unabated in the other 
direction. Timing always looks good, no other traffic on that USB 
port.


We've been chewing on this issue for a while. To me, it sounds like 
this could only happen in the ALSA code where the stream of audio is 
broken into individual USB packets. Unfortunately, I'm having a heck 
of a time navigating the ALSA source code, and frankly have gotten no 
traction at all.


Any thoughts on what this might be, or on what further tests we might do?


Thanks,
Dan



P.S. Here's the output of "sudo lsusb -v" for the device.


Bus 001 Device 005: ID 03eb:2311 Atmel Corp.
Device Descriptor:
   bLength                18
   bDescriptorType         1
   bcdUSB               2.00
   bDeviceClass            0 (Defined at Interface level)
   bDeviceSubClass         0
   bDeviceProtocol         0
   bMaxPacketSize0        64
   idVendor           0x03eb Atmel Corp.
   idProduct          0x2311
   bcdDevice           10.00
   iManufacturer           1 Suitable Systems
   iProduct                2 USB 24-bit Stereo AudioCard
   iSerial                 3 1.0.0.0
   bNumConfigurations      1
   Configuration Descriptor:
     bLength                 9
     bDescriptorType         2
     wTotalLength          266
     bNumInterfaces          4
     bConfigurationValue     1
     iConfiguration          0
     bmAttributes         0xc0
       Self Powered
     MaxPower                0mA
     Interface Descriptor:
       bLength                 9
       bDescriptorType         4
       bInterfaceNumber        0
       bAlternateSetting       0
       bNumEndpoints           0
       bInterfaceClass         1 Audio
       bInterfaceSubClass      1 Control Device
       bInterfaceProtocol      0
       iInterface              0
       AudioControl Interface Descriptor:
         bLength                10
         bDescriptorType        36
         bDescriptorSubtype      1 (HEADER)
         bcdADC               1.00
         wTotalLength          107
         bInCollection           2
         baInterfaceNr( 0)       2
         baInterfaceNr( 1)       1
       AudioControl Interface Descriptor:
         bLength                12
         bDescriptorType        36
         bDescriptorSubtype      2 (INPUT_TERMINAL)
         bTerminalID             1
         wTerminalType      0x0101 USB Streaming
         bAssocTerminal          0
         bNrChannels             1
         wChannelConfig     0x0003
           Left Front (L)
           Right Front (R)
         iChannelNames           0
         iTerminal              17 AES/EBU
       AudioControl Interface Descriptor:
         bLength                12
         bDescriptorType        36
         bDescriptorSubtype      2 (INPUT_TERMINAL)
         bTerminalID            14
         wTerminalType      0x0602 Digital Audio Interface
         bAssocTerminal          0
         bNrChannels             1
         wChannelConfig     0x0003
           Left Front (L)
           Right Front (R)
         iChannelNames           0
         iTerminal              18 SPDIF
       AudioControl Interface Descriptor:
         bLength                 9
         bDescriptorType        36
         bDescriptorSubtype      6 (FEATURE_UNIT)
         bUnitID                 2
         bSourceID               1
         bControlSize            1
         bmaControls( 0)      0x03
           Mute
           Volume
         bmaControls( 1)      0x00
         iFeature               10 Output
       AudioControl Interface Descriptor:
         bLength                 9
         bDescriptorType        36
         bDescriptorSubtype      3 (OUTPUT_TERMINAL)
         bTerminalID             3
         wTerminalType      0x0301 Speaker
         bAssocTerminal          0
         bSourceID               2
         iTerminal               0
       AudioControl Interface Descriptor:
         bLength                12
         bDescriptorType        36
         bDescriptorSubtype      2 (INPUT_TERMINAL)
         bTerminalID             4
         wTerminalType      0x0201 Microphone
         bAssocTerminal          0
         bNrChannels             1
         wChannelConfig     0x0003
           Left Front (L)
           Right Front (R)
         iChannelNames           0
         iTerminal               7 Analog
       AudioControl Interface Descriptor:
         bLength                16
         bDescriptorType        36
         bDescriptorSubtype      6 (FEATURE_UNIT)
         bUnitID                 8
         bSourceID               4
         bControlSize            1
         bmaControls( 0)      0x00
         bmaControls( 1)      0x80
           Delay
         bmaControls( 2)      0x80
           Delay
         bmaControls( 3)      0x80
           Delay
         bmaControls( 4)      0x80
           Delay
         bmaControls( 5)      0x80
           Delay
         bmaControls( 6)      0x80
           Delay
         bmaControls( 7)      0x80
           Delay
         bmaControls( 8)      0x80
           Delay
         iFeature               12 ADC Regs
       AudioControl Interface Descriptor:
         bLength                 9
         bDescriptorType        36
         bDescriptorSubtype      5 (SELECTOR_UNIT)
         bUnitID                 7
         bNrInPins               3
         baSource( 0)            8
         baSource( 1)            1
         baSource( 2)           14
         iSelector              11 Source Select
       AudioControl Interface Descriptor:
         bLength                 9
         bDescriptorType        36
         bDescriptorSubtype      6 (FEATURE_UNIT)
         bUnitID                 5
         bSourceID               7
         bControlSize            1
         bmaControls( 0)      0x03
           Mute
           Volume
         bmaControls( 1)      0x00
         iFeature                9 Input
       AudioControl Interface Descriptor:
         bLength                 9
         bDescriptorType        36
         bDescriptorSubtype      3 (OUTPUT_TERMINAL)
         bTerminalID             6
         wTerminalType      0x0101 USB Streaming
         bAssocTerminal          0
         bSourceID               5
         iTerminal               0
     Interface Descriptor:
       bLength                 9
       bDescriptorType         4
       bInterfaceNumber        1
       bAlternateSetting       0
       bNumEndpoints           0
       bInterfaceClass         1 Audio
       bInterfaceSubClass      2 Streaming
       bInterfaceProtocol      0
       iInterface              0
     Interface Descriptor:
       bLength                 9
       bDescriptorType         4
       bInterfaceNumber        1
       bAlternateSetting       1
       bNumEndpoints           1
       bInterfaceClass         1 Audio
       bInterfaceSubClass      2 Streaming
       bInterfaceProtocol      0
       iInterface              0
       AudioStreaming Interface Descriptor:
         bLength                 7
         bDescriptorType        36
         bDescriptorSubtype      1 (AS_GENERAL)
         bTerminalLink           1
         bDelay                  1 frames
         wFormatTag              1 PCM
       AudioStreaming Interface Descriptor:
         bLength                17
         bDescriptorType        36
         bDescriptorSubtype      2 (FORMAT_TYPE)
         bFormatType             1 (FORMAT_TYPE_I)
         bNrChannels             2
         bSubframeSize           2
         bBitResolution         16
         bSamFreqType            3 Discrete
         tSamFreq[ 0]        32000
         tSamFreq[ 1]        44100
         tSamFreq[ 2]        48000
       Endpoint Descriptor:
         bLength                 9
         bDescriptorType         5
         bEndpointAddress     0x05  EP 5 OUT
         bmAttributes            5
           Transfer Type            Isochronous
           Synch Type               Asynchronous
           Usage Type               Data
         wMaxPacketSize     0x0100  1x 256 bytes
         bInterval               1
         bRefresh                0
         bSynchAddress           2
         AudioControl Endpoint Descriptor:
           bLength                 7
           bDescriptorType        37
           bDescriptorSubtype      1 (EP_GENERAL)
           bmAttributes         0x01
             Sampling Frequency
           bLockDelayUnits         0 Undefined
           wLockDelay              0 Undefined
     Interface Descriptor:
       bLength                 9
       bDescriptorType         4
       bInterfaceNumber        2
       bAlternateSetting       0
       bNumEndpoints           0
       bInterfaceClass         1 Audio
       bInterfaceSubClass      2 Streaming
       bInterfaceProtocol      0
       iInterface              0
     Interface Descriptor:
       bLength                 9
       bDescriptorType         4
       bInterfaceNumber        2
       bAlternateSetting       1
       bNumEndpoints           1
       bInterfaceClass         1 Audio
       bInterfaceSubClass      2 Streaming
       bInterfaceProtocol      0
       iInterface              0
       AudioStreaming Interface Descriptor:
         bLength                 7
         bDescriptorType        36
         bDescriptorSubtype      1 (AS_GENERAL)
         bTerminalLink           6
         bDelay                  1 frames
         wFormatTag              1 PCM
       AudioStreaming Interface Descriptor:
         bLength                17
         bDescriptorType        36
         bDescriptorSubtype      2 (FORMAT_TYPE)
         bFormatType             1 (FORMAT_TYPE_I)
         bNrChannels             2
         bSubframeSize           2
         bBitResolution         16
         bSamFreqType            3 Discrete
         tSamFreq[ 0]        32000
         tSamFreq[ 1]        44100
         tSamFreq[ 2]        48000
       Endpoint Descriptor:
         bLength                 9
         bDescriptorType         5
         bEndpointAddress     0x82  EP 2 IN
         bmAttributes           37
           Transfer Type            Isochronous
           Synch Type               Asynchronous
           Usage Type               Implicit feedback Data
         wMaxPacketSize     0x0100  1x 256 bytes
         bInterval               1
         bRefresh                0
         bSynchAddress           0
         AudioControl Endpoint Descriptor:
           bLength                 7
           bDescriptorType        37
           bDescriptorSubtype      1 (EP_GENERAL)
           bmAttributes         0x00
           bLockDelayUnits         0 Undefined
           wLockDelay              0 Undefined
     Interface Descriptor:
       bLength                 9
       bDescriptorType         4
       bInterfaceNumber        3
       bAlternateSetting       0
       bNumEndpoints           1
       bInterfaceClass         3 Human Interface Device
       bInterfaceSubClass      0 No Subclass
       bInterfaceProtocol      1 Keyboard
       iInterface              0
         HID Device Descriptor:
           bLength                 9
           bDescriptorType        33
           bcdHID              11.01
           bCountryCode            0 Not supported
           bNumDescriptors         1
           bDescriptorType        34 Report
           wDescriptorLength      39
          Report Descriptors:
            ** UNAVAILABLE **
       Endpoint Descriptor:
         bLength                 7
         bDescriptorType         5
         bEndpointAddress     0x81  EP 1 IN
         bmAttributes            3
           Transfer Type            Interrupt
           Synch Type               None
           Usage Type               Data
         wMaxPacketSize     0x0008  1x 8 bytes
         bInterval               2
Device Qualifier (for other device speed):
   bLength                10
   bDescriptorType         6
   bcdUSB               2.00
   bDeviceClass            0 (Defined at Interface level)
   bDeviceSubClass         0
   bDeviceProtocol         0
   bMaxPacketSize0        64
   bNumConfigurations      1
Device Status:     0x0001
   Self Powered

-- 
Daniel T. Griscom             griscom@suitable.com
Suitable Systems              http://www.suitable.com/
1 Centre Street, Suite 204    (781) 665-0053
Wakefield, MA  01880-2400

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-21 20:13 Missing exactly 3 of 8 audio packets? Daniel Griscom
@ 2012-11-22 21:01 ` Daniel Mack
  2012-11-22 21:32 ` Daniel Mack
  1 sibling, 0 replies; 19+ messages in thread
From: Daniel Mack @ 2012-11-22 21:01 UTC (permalink / raw)
  To: Daniel Griscom; +Cc: alsa-devel

Hi Daniel,

Thanks for the detailed report.

On 21.11.2012 21:13, Daniel Griscom wrote:
> On to the next problem we're having with our USB audio card. Recap: 
> simple USB Audio Class embedded stereo audio card, running at 44.1kHz 
> or 48kHz, using the 3.6.6 kernel and its associated ALSA modules to 
> drive it, running on Jetway ND9D-2700, with an Atom D2700 and NM10 
> chipset. Output of "sudo lsusb -v" for card is appended below.
> 
> Problem: we're experiencing strange hiccups in the delivery of audio 
> from the motherboard to the card. At 48kHz, the motherboard should 
> send a 6-frame packet to the card once per high-speed microframe 
> (every 125us). This usually works, but sometimes there are two 
> closely related failures:
> 
> 1) Once in a while (every few seconds or minutes) a single packet 
> will be missed
> 
> 2) Once in a longer while (every few minutes or hours), the system 
> will go into a continuing error condition where three of every eight 
> packets are missed.
> 
> In both cases, "missed" means that ALSA consumes the output audio 
> from my motherboard application, but never sends a packet to the 
> audio card. No USB errors, no logged messages; it just disappears.
> 
> 
> The second case has one very interesting symptom. The pattern of 
> missed frames is amazingly rigid, and repeats the following pattern 
> endlessly (each character is a 125us slot for a packet, "F" is a 
> transmitted packet, "-" is a missing packet):
> 
> FFFF--F-
> 
> So, with eight microframes per millisecond where packets can be sent, 
> the fifth, sixth and eighth packets are missed, and this repeats for 
> at least a number of seconds. Very, very strange.
> 
> Using a Beagle 1200 I can see that there are no USB errors: the 
> packet is just not sent. Audio continues unabated in the other 
> direction. Timing always looks good, no other traffic on that USB 
> port.
> 
> 
> We've been chewing on this issue for a while. To me, it sounds like 
> this could only happen in the ALSA code where the stream of audio is 
> broken into individual USB packets. Unfortunately, I'm having a heck 
> of a time navigating the ALSA source code, and frankly have gotten no 
> traction at all.

I guess the only reason for what you see is that
snd_usb_endpoint_next_packet_size() returns an unusual value every time
a packet is missing, and question is why.

That function's operation is based on two values: the current momentary
frequency as reported by the sync endpoint (ep->freqm), and the phase
accumulator which carries the lower 16bits of the previous calculation,
which is preserved for precision sustainment.

> Any thoughts on what this might be, or on what further tests we might do?

Please try to catch the input and output parameters of that function
when USB packets are missed and also have a closer look at the sync
packets that are sent to the host shortly before that happens. Is there
any pattern in that?


Daniel

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-21 20:13 Missing exactly 3 of 8 audio packets? Daniel Griscom
  2012-11-22 21:01 ` Daniel Mack
@ 2012-11-22 21:32 ` Daniel Mack
  2012-11-25  3:33   ` Daniel Griscom
  1 sibling, 1 reply; 19+ messages in thread
From: Daniel Mack @ 2012-11-22 21:32 UTC (permalink / raw)
  To: Daniel Griscom; +Cc: Alsa Developer

On 21.11.2012 21:13, Daniel Griscom wrote:
> On to the next problem we're having with our USB audio card. Recap: 
> simple USB Audio Class embedded stereo audio card, running at 44.1kHz 
> or 48kHz, using the 3.6.6 kernel and its associated ALSA modules to 
> drive it, running on Jetway ND9D-2700, with an Atom D2700 and NM10 
> chipset. Output of "sudo lsusb -v" for card is appended below.
> 
> Problem: we're experiencing strange hiccups in the delivery of audio 
> from the motherboard to the card. At 48kHz, the motherboard should 
> send a 6-frame packet to the card once per high-speed microframe 
> (every 125us). This usually works, but sometimes there are two 
> closely related failures:
> 
> 1) Once in a while (every few seconds or minutes) a single packet 
> will be missed
> 
> 2) Once in a longer while (every few minutes or hours), the system 
> will go into a continuing error condition where three of every eight 
> packets are missed.
> 
> In both cases, "missed" means that ALSA consumes the output audio 
> from my motherboard application, but never sends a packet to the 
> audio card. No USB errors, no logged messages; it just disappears.

I missed that detail before. What makes you so sure ALSA actually
consumes audio it never sends out? Are you sending a test pattern which
is interrupted in your USB analyzer traces?


Daniel

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-22 21:32 ` Daniel Mack
@ 2012-11-25  3:33   ` Daniel Griscom
  2012-11-25 12:43     ` Daniel Mack
  0 siblings, 1 reply; 19+ messages in thread
From: Daniel Griscom @ 2012-11-25  3:33 UTC (permalink / raw)
  To: Daniel Mack; +Cc: Alsa Developer

Dear Daniel,

To take your second email first:

At 10:32 PM +0100 11/22/12, Daniel Mack wrote:
>On 21.11.2012 21:13, Daniel Griscom wrote:
>> On to the next problem we're having with our USB audio card. Recap:
>> simple USB Audio Class embedded stereo audio card, running at 44.1kHz
>> or 48kHz, using the 3.6.6 kernel and its associated ALSA modules to
>> drive it, running on Jetway ND9D-2700, with an Atom D2700 and NM10
>> chipset. Output of "sudo lsusb -v" for card is appended below.
>>
>> Problem: we're experiencing strange hiccups in the delivery of audio
>> from the motherboard to the card. At 48kHz, the motherboard should
>> send a 6-frame packet to the card once per high-speed microframe
>> (every 125us). This usually works, but sometimes there are two
>> closely related failures:
>>
>> 1) Once in a while (every few seconds or minutes) a single packet
>> will be missed
>>
>> 2) Once in a longer while (every few minutes or hours), the system
>> will go into a continuing error condition where three of every eight
>> packets are missed.
>>
>> In both cases, "missed" means that ALSA consumes the output audio
>> from my motherboard application, but never sends a packet to the
>> audio card. No USB errors, no logged messages; it just disappears.
>
>I missed that detail before. What makes you so sure ALSA actually
>consumes audio it never sends out? Are you sending a test pattern which
>is interrupted in your USB analyzer traces?

Great idea, and it took me a few days to be able to do it (too much turkey to be dealt with). The answer is yes: ALSA is consuming data that doesn't make it onto the USB bus.

My app is completely clocked by ALSA, sending out whatever the ALSA output stream will accept, and taking in whatever the ALSA input stream will offer. I set my app to output stereo triangle waves (in different frequencies), captured the data with the Beagle 1200, and then graphed it as a function of sample count. When things were running fine, the graph looked nice and clean. When the packets were being lost, both lines in the graph periodically jump, skipping values. The sizes of the jumps alternate, matching the pattern I cited where in each set of eight microframes two adjacent frames are skipped, and then a single frame is skipped.

If ALSA hadn't taken the data, my app would just wait until it did, with no data lost (although the output graph would still be bad as a function of time). So, ALSA (or something deeper) must be discarding the data.


To respond to your first email:

At 10:01 PM +0100 11/22/12, Daniel Mack wrote:
>On 21.11.2012 21:13, Daniel Griscom wrote:
> > We've been chewing on this issue for a while. To me, it sounds like
>> this could only happen in the ALSA code where the stream of audio is
>> broken into individual USB packets. Unfortunately, I'm having a heck
>> of a time navigating the ALSA source code, and frankly have gotten no
>> traction at all.
>
>I guess the only reason for what you see is that
>snd_usb_endpoint_next_packet_size() returns an unusual value every time
>a packet is missing, and question is why.

I went into sound/usb/pcm.c, function prepare_playback_urb(). The loop that prepares the URBs begins by determining the size of the next packet:

>if (ctx->packet_size[i])
>	counts = ctx->packet_size[i];
>else
>	counts = snd_usb_endpoint_next_packet_size(ep);

Immediately afterwards, I added:

>snd_printk(KERN_ERR "usbaudio/prepare_playback_urb: %d, %d, %d\n",
>	   i, ctx->packet_size[i], counts);

The result, whether or not the USB packets were being lost, was:

>[   64.910851] ALSA sound/usb/pcm.c:1065 usbaudio/prepare_playback_urb: 1, 0, 6
>[   64.910855] ALSA sound/usb/pcm.c:1065 usbaudio/prepare_playback_urb: 2, 0, 6
>[   64.911336] ALSA sound/usb/pcm.c:1065 usbaudio/prepare_playback_urb: 0, 0, 6
>[   64.911341] ALSA sound/usb/pcm.c:1065 usbaudio/prepare_playback_urb: 1, 0, 6
>[   64.911345] ALSA sound/usb/pcm.c:1065 usbaudio/prepare_playback_urb: 2, 0, 6
>[   64.911364] ALSA sound/usb/pcm.c:1065 usbaudio/prepare_playback_urb: 0, 0, 6

Even when packets were lost, eight URBs per millisecond were being prepared (6 frames each => 48kHz audio). So, the packets are being lost somewhere later in the process.


What else should I look at? Personally, I'm still fixating on that rigid pattern of missed packets, with three of every eight missing in a repeating "FFFF--F-" pattern. That's gotta mean something, although darned if I know what.


Thanks for the continuing help,
Dan

-- 
Daniel T. Griscom             griscom@suitable.com
Suitable Systems              http://www.suitable.com/
1 Centre Street, Suite 204    (781) 665-0053
Wakefield, MA  01880-2400

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-25  3:33   ` Daniel Griscom
@ 2012-11-25 12:43     ` Daniel Mack
  2012-11-25 16:39       ` Clemens Ladisch
  2012-11-25 22:23       ` Daniel Griscom
  0 siblings, 2 replies; 19+ messages in thread
From: Daniel Mack @ 2012-11-25 12:43 UTC (permalink / raw)
  To: Daniel Griscom; +Cc: Alsa Developer

Hi Dan,

On 25.11.2012 04:33, Daniel Griscom wrote:
> At 10:32 PM +0100 11/22/12, Daniel Mack wrote:
>> On 21.11.2012 21:13, Daniel Griscom wrote:
>>> On to the next problem we're having with our USB audio card.
>>> Recap: simple USB Audio Class embedded stereo audio card, running
>>> at 44.1kHz or 48kHz, using the 3.6.6 kernel and its associated
>>> ALSA modules to drive it, running on Jetway ND9D-2700, with an
>>> Atom D2700 and NM10 chipset. Output of "sudo lsusb -v" for card
>>> is appended below.
>>> 
>>> Problem: we're experiencing strange hiccups in the delivery of
>>> audio from the motherboard to the card. At 48kHz, the motherboard
>>> should send a 6-frame packet to the card once per high-speed
>>> microframe (every 125us). This usually works, but sometimes there
>>> are two closely related failures:
>>> 
>>> 1) Once in a while (every few seconds or minutes) a single
>>> packet will be missed
>>> 
>>> 2) Once in a longer while (every few minutes or hours), the
>>> system will go into a continuing error condition where three of
>>> every eight packets are missed.
>>> 
>>> In both cases, "missed" means that ALSA consumes the output
>>> audio from my motherboard application, but never sends a packet
>>> to the audio card. No USB errors, no logged messages; it just
>>> disappears.
>> 
>> I missed that detail before. What makes you so sure ALSA actually 
>> consumes audio it never sends out? Are you sending a test pattern
>> which is interrupted in your USB analyzer traces?
> 
> Great idea, and it took me a few days to be able to do it (too much
> turkey to be dealt with). The answer is yes: ALSA is consuming data
> that doesn't make it onto the USB bus.
> 
> My app is completely clocked by ALSA, sending out whatever the ALSA
> output stream will accept, and taking in whatever the ALSA input
> stream will offer. I set my app to output stereo triangle waves (in
> different frequencies), captured the data with the Beagle 1200, and
> then graphed it as a function of sample count. When things were
> running fine, the graph looked nice and clean. When the packets were
> being lost, both lines in the graph periodically jump, skipping
> values. The sizes of the jumps alternate, matching the pattern I
> cited where in each set of eight microframes two adjacent frames are
> skipped, and then a single frame is skipped.
> 
> If ALSA hadn't taken the data, my app would just wait until it did,
> with no data lost (although the output graph would still be bad as a
> function of time). So, ALSA (or something deeper) must be discarding
> the data.

Please do another test and change prepare_outbound_urb() so that instead
of calling ep->prepare_data_urb() to fill the URB, fill it directly with
some sort of easily recognizable test pattern (you can take the code
from "silence" case to access the buffers). Some kind of 16-bit counter
should do. And then check the payload with the Beagle and see whether
the pattern has gaps.

This test will tell us whether data is in fact lost before it hits the
usb audio driver, or if it's dropped by the USB HCD.


Daniel

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-25 12:43     ` Daniel Mack
@ 2012-11-25 16:39       ` Clemens Ladisch
  2012-11-26  3:14         ` Daniel Griscom
  2012-11-25 22:23       ` Daniel Griscom
  1 sibling, 1 reply; 19+ messages in thread
From: Clemens Ladisch @ 2012-11-25 16:39 UTC (permalink / raw)
  To: Daniel Mack; +Cc: Daniel Griscom, Alsa Developer

Daniel Mack wrote:
>> On 21.11.2012 21:13, Daniel Griscom wrote:
>>> 1) Once in a while (every few seconds or minutes) a single
>>> packet will be missed
>>>
>>> 2) Once in a longer while (every few minutes or hours), the
>>> system will go into a continuing error condition where three of
>>> every eight packets are missed.
> [...]
> This test will tell us whether data is in fact lost before it hits the
> usb audio driver, or if it's dropped by the USB HCD.

These look like hardware errors.  You might want to try to check the
frames' status in retire_playback_urb(), but this will show only DMA/
FIFO problems on the host; the HC will not be able to detect whether the
receiving device has handled the packet.


Regards,
Clemens

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-25 12:43     ` Daniel Mack
  2012-11-25 16:39       ` Clemens Ladisch
@ 2012-11-25 22:23       ` Daniel Griscom
  2012-11-26  7:19         ` Daniel Mack
  1 sibling, 1 reply; 19+ messages in thread
From: Daniel Griscom @ 2012-11-25 22:23 UTC (permalink / raw)
  To: Daniel Mack; +Cc: Alsa Developer

At 1:43 PM +0100 11/25/12, Daniel Mack wrote:
>Please do another test and change prepare_outbound_urb() so that instead
>of calling ep->prepare_data_urb() to fill the URB, fill it directly with
>some sort of easily recognizable test pattern (you can take the code
>from "silence" case to access the buffers). Some kind of 16-bit counter
>should do. And then check the payload with the Beagle and see whether
>the pattern has gaps.
>
>This test will tell us whether data is in fact lost before it hits the
>usb audio driver, or if it's dropped by the USB HCD.

I did the test, and expected to either a) see the incrementing data 
be contiguous even though the USB packet transmission was stuttering, 
or b) see the incrementing data have gaps where the "missing" packets 
were. However, what I saw was c): the USB packets never misbehaved.

Here's the code I used in /usb/endpoint.c, prepare_outbound_urb():

>	static short left = 0;
>	static short right = 0x0404;
>	short *sp;

...

>		if (ep->prepare_data_urb) {
>#if 1
>			ep->prepare_data_urb(ep->data_subs, urb);
>#else
>		  /* Fake constantly increasing samples */
>		  unsigned int offs = 0;
>		  for (i = 0; i < ctx->packets; ++i) {
>		      int counts;
>
>		      if (ctx->packet_size[i])
>			counts = ctx->packet_size[i];
>		      else
>			counts = snd_usb_endpoint_next_packet_size(ep);
>
>		      urb->iso_frame_desc[i].offset = offs * ep->stride;
>		      urb->iso_frame_desc[i].length = counts * ep->stride;
>		      offs += counts;
>		  }
>
>		  urb->number_of_packets = ctx->packets;
>		  urb->transfer_buffer_length = offs * ep->stride;
>		  for (i = 0, sp = (short *)(urb->transfer_buffer);
>		       i < offs * ep->stride; /* no increment */) {
>		    *sp++ = left++;
>		    i += sizeof(short);
>		    *sp++ = right++;
>		    i += sizeof(short);
>		  }
>#endif
>		} else {

With the "#if 1", the code is stock, and about 30% of my tests 
resulted in the stuttering USB packets (but with data from my 
application). With it changed to "#if 0", I generated and saw the 
incrementing data, but the USB packets never misbehaved (even after 
more than 20 tries). I switched back and forth, and the problem 
clearly appeared and disappeared.

I think I should give more information about my tests. This problem 
is very intermittent, and difficult to reproduce. However, I found a 
case where it often happens: at boot, where my app starts up right 
about when the USB devices are starting up. So, each of the "tests" 
above consisted of me rebooting my system and watching the Beagle's 
trace for good versus bad packet patterns.


Thanks again for the continuing help,
Dan

-- 
Daniel T. Griscom             griscom@suitable.com
Suitable Systems              http://www.suitable.com/
1 Centre Street, Suite 204    (781) 665-0053
Wakefield, MA  01880-2400

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-25 16:39       ` Clemens Ladisch
@ 2012-11-26  3:14         ` Daniel Griscom
  2012-11-26 21:32           ` Clemens Ladisch
  0 siblings, 1 reply; 19+ messages in thread
From: Daniel Griscom @ 2012-11-26  3:14 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: Alsa Developer, Daniel Mack

At 5:39 PM +0100 11/25/12, Clemens Ladisch wrote:
>Daniel Mack wrote:
>>>  On 21.11.2012 21:13, Daniel Griscom wrote:
>>>>  1) Once in a while (every few seconds or minutes) a single
>>>>  packet will be missed
>>>>
>>>>  2) Once in a longer while (every few minutes or hours), the
>>>>  system will go into a continuing error condition where three of
>>>>  every eight packets are missed.
>>  [...]
>>  This test will tell us whether data is in fact lost before it hits the
>>  usb audio driver, or if it's dropped by the USB HCD.
>
>These look like hardware errors.

It's possible. This is a Jetway NF9D-2700 motherboard, with USB 
handled by an NM10, and there are other Linux issues with the 
hardware (e.g. the PowerVR GPU isn't supported in recent Ubuntu 
versions). But, the test results in my previous email (sent after 
yours) imply that it's a software issue.

>You might want to try to check the
>frames' status in retire_playback_urb(),

I've looked that function over, but it's not clear where in the 
various structures I'd find the status. Suggestion?

>but this will show only DMA/
>FIFO problems on the host; the HC will not be able to detect whether the
>receiving device has handled the packet.

You mean, if the data is put on the USB bus, but the receiving device 
(my audio card) loses it, there's no way the above will show this? 
The missing data never appears on the USB bus, so I'm pretty sure 
that isn't the problem here.


By the way, I'd stated that the pattern of missing packets repeats 
every eight microframes, and never varies. I've found that that isn't 
completely true; it sometimes does vary, but not by much. By 
microframe numbers within a frame, here are the two patterns I've 
seen:

0 - Miss
1 - Miss
2 - Send
3 - Send
4 - Send
5 - Miss
6 - Send
7 - Send

0 - Miss
1 - Send
2 - Send
3 - Send
4 - Send
5 - Miss
6 - Miss
7 - Send

(I've spent a while trying to concoct some sort of rule for these 
patterns based on the microframe numbers' bits, with no success. Oh, 
well.)


As always, thanks for your continuing help,
Dan

-- 
Daniel T. Griscom             griscom@suitable.com
Suitable Systems              http://www.suitable.com/
1 Centre Street, Suite 204    (781) 665-0053
Wakefield, MA  01880-2400

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-25 22:23       ` Daniel Griscom
@ 2012-11-26  7:19         ` Daniel Mack
  2012-11-26 21:23           ` Daniel Griscom
  0 siblings, 1 reply; 19+ messages in thread
From: Daniel Mack @ 2012-11-26  7:19 UTC (permalink / raw)
  To: Daniel Griscom; +Cc: Alsa Developer

On 25.11.2012 23:23, Daniel Griscom wrote:
> At 1:43 PM +0100 11/25/12, Daniel Mack wrote:
>> Please do another test and change prepare_outbound_urb() so that instead
>> of calling ep->prepare_data_urb() to fill the URB, fill it directly with
>> some sort of easily recognizable test pattern (you can take the code
>>from "silence" case to access the buffers). Some kind of 16-bit counter
>> should do. And then check the payload with the Beagle and see whether
>> the pattern has gaps.
>>
>> This test will tell us whether data is in fact lost before it hits the
>> usb audio driver, or if it's dropped by the USB HCD.
> 
> I did the test, and expected to either a) see the incrementing data 
> be contiguous even though the USB packet transmission was stuttering, 
> or b) see the incrementing data have gaps where the "missing" packets 
> were. However, what I saw was c): the USB packets never misbehaved.
> 
> Here's the code I used in /usb/endpoint.c, prepare_outbound_urb():
> 
>> 	static short left = 0;
>> 	static short right = 0x0404;
>> 	short *sp;
> 
> ...
> 
>> 		if (ep->prepare_data_urb) {
>> #if 1
>> 			ep->prepare_data_urb(ep->data_subs, urb);
>> #else
>> 		  /* Fake constantly increasing samples */
>> 		  unsigned int offs = 0;
>> 		  for (i = 0; i < ctx->packets; ++i) {
>> 		      int counts;
>>
>> 		      if (ctx->packet_size[i])
>> 			counts = ctx->packet_size[i];
>> 		      else
>> 			counts = snd_usb_endpoint_next_packet_size(ep);
>>
>> 		      urb->iso_frame_desc[i].offset = offs * ep->stride;
>> 		      urb->iso_frame_desc[i].length = counts * ep->stride;
>> 		      offs += counts;
>> 		  }
>>
>> 		  urb->number_of_packets = ctx->packets;

Note that this is a potential difference between your two cases.

prepare_playback_urb() from pcm.c will not always set
urb->number_of_packets to the maximum value but cut packets short at PCM
period boundaries.

Could you move your pattern generating code down to that function? Just
look for the memcpy() calls there.


Daniel

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-26  7:19         ` Daniel Mack
@ 2012-11-26 21:23           ` Daniel Griscom
  2012-11-27 11:48             ` [alsa-devel] " Daniel Mack
  0 siblings, 1 reply; 19+ messages in thread
From: Daniel Griscom @ 2012-11-26 21:23 UTC (permalink / raw)
  To: Daniel Mack; +Cc: Alsa Developer

At 8:19 AM +0100 11/26/12, Daniel Mack wrote:
>On 25.11.2012 23:23, Daniel Griscom wrote:
>>  At 1:43 PM +0100 11/25/12, Daniel Mack wrote:
>>>  Please do another test and change prepare_outbound_urb() so that instead
>>>  of calling ep->prepare_data_urb() to fill the URB, fill it directly with
>>>  some sort of easily recognizable test pattern (you can take the code
>>>from "silence" case to access the buffers). Some kind of 16-bit counter
>>>  should do. And then check the payload with the Beagle and see whether
>>>  the pattern has gaps.
>>>
>>>  This test will tell us whether data is in fact lost before it hits the
>>>  usb audio driver, or if it's dropped by the USB HCD.
>>
>>  I did the test, and expected to either a) see the incrementing data
>>  be contiguous even though the USB packet transmission was stuttering,
>>  or b) see the incrementing data have gaps where the "missing" packets
>  > were. However, what I saw was c): the USB packets never misbehaved.
>Note that this is a potential difference between your two cases.
>
>prepare_playback_urb() from pcm.c will not always set
>urb->number_of_packets to the maximum value but cut packets short at PCM
>period boundaries.
>
>Could you move your pattern generating code down to that function? Just
>look for the memcpy() calls there.

OK, this time I got some real results. I can still get the USB packet 
stream to misbehave, and indeed the synthesized data is being lost. 
The output data present on the USB bus smoothly increments during 
each packet, continuing smoothly in adjacent packets. But, when one 
or two packets are missed, the next output data is numbered as if the 
packets (6 stereo frames each) had been generated but lost.

Here's my code in linux-3.6.6/sound/usb/pcm.c, prepare_playback_urb():

>	static short left = 0;
>	static short right = 0x0404;
>	short *sp;

...

>	bytes = frames * stride;
>#define FAKE_DATA
>#ifdef FAKE_DATA
>	for (i = 0, sp = (short *)(urb->transfer_buffer);
>	   i < bytes; /* no increment */) {
>		*sp++ = left++;
>		i += sizeof(*sp);
>		*sp++ = right++;
>		i += sizeof(*sp);
>	}
>#else
>	if (subs->hwptr_done + bytes > runtime->buffer_size * stride) {
>		/* err, the transferred area goes over buffer boundary. */
>		unsigned int bytes1 =
>			runtime->buffer_size * stride - subs->hwptr_done;
>		memcpy(urb->transfer_buffer,
>		       runtime->dma_area + subs->hwptr_done, bytes1);
>		memcpy(urb->transfer_buffer + bytes1,
>		       runtime->dma_area, bytes - bytes1);
>	} else {
>		memcpy(urb->transfer_buffer,
>		       runtime->dma_area + subs->hwptr_done, bytes);
>	}
>#endif
>	subs->hwptr_done += bytes;

Did I place the generation code in the correct location?

And, what should I look at next?


Thanks again,
Dan

-- 
Daniel T. Griscom             griscom@suitable.com
Suitable Systems              http://www.suitable.com/
1 Centre Street, Suite 204    (781) 665-0053
Wakefield, MA  01880-2400

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-26  3:14         ` Daniel Griscom
@ 2012-11-26 21:32           ` Clemens Ladisch
  0 siblings, 0 replies; 19+ messages in thread
From: Clemens Ladisch @ 2012-11-26 21:32 UTC (permalink / raw)
  To: Daniel Griscom; +Cc: Alsa Developer, Daniel Mack

Daniel Griscom wrote:
> At 5:39 PM +0100 11/25/12, Clemens Ladisch wrote:
>> You might want to try to check the
>> frames' status in retire_playback_urb(),
>
> I've looked that function over, but it's not clear where in the
> various structures I'd find the status.

Copy that code from retire_capture_urb().

> if the data is put on the USB bus, but the receiving device (my audio
> card) loses it, there's no way the above will show this?

Isochronous packets have no error handling or reporting, except for the
CRC.  You will see an error report only if it happend before the packet
was put on the bus.  (Which appears to be the case for you.)


Regards,
Clemens

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [alsa-devel] Missing exactly 3 of 8 audio packets?
  2012-11-26 21:23           ` Daniel Griscom
@ 2012-11-27 11:48             ` Daniel Mack
  2012-11-27 17:01               ` Daniel Griscom
       [not found]               ` <50B4A870.7040201-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 2 replies; 19+ messages in thread
From: Daniel Mack @ 2012-11-27 11:48 UTC (permalink / raw)
  To: Daniel Griscom; +Cc: Alsa Developer, linux-usb

On 26.11.2012 22:23, Daniel Griscom wrote:
> At 8:19 AM +0100 11/26/12, Daniel Mack wrote:
>> On 25.11.2012 23:23, Daniel Griscom wrote:
>>>  At 1:43 PM +0100 11/25/12, Daniel Mack wrote:
>>>>  Please do another test and change prepare_outbound_urb() so that instead
>>>>  of calling ep->prepare_data_urb() to fill the URB, fill it directly with
>>>>  some sort of easily recognizable test pattern (you can take the code
>>> >from "silence" case to access the buffers). Some kind of 16-bit counter
>>>>  should do. And then check the payload with the Beagle and see whether
>>>>  the pattern has gaps.
>>>>
>>>>  This test will tell us whether data is in fact lost before it hits the
>>>>  usb audio driver, or if it's dropped by the USB HCD.
>>>
>>>  I did the test, and expected to either a) see the incrementing data
>>>  be contiguous even though the USB packet transmission was stuttering,
>>>  or b) see the incrementing data have gaps where the "missing" packets
>>  > were. However, what I saw was c): the USB packets never misbehaved.
>> Note that this is a potential difference between your two cases.
>>
>> prepare_playback_urb() from pcm.c will not always set
>> urb->number_of_packets to the maximum value but cut packets short at PCM
>> period boundaries.
>>
>> Could you move your pattern generating code down to that function? Just
>> look for the memcpy() calls there.
> 
> OK, this time I got some real results. I can still get the USB packet 
> stream to misbehave, and indeed the synthesized data is being lost. 
> The output data present on the USB bus smoothly increments during 
> each packet, continuing smoothly in adjacent packets. But, when one 
> or two packets are missed, the next output data is numbered as if the 
> packets (6 stereo frames each) had been generated but lost.
> 
> Here's my code in linux-3.6.6/sound/usb/pcm.c, prepare_playback_urb():
> 
>> 	static short left = 0;
>> 	static short right = 0x0404;
>> 	short *sp;
> 
> ...
> 
>> 	bytes = frames * stride;
>> #define FAKE_DATA
>> #ifdef FAKE_DATA
>> 	for (i = 0, sp = (short *)(urb->transfer_buffer);
>> 	   i < bytes; /* no increment */) {
>> 		*sp++ = left++;
>> 		i += sizeof(*sp);
>> 		*sp++ = right++;
>> 		i += sizeof(*sp);
>> 	}
>> #else
>> 	if (subs->hwptr_done + bytes > runtime->buffer_size * stride) {
>> 		/* err, the transferred area goes over buffer boundary. */
>> 		unsigned int bytes1 =
>> 			runtime->buffer_size * stride - subs->hwptr_done;
>> 		memcpy(urb->transfer_buffer,
>> 		       runtime->dma_area + subs->hwptr_done, bytes1);
>> 		memcpy(urb->transfer_buffer + bytes1,
>> 		       runtime->dma_area, bytes - bytes1);
>> 	} else {
>> 		memcpy(urb->transfer_buffer,
>> 		       runtime->dma_area + subs->hwptr_done, bytes);
>> 	}
>> #endif
>> 	subs->hwptr_done += bytes;
> 
> Did I place the generation code in the correct location?

Yes.

> And, what should I look at next?

As Clemens said, check the error fields in the isochronous frames when
the urb is given back to the driver. For isochronous data, there's
nothing the driver can do about failed transmissions, hence there's no
code to handle such conditions. But it might help understand what's
going on.

In any case, this now certainly looks more like a strange USB problem,
rather than a bug in snd-usb. I copied the USB list. The thread starts here:


http://mailman.alsa-project.org/pipermail/alsa-devel/2012-November/057259.html


Daniel



--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-27 11:48             ` [alsa-devel] " Daniel Mack
@ 2012-11-27 17:01               ` Daniel Griscom
  2012-11-27 17:21                 ` Clemens Ladisch
       [not found]               ` <50B4A870.7040201-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  1 sibling, 1 reply; 19+ messages in thread
From: Daniel Griscom @ 2012-11-27 17:01 UTC (permalink / raw)
  To: Daniel Mack; +Cc: Alsa Developer

At 12:48 PM +0100 11/27/12, Daniel Mack wrote:
>As Clemens said, check the error fields in the isochronous frames when
>the urb is given back to the driver. For isochronous data, there's
>nothing the driver can do about failed transmissions, hence there's no
>code to handle such conditions. But it might help understand what's
>going on.

Well, I inserted code into retire_playback_urb() as Clemens suggested 
a few days ago:

>	int est_delay, i;
>
>	/* Check status of submitted urbs */
>	for (i = 0; i < urb->number_of_packets; i++) {
>		if (urb->iso_frame_desc[i].status) {
>			snd_printk(KERN_ERR "packet %d failed: %d\n", 
>i, urb->iso_frame_desc[i].status);
>		}
>	}
>
>	/* ignore the delay accounting when procssed=0 is given, i.e.

And, hit gold (lead?):

>[  432.591698] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>[  432.591702] ALSA sound/usb/pcm.c:1163 packet 1 failed: -18
>[  432.592684] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>[  432.592702] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>[  432.592706] ALSA sound/usb/pcm.c:1163 packet 1 failed: -18
>[  432.593684] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>[  432.593701] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>[  432.593705] ALSA sound/usb/pcm.c:1163 packet 1 failed: -18
>[  432.594680] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18

Error 18 is EXDEV: "Cross-device link". From an alsa-user post by 
Clemens a couple of years ago:

>This error code is documented in Documentation/usb/error-codes.txt:
>| -EXDEV                  ISO transfer only partially completed
>|                         look at individual frame status for details
>
>Well, this _is_ the individual frame status.
>
>Anyway, a look at the source code shows that several HCDs use this code
>for frames that were not handled by the controller, probably because
>they were submitted too late.
>
>Which controller are you using?
>
>Is there anything that could cause the controller to skip frames, such
>as high traffic on the (PCI) bus?

The answer to that final question: I don't know, but I've been 
concerned about PCI traffic for a while, and I don't know how I'll 
address it.


So, is it clear that this is a USB (software or hardware) problem? 
Should I move this discussion to the linux-usb list?


Thanks for all the help,
Dan

-- 
Daniel T. Griscom             griscom@suitable.com
Suitable Systems              http://www.suitable.com/
1 Centre Street, Suite 204    (781) 665-0053
Wakefield, MA  01880-2400

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [alsa-devel] Missing exactly 3 of 8 audio packets?
       [not found]               ` <50B4A870.7040201-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2012-11-27 17:20                 ` Alan Stern
       [not found]                   ` <Pine.LNX.4.44L0.1211271213580.1489-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
  0 siblings, 1 reply; 19+ messages in thread
From: Alan Stern @ 2012-11-27 17:20 UTC (permalink / raw)
  To: Daniel Mack; +Cc: Daniel Griscom, Alsa Developer, linux-usb

On Tue, 27 Nov 2012, Daniel Mack wrote:

> > OK, this time I got some real results. I can still get the USB packet 
> > stream to misbehave, and indeed the synthesized data is being lost. 
> > The output data present on the USB bus smoothly increments during 
> > each packet, continuing smoothly in adjacent packets. But, when one 
> > or two packets are missed, the next output data is numbered as if the 
> > packets (6 stereo frames each) had been generated but lost.

That's how isochronous transfers are supposed to behave.  When data is
lost, it does not get retransmitted.

> > And, what should I look at next?
> 
> As Clemens said, check the error fields in the isochronous frames when
> the urb is given back to the driver. For isochronous data, there's
> nothing the driver can do about failed transmissions, hence there's no
> code to handle such conditions. But it might help understand what's
> going on.

There probably won't be any errors, but it's worth looking anyway.  
You never know...

> In any case, this now certainly looks more like a strange USB problem,
> rather than a bug in snd-usb.

The only thing that's strange is that there are so many dropped packets 
and that they seem to fall into a small number of patterns.  This 
strongly suggests hardware issues.  Daniel G., have you tried running 
your tests on a different computer?  Preferably with a different brand 
of motherboard?

Alan Stern

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-27 17:01               ` Daniel Griscom
@ 2012-11-27 17:21                 ` Clemens Ladisch
  2012-11-27 18:40                   ` Daniel Griscom
  0 siblings, 1 reply; 19+ messages in thread
From: Clemens Ladisch @ 2012-11-27 17:21 UTC (permalink / raw)
  To: Daniel Griscom; +Cc: Alsa Developer, Daniel Mack

Daniel Griscom wrote:
>> [  432.591698] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>> [  432.591702] ALSA sound/usb/pcm.c:1163 packet 1 failed: -18
>> [  432.592684] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>> [  432.592702] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>> [  432.592706] ALSA sound/usb/pcm.c:1163 packet 1 failed: -18
>> [  432.593684] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>> [  432.593701] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>> [  432.593705] ALSA sound/usb/pcm.c:1163 packet 1 failed: -18
>> [  432.594680] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18

These packet numbers never get above 1.  Are you using two
microframes per URB?  What is the ALSA buffer size?


Regards,
Clemens

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-27 17:21                 ` Clemens Ladisch
@ 2012-11-27 18:40                   ` Daniel Griscom
  2012-11-27 19:46                     ` Clemens Ladisch
  0 siblings, 1 reply; 19+ messages in thread
From: Daniel Griscom @ 2012-11-27 18:40 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: Alsa Developer, Daniel Mack

At 6:21 PM +0100 11/27/12, Clemens Ladisch wrote:
>Daniel Griscom wrote:
>>>  [  432.591698] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>>>  [  432.591702] ALSA sound/usb/pcm.c:1163 packet 1 failed: -18
>>>  [  432.592684] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>>>  [  432.592702] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>>>  [  432.592706] ALSA sound/usb/pcm.c:1163 packet 1 failed: -18
>>>  [  432.593684] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>>>  [  432.593701] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>>>  [  432.593705] ALSA sound/usb/pcm.c:1163 packet 1 failed: -18
>>>  [  432.594680] ALSA sound/usb/pcm.c:1163 packet 0 failed: -18
>
>These packet numbers never get above 1.  Are you using two
>microframes per URB?

We are using a bInterval value of 1 (on a high-speed device). We've 
recently tried bumping this up to 2, and the problem was no longer 
evident, but given the difficulty in reproducing it I wasn't at all 
clear that we hadn't just moved it to a different set of reproduce 
conditions.

... is that what you meant?

>What is the ALSA buffer size?

We're handing a value of 3072 to snd_pcm_hw_params_set_buffer_size_near().

>Regards,
>Clemens

Thanks,
Dan

-- 
Daniel T. Griscom             griscom@suitable.com
Suitable Systems              http://www.suitable.com/
1 Centre Street, Suite 204    (781) 665-0053
Wakefield, MA  01880-2400

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-27 18:40                   ` Daniel Griscom
@ 2012-11-27 19:46                     ` Clemens Ladisch
  2012-11-27 20:10                       ` Daniel Griscom
  0 siblings, 1 reply; 19+ messages in thread
From: Clemens Ladisch @ 2012-11-27 19:46 UTC (permalink / raw)
  To: Daniel Griscom; +Cc: Alsa Developer, Daniel Mack

Daniel Griscom wrote:
> We are using a bInterval value of 1 (on a high-speed device). We've
> recently tried bumping this up to 2, and the problem was no longer
> evident

This might indicate that the controller has problems reading the
packet data from memory; there's a considerable overhead for each
memory transaction, and the controller needs to update the DMA lists.
(The pattern might be caused by some data, which arrives too late,
interfering with the reading of the next packet.)

If 2 is the first save interval, consider using 4.  For that matter,
full-speed devices work fine with one packet per frame.  There isn't
a problem with buffering one millisecond of data in the device, is it?

(The only reason to use smaller intervals is if you really require sub-
millisecond latencies, or if the bigger packets would eat up too much
bandwidth in one of the microframes.  The cost of smaller intervals is
more overhead on the host, on the bus, and in the device.)


Regards,
Clemens

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: Missing exactly 3 of 8 audio packets?
  2012-11-27 19:46                     ` Clemens Ladisch
@ 2012-11-27 20:10                       ` Daniel Griscom
  0 siblings, 0 replies; 19+ messages in thread
From: Daniel Griscom @ 2012-11-27 20:10 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: Alsa Developer, Daniel Mack

At 8:46 PM +0100 11/27/12, Clemens Ladisch wrote:
>Daniel Griscom wrote:
>>  We are using a bInterval value of 1 (on a high-speed device). We've
>>  recently tried bumping this up to 2, and the problem was no longer
>>  evident
>
>This might indicate that the controller has problems reading the
>packet data from memory; there's a considerable overhead for each
>memory transaction, and the controller needs to update the DMA lists.
>(The pattern might be caused by some data, which arrives too late,
>interfering with the reading of the next packet.)

So, might this whole thing have been caused by setting bInterval to 1 
in the device descriptor?

>If 2 is the first save interval, consider using 4.

Interval lengths are 2 ^ (bInterval - 1) microframes, so we went from 
1 microframe to 2. Should I go right to a bInterval of 2 (4 
microframes)?

>  For that matter,
>full-speed devices work fine with one packet per frame.  There isn't
>a problem with buffering one millisecond of data in the device, is it?

We are indeed trying to squeeze the milliseconds out of the audio 
chain, but getting it robust is obviously the priority.

>(The only reason to use smaller intervals is if you really require sub-
>millisecond latencies, or if the bigger packets would eat up too much
>bandwidth in one of the microframes.  The cost of smaller intervals is
>more overhead on the host, on the bus, and in the device.)

We have plenty of bus bandwidth, and I'd thought we had plenty of CPU 
power, but perhaps not.


Thanks,
Dan

-- 
Daniel T. Griscom             griscom@suitable.com
Suitable Systems              http://www.suitable.com/
1 Centre Street, Suite 204    (781) 665-0053
Wakefield, MA  01880-2400

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [alsa-devel] Missing exactly 3 of 8 audio packets?
       [not found]                   ` <Pine.LNX.4.44L0.1211271213580.1489-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
@ 2012-12-03 21:04                     ` Sarah Sharp
  0 siblings, 0 replies; 19+ messages in thread
From: Sarah Sharp @ 2012-12-03 21:04 UTC (permalink / raw)
  To: Alan Stern; +Cc: Daniel Mack, Daniel Griscom, Alsa Developer, linux-usb

On Tue, Nov 27, 2012 at 12:20:42PM -0500, Alan Stern wrote:
> The only thing that's strange is that there are so many dropped packets 
> and that they seem to fall into a small number of patterns.  This 
> strongly suggests hardware issues.  Daniel G., have you tried running 
> your tests on a different computer?  Preferably with a different brand 
> of motherboard?

What host controller were you running under?  I know that some xHCI host
controllers (NEC in particular) have pretty bad issues with missing
service intervals on isochronous transfers.

Sarah Sharp
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2012-12-03 21:04 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-11-21 20:13 Missing exactly 3 of 8 audio packets? Daniel Griscom
2012-11-22 21:01 ` Daniel Mack
2012-11-22 21:32 ` Daniel Mack
2012-11-25  3:33   ` Daniel Griscom
2012-11-25 12:43     ` Daniel Mack
2012-11-25 16:39       ` Clemens Ladisch
2012-11-26  3:14         ` Daniel Griscom
2012-11-26 21:32           ` Clemens Ladisch
2012-11-25 22:23       ` Daniel Griscom
2012-11-26  7:19         ` Daniel Mack
2012-11-26 21:23           ` Daniel Griscom
2012-11-27 11:48             ` [alsa-devel] " Daniel Mack
2012-11-27 17:01               ` Daniel Griscom
2012-11-27 17:21                 ` Clemens Ladisch
2012-11-27 18:40                   ` Daniel Griscom
2012-11-27 19:46                     ` Clemens Ladisch
2012-11-27 20:10                       ` Daniel Griscom
     [not found]               ` <50B4A870.7040201-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2012-11-27 17:20                 ` [alsa-devel] " Alan Stern
     [not found]                   ` <Pine.LNX.4.44L0.1211271213580.1489-100000-IYeN2dnnYyZXsRXLowluHWD2FQJk+8+b@public.gmane.org>
2012-12-03 21:04                     ` Sarah Sharp

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.