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