static long to_user(selem_t *s, int dir, selem_ctl_t *c, long value)
{
- int64_t n = (int64_t) (value - c->min) * (s->str[dir].max - s->str[dir].min);
+ int64_t n;
+ if (c->max == c->min)
+ return s->str[dir].min;
+ n = (int64_t) (value - c->min) * (s->str[dir].max - s->str[dir].min);
return s->str[dir].min + (n + (c->max - c->min) / 2) / (c->max - c->min);
}
static long from_user(selem_t *s, int dir, selem_ctl_t *c, long value)
{
- int64_t n = (int64_t) (value - s->str[dir].min) * (c->max - c->min);
+ int64_t n;
+ if (s->str[dir].max == s->str[dir].min)
+ return c->min;
+ n = (int64_t) (value - s->str[dir].min) * (c->max - c->min);
return c->min + (n + (s->str[dir].max - s->str[dir].min) / 2) / (s->str[dir].max - s->str[dir].min);
}
const char *name1;
memset(&info, 0, sizeof(info));
err = snd_hctl_elem_info(helem, &info);
- assert(err >= 0);
+ if (err < 0)
+ return err;
switch (type) {
case CTL_SINGLE:
if (info.type != SND_CTL_ELEM_TYPE_BOOLEAN &&
} else {
simple = melem->private_data;
}
- assert(!simple->ctls[type].elem);
simple->ctls[type].elem = helem;
simple->ctls[type].type = info.type;
simple->ctls[type].access = info.access;
if (err < 0)
return err;
err = simple_update(melem);
- assert(err >= 0);
+ if (err < 0)
+ return err;
if (new)
err = snd_mixer_elem_add(melem, class);
else
const char *n;
snd_ctl_elem_info_set_item(info, k);
err = snd_hctl_elem_info(helem, info);
- assert(err >= 0);
+ if (err < 0)
+ return err;
n = snd_ctl_elem_info_get_item_name(info);
err = simple_add1(class, n, helem, CTL_CAPTURE_SOURCE, k);
if (err < 0)
assert(k <= CTL_LAST);
simple->ctls[k].elem = NULL;
err = snd_mixer_elem_detach(melem, helem);
- assert(err >= 0);
+ if (err < 0)
+ return err;
if (snd_mixer_elem_empty(melem))
return snd_mixer_elem_remove(melem);
err = simple_update(melem);
static int _snd_mixer_selem_set_volume(snd_mixer_elem_t *elem, int dir, snd_mixer_selem_channel_id_t channel, long value)
{
selem_t *s = elem->private_data;
- assert((unsigned int) channel < s->str[dir].channels);
- assert(value >= s->str[dir].min && value <= s->str[dir].max);
+ if ((unsigned int) channel >= s->str[dir].channels)
+ return 0;
+ if (value < s->str[dir].min || value > s->str[dir].max)
+ return 0;
if (s->caps &
(dir == PLAY ? CAP_PVOLUME_JOIN : CAP_CVOLUME_JOIN))
channel = 0;
int changed = 0;
snd_mixer_selem_channel_id_t channel;
selem_t *s = elem->private_data;
- assert(value >= s->str[dir].min && value <= s->str[dir].max);
+ if (value < s->str[dir].min || value > s->str[dir].max)
+ return 0;
for (channel = 0; (unsigned int) channel < s->str[dir].channels; channel++) {
if (value != s->str[dir].vol[channel]) {
s->str[dir].vol[channel] = value;
static int _snd_mixer_selem_set_switch(snd_mixer_elem_t *elem, int dir, snd_mixer_selem_channel_id_t channel, int value)
{
selem_t *s = elem->private_data;
- assert((unsigned int) channel < s->str[dir].channels);
+ if ((unsigned int) channel >= s->str[dir].channels)
+ return 0;
if (s->caps &
(dir == PLAY ? CAP_PSWITCH_JOIN : CAP_CSWITCH_JOIN))
channel = 0;
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert(min != max);
s->str[PLAY].range = 1;
s->str[PLAY].min = min;
s->str[PLAY].max = max;
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert((unsigned int) channel < s->str[PLAY].channels);
- assert(s->caps & (CAP_PVOLUME|CAP_GVOLUME));
+ if ((unsigned int) channel >= s->str[PLAY].channels)
+ return -EINVAL;
+ if (! (s->caps & (CAP_PVOLUME|CAP_GVOLUME)))
+ return -EINVAL;
if (s->caps & CAP_PVOLUME_JOIN)
channel = 0;
*value = s->str[PLAY].vol[channel];
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert((unsigned int) channel < s->str[PLAY].channels);
- assert(s->caps & (CAP_PSWITCH|CAP_GSWITCH));
+ if ((unsigned int) channel >= s->str[PLAY].channels)
+ return -EINVAL;
+ if (! (s->caps & (CAP_PSWITCH|CAP_GSWITCH)))
+ return -EINVAL;
if (s->caps & CAP_PSWITCH_JOIN)
channel = 0;
*value = !!(s->str[PLAY].sw & (1 << channel));
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert(s->caps & (CAP_GVOLUME|CAP_PVOLUME));
+ if (! (s->caps & (CAP_GVOLUME|CAP_PVOLUME)))
+ return -EINVAL;
changed = _snd_mixer_selem_set_volume(elem, PLAY, channel, value);
if (changed < 0)
return changed;
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert(s->caps & (CAP_GVOLUME|CAP_PVOLUME));
+ if (! (s->caps & (CAP_GVOLUME|CAP_PVOLUME)))
+ return -EINVAL;
changed = _snd_mixer_selem_set_volume_all(elem, PLAY, value);
if (changed < 0)
return changed;
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert(s->caps & (CAP_GSWITCH|CAP_PSWITCH));
+ if (! (s->caps & (CAP_GSWITCH|CAP_PSWITCH)))
+ return -EINVAL;
changed = _snd_mixer_selem_set_switch(elem, PLAY, channel, value);
if (changed < 0)
return changed;
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert(s->caps & (CAP_GSWITCH|CAP_PSWITCH));
+ if (! (s->caps & (CAP_GSWITCH|CAP_PSWITCH)))
+ return -EINVAL;
changed = _snd_mixer_selem_set_switch_all(elem, PLAY, value);
if (changed < 0)
return changed;
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert(min != max);
s->str[CAPT].range = 1;
s->str[CAPT].min = min;
s->str[CAPT].max = max;
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert(s->caps & CAP_CSWITCH_EXCL);
+ if (! (s->caps & CAP_CSWITCH_EXCL))
+ return -EINVAL;
return s->capture_group;
}
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert((unsigned int) channel < s->str[CAPT].channels);
- assert(s->caps & (CAP_GVOLUME|CAP_CVOLUME));
+ if ((unsigned int) channel >= s->str[CAPT].channels)
+ return -EINVAL;
+ if (! (s->caps & (CAP_GVOLUME|CAP_CVOLUME)))
+ return -EINVAL;
if (s->caps & CAP_CVOLUME_JOIN)
channel = 0;
*value = s->str[CAPT].vol[channel];
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert((unsigned int) channel < s->str[CAPT].channels);
- assert(s->caps & (CAP_GSWITCH | CAP_CSWITCH));
+ if ((unsigned int) channel >= s->str[CAPT].channels)
+ return -EINVAL;
+ if (! (s->caps & (CAP_GSWITCH | CAP_CSWITCH)))
+ return -EINVAL;
if (s->caps & CAP_CSWITCH_JOIN)
channel = 0;
*value = !!(s->str[CAPT].sw & (1 << channel));
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert(s->caps & (CAP_GVOLUME | CAP_CVOLUME));
+ if (! (s->caps & (CAP_GVOLUME | CAP_CVOLUME)))
+ return -EINVAL;
changed = _snd_mixer_selem_set_volume(elem, CAPT, channel, value);
if (changed < 0)
return changed;
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert(s->caps & (CAP_GVOLUME | CAP_CVOLUME));
+ if (! (s->caps & (CAP_GVOLUME | CAP_CVOLUME)))
+ return -EINVAL;
changed = _snd_mixer_selem_set_volume_all(elem, CAPT, value);
if (changed < 0)
return changed;
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert(s->caps & (CAP_GSWITCH | CAP_CSWITCH));
+ if (! (s->caps & (CAP_GSWITCH | CAP_CSWITCH)))
+ return -EINVAL;
changed = _snd_mixer_selem_set_switch(elem, CAPT, channel, value);
if (changed < 0)
return changed;
assert(elem);
assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data;
- assert(s->caps & (CAP_GSWITCH | CAP_CSWITCH));
+ if (! (s->caps & (CAP_GSWITCH | CAP_CSWITCH)))
+ return -EINVAL;
changed = _snd_mixer_selem_set_switch_all(elem, CAPT, value);
if (changed < 0)
return changed;