web-dev-qa-db-fra.com

Comment permuter les sorties audio d'un périphérique audio à partir de la CLI?

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?

enter image description here

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:

    • Sortie numérique
    • Écouteurs
  • (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:

enter image description here

$ 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:

enter image description here

$ 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?

5
pa4080

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
4
pa4080