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.
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
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.
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.
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
Vous pouvez utiliser pactl
, lisez sa page de manuel pour plus d'informations.
J'ai créé le script python qui fait ce qui suit:
#!/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
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
}
Comme je l'ai dit ici (probablement un doublon), une alternative à Sound Switcher Indicator (qui nécessite l'ajout d'un PPA):
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):
Vous pouvez également ajouter un alias
à votre .bashrc
.
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