/*
* enter xrun state, if slave xrun occurred
- * @return: 0 - no xrun >0: xrun happened
+ * @return: 0 for no xrun or a negative error code for xrun
*/
int snd_pcm_direct_client_chk_xrun(snd_pcm_direct_t *direct, snd_pcm_t *pcm)
{
* snd_pcm_direct_clear_timer_queue(direct);
*/
direct->state = SND_PCM_STATE_XRUN;
- return 1;
}
+ if (direct->state == SND_PCM_STATE_XRUN)
+ return -EPIPE;
return 0;
}
default:
break;
}
- if (snd_pcm_direct_client_chk_xrun(dmix, pcm))
- return -EPIPE;
+ err = snd_pcm_direct_client_chk_xrun(dmix, pcm);
+ if (err < 0)
+ return err;
if (dmix->slowptr)
snd_pcm_hwsync(dmix->spcm);
default:
break;
}
- if (snd_pcm_direct_client_chk_xrun(dmix, pcm))
- return -EPIPE;
+ err = snd_pcm_direct_client_chk_xrun(dmix, pcm);
+ if (err < 0)
+ return err;
if (! size)
return 0;
snd_pcm_mmap_appl_forward(pcm, size);
default:
break;
}
- if (snd_pcm_direct_client_chk_xrun(dshare, pcm))
- return -EPIPE;
+ err = snd_pcm_direct_client_chk_xrun(dshare, pcm);
+ if (err < 0)
+ return err;
if (dshare->slowptr)
snd_pcm_hwsync(dshare->spcm);
default:
break;
}
- if (snd_pcm_direct_client_chk_xrun(dshare, pcm))
- return -EPIPE;
+ err = snd_pcm_direct_client_chk_xrun(dshare, pcm);
+ if (err < 0)
+ return err;
if (! size)
return 0;
snd_pcm_mmap_appl_forward(pcm, size);
default:
break;
}
- if (snd_pcm_direct_client_chk_xrun(dsnoop, pcm))
- return -EPIPE;
+ err = snd_pcm_direct_client_chk_xrun(dsnoop, pcm);
+ if (err < 0)
+ return err;
if (dsnoop->slowptr)
snd_pcm_hwsync(dsnoop->spcm);
old_slave_hw_ptr = dsnoop->slave_hw_ptr;
default:
break;
}
- if (snd_pcm_direct_client_chk_xrun(dsnoop, pcm))
- return -EPIPE;
+ err = snd_pcm_direct_client_chk_xrun(dsnoop, pcm);
+ if (err < 0)
+ return err;
if (dsnoop->state == SND_PCM_STATE_RUNNING) {
err = snd_pcm_dsnoop_sync_ptr(pcm);
if (err < 0)