Zmienić wejście / wyjście PulseAudio z powłoki?

38

Mam zestaw ładnych słuchawek bezprzewodowych, których od czasu do czasu używam, oprócz moich głośników i normalnego mikrofonu.

Chciałbym napisać skrypt przełączający między jednym źródłem wejściowym i wyjściowym a drugim, w zasadzie przełącznikiem między moimi słuchawkami a głośnikami + mikrofonem.

Chciałbym zmienić między tym:

...i to:

Czy jest dla mnie sposób skryptu transferu między dwoma wejściami i wyjściami? Zasadniczo szukam czegoś takiego:

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

Czy istnieje sposób na napisanie tego skryptu?

Naftuli Kay
źródło
3
Możesz man pactlrzucić okiem na opcje wiersza poleceń PulseAudio.
Teresa e Junior
Off-topic: jaka aplikacja GUI jest na tych zrzutach ekranu?
WhyNotHugo
To podstawowe ustawienia systemu.
Naftuli Kay

Odpowiedzi:

53

Jak zauważyła @ Teresa-e-Junior, pactljest to narzędzie do użycia:

Przede wszystkim możemy chcieć uzyskać identyfikatory naszych zlewozmywaków PA. W moim systemie otrzymuję to:

$ 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

Zlew 1 jest obecnie moim domyślnym zlewem.
Ale teraz chcę, aby wszystkie moje obecne i przyszłe strumienie były odtwarzane przez HDMI (tj. Sink 0).

Istnieje polecenie ustawienia domyślnego ujścia PulseAudio, ale wydaje się, że nie ma to żadnego wpływu na mój komputer:

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

Zamiast tego wydaje się, że nowe strumienie są podłączone do zlewu, do którego ostatnio przeniesiono strumień.

Powiedzmy więc pactl, aby przesunął wszystkie aktualnie odtwarzane strumienie do zatonięcia 0. Najpierw musimy je wymienić:

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

Ok, mamy dwa strumienie (identyfikatory 290 i 295), które są dołączone do zlewu 1.
Przenieśmy je do tonięcia 0:

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

Tak powinno być. Teraz musimy tylko stworzyć skrypt, który wykona dla nas pracę:

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

Możesz to nazwać za pomocą identyfikatora ujścia lub nazwy ujścia jako parametru (tj. Albo 0czegoś w tym rodzaju alsa_output.pci-0000_01_00.1.hdmi-surround).

Teraz możesz dołączyć ten skrypt do zdarzenia udev lub skrótu klawiszowego.

mreithub
źródło
1
Wielkie dzieki! Przekształciłem to w skrypt Pythona, dzięki czemu jest przyjemny i łatwy w obsłudze, jest dostępny tutaj .
Naftuli Kay 11.03.13
1
Powiązane: askubuntu.com/a/14083/6645
Naftuli Kay
1
@NaftuliTzviKay: twój skrypt nie jest już dostępny. Jeśli nadal go masz, rozważ opublikowanie go w [GitHub Gist] (gist.github.com).
Denilson Sá Maia,
A co jeśli 0 sink input(s) available.? Ale ten gówniany odtwarzacz Flash wciąż odtwarza dźwięk? I widzę Flash client(s) logged inpacmd list
Playera
1
$ pacmd set-default-sink INDEXjest nadal potrzebny dla mojego skryptu, w przeciwnym razie polecenia klawiatury do zmiany głośności będą nadal korzystać ze starego źródła sink.
myol
9

Do manipulowania serwerem dźwięku PulseAudio służą następujące polecenia:

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

Oto kilka przykładów ich działania.

pacmd list-sinks:: nazwa listy lub numer indeksu możliwych zlewów

pacmd set-default-sink [sinkname]:: ustaw domyślny ujście wyjściowe

pacmd set-default-source [sourcename]:: ustaw domyślne wejście

pacmd set-sink-volume [index] [volume]:: ustaw głośność zlewu

pacmd set-source-volume index volume:: zakres regulacji głośności 0 - 65536 (im niższa liczba, tym niższa głośność)

To tylko kilka, które wyciągnąłem ze strony wiki i man. Zapoznaj się z tym, aby uzyskać bardziej szczegółowe informacje. Lub możesz wyświetlić polecenia --helplub manstronę.

Istnieje również narzędzie wiersza poleceń, które służy temu celowi. Nazywa się Ponymix . Jest to mikser z linii poleceń dla PulseAudio. Podany link znajduje się na stronie github projektów. Został opracowany przez znajomego i programistę Arch Linux Trusted User / Developer. Jeśli nie korzystasz z Arch, możesz po prostu skompilować go ze źródła używając makei 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
źródło
Hej, dziękuję za tę odpowiedź! Pomógł mi ton z problemem związanym z tym .
KlaymenDK
5

Na moim laptopie z Fedorą 20 wyjście HDMI nie jest wymienione jako zlew w profilu domyślnym, ale jako inny profil .

Mam tylko 1 taki zlew, fajna muzyka odtwarzana na głośnikach laptopa:

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

Jeśli uruchomię, pactl set-card-profile 0 output:hdmi-stereoładna muzyka będzie odtwarzana przez HDMI. Dostaję:

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

Aby wrócić do ustawień domyślnych, po prostu biegnę pactl set-card-profile 0 output:analog-stereo+input:analog-stereo. Tak czy inaczej, domyślnie pojawi się ponownie, jeśli uruchomię ponownie.

Lista profili mojej karty znajduje się gdzieś na pactl list cardswyjściu.

RubenCaro
źródło
Ta informacja została już podana w zaakceptowanej odpowiedzi. Nie kopiuj odpowiedzi innych użytkowników, chyba że masz coś więcej do dodania. To tylko przerabia drugą odpowiedź i nie zapewnia niczego nowego ani użytecznego!
slm
5
set-card-profilenie zostało wcześniej wspomniane, a to najważniejsze informacje na temat tej odpowiedzi.
Spidey