PROJET AUTOBLOG


le hollandais volant

Site original : le hollandais volant

⇐ retour index

Linux : changer de sortie audio en un clic

samedi 10 juin 2017 à 23:37

Sur mon ordi, il m’arrive d’avoir à basculer d’une sortie audio à une autre : entre la sortie casque et les hauts parleurs du PC, par exemple. Généralement, quand on veut que le son sorte par les haut-parleurs, on doit débrancher le casque.
Sauf que si vous êtes un fainéant comme moi, vous préférez le laisser brancher tout le temps et pouvoir tout de même recevoir le son des hauts parleurs. Perso j’ai également un écran branché en HDMI où sont branchés d’autres écouteurs.

Sous Linux Mint ou Ubuntu, on peut choisir la sortie manuellement dans les paramètres audio :

paramètres audio sous linux mint
Il faut chercher un peu. Il faut choisir la carte son (intégrée ou HDMI) en premier puis la sortie (principale ou casque pour la carte intégrée ; sortie écran pour HDMI). C’est donc un peu le bordel.

L’idée de ce post est de créer un petit bouton sur la barre de bureau, ouvrant une fenêtre qui permet de choisir la sortie audio en un clic :

mon applet audio

Le bouton ne fait que lancer un script, et c’est l’écriture de ce script que l’on va faire ici.

Fonctionnement de l’audio sous Linux

Le fonctionnement de l’audio sous Linux a toujours été un peu bordélique : entre Pulse audio, Alsa, OSS, OpenAL et différentes bibliothèques un peu partout. Le fonctionnement sous Mint se fait comme suit :

  1. le système sélectionne une des sorties d’une carte audio
  2. le système envoie le flux audio sur cette sortie

Chaque combinaison (carte+sortie) correspond à un « profile » audio.

Principe du script

À l’aide de la ligne de commande, on peut manuellement diriger un flux audio sur une sortie précise. Ceci se fait au moyen de la commande pacmd.
Dans notre script, en fonction du choix de l’utilisateur, on va activer la sortie sélectionnée et y envoyer l’audio.

Listage des sorties audio sur l’ordi

Dans le cas présent, seules les sorties des hauts parleurs et celui du casque sont importantes. En premier lieu, il faut lister les sorties audio présentes sur le système et repérer celles qui nous intéressent.

Ceci se fait au moyen de trois commandes, qui listent chacune une information dont on aura besoin pour notre script :

pacmd list | grep "active profile"
pacmd list | grep "active port" | grep "output"
pacmd list-sinks | grep "name:"

On va exécuter ces commandes et en noter le retour pour chaque configuration qui nous intéresse : sortie haut-parleurs, sortie casque, …

Pour les haut-parleurs

Jouez une musique ou une vidéo et assurez-vous que le son sorte par les haut parleurs.
Lancez ensuite les trois commandes précédentes. Le retour devrait être respectivement quelque chose dans ce format là :

Cela vous retourne le profile, le port et le flux audio correspondant au haut-parleurs.

Pour le casque audio

Branchez maintenant un casque. et refaites la même manip.
Les trois commandes retournent maintenant ça :

Le seul changement ici est celui du port. Ceci vient du fait que le même profile gère à la fois la sortie des haut-parleurs et celui du casque. Si vous aviez branché votre casque ailleurs (sur un écran HDMI, sur le port Jack d’un haut-parleur, ou sur une sortie bluetooth), ça serait différent.

Pour ma sortie HDMI

Tester les commandes

Maintenant on a les informations qu’il faut pour modifier, en ligne de commandes, la sortie audio.

Lancez successivement les commandes dans le format suivant :

pacmd set-card-profile 0 off
pacmd set-card-profile 0 PROFILE
pacmd set-sink-port SINK PORT

Ainsi, pour envoyer le son sur la sortie casque avec les informations de l’exemple précédent :

pacmd set-card-profile 0 off
pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo
pacmd set-sink-port alsa_output.pci-0000_00_1f.3.analog-stereo analog-output-headphones

Pour l’envoyer sur la sortie haut-parleurs :

pacmd set-card-profile 0 off
pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo
pacmd set-sink-port alsa_output.pci-0000_00_1f.3.analog-stereo analog-output-speaker

Dans mon cas, pour l’envoyer sur la sortie HDMI :

pacmd set-card-profile 0 off
pacmd set-card-profile 0 output:hdmi-stereo+input:analog-stereo
pacmd set-sink-port alsa_output.pci-0000_00_1f.3.hdmi-stereo hdmi-output-0

Si ces commandes ont le résultat souhaité, on a fait 90 % du travail. Il nous reste à créer un script qui lance automatiquement ces commandes. Pour faire un truc plus cool, on va utiliser Zenity, qui permet de lancer des fenêtres popup pour Gnome/Mate, avec un menu.

Le menu Zenity

Si zenity n’est pas installé, installez-le.
Le fonctionnement est très simple : pour faire une liste avec des choix, on utilise la commande zenity --list à laquelle on spécifie lesdits choix. Dans notre cas, ça donne ça :

zenity --list \
    --title="Sortie Audio" --text "Quelle sortie Audio ?" \
    --column="Id" --column="Nom" \
       1 "Laptop Speakers" \
       2 "Laptop Jack" \
       3 "Screen Jack"

Vous pouvez essayer cette commande dans le terminal : ça ouvre une petite fenêtre où vous pouvez choisir une ligne. La commande retournera un numéro 1, 2 ou 3 en fonction de votre choix.

Si l’envie vous prend, vous pouvez étudier un peu plus en profondeur Zenity : il permet de faire des scripts interactifs. Ici l’on a une liste de choix, mais on peut aussi faire des curseurs (je fais ça pour mon script de compression JPEG : je choisis la compression au curseur), des confirmations, des notifications…

Le script final

Dans notre script, on demande le choix à l’aide Zenity et on fait simplement un test sur la valeur de retour. Ensuite, on exécute les commandes avec pacmd précédentes qui corresponde au choix :

CHOICE=$(zenity --list --title="Sortie Audio" --text "Quelle sortie Audio ?" --column="Id" --column="Nom" 1 "Laptop Speakers" 2 "Laptop Jack" 3 "Screen Jack");

if [ $CHOICE -eq 1 ]
then
    # activer sortie haut-parleurs
elif [ $CHOICE -eq 2 ]
then
    # activer sortie casque
else
    # activer sortie HDMI
fi

Le script final, dans mon cas donne ceci :

#!/bin/sh

CHOICE=$(zenity --list --title="Sortie Audio" --text "Quelle sortie Audio ?" --column="Id" --column="Nom" 1 "Laptop Speakers" 2 "Laptop Jack" 3 "Screen Jack");

# LAPTOP SPEAKERS
if [ $CHOICE -eq 1 ]
then
	pacmd set-card-profile 0 off # turn off
	pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo # laptop
	pacmd set-sink-port alsa_output.pci-0000_00_1f.3.analog-stereo analog-output-speaker # laptop speaker

# LAPTOP JACK
elif [ $CHOICE -eq 2 ]
then
	pacmd set-card-profile 0 off
	pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo
	pacmd set-sink-port alsa_output.pci-0000_00_1f.3.analog-stereo analog-output-headphones

# HDMI / SCREEN JACK
else
	pacmd set-card-profile 0 off
	pacmd set-card-profile 0 output:hdmi-stereo+input:analog-stereo
	pacmd set-sink-port alsa_output.pci-0000_00_1f.3.hdmi-stereo hdmi-output-0
fi

Placez ce code dans un fichier .sh que vous enregistrez quelque part, par exemple ~/Documents/scripts/audio-picker.sh.

Ensuite, sur la barre de bureau Mate/Gnome, faites un clic droit puis « ajouter au tableau de bord ». Choisissez « lanceur d’application personnalisé ». Dans la fenêtre pour le créer, donnez un nom (« choisir une sortie audio », par exemple), mettez le chemin vers votre fichier dans le champ de la commande. Si vous cliquez sur l’icône (en haut à gauche) vous pouvez lui donner une icône personnalisée. Enfin, cliquez sur « Valider » :

add a new applet