ALSA Jack 软件注入¶
Jack 注入的简单介绍¶
这里的 jack 注入是指用户可以通过 debugfs 接口将插件或拔出事件注入到音频插孔中,这有助于验证 ALSA 用户空间更改。例如,我们更改了 pulseaudio 中的音频配置文件切换代码,并且我们想验证该更改是否按预期工作以及该更改是否引入了回归,在这种情况下,我们可以将插件或拔出事件注入到音频插孔或某些音频插孔中,我们不需要物理访问机器并将物理设备插入/拔出音频插孔。
在这种设计中,音频插孔不等于物理音频插孔。有时,一个物理音频插孔包含多种功能,并且 ALSA 驱动程序为 snd_jack
创建多个 jack_kctl
,这里的 snd_jack
表示一个物理音频插孔,而 jack_kctl
表示一个功能,例如,一个物理插孔具有两个功能:耳机和麦克风输入,ALSA ASoC 驱动程序将为此插孔构建 2 个 jack_kctl
。jack 注入是基于 jack_kctl
而不是 snd_jack
实现的。
要将事件注入到音频插孔,我们需要首先通过 sw_inject_enable
启用 jack 注入,一旦启用,此插孔将不再通过硬件事件更改状态,我们可以通过 jackin_inject
注入插件或拔出事件,并通过 status
检查插孔状态,在我们完成测试后,我们也需要通过 sw_inject_enable
禁用 jack 注入,一旦禁用,插孔状态将根据上次报告的硬件事件恢复,并将由未来的硬件事件更改。
Jack 注入接口的布局¶
如果用户在内核中启用 SND_JACK_INJECTION_DEBUG,则音频插孔注入接口将如下创建
$debugfs_mount_dir/sound
|-- card0
|-- |-- HDMI_DP_pcm_10_Jack
|-- |-- |-- jackin_inject
|-- |-- |-- kctl_id
|-- |-- |-- mask_bits
|-- |-- |-- status
|-- |-- |-- sw_inject_enable
|-- |-- |-- type
...
|-- |-- HDMI_DP_pcm_9_Jack
|-- |-- jackin_inject
|-- |-- kctl_id
|-- |-- mask_bits
|-- |-- status
|-- |-- sw_inject_enable
|-- |-- type
|-- card1
|-- HDMI_DP_pcm_5_Jack
|-- |-- jackin_inject
|-- |-- kctl_id
|-- |-- mask_bits
|-- |-- status
|-- |-- sw_inject_enable
|-- |-- type
...
|-- Headphone_Jack
|-- |-- jackin_inject
|-- |-- kctl_id
|-- |-- mask_bits
|-- |-- status
|-- |-- sw_inject_enable
|-- |-- type
|-- Headset_Mic_Jack
|-- jackin_inject
|-- kctl_id
|-- mask_bits
|-- status
|-- sw_inject_enable
|-- type
节点的解释¶
- kctl_id
只读,获取 jack_kctl->kctl 的 id
sound/card1/Headphone_Jack# cat kctl_id Headphone Jack
- mask_bits
只读,获取 jack_kctl 支持的事件 mask_bits
sound/card1/Headphone_Jack# cat mask_bits 0x0001 HEADPHONE(0x0001)
- status
只读,获取 jack_kctl 的当前状态
耳机已拔出
sound/card1/Headphone_Jack# cat status Unplugged
耳机已插入
sound/card1/Headphone_Jack# cat status Plugged
- type
只读,从 type 获取 snd_jack 支持的事件 (物理音频插孔上的所有支持事件)
sound/card1/Headphone_Jack# cat type 0x7803 HEADPHONE(0x0001) MICROPHONE(0x0002) BTN_3(0x0800) BTN_2(0x1000) BTN_1(0x2000) BTN_0(0x4000)
- sw_inject_enable
读写,启用或禁用注入
注入已禁用
sound/card1/Headphone_Jack# cat sw_inject_enable Jack: Headphone Jack Inject Enabled: 0
注入已启用
sound/card1/Headphone_Jack# cat sw_inject_enable Jack: Headphone Jack Inject Enabled: 1
启用 jack 注入
sound/card1/Headphone_Jack# echo 1 > sw_inject_enable
禁用 jack 注入
sound/card1/Headphone_Jack# echo 0 > sw_inject_enable
- jackin_inject
只写,注入插件或拔出
注入插件
sound/card1/Headphone_Jack# echo 1 > jackin_inject
注入拔出
sound/card1/Headphone_Jack# echo 0 > jackin_inject