Moved the detach code to the more appropriate place.

This commit is contained in:
Jaroslav Kysela 2001-02-13 11:23:26 +00:00
parent 5e2b04c141
commit cba5c929ec
2 changed files with 7 additions and 6 deletions

View file

@ -284,6 +284,7 @@ int snd_mixer_elem_add(snd_mixer_elem_t *elem, snd_mixer_class_t *class)
int snd_mixer_elem_remove(snd_mixer_elem_t *elem) int snd_mixer_elem_remove(snd_mixer_elem_t *elem)
{ {
snd_mixer_t *mixer = elem->class->mixer; snd_mixer_t *mixer = elem->class->mixer;
bag_iterator_t i, n;
int err, idx, dir; int err, idx, dir;
unsigned int m; unsigned int m;
assert(elem); assert(elem);
@ -291,6 +292,12 @@ int snd_mixer_elem_remove(snd_mixer_elem_t *elem)
idx = _snd_mixer_find_elem(mixer, elem, &dir); idx = _snd_mixer_find_elem(mixer, elem, &dir);
if (dir != 0) if (dir != 0)
return -EINVAL; return -EINVAL;
__again:
bag_for_each(i, n, &elem->helems) {
snd_hctl_elem_t *helem = bag_iterator_entry(i);
snd_mixer_elem_detach(elem, helem);
goto __again; /* FIXME: optimize */
}
err = snd_mixer_elem_throw_event(elem, SND_CTL_EVENT_REMOVE); err = snd_mixer_elem_throw_event(elem, SND_CTL_EVENT_REMOVE);
list_del(&elem->list); list_del(&elem->list);
if (elem->private_free) if (elem->private_free)

View file

@ -425,15 +425,9 @@ static int selem_write(snd_mixer_elem_t *elem,
static void selem_free(snd_mixer_elem_t *elem) static void selem_free(snd_mixer_elem_t *elem)
{ {
int k;
selem_t *s; selem_t *s;
assert(elem->type == SND_MIXER_ELEM_SIMPLE); assert(elem->type == SND_MIXER_ELEM_SIMPLE);
s = elem->private_data; s = elem->private_data;
for (k = 0; k <= CTL_LAST; k++) {
if (s->ctls[k].elem)
snd_mixer_elem_detach(elem, s->ctls[k].elem);
}
elem->private_data = NULL; elem->private_data = NULL;
free(s); free(s);
} }