Strona główna
» Porady PC
»
Zbuduj skrypt przełączający wyjście PipeWire, który przenosi aktywny dźwięk
Zbuduj skrypt przełączający wyjście PipeWire, który przenosi aktywny dźwięk
Aby dokonać niewielkiego przełączenia dźwięku w Debianie, skorzystaj pactlz serwera PipeWire zgodnego z PulseAudio. Poniższy skrypt przełącza między dwoma nazwanymi wyjściami, ustawia nowe domyślne ustawienia i przenosi otwarte już strumienie odtwarzania. Zastąp przykładowe nazwy ujść dokładnymi nazwami wyświetlanymi na Twoim komputerze.
1. Potwierdź serwer PipeWire Pulse i znajdź swoje wyjścia
Komponent PipeWire pipewire-pulsezapewnia serwer kompatybilny z PulseAudio, dzięki czemu standardowe narzędzia, takie jak np. , pactlmogą kontrolować jego odbiorniki (wyjścia audio). Sprawdź, do którego serwera dociera Twój klient i wyświetl dostępne odbiorniki:
pactl info | grep -E 'Server Name|Server Version'
pactl list short sinks
W tej procedurze nazwa serwera powinna zawierać nazwę PipeWire. Lista ujść zawiera nazwy symboliczne, takie jak alsa_output.pci-0000_00_1f.3.analog-stereo. Skopiuj dokładnie dwie nazwy: po jednej dla każdego wyjścia, między którym chcesz się przełączać. Nazwy te są specyficzne dla podłączonego sprzętu i profilu audio; nie kopiuj nazw z przykładu ani nie używaj numerycznego indeksu ujścia, który może się zmieniać w trakcie sesji.
Jeśli pactlbrakuje, Debian udostępnia go w pulseaudio-utils. Zainstaluj ten pakiet klienta tylko w razie potrzeby. Jeśli pactl infonie możesz się połączyć lub zgłasza inny serwer dźwięku, najpierw sprawdź, czy zamiennik PulseAudio firmy PipeWire jest uruchomiony w Twojej sesji użytkownika; nie instaluj ani nie zmieniaj serwerów audio bezmyślnie.
Przed wypełnieniem skryptu przełączającego skopiuj dokładne nazwy symbolicznych ujść z listy wyjść na żywo.
2. Utwórz skrypt przełączający
Utwórz katalog skryptów dla każdego użytkownika i otwórz nowy plik:
Wklej ten skrypt, zastępując obie wartości w SINK_Ai SINK_Bnazwami, które skopiowałeś:
#!/usr/bin/env bash
set -euo pipefail
SINK_A='alsa_output.pci-0000_00_1f.3.analog-stereo'
SINK_B='alsa_output.usb-Generic_Headset-00.analog-stereo'
command -v pactl >/dev/null || { echo "pactl is missing" >&2; exit 1; }
server_name=$(pactl info | sed -n 's/^Server Name: //p')
case "$server_name" in
*PipeWire*) ;;
*) echo "pactl is not connected to PipeWire's Pulse server" >&2; exit 1 ;;
esac
sinks=$(pactl list short sinks | awk '{print $2}')
for sink in "$SINK_A" "$SINK_B"; do
if ! grep -Fqx -- "$sink" <<< "$sinks"; then
printf 'Sink not found: %s\n' "$sink" >&2
exit 1
fi
done
current=$(pactl get-default-sink)
if [[ "$current" == "$SINK_A" ]]; then
target=$SINK_B
else
target=$SINK_A
fi
pactl set-default-sink "$target"
while IFS= read -r input_id; do
[[ -n "$input_id" ]] || continue
pactl move-sink-input "$input_id" "$target"
done < <(pactl list short sink-inputs | awk '{print $1}')
printf 'Default output: %s\n' "$target"
Skrypt sprawdza obecność obu wyjść przed wprowadzeniem jakichkolwiek zmian. Wybiera drugie skonfigurowane wyjście, gdy bieżącym ustawieniem domyślnym jest SINK_A; jeśli bieżącym ustawieniem domyślnym jest inny odbiornik, rozpoczyna od SINK_A. set-default-sinkPolecenie wpływa na nowe strumienie, podczas gdy pętla służy move-sink-inputrównież do kierowania istniejących strumieni odtwarzania. Jeśli chcesz, aby przyszłe aplikacje korzystały tylko z nowego ustawienia domyślnego, usuń whilepętlę; strumienie już odtwarzane pozostaną na swoim miejscu. Uruchom ten skrypt jako ten sam zalogowany użytkownik pulpitu, który jest właścicielem sesji PipeWire. Nie używaj sudo, ponieważ może on łączyć się przez inne środowisko uruchomieniowe użytkownika i nie sterować dźwiękiem pulpitu. Operacje te są udokumentowane w podręczniku pactl systemu Debian .
Ustaw każdą zmienną na jedną z nazw odbiorników zgłoszonych przez pactl w tej sesji Debiana.
3. Zapisz, uruchom i zweryfikuj przełącznik
Zapisz w Nano za pomocą Ctrl+O, naciśnij Enter, a następnie wyjdź za pomocą Ctrl+X. Zaznacz skrypt jako plik wykonywalny i uruchom go:
Powinien wydrukować nowy domyślny odpływ. Sprawdź aktualne ustawienia domyślne serwera i wszystkie aktywne strumienie odtwarzania:
pactl get-default-sink
pactl list short sink-inputs
Uruchom skrypt ponownie, aby przełączyć się z powrotem. Aby sprawdzić słyszalność, odtwórz krótką próbkę dźwięku podczas przełączania i upewnij się, że pochodzi ona z wybranego urządzenia. Dokładne nazwy urządzeń i sposób wyświetlania różnią się w zależności od sprzętu, stanu połączenia Bluetooth i aktywnych profili audio.
Skrypt raportuje, która nazwa wyjścia stała się nową wartością domyślną.Potwierdź domyślny odpływ i sprawdź, czy aktywny strumień jest kierowany do wybranego wyjścia.
Gdy skrypt nie przełącza dźwięku
„Nie znaleziono odbiornika”: uruchom pactl list short sinksponownie. Odłączony zestaw słuchawkowy lub zmieniony profil mogły zmienić nazwę odbiornika; zaktualizuj pasującą zmienną.
Nie można nawiązać połączenia: sprawdź, czy usługi użytkownika PipeWire są uruchomione i czy identyfikują serwer PipeWire Pulse. Pakiet pipewire-pulsepactl info Debiana zapewnia serwer zastępczy, natomiast pulseaudio-utils zawiera klienta.pactl
Nowe audio się porusza, ale bieżąca aplikacja nie: uruchom ponownie skrypt, gdy strumień jest widoczny w pactl list short sink-inputs. Niektóre aplikacje ponownie otwierają strumienie lub zachowują własny wybór urządzenia, więc wybierz „Domyślne” w tej aplikacji, jeśli pozostaje przypięte do wyjścia.
Dokumentacja protokołu Pulse firmy PipeWire wyjaśnia, dlaczego klienci wiersza poleceń PulseAudio mogą sterować PipeWire, gdy pipewire-pulsejest aktywnym serwerem. Ten skrypt korzysta z tej warstwy kompatybilności; nie konfiguruje profili sprzętowych ani nie gwarantuje, że odłączone urządzenie będzie dostępne.