Kurzbefehl zum Umschalten zwischen analogem Stereo-Ausgang und HDMI-Audio-Ausgang

18

Um zur HDMI-Audioausgabe (des Monitors) und zur normalen Audioausgabe über die System-Audio-Buchse zurückzukehren (für Kopfhörer, da mein Monitor keinen Audioausgang hat), öffne ich die Toneinstellungen und wähle jedes Mal den richtigen Kanal. Gibt es eine Möglichkeit, eine Umschalttaste im Bedienfeld zu erstellen oder eine Tastenkombination zum Umschalten zuzuweisen, da ich so oft umschalte?

: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

Bildbeschreibung hier eingeben

iJeeves
quelle
1
+1 Es wäre fantastisch, wenn ich mit einem Tastendruck auf den richtigen HDMI-Anzeigeausgabemodus und den richtigen Klangmodus umschalten könnte.
Kit Menke
Was noch besser wäre, wäre, wenn dieser HDMI / Display Port-Audiokanal beim Erkennen automatisch umgeschaltet würde. Dafür ist Docking gedacht. Ich erinnere mich an einen Docking-Code vor einiger Zeit, der die Konfiguration basierend auf bestimmten Hardware-IDs (MAC) ändert. Weiß jemand wie das nochmal heißt?
Elijah Lynn

Antworten:

10

Mit pulseaudio können wir die Ausgabesenke über die Befehlszeile auswählen:

pacmd set-default-sink "SINKNAME"

Dieser Befehl kann in einem Launcher, Skript oder sogar einer Tastenkombination zum schnellen Umschalten zwischen verschiedenen Senken verwendet werden. Bitte ersetzen Sie "SINKNAME" durch den Namen oder die Nummer Ihrer gewünschten Spüle. Eine Liste der bekannten Senken mit ihren zugehörigen Nummern und Namen wird durch den Befehl angegeben:

pacmd list-sinks

Hinweis: Das Ändern der Ausgabesenke über die Befehlszeilenschnittstelle kann nur wirksam werden, wenn das Lesen des Stream-Zielgeräts deaktiviert ist. Dies kann durch Bearbeiten der entsprechenden Zeile in erfolgen /etc/pulse/default.pa:

load-module module-stream-restore restore_device=false

Alternativ könnten wir pulseaudio ausführen, um den Ton gleichzeitig an das interne Audiogerät und an das HDMI-Gerät auszugeben, indem wir paprefs mit der Option ausführen , ein virtuelles Ausgabegerät hinzuzufügen:

paprefs

Takkat
quelle
2
pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.analog-stereo"und pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.hdmi-stereo"funktioniert nur nach Auswahl des entsprechenden Profils in den Toneinstellungen. Wenn ich HDMI eingestellt habe und den Befehl pacmd für analoges Stereo ausführe, wird der Fehler angezeigt. Sink alsa_output.pci-0000_00_1b.0.analog-stereo does not exist.Wenn ich das Profil jedoch manuell in der GUI für Toneinstellungen auswähle und denselben Befehl ausführe, wird der Fehler nicht angezeigt. Es hilft also nicht, zu wechseln.
IJeeves
@iJeeves: siehe Bearbeiten für das Update.
Takkat
Ähnliches Problem. Wenn ich den Befehl ausführe, ändert er sich visuell in der GUI, aber der Sound wird nicht umgeleitet. Ich muss es in der GUI manuell umschalten, damit es funktioniert. Irgendwelche Ideen?
Elijah Lynn
1
@ ElijahLynn: Möglicherweise müssen Sie auch den Stream verschieben: askubuntu.com/questions/71863/…
Takkat
@Takkat: Ich habe es noch nicht ausprobiert, aber das scheint genau das Problem zu sein, das ich hatte. Vielen Dank!
Elijah Lynn
7

Ich fand das sehr ärgerlich und schrieb ein Skript, um die Ausgabe umzuschalten:

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

und binden Sie dann eine nicht verwendete Taste auf meiner Tastatur, um sie auszuführen (siehe Wie binde ich benutzerdefinierte Befehle an Tastaturkürzel? )

user829996
quelle
Obwohl Sie sich seit 18 Monaten nicht mehr angemeldet haben, möchten Sie nur wissen lassen, dass dies die beste Antwort ist. IMO +1
WinEunuuchs2Unix
Wie kann ich das tun, wenn ich zwischen zwei Karten wechseln muss, nicht nur zwischen zwei Profilen einer Karte?
Oebele
2

Noch ein Sink Switcher Script

Getestet auf Ubuntu 16.04


Mit dieser Option können Sie jedoch nur das Audio der gewünschten Anwendung umschalten.

VERWENDUNG: Konzentrieren Sie sich auf die Anwendung, deren Senke Sie ändern möchten, und führen Sie dieses Skript aus. Das ist es!!!

Dieses Skript erkennt die Anwendung, die im Fokus steht, findet alle wiedergegebenen Audios und schaltet sie auf die nächste verfügbare Senke um.

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

Das Drehbuch erklären

Wir müssen die PID der Anwendung im Fokus finden

Aber zuerst brauchen wir die XID

xprop -root _NET_ACTIVE_WINDOW 

Dann fügen Sie es hier ein $xid , um die PID der Anwendung zu erhalten

xprop -id $xid _NET_WM_PID

Jetzt müssen wir die mit dieser PID verbundenen Senkeneingänge finden

Lassen Sie uns zuerst die Ausgabe des Befehls linearisieren, pacmd list-sink-inputsum eine Senken-Eingabe pro Zeile aufzulisten, wobei der Index, die Senke und die PID in derselben Zeile angezeigt werden

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

Lassen Sie es uns Schritt für Schritt analysieren:

grep -E 'index:|sink:|process.idnur halten Linien , die enthalten index:, sink:oderprocess.id

tr '\n' ' ' verbindet alle Zeilen

tr -d '"'Entfernt alle "Zeichen. Notwendig, um die PID ohne Anführungszeichen zu erhalten

sed -e 's/index:/\n/g'Ersetzt alle index:Vorkommen durch ein neues Zeilenzeichen\n

tail -n +2 Entfernt die erste Zeile, weil sie leer ist

Und das Ergebnis ist ungefähr so:

  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

Analysieren wir eine Zeile, um zu verstehen, was dies bedeutet:

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

182ist der Senken-Eingabe-Index, 0ist der Senken-Index und ist 13752am Ende die PID der zugehörigen Anwendung

Dann durchlaufen wir jede Zeile

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

Und schließlich filtern Sie nur die PID der Senke-Eingabe, die mit der PID der fokussierten App übereinstimmt

  if [ $sink_input_pid = $app_pid ]; then

Daten extrahieren

Mit können awkwir die Elemente bekommen, die wir brauchen

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

Holen Sie sich die Anzahl der Spülen, um zu wissen, wann die Drehung der Spülen von 0 an wieder aufgenommen werden soll.

sink_list_size=${#sink_list_array[@]}

Um die nächste Senke zu finden, müssen wir die Liste der Senken durchlaufen, um zu wissen, welche mit current_sink_index übereinstimmt, und um den Index der nächsten Senke zu kennen.

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

Und schließlich verschieben wir den Sink-Input, um in next_sink_index zu spielen

pacmd move-sink-input $sink_input_index $next_sink_index

Hinweis zu Ubuntu 16.04:

Bei der Konfiguration der Tastenkombination konnte ich nicht dafür sorgen, dass sie mit dem Verknüpfungsmanager von Ubuntu funktioniert. Also musste ich compizconfig-settings-manager installieren

sudo apt-get install compizconfig-settings-manager
Madacol
quelle
+1 für eine großartige erste Antwort als neuer Benutzer. Da die ursprüngliche Frage für Ubuntu 11.04 war, sollten Sie darauf hinweisen, mit welcher Version getestet wurde.
WinEunuuchs2Unix
@ WinEunuuchs2Unix Wow! Danke dir :). Ich habe Ubuntus Version unter dem Titel hinzugefügt.
Madacol
1

Da im Screenshot nur eine Soundkarte zu sehen ist, sollte meiner Meinung nach der Ausgang dieser Soundkarte umgeschaltet werden.

Zum Beispiel: Ich habe ein Notebook mit einer integrierten Soundkarte, aber im angedockten Zustand verfügt es über einen digitalen Ausgang (SPDIF).

Ich wollte also den aktiven Ausgang oder das "Profil" in pulseaudio umschalten.

Ich habe die Befehle gefunden, die genau das tun:

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

Was ich getan habe, um die richtigen Namen für meine gewünschte Ausgabeeinstellung zu erhalten - hier digitaler Ausgang, aber analoger (Mikro-) Eingang - war:

pacmd list | grep output
ritterkeks
quelle
1

Ich habe auch versucht, eine Lösung für dieses Problem zu finden. Ab Ubuntu 11.04 scheint dies nicht direkt möglich zu sein. In dieser Anleitung wurden nur HDMI und Analog als separate Ausgänge hinzugefügt. Daher zeigt pacmd jetzt 3 Senken an. Dann ist es möglich, mit den obigen Befehlen zwischen den Spülbecken zu wechseln. ( siehe auch )

Aber anscheinend wird Ubuntu 11.11 ein PulseAudio mit Jack Detection System bekommen. Laut der folgenden Website hat David Henningsson eine Erkennung über udev codiert, sodass die Impulstöne automatisch auf die zuletzt hinzugefügte Ausgabe umgeschaltet werden, einschließlich des Umschaltens zwischen verschiedenen Profilen derselben Soundkarte (wie dies bei Ihrem und meinem Setup der Fall ist). (siehe hier )

Ich hoffe also, dass das klappt, wenn ich nächsten Freitag die endgültige Version probiere.

Graipher
quelle
1

Basierend auf vielen der vorherigen Antworten habe ich ein Skript geschrieben, mit dem die Wiedergabesenke zwischen den verfügbaren abwechselnd eingestellt wird.

Sie können es am besten verwenden, indem Sie eine Tastenkombination erstellen, mit der Sie es ausführen. Bei jedem Drücken dieser Tastenkombination wird das Audio zur nächsten verfügbaren Senke umgeleitet.

Der Code ist hier verfügbar: https://gist.github.com/germank/7fa2fb07d45a838bf890addadd8bea8c

GermanK
quelle
0

In meinem Fall waren die analogen Optionen nicht in der Liste. Installieren Sie pavucontrol: sudo apt install pavucontrol

Konnte das Problem beheben, indem Sie die Anwendung starten:

  1. Starten Sie die App über das Terminal, indem Sie Folgendes pavucontroleingeben : (enter)
  2. Gehen Sie zur Registerkarte 'Konfiguration'.
  3. Wählen Sie unter Interner Ton das analoge Stereo-Ausgangsprofil

Bildbeschreibung hier eingeben

Jetzt konnte ich hier verschiedene Profile (unter Linux Mint) anhören und auswählen:

Bildbeschreibung hier eingeben

danger89
quelle
0

Eine Alternative zur Sound Switcher- Anzeige (die das Hinzufügen einer PPA erfordert) besteht darin, einen Befehl (oder ein Skript) zu erstellen und ihn mit einer Verknüpfung aufzurufen:

In meinem Fall war hdmi-stereo-extra1+inputProfil, also in einer Zeile wäre:

[[ $(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"

Sie können eine benutzerdefinierte Verknüpfung ( gnome-control-center keyboard) verwenden, um sie auszuführen bash -c(warnt Sie, wenn ein Konflikt mit einer anderen Verknüpfung vorliegt):

Bildschirmfoto

Bildschirmfoto

Ich benutze:

  • Super + Alt + o: Schaltet den Ausgang zwischen Kopfhörer und HDMI um.
  • Super + Alt + Up: Vol Up
  • Super + Alt + Down: Vol Down

Sie können auch ein hinzufügen aliaszu Ihrem .bashrc.

Getestet unter Ubuntu 16.04 und 18.04


Wenn Sie das Verhalten eines Skripts nicht übertreffen, habe ich basierend auf der Antwort @ user829996 einige Änderungen vorgenommen:

#!/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
Pablo Bianchi
quelle
0

Gibt es eine Möglichkeit, eine Umschaltfläche im Bedienfeld zu erstellen

Ich habe ein Indikator-Applet geschrieben , mit dem Sie die Tonausgabe umschalten können.

Lukas
quelle
Willkommen bei Ask Ubuntu! Während dies theoretisch die Frage beantworten mag, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.
Warren Hill