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