pcm: fix snd_pcm_avail_delay() function
authorJaroslav Kysela <perex@perex.cz>
Thu, 18 Nov 2010 08:27:07 +0000 (09:27 +0100)
committerJaroslav Kysela <perex@perex.cz>
Thu, 18 Nov 2010 08:27:07 +0000 (09:27 +0100)
For capture stream, the delay must be obtained as last, but we need to
update the ring buffer pointers for the avail_update call. So, rearrange
the code a bit and add hwsync call as first.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>

src/pcm/pcm.c

index f378779..7409943 100644 (file)
@@ -2470,18 +2470,22 @@ int snd_pcm_avail_delay(snd_pcm_t *pcm,
                        snd_pcm_sframes_t *delayp)
 {
        snd_pcm_sframes_t sf;
+       int err;
 
        assert(pcm && availp && delayp);
        if (CHECK_SANITY(! pcm->setup)) {
                SNDMSG("PCM not set up");
                return -EIO;
        }
-       sf = pcm->fast_ops->delay(pcm->fast_op_arg, delayp);
-       if (sf < 0)
-               return (int)sf;
+       err = pcm->fast_ops->hwsync(pcm->fast_op_arg);
+       if (err < 0)
+               return err;
        sf = pcm->fast_ops->avail_update(pcm->fast_op_arg);
        if (sf < 0)
                return (int)sf;
+       err = pcm->fast_ops->delay(pcm->fast_op_arg, delayp);
+       if (err < 0)
+               return err;
        *availp = sf;
        return 0;
 }