[PATCH v7 1/1] alsa: jack: implement software jack injection via debugfs

Takashi Iwai tiwai at suse.de
Mon Jan 25 15:32:09 CET 2021


On Mon, 25 Jan 2021 04:21:18 +0100,
Hui Wang wrote:
> 
> This change adds audio jack injection feature through debugfs, with
> this feature, we could validate alsa userspace changes by injecting
> plugin or plugout events to the non-phantom audio jacks.
> 
> With this change, the sound core will build the folders
> $debugfs_mount_dir/sound/cardN if SND_DEBUG and DEBUG_FS are enabled.
> And if users also enable the SND_JACK_INJECTION_DEBUG, the jack
> injection nodes will be built in the folder cardN like below:
> 
> $tree $debugfs_mount_dir/sound
> $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 nodes kctl_id, mask_bits, status and type are read-only, users
> could check jack or jack_kctl's information through them.
> 
> The nodes sw_inject_enable and jackin_inject are directly used for
> injection. The sw_inject_enable is read-write, users could check if
> software injection is enabled or not on this jack, and users could
> echo 1 or 0 to enable or disable software injection on this jack. Once
> the injection is enabled, the jack will not change by hardware events
> anymore, once the injection is disabled, the jack will restore the
> last reported hardware events to the jack. The jackin_inject is
> write-only, if the injection is enabled, users could echo 1 or 0 to
> this node to inject plugin or plugout events to this jack.
> 
> For the detailed usage information on these nodes, please refer to
> Documentation/sound/designs/jack-injection.rst.
> 
> Reviewed-by: Takashi Iwai <tiwai at suse.de>
> Reviewed-by: Jaroslav Kysela <perex at perex.cz>
> Reviewed-by: Kai Vehmanen <kai.vehmanen at linux.intel.com>
> Signed-off-by: Hui Wang <hui.wang at canonical.com>

Some minor nitpicking:

> +static int snd_jack_debugfs_add_inject_node(struct snd_jack *jack,
> +					    struct snd_jack_kctl *jack_kctl)
> +{
> +	char *tname;
> +	int i;
> +
> +	tname = kstrdup(jack_kctl->kctl->id.name, GFP_KERNEL);
> +	if (!tname)
> +		return -ENOMEM;
> +
> +	/* replace the chars which are not suitable for folder's name with _ */
> +	for (i = 0; i < strlen(tname); i++)

No need to use strlen(), just check the NUL character on tname[i].

> --- a/sound/core/sound.c
> +++ b/sound/core/sound.c
> @@ -9,6 +9,7 @@
>  #include <linux/time.h>
>  #include <linux/device.h>
>  #include <linux/module.h>
> +#include <linux/debugfs.h>
>  #include <sound/core.h>
>  #include <sound/minors.h>
>  #include <sound/info.h>
> @@ -39,6 +40,9 @@ MODULE_ALIAS_CHARDEV_MAJOR(CONFIG_SND_MAJOR);
>  int snd_ecards_limit;
>  EXPORT_SYMBOL(snd_ecards_limit);
>  
> +struct dentry *sound_debugfs_root;
> +EXPORT_SYMBOL_GPL(sound_debugfs_root);

I guess this should be wrapped with CONFIG_SND_DEBUG ifdef?


thanks,

Takashi


More information about the Alsa-devel mailing list