Raccourci pour basculer entre la sortie stéréo analogique et la sortie audio HDMI


18

Pour passer à la sortie audio HDMI (du moniteur) et revenir à la sortie audio normale de la prise audio du système (pour les écouteurs, car mon moniteur n'a pas de sortie audio), je me retrouve à ouvrir les préférences sonores et à sélectionner le bon canal à chaque fois. Existe-t-il un moyen de créer un bouton à bascule dans le panneau ou d'attribuer une touche de raccourci à bascule, car je change si souvent.

:aplay -l 
**** List of PLAYBACK Hardware Devices ****
card 0: Intel [HDA Intel], device 0: STAC92xx Analog [STAC92xx Analog]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 3: HDMI 0 [HDMI 0]
  Subdevices: 0/1
  Subdevice #0: subdevice #0
card 0: Intel [HDA Intel], device 7: STAC92xx Digital [STAC92xx Digital]
  Subdevices: 1/1
  Subdevice #0: subdevice #0

entrez la description de l'image ici


1
+1 Ce serait génial si je pouvais passer au mode de sortie d'affichage HDMI et au mode son corrects en une seule touche.
Kit Menke

Ce qui serait encore mieux, c'est que s'il détecte ce canal audio HDMI / Display Port, il le commutera automatiquement. C'est à cela que sert l'amarrage. Il me semble qu'il y a quelque temps, un code d'amarrage qui changera la configuration en fonction de certains identifiants matériels (MAC). Quelqu'un sait comment cela s'appelle à nouveau?
Elijah Lynn

Réponses:


10

Avec pulseaudio, nous pouvons sélectionner le récepteur de sortie à partir de la ligne de commande:

pacmd set-default-sink "SINKNAME"

Cette commande peut être utilisée dans un lanceur, un script ou même affectée à un raccourci clavier pour basculer rapidement entre différents récepteurs. Veuillez remplacer "SINKNAME" par le nom ou le numéro de l'évier souhaité. Une liste des puits connus avec leurs numéros et noms associés est donnée par la commande:

pacmd list-sinks

Remarque: La modification du récepteur de sortie via l'interface de ligne de commande ne peut prendre effet que si la lecture du périphérique cible de flux est désactivée. Cela peut être fait en modifiant la ligne correspondante dans /etc/pulse/default.pa:

load-module module-stream-restore restore_device=false

Alternativement, nous pourrions exécuter pulseaudio pour émettre simultanément du son vers le périphérique audio interne et vers le périphérique hdmi en exécutant paprefs avec la possibilité d'ajouter un périphérique de sortie virtuel:

paprefs


2
pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.analog-stereo"et pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.hdmi-stereo"ne fonctionne qu'après avoir sélectionné le profil correspondant dans les préférences sonores. Si j'ai un ensemble HDMI et que j'exécute la commande pacmd pour la stéréo analogique, j'obtiens l'erreur Sink alsa_output.pci-0000_00_1b.0.analog-stereo does not exist.Mais si je sélectionne manuellement le profil dans l'interface graphique des préférences sonores et exécute la même commande, je n'obtiens pas l'erreur. Donc ça n'aide pas de changer.
iJeeves

@iJeeves: voir modifier pour la mise à jour.
Takkat

Problème similaire. Si j'exécute la commande, elle le changera visuellement dans l'interface graphique mais le son ne sera pas redirigé. Je dois le basculer manuellement dans l'interface graphique pour que cela fonctionne. Des idées?
Elijah Lynn

1
@ElijahLynn: Vous devrez peut-être également déplacer le flux: askubuntu.com/questions/71863/…
Takkat

@Takkat: Je ne l'ai pas encore essayé mais cela semble être le problème exact que je rencontrais. Merci beaucoup!
Elijah Lynn

7

J'ai trouvé cela très ennuyeux moi-même et j'ai écrit un script pour basculer la sortie:

#!/bin/bash

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

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

puis lié une touche inutilisée sur mon clavier pour l'exécuter (voir Comment lier des commandes personnalisées à des raccourcis clavier? )


Bien que vous ne vous soyez pas connecté depuis 18 mois, je voulais juste vous faire savoir que c'était la meilleure réponse IMO +1
WinEunuuchs2Unix

Comment puis-je faire cela si j'ai besoin de basculer entre deux cartes, pas seulement deux profils d'une carte?
Oebele

2

Encore un autre script de commutateur d'évier

testé sur Ubuntu 16.04


Mais celui-ci vous permet de basculer uniquement l'audio de l'application que vous souhaitez.

UTILISATION: Concentrez l'application dont vous souhaitez modifier le récepteur et exécutez ce script. C'est ça!!!

Ce script détecte l'application mise au point, recherche tous les fichiers audio en cours de lecture et les fait passer au récepteur disponible suivant.

https://gist.github.com/madacol/1a0d8569166886d2d98f073f7f5c5fe3

Expliquer le script

Nous devons trouver le PID de l'application sur le focus

Mais d'abord, nous avons besoin du xid

xprop -root _NET_ACTIVE_WINDOW 

Insérez-le ici $xidpour obtenir le pid de l'application

xprop -id $xid _NET_WM_PID

Maintenant, nous devons trouver les entrées de puits liées à ce PID

Commençons par linéariser la sortie de la commande pacmd list-sink-inputspour répertorier une entrée de récepteur par ligne, en affichant son index, son récepteur et son pid sur la même ligne

pacmd list-sink-inputs | grep -E 'index:|sink:|process.id' | tr '\n' ' ' | tr -d '"' | sed -e 's/index:/\n/g' | tail -n +2

analysons-le étape par étape:

grep -E 'index:|sink:|process.idne conserver que les lignes qui contiennent index:, sink:ouprocess.id

tr '\n' ' ' rejoint toutes les lignes

tr -d '"'supprime tous les "caractères. Nécessaire pour obtenir le pid sans guillemets

sed -e 's/index:/\n/g'remplace toutes les index:occurrences par un nouveau caractère de ligne\n

tail -n +2 supprime la première ligne car elle est vide

Et le résultat est quelque chose comme ceci:

  180 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 3521
  181 sink: 1 <alsa_output.pci-0000_00_01.0.analog-stereo> application.process.id = 2733
  182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

Analysons une ligne pour comprendre ce que cela signifie:

  # 182 sink: 0 <alsa_output.pci-0000_00_00.1.hdmi-stereo-extra1> application.process.id = 13752

182est l'indice récepteur-entrée, 0est l'indice récepteur, et 13752à la fin, est le pid de l'application d'appartenance

Ensuite, nous parcourons chaque ligne

... | while IFS= read -r line || [ -n "$line" ]; do
  sink_input_pid=$(echo $line | awk '{print $NF}')

Enfin, ne filtrez que le pid de l'entrée du récepteur qui correspond au pid de l'application ciblée

  if [ $sink_input_pid = $app_pid ]; then

Extraire des données

Avec awknous pouvons obtenir les éléments dont nous avons besoin

sink_input_index=$(echo $sink_input | awk '{print $1}')
current_sink_index=$(echo $sink_input | awk '{print $3}')

Obtenez le nombre de puits, pour savoir quand la rotation des puits doit redémarrer à partir de 0.

sink_list_size=${#sink_list_array[@]}

Pour trouver le prochain puits, nous devons parcourir la liste des puits, pour savoir lequel correspond à current_sink_index et connaître l'indice du prochain puits.

i=0
for sink in "${sink_list_array[@]}"; do
  i=$((($i+1)%sink_list_size))  # i++ mod(#sinks)
  if [ $sink = $current_sink_index ]; then
    next_sink_index=${sink_list_array[i]}
    break
  fi
done

Et enfin, nous déplaçons l'entrée de l'évier pour jouer dans next_sink_index

pacmd move-sink-input $sink_input_index $next_sink_index

Remarque sur Ubuntu 16.04:

Lors de la configuration de la touche de raccourci, je n'ai pas pu le faire fonctionner avec le gestionnaire de raccourcis d'ubuntu. J'ai donc dû installer compizconfig-settings-manager

sudo apt-get install compizconfig-settings-manager

+1 pour une excellente première réponse en tant que nouvel utilisateur. Étant donné que la question d'origine était pour Ubuntu 11.04, vous devez indiquer avec quelle version a été testé.
WinEunuuchs2Unix

@ WinEunuuchs2Unix Wow! Je vous remercie :). J'ai ajouté la version d'Ubuntu sous le titre.
Madacol


1

Puisqu'il n'y a qu'une seule carte son visible dans la capture d'écran, je pense que la sortie de cette carte son devrait être changée.

Par exemple: j'ai un ordinateur portable avec une carte son intégrée, mais il a une sortie numérique (SPDIF) lorsqu'il est connecté.

Donc ce que je voulais faire, c'était changer la sortie active ou "Profile" dans pulseaudio.

J'ai trouvé les commandes qui font exactement cela:

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

Ce que j'ai fait pour obtenir les noms corrects pour le réglage de sortie souhaité - ici, la sortie numérique, mais l'entrée (micro) analogique - était:

pacmd list | grep output

1

J'ai également essayé de trouver une solution à ce problème. Depuis Ubuntu 11.04, cela ne semble pas être possible directement, je n'ai trouvé que ce guide pour ajouter à la fois HDMI et Analogique en tant que sorties séparées, donc pacmd affiche maintenant 3 puits. Ensuite, il est possible de basculer entre les récepteurs en utilisant les commandes ci-dessus. ( voir aussi )

Mais apparemment Ubuntu 11.11 obtiendra un PulseAudio avec un système de détection de jack. Selon le site Web ci-dessous, David Henningsson a codé une détection via udev afin que l'audio pulsé soit automatiquement basculé sur la dernière sortie ajoutée, y compris la commutation entre différents profils de la même carte son (comme c'est le cas avec votre et ma configuration). (voir ici )

J'espère donc que cela fonctionnera, lorsque j'essaierai la version finale vendredi prochain.


1

Sur la base de nombreuses réponses précédentes, j'ai écrit un script qui définit le récepteur de lecture en alternance entre ceux disponibles.

La meilleure façon de l'utiliser est de créer un raccourci clavier pour l'exécuter. Ainsi, chaque fois que vous appuyez sur cette combinaison de touches, l'audio est redirigé vers le prochain récepteur disponible.

Le code est disponible ici: https://gist.github.com/germank/7fa2fb07d45a838bf890addadd8bea8c


0

Dans mon cas, les options analogiques n'étaient pas dans la liste. Installez pavucontrol: sudo apt install pavucontrol

Pourrait résoudre le problème en démarrant l'application:

  1. Démarrez l'application via le terminal, en entrant: pavucontrol(entrée)
  2. Accédez à l'onglet «Configuration».
  3. Sélectionnez le profil de sortie stéréo Analoge sur Intern Sound

entrez la description de l'image ici

Maintenant je pouvais ici sonner et sélectionner différents profils (sous Linux Mint):

entrez la description de l'image ici


0

Une alternative à Sound Switcher Indicator (qui nécessite l'ajout d'un PPA) consiste à créer une commande (ou un script) et à l'appeler avec un raccourci:

Dans mon cas, c'était le hdmi-stereo-extra1+inputprofil, 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é ( gnome-control-center keyboard) pour l'exécuter avec bash -c(vous avertira en cas de conflit avec un autre raccourci):

capture d'écran

capture d'écran

J'utilise:

  • Super + Alt + o: Basculez la sortie entre les écouteurs et HDMI.
  • Super + Alt + Up: Vol Up
  • Super + Alt + Down: Vol Down

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

Testé sur Ubuntu 16.04 et 18.04


Si vous ne souhaitez pas un comportement supérieur à un script, j'ai apporté quelques modifications en fonction de la réponse @ user829996:

#!/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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.