P_STATE(DRAINING))
/* check whether the PCM is in the unexpected state */
-static int bad_pcm_state(snd_pcm_t *pcm, unsigned int supported_states)
+static int bad_pcm_state(snd_pcm_t *pcm, unsigned int supported_states,
+ unsigned int noop_states)
{
snd_pcm_state_t state;
int err;
if (pcm->own_state_check)
return 0; /* don't care, the plugin checks by itself */
state = snd_pcm_state(pcm);
+ if (noop_states & (1U << state))
+ return 1; /* OK, return immediately */
if (supported_states & (1U << state))
return 0; /* OK */
err = pcm_state_to_error(state);
SNDMSG("PCM not set up");
return -EIO;
}
- err = bad_pcm_state(pcm, ~P_STATE(DISCONNECTED));
+ err = bad_pcm_state(pcm, ~P_STATE(DISCONNECTED), 0);
if (err < 0)
return err;
snd_pcm_lock(pcm->fast_op_arg);
SNDMSG("PCM not set up");
return -EIO;
}
- err = bad_pcm_state(pcm, P_STATE(PREPARED));
+ err = bad_pcm_state(pcm, P_STATE(PREPARED), 0);
if (err < 0)
return err;
snd_pcm_lock(pcm->fast_op_arg);
return -EIO;
}
err = bad_pcm_state(pcm, P_STATE_RUNNABLE | P_STATE(SETUP) |
- P_STATE(SUSPENDED));
+ P_STATE(SUSPENDED), 0);
if (err < 0)
return err;
snd_pcm_lock(pcm->fast_op_arg);
SNDMSG("PCM not set up");
return -EIO;
}
- err = bad_pcm_state(pcm, P_STATE_RUNNABLE | P_STATE(SETUP));
+ err = bad_pcm_state(pcm, P_STATE_RUNNABLE | P_STATE(SETUP), P_STATE(SETUP));
if (err < 0)
return err;
+ if (err == 1)
+ return 0;
/* lock handled in the callback */
if (pcm->fast_ops->drain)
err = pcm->fast_ops->drain(pcm->fast_op_arg);
SNDMSG("PCM not set up");
return -EIO;
}
- err = bad_pcm_state(pcm, P_STATE_RUNNABLE);
+ err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
if (err < 0)
return err;
snd_pcm_lock(pcm->fast_op_arg);
SNDMSG("PCM not set up");
return -EIO;
}
- err = bad_pcm_state(pcm, P_STATE_RUNNABLE);
+ err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
if (err < 0)
return err;
snd_pcm_lock(pcm->fast_op_arg);
}
if (frames == 0)
return 0;
- err = bad_pcm_state(pcm, P_STATE_RUNNABLE);
+ err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
if (err < 0)
return err;
snd_pcm_lock(pcm->fast_op_arg);
SNDMSG("PCM not set up");
return -EIO;
}
- err = bad_pcm_state(pcm, P_STATE_RUNNABLE);
+ err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
if (err < 0)
return err;
snd_pcm_lock(pcm->fast_op_arg);
}
if (frames == 0)
return 0;
- err = bad_pcm_state(pcm, P_STATE_RUNNABLE);
+ err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
if (err < 0)
return err;
snd_pcm_lock(pcm->fast_op_arg);
SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access));
return -EINVAL;
}
- err = bad_pcm_state(pcm, P_STATE_RUNNABLE);
+ err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
if (err < 0)
return err;
return _snd_pcm_writei(pcm, buffer, size);
SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access));
return -EINVAL;
}
- err = bad_pcm_state(pcm, P_STATE_RUNNABLE);
+ err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
if (err < 0)
return err;
return _snd_pcm_writen(pcm, bufs, size);
SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access));
return -EINVAL;
}
- err = bad_pcm_state(pcm, P_STATE_RUNNABLE);
+ err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
if (err < 0)
return err;
return _snd_pcm_readi(pcm, buffer, size);
SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access));
return -EINVAL;
}
- err = bad_pcm_state(pcm, P_STATE_RUNNABLE);
+ err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
if (err < 0)
return err;
return _snd_pcm_readn(pcm, bufs, size);
{
int err;
- err = bad_pcm_state(pcm, P_STATE_RUNNABLE);
+ err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
if (err < 0)
return err;
snd_pcm_lock(pcm->fast_op_arg);
snd_pcm_sframes_t result;
int err;
- err = bad_pcm_state(pcm, P_STATE_RUNNABLE);
+ err = bad_pcm_state(pcm, P_STATE_RUNNABLE, 0);
if (err < 0)
return err;
snd_pcm_lock(pcm->fast_op_arg);