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:

sudo apt update
sudo apt install pipewire-audio wireplumber

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..

Terminal Debiana pokazujący status wpctl -n z wbudowanym odbiornikiem analogowym i odbiornikiem Bluetooth wymienionym w sekcji Odbiorniki audio
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.

Terminal Debiana pokazujący wynik polecenia wpctl inspect z node.name dla wbudowanego odbiornika audio i media.class Audio Sink
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:

mkdir -p ~/.local/bin
nano ~/.local/bin/toggle-audio-output

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"
Edytor Nano w terminalu Debiana wyświetlający skrypt powłoki Bash, który identyfikuje dwie nazwy odbiorników PipeWire i zmienia domyślny odbiornik za pomocą wpctl
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@.

Terminal Debiana po uruchomieniu wykonywalnego skryptu przełączającego dźwięk, ze statusem wpctl pokazującym odbiornik Bluetooth jako domyślne wyjście
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 DebianaPakiet WirePlumberPraktyczne implikacje dla tego skryptu
Debian 12 (Mól książkowy)0.4.13 w standardowym repozytoriumUżyj zgodnego wpctl status -n, inspect, i set-defaultprzepływu pracy pokazanego tutaj.
Debian 13 (Trixie)0.5.8 w standardowym repozytoriumDział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.
  • wpctl inspect @DEFAULT_AUDIO_SINK@zwraca prawidłowy bieżący węzeł odtwarzania.
  • Te dwa wzorce skryptów jednoznacznie identyfikują docelowe odbiorniki.
  • Dwukrotne uruchomienie skryptu powoduje zamianę domyślnych dwóch wyników.
  • Jeśli istniejąca aplikacja nie zostanie przeniesiona, należy pamiętać, że wybór domyślny i migracja strumienia aktywnego to odrębne zachowania.

Główne odniesienia

Informacje na temat semantyki poleceń i aktualnego działania WirePlumber można znaleźć w oficjalnym podręczniku WirePlumber wpctl oraz oficjalnym przewodniku wprowadzającym WirePlumber . Informacje o pakietach i konfiguracji dla Debiana można znaleźć w dokumentacji Debian PipeWire , na stronie pakietu WirePlumber dla Debiana 12 oraz na stronie pakietu WirePlumber dla Debiana 13 .

Zostaw komentarz

Jak bezpiecznie odzyskać utracone partycje i dane z dysku twardego

Jak bezpiecznie odzyskać utracone partycje i dane z dysku twardego

Dowiedz się, jak odzyskać utracone partycje i pliki za pomocą TestDisk i PhotoRec. Zabezpiecz dysk źródłowy, przeskanuj go bezpiecznie i zapisz odzyskane dane na innym dysku.

Jak skanować kody QR na komputerze stacjonarnym z systemem Linux

Jak skanować kody QR na komputerze stacjonarnym z systemem Linux

Skanuj kody QR w systemie Linux za pomocą CoBang, używając kamery internetowej lub pliku obrazu. Zobacz opcje instalacji, kroki konfiguracji i poprawki dotyczące dostępu do kamery Flatpak.

Jak zmienić ustawienia kamery internetowej w systemie Linux za pomocą Cameractrls

Jak zmienić ustawienia kamery internetowej w systemie Linux za pomocą Cameractrls

Zmień ustawienia kamery internetowej w systemie Linux za pomocą narzędzia Cameractrls: dostosuj ekspozycję, kolor, redukcję migotania i inne obsługiwane elementy sterujące, a następnie sprawdź zgodne tryby wideo.

Jak zainstalować PhpStorm na Linuksie: Toolbox, Tar.gz, Snap i AUR

Jak zainstalować PhpStorm na Linuksie: Toolbox, Tar.gz, Snap i AUR

Zainstaluj PhpStorm na Linuksie za pomocą JetBrains Toolbox lub samodzielnego archiwum tar.gz, a także opcji Snap i Arch AUR. Java jest już dołączona.

Jak wyciąć obraz w systemie Linux za pomocą programu GIMP

Jak wyciąć obraz w systemie Linux za pomocą programu GIMP

Usuń tło zdjęcia w systemie Linux za pomocą programu GIMP: narysuj obiekt, usuń wybrane tło, zachowaj przezroczystość i wyeksportuj plik PNG, który można ponownie wykorzystać.

Jak wykonać kopię zapasową płyty CD-ROM w postaci obrazu ISO w systemie Linux

Jak wykonać kopię zapasową płyty CD-ROM w postaci obrazu ISO w systemie Linux

Utwórz obraz ISO płyty CD-ROM w systemie Linux za pomocą GNOME Disks lub dd. Zidentyfikuj napęd optyczny, monitoruj kopiowanie, zweryfikuj obraz i dowiedz się, kiedy uszkodzona płyta lub płyta audio wymaga użycia innego narzędzia.

Jak skonfigurować dwa panele w środowisku XFCE 4

Jak skonfigurować dwa panele w środowisku XFCE 4

Utwórz oddzielny panel XFCE 4 dla każdego wyświetlacza, przypisz drugi panel do odpowiedniego wyjścia, określ jego położenie i rozmiar, a następnie dodaj potrzebne elementy uruchamiające i statusu.

Jak zainstalować Cisco Packet Tracer w systemie Linux

Jak zainstalować Cisco Packet Tracer w systemie Linux

Pobierz Cisco Packet Tracer 9.0.1 dla systemu Ubuntu 64-bit, zainstaluj pakiet DEB za pomocą APT, zaakceptuj licencję w terminalu i zaloguj się, aby rozpocząć laboratorium.

Pobierz FlightGear za darmo: Oficjalny przewodnik instalacji

Pobierz FlightGear za darmo: Oficjalny przewodnik instalacji

Pobierz FlightGear za darmo z oficjalnej strony. Porównaj pakiety dla systemów Windows, macOS i Linux, zainstaluj pliki danych i rozpocznij swój pierwszy lot.

OKSampler: darmowy, prosty sampler muzyczny do rytmów klawiszowych

OKSampler: darmowy, prosty sampler muzyczny do rytmów klawiszowych

OKSampler mapuje klipy MP3 na klawisze klawiatury i umożliwia zapętlanie dźwięku. Dowiedz się, co robi ten starszy, darmowy program, gdzie kończą się jego stare funkcje i co sprawdzić przed pobraniem.