Inicio
» Consejos PC
»
Crea un script de conmutación de salida de PipeWire que mueva el audio activo.
Crea un script de conmutación de salida de PipeWire que mueva el audio activo.
Para un pequeño control de audio en Debian, utilice pactlel servidor compatible con PulseAudio de PipeWire. El script que se muestra a continuación alterna entre dos salidas con nombre, establece la nueva salida predeterminada y mueve las transmisiones de reproducción que ya estén abiertas. Reemplace los nombres de los sumideros de ejemplo con los nombres exactos que aparecen en su máquina.
1. Confirma el servidor PipeWire Pulse y encuentra tus salidas.
El componente de PipeWire pipewire-pulseproporciona un servidor compatible con PulseAudio, por lo que herramientas estándar como pactlpueden controlar sus salidas de audio. Compruebe a qué servidor se conecta su cliente y enumere las salidas disponibles:
pactl info | grep -E 'Server Name|Server Version'
pactl list short sinks
Para este procedimiento, el nombre del servidor debe mencionar PipeWire. La lista de salidas contiene nombres simbólicos como alsa_output.pci-0000_00_1f.3.analog-stereo. Copie exactamente dos nombres: uno para cada salida que desee alternar. Estos nombres son específicos del hardware conectado y del perfil de audio; no copie los nombres del ejemplo ni utilice un índice numérico de salida, ya que este puede cambiar durante la sesión.
Si pactlfalta, Debian lo proporciona en pulseaudio-utils. Instale ese paquete de cliente solo si es necesario. Si pactl infono puede conectarse o informa de un servidor de sonido diferente, primero confirme que el reemplazo de PulseAudio de PipeWire se está ejecutando en su sesión de usuario; no instale ni cambie servidores de audio a ciegas.
Copie los nombres simbólicos exactos de los sumideros de la lista de salida en vivo antes de completar el script de conmutación.
2. Crea el script de alternancia
Cree un directorio de scripts por usuario y abra un nuevo archivo:
Pega este script, reemplazando ambos valores en SINK_Ay SINK_Bcon los nombres que copiaste:
#!/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"
El script comprueba que ambas salidas estén presentes antes de cambiar nada. Elige la otra salida configurada cuando el valor predeterminado actual es SINK_A; si el valor predeterminado actual es otro sumidero, comienza con SINK_A. El set-default-sinkcomando afecta a las nuevas transmisiones, mientras que el bucle utiliza move-sink-inputpara enrutar también las transmisiones de reproducción existentes. Si solo quieres que las aplicaciones futuras utilicen el nuevo valor predeterminado, elimina el whilebucle; las transmisiones que ya se estén reproduciendo permanecerán donde están. Ejecuta este script como el mismo usuario de escritorio que ha iniciado sesión y que posee la sesión de PipeWire. No uses sudo, que puede conectarse a través de un entorno de ejecución de usuario diferente y no controlar el audio de tu escritorio. Estas operaciones están documentadas en el manual de pactl de Debian .
Establezca cada variable en uno de los nombres de sumidero informados por pactl en esta sesión de Debian.
3. Guarda, ejecuta y verifica el cambio.
Guarda en Nano con Ctrl+O, pulsa Enter, y luego sal con Ctrl+X. Marca el script como ejecutable y ejecútalo:
Debería imprimir el nuevo sumidero predeterminado. Compruebe el valor predeterminado actual del servidor y cualquier transmisión de reproducción activa:
pactl get-default-sink
pactl list short sink-inputs
Ejecuta el script una segunda vez para volver al modo anterior. Para una comprobación práctica, reproduce una breve muestra de audio mientras cambias de dispositivo y confirma que proviene del dispositivo seleccionado. Los nombres exactos de los dispositivos y su comportamiento en pantalla varían según el hardware, el estado de la conexión Bluetooth y los perfiles de audio activos.
El script informa qué salida con nombre se convirtió en la nueva predeterminada.Confirme el sumidero predeterminado y compruebe que se esté enrutando un flujo activo a la salida seleccionada.
Cuando el guion no cambia el audio
No se encontró el receptor: vuelva a ejecutar el comando pactl list short sinks. Es posible que un auricular desconectado o un cambio de perfil hayan modificado el nombre del receptor; actualice la variable correspondiente.
No se puede conectar: compruebe que los servicios de usuario de PipeWire estén en ejecución y que pactl infoidentifiquen el servidor PipeWire Pulse. El paquete pipewire-pulse de Debian proporciona ese servidor alternativo, mientras que pulseaudio-utils incluye el pactlcliente.
Se mueve un nuevo audio, pero la aplicación actual no: vuelva a ejecutar el script mientras esa transmisión sea visible en pactl list short sink-inputs. Algunas aplicaciones vuelven a abrir transmisiones o mantienen su propia selección de dispositivo, así que elija "Predeterminado" en esa aplicación si permanece anclada a una salida.
La documentación del protocolo Pulse de PipeWire explica por qué los clientes de línea de comandos de PulseAudio pueden controlar PipeWire cuando pipewire-pulseeste actúa como servidor activo. Este script utiliza esa capa de compatibilidad; no configura perfiles de hardware ni garantiza la disponibilidad de un dispositivo desconectado.