* enter xrun or suspended state, if slave xrun occurred or suspended
* @return: 0 for no xrun/suspend or a negative error code for xrun/suspend
*/
-int snd_pcm_direct_client_chk_xrun(snd_pcm_direct_t *direct, snd_pcm_t *pcm)
+int snd_pcm_direct_check_xrun(snd_pcm_direct_t *direct, snd_pcm_t *pcm)
{
+ int err;
+
+ switch (snd_pcm_state(direct->spcm)) {
+ case SND_PCM_STATE_DISCONNECTED:
+ direct->state = SNDRV_PCM_STATE_DISCONNECTED;
+ return -ENODEV;
+ case SND_PCM_STATE_XRUN:
+ case SND_PCM_STATE_SUSPENDED:
+ if ((err = snd_pcm_direct_slave_recover(direct)) < 0)
+ return err;
+ break;
+ default:
+ break;
+ }
+
if (direct->state == SND_PCM_STATE_XRUN)
return -EPIPE;
else if (direct->state == SND_PCM_STATE_SUSPENDED)
}
empty = avail < pcm->avail_min;
}
- switch (snd_pcm_state(dmix->spcm)) {
- case SND_PCM_STATE_XRUN:
- case SND_PCM_STATE_SUSPENDED:
- /* recover slave and update client state to xrun
- * before returning POLLERR
- */
- snd_pcm_direct_slave_recover(dmix);
- snd_pcm_direct_client_chk_xrun(dmix, pcm);
- /* fallthrough */
- case SND_PCM_STATE_SETUP:
+
+ if (snd_pcm_direct_check_xrun(dmix, pcm) < 0 ||
+ snd_pcm_state(dmix->spcm) == SND_PCM_STATE_SETUP) {
events |= POLLERR;
- break;
- default:
+ } else {
if (empty) {
/* here we have a race condition:
* if period event arrived after the avail_update call
break;
}
}
- break;
}
*revents = events;
return 0;
snd_pcm_chmap_t *snd_pcm_direct_get_chmap(snd_pcm_t *pcm);
int snd_pcm_direct_set_chmap(snd_pcm_t *pcm, const snd_pcm_chmap_t *map);
int snd_pcm_direct_slave_recover(snd_pcm_direct_t *direct);
-int snd_pcm_direct_client_chk_xrun(snd_pcm_direct_t *direct, snd_pcm_t *pcm);
+int snd_pcm_direct_check_xrun(snd_pcm_direct_t *direct, snd_pcm_t *pcm);
int snd_timer_async(snd_timer_t *timer, int sig, pid_t pid);
struct timespec snd_pcm_hw_fast_tstamp(snd_pcm_t *pcm);
void snd_pcm_direct_reset_slave_ptr(snd_pcm_t *pcm, snd_pcm_direct_t *dmix);
snd_pcm_direct_t *dmix = pcm->private_data;
int err;
- switch (snd_pcm_state(dmix->spcm)) {
- case SND_PCM_STATE_DISCONNECTED:
- dmix->state = SND_PCM_STATE_DISCONNECTED;
- return -ENODEV;
- case SND_PCM_STATE_XRUN:
- case SND_PCM_STATE_SUSPENDED:
- if ((err = snd_pcm_direct_slave_recover(dmix)) < 0)
- return err;
- break;
- default:
- break;
- }
- err = snd_pcm_direct_client_chk_xrun(dmix, pcm);
+ err = snd_pcm_direct_check_xrun(dmix, pcm);
if (err < 0)
return err;
if (dmix->slowptr)
static snd_pcm_state_t snd_pcm_dmix_state(snd_pcm_t *pcm)
{
snd_pcm_direct_t *dmix = pcm->private_data;
- int err;
- snd_pcm_state_t state;
- state = snd_pcm_state(dmix->spcm);
- switch (state) {
- case SND_PCM_STATE_DISCONNECTED:
- dmix->state = state;
- return state;
- case SND_PCM_STATE_XRUN:
- case SND_PCM_STATE_SUSPENDED:
- if ((err = snd_pcm_direct_slave_recover(dmix)) < 0)
- return err;
- break;
- default:
- break;
- }
- snd_pcm_direct_client_chk_xrun(dmix, pcm);
+
+ snd_pcm_direct_check_xrun(dmix, pcm);
if (dmix->state == STATE_RUN_PENDING)
return SNDRV_PCM_STATE_RUNNING;
return dmix->state;
snd_pcm_direct_t *dmix = pcm->private_data;
int err;
- switch (snd_pcm_state(dmix->spcm)) {
- case SND_PCM_STATE_XRUN:
- case SND_PCM_STATE_SUSPENDED:
- if ((err = snd_pcm_direct_slave_recover(dmix)) < 0)
- return err;
- break;
- default:
- break;
- }
- err = snd_pcm_direct_client_chk_xrun(dmix, pcm);
+ err = snd_pcm_direct_check_xrun(dmix, pcm);
if (err < 0)
return err;
if (! size)
snd_pcm_direct_t *dshare = pcm->private_data;
int err;
- switch (snd_pcm_state(dshare->spcm)) {
- case SND_PCM_STATE_DISCONNECTED:
- dshare->state = SNDRV_PCM_STATE_DISCONNECTED;
- return -ENODEV;
- case SND_PCM_STATE_XRUN:
- case SND_PCM_STATE_SUSPENDED:
- if ((err = snd_pcm_direct_slave_recover(dshare)) < 0)
- return err;
- break;
- default:
- break;
- }
- err = snd_pcm_direct_client_chk_xrun(dshare, pcm);
+ err = snd_pcm_direct_check_xrun(dshare, pcm);
if (err < 0)
return err;
if (dshare->slowptr)
static snd_pcm_state_t snd_pcm_dshare_state(snd_pcm_t *pcm)
{
snd_pcm_direct_t *dshare = pcm->private_data;
- int err;
- snd_pcm_state_t state;
- state = snd_pcm_state(dshare->spcm);
- switch (state) {
- case SND_PCM_STATE_DISCONNECTED:
- dshare->state = state;
- return state;
- case SND_PCM_STATE_XRUN:
- case SND_PCM_STATE_SUSPENDED:
- if ((err = snd_pcm_direct_slave_recover(dshare)) < 0)
- return err;
- break;
- default:
- break;
- }
- snd_pcm_direct_client_chk_xrun(dshare, pcm);
+
+ snd_pcm_direct_check_xrun(dshare, pcm);
if (dshare->state == STATE_RUN_PENDING)
return SNDRV_PCM_STATE_RUNNING;
return dshare->state;
snd_pcm_direct_t *dshare = pcm->private_data;
int err;
- switch (snd_pcm_state(dshare->spcm)) {
- case SND_PCM_STATE_XRUN:
- case SND_PCM_STATE_SUSPENDED:
- if ((err = snd_pcm_direct_slave_recover(dshare)) < 0)
- return err;
- break;
- default:
- break;
- }
- err = snd_pcm_direct_client_chk_xrun(dshare, pcm);
+ err = snd_pcm_direct_check_xrun(dshare, pcm);
if (err < 0)
return err;
if (! size)
snd_pcm_sframes_t diff;
int err;
- switch (snd_pcm_state(dsnoop->spcm)) {
- case SND_PCM_STATE_DISCONNECTED:
- dsnoop->state = SNDRV_PCM_STATE_DISCONNECTED;
- return -ENODEV;
- case SND_PCM_STATE_XRUN:
- case SND_PCM_STATE_SUSPENDED:
- if ((err = snd_pcm_direct_slave_recover(dsnoop)) < 0)
- return err;
- break;
- default:
- break;
- }
- err = snd_pcm_direct_client_chk_xrun(dsnoop, pcm);
+ err = snd_pcm_direct_check_xrun(dsnoop, pcm);
if (err < 0)
return err;
if (dsnoop->slowptr)
static snd_pcm_state_t snd_pcm_dsnoop_state(snd_pcm_t *pcm)
{
snd_pcm_direct_t *dsnoop = pcm->private_data;
- int err;
- snd_pcm_state_t state;
- state = snd_pcm_state(dsnoop->spcm);
- switch (state) {
- case SND_PCM_STATE_DISCONNECTED:
- dsnoop->state = state;
- return state;
- case SND_PCM_STATE_XRUN:
- case SND_PCM_STATE_SUSPENDED:
- if ((err = snd_pcm_direct_slave_recover(dsnoop)) < 0)
- return err;
- break;
- default:
- break;
- }
- snd_pcm_direct_client_chk_xrun(dsnoop, pcm);
+
+ snd_pcm_direct_check_xrun(dsnoop, pcm);
return dsnoop->state;
}
snd_pcm_direct_t *dsnoop = pcm->private_data;
int err;
- switch (snd_pcm_state(dsnoop->spcm)) {
- case SND_PCM_STATE_XRUN:
- case SND_PCM_STATE_SUSPENDED:
- if ((err = snd_pcm_direct_slave_recover(dsnoop)) < 0)
- return err;
- break;
- default:
- break;
- }
- err = snd_pcm_direct_client_chk_xrun(dsnoop, pcm);
+ err = snd_pcm_direct_check_xrun(dsnoop, pcm);
if (err < 0)
return err;
if (dsnoop->state == SND_PCM_STATE_RUNNING) {