[alsa-devel] Trying to understand alsa

Jonathan Andrews jon at jonshouse.co.uk
Fri Jan 13 00:36:52 CET 2012


On Thu, 2012-01-12 at 21:50 +0000, Fons Adriaensen wrote:
> On Thu, Jan 12, 2012 at 09:44:11PM +0000, Jonathan Andrews wrote:
>  
> > What I want to do is tell ALSA to hold a buffer of 3 of my packets (3 x
> > 1024Bytes, thats 512 x 16 bit samples) while I feed extra packets (1K
> > Byte, 512 samples per buffer) in for playback.  The packets are arriving
> > at roughly the correct rate, I just need a buffer to  iron out any
> > jitter in network transmit, do I have to do this myself ?
> 
> Unless data is arriving on average at *exactly* the sample
> rate of the ALSA device your buffering will sooner or later
> underrun or overrun. ALSA itself can't handle this use case,
> it requires adaptive resampling and it's not easy.

I'm assuming alsa is holding 3k bytes for me and im writing 1k byte
chunks, so if the audio has not been refreshed by 3 chunks (70ms) then I
should throw it away as its no longer 'real time'

At the moment i would happy just to throw away packets that would cause
an overrun. I just wish i could convince alsa to buffer for me .... ho
hum ...

with pulse I just did this to set up 'some sort of buffer length' with
'some sort of pre buffering before play' interval.  Its a bit hacky at
the moment but seems to work.

    pa_buffer_attr  paattr;
    int buflen=sizeof(audio);
    paattr.tlength = buflen * 4;                                                                // Playback only, target length of the buffer (was *2)
    paattr.minreq = buflen;
    paattr.fragsize = buflen;
    paattr.prebuf = buflen * 6;                                                                 // How much data pulse holds before it starts playing (was *4)
    paattr.maxlength = buflen * 8;                                                              // playback pipeline N samples deep (was *4)

Im looking for alsa equivalent. 

Thanks,
Jon






More information about the Alsa-devel mailing list