Wie kann ich mithilfe der Shell zwischen verschiedenen Audioausgabegeräten wechseln?

34

Ich benutze meinen Laptop mit einem externen Monitor mit Lautsprechern. Wenn der Monitor über HDMI angeschlossen ist, kann ich (unter Verwendung der GUI: Sound Setting -> Hardware) zwischen der normalen Laptop-Audioausgabe und der Monitorausgabe umschalten.

Ich wiederhole diesen Vorgang sehr oft und frage mich, ob ich ihn mit der Shell automatisieren oder auf jeden Fall schneller ausführen kann.

Meine Distribution ist Ubuntu 12.04 mit Gnome 3.

BEARBEITEN:

Ich habe versucht, pacmd zu verwenden, aber list-sinks gibt mir nur das Gerät an, das ich gerade benutze:

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.hdmi-stereo>

Nach einem Wechsel von der GUI:

pacmd list-sinks | grep name:
name: <alsa_output.pci-0000_00_1b.0.analog-stereo>

Und wenn ich versuche, es zu ändern, erhalte ich:

pacmd set-default-sink alsa_output.pci-0000_00_1b.0.hdmi-stereo
Welcome to PulseAudio! Use "help" for usage information.
Sink alsa_output.pci-0000_00_1b.0.hdmi-stereo does not exist.
Luigi Massa Gallerano
quelle

Antworten:

28

In diesem Fall ist die Karte immer gleich. Was sich zwischen einem Schalter und einem anderen ändert, ist das "Kartenprofil".

Die Lösung, die tatsächlich funktioniert hat, ist:

pacmd set-card-profile <cardindex> <profilename>

In meinem Fall fand ich alle Kartenprofile mit:

pacmd list-cards

Und nachdem ich zwischen Monitor- und Laptop-Lautsprechern wechseln kann, mit:

pacmd set-card-profile 0 output:hdmi-stereo

Und:

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

Wobei 0 der Index der Karte ist:

pacmd list-cards
Welcome to PulseAudio! Use "help" for usage information.
>>> 1 card(s) available.
    index: 0
    name: <alsa_card.pci-0000_00_1b.0>

Und schließlich, um den Wechsel zu beschleunigen, habe ich in meiner .bashrc-Datei zwei Aliasnamen eingerichtet:

alias audio-hdmi='pacmd set-card-profile 0 output:hdmi-stereo+input:analog-stereo'
alias audio-laptop='pacmd set-card-profile 0 output:analog-stereo+input:analog-stereo'

Auf diese Weise kann ich zwischen Audio vom Monitor oder vom Laptop (Kopfhörer) wechseln, indem ich in die Shell tippe: Audio-HDMI oder Audio-Laptop

Luigi Massa Gallerano
quelle
Hm. Mein Pacmd hat keine "List-Cards" -Option ...
Ka3ak
5

Ich habe ein kleines Indikator-Applet geschrieben, mit dem Sie die Tonausgabe umschalten können. Kein Shell-Skript, aber vielleicht hilfreich für Sie oder andere Leser.

https://github.com/lkettenb/sound-output-switcher

Bildschirmfoto

Lukas
quelle
3

Ich habe ein sehr kleines Skript basierend auf den vorherigen erstellt, das nicht nur die Audio-, sondern auch die Videoausgabe umschaltet. Mit dem Disper wird zwischen den Anzeigen gewechselt .

Hier ist der Code:

#!/bin/bash

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

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

Für mich ist es besonders nützlich, da ich die Displays nicht klonen möchte. Ich benutze entweder das eine oder das andere. Möglicherweise müssen Sie die Audioprofile an Ihr System anpassen.

user56655
quelle
2

Sie können die pactlManpage verwenden, um weitere Informationen zu erhalten.

favadi
quelle
2

Lukas 'Python-Skript ( https://github.com/lkettenb/sound-output-switcher , siehe oben) zum Implementieren eines Notifier-Applets funktioniert gut. Es benötigt das appindicator-Paket. Das kann mit installiert werden

sudo apt-get install python-appindicator
P.Windridge
quelle
3
Bitte geben Sie in Ihrer Antwort mindestens ein paar Worte an, um zu erklären, was das Skript ist und warum es praktisch ist.
Derobert
0

Wie ich hier sagte (wahrscheinlich ein Duplikat), eine Alternative zu Sound Switcher Indicator (der das Hinzufügen eines PPA erfordert):

In einer Zeile

In meinem Fall war hdmi-stereo-extra1+input Profil, 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 verwenden , um sie auszuführen bash -c(warnt Sie, wenn ein Konflikt mit einer anderen Verknüpfung vorliegt):

Bildbeschreibung hier eingeben

Sie können auch eine hinzufügen alias Ihrem.bashrc .

In einem Skript

Ich habe einige Änderungen basierend auf @ user829996 (und hier @ user56655) vorgenommen. Antwort:

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

Ich habe das folgende Python-Skript erstellt, das Folgendes ausführt:

  1. Wechseln Sie vom Standardgerät zum nächsten Gerät in der Liste (mit Umbruch), unabhängig von den IDs
  2. Verschiebt alle laufenden Anwendungen auf dieses Gerät.
  3. Sendet eine Benachrichtigung mit dem Gerätenamen an die GUI.
#!/usr/bin/env python3
import subprocess
# Toggle default device to the next device (wrap around the list)
cards_info = subprocess.run(['pacmd','list-sinks'], stdout=subprocess.PIPE)
card_indexes = subprocess.run(['grep', 'index'], stdout=subprocess.PIPE, input=cards_info.stdout)
indexes_list = card_indexes.stdout.decode().splitlines()
card_descriptions = subprocess.run(['grep', 'device.description'], stdout=subprocess.PIPE, input=cards_info.stdout)
indices = [i for i, s in enumerate(indexes_list) if '*' in s]
if (len(indices) != 1):
    print("Error finding default device")
    exit(1)
default_index = indices[0]
next_default = 0
if (default_index != (len(indexes_list) - 1)):
    next_default = default_index + 1
next_default_index =  (indexes_list[next_default].split("index: ",1)[1])
subprocess.run(['pacmd','set-default-sink %s' %(next_default_index)], stdout=subprocess.PIPE)

# Move all existing applications to the new default device
inputs_info = subprocess.run(['pacmd','list-sink-inputs'], stdout=subprocess.PIPE)
inputs_indexes = subprocess.run(['grep', 'index'], stdout=subprocess.PIPE, input=inputs_info.stdout)
inputs_indexes_list = inputs_indexes.stdout.decode().splitlines()
for line in inputs_indexes_list:
    input_index =  (line.split("index: ",1)[1])
    subprocess.run(['pacmd','move-sink-input %s %s' %(input_index, next_default_index)], stdout=subprocess.PIPE)

# Send notification to the GUI
descriptions_list = card_descriptions.stdout.decode().splitlines()
if (len(descriptions_list) == len(indexes_list)):
    description =  (descriptions_list[next_default].split("= ",1)[1])[1:-1]
    args = ["notify-send", "Default audio card changed", 'Default audio card was set to %s' %(description)]
    subprocess.run(args, stdout=subprocess.PIPE)

Hat dem Skript eine Tastenkombination zugewiesen, und mein Leben ist jetzt glücklich

Nimrod.s
quelle