Comment puis-je basculer entre différents matériels de sortie audio à l'aide du shell?

34

J'utilise mon ordinateur portable avec un moniteur externe doté de haut-parleurs. Lorsque le moniteur est connecté via HDMI, je peux permuter (à l'aide de l'interface graphique: Réglage du son -> Matériel) entre la sortie audio normale d'un ordinateur portable et la sortie du moniteur.

Je répète souvent cette procédure et je me suis demandé si je pouvais l’automatiser ou, de toute façon, l’exécuter plus rapidement en utilisant le shell.

Ma distribution est Ubuntu 12.04 avec gnome 3.

MODIFIER:

J'ai essayé d'utiliser pacmd, mais list-sinks ne me donne que le périphérique que j'utilise actuellement:

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.hdmi-stereo>

Après un changement d'interface graphique:

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>

Et si j'essaie de le changer, je reçois:

pacmd set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
Welcome to PulseAudio! Use "help" for usage information.
Sink alsa_output.pci-0000_00_1b.0.hdmi-stereo does not exist.
Luigi Massa Gallerano
la source

Réponses:

28

Dans ce cas, la carte est toujours la même. Ce qui change entre un commutateur et un autre, c'est le "profil de carte".

Donc, la solution qui a réellement fonctionné est la suivante:

pacmd set-card-profile <cardindex> <profilename>

Dans mon cas, j'ai trouvé tous les profils de carte avec:

pacmd list-cards

Et après, je peux basculer entre les haut-parleurs d’écran et d’ordinateur portable avec:

pacmd set-card-profile 0 output:hdmi-stereo

Et:

pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo

Où 0 est l'index de la carte:

pacmd list-cards
Welcome to PulseAudio! Use "help" for usage information.
>>> 1 card(s) available.
    index: 0
    name: <alsa_card.pci-0000_00_1b.0>

Et enfin, afin de rendre le changement plus rapide, j’ai créé deux alias dans mon fichier .bashrc:

alias audio-hdmi='pacmd set-card-profile 0 output:hdmi-stereo+input:analog-stereo'
alias audio-laptop='pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo'

De cette façon, je peux basculer entre l'audio du moniteur ou de l'ordinateur portable (casque) en tapant dans la coque: audio-hdmi ou audio-laptop

Luigi Massa Gallerano
la source
Hm. Mon pacmd n'a pas l'option 'list-cards' ...
ka3ak
3

J'ai créé un très petit script basé sur les précédents, qui permute non seulement l'audio mais également la sortie vidéo. Il utilise le disper pour basculer entre les affichages.

Voici le code:

#!/bin/bash

CURRENT_PROFILE=$(pacmd list-cards | grep "active profile" | cut -d ' ' -f 3-)

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo>" ]; then
        pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo"
        disper -s
else 
        pacmd set-card-profile 0 "output:hdmi-stereo"
        disper -S        
fi

Pour moi, cela est particulièrement utile car je n'aime pas cloner les affichages. J'utilise l'un ou l'autre. Vous devrez peut-être adapter les profils audio à votre système spécifique.

utilisateur56655
la source
2

Vous pouvez utiliser pactl, consultez sa page de manuel pour plus d'informations.

favadi
la source
2

Le script python de Lukas ( https://github.com/lkettenb/sound-output-switcher , posté ci-dessus) pour implémenter une applet notifiant fonctionne bien. Il a besoin du paquet appindicator. Cela peut être installé avec

sudo apt-get install python-appindicator
P.Windridge
la source
3
Veuillez inclure au moins quelques mots dans votre réponse pour expliquer la nature du script et son utilité.
derobert
0

Comme je l'ai dit ici (probablement un doublon), une alternative à Sound Switcher Indicator (qui nécessite l'ajout d'un PPA):

En une ligne

Dans mon cas était hdmi-stereo-extra1+inputprofil, donc dans une ligne serait: [[ $(pacmd list-cards | grep "active profile" | cut -d " " -f 3-) = "<output:hdmi-stereo-extra1+input:analog-stereo>" ]] && pacmd set-card-profile 0 "output:analog-stereo+input:analog-stereo" || pacmd set-card-profile 0 "output:hdmi-stereo-extra1+input:analog-stereo".

Vous pouvez utiliser un raccourci personnalisé pour l'exécuter bash -c(vous avertir en cas de conflit avec un autre raccourci):

entrez la description de l'image ici

Aussi, vous pouvez ajouter un aliasà votre .bashrc.

Dans un script

J'ai apporté des modifications sur la base de @ user829996 (et ici @ user56655).

#!/bin/bash
set -euo pipefail # strict mode

activeProfile() { pacmd list-cards | grep "active profile" | cut -d " " -f 3-; }
CURRENT_PROFILE="$(eval activeProfile)"

# If it doesn't work run  pacmd list-cards  and try the other outputs from profile section
ANALOG_PROFILE="output:analog-stereo+input:analog-stereo"
HDMI_PROFILE="output:hdmi-stereo-extra1+input:analog-stereo"

if [ "$CURRENT_PROFILE" = "<output:hdmi-stereo-extra1+input:analog-stereo>" ] ; then
  pacmd set-card-profile 0 "$ANALOG_PROFILE"
else
    pacmd set-card-profile 0 "$HDMI_PROFILE"
fi

activeProfile
Pablo A
la source
0

J'ai créé le script python suivant qui effectue les tâches suivantes:

  1. Basculez le périphérique par défaut sur le périphérique suivant de la liste (avec bouclage), quel que soit l'identifiant
  2. Déplace toutes les applications en cours d'exécution sur ce périphérique.
  3. Envoie une notification à l'interface graphique avec le nom de l'appareil.
#!/usr/bin/env python3
import subprocess
# Toggle default device to the next device (wrap around the list)
cards_info = subprocess.run(['pacmd','list-sinks'], stdout=subprocess.PIPE)
card_indexes = subprocess.run(['grep', 'index'], stdout=subprocess.PIPE, input=cards_info.stdout)
indexes_list = card_indexes.stdout.decode().splitlines()
card_descriptions = subprocess.run(['grep', 'device.description'], stdout=subprocess.PIPE, input=cards_info.stdout)
indices = [i for i, s in enumerate(indexes_list) if '*' in s]
if (len(indices) != 1):
    print("Error finding default device")
    exit(1)
default_index = indices[0]
next_default = 0
if (default_index != (len(indexes_list) - 1)):
    next_default = default_index + 1
next_default_index =  (indexes_list[next_default].split("index: ",1)[1])
subprocess.run(['pacmd','set-default-sink %s' %(next_default_index)], stdout=subprocess.PIPE)

# Move all existing applications to the new default device
inputs_info = subprocess.run(['pacmd','list-sink-inputs'], stdout=subprocess.PIPE)
inputs_indexes = subprocess.run(['grep', 'index'], stdout=subprocess.PIPE, input=inputs_info.stdout)
inputs_indexes_list = inputs_indexes.stdout.decode().splitlines()
for line in inputs_indexes_list:
    input_index =  (line.split("index: ",1)[1])
    subprocess.run(['pacmd','move-sink-input %s %s' %(input_index, next_default_index)], stdout=subprocess.PIPE)

# Send notification to the GUI
descriptions_list = card_descriptions.stdout.decode().splitlines()
if (len(descriptions_list) == len(indexes_list)):
    description =  (descriptions_list[next_default].split("= ",1)[1])[1:-1]
    args = ["notify-send", "Default audio card changed", 'Default audio card was set to %s' %(description)]
    subprocess.run(args, stdout=subprocess.PIPE)

Attribué un raccourci clavier au script, et ma vie est heureuse maintenant

Nimrod.s
la source