Re: Async behavior and -EAGAIN on write?

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

 



>> For playback I am using the ALSA callback to wake up a thread that
>> then feeds the ALSA ring buffer with a period-worth of samples using
>> snd_pcm_writei(). I've set snd_pcm_sw_params_set_avail_min() to one
>> period. The problem is that most of the time when my thread wakes up
>> and tries to write the data, snd_pcm_writei() fails with -EAGAIN, and
>> I must retry until it works.
>>
>> Presumably this write failure is because there is not enough space in
>> the ring buffer, but then why did the ALSA callback fire in the first
>> place? As it stands my retries are eating needless amounts of CPU.

> No definitive help.  I don't know the internals, but I have a guess.  It
> probably leads the
> amount so that on busy systems, underruns don't occur.   You could try
> setting it to 2 buffer
> min and still writing only a single buffer.  That way, you have a buffer of
> slack.

It seems to make no difference what snd_pcm_sw_set_avail_min() value I
use. I tried setting it from twice to many times the period size. I
still get ALSA callbacks very often. When I check available space at
each callback invocation using snd_pcm_avail_update(), I almost always
get much less than this setting. Indeed most usually much less than a
single period size.

> You might have better luck trying this on the alsa-devel list.  The
> developers live there and they
> know the internals.  It is possible they will answer.

Good idea. I am cross-posting this email. (Hopefully to no-one's annoyance...)

> I went and looked at the function you are using.
> (snip)
> Are you using a buffer size compatible with your card.  It is possible it is
> using the closest one and that is less than the buffer size you have
> defined.  Just a thought.

To set buffer sizes, I am using set_buffer/period_time_near() and
taking whatever the card gives me - I read them back with the get
functions. One weird thing I noticed is that my card  give me a period
size of 470 frames *always*, regardless of whatever desired buffer and
period time I ask for. I don't think this issue is related to the
async behavior weirdness though.

Thanks for your help.

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Alsa-user mailing list
Alsa-user@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/alsa-user

[Index of Archives]     [ALSA Devel]     [Linux Audio Users]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]

  Powered by Linux