it-swarm.com.de

PulseAudio Input / Output von Shell ändern?

Ich habe einen Satz netter kabelloser Kopfhörer, die ich von Zeit zu Zeit zusätzlich zu meinen Lautsprechern und meinem normalen Mikrofon benutze.

Ich möchte ein Skript schreiben, um zwischen einer Eingangs- und Ausgangsquelle und einer anderen zu wechseln, im Wesentlichen einen Wechsel zwischen meinen Kopfhörern und meinen Lautsprechern + Mikrofon.

Ich möchte zwischen diesen wechseln:

...und das:

Gibt es für mich eine Möglichkeit, eine Übertragung zwischen den beiden Ein- und Ausgängen per Skript durchzuführen? Im Wesentlichen suche ich so etwas:

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

Gibt es eine Möglichkeit, dies zu schreiben?

40
Naftuli Kay

Wie @ Teresa-e-Junior hervorhob, ist pactl das zu verwendende Werkzeug:

Zunächst möchten wir vielleicht die IDs unserer PA-Waschbecken erhalten. Auf meinem System bekomme ich Folgendes:

$ 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

Spüle 1 ist derzeit meine Standardsenke.
Aber jetzt möchte ich, dass alle meine aktuellen und zukünftigen Streams über HDMI abgespielt werden (d. H. Senke 0).

Es gibt einen Befehl zum Festlegen der Standardsenke für PulseAudio, der jedoch keine Auswirkungen auf meinen PC zu haben scheint:

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

Stattdessen scheinen neue Streams mit der Senke verbunden zu sein, in die zuletzt ein Stream verschoben wurde.

Lassen Sie uns also pactl anweisen, alle aktuell abgespielten Streams zu verschieben, um 0 Zu versenken. Wir müssen sie zuerst auflisten:

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

Ok, wir haben zwei Streams (IDs 290 und 295), die beide an sink 1 Angehängt sind.
Bewegen wir sie zum Sinken 0:

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

Das sollte es also sein. Jetzt müssen wir nur noch ein Skript erstellen, das die Arbeit für uns erledigt:

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

Sie können es entweder mit einer Senken-ID oder einem Senken-Namen als Parameter aufrufen (d. H. Entweder 0 Oder so etwas wie alsa_output.pci-0000_01_00.1.hdmi-surround).

Jetzt können Sie dieses Skript an ein udev-Ereignis oder eine Tastenkombination anhängen.

58
mreithub

Die folgenden Befehle werden zum Bearbeiten des PulseAudio-Soundservers verwendet:

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

Hier sind einige Beispiele, wie sie funktionieren.

pacmd list-sinks :: Listenname oder Indexnummer von mögliche Waschbecken

pacmd set-default-sink [sinkname] :: Setze die Standardausgabesenke

pacmd set-default-source [sourcename] :: setze die Standardeingabe

pacmd set-sink-volume [index] [volume] :: Setze das Volumen der Senke

pacmd set-source-volume index volume :: Lautstärkeregler Bereich 0 - 65536 (je niedriger die Zahl, desto niedriger die Lautstärke)

Dies sind nur einige, die ich aus der Wiki & Manpage herausgezogen habe. Referenz this für detailliertere Informationen. Oder Sie können entweder die Befehle --help Oder die Seite man anzeigen.

Es gibt auch bereits ein Befehlszeilenprogramm, das diesen Zweck erfüllt. Der Name ist ponymix . Es ist ein Befehlszeilenmischer für PulseAudio. Der bereitgestellte Link führt zum Projekt Github. Es wurde von einem Freund und Kollegen von Arch Linux Trusted User/Developer entwickelt. Wenn Sie Arch nicht ausführen, können Sie es einfach mit make und Sudo make install Aus dem Quellcode kompilieren.

$ 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
10
cinelli

Auf meinem Laptop mit Fedora 20 wird der HDMI-Ausgang im Standardprofil nicht als Senke aufgeführt, sondern als anderes Profil.

Ich habe nur 1 Waschbecken wie dieses, schöne Musik spielt auf meinen Laptop-Lautsprechern:

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

Wenn ich pactl set-card-profile 0 output:hdmi-stereo dann wird schöne Musik über HDMI abgespielt. Ich bekomme:

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

Um zum Standard zurückzukehren, starte ich einfach pactl set-card-profile 0 output:analog-stereo+input:analog-stereo. In beiden Fällen ist die Standardeinstellung wieder vorhanden, wenn ich neu starte.

Die Liste der Profile für meine Karte befindet sich irgendwo auf pactl list cards Ausgabe.

5
RubenCaro

Ich habe die akzeptierte Antwort von @cinelli erweitert und mir ein Skript ausgedacht, das

  • schaltet zwischen genau zwei Senken/Ausgabegeräten um, die im Skript definiert werden müssen,
  • schaltet die Streams UND die Standardsenke um, sodass die Medientasten auf der Tastatur funktionieren und
  • lässt mein Echokompensationsmodul unberührt.

Nach Bedarf ändern!

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