ALSA 插孔控制

为什么我们需要插孔 kcontrol

ALSA 使用 kcontrol 将音频控件(开关、音量、多路复用器等)导出到用户空间。这意味着像 pulseaudio 这样的用户空间应用程序可以在未插入耳机时关闭耳机并打开扬声器。

旧的 ALSA 插孔代码仅为每个注册的插孔创建输入设备。这些插孔输入设备无法被以非 root 身份运行的用户空间设备读取。

新的插孔代码为每个插孔创建嵌入式插孔 kcontrol,可以被任何进程读取。

这可以与 UCM 结合使用,允许用户空间根据插孔插入或移除事件更智能地路由音频。

插孔 Kcontrol 内部结构

每个插孔都会有一个 kcontrol 列表,这样我们就可以在插孔创建阶段创建一个 kcontrol 并将其附加到插孔。我们还可以在需要时随时将 kcontrol 添加到现有插孔。

当插孔被释放时,这些 kcontrol 将自动释放。

如何使用插孔 kcontrol

为了保持兼容性,snd_jack_new() 已通过添加两个参数进行了修改

initial_kctl

如果为 true,则创建一个 kcontrol 并将其添加到插孔列表。

phantom_jack

不要为虚拟插孔创建输入设备。

HDA 插孔可以将 phantom_jack 设置为 true,以便创建一个虚拟插孔,并将 initial_kctl 设置为 true,以便创建一个具有正确 id 的初始 kcontrol。

ASoC 插孔应将 initial_kctl 设置为 false。引脚名称将分配为插孔 kcontrol 名称。