PulseAudio Input / Output von Shell ändern?

38

Ich habe ein paar schöne kabellose Kopfhörer, die ich von Zeit zu Zeit benutze, zusätzlich zu meinen Lautsprechern und meinem normalen Mikrofon.

Ich möchte ein Skript schreiben, um zwischen einer Eingabe- und Ausgabequelle und einer anderen umzuschalten, im Wesentlichen zwischen meinen Kopfhörern und meinen Lautsprechern + Mikrofon.

Ich möchte zwischen diesen wechseln:

...und das:

Gibt es für mich eine Möglichkeit ein Skript zwischen den beiden Ein- und Ausgängen zu übertragen? 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 skripten?

Naftuli Kay
quelle
3
Sie können sich die man pactlBefehlszeilenoptionen von PulseAudio ansehen .
Teresa e Junior
Off-Topic: Welche GUI-Anwendung ist das auf diesen Screenshots?
WhyNotHugo
Es sind die Systemeinstellungen von elementary.
Naftuli Kay

Antworten:

53

Wie @ Teresa-e-Junior hervorhob, pactlist das Werkzeug zu verwenden:

Zunächst möchten wir möglicherweise die IDs unserer PA-Senken abrufen. 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

Waschbecken 1 ist derzeit mein Standard Waschbecken.
Aber jetzt möchte ich, dass alle meine aktuellen und zukünftigen Streams über HDMI abgespielt werden (dh 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, auf die zuletzt ein Stream verschoben wurde.

Lassen Sie uns also pactl anweisen, alle aktuell wiedergegebenen Streams zum Sinken zu bringen 0. 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 angeschlossen sind 1.
Verschieben 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 Senkennamen als Parameter aufrufen (dh entweder 0oder so ähnlich alsa_output.pci-0000_01_00.1.hdmi-surround).

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

mreithub
quelle
1
Super, danke! Ich habe dies in ein Python-Skript umgewandelt, mit dem es schön und einfach zu arbeiten ist. Es ist hier verfügbar .
Naftuli Kay
1
Siehe auch
Naftuli Kay
1
@NaftuliTzviKay: Ihr Skript ist nicht mehr verfügbar. Wenn Sie es noch haben, können Sie es auf [GitHub Gist] (gist.github.com) veröffentlichen.
Denilson Sá Maia
Und wenn doch 0 sink input(s) available.? Aber dieser beschissene Flash-Player spielt immer noch Audio ab? Und ich sehe Flash-Player in der client(s) logged inSektionpacmd list
Zhigalin
1
$ pacmd set-default-sink INDEXwird für mein Skript noch benötigt, ansonsten verwenden Tastaturbefehle zum Ändern der Lautstärke weiterhin die alte Senkenquelle.
Myol
9

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 möglicher Senken

pacmd set-default-sink [sinkname]:: die eingestellte Standardausgabe sink

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

pacmd set-sink-volume [index] [volume]:: die Senke eingestellt Volumen

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

Dies sind nur einige, die ich aus der Wiki & Manpage entfernt habe. Referenz dieses für weitere Informationen. Oder Sie können entweder Befehle --helpoder eine manSeite anzeigen .

Zu diesem Zweck gibt es bereits ein Befehlszeilentool. Es heißt ponymix . Es ist ein Befehlszeilenmixer für PulseAudio. Der angegebene Link führt zum Projekt github. Es wurde von einem Freund und Mitstreiter von Arch Linux Trusted User / Developer entwickelt. Wenn Sie Arch nicht ausführen, können Sie es einfach mit makeund aus dem Quellcode kompilieren 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
quelle
Hey, danke für diese Antwort! Es half mir eine Menge bei einem Problem im Zusammenhang mit diesem .
KlaymenDK
5

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

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

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

Wenn ich laufe, läuft pactl set-card-profile 0 output:hdmi-stereogute Musik über HDMI. 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, renne ich einfach pactl set-card-profile 0 output:analog-stereo+input:analog-stereo. In beiden Fällen ist die Standardeinstellung wieder vorhanden, wenn ich einen Neustart durchführe.

Die Liste der Profile für meine Karte wird irgendwo pactl list cardsausgegeben.

RubenCaro
quelle
Diese Information wurde bereits von der akzeptierten Antwort geliefert. Kopieren Sie die Antworten anderer Benutzer nur, wenn Sie noch etwas hinzuzufügen haben. Dadurch wird nur die andere Antwort aufgearbeitet und nichts Neues oder Nützliches bereitgestellt!
slm
5
set-card-profilewurde zuvor nicht erwähnt, und das ist die wichtigste Information zu dieser Antwort.
Spidey