Skrót do przełączania między wyjściem Analog Stereo a wyjściem audio HDMI

18

Aby przełączyć się na wyjście audio HDMI (monitora) i wrócić do normalnego wyjścia audio z systemowego gniazda audio (dla słuchawek, ponieważ mój monitor nie ma wyjścia audio), otwieram preferencje dźwięku i wybieram właściwy kanał za każdym razem. Czy jest jakiś sposób, aby utworzyć przycisk przełączania w panelu lub przypisać jakiś klawisz skrótu do przełączania, ponieważ tak często przełączam.

: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

wprowadź opis zdjęcia tutaj

iJeeves
źródło
1
+1 Byłoby niesamowicie, gdybym mógł przełączyć się do odpowiedniego trybu wyjścia HDMI i trybu dźwięku za jednym naciśnięciem klawisza.
Kit Menke,
Jeszcze lepiej byłoby, gdyby po wykryciu tego kanału audio HDMI / Display Port przełączałby go automatycznie. Po to jest dokowanie. Wydaje mi się, że pamiętam jakiś kod dokowania, który zmieni konfigurację na podstawie określonych identyfikatorów sprzętowych (MAC). Czy ktoś wie, jak to się nazywa?
Elijah Lynn

Odpowiedzi:

10

Dzięki pulseaudio jesteśmy w stanie wybrać ujście wyjściowe z wiersza poleceń:

pacmd set-default-sink "SINKNAME"

To polecenie może być użyte w programie uruchamiającym, skrypcie lub nawet przypisane do skrótu klawiaturowego w celu szybkiego przełączania między różnymi ujściami. Zastąp „SINKNAME” nazwą lub numerem żądanego zlewu. Lista znanych zlewów wraz z ich powiązanymi numerami i nazwami jest podana przez polecenie:

pacmd list-sinks

Uwaga: Zmiana ujścia wyjściowego za pomocą interfejsu wiersza polecenia może zostać zastosowana tylko wtedy, gdy odczyt urządzenia docelowego strumienia jest wyłączony. Można to zrobić, edytując linię odpowiadającą w /etc/pulse/default.pa:

load-module module-stream-restore restore_device=false

Alternatywnie możemy uruchomić pulseaudio, aby jednocześnie wyprowadzać dźwięk do wewnętrznego urządzenia audio i do urządzenia hdmi, uruchamiając paprefs z opcją dodania wirtualnego urządzenia wyjściowego:

paprefs

Takkat
źródło
2
pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.analog-stereo"i pacmd set-default-sink "alsa_output.pci-0000_00_1b.0.hdmi-stereo"działa tylko po wybraniu odpowiedniego profilu w Preferencjach dźwięku. Jeśli mam ustawiony HDMI i uruchamiam polecenie pacmd dla analogowego stereo, dostaję błąd. Sink alsa_output.pci-0000_00_1b.0.analog-stereo does not exist.Ale jeśli ręcznie wybiorę profil z GUI preferencji dźwięku i uruchomię to samo polecenie, nie otrzymuję błędu. Więc to nie pomaga się zmienić.
iJeeves,
@ iJeeves: patrz edycja aktualizacji.
Takkat
Podobny problem. Jeśli uruchomię polecenie, wizualnie zmieni to w GUI, ale dźwięk nie przekieruje. Muszę ręcznie przełączać go w GUI, aby działał. Jakieś pomysły?
Elijah Lynn
1
@ElijahLynn: Konieczne może być także przeniesienie strumienia: askubuntu.com/questions/71863/…
Takkat
@Takkat: Jeszcze tego nie próbowałem, ale wydaje mi się, że to właśnie problem. Dzięki wielkie!
Elijah Lynn
7

Uznałem to za bardzo irytujące i napisałem skrypt do przełączania wyjścia:

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

a następnie związał nieużywany klawisz na klawiaturze, aby go wykonać (zobacz Jak powiązać niestandardowe polecenia ze skrótami klawiaturowymi? )

użytkownik829996
źródło
Chociaż nie zalogowałeś się od 18 miesięcy, chciałem tylko powiedzieć, że to najlepsza odpowiedź IMO +1
WinEunuuchs2Unix
Jak mogę to zrobić, jeśli muszę przełączać się między dwiema kartami, a nie tylko dwoma profilami jednej karty?
Oebele
2

Yet Another Sink Switcher Script

testowany na Ubuntu 16.04


Ale ten pozwala przełączać tylko dźwięk aplikacji, którą chcesz.

UŻYTKOWANIE: Skoncentruj aplikację, którą chcesz zmienić, i uruchom ten skrypt. Otóż ​​to!!!

Ten skrypt wykrywa aktywną aplikację, znajduje wszystkie odtwarzane z niej pliki audio i przełącza je na następny dostępny zlew.

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

Wyjaśnienie skryptu

Musimy znaleźć PID aplikacji w centrum uwagi

Ale najpierw potrzebujemy xid

xprop -root _NET_ACTIVE_WINDOW 

Następnie włóż go tutaj, $xidaby uzyskać identyfikator aplikacji

xprop -id $xid _NET_WM_PID

Teraz musimy znaleźć wejścia do ujścia związane z tym PID

Najpierw zlinearyzujmy wynik polecenia, pacmd list-sink-inputsaby wyświetlić jeden wejściowy obiekt sink w wierszu, pokazując jego indeks, obiekt sink i pid w tym samym wierszu

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

przeanalizujmy to krok po kroku:

grep -E 'index:|sink:|process.idtylko utrzymać linie, które zawierają index:, sink:lubprocess.id

tr '\n' ' ' łączy wszystkie linie

tr -d '"'usuwa wszystkie "postacie. Niezbędne, aby uzyskać pid bez cytatów

sed -e 's/index:/\n/g'zastępuje wszystkie index:wystąpienia nowym znakiem wiersza\n

tail -n +2 usuwa pierwszy wiersz, ponieważ jest pusty

Rezultat jest mniej więcej taki:

  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

Przeanalizujmy jedną linię, aby zrozumieć, co to znaczy:

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

182jest indeksem wejścia-ujścia, 0jest indeksem ujścia, a 13752na końcu jest pid odpowiedniej aplikacji

Następnie iterujemy każdą linię

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

I na koniec filtruj tylko pid wejścia wejścia do zlewu, który odpowiada pidowi skoncentrowanej aplikacji

  if [ $sink_input_pid = $app_pid ]; then

Wyodrębnianie danych

Dzięki awkmożemy uzyskać potrzebne elementy

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

Uzyskaj liczbę zlewów, aby wiedzieć, kiedy obrót zlewów powinien rozpocząć się od 0.

sink_list_size=${#sink_list_array[@]}

Znajdując następny zlew, musimy iterować listę zlewów, aby wiedzieć, który z nich pasuje do current_sink_index i znać indeks następnego zlewu.

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

I na koniec, przesuwamy wejście sink do play in next_sink_index

pacmd move-sink-input $sink_input_index $next_sink_index

Uwaga na temat Ubuntu 16.04:

Podczas konfigurowania klawisza skrótu nie mogłem go uruchomić z menedżerem skrótów ubuntu. Musiałem więc zainstalować compizconfig-settings-manager

sudo apt-get install compizconfig-settings-manager
Madacol
źródło
+1 za świetną pierwszą odpowiedź jako nowy użytkownik. Ponieważ pierwotne pytanie dotyczyło systemu Ubuntu 11.04, należy wskazać, z jaką wersją testowano.
WinEunuuchs2Unix,
@ WinEunuuchs2Unix Wow! Dziękuję Ci :). Dodałem wersję Ubuntu pod tytułem.
Madacol,
1

Ponieważ na zrzucie ekranu widoczna jest tylko jedna karta dźwiękowa, myślę, że wyjście tej karty dźwiękowej powinno zostać przełączone.

Na przykład: Mam notebooka z jedną zintegrowaną kartą dźwiękową, ale po zadokowaniu ma on wyjście cyfrowe (SPDIF).

Więc chciałem przełączyć aktywne wyjście lub „Profil” w pulseaudio.

Znalazłem polecenia, które dokładnie to robią:

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

To, co zrobiłem, aby uzyskać prawidłowe nazwy dla pożądanego ustawienia wyjścia - tutaj, wyjście cyfrowe, ale wejście analogowe (mikro) - to:

pacmd list | grep output
ritterkeks
źródło
1

Próbowałem również znaleźć rozwiązanie tego problemu. W przypadku Ubuntu 11.04 nie wydaje się to możliwe bezpośrednio, znalazłem tylko ten przewodnik, aby dodać zarówno HDMI, jak i Analog jako osobne wyjścia, więc pacmd pokazuje teraz 3 zlewy. Następnie można przełączać się między zlewami za pomocą powyższych poleceń. ( patrz także )

Ale najwyraźniej Ubuntu 11.11 otrzyma PulseAudio z systemem wykrywania gniazd. Zgodnie z poniższą witryną David Henningsson zakodował wykrywanie za pomocą udev, więc pulsacyjny dźwięk automatycznie przełącza się na ostatnio dodane wyjście, w tym przełączanie między różnymi profilami tej samej karty dźwiękowej (jak ma to miejsce w przypadku twojej i mojej konfiguracji). (patrz tutaj )

Mam więc nadzieję, że to zadziała, kiedy wypróbuję ostateczną wersję w następny piątek.

Graipher
źródło
1

Na podstawie wielu poprzednich odpowiedzi napisałem skrypt, który ustawia ujście odtwarzania na przemian z dostępnymi.

Najlepszym sposobem korzystania z niego jest utworzenie skrótu klawiaturowego, aby go uruchomić, więc za każdym razem, gdy naciśniesz tę kombinację klawiszy, dźwięk zostanie przekierowany do następnego dostępnego zlewu.

Kod jest dostępny tutaj: https://gist.github.com/germank/7fa2fb07d45a838bf890addadd8bea8c

Niemiecki K.
źródło
0

W moim przypadku opcji analogowych nie ma na liście. Zainstaluj pavucontrol: sudo apt install pavucontrol

Można rozwiązać problem, uruchamiając aplikację:

  1. Uruchom aplikację przez terminal, wprowadzając: pavucontrol(enter)
  2. Przejdź do zakładki „Konfiguracja”.
  3. Wybierz profil wyjścia stereo Analoge w Intern Sound

wprowadź opis zdjęcia tutaj

Teraz mogę tutaj brzmieć i wybierać różne profile (w Linux Mint):

wprowadź opis zdjęcia tutaj

niebezpieczeństwo89
źródło
0

Alternatywą dla Sound Switcher Indicator (która wymaga dodania PPA) jest utworzenie polecenia (lub skryptu) i wywołanie go za pomocą skrótu:

W moim przypadku był hdmi-stereo-extra1+inputprofil, więc w jednej linii byłoby:

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

Możesz użyć niestandardowego skrótu ( gnome-control-center keyboard), aby go wykonać bash -c(ostrzeże Cię, jeśli wystąpi konflikt z innym skrótem):

zrzut ekranu

zrzut ekranu

Używam:

  • Super + Alt + o: Przełącz wyjście między słuchawkami a HDMI.
  • Super + Alt + Up: Zwiększ głośność
  • Super + Alt + Down: Vol Down

Możesz także dodać aliasdo swojego .bashrc.

Testowane na Ubuntu 16.04 i 18.04


Jeśli nie wolisz zachowania skryptowego, dokonałem pewnych zmian w oparciu o odpowiedź @ user829996:

#!/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
źródło
0

Czy jest jakiś sposób, aby utworzyć przycisk przełączania w panelu?

Napisałem aplet wskaźnika, który pozwala przełączać wyjście dźwięku.

Lukas
źródło
Witamy w Ask Ubuntu! Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
Warren Hill,