Re: Endlessly-stuttttttttttttttttering ALSA audio

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 10/26/2012 03:02 AM, Ken Restivo wrote:
On Fri, Oct 26, 2012 at 08:35:00AM +0200, Clemens Ladisch wrote:
Ken Restivo wrote:
I've heard audio stutter briefly on machines, usually under heavy
CPU load, but what could be causing it to stutter endlessly
(until the application quits), on one frame with low/no load?

The software has stopped updating the buffer (for whatever reason),
but the hardware hasn't been told about that and continues playing
it.

Thank you, that is extremely helpful. If I'm reading this correctly,
it looks like this is not a driver problem, or a hardware problem,
but rather squarely the fault of the application which has opened the
sound device and is (or was) writing to it.

Kind of. But that's also what causes your typical xrun, right? And /usually/ the driver will stop the device... resulting in silence, not stuttering.

I've seen these situations cause stuttering:

  1. The application is constantly writing the same data over
     and over.  For example, I was working on a mixer algorithm,
     and sometimes I would accidentally mix in a stale buffer
     with out-of date data.  It did exactly this.

  2. The audio interrupts have been disabled.  The hardware
     generates an interrupt at every period boundary.  The
     kernel responds to this and it ultimately causes the
     userspace to be signaled to say, "we need more data."
     If the interrupt is not received (or late or ignored),
     then the kernel won't run it's standard code (which
     also detects xruns) and the application won't write
     new data.  The hardware will continue to iterate over
     the data in the buffers.  This can be caused by /another/
     driver that disables interrupts or a being caught in
     a never-ending spinlock_irqsave() (which disables IRQ's).

  3. It's possible in some cases to set start/stop thresholds
     so that xruns never get detected.  In that case, the
     hardware won't stop and it'll continue to iterate on
     the data in your buffer.

Approaches:

   * You said it repeats a 40ms frame.
     Is that the PERIOD size?  If so... probably application (#1)
     Is that the BUFFER size?  If so... probably hardware (#2, #3)

   * Can you patch the software to intercept the audio just before
     writing it to hardware (snd_pcm_write*())?  If so... try that
     and inspect the audio.  If it has the stutter... it's the
     application (#1).

   * Try to inspect the application using strace while it's running
     normally.  Try to identify what the writes to hardware look
     like.  (Probably an 'ioctl' call.)  When the problem
     happens again... inspect with strace.  If there are no write's
     happening... it's likely #2 or #3.[1]

-gabriel

[1] To map file descriptors to actual files... look in
    /proc/<pid>/fd/.  An audio output will be a file named
    something like /dev/snd/pcmC0D0p
_______________________________________________
Linux-audio-user mailing list
Linux-audio-user@xxxxxxxxxxxxxxxxxxxx
http://lists.linuxaudio.org/listinfo/linux-audio-user


[Index of Archives]     [Linux Sound]     [ALSA Users]     [Pulse Audio]     [ALSA Devel]     [Sox Users]     [Linux Media]     [Kernel]     [Photo Sharing]     [Gimp]     [Yosemite News]     [Linux Media]

  Powered by Linux