]> git.alsa-project.org Git - alsa-lib.git/commitdiff
rate: handle negative values from snd_pcm_mmap_playback_hw_avail
authorAlexander E. Patrakov <patrakov@gmail.com>
Sat, 13 Sep 2014 18:30:18 +0000 (00:30 +0600)
committerJaroslav Kysela <perex@perex.cz>
Sat, 13 Sep 2014 19:05:04 +0000 (21:05 +0200)
Such negative returns are possible during an underrun if xrun detection
is disabled.

So, don't store the result in an unsigned variable (where it will
overflow), and postpone the trigger in such case, too.

Signed-off-by: Alexander E. Patrakov <patrakov@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/pcm/pcm_rate.c

index b436a8ea65bac4ed1ace33a34e6d709c1a1fea77..736d5583cd4c5206ddf1deba599f0c3c38577d2a 100644 (file)
@@ -1058,7 +1058,7 @@ static snd_pcm_state_t snd_pcm_rate_state(snd_pcm_t *pcm)
 static int snd_pcm_rate_start(snd_pcm_t *pcm)
 {
        snd_pcm_rate_t *rate = pcm->private_data;
-       snd_pcm_uframes_t avail;
+       snd_pcm_sframes_t avail;
                
        if (pcm->stream == SND_PCM_STREAM_CAPTURE)
                return snd_pcm_start(rate->gen.slave);
@@ -1069,7 +1069,7 @@ static int snd_pcm_rate_start(snd_pcm_t *pcm)
        gettimestamp(&rate->trigger_tstamp, pcm->tstamp_type);
 
        avail = snd_pcm_mmap_playback_hw_avail(rate->gen.slave);
-       if (avail == 0) {
+       if (avail <= 0) {
                /* postpone the trigger since we have no data committed yet */
                rate->start_pending = 1;
                return 0;