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