[alsa-devel] What does snd_pcm_delay() actually return?
Takashi Iwai
tiwai at suse.de
Fri Jun 13 17:42:54 CEST 2008
At Fri, 13 Jun 2008 17:02:47 +0200 (CEST),
Jaroslav Kysela wrote:
>
> On Fri, 13 Jun 2008, Lennart Poettering wrote:
>
> > On Fri, 13.06.08 15:06, Jaroslav Kysela (perex at perex.cz) wrote:
> >
> > > The comment for snd_pcm_delay() in alsa-lib is clear and it's what James
> > > wrote. If only one app interprets this wrongly, then I agree it would be
> > > better not to change original meaning.
> > >
> > > Then we have snd_pcm_avail_update(). Although it is stated in comment that
> > > this function is useless for non-mmap mode, it's quite clear that returns
> > > number of available frames to be handled (r/w) by application.
> > >
> > > The easiest method would be just to remove "useless for non-mmap" from
> > > comments for snd_pcm_avail_update() and suggest to application developers:
> > >
> > > 1) overall latency is returned by snd_pcm_delay()
> > > 2) ring buffer filling is controlled by snd_pcm_avail_update(), for
> > > non-mmap access is usage of this function optional
> > >
> > > As mentioned, it will need to fix some drivers mixing software output FIFO
> > > with ring buffer (USB, PCMCIA)..
> > >
> > > Opinions?
> >
> > Sounds good to me, on first sight.
> >
> > Hmm, however, there is one thing I'd still need for PulseAudio:
> >
> > I'd like to know when (in time units) the playback buffer would
> > underrun from now on if I don't write anything anymore. For the USB
> > driver at least this happens much earlier than just calculating
> > (buffer_size - snd_pcm_avail_update()) and transforming that into time
> > units, because the USB driver seems to remove a block at a time from
> > the playback buffer, and hence it will signal the XRUN much earlier
> > then the aforementioned value. To fix this I'd need to know what this
> > granularity is. If I knew that I could fix my sleep time accordingly.
> >
> > In short: I need some kind of granularity information about
> > snd_pcm_avail_update() but I must admit that right now I am not
> > actually sure which parameter would be the best one to know about.
>
> I think that USB drivers should be fixed using a software FIFO. It means
> that the ring buffer will be fully maintainable (and underrun occurs
> correctly then).
>
> It means adding extra URBs to which will be copied data. They will work as
> "extra" FIFO counted in snd_pcm_delay() but not counted in
> snd_pcm_avail_update(). If I look to USB code correctly, it's just about
> to change hw_ptr management. Data are copied to URBs anyway.
Hmm... I don't buy this.
First off, it's not only about USB but for hardwares that require the
own h/w queue. There bunch of such hardwares, and we provide really
poor support for them. The above sounds like bandaiding on a bandaid
over a bandaid.
Well, now I continue to discuss in another post, following Lennart's
reply.
Takashi
More information about the Alsa-devel
mailing list