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
只读,从类型获取 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