[alsa-devel] [PATCH] ALSA: Add snd_ctl_activate_id()
From: Takashi Iwai tiwai@suse.de
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 ---
You wrote this patch a long time ago now - I'm currently working on a driver which I think can make use if it. Is it OK if I cherry-pick it over into my code and push it through the ASoC branch if I do so? Or if you could merge it in the coming merge window, but there's a risk I may come up with another way of doing things that doesn't need it.
include/sound/control.h | 2 ++ sound/core/control.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/include/sound/control.h b/include/sound/control.h index 7715e6f..e67db28 100644 --- a/include/sound/control.h +++ b/include/sound/control.h @@ -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);
diff --git a/sound/core/control.c b/sound/core/control.c index 9ce00ed..db51e4e 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -466,6 +466,52 @@ error: }
/** + * 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 * @src_id: the old id
At Wed, 9 Mar 2011 20:03:41 +0000, Mark Brown wrote:
From: Takashi Iwai tiwai@suse.de
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
You wrote this patch a long time ago now - I'm currently working on a driver which I think can make use if it. Is it OK if I cherry-pick it over into my code and push it through the ASoC branch if I do so? Or if you could merge it in the coming merge window, but there's a risk I may come up with another way of doing things that doesn't need it.
I'm fine with pulling this from your tree. This patch was written anyway per Liam's request :)
thanks,
Takashi
include/sound/control.h | 2 ++ sound/core/control.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 0 deletions(-)
diff --git a/include/sound/control.h b/include/sound/control.h index 7715e6f..e67db28 100644 --- a/include/sound/control.h +++ b/include/sound/control.h @@ -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);
diff --git a/sound/core/control.c b/sound/core/control.c index 9ce00ed..db51e4e 100644 --- a/sound/core/control.c +++ b/sound/core/control.c @@ -466,6 +466,52 @@ error: }
/**
- 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
- @src_id: the old id
-- 1.7.2.3
On Thu, Mar 10, 2011 at 07:52:40AM +0100, Takashi Iwai wrote:
I'm fine with pulling this from your tree. This patch was written anyway per Liam's request :)
I know, actually it was me who wanted it for a slightly different purpose - I keep on getting stuck using it due to having to dig the patch out of your unstable tree!.
participants (2)
-
Mark Brown
-
Takashi Iwai