Changer les entrées / sorties PulseAudio à partir de Shell?

38

J'ai de beaux casques d'écoute sans fil que j'utilise de temps en temps, en plus de mes haut-parleurs et de mon microphone normal.

J'aimerais écrire un script pour basculer entre une source d'entrée et de sortie et une autre, essentiellement un commutateur entre mon casque et mes haut-parleurs + microphone.

J'aimerais changer entre ceci:

...et ça:

Existe-t-il un moyen pour moi d’écrire un transfert entre les deux entrées et les sorties? Essentiellement, je cherche quelque chose comme ceci:

CURRENT_INPUT="$(get-current-input-name)"
CURRENT_OUTPUT="$(get-current-output-name)"

if [ "$CURRENT_INPUT" == "Vengeance 2000" ]; then
    set-current-input "HD Pro Webcam C920"
else 
    set-current-input "Vengeance 2000"
fi

if ["$CURRENT_OUTPUT" == "Vengeance 2000" ]; then
    set-current-output "Built-in Audio"
else
    set-current-output "Vengeance 2000"
fi

Y at-il un moyen de script cela?

Naftuli Kay
la source
3
Vous pouvez consulter les man pactloptions de ligne de commande PulseAudio.
Teresa e Junior
Hors sujet: quelle application graphique est-ce sur ces captures d'écran?
WhyNotHugo
C'est les paramètres système de l'élémentaire.
Naftuli Kay

Réponses:

53

Comme @ Teresa-e-Junior a souligné pactll'outil à utiliser:

Tout d’abord, nous voudrons peut-être obtenir les identifiants de nos puits d’AP. Sur mon système, voici ce que je reçois:

$ pactl list short sinks
0       alsa_output.pci-0000_01_00.1.hdmi-surround      module-alsa-card.c      s16le 6ch 44100Hz  SUSPENDED
1       alsa_output.pci-0000_00_1b.0.analog-stereo      module-alsa-card.c      s16le 2ch 44100Hz  RUNNING

Le puits 1 est actuellement mon puits par défaut.
Mais maintenant, je veux que tous mes flux actuels et futurs soient lus via HDMI (c-à-d. Évier 0).

Il y a une commande pour définir le récepteur par défaut pour PulseAudio, mais cela ne semble pas avoir d'effet sur mon PC:

$ pacmd set-default-sink 0 #doesn't work on my PC :(

Au lieu de cela, de nouveaux flux semblent être connectés au récepteur auquel un flux a été déplacé le plus récemment.

Alors disons à pactl de déplacer tous les flux en cours de lecture vers le puits 0. Nous devons d’abord les lister:

$ pactl list short sink-inputs
290     1       176     protocol-native.c       float32le 2ch 44100Hz
295     1       195     protocol-native.c       float32le 2ch 44100Hz

Ok, nous avons deux flux (ID 290 et 295) qui sont tous deux attachés à couler 1.
Passons-les à couler 0:

$ pactl move-sink-input 290 0
$ pactl move-sink-input 295 0

Donc, ça devrait être ça. Maintenant, nous devons juste faire un script qui fait le travail pour nous:

#!/bin/bash

if [ -z "$1" ]; then
    echo "Usage: $0 <sinkId/sinkName>" >&2
    echo "Valid sinks:" >&2
    pactl list short sinks >&2
    exit 1
fi

newSink="$1"

pactl list short sink-inputs|while read stream; do
    streamId=$(echo $stream|cut '-d ' -f1)
    echo "moving stream $streamId"
    pactl move-sink-input "$streamId" "$newSink"
done

Vous pouvez l'appeler avec un ID de récepteur ou un nom de récepteur en tant que paramètre (c'est-à-dire 0ou quelque chose comme cela alsa_output.pci-0000_01_00.1.hdmi-surround).

Vous pouvez maintenant attacher ce script à un événement udev ou à un raccourci clavier.

mreithub
la source
1
Super merci! J'ai transformé cela en un script Python qui le rend agréable et facile à utiliser. Il est disponible ici .
Naftuli Kay
1
Connexes: askubuntu.com/a/14083/6645
Naftuli Kay
1
@NaftuliTzviKay: votre script n'est plus disponible. Si vous l'avez toujours, envisagez de publier sur [GitHub Gist] (gist.github.com).
Denilson Sá Maia
Et si 0 sink input(s) available.? Mais ce lecteur flash merdique est toujours en lecture audio? Et je vois flash player dans la client(s) logged insection depacmd list
Zhigalin le
1
$ pacmd set-default-sink INDEXest toujours nécessaire pour mon script, sinon les commandes du clavier permettant de modifier le volume continuent à utiliser l'ancienne source de récepteur.
Myol
9

Les commandes suivantes permettent de manipuler le serveur de son PulseAudio:

pacmd - Used to reconfigure a PulseAudio sound server during runtime.
pactl - Used to control a running PulseAudio sound server.

Voici quelques exemples de leur fonctionnement.

pacmd list-sinks:: nom de la liste ou numéro d'index des puits possibles

pacmd set-default-sink [sinkname]:: régler la sortie par défaut évier

pacmd set-default-source [sourcename]:: définir l' entrée par défaut

pacmd set-sink-volume [index] [volume]:: régler le volume de l'évier

pacmd set-source-volume index volume:: plage de contrôle du volume 0 - 65536 (plus le chiffre est bas, plus le volume est bas)

Ce ne sont que quelques exemples que j'ai extraits de la page de wiki et de manuel. Référencez -le pour plus d'informations. Ou vous pouvez afficher les commandes --helpou la manpage.

Un outil de ligne de commande existe déjà à cette fin. Son nom est ponymix . C'est un mélangeur en ligne de commande pour PulseAudio. Le lien fourni est pour les projets github. Il a été développé par un ami et collègue Arch Linux Trusted User / Developer. Si vous n’exécutez pas Arch, vous pouvez simplement le compiler à partir de la source en utilisant makeet sudo make install.

$ ponymix --help
    usage: ponymix [options] <command>... 
Options:
 -h, --help              display this help and exit    
 -c, --card CARD         target card (index or name)
 -d, --device DEVICE     target device (index or name)
 -t, --devtype TYPE      device type
 -N, --notify            use libnotify to announce volume changes
     --source            alias to -t source
     --input             alais to -t source
     --sink              alias to -t sink
     --output            alias to -t sink
     --sink-input        alias to -t sink-input
     --source-output     alias to -t source-output
Device Commands:
  help                   display this message
  defaults               list default devices (default command)
  set-default            set default device by ID
  list                   list available devices
  list-short             list available devices (short form)
  list-cards             list available cards
  list-cards-short       list available cards (short form)
  get-volume             get volume for device
  set-volume VALUE       set volume for device
  get-balance            get balance for device
  set-balance VALUE      set balance for device
  adj-balance VALUE      increase or decrease balance for device
  increase VALUE         increase volume
  decrease VALUE         decrease volume
  mute                   mute device
  unmute                 unmute device
  toggle                 toggle mute
  is-muted               check if muted
Application Commands:
  move DEVICE            move target device to DEVICE
  kill DEVICE            kill target DEVICE
Card Commands:
  list-profiles          list available profiles for a card
  list-profiles-short    list available profiles for a card(short form)
  get-profile            get active profile for card
  set-profile PROFILE    set profile for a card
Cinelli
la source
Hé merci pour cette réponse! Cela m'a beaucoup aidé avec un problème lié à celui-ci .
KlaymenDK
5

Sur mon ordinateur portable fonctionnant sous Fedora 20, la sortie HDMI ne figure pas en tant que puits dans le profil par défaut, mais comme un autre profil lui - même.

J'ai seulement 1 évier comme celui-ci, de la bonne musique jouant sur les haut-parleurs de mon ordinateur portable:

$ pactl list short sinks
8   alsa_output.pci-0000_00_1b.0.analog-stereo  module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

Si je lance pactl set-card-profile 0 output:hdmi-stereoalors belle musique joue via HDMI. Je reçois:

$ pactl list short sinks
14  alsa_output.pci-0000_00_1b.0.hdmi-stereo    module-alsa-card.c  s16le 2ch 44100Hz   RUNNING

Pour revenir au défaut, je cours pactl set-card-profile 0 output:analog-stereo+input:analog-stereo. De toute façon, le défaut est de nouveau présent si je redémarre.

La liste des profils de ma carte est quelque part sur la pactl list cardssortie.

RubenCaro
la source
Cette information était déjà fournie par la réponse acceptée. Ne copiez pas les réponses des autres utilisateurs, sauf si vous avez quelque chose à ajouter. Cela récapitule simplement l’autre réponse et n’a fourni rien de nouveau ni d’utile!
slm
5
set-card-profilen'a pas été mentionné précédemment, et c'est l'information la plus importante sur cette réponse.
Spidey
0

En étendant la réponse acceptée par @cinelli, je suis arrivé avec un script qui

  • bascule entre exactement deux puits / périphériques de sortie à définir dans le script,
  • bascule les flux ET le puits par défaut, pour que les touches multimédias du clavier fonctionnent et
  • laisse mon module d'annulation d'écho intact.

Changer au besoin!

#!/bin/bash

# Small script to switch between two hardcoded sound output devices

# Set patterns for devices to be toggled. Have to match to second column
# in output of "pactl list short sinks".
# (Could also hardcode the full names, but this might be a little more robust)
TOGGLE1="Jabra_EVOLVE"
TOGGLE2="Generic_ThinkPad_Dock_USB"

# Discover which sink (output device) is active, and set up toggles
while read -r stream; do
  echo "$stream"
  if echo "$stream" | grep -q "RUNNING"; then
    currentSink=$(echo "$stream" | cut -f2)
  fi
  if echo "$stream" | grep -q "$TOGGLE1"; then
    toggle1Sink=$(echo "$stream" | cut -f2)
  fi
  if echo "$stream" | grep -q "$TOGGLE2"; then
    toggle2Sink=$(echo "$stream" | cut -f2)
  fi
done < <(pactl list short sinks)

# Set up where to switch to
if [ "$currentSink" = "$toggle1Sink" ]; then
  newSink=$toggle2Sink
else
  newSink=$toggle1Sink
fi

# Switch streams AND default sink
pactl list short sink-inputs|while read -r stream; do
    streamId=$(echo "$stream"|cut '-d ' -f1)
    # exclude echo cancellation module, but switch all other streams
    # You can, but don't have to remove if condition if no such module present
    if [ "$streamId" != "0" ]; then
      echo "moving stream $streamId"
      pactl move-sink-input "$streamId" "$newSink"
    fi;
    # Also switch default sink, so media control keys work correctly
    pactl set-default-sink "$newSink"
done
Thor
la source