[alsa-devel] Disabling buffer fill level preprocessing by ALSA

James Courtier-Dutton James at superbug.co.uk
Mon Jan 7 23:34:32 CET 2008

Lennart Poettering wrote:
> On Mon, 07.01.08 18:55, James Courtier-Dutton (James at superbug.co.uk) wrote:
>> Lennart Poettering wrote:
>>> Hi!
>>> In PulseAudio I want to schedule on my own when I need to write audio
>>> data into the device and when not. To achieve that I want to be
>>> notified via poll() whenever a period boundary is passed (i.e. when an
>>> IRQ happens), but only then. That's different from the usual mode
>>> where you are notified via poll() whether there is space in the
>>> playback buffer that needs to be filled up. 
>>> On OSS the mmap() mode enables a mode like I described above. After
>>> enabling mmap() the application can decide by itself what it considers
>>> full and what empty in the dma buffer, and use GETOPTR to query the
>>> playback position. poll() on the OSS fd will directly reflect the
>>> sound card IRQs and is not influenced if you ever wrote data to device
>>> or not.
>>> I assume that I can enable a mode like that with one of the SW
>>> params. But quite frankly the docs for it are not enlighening at all.
>>> Lennart
>> What would you want to do that for? Surely you just want to be told "I
>> need X samples now please", and that is what the current alsa
>> poll/callback method does.
> Not so "surely". In PA I want to schedule the wakeup frequency
> dynamically, based on the strongest requirement of all conncteded
> clients. To achieve that configure ALSA to use a large (2s) hw
> playback buffer, and then want to disable sound cards interrupts
> (except for time keeping), and schedule everything with system
> timers. Because those I can reconfigure without having to fully reset
> the audio device, and thus without getting any drop outs.
> In effect, as long as the user just plays an MP3 or so, the system
> will wakeup only every 2s or so and I will make use of the full hw
> playback buffer I previously configured, and thus save power. However
> as soon as a VoIP application connects which has stronger latency
> requirements I set my wakeups (with system timers) more often and only
> use a smaller part of the large hw audio buffer.
> Since ALSA doesn't allow me to reconfigure the the audio interrupt
> frequency dynamically during playback without having to reset the
> device I use those system timers. And because I do use those, I don't
> have much use for the buffer fill level management of ALSA -- because
> it is almost always wrong, because it doesn't know anything about my
> current latency constraints. 
> Now, with setting snd_pcm_sw_params_set_avail_min() to something
> perversly huge I can make sure that ALSA never wakes me up. However,
> that also has the effect that I can no longer user the sound card IRQ
> for getting the most accurate timing information from the sound card.
> Which sucks.
> I only want to use notification via poll() for keeping time, I don't
> want ALSA's buffer management. 
> Lennart

Are you going to be at FOMS. It might be easier to explain to you there.
You are making assumptions about sound cards that might be wrong. E.g. 
2secs hw buffer for instance.

More information about the Alsa-devel mailing list