Linux内核音频驱动如何在example_get回调获取snd_kcontrol控件名
获取ALSA控件名的实现方法
你注册snd_soc_kcontrol时传入的名称字符串,存储在snd_kcontrol结构体嵌套的元素ID成员中,不需要从snd_soc_component域查找,直接通过入参kcontrol即可访问:
- 访问路径:
kcontrol->id.name - 该成员类型为
const char *,和SOC_SINGLE_EXT第一个参数传入的字符串地址一致,就是你需要的"EXAMPLE_NAME"
snd_kcontrol结构体定义在include/sound/control.h中,其首个成员就是struct snd_ctl_elem_id id,id的name字段就是ALSA核心在控件注册时保存的控件名,你之前查阅结构体时大概率漏看了这个嵌套成员。
修正后的回调示例代码
static int example_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol); struct struct_priv *my_struct = snd_soc_component_get_drvdata(component); // 获取注册时传入的控件名称 const char *ctl_name = kcontrol->id.name; // 可按需添加调试打印验证 // dev_dbg(component->dev, "fetch control name: %s\n", ctl_name); // 原有控件取值逻辑 // ucontrol->value.integer.value[0] = ...; return 0; }
注意:
kcontrol->id.name指向内核只读段的字符串常量,严禁修改该指针指向的内存内容,否则会触发内核页错误导致系统崩溃。
内容的提问来源于stack exchange,提问作者fmuller1
相关产品推荐
相关产品推荐

