mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-26 13:44:15 +08:00
ALSA: Add snd_ctl_activate_id()
Added a new API function snd_ctl_activate_id() for activate / inactivate the control element dynamically. Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
This commit is contained in:
parent
80e1b84ffe
commit
3cbdd75331
@ -115,6 +115,8 @@ int snd_ctl_add(struct snd_card * card, struct snd_kcontrol * kcontrol);
|
||||
int snd_ctl_remove(struct snd_card * card, struct snd_kcontrol * kcontrol);
|
||||
int snd_ctl_remove_id(struct snd_card * card, struct snd_ctl_elem_id *id);
|
||||
int snd_ctl_rename_id(struct snd_card * card, struct snd_ctl_elem_id *src_id, struct snd_ctl_elem_id *dst_id);
|
||||
int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id,
|
||||
int active);
|
||||
struct snd_kcontrol *snd_ctl_find_numid(struct snd_card * card, unsigned int numid);
|
||||
struct snd_kcontrol *snd_ctl_find_id(struct snd_card * card, struct snd_ctl_elem_id *id);
|
||||
|
||||
|
@ -465,6 +465,52 @@ error:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* snd_ctl_activate_id - activate/inactivate the control of the given id
|
||||
* @card: the card instance
|
||||
* @id: the control id to activate/inactivate
|
||||
* @active: non-zero to activate
|
||||
*
|
||||
* Finds the control instance with the given id, and activate or
|
||||
* inactivate the control together with notification, if changed.
|
||||
*
|
||||
* Returns 0 if unchanged, 1 if changed, or a negative error code on failure.
|
||||
*/
|
||||
int snd_ctl_activate_id(struct snd_card *card, struct snd_ctl_elem_id *id,
|
||||
int active)
|
||||
{
|
||||
struct snd_kcontrol *kctl;
|
||||
struct snd_kcontrol_volatile *vd;
|
||||
unsigned int index_offset;
|
||||
int ret;
|
||||
|
||||
down_write(&card->controls_rwsem);
|
||||
kctl = snd_ctl_find_id(card, id);
|
||||
if (kctl == NULL) {
|
||||
ret = -ENOENT;
|
||||
goto unlock;
|
||||
}
|
||||
index_offset = snd_ctl_get_ioff(kctl, &kctl->id);
|
||||
vd = &kctl->vd[index_offset];
|
||||
ret = 0;
|
||||
if (active) {
|
||||
if (!(vd->access & SNDRV_CTL_ELEM_ACCESS_INACTIVE))
|
||||
goto unlock;
|
||||
vd->access &= ~SNDRV_CTL_ELEM_ACCESS_INACTIVE;
|
||||
} else {
|
||||
if (vd->access & SNDRV_CTL_ELEM_ACCESS_INACTIVE)
|
||||
goto unlock;
|
||||
vd->access |= SNDRV_CTL_ELEM_ACCESS_INACTIVE;
|
||||
}
|
||||
ret = 1;
|
||||
unlock:
|
||||
up_write(&card->controls_rwsem);
|
||||
if (ret > 0)
|
||||
snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_INFO, id);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_ctl_activate_id);
|
||||
|
||||
/**
|
||||
* snd_ctl_rename_id - replace the id of a control on the card
|
||||
* @card: the card instance
|
||||
|
Loading…
Reference in New Issue
Block a user