[i3] Gestion du volume au clavier

Mon clavier actuel dispose d’une molette permettant de régler le volume. Après plusieurs essais infructueux visant à faire varier le volume via la molette dans i3, j’ai repris dernièrement le problème du début, pour enfin arriver à une configuration fonctionnelle.

Je me suis donc replongé dans la documentation d’i3 qui indique d’utiliser xev pour capturer les informations sur les touches que l’on souhaite configurer. Installation donc avec pacman sous Arch Linux : pacman -S xorg-xev. Il est ensuite possible de démarrer le programme via la commande xev. Si je fais bouger la molette vers le bas, j’obtiens les événements suivants dans xev:

MappingNotify event, serial 33, synthetic NO, window 0x0,
    request MappingKeyboard, first_keycode 8, count 248

KeyPress event, serial 33, synthetic NO, window 0x2a00001,
    root 0x2a4, subw 0x0, time 14668027, (482,-109), root:(486,1198),
    state 0x10, keycode 122 (keysym 0x1008ff11, XF86AudioLowerVolume), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 34, synthetic NO, window 0x2a00001,
    root 0x2a4, subw 0x0, time 14668030, (482,-109), root:(486,1198),
    state 0x10, keycode 122 (keysym 0x1008ff11, XF86AudioLowerVolume), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Tout ceci n’est pas très lisible ici, mais nous pouvons tout de même isoler les informations intéressantes en particulier keycode 122 et XF86AudioLowerVolume. Pour ma part, je choisis d’utiliser le keysysm XF86AudioLowerVolume, et utiliserai donc bindsym, pour utiliser le keycode, on utilisera bindcode (non testé). En résumé, pour diminuer le volume XF86AudioLowerVolume, pour l’augmenter XF86AudioRaiseVolume et pour couper le son XF86AudioMute.

Il faut maintenant s’intéresser à la commande à effectuer dans les différents cas. Pour le contrôle du volume, je décide de passer par pactl, abréviation de PulseAudio Control. La commande est de la forme :

pactl set-sink-volume SINK VOLUME

Le paramètre SINK correspond à la sortie sonore que l’on souhaite contrôler. Pour être en mesure de déterminer son numéro, j’utilise la commande pactl list. Parmi les informations renvoyées, il faut chercher les lignes suivantes Carte #0, Carte #1, … Dans mon cas, la carte 0 indique « HDMI Audio Controller », il s’agit donc de la sortie sonore du port HDMI de mon ordinateur. Pour la carte 1, c’est déjà mieux puisqu’il est affiché « Audio interne ». Pour des informations plus concises, on utilise pactl list sinks short et on sélectionne la carte portant la mention RUNNING.

Petit test rapide, casque sur les oreilles, fond musical, j’exécute la commande suivante dans mon terminal : pactl set-sink-volume 1 -5%. Bingo ! Le volume diminue. J’en profite tout de suite pour tester la commande permettant de couper le son : pactl set-sink-mute 1 toggle. Cela fonctionne. J’ouvre donc le fichier de configuration d’i3 pour y ajouter les lignes suivantes :

bindsym XF86AudioLowerVolume exec pactl set-sink-volume 1 -5%
bindsym XF86AudioRaiseVolume exec pactl set-sink-volume 1 +5%
bindsym XF86AudioMute exec pactl set-sink-mute 1 toggle

Rechargement de la configuration.

Trois lignes de configuration qui me permettent désormais de contrôler le volume directement au niveau de mon clavier, sans avoir à le modifier dans l’application diffusant le flux audio. Pour simplifier la mise en place d’une telle configuration, on essayera de toujours procéder en trois étapes. En premier lieu, validation de la commande que l’on souhaite appeler, puis test de la prise en compte de la touche sur une commande fonctionnelle connue, et enfin réunion des étapes précédentes pour configuration finale. L’essentiel étant surtout de ne pas se hâter (« Ne soyez pas si hâtif, maître Meriadoc ! ») pour éviter de se retrouver, après configuration, sans effet visible ou audible et, de ne pas pouvoir alors, isoler immédiatement la source du problème.