Audio
├─ Devices: 48. HDA Intel [alsa]
├─ Sinks: * 52. HDA Intel Analog Stereo [vol: 0.40]
├─ Sources: * 53. HDA Intel Analog Stereo [vol: 1.00]
Y gvc con perfiles reales (`output:analog-stereo+input:analog-stereo`). Se fue el auto_null.
LA CAUSA: SPA pide el device `card` (alsa-udev.c:178-183), que no tiene major:minor, y
libudev-zero recorría SÓLO /sys/dev/{block,char} — sólo devices CON nodo. El device que
SPA necesita nunca entraba en la enumeración: no faltaba una propiedad, faltaba la mitad
del espacio de búsqueda.
**Y LA PRIMERA VERSIÓN DEL PARCHE ARREGLÓ EL AUDIO Y ROMPIÓ EL VÍDEO.** Recorría
/sys/class entero, y /sys/class/drm no trae sólo tarjetas: trae los CONECTORES
(card0-Virtual-1) y un fichero `version`, ninguno con nodo. Mutter los tomaba como
candidatos ⇒ `No available CRTC for monitor` + `Page flip failed: drmModeAtomicCommit:
Invalid argument` en bucle. Pantalla negra con el compositor vivo: el mismo síntoma de
antes por una causa nueva. El udev real también los enumera, pero les adjunta las
propiedades por las que mutter los descarta, y ésas libudev-zero no las sintetiza.
La lección, que vale para cualquier reimplementación parcial de una API: **ensanchar la
enumeración expone los huecos de PROPIEDADES a más consumidores. Los dos lados del
contrato tienen que crecer juntos.** El parche final lleva una LISTA ACOTADA de
subsistemas (`sound` hoy); agregar otro es una línea *y* una prueba de que el consumidor
lo necesita y no se rompe.
POR QUÉ NO eudev — y corrijo mi propia sugerencia de antes, que era la peor opción: el
repo ya lo había probado en otro frente y ROMPIÓ EL INPUT. Su libudev.so.1 pisa el de
libudev-zero y, sin udevd, no expone ID_INPUT ⇒ libinput ignora todos los dispositivos en
silencio. Verificación A/B en QEMU de aquel episodio: eudev = 0 «New device»,
libudev-zero = 5. eudev sin udevd es PEOR, y correr udevd contradice la arquitectura
(arje-zero es PID1). El arreglo va donde está el hueco.
Radio pagado: 51 sellados a deuda, 9 en el cierre GNOME (reconstruidos: libinput,
libgudev, colord, mutter, gnome-shell, libgdm, upower, pipewire, wireplumber). El resto
—base, cli, KDE— queda para el latido.
Captura actualizada: escritorio pintando (628 colores) Y audio, cero page-flip fallidos.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
33 lines
1.6 KiB
TOML
33 lines
1.6 KiB
TOML
# ⚠ LLEVA UN PARCHE: `libudev-zero-scan-class.patch`. Upstream enumera SÓLO `/sys/dev/block` y
|
|
# `/sys/dev/char`, o sea sólo devices con `major:minor` y nodo en /dev; el udev real recorre
|
|
# `/sys/class` entero. La diferencia es invisible para casi todos los consumidores y letal para los que
|
|
# piden un device de CLASE: PipeWire busca el `card` de una tarjeta de sonido, que no tiene nodo, y sin
|
|
# él `wpctl status` daba `Devices:` vacío con ALSA funcionando y /dev/snd poblado. El parche explica por
|
|
# qué se arregla ACÁ y no empaquetando eudev (que sin udevd es PEOR: rompió el input en otro frente).
|
|
# Ojo al radio: `yupana radio libudev-zero` = 51 sellados a deuda.
|
|
#
|
|
# libudev-zero 1.0.4 — implementación de libudev SIN udevd (lee /sys y /dev directo). Encaja con la
|
|
# filosofía no-systemd de tawasuyu (arje es el init, sin daemon udev). La pide `libinput` (vía
|
|
# input-sys/libudev-sys de smithay) para enumerar dispositivos de entrada/DRM. Provee libudev.so +
|
|
# libudev.pc + headers. Makefile simple (sin autotools/meson).
|
|
# (Alternativa si hiciera falta hotplug real: eudev — más pesado, autotools.)
|
|
name = "libudev-zero"
|
|
version = "1.0.4"
|
|
|
|
[source]
|
|
tarball = "https://github.com/illiliti/libudev-zero/archive/refs/tags/1.0.4.tar.gz"
|
|
sha256 = "10148cfd6047d387bf71eca72cd19c177084224d96434a118d8def6e0a3d6316"
|
|
patches = ["libudev-zero-scan-class.patch"]
|
|
|
|
[build]
|
|
compiler = "zig-cc"
|
|
target = "x86_64-linux-musl"
|
|
link = "dynamic"
|
|
|
|
[build.phases]
|
|
compile = 'make PREFIX=/usr'
|
|
install = 'make PREFIX=/usr DESTDIR=/out install install-pkgconfig'
|
|
|
|
[deps]
|
|
build = ["pkgconf", "make"]
|