After we change sth in the userspace audio stack like alsa-ucm or pulseaudio, we want to perform remote audio auto test to verify if the change introduce the regression or not, some of the tests are about the defaut_sink/default_source or active_port switching, this needs the audio jack state to be changed to trigger the userspace's audio device switching.
So far, there is no software ways to change the audio jack state, this block the auto test.
My design is adding a sysfs interface for each sound card if the card has audio jack, then users could echo different values to sysfs to change the jack state (Phantom jack is not controlled by injection). And once the users enable the jack injection via sysfs, this jack's state will not be controlled by hw events anymore until users disable the jack injection.
Of course, this could not 100% simulate the plugin or plugout triggered by hw events, with the hw triggered plugin or plugout, the audio driver will set codec or does sth else, so the software injection is just changing the jack state and notify the userspace, it is just for testing userspace part.
Here is an example to change jack state via sysfs:
After booting up: /* cd to the jack injection folder for sound card0 in the sysfs */ $cd /sys/devices/pci0000:00/0000:00:1f.3/skl_hda_dsp_generic/sound/card0/jack
/* check file nodes in this folder */ $ls jackin_inject sw_inject_enable
/* check all jack's software injection enable status, all disabled now */ $ cat sw_inject_enable Jack: Mic 0 Jack: Headphone 0 Jack: HDMI/DP,pcm=3 0 Jack: HDMI/DP,pcm=4 0 Jack: HDMI/DP,pcm=5 0
/* enable software injection for Jack Headphone */ $ sudo sh -c "echo Headphone 1 > sw_inject_enable"
/* check all jack's software injection enable status again, now Headphone is enabled */ $ cat sw_inject_enable Jack: Mic 0 Jack: Headphone 1 Jack: HDMI/DP,pcm=3 0 Jack: HDMI/DP,pcm=4 0 Jack: HDMI/DP,pcm=5 0
/* trigger plugin to Jack Headphone */ $sudo sh -c "echo Headphone 1 > jackin_inject"
/* check if Jack Headphone is plugged in */ $ sudo amixer contents | grep "Headphone Jack" -3 numid=30,iface=CARD,name='HDMI/DP,pcm=5 Jack' ; type=BOOLEAN,access=r-------,values=1 : values=off numid=17,iface=CARD,name='Headphone Jack' ; type=BOOLEAN,access=r-------,values=1 : values=on numid=14,iface=CARD,name='Mic Jack'
/* trigger plugout to Jack Headphone */ $ sudo sh -c "echo Headphone 0 > jackin_inject"
/* check if Jack Headphone is plugged out */ $ sudo amixer contents | grep "Headphone Jack" -3 numid=30,iface=CARD,name='HDMI/DP,pcm=5 Jack' ; type=BOOLEAN,access=r-------,values=1 : values=off numid=17,iface=CARD,name='Headphone Jack' ; type=BOOLEAN,access=r-------,values=1 : values=off numid=14,iface=CARD,name='Mic Jack'
/* disable Jack Headphone software injection, this will return the control to non-injection ways */ $ sudo sh -c "echo Headphone 0 > sw_inject_enable"
/* check if the Jack Headphone software injection is disabled, it is disabled now */ $ cat sw_inject_enable Jack: Mic 0 Jack: Headphone 0 Jack: HDMI/DP,pcm=3 0 Jack: HDMI/DP,pcm=4 0 Jack: HDMI/DP,pcm=5 0
Hui Wang (2): alsa: jack: expand snd_jack_report parameter for jack sw_inject alsa: jack: adding support for software jack in or out injection
include/sound/core.h | 1 + include/sound/jack.h | 5 +- sound/core/jack.c | 129 +++++++++++++++++++++++++++++++- sound/pci/hda/hda_jack.c | 6 +- sound/pci/hda/patch_hdmi.c | 2 +- sound/pci/oxygen/xonar_wm87x6.c | 2 +- sound/soc/soc-jack.c | 2 +- sound/x86/intel_hdmi_audio.c | 4 +- 8 files changed, 140 insertions(+), 11 deletions(-)