Home
» PC-tips
»
Ontwikkel een PipeWire-uitvoerschakelscript dat de actieve audio verplaatst.
Ontwikkel een PipeWire-uitvoerschakelscript dat de actieve audio verplaatst.
Voor een eenvoudige audioschakelaar in Debian kunt u pactlde PulseAudio-compatibele server van PipeWire gebruiken. Het onderstaande script schakelt tussen twee benoemde uitgangen, stelt de nieuwe standaard in en verplaatst de reeds geopende afspeelstreams. Vervang de voorbeeldnamen van de sinks door de exacte namen die op uw machine worden weergegeven.
1. Bevestig de PipeWire Pulse-server en zoek uw uitgangen op.
De PipeWire- pipewire-pulsecomponent biedt een PulseAudio-compatibele server, waardoor standaardtools pactlde audio-uitgangen (sinks) kunnen aansturen. Controleer welke server uw client bereikt en bekijk de beschikbare sinks:
pactl info | grep -E 'Server Name|Server Version'
pactl list short sinks
Voor deze procedure moet de servernaam PipeWire bevatten. De sinklijst bevat symbolische namen zoals <sink> alsa_output.pci-0000_00_1f.3.analog-stereo. Kopieer twee namen exact: één voor elke uitvoer waartussen u wilt schakelen. Deze namen zijn specifiek voor de aangesloten hardware en het audioprofiel; kopieer geen namen uit het voorbeeld en gebruik geen numerieke sinkindex, aangezien deze tijdens een sessie kan veranderen.
Als pactlhet ontbreekt, levert Debian het in pulseaudio-utils. Installeer dat clientpakket alleen als dat nodig is. Als pactl infoer geen verbinding tot stand kan worden gebracht of als er een andere geluidsserver wordt gemeld, controleer dan eerst of de PulseAudio-vervanging van PipeWire actief is in uw gebruikerssessie; installeer of wissel niet zomaar van audioserver.
Kopieer de exacte symbolische sinknamen uit de live uitvoerlijst voordat u het toggle-script invult.
2. Maak het toggle-script aan.
Maak een map voor scripts per gebruiker aan en open een nieuw bestand:
Plak dit script en vervang beide waarden in SINK_Aen SINK_Bdoor de namen die je hebt gekopieerd:
#!/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"
Het script controleert of beide outputs aanwezig zijn voordat er iets wordt gewijzigd. Het kiest de andere geconfigureerde output wanneer de huidige standaard is SINK_A; als de huidige standaard een andere sink is, begint het met SINK_A. De set-default-sinkopdracht is van invloed op nieuwe streams, terwijl de loop move-sink-inputook gebruikt wordt om bestaande afspeelstreams te routeren. Als u alleen wilt dat toekomstige apps de nieuwe standaard gebruiken, verwijdert u de whileloop; reeds afspelende streams blijven op hun huidige locatie. Voer dit script uit als dezelfde ingelogde desktopgebruiker die eigenaar is van de PipeWire-sessie. Gebruik niet , omdat dit verbinding kan maken via een andere gebruikersruntime en uw desktopaudio niet kan beheren. Deze bewerkingen worden beschreven in de pactl-handleidingsudo van Debian .
Stel elke variabele in op een van de sinknamen die pactl op deze Debian-sessie heeft gerapporteerd.
3. Sla de wijzigingen op, voer ze uit en controleer de switch.
Sla het bestand op in Nano met Ctrl+O, druk op Enter, en sluit vervolgens af met Ctrl+X. Maak het script uitvoerbaar en voer het uit:
Het zou de nieuwe standaardbestemming moeten weergeven. Controleer de huidige standaardbestemming van de server en eventuele actieve afspeelstreams:
pactl get-default-sink
pactl list short sink-inputs
Voer het script een tweede keer uit om terug te schakelen. Om te controleren of het geluid daadwerkelijk van het geselecteerde apparaat komt, kunt u tijdens het schakelen een kort audiofragment afspelen. De exacte apparaatnamen en het weergavegedrag kunnen variëren afhankelijk van de hardware, de Bluetooth-verbindingsstatus en de actieve audioprofielen.
Het script meldt welke benoemde uitvoer de nieuwe standaard is geworden.Bevestig de standaardbestemming en controleer of een actieve stream naar de geselecteerde uitvoer is doorgestuurd.
Als het script de audio niet wijzigt
"Sink niet gevonden": probeer het pactl list short sinksopnieuw. Een losgekoppelde headset of een gewijzigd profiel kan de naam van de sink hebben veranderd; werk de bijbehorende variabele bij.
Kan geen verbinding maken: controleer of de PipeWire-gebruikersservices actief zijn en of de PipeWire Pulse-server wordt herkend. Het pipewire-pulse-pakketpactl info van Debian biedt deze vervangende server, terwijl pulseaudio-utils de client bevat.pactl
Nieuwe audio wordt verplaatst, maar de huidige app niet: voer het script opnieuw uit terwijl die stream zichtbaar is pactl list short sink-inputs. Sommige applicaties heropenen streams of behouden hun eigen apparaatselectie, dus kies 'Standaard' in die applicatie als deze aan een uitvoer is gekoppeld.
De Protocol Pulse-documentatie van PipeWire legt uit waarom PulseAudio-commandoregelclients PipeWire kunnen besturen wanneer pipewire-pulsedeze de actieve server is. Dit script maakt gebruik van die compatibiliteitslaag; het configureert geen hardwareprofielen en garandeert niet dat een losgekoppeld apparaat beschikbaar zal zijn.