Strona główna
» LINUX
»
Jak skonfigurować skrypt przełączający wyjście audio PipeWire w systemie Debian
Jak skonfigurować skrypt przełączający wyjście audio PipeWire w systemie Debian
Najprostszym i niezawodnym sposobem na przełączanie wyjść PipeWire ze skryptu w systemie Debian jest użycie wpctlnarzędzia wiersza poleceń WirePlumber: zidentyfikuj dwa interesujące Cię węzły odbiorcze, sprawdź bieżący domyślny odpływ i wywołaj wpctl set-default IDdrugi. Jest to lepsze niż zakodowanie na stałe numerycznego identyfikatora węzła, ponieważ identyfikatory obiektów PipeWire mogą się zmieniać, gdy urządzenia rozłączają się, łączą ponownie lub restartują sesję.
W tym przewodniku zastosowano przełącznik dla dwóch urządzeń – na przykład głośników w laptopie i słuchawek Bluetooth – i celowo zachowano logikę kompatybilności zarówno z obecną wersją Debian 13 (Trixie), jak i Debian 12 (Bookworm). Od października 2026 roku strony pakietów Debiana wymieniają WirePlumbera 0.5.8 w Debianie 13 i 0.4.13 w Debianie 12. Nowsze wersje WirePlumbera oferują dodatkowe funkcje, ale wpctl status -n, wpctl inspect, i wpctl set-defaultsą tutaj wspólnym mianownikiem.
Kiedy ta metoda jest odpowiednia
Użyj tego podejścia, gdy PipeWire obsługuje już dźwięk z pulpitu i chcesz użyć skrótu klawiaturowego, launchera, aliasu powłoki lub klawisza skrótu do przełączania między dwoma wyjściami. Działa to dobrze w przypadku wbudowanego wyjścia analogowego, a także przetwornika cyfrowo-analogowego USB, monitora HDMI, zestawu słuchawkowego Bluetooth lub innego odbiornika, który pojawia się w sekcji Odbiorniki w wpctl status.
Nie jest to odpowiednie narzędzie do każdego problemu z routingiem. wpctl set-defaultZmienia domyślny cel używany dla strumieni wymagających automatycznego połączenia. Nie gwarantuje, że każda działająca aplikacja natychmiast przeniesie istniejący strumień. Niektóre aplikacje automatycznie dostosują się do nowego domyślnego ustawienia; inne mogą wymagać osobnego przeniesienia strumienia lub ponownego uruchomienia aplikacji.
Zanim napiszesz scenariusz
Sprawdź, czy sesja PipeWire i WirePlumber na poziomie użytkownika jest prawidłowa. Oficjalna dokumentacja WirePlumber zaleca sprawdzenie demona za pomocą systemctl --user status wireplumber. Debian zaleca również użycie pipewire-audiometapakietu w systemie Debian 12 i nowszych podczas konfiguracji kompletnego stosu audio PipeWire.
systemctl --user status wireplumber
systemctl --user status pipewire pipewire-pulse
Jeśli wpctlbrakuje tego elementu, zainstaluj WirePlumber i standardowe komponenty audio PipeWire zamiast próbować zastąpić je niezwiązanym z tym narzędziem miksującym:
Nie uruchamiaj wpctlz sudo. PipeWire i WirePlumber normalnie działają w sesji użytkownika komputera stacjonarnego, więc polecenie powinno łączyć się z wykresem multimediów tego użytkownika.
Krok 1: Znajdź nazwy odbiorników wyjściowych
Uruchomić:
wpctl status -n
-nOpcja ta wpctlwyświetla nazwy obiektów zamiast opisów zrozumiałych dla człowieka. W sekcji Audio → Odbiorniki zanotuj nazwy dwóch wyjść, które chcesz przełączyć. Urządzenie może wyświetlać wbudowany odbiornik przypominający odbiornik alsa_output.pci-0000_00_1f.3.analog-stereoBluetooth oraz odbiornik Bluetooth zaczynający się od bluez_output..
Przykładowy widok terminala wpctl status -n: identyfikacja stabilnych fragmentów nazw w sekcji Sinks zamiast kopiowania numerycznych identyfikatorów do skryptu.
Wybierz fragment, który jest wystarczająco charakterystyczny, aby pasował tylko do zamierzonego wyjścia. W przypadku karty wbudowanej, pełna alsa_output...nazwa węzła jest zazwyczaj rozsądnym wyborem. W przypadku urządzenia Bluetooth, krótszy bluez_output.fragment jest wygodny tylko wtedy, gdy zazwyczaj masz podłączony jeden odbiornik audio Bluetooth. Jeśli często podłączasz kilka wyjść Bluetooth, użyj dłuższego fragmentu, unikalnego dla zamierzonego urządzenia.
Krok 2: Zweryfikuj odpływ za pomocą wpctl inspect
Przed uruchomieniem skryptu przełączającego sprawdź jeden z identyfikatorów wyświetlanych przez wpctl status -n:
wpctl inspect 45
Zastąp 45bieżącym identyfikatorem w systemie. Poszukaj właściwości takich jak node.namei media.class. W przypadku wyjścia odtwarzania media.classnależy wskazać odbiornik audio. Numeryczny identyfikator jest przydatny do inspekcji i natychmiastowego set-defaultwykonania polecenia, ale poniższy skrypt przy każdym uruchomieniu ustala nowy identyfikator.
Inspekcja ujścia potwierdza nazwę węzła, do której będzie pasował skrypt, i pomaga odróżnić ujścio odtwarzanego obiektu od źródła lub niezwiązanego obiektu PipeWire.
Możesz również zapytać WirePlumbera, który zlew jest obecnie domyślny, nie znając jego numerycznego identyfikatora:
wpctl inspect @DEFAULT_AUDIO_SINK@
Ten specjalny identyfikator @DEFAULT_AUDIO_SINK@jest udokumentowany w programie WirePlumber i w czasie wykonywania jest rozpoznawany jako bieżący domyślny węzeł odtwarzania.
Krok 3: Utwórz skrypt przełączający dwa wyjścia
W razie potrzeby utwórz osobisty katalog wykonywalny, a następnie otwórz skrypt:
Wklej poniższy kod i zastąp SINK_Aoraz SINK_Bfragmentami z własnego wpctl status -nwyjścia:
#!/usr/bin/env bash
set -euo pipefail
# Replace these with distinctive fragments from `wpctl status -n`.
SINK_A="alsa_output.pci-0000_00_1f.3.analog-stereo"
SINK_B="bluez_output."
find_sink_id() {
local needle="$1"
wpctl status -n | awk -v n="$needle" '
/Sinks:/ { in_sinks=1; next }
/Sources:/ { in_sinks=0 }
in_sinks && index($0, n) {
for (i=1; i<=NF; i++) {
if ($i ~ /^[0-9]+\.$/) {
gsub(/\./, "", $i)
print $i
exit
}
}
}'
}
current_name="$(
wpctl inspect @DEFAULT_AUDIO_SINK@ |
awk -F'= ' '/node.name/ {
gsub(/"/, "", $2)
print $2
exit
}'
)"
if [[ "$current_name" == *"$SINK_A"* ]]; then
target_pattern="$SINK_B"
elif [[ "$current_name" == *"$SINK_B"* ]]; then
target_pattern="$SINK_A"
else
# If the current default is neither target, switch to A first.
target_pattern="$SINK_A"
fi
target_id="$(find_sink_id "$target_pattern")"
if [[ -z "$target_id" ]]; then
printf 'No available sink matched: %s\n' "$target_pattern" >&2
exit 1
fi
wpctl set-default "$target_id"
printf 'Default audio sink changed to ID %s\n' "$target_id"
Skrypt przełączający powinien dynamicznie dopasowywać nazwy ujścia, określać bieżącą wartość domyślną i rozstrzygać bieżący identyfikator obiektu docelowego przed wywołaniem wpctl set-default.
Dlaczego skrypt za każdym razem rozwiązuje identyfikatory
Identyfikatory obiektów PipeWire to obiekty sesji, więc traktowanie identyfikatora, takiego jak 45stały identyfikator urządzenia, jest niepewne. Zamiast tego skrypt przechowuje rozpoznawalne fragmenty nazw węzłów, analizuje bieżącą sekcję „Sinks” i wyodrębnia identyfikator numeryczny tylko w momencie przełączenia.
Dlaczego używa wpctl inspect dla bieżącego ustawienia domyślnego
Skrypt prosi @DEFAULT_AUDIO_SINK@o podanie node.name. Dzięki temu unika się zależności od wizualnego umiejscowienia gwiazdki przy wpctl statusokreślaniu aktualnie wybranego zlewu. Następnie porównuje tę nazwę SINK_Az SINK_B.
Krok 4: Uczyń skrypt wykonywalnym i przetestuj go
Zapisz plik i uruchom:
chmod +x ~/.local/bin/toggle-audio-output
~/.local/bin/toggle-audio-output
wpctl status -n
Jeśli docelowy odpływ jest dostępny, skrypt powinien wyświetlić wybrany identyfikator. Uruchom go ponownie, a powinien wybrać inny skonfigurowany odpływ. Potwierdź wynik za pomocą wpctl status -nlub , sprawdzając @DEFAULT_AUDIO_SINK@.
Po uruchomieniu skryptu wpctl status -nsprawdź, czy zamierzony odbiornik jest teraz odbiornikiem domyślnym.
Dokumenty WirePlumbera wpctl set-default IDwskazują ustawienie zlewu lub źródła jako domyślnego celu. W nowoczesnym WirePlumberze ten wybór użytkownika jest zapamiętywany i może mieć wyższy priorytet niż automatyczny wybór oparty na priorytecie. Aby później przywrócić automatyczny wybór domyślny, użyj:
wpctl clear-default
Dodaj skrypt do skrótu klawiaturowego
Gdy test terminala będzie wiarygodny, należy powiązać go /home/YOUR_USER/.local/bin/toggle-audio-outputze skrótem klawiaturowym na pulpicie. Należy użyć ścieżki bezwzględnej, ~ponieważ niektóre programy uruchamiające skróty nie rozwijają skrótu powłoki. Dokładny interfejs użytkownika skrótu zależy od środowiska pulpitu, dlatego ważnym testem jest sprawdzenie, czy skrypt działa poprawnie w standardowym terminalu użytkownika.
Jeśli skrót działa, ale wpctlzgłasza, że nie może się połączyć, program uruchamiający może nie dziedziczyć oczekiwanego środowiska sesji użytkownika. Sprawdź to samo polecenie w terminalu w sesji graficznej, a następnie przejrzyj reguły wykonywania skrótu w środowisku pulpitu. Nie rozwiązuj tego problemu, dodając prefiks do skryptu sudo.
Rozwiązywanie typowych usterek
„Brak dostępnego dopasowanego zlewu”
Cel jest prawdopodobnie odłączony, nazwa jego węzła została zmieniona lub wzorzec jest zbyt szczegółowy. Uruchom wpctl status -nponownie i zaktualizuj odpowiednią wartość SINK_Alub SINK_B. W przypadku Bluetooth, przed wywołaniem skryptu sprawdź, czy zestaw słuchawkowy jest podłączony i czy udostępnił odpływ audio.
Skrypt przełącza ustawienia domyślne, ale istniejący dźwięk nadal odtwarza się gdzie indziej
Może to być normalne. Dokumentacja upstream opisuje to set-defaultjako wybór celu dla nowych strumieni wymagających automatycznego połączenia. Jeśli istniejący strumień danej aplikacji pozostaje na starym spuście, zatrzymaj i ponownie uruchom odtwarzanie lub ponownie otwórz aplikację. Jeśli potrzebujesz konkretnie migrować istniejące strumienie, potraktuj to jako osobne zadanie routingu, zamiast zakładać, że set-defaultjest to gwarantowane.
Wybrano niewłaściwe urządzenie Bluetooth
Uściślij SINK_B. Ogólny wzorzec, taki jak „ bluez_output.jest odpowiedni tylko wtedy, gdy istnieje jeden pasujący odbiornik Bluetooth”. Użyj pełnej nazwy węzła lub unikalnego fragmentu środkowego, gdy można połączyć wiele wyjść bezprzewodowych jednocześnie.
WirePlumber nie działa
Sprawdzać:
systemctl --user status wireplumber
journalctl --user -u wireplumber
Dokumentacja źródłowa zaleca, systemctl --user --now enable wireplumberaby demon był zainstalowany, ale nie był włączony. Na już skonfigurowanym pulpicie Debian należy zbadać, dlaczego usługa użytkownika zatrzymała się przed wielokrotnym restartowaniem całego stosu audio.
Debian 12 kontra Debian 13: jakie zmiany?
Wydanie Debiana
Pakiet WirePlumber
Praktyczne implikacje dla tego skryptu
Debian 12 (Mól książkowy)
0.4.13 w standardowym repozytorium
Użyj zgodnego wpctl status -n, inspect, i set-defaultprzepływu pracy pokazanego tutaj.
Debian 13 (Trixie)
0.5.8 w standardowym repozytorium
Działa ten sam skrypt; nowsza wersja WirePlumber ma również rozbudowane zachowanie konfiguracji oparte na CLI i JSON.
Nie kopiuj bezmyślnie przykładów konfiguracji WirePlumber 0.5 do starszej wersji 0.4. WirePlumber 0.5 zmienił swój system konfiguracji; ten samouczek omija tę granicę wersji, używając operacji wiersza poleceń zamiast trwałych plików zasad.
Szybka lista kontrolna weryfikacji
systemctl --user status wireplumberpokazuje uruchomionego menedżera sesji.
wpctl status -nwymienia oba zamierzone wyjścia w sekcji Odbiorniki.