rec->filled = 0;
 }
 
-static int write_out_pending(snd_pcm_ioplug_t *io ATTRIBUTE_UNUSED,
-                            struct a52_ctx *rec)
+static int write_out_pending(snd_pcm_ioplug_t *io, struct a52_ctx *rec)
 {
        int err, ofs = 0;
 
 
        while (rec->remain) {
                err = snd_pcm_writei(rec->slave, rec->outbuf + ofs, rec->remain);
-               if (err < 0)
+               if (err < 0) {
+                       if (err == -EPIPE)
+                               io->state = SND_PCM_STATE_XRUN;
                        return err;
-               else if (! err)
+               } else if (! err)
                        break;
                if (err < rec->remain)
                        ofs += (rec->remain - err) * 4;
        int err;
 
        state = snd_pcm_state(rec->slave);
-       if (state == SND_PCM_STATE_RUNNING ||
-           state == SND_PCM_STATE_DRAINING) {
+       switch (state) {
+       case SND_PCM_STATE_RUNNING:
+       case SND_PCM_STATE_DRAINING:
                if ((err = snd_pcm_delay(rec->slave, &delay)) < 0)
                        return err;
-       } else
+               break;
+       case SND_PCM_STATE_XRUN:
+               return -EPIPE;
+       default:
                return 0;
+       }
 
        if (delay < 0 || delay >= (snd_pcm_sframes_t)rec->slave_buffer_size)
                delay = 0;