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