[alsa-devel] ALSA processor usage is too high

Clemens Ladisch clemens at ladisch.de
Mon Nov 8 11:39:53 CET 2010


Adam Rosenberg wrote:
> On Fri, Nov 5, 2010 at 3:10 PM, Clemens Ladisch <clemens at ladisch.de> wrote:
> > And you should use poll() with all eight handles so that you don't
> > eat CPU while waiting.)
> 
> I can't use poll because the application has to perform many other
> tasks in a deterministic manner (meaning I can only use threads and
> other processes to notify the main loop to perform some task).

As Mark wrote, this is what poll() was designed for.

> the main loop of my application basically does this:
> while(1)
> {
>   processNextAlsaStream();
>   processMp3Decoder();
>   processLCD();
>   processInputs();
>   processSerial();
> }

With poll(), it would look somewhat like this:

  struct pollfd pollfds[...];
  // fill pollfds with all handles
  while (1)
  {
     poll(...);
     for (1..8)
       if (stream ready for writing)
         processAlsaStream(i);
     if (input ready for reading)
       processInputs();
     if (serial ready for whatever)
       processSerial();
     processMp3Decoder();
  }

If you set the PCM device to non-blocking mode, you do not need to call
avail_update before writing; just try to write as much as you currently
have.

If you want to do something regularly, use the timeout of poll(), or
use a timerfd.

You mentioned threads; these are not directly supported with poll()
because they do not have a file handle, but if you want to wake up the
main loop, you can write to an eventfd or to a pipe created with pipe().


Regards,
Clemens


More information about the Alsa-devel mailing list