audio: PipeWire es el servidor de la distro (decisión del usuario) — gvc conecta

Cierra una pregunta que estaba explícitamente abierta en varias recetas, y que es la
razón por la que `pulseaudio` se había construido con `-Ddaemon=false`: sólo el cliente,
para que gvc hablara el protocolo sin cerrar la decisión de prestado.

**Los dos conviven y por eso la decisión no rompe nada**: pipewire va con
`-Dlibpulse=enabled` ⇒ `pipewire-pulse`, un servidor que habla el protocolo de
PulseAudio. gnome-shell usa libpulse sin enterarse de qué hay del otro lado. No hubo que
tocar una línea del cliente.

  == gnome-qemu :: socket pipewire-0 OK
  == gnome-qemu :: socket pulse/native OK — gvc va a poder conectar
  Gvc-DEBUG: Updating client: index=32 name='pipewire'
  Gvc-DEBUG: Updating sink: index=33 name='auto_null' description='Dummy Output'

El `Failed to connect context: Connection refused` desapareció. El sink es auto_null, que
es la respuesta honesta: la VM no tiene tarjeta de sonido.

**⚠ Falta wireplumber** (gestor de sesión, Lua + su cierre). Sin él PipeWire acepta
clientes pero NO enumera ni enruta dispositivos. «El shell conecta» ≠ «hay sonido», y el
log de arriba es justo el caso donde confundirlos sería fácil. Queda escrito en la receta
y en el runbook.

GOTCHA MEDIDO: ya existía incoming-kde/pipewire.toml sellada y NO se puede reusar
hidratándola acá — los dos cierres traen glib y **no son la misma glib**:
incoming-kde/glib-shared y incoming-gnome/glib producen libglib-2.0.so.0.8800.1 con bytes
distintos (verificado con cmp) y comparten 370 rutas. Proyectar las dos deja que una gane
por orden de proyección ⇒ dos registros de GType en un proceso, el cuadro que costó el
episodio de colord. De ahí la copia en la cola GNOME (glib-shared→glib, dbus→dbus-shared,
pcre2-shared→pcre2), que sí re-construye. Lo que FUE gratis: alsa-lib, cuya única dep es
pkgconf y resuelve al catálogo PADRE ⇒ hash idéntico y cache hit (b3:93cae411).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-29 19:59:30 -04:00
co-authored by Claude Opus 5
parent d250d57c2b
commit 5faa259603
6 changed files with 170 additions and 3 deletions
+31
View File
@@ -291,6 +291,37 @@ esperar_nombre() {
dump /tmp/busnames.log
return 1
}
# ── AUDIO: PipeWire (decisión del usuario, 2026-07-29) ──────────────────────────────────────────
# Van DOS procesos y el orden importa: `pipewire` es el servidor, y `pipewire-pulse` es el puente que
# habla el protocolo de PulseAudio contra él. gnome-shell usa libpulse (gvc), así que lo que necesita
# es el SEGUNDO; sin el primero, el segundo no tiene con quién hablar.
#
# Los dos son servicios de USUARIO: su socket vive en $XDG_RUNTIME_DIR, que ya está creado más arriba.
#
# ⚠ Sin gestor de sesión (wireplumber todavía no está autorado): esto hace que el shell CONECTE y deje
# de tirar `Gvc-WARNING: Failed to connect context: Connection refused`, pero NO enumera ni enruta
# dispositivos. «El shell conecta» no es «hay sonido», y conviene no confundirlos.
if [ -x /usr/bin/pipewire ]; then
/usr/bin/pipewire >/tmp/pipewire.log 2>&1 &
say "pipewire lanzado (pid $!)"
i=0; while [ $i -lt 20 ] && [ ! -S "$XDG_RUNTIME_DIR/pipewire-0" ]; do i=$((i+1)); sleep 0.25; done
if [ -S "$XDG_RUNTIME_DIR/pipewire-0" ]; then
say "socket pipewire-0 OK"
/usr/bin/pipewire-pulse >/tmp/pipewire-pulse.log 2>&1 &
say "pipewire-pulse lanzado (pid $!)"
i=0; while [ $i -lt 20 ] && [ ! -S "$XDG_RUNTIME_DIR/pulse/native" ]; do i=$((i+1)); sleep 0.25; done
if [ -S "$XDG_RUNTIME_DIR/pulse/native" ]; then
say "socket pulse/native OK — gvc va a poder conectar"
else
say "!! pipewire-pulse no creó pulse/native:"; dump /tmp/pipewire-pulse.log
fi
else
say "!! pipewire no creó su socket:"; dump /tmp/pipewire.log
fi
else
say "!! sin /usr/bin/pipewire — el shell va a avisar 'Failed to connect context'"
fi
esperar_nombre org.freedesktop.login1 /tmp/logind-compat.log
esperar_nombre org.freedesktop.PolicyKit1 /tmp/polkit-compat.log
esperar_nombre org.freedesktop.Accounts /tmp/accounts-daemon.log
+3
View File
@@ -51,6 +51,9 @@ else
# el escritorio sea usable— los CURSORES. Con el cursor por software (obligatorio en virtio-gpu)
# y sin tema, el puntero se mueve invisible. Arrastra hicolor-icon-theme por `Inherits=hicolor`.
recipes/incoming-gnome/adwaita-icon-theme.toml
# El SERVIDOR de audio (decisión del usuario: PipeWire, no PulseAudio). No es dep de build de
# nadie: el shell habla libpulse y `pipewire-pulse` le contesta por el otro lado.
recipes/incoming-gnome/pipewire.toml
)
fi