Change error message handling

Change the handling of non-fatal errors.  Now the non-fatal error
messages are not shown in stderr and no assert() as default.  The
behavior can be changed with LIBASOUND_DEBUG environment variable.
This commit is contained in:
Takashi Iwai 2004-12-21 14:11:00 +00:00
parent 73aa2549d9
commit 2b54677fdb
9 changed files with 462 additions and 165 deletions

View file

@ -797,7 +797,8 @@ int snd_pcm_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params)
int snd_pcm_hw_free(snd_pcm_t *pcm)
{
int err;
assert(pcm->setup);
if (! pcm->setup)
return 0;
if (pcm->mmap_channels) {
err = snd_pcm_munmap(pcm);
if (err < 0)
@ -820,17 +821,21 @@ int snd_pcm_hw_free(snd_pcm_t *pcm)
int snd_pcm_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t *params)
{
int err;
assert(pcm->setup); /* the hw_params must be set at first!!! */
/* the hw_params must be set at first!!! */
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
if (! params->avail_min || ! params->xfer_align)
return -EINVAL;
if (params->start_threshold <= pcm->buffer_size &&
params->start_threshold > (pcm->buffer_size / params->avail_min) * params->avail_min) {
SNDERR("snd_pcm_sw_params: params->avail_min problem for start_threshold");
SNDMSG("params->avail_min problem for start_threshold");
return -EINVAL;
}
if (params->start_threshold <= pcm->buffer_size &&
params->start_threshold > (pcm->buffer_size / params->xfer_align) * params->xfer_align) {
SNDERR("snd_pcm_sw_params: params->xfer_align problem for start_threshold");
SNDMSG("params->xfer_align problem for start_threshold");
return -EINVAL;
}
err = pcm->ops->sw_params(pcm->op_arg, params);
@ -887,7 +892,10 @@ snd_pcm_state_t snd_pcm_state(snd_pcm_t *pcm)
int snd_pcm_hwsync(snd_pcm_t *pcm)
{
assert(pcm);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
return pcm->fast_ops->hwsync(pcm->fast_op_arg);
}
@ -910,7 +918,10 @@ int snd_pcm_hwsync(snd_pcm_t *pcm)
int snd_pcm_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
{
assert(pcm);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
return pcm->fast_ops->delay(pcm->fast_op_arg, delayp);
}
@ -929,7 +940,10 @@ int snd_pcm_delay(snd_pcm_t *pcm, snd_pcm_sframes_t *delayp)
int snd_pcm_resume(snd_pcm_t *pcm)
{
assert(pcm);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
return pcm->fast_ops->resume(pcm->fast_op_arg);
}
@ -941,7 +955,10 @@ int snd_pcm_resume(snd_pcm_t *pcm)
int snd_pcm_prepare(snd_pcm_t *pcm)
{
assert(pcm);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
return pcm->fast_ops->prepare(pcm->fast_op_arg);
}
@ -955,7 +972,10 @@ int snd_pcm_prepare(snd_pcm_t *pcm)
int snd_pcm_reset(snd_pcm_t *pcm)
{
assert(pcm);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
return pcm->fast_ops->reset(pcm->fast_op_arg);
}
@ -967,7 +987,10 @@ int snd_pcm_reset(snd_pcm_t *pcm)
int snd_pcm_start(snd_pcm_t *pcm)
{
assert(pcm);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
return pcm->fast_ops->start(pcm->fast_op_arg);
}
@ -985,7 +1008,10 @@ int snd_pcm_start(snd_pcm_t *pcm)
int snd_pcm_drop(snd_pcm_t *pcm)
{
assert(pcm);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
return pcm->fast_ops->drop(pcm->fast_op_arg);
}
@ -1005,7 +1031,10 @@ int snd_pcm_drop(snd_pcm_t *pcm)
int snd_pcm_drain(snd_pcm_t *pcm)
{
assert(pcm);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
return pcm->fast_ops->drain(pcm->fast_op_arg);
}
@ -1022,7 +1051,10 @@ int snd_pcm_drain(snd_pcm_t *pcm)
int snd_pcm_pause(snd_pcm_t *pcm, int enable)
{
assert(pcm);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
return pcm->fast_ops->pause(pcm->fast_op_arg, enable);
}
@ -1036,8 +1068,12 @@ int snd_pcm_pause(snd_pcm_t *pcm, int enable)
snd_pcm_sframes_t snd_pcm_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
{
assert(pcm);
assert(pcm->setup);
assert(frames > 0);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
if (frames == 0)
return 0;
return pcm->fast_ops->rewind(pcm->fast_op_arg, frames);
}
@ -1055,8 +1091,12 @@ snd_pcm_sframes_t snd_pcm_forward(snd_pcm_t *pcm, snd_pcm_uframes_t frames)
#endif
{
assert(pcm);
assert(pcm->setup);
assert(frames > 0);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
if (frames == 0)
return 0;
return pcm->fast_ops->forward(pcm->fast_op_arg, frames);
}
use_default_symbol_version(__snd_pcm_forward, snd_pcm_forward, ALSA_0.9.0rc8);
@ -1082,8 +1122,14 @@ snd_pcm_sframes_t snd_pcm_writei(snd_pcm_t *pcm, const void *buffer, snd_pcm_ufr
{
assert(pcm);
assert(size == 0 || buffer);
assert(pcm->setup);
assert(pcm->access == SND_PCM_ACCESS_RW_INTERLEAVED);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
if (pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED) {
SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access));
return -EINVAL;
}
return _snd_pcm_writei(pcm, buffer, size);
}
@ -1108,8 +1154,14 @@ snd_pcm_sframes_t snd_pcm_writen(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t
{
assert(pcm);
assert(size == 0 || bufs);
assert(pcm->setup);
assert(pcm->access == SND_PCM_ACCESS_RW_NONINTERLEAVED);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
if (pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) {
SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access));
return -EINVAL;
}
return _snd_pcm_writen(pcm, bufs, size);
}
@ -1134,8 +1186,14 @@ snd_pcm_sframes_t snd_pcm_readi(snd_pcm_t *pcm, void *buffer, snd_pcm_uframes_t
{
assert(pcm);
assert(size == 0 || buffer);
assert(pcm->setup);
assert(pcm->access == SND_PCM_ACCESS_RW_INTERLEAVED);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
if (pcm->access != SND_PCM_ACCESS_RW_INTERLEAVED) {
SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access));
return -EINVAL;
}
return _snd_pcm_readi(pcm, buffer, size);
}
@ -1160,8 +1218,14 @@ snd_pcm_sframes_t snd_pcm_readn(snd_pcm_t *pcm, void **bufs, snd_pcm_uframes_t s
{
assert(pcm);
assert(size == 0 || bufs);
assert(pcm->setup);
assert(pcm->access == SND_PCM_ACCESS_RW_NONINTERLEAVED);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
if (pcm->access != SND_PCM_ACCESS_RW_NONINTERLEAVED) {
SNDMSG("invalid access type %s", snd_pcm_access_name(pcm->access));
return -EINVAL;
}
return _snd_pcm_readn(pcm, bufs, size);
}
@ -1180,7 +1244,7 @@ int snd_pcm_link(snd_pcm_t *pcm1, snd_pcm_t *pcm2)
if (fd1 < 0 || fd2 < 0)
return -ENOSYS;
if (ioctl(fd1, SNDRV_PCM_IOCTL_LINK, fd2) < 0) {
SYSERR("SNDRV_PCM_IOCTL_LINK failed");
SYSMSG("SNDRV_PCM_IOCTL_LINK failed");
return -errno;
}
return 0;
@ -1196,7 +1260,7 @@ int snd_pcm_unlink(snd_pcm_t *pcm)
int fd;
fd = _snd_pcm_link_descriptor(pcm);
if (ioctl(fd, SNDRV_PCM_IOCTL_UNLINK) < 0) {
SYSERR("SNDRV_PCM_IOCTL_UNLINK failed");
SYSMSG("SNDRV_PCM_IOCTL_UNLINK failed");
return -errno;
}
return 0;
@ -1248,7 +1312,10 @@ int snd_pcm_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds, unsigned int s
if (err < 0)
return err;
}
assert(pcm->poll_fd >= 0);
if (! pcm->poll_fd < 0) {
SNDMSG("poll_fd < 0");
return -EIO;
}
if (space >= 1 && pfds) {
pfds->fd = pcm->poll_fd;
pfds->events = pcm->poll_events | POLLERR | POLLNVAL;
@ -1470,7 +1537,8 @@ static const char *snd_pcm_tstamp_mode_names[] = {
*/
const char *snd_pcm_stream_name(snd_pcm_stream_t stream)
{
assert(stream <= SND_PCM_STREAM_LAST);
if (stream > SND_PCM_STREAM_LAST)
return NULL;
return snd_pcm_stream_names[stream];
}
@ -1564,7 +1632,8 @@ const char *snd_pcm_subformat_description(snd_pcm_subformat_t subformat)
*/
const char *snd_pcm_start_mode_name(snd_pcm_start_t mode)
{
assert(mode <= SND_PCM_START_LAST);
if (mode > SND_PCM_START_LAST)
return NULL;
return snd_pcm_start_mode_names[mode];
}
@ -1579,7 +1648,8 @@ link_warning(snd_pcm_start_mode_name, "Warning: start_mode is deprecated, consid
*/
const char *snd_pcm_xrun_mode_name(snd_pcm_xrun_t mode)
{
assert(mode <= SND_PCM_XRUN_LAST);
if (mode > SND_PCM_XRUN_LAST)
return NULL;
return snd_pcm_xrun_mode_names[mode];
}
@ -1638,7 +1708,10 @@ int snd_pcm_dump_hw_setup(snd_pcm_t *pcm, snd_output_t *out)
{
assert(pcm);
assert(out);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
snd_output_printf(out, "stream : %s\n", snd_pcm_stream_name(pcm->stream));
snd_output_printf(out, "access : %s\n", snd_pcm_access_name(pcm->access));
snd_output_printf(out, "format : %s\n", snd_pcm_format_name(pcm->format));
@ -1664,7 +1737,10 @@ int snd_pcm_dump_sw_setup(snd_pcm_t *pcm, snd_output_t *out)
{
assert(pcm);
assert(out);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
snd_output_printf(out, "tstamp_mode : %s\n", snd_pcm_tstamp_mode_name(pcm->tstamp_mode));
snd_output_printf(out, "period_step : %d\n", pcm->period_step);
snd_output_printf(out, "sleep_min : %d\n", pcm->sleep_min);
@ -1734,7 +1810,10 @@ int snd_pcm_dump(snd_pcm_t *pcm, snd_output_t *out)
snd_pcm_sframes_t snd_pcm_bytes_to_frames(snd_pcm_t *pcm, ssize_t bytes)
{
assert(pcm);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
return bytes * 8 / pcm->frame_bits;
}
@ -1747,7 +1826,10 @@ snd_pcm_sframes_t snd_pcm_bytes_to_frames(snd_pcm_t *pcm, ssize_t bytes)
ssize_t snd_pcm_frames_to_bytes(snd_pcm_t *pcm, snd_pcm_sframes_t frames)
{
assert(pcm);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
return frames * pcm->frame_bits / 8;
}
@ -1760,7 +1842,10 @@ ssize_t snd_pcm_frames_to_bytes(snd_pcm_t *pcm, snd_pcm_sframes_t frames)
long snd_pcm_bytes_to_samples(snd_pcm_t *pcm, ssize_t bytes)
{
assert(pcm);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
return bytes * 8 / pcm->sample_bits;
}
@ -1773,7 +1858,10 @@ long snd_pcm_bytes_to_samples(snd_pcm_t *pcm, ssize_t bytes)
ssize_t snd_pcm_samples_to_bytes(snd_pcm_t *pcm, long samples)
{
assert(pcm);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
return samples * pcm->sample_bits / 8;
}
@ -1819,7 +1907,10 @@ int snd_async_add_pcm_handler(snd_async_handler_t **handler, snd_pcm_t *pcm,
*/
snd_pcm_t *snd_async_handler_get_pcm(snd_async_handler_t *handler)
{
assert(handler->type == SND_ASYNC_HANDLER_PCM);
if (handler->type == SND_ASYNC_HANDLER_PCM) {
SNDMSG("invalid handler type %d", handler->type);
return NULL;
}
return handler->u.pcm;
}
@ -2099,7 +2190,10 @@ int snd_pcm_wait(snd_pcm_t *pcm, int timeout)
err = snd_pcm_poll_descriptors(pcm, &pfd, 1);
if (err < 0)
return err;
assert(err == 1);
if (err != 1) {
SNDMSG("invalid poll descriptors %d\n", err);
return -EIO;
}
__retry:
err_poll = poll(&pfd, 1, timeout);
if (err_poll < 0)
@ -2250,7 +2344,8 @@ int snd_pcm_area_silence(const snd_pcm_channel_area_t *dst_area, snd_pcm_uframes
break;
}
default:
assert(0);
SNDMSG("invalid format width %d", width);
return -EINVAL;
}
return 0;
}
@ -2417,7 +2512,8 @@ int snd_pcm_area_copy(const snd_pcm_channel_area_t *dst_area, snd_pcm_uframes_t
break;
}
default:
assert(0);
SNDMSG("invalid format width %d", width);
return -EINVAL;
}
return 0;
}
@ -2440,8 +2536,14 @@ int snd_pcm_areas_copy(const snd_pcm_channel_area_t *dst_areas, snd_pcm_uframes_
int width = snd_pcm_format_physical_width(format);
assert(dst_areas);
assert(src_areas);
assert(channels > 0);
assert(frames > 0);
if (! channels) {
SNDMSG("invalid channels %d", channels);
return -EINVAL;
}
if (! frames) {
SNDMSG("invalid frames %ld", frames);
return -EINVAL;
}
while (channels > 0) {
unsigned int step = src_areas->step;
void *src_addr = src_areas->addr;
@ -2524,7 +2626,11 @@ int snd_pcm_hw_params_dump(snd_pcm_hw_params_t *params, snd_output_t *out)
*/
int snd_pcm_hw_params_can_mmap_sample_resolution(const snd_pcm_hw_params_t *params)
{
assert(params && params->info != ~0U);
assert(params);
if (CHECK_SANITY(params->info == ~0U)) {
SNDMSG("invalid PCM info field");
return 0; /* FIXME: should be a negative error? */
}
return !!(params->info & SNDRV_PCM_INFO_MMAP_VALID);
}
@ -2541,7 +2647,11 @@ int snd_pcm_hw_params_can_mmap_sample_resolution(const snd_pcm_hw_params_t *para
*/
int snd_pcm_hw_params_is_double(const snd_pcm_hw_params_t *params)
{
assert(params && params->info != ~0U);
assert(params);
if (CHECK_SANITY(params->info == ~0U)) {
SNDMSG("invalid PCM info field");
return 0; /* FIXME: should be a negative error? */
}
return !!(params->info & SNDRV_PCM_INFO_DOUBLE);
}
@ -2558,7 +2668,11 @@ int snd_pcm_hw_params_is_double(const snd_pcm_hw_params_t *params)
*/
int snd_pcm_hw_params_is_batch(const snd_pcm_hw_params_t *params)
{
assert(params && params->info != ~0U);
assert(params);
if (CHECK_SANITY(params->info == ~0U)) {
SNDMSG("invalid PCM info field");
return 0; /* FIXME: should be a negative error? */
}
return !!(params->info & SNDRV_PCM_INFO_BATCH);
}
@ -2575,7 +2689,11 @@ int snd_pcm_hw_params_is_batch(const snd_pcm_hw_params_t *params)
*/
int snd_pcm_hw_params_is_block_transfer(const snd_pcm_hw_params_t *params)
{
assert(params && params->info != ~0U);
assert(params);
if (CHECK_SANITY(params->info == ~0U)) {
SNDMSG("invalid PCM info field");
return 0; /* FIXME: should be a negative error? */
}
return !!(params->info & SNDRV_PCM_INFO_BLOCK_TRANSFER);
}
@ -2592,7 +2710,11 @@ int snd_pcm_hw_params_is_block_transfer(const snd_pcm_hw_params_t *params)
*/
int snd_pcm_hw_params_can_overrange(const snd_pcm_hw_params_t *params)
{
assert(params && params->info != ~0U);
assert(params);
if (CHECK_SANITY(params->info == ~0U)) {
SNDMSG("invalid PCM info field");
return 0; /* FIXME: should be a negative error? */
}
return !!(params->info & SNDRV_PCM_INFO_OVERRANGE);
}
@ -2609,7 +2731,11 @@ int snd_pcm_hw_params_can_overrange(const snd_pcm_hw_params_t *params)
*/
int snd_pcm_hw_params_can_pause(const snd_pcm_hw_params_t *params)
{
assert(params && params->info != ~0U);
assert(params);
if (CHECK_SANITY(params->info == ~0U)) {
SNDMSG("invalid PCM info field");
return 0; /* FIXME: should be a negative error? */
}
return !!(params->info & SNDRV_PCM_INFO_PAUSE);
}
@ -2626,7 +2752,11 @@ int snd_pcm_hw_params_can_pause(const snd_pcm_hw_params_t *params)
*/
int snd_pcm_hw_params_can_resume(const snd_pcm_hw_params_t *params)
{
assert(params && params->info != ~0U);
assert(params);
if (CHECK_SANITY(params->info == ~0U)) {
SNDMSG("invalid PCM info field");
return 0; /* FIXME: should be a negative error? */
}
return !!(params->info & SNDRV_PCM_INFO_RESUME);
}
@ -2643,7 +2773,11 @@ int snd_pcm_hw_params_can_resume(const snd_pcm_hw_params_t *params)
*/
int snd_pcm_hw_params_is_half_duplex(const snd_pcm_hw_params_t *params)
{
assert(params && params->info != ~0U);
assert(params);
if (CHECK_SANITY(params->info == ~0U)) {
SNDMSG("invalid PCM info field");
return 0; /* FIXME: should be a negative error? */
}
return !!(params->info & SNDRV_PCM_INFO_HALF_DUPLEX);
}
@ -2660,7 +2794,11 @@ int snd_pcm_hw_params_is_half_duplex(const snd_pcm_hw_params_t *params)
*/
int snd_pcm_hw_params_is_joint_duplex(const snd_pcm_hw_params_t *params)
{
assert(params && params->info != ~0U);
assert(params);
if (CHECK_SANITY(params->info == ~0U)) {
SNDMSG("invalid PCM info field");
return 0; /* FIXME: should be a negative error? */
}
return !!(params->info & SNDRV_PCM_INFO_JOINT_DUPLEX);
}
@ -2677,7 +2815,11 @@ int snd_pcm_hw_params_is_joint_duplex(const snd_pcm_hw_params_t *params)
*/
int snd_pcm_hw_params_can_sync_start(const snd_pcm_hw_params_t *params)
{
assert(params && params->info != ~0U);
assert(params);
if (CHECK_SANITY(params->info == ~0U)) {
SNDMSG("invalid PCM info field");
return 0; /* FIXME: should be a negative error? */
}
return !!(params->info & SNDRV_PCM_INFO_SYNC_START);
}
@ -2695,7 +2837,11 @@ int snd_pcm_hw_params_can_sync_start(const snd_pcm_hw_params_t *params)
int snd_pcm_hw_params_get_rate_numden(const snd_pcm_hw_params_t *params,
unsigned int *rate_num, unsigned int *rate_den)
{
assert(params && params->rate_den != 0);
assert(params);
if (CHECK_SANITY(params->rate_den == 0)) {
SNDMSG("invalid rate_den value");
return -EINVAL;
}
*rate_num = params->rate_num;
*rate_den = params->rate_den;
return 0;
@ -2712,7 +2858,11 @@ int snd_pcm_hw_params_get_rate_numden(const snd_pcm_hw_params_t *params,
*/
int snd_pcm_hw_params_get_sbits(const snd_pcm_hw_params_t *params)
{
assert(params && params->msbits != 0);
assert(params);
if (CHECK_SANITY(params->msbits == 0)) {
SNDMSG("invalid msbits value");
return -EINVAL;
}
return params->msbits;
}
@ -2727,7 +2877,11 @@ int snd_pcm_hw_params_get_sbits(const snd_pcm_hw_params_t *params)
*/
int snd_pcm_hw_params_get_fifo_size(const snd_pcm_hw_params_t *params)
{
assert(params && params->info != ~0U);
assert(params);
if (CHECK_SANITY(params->info == ~0U)) {
SNDMSG("invalid PCM info field");
return -EINVAL;
}
return params->fifo_size;
}
@ -4978,7 +5132,10 @@ int snd_pcm_hw_params_get_min_align(const snd_pcm_hw_params_t *params, snd_pcm_u
int snd_pcm_sw_params_current(snd_pcm_t *pcm, snd_pcm_sw_params_t *params)
{
assert(pcm && params);
assert(pcm->setup);
if (CHECK_SANITY(! pcm->setup)) {
SNDMSG("PCM not set up");
return -EIO;
}
params->tstamp_mode = pcm->tstamp_mode;
params->period_step = pcm->period_step;
params->sleep_min = pcm->sleep_min;
@ -5087,8 +5244,8 @@ int snd_pcm_sw_params_set_start_mode(snd_pcm_t *pcm, snd_pcm_sw_params_t *params
params->start_threshold = pcm->boundary;
break;
default:
assert(0);
break;
SNDMSG("invalid start mode value %d\n", val);
return -EINVAL;
}
return 0;
}
@ -5135,8 +5292,8 @@ int snd_pcm_sw_params_set_xrun_mode(snd_pcm_t *pcm, snd_pcm_sw_params_t *params,
params->stop_threshold = pcm->boundary;
break;
default:
assert(0);
break;
SNDMSG("invalid xrun mode value %d\n", val);
return -EINVAL;
}
return 0;
}
@ -5175,7 +5332,10 @@ int snd_pcm_sw_params_set_tstamp_mode(snd_pcm_t *pcm, snd_pcm_sw_params_t *param
#endif
{
assert(pcm && params);
assert(val <= SND_PCM_TSTAMP_LAST);
if (CHECK_SANITY(val > SND_PCM_TSTAMP_LAST)) {
SNDMSG("invalid tstamp_mode value %d", val);
return -EINVAL;
}
params->tstamp_mode = val;
return 0;
}
@ -5291,7 +5451,10 @@ int snd_pcm_sw_params_set_xfer_align(snd_pcm_t *pcm, snd_pcm_sw_params_t *params
#endif
{
assert(pcm && params);
assert(val % pcm->min_align == 0);
if (CHECK_SANITY(val % pcm->min_align)) {
SNDMSG("xfer_align (%ld) is not aligned to min_align (%ld)", val, pcm->min_align);
return -EINVAL;
}
params->xfer_align = val;
return 0;
}
@ -5420,7 +5583,11 @@ int snd_pcm_sw_params_set_silence_threshold(snd_pcm_t *pcm, snd_pcm_sw_params_t
#endif
{
assert(pcm && params);
assert(val < pcm->buffer_size);
if (CHECK_SANITY(val >= pcm->buffer_size)) {
SNDMSG("invalid silent_threshold value %ld (buffer_size = %ld)",
val, pcm->buffer_size);
return -EINVAL;
}
params->silence_threshold = val;
return 0;
}
@ -5470,7 +5637,11 @@ int snd_pcm_sw_params_set_silence_size(snd_pcm_t *pcm, snd_pcm_sw_params_t *para
#endif
{
assert(pcm && params);
assert(val >= pcm->boundary || val <= pcm->buffer_size);
if (CHECK_SANITY(val < pcm->boundary && val > pcm->buffer_size)) {
SNDMSG("invalid silence_size %ld (boundary %ld, buffer_size %ld)",
val, pcm->boundary, pcm->buffer_size);
return -EINVAL;
}
params->silence_size = val;
return 0;
}
@ -5961,8 +6132,16 @@ snd_pcm_sframes_t snd_pcm_mmap_commit(snd_pcm_t *pcm,
snd_pcm_uframes_t frames)
{
assert(pcm);
assert(offset == *pcm->appl.ptr % pcm->buffer_size);
assert(frames <= snd_pcm_mmap_avail(pcm));
if (CHECK_SANITY(offset != *pcm->appl.ptr % pcm->buffer_size)) {
SNDMSG("commit offset (%ld) doesn't match with appl_ptr (%ld) %% buf_size (%ld)",
offset, *pcm->appl.ptr, pcm->buffer_size);
return -EPIPE;
}
if (CHECK_SANITY(frames > snd_pcm_mmap_avail(pcm))) {
SNDMSG("commit frames (%ld) overflow (avail = %ld)", frames,
snd_pcm_mmap_avail(pcm));
return -EPIPE;
}
return pcm->fast_ops->mmap_commit(pcm->fast_op_arg, offset, frames);
}
@ -6065,7 +6244,8 @@ snd_pcm_sframes_t snd_pcm_read_areas(snd_pcm_t *pcm, const snd_pcm_channel_area_
frames = size;
if (frames > (snd_pcm_uframes_t) avail)
frames = avail;
assert(frames != 0);
if (! frames)
break;
err = func(pcm, areas, offset, frames);
if (err < 0)
break;
@ -6136,7 +6316,8 @@ snd_pcm_sframes_t snd_pcm_write_areas(snd_pcm_t *pcm, const snd_pcm_channel_area
frames = size;
if (frames > (snd_pcm_uframes_t) avail)
frames = avail;
assert(frames != 0);
if (! frames)
break;
err = func(pcm, areas, offset, frames);
if (err < 0)
break;