diff options
-rw-r--r-- | include/tinyalsa/asoundlib.h | 9 | ||||
-rw-r--r-- | pcm.c | 6 |
2 files changed, 14 insertions, 1 deletions
diff --git a/include/tinyalsa/asoundlib.h b/include/tinyalsa/asoundlib.h index 704354e..e65403e 100644 --- a/include/tinyalsa/asoundlib.h +++ b/include/tinyalsa/asoundlib.h @@ -45,6 +45,15 @@ struct pcm; #define PCM_IN 0x10000000 #define PCM_MMAP 0x00000001 #define PCM_NOIRQ 0x00000002 +#define PCM_NORESTART 0x00000004 /* PCM_NORESTART - when set, calls to + * pcm_write for a playback stream will not + * attempt to restart the stream in the case + * of an underflow, but will return -EPIPE + * instead. After the first -EPIPE error, the + * stream is considered to be stopped, and a + * second call to pcm_write will attempt to + * restart the stream. + */ /* PCM runtime states */ #define PCM_STATE_OPEN 0 @@ -378,8 +378,12 @@ int pcm_write(struct pcm *pcm, const void *data, unsigned int count) if (ioctl(pcm->fd, SNDRV_PCM_IOCTL_WRITEI_FRAMES, &x)) { pcm->running = 0; if (errno == EPIPE) { - /* we failed to make our window -- try to restart */ + /* we failed to make our window -- try to restart if we are + * allowed to do so. Otherwise, simply allow the EPIPE error to + * propagate up to the app level */ pcm->underruns++; + if (pcm->flags & PCM_NORESTART) + return -EPIPE; continue; } return oops(pcm, errno, "cannot write stream data"); |