[pulseaudio-discuss] Latency of pa_stream_flush
Tanu Kaskinen
tanu.kaskinen at linux.intel.com
Tue Jul 16 06:28:15 PDT 2013
On Tue, 2013-07-16 at 14:41 +0300, Tanu Kaskinen wrote:
> On Tue, 2013-07-16 at 12:26 +0200, Magnus Hjorth wrote:
> > Hi list,
> >
> > While I was working a little on the PulseAudio support in my sound file
> > editor, I noticed something a bit funny. It seems that disconnecting a
> > playback stream and then reconnecting it again gives much lower latency
> > for me than either calling pa_stream_flush on the stream or calling
> > pa_stream_write with PA_SEEK_RELATIVE_ON_READ. The two latter methods
> > seem to be dependent on which latency is configured for the stream,
> > while disconnecting seems to be independent of this.
> >
> > I made a little test program to demonstrate. With it, you can test the
> > different methods by pressing the number keys. Source is here:
> > http://codepad.org/BjWZOgx1
> >
> > What I'm using this for is when playing back sound and the user wants to
> > jump to another part of the file in the middle of playback. I just want
> > to stop the current playback and start the new as quickly as possible.
> > For this use case I also don't care or need to know exactly where the
> > old playback stops and it's also acceptable with a little gap/silence
> > between the old and new sound.
> >
> > I can understand the relative_on_read method has an implicit guarantee
> > of gaplessness since you (from the client's point of view) overwrite in
> > the middle of a buffer to which you have already written, but I don't
> > see why pa_stream_flush has to provide such a guarantee. I would rather
> > expect the flush function to provide the fastest possible method of
> > flushing, which it doesn't seem to do.
> >
> > Is this intended behavior of pa_stream_flush? If so, would it be
> > possible to add another call "pa_stream_reset" or such that does the
> > equivalent of disconnect + connect?
>
> The documentation of pa_stream_flush() says: "Flush the playback buffer
> of this stream." That's indeed everything that pa_stream_flush() does,
> it doesn't touch the sink buffer (which is what creating a new stream
> does). So, any audio that has already moved from the stream buffer to
> the sink buffer will play before any new audio that you write after the
> flush.
>
> It would probably make sense to rewrite the sink buffer on stream flush.
> This would achieve the same latency as creating a new stream.
You could also try PA_SEEK_ABSOLUTE. If you give 0 as the offset,
meaning that you try to return to the very beginning of the stream
(which is of course impossible), I guess the result will be that the
sink buffer gets rewound as much as possible.
--
Tanu
More information about the pulseaudio-discuss
mailing list