[alsa-devel] [PATCH v5 03/12] ALSA: control: Add init callback for kcontrol
Subhransu S. Prusty
subhransu.s.prusty at intel.com
Tue Sep 2 14:35:58 CEST 2014
Some controls need to initialize stuffs like pvt data, so they need a
callback if the control creation is successful.
Signed-off-by: Subhransu S. Prusty <subhransu.s.prusty at intel.com>
Signed-off-by: Vinod Koul <vinod.koul at intel.com>
---
include/sound/control.h | 3 +++
sound/core/control.c | 7 +++++++
2 files changed, 10 insertions(+)
diff --git a/include/sound/control.h b/include/sound/control.h
index 0426139..1389f69 100644
--- a/include/sound/control.h
+++ b/include/sound/control.h
@@ -30,6 +30,7 @@ struct snd_kcontrol;
typedef int (snd_kcontrol_info_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_info * uinfo);
typedef int (snd_kcontrol_get_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol);
typedef int (snd_kcontrol_put_t) (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol);
+typedef int (snd_kcontrol_init_t) (struct snd_kcontrol * kcontrol);
typedef int (snd_kcontrol_tlv_rw_t)(struct snd_kcontrol *kcontrol,
int op_flag, /* SNDRV_CTL_TLV_OP_XXX */
unsigned int size,
@@ -52,6 +53,7 @@ struct snd_kcontrol_new {
snd_kcontrol_info_t *info;
snd_kcontrol_get_t *get;
snd_kcontrol_put_t *put;
+ snd_kcontrol_init_t *init;
union {
snd_kcontrol_tlv_rw_t *c;
const unsigned int *p;
@@ -71,6 +73,7 @@ struct snd_kcontrol {
snd_kcontrol_info_t *info;
snd_kcontrol_get_t *get;
snd_kcontrol_put_t *put;
+ snd_kcontrol_init_t *init;
union {
snd_kcontrol_tlv_rw_t *c;
const unsigned int *p;
diff --git a/sound/core/control.c b/sound/core/control.c
index b961134..9d30663 100644
--- a/sound/core/control.c
+++ b/sound/core/control.c
@@ -256,6 +256,7 @@ struct snd_kcontrol *snd_ctl_new1(const struct snd_kcontrol_new *ncontrol,
kctl.info = ncontrol->info;
kctl.get = ncontrol->get;
kctl.put = ncontrol->put;
+ kctl.init = ncontrol->init;
kctl.tlv.p = ncontrol->tlv.p;
kctl.private_value = ncontrol->private_value;
kctl.private_data = private_data;
@@ -362,6 +363,12 @@ int snd_ctl_add(struct snd_card *card, struct snd_kcontrol *kcontrol)
err = -ENOMEM;
goto error;
}
+ if (kcontrol->init) {
+ err = kcontrol->init(kcontrol);
+ if (err < 0)
+ goto error;
+ }
+
list_add_tail(&kcontrol->list, &card->controls);
card->controls_count += kcontrol->count;
kcontrol->id.numid = card->last_numid + 1;
--
1.9.0
More information about the Alsa-devel
mailing list