167 lines
4.4 KiB
ReStructuredText
167 lines
4.4 KiB
ReStructuredText
|
============================
|
||
|
ALSA Jack Software Injection
|
||
|
============================
|
||
|
|
||
|
Simple Introduction On Jack Injection
|
||
|
=====================================
|
||
|
|
||
|
Here jack injection means users could inject plugin or plugout events
|
||
|
to the audio jacks through debugfs interface, it is helpful to
|
||
|
validate ALSA userspace changes. For example, we change the audio
|
||
|
profile switching code in the pulseaudio, and we want to verify if the
|
||
|
change works as expected and if the change introduce the regression,
|
||
|
in this case, we could inject plugin or plugout events to an audio
|
||
|
jack or to some audio jacks, we don't need to physically access the
|
||
|
machine and plug/unplug physical devices to the audio jack.
|
||
|
|
||
|
In this design, an audio jack doesn't equal to a physical audio jack.
|
||
|
Sometimes a physical audio jack contains multi functions, and the
|
||
|
ALSA driver creates multi ``jack_kctl`` for a ``snd_jack``, here the
|
||
|
``snd_jack`` represents a physical audio jack and the ``jack_kctl``
|
||
|
represents a function, for example a physical jack has two functions:
|
||
|
headphone and mic_in, the ALSA ASoC driver will build 2 ``jack_kctl``
|
||
|
for this jack. The jack injection is implemented based on the
|
||
|
``jack_kctl`` instead of ``snd_jack``.
|
||
|
|
||
|
To inject events to audio jacks, we need to enable the jack injection
|
||
|
via ``sw_inject_enable`` first, once it is enabled, this jack will not
|
||
|
change the state by hardware events anymore, we could inject plugin or
|
||
|
plugout events via ``jackin_inject`` and check the jack state via
|
||
|
``status``, after we finish our test, we need to disable the jack
|
||
|
injection via ``sw_inject_enable`` too, once it is disabled, the jack
|
||
|
state will be restored according to the last reported hardware events
|
||
|
and will change by future hardware events.
|
||
|
|
||
|
The Layout of Jack Injection Interface
|
||
|
======================================
|
||
|
|
||
|
If users enable the SND_JACK_INJECTION_DEBUG in the kernel, the audio
|
||
|
jack injection interface will be created as below:
|
||
|
::
|
||
|
|
||
|
$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
|
||
|
|
||
|
The Explanation Of The Nodes
|
||
|
======================================
|
||
|
|
||
|
kctl_id
|
||
|
read-only, get jack_kctl->kctl's id
|
||
|
::
|
||
|
|
||
|
sound/card1/Headphone_Jack# cat kctl_id
|
||
|
Headphone Jack
|
||
|
|
||
|
mask_bits
|
||
|
read-only, get jack_kctl's supported events mask_bits
|
||
|
::
|
||
|
|
||
|
sound/card1/Headphone_Jack# cat mask_bits
|
||
|
0x0001 HEADPHONE(0x0001)
|
||
|
|
||
|
status
|
||
|
read-only, get jack_kctl's current status
|
||
|
|
||
|
- headphone unplugged:
|
||
|
|
||
|
::
|
||
|
|
||
|
sound/card1/Headphone_Jack# cat status
|
||
|
Unplugged
|
||
|
|
||
|
- headphone plugged:
|
||
|
|
||
|
::
|
||
|
|
||
|
sound/card1/Headphone_Jack# cat status
|
||
|
Plugged
|
||
|
|
||
|
type
|
||
|
read-only, get snd_jack's supported events from type (all supported events on the physical audio 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
|
||
|
read-write, enable or disable injection
|
||
|
|
||
|
- injection disabled:
|
||
|
|
||
|
::
|
||
|
|
||
|
sound/card1/Headphone_Jack# cat sw_inject_enable
|
||
|
Jack: Headphone Jack Inject Enabled: 0
|
||
|
|
||
|
- injection enabled:
|
||
|
|
||
|
::
|
||
|
|
||
|
sound/card1/Headphone_Jack# cat sw_inject_enable
|
||
|
Jack: Headphone Jack Inject Enabled: 1
|
||
|
|
||
|
- to enable jack injection:
|
||
|
|
||
|
::
|
||
|
|
||
|
sound/card1/Headphone_Jack# echo 1 > sw_inject_enable
|
||
|
|
||
|
- to disable jack injection:
|
||
|
|
||
|
::
|
||
|
|
||
|
sound/card1/Headphone_Jack# echo 0 > sw_inject_enable
|
||
|
|
||
|
jackin_inject
|
||
|
write-only, inject plugin or plugout
|
||
|
|
||
|
- to inject plugin:
|
||
|
|
||
|
::
|
||
|
|
||
|
sound/card1/Headphone_Jack# echo 1 > jackin_inject
|
||
|
|
||
|
- to inject plugout:
|
||
|
|
||
|
::
|
||
|
|
||
|
sound/card1/Headphone_Jack# echo 0 > jackin_inject
|