web-dev-qa-db-fra.com

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

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

Je répète cette procédure beaucoup de temps et j'ai commencé à me demander 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.

ÉDITER:

J'ai essayé d'utiliser pacmd, mais list-sinks ne me donne que l'appareil que j'utilise actuellement:

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

Après un changement de GUI:

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

Et si j'essaye de le changer, j'obtiens:

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.
34

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".

La solution qui a réellement fonctionné est donc:

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 le moniteur et les haut-parleurs 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, pour accélérer le changement, j'ai configuré 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 le Shell: audio-hdmi ou audio-ordinateur portable

29

J'ai écrit une petite applet indicatrice qui vous permet de changer la sortie audio. Aucun script Shell mais peut être utile pour vous ou pour d'autres lecteurs.

https://github.com/lkettenb/sound-output-switcher

Screenshot

6
Lukas

J'ai créé un très petit script basé sur les précédents, qui permute non seulement l'audio mais aussi la sortie vidéo. Il utilise 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, c'est particulièrement utile car je n'aime pas cloner les écrans. J'utilise l'un ou l'autre. Vous devrez peut-être adapter les profils audio à votre système spécifique.

3
user56655

Lukas python ( https://github.com/lkettenb/sound-output-switcher , publié ci-dessus) pour implémenter une applet de notification fonctionne bien. package appindicator qui peut être installé avec

Sudo apt-get install python-appindicator
2
P.Windridge

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

2
favadi

J'ai créé le script python qui fait ce qui suit:

  1. Basculer le périphérique par défaut vers le prochain périphérique de la liste (avec bouclage), quel que soit l'identifiant
  2. Déplace toutes les applications en cours d'exécution sur cet appareil.
  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)

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

1
Nimrod.s

Vous pouvez essayer ce script: https://github.com/giner/helplinux/tree/master/scripts/switch-sound

Testé sur Ubuntu 10.04 - 13.04 et Arch Linux

Si utile. J'ai des écouteurs bluetooth et j'avais besoin de configurer le changement de casque et de profils A2DP pour eux. Résolu en ajoutant ces fonctions:

talk() {
  card=$(pacmd list-cards | grep 'name:' | grep bluez | cut -d: -f2 | sed -e 's/[< >]//g')
  pacmd set-card-profile $card headset_head_unit
}

mus() {
  card=$(pacmd list-cards | grep 'name:' | grep bluez | cut -d: -f2 | sed -e 's/[< >]//g')
  pacmd set-card-profile $card a2dp_sink
}
0
brutallord

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

En une seule ligne

Dans mon cas, c'était le profil hdmi-stereo-extra1+input, Donc sur une ligne il y aurait: [[ $(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 avec bash -c (Vous avertira en cas de conflit avec un autre raccourci):

enter image description here

Vous pouvez également ajouter un alias à votre .bashrc.

Dans un script

J'ai fait quelques changements basés sur @ user829996 (et ici @ user56655) réponse:

#!/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
0
Pablo A