it-swarm.com.de

Wie kann ich mithilfe der Shell zwischen verschiedenen Audioausgabehardware wechseln?

Ich benutze meinen Laptop mit einem externen Monitor mit Lautsprechern. Wenn der Monitor über HDMI angeschlossen ist, kann ich (über die GUI: Sound Setting -> Hardware) zwischen dem normalen Audioausgang des Laptops und dem Monitorausgang wechseln.

Ich wiederhole diesen Vorgang sehr oft und frage mich, ob ich ihn mithilfe 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, das ich gerade verwende:

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, bekomme 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.
34

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

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

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

In meinem Fall habe ich alle Kartenprofile gefunden 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 habe ich zwei Alias ​​in meiner .bashrc-Datei eingerichtet, um den Wechsel zu beschleunigen:

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, der in die Shell eingibt: Audio-HDMI oder Audio-Laptop

29

Ich habe ein kleines Anzeige-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

Screenshot

6
Lukas

Ich habe ein sehr kleines Skript erstellt, das auf den vorherigen basiert und nicht nur die Audio-, sondern auch die Videoausgabe umschaltet. Es verwendet disper, um zwischen den Anzeigen zu wechseln.

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 gerne klonen möchte. Ich benutze entweder den einen oder den anderen. Möglicherweise müssen Sie die Audioprofile an Ihr spezifisches System anpassen.

3
user56655

Lukas 'python Skript ( https://github.com/lkettenb/sound-output-switcher , oben veröffentlicht) zur Implementierung eines Notifier-Applets funktioniert gut Appindicator-Paket. Das kann mit installiert werden

Sudo apt-get install python-appindicator
2
P.Windridge

Sie können pactl verwenden und die Manpage lesen, um weitere Informationen zu erhalten.

2
favadi

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

  1. Schalten Sie das Standardgerät unabhängig von der ID auf das nächste Gerät in der Liste um (mit Umlauf)
  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

1
Nimrod.s

Sie können dieses Skript ausprobieren: https://github.com/giner/helplinux/tree/master/scripts/switch-sound

Getestet unter Ubuntu 10.04 - 13.04 und Arch Linux

Wenn nützlich. Ich habe Bluetooth-Kopfhörer und musste für sie das Umschalten zwischen Headset- und a2dp-Profilen einrichten. Gelöst durch Hinzufügen dieser Funktionen:

talk() {
  card=$(pacmd list-cards | grep 'name:' | grep bluez | cut -d: -f2 | sed -e 's/[< >]//g')
  pacmd set-card-profile $card headset_head_unit
}

mus() {
  card=$(pacmd list-cards | grep 'name:' | grep bluez | cut -d: -f2 | sed -e 's/[< >]//g')
  pacmd set-card-profile $card a2dp_sink
}
0
brutallord

Wie ich bereits sagte hier (wahrscheinlich ein Duplikat), eine Alternative zu Sound Switcher Indicator (für die ein PPA hinzugefügt werden muss):

In einer Zeile

In meinem Fall war hdmi-stereo-extra1+input Profil, also in einer Zeile: [[ $(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 mit bash -c Auszuführen (wird Sie warnen, wenn ein Konflikt mit einer anderen Verknüpfung vorliegt):

(enter image description here

Sie können Ihrem .bashrc Auch ein alias hinzufügen.

In einem Skript

Ich habe einige Änderungen basierend auf der Antwort von @ user829996 (und hier @ user56655) 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
0
Pablo A