[alsa-devel] get rid of controls with snd_ctl_remove

Takashi Iwai tiwai at suse.de
Fri Aug 29 15:01:27 CEST 2008


At Fri, 29 Aug 2008 14:54:42 +0200,
Harald Radke wrote:
> 
> Hi there!
> 
> Please be patient with me, I am quite inexperienced with alsa programming, so 
> this might be a dumb question:
> 
> We have a WM8750 working in our PDA, the codec is working so far but I want to 
> remove some of the control since they aren't needed.
> 
> Instead of copying the wm8750.c file and adjusting it, I want to write another 
> module which basically get rid of those controls, something like:
> 
> [...]
> 
> static const char* unused_controls[] = {"AAAA", "BBBB,"CCCC"};
> 
>         struct snd_kcontrol *ctl;
> 
>         list_for_each_entry(ctl, &card->controls, list)

You can't use list_for_each_entry() together with removal.
Use list_for_each_entry_safe() for such a purpose.

But...

>           for(i=0; i <  ARRAY_SIZE(unused_controls); i++)
>             if (!strcmp(unused_controls[i],ctl->id.name)) {
>               down_write(&card->controls_rwsem);
>               snd_ctl_remove(card,ctl);
>               up_write(&card->controls_rwsem);
>               break;
>             }

It'd be easier like the following:

	for (i = 0; i < ARRAY_SIZE(unused_controls); i++) {
		struct snd_ctl_elem_id id;
		memset(&id, 0, sizeof(id));
		strcpy(id.name, unused_controls[i]);
		id.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
		snd_ctl_remove_id(card, &id);
	}

Takashi


More information about the Alsa-devel mailing list