J'essaie de basculer entre les sorties audio de ma carte vidéo à partir de la ligne de commande. Je suis capable de le faire via les paramètres de l'interface graphique, comme indiqué sur l'image. Comment puis-je faire cela par programme?
Sur la photo sont présentés deux périphériques audio avec deux sorties chacun:
(vert) Périphérique 1 - Audio intégré avec deux sorties:
(rouge) Périphérique 2 - Contrôleur audio HDMI de NVidia GTX 660. Deux moniteurs sont connectés à la carte vidéo:
Le premier moniteur est LG TV et il est connecté à HDMI-0 .
Le deuxième moniteur est LG ULTRAWIDE et il est connecté à DVI-I-1 .
Je souhaite donc basculer, via la ligne de commande, entre les sorties rouges (les deux moniteurs). Tout ce que j'ai trouvé, dans mes recherches, c'est comment basculer entre les périphériques audio (cartes son). J'ai déjà lu quelques sujets comme ces questions:
Lorsque le premier moniteur LG TV | HDMI-0 est activé en tant que sortie audio:
$ pactl list sinks short
8 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
16 alsa_output.pci-0000_03_00.1.hdmi-stereo module-alsa-card.c s16le 2ch 44100Hz RUNNING
$ pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
name: <alsa_output.pci-0000_03_00.1.hdmi-stereo>
Lorsque le deuxième moniteur LG ULTRAWIDE | DVI-I-1 est utilisé comme sortie audio:
$ pactl list sinks short
8 alsa_output.pci-0000_00_1b.0.analog-stereo module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
17 alsa_output.pci-0000_03_00.1.hdmi-stereo-extra1 module-alsa-card.c s16le 2ch 44100Hz RUNNING
$ pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>
name: <alsa_output.pci-0000_03_00.1.hdmi-stereo-extra1>
La sortie de pacmd list-cards
et pactl list cards
est fournie ici .
Vous pouvez voir (dans ce cas particulier) que je cherche un moyen de basculer entre sink 16
et sink 17
. Mais lorsque sink 16
est présenté dans pactl list sinks
, sink 17
n'est pas présenté et inversement. Je ne peux les changer que depuis les paramètres de l'interface graphique. Est-il possible de le faire via la ligne de commande?
Grâce à la discussion avec @ Thomas , j’ai réalisé que les therms appropriés (mots clés) sont le profil et carte . En termes de question , les profils sont les entrées et affiche . Les cartes sont les périphériques audio . Et les nombres puits ne sont pas si importants, mais nous en avons besoin.
Nous pouvons trouver tous les profils disponibles pour chaque nom de carte à l'aide de la commande pacmd list-cards
ou pactl list cards
qui fournit les mêmes informations:
$ pactl list cards
Card #0
Name: alsa_card.pci-0000_00_1b.0
...
Profiles:
input:analog-stereo: Analog Stereo Input (sinks: 0, sources: 1, priority: 60, available: yes)
output:analog-stereo: Analog Stereo Output (sinks: 1, sources: 0, priority: 6000, available: yes)
output:analog-stereo+input:analog-stereo: Analog Stereo Duplex (sinks: 1, sources: 1, priority: 6060, available: yes)
output:analog-surround-21: Analog Surround 2.1 Output (sinks: 1, sources: 0, priority: 800, available: yes)
...
Active Profile: output:iec958-stereo+input:analog-stereo
...
Card #1
Name: alsa_card.pci-0000_03_00.1
...
Profiles:
output:hdmi-stereo: Digital Stereo (HDMI) Output (sinks: 1, sources: 0, priority: 5400, available: yes)
output:hdmi-stereo-extra1: Digital Stereo (HDMI 2) Output (sinks: 1, sources: 0, priority: 5200, available: yes)
output:hdmi-surround-extra1: Digital Surround 5.1 (HDMI 2) Output (sinks: 1, sources: 0, priority: 100, available: yes)
output:hdmi-surround71-extra1: Digital Surround 7.1 (HDMI 2) Output (sinks: 1, sources: 0, priority: 100, available: yes)
...
Active Profile: output:hdmi-stereo
...
Un certain profil peut être défini par commande avec un format comme ceci:
pactl set-card-profile output:hdmi-stereo <card name|number> <profile name>
Selon la question concernant les quatre sorties mentionnées, les commandes sont les suivantes:
pactl set-card-profile alsa_card.pci-0000_03_00.1 output:hdmi-stereo # LG ULTRAWIDE
pactl set-card-profile alsa_card.pci-0000_03_00.1 output:hdmi-stereo-extra1 # LG TV
pactl set-card-profile alsa_card.pci-0000_00_1b.0 output:iec958-stereo # Digital Output
pactl set-card-profile alsa_card.pci-0000_00_1b.0 output:analog-stereo # Headphones
Comme il est indiqué dans cette réponse , lorsque le nouveau profil est défini, vous devez ensuite:
pacmd set-default-sink <sink number of the target profile>
pacmd move-sink-input "$i" <sink number of the target profile>
# where $i is the index number of any active input: pacmd list-sink-inputs
Selon mes besoins, décrits dans la question, j'ai créé le script suivant:
#!/bin/bash
# Name: /usr/local/bin/audioswitch
# Usage: audioswitch; audioswitch 1; audioswitch 2; audioswitch 3; audioswitch 4
CARD_1="pci-0000_03_00.1" ### HDMI Audio Controller of NVidia GTX 660
CARD_1_PROFILE_1="hdmi-stereo" # LG ULTRAWIDE
CARD_1_PROFILE_2="hdmi-stereo-extra1" # LG TV
CARD_0="pci-0000_00_1b.0" ### Built-in Audio
CARD_0_PROFILE_1="iec958-stereo" # Digital Output
CARD_0_PROFILE_2="analog-stereo" # Headphones
# Read the user's input
CHOICE="${@}"
choice() {
if [ "$CHOICE" == 1 ]; then CARD="$CARD_1"; PROF="$CARD_1_PROFILE_1" # LG ULTRAWIDE
Elif [ "$CHOICE" == 2 ]; then CARD="$CARD_1"; PROF="$CARD_1_PROFILE_2" # LG TV
Elif [ "$CHOICE" == 3 ]; then CARD="$CARD_0"; PROF="$CARD_0_PROFILE_1" # Digital Output
Elif [ "$CHOICE" == 4 ]; then CARD="$CARD_0"; PROF="$CARD_0_PROFILE_2" # Headphones
else
echo -e "\nYou should choice between:"
echo -e "\n\t[1] LG ULTRAWIDE\n\t[2] LG TV\n\t[3] Digital Output\n\t[4] Headphones\n"
echo -n "Your choice: "; read CHOICE; echo; choice; # call the function again
fi
}; choice # call the function
# Set the choosen card profile as sink
pactl set-card-profile "alsa_card.${CARD}" "output:${PROF}";
# Set the default sink to the new one
pacmd set-default-sink "alsa_output.${CARD}.${PROF}" &> /dev/null
# Redirect the existing inputs to the new sink
for i in $(pacmd list-sink-inputs | grep index | awk '{print $2}'); do
pacmd move-sink-input "$i" "alsa_output.${CARD}.${PROF}" &> /dev/null
done
Le script est prêt à être utilisé avec raccourcis clavier personnalisés , car il peut gérer la valeur (1
-4
) du premier paramètre de position. Lorsqu'il est appelé sans paraneter supplémentaire, il vous demandera votre choix:
$ audioswitch
You should choice between:
[1] LG ULTRAWIDE
[2] LG TV
[3] Digital Output
[4] Headphones
Your choice: 1