Personalizando mi sistema: fijando la salida por defecto de PulseAudio

Mi monitor MSI me robaba la salida de audio cada vez que despertaba. Tres líneas de configuración de PulseAudio y una entrada de autostart en MATE lo cortaron. El recorrido por pactl, switch-on-port-available y un repo de dotfiles recién estrenado.

Trabajo con auriculares enchufados al portátil y dos monitores externos con altavoces integrados que no uso jamás. AOC a la izquierda, MSI a la derecha. La música suena en los auriculares. Hago una pausa, los monitores se duermen, muevo el ratón, los monitores vuelven, y la música está ahora reventando por los altavoces enclenques del MSI. Cada vez, sin falta.

Esta es la historia de por qué pasa eso, y las tres líneas de configuración de PulseAudio que lo cortaron.

El síntoma

Ubuntu 22.04 con MATE, un portátil AMD Ryzen, un HDMI al MSI y un adaptador USB-C DisplayLink al AOC. El servidor de audio es PulseAudio, no PipeWire, aunque PipeWire también está corriendo para la captura de pantalla. La sink por defecto es la salida analógica del portátil (los auriculares). Todo va bien hasta que entra DPMS.

Cuando el MSI se duerme, su sink HDMI se reporta como no disponible. Cuando vuelve a despertar, la sink se reporta disponible otra vez. PulseAudio ve eso y decide que el usuario seguro que quiere usar la salida nueva y brillante, así que cambia el default al MSI. El stream de música, que no tiene preferencia propia, va con el default. Los auriculares se quedan mudos.

El diagnóstico

Hay dos módulos de PulseAudio culpables:

$ pactl list short modules | grep switch-on
4    module-switch-on-port-available
5    module-switch-on-connect

El primero reasigna la salida por defecto cada vez que un puerto pasa a disponible. El segundo hace lo mismo cuando aparece una sink nueva. Port-available es el que se dispara en cada despertar de monitor. Switch-on-connect es el motivo por el que el AOC me robó el default la primera vez que lo enchufé.

El arreglo es descargar los dos. La forma más limpia es un override de usuario, así la configuración del sistema queda intacta y el cambio es reversible borrando un solo fichero.

El arreglo

Tres líneas en un override personal en ~/.config/pulse/default.pa:

.include /etc/pulse/default.pa

.ifexists module-switch-on-port-available.so
unload-module module-switch-on-port-available
.endif

.ifexists module-switch-on-connect.so
unload-module module-switch-on-connect
.endif

El include de arriba carga primero el fichero del sistema; los unloads ocurren al final. Reinicia PulseAudio con pulseaudio -k y los módulos desaparecen. Cambia el perfil de la tarjeta HDMI con pactl set-card-profile para simular un ciclo de suspensión del monitor, comprueba que pactl get-default-sink sigue apuntando a los auriculares, y el problema original queda zanjado.

Queda un detalle. Con esos dos módulos de switch fuera, PulseAudio elige la primera sink que cargue como default en el arranque. En este portátil la sink USB del DisplayLink suele ganarle la carrera a la analógica PCI, así que tras un login limpio el AOC acaba siendo el default en lugar de los auriculares. Una entrada de autostart de MATE lo arregla:

[Desktop Entry]
Type=Application
Name=fer-default-sink
Exec=sh -c 'sleep 6 && pactl set-default-sink alsa_output.pci-0000_05_00.6.analog-stereo'
X-MATE-Autostart-enabled=true
NoDisplay=true

El sleep de seis segundos es el arreglo barato para la carrera de arranque: cuando el escritorio está completamente arriba, todas las sinks ya han cargado y pactl se queda con la que de verdad quiero.

Dónde vive esto ahora

Dos ficheros en una estación de trabajo, dos symlinks, y la costumbre de perderlos cada vez que reinstalo. La respuesta honesta fue un repo privado nuevo, fer-system-settings, con un directorio por máquina. Los ficheros vivos en el árbol de configuración del usuario son symlinks que apuntan al repo. Llevar los ajustes del sistema en git es más viejo que yo, pero no había tenido un sitio limpio para ellos hasta que lo necesité con bastante urgencia.

El repo es pequeño a propósito. Sin instalador, sin chezmoi, sin GNU stow, solo ficheros, cada uno con un comentario en cabecera explicando por qué existe. El porqué es la parte que se evapora antes si no la escribes.

Lo que me llevo

El cambio automático de salida de PulseAudio es un valor por defecto razonable para un portátil con un único usuario y una única salida. En cuanto añades una pantalla USB, un monitor HDMI con altavoces y unos auriculares Bluetooth, «automático» deja de querer decir lo mismo que «correcto». Descargar los dos módulos de switch y fijar la salida por defecto de forma explícita es la manera con menos fricción de recuperar la decisión.

Un fichero de configuración sin un comentario en cabecera es un misterio futuro. La cabecera de default.pa dice exactamente qué monitor se estaba portando mal y por qué. Dentro de seis meses no me acordaré yo tampoco.

Un repo de system-settings vale la pena empezarlo antes de pensar que lo necesitas. El mío tenía un fichero el primer día y con eso bastaba. La estructura ya está ahí para el siguiente retoque, y para el siguiente.

20 de mayo de 2026 - escrito desde un portátil con tres sinks cargadas y exactamente la que toca seleccionada.

¿Qué es la IA Agéntica? Una lista de lecturas desde la trinchera
De los chatbots que responden a sistemas que actúan. Las fuentes que me enseñaron qué es realmente un agente, y cómo los usamos cada día en LTC.