lua5.2 5.2.4: mpv gana el OSC — la barra, las estadísticas y la consola

El OSC de mpv es `player/lua/osc.lua`: sin Lua el reproductor anda y responde al teclado pero NO
DIBUJA NADA de interfaz. La `lua` del corpus no sirve — `meson.build:701` acepta 5.1, 5.2 o LuaJIT
y el `lua.pc` genérico va acotado a `>=5.1.0, <5.3.0`; la nuestra es 5.4.8 y entró para wireplumber.

CÓMO CONVIVEN LAS DOS SIN PISARSE, que es lo que hace legítimo tener dos Lua: esta receta instala
**sólo la librería**. Sin `/usr/bin/lua`, sin `luac` y sin `lua.pc` genérico — que son exactamente
los tres ficheros que colisionarían si una imagen hidratara las dos. Las `.so` no colisionan porque
el SONAME lleva la versión, y los headers van a `/usr/include/lua5.2/` porque los de 5.2 y 5.4 se
llaman igual y dicen cosas distintas.

La diferencia con 5.4 que muerde: en 5.2.4 `luaconf.h:43-49` hace que `LUA_USE_LINUX` implique
`LUA_USE_READLINE` (en 5.4 eso vive en el target `linux-readline` del Makefile). Se esquiva
construyendo el target `a` —sólo `liblua.a`— en vez de `all`: `LUA_USE_READLINE` lo consume nada
más que `lua.c`, el binario del REPL, que acá no se compila. Sale gratis y de paso es lo que hace
que no haya `/usr/bin/lua` que colisione.

`-Dlua=lua5.2` y no `auto`: auto recorre ocho nombres de `.pc` y se lleva el primero que encuentre
en el sandbox ⇒ el artefacto dependería de qué otra cosa quedó montada en el lab.

EVIDENCIA, del mpv re-sellado (b3:d9072a10):
  List of enabled features: … libass libplacebo **lua5.2** … wayland
  [cplayer] Set property: user-data/osc/visibility="auto" -> 1
  [cplayer] Done loading scripts.
o sea que el script del OSC no sólo compiló: se carga y corre.

alsa-lib: se corrige el comentario, que decía que las pipewire iban con `-Dpipewire-alsa=disabled`.
Ya no. Y queda escrito el gotcha que costó encontrarlo: el `alsa.conf` que instala carga
`/var/lib/alsa/conf.d`, `/usr/etc/alsa/conf.d` y `/etc/alsa/conf.d`, NO `/usr/share/alsa/alsa.conf.d`,
que es donde meson deja la config del plugin.
This commit is contained in:
Sergio
2026-09-03 05:07:12 +00:00
parent 5b82474079
commit 032aa02582
3 changed files with 122 additions and 20 deletions
+12 -6
View File
@@ -7,12 +7,18 @@
# ⇒ el cierre no cambia y `hammer hash` da el MISMO ArtifactHash a los cuatro ficheros. Un solo
# artefacto en el store, hidrate quien hidrate.
#
# QUÉ SIGNIFICA ESTO PARA EL SONIDO DE VERDAD, que no es obvio: el servidor de audio de la distro
# es PipeWire (decisión del usuario, 2026-07-29), y las tres recetas de pipewire llevan HOY
# `-Dpipewire-alsa=disabled`. O sea que un cliente ALSA **no** desemboca en PipeWire: abre la tarjeta
# por su cuenta y compite con él. Mientras eso no se invierta, `mpv --ao=alsa` suena en una máquina
# sin PipeWire corriendo y choca en una con él. Está escrito en `recipes/mpv.toml` y es el próximo
# paso del frente, no un olvido.
# QUÉ SIGNIFICA ESTO PARA EL SONIDO DE VERDAD: el servidor de audio de la distro es PipeWire
# (decisión del usuario, 2026-07-29), y desde 2026-09-03 las tres recetas de pipewire van con
# `-Dpipewire-alsa=enabled` ⇒ **ALSA es la ABI de audio universal de esta distro**. Un cliente ALSA
# que abre "default" desemboca en PipeWire por el plugin `libasound_module_pcm_pipewire.so`, no le
# pelea la tarjeta. Eso es lo que hace que esta receta alcance para una app de audio del corpus sin
# tener que subir `libpipewire` (que vive en las tres colas de escritorio y arrastra glib).
#
# ⚠ OJO con el `alsa.conf` que instala: sus `@hooks` cargan `/var/lib/alsa/conf.d`,
# `/usr/etc/alsa/conf.d` y `/etc/alsa/conf.d` — **NO** `/usr/share/alsa/alsa.conf.d`, que es donde
# meson deja la config del plugin. Por eso las recetas de pipewire tienen que enlazarla a mano: sin
# ese enlace el plugin queda instalado y no lo usa nadie. (El `/usr/etc` sale de que acá el
# `./configure` no pasa `--sysconfdir=/etc`; cambiarlo re-hashearía alsa-lib y sus cuatro copias.)
# alsa-lib 1.2.14 — API de audio del kernel Linux (libasound.so). Campaña KDE (ADR 0011): sustrato de
# PulseAudio → pulseaudio-qt → plasma-pa (el applet de volumen). Primer eslabón de la cadena de AUDIO real
# (hasta ahora el lab sólo tenía libcanberra con backend NULL, sin reproducción).
+90
View File
@@ -0,0 +1,90 @@
# Lua 5.2.4 — el intérprete EMBEBIDO que necesita el OSC de mpv. No es el `lua` del corpus.
#
# ══ POR QUÉ DOS LUA Y NO UNA ═══════════════════════════════════════════════════════════════════
# El corpus ya tiene `lua` 5.4.8, que entró para wireplumber (su política está escrita en Lua). mpv
# NO la puede usar: `meson.build:701` enumera las versiones aceptadas y son 5.1, 5.2 y LuaJIT — el
# `lua.pc` genérico va acotado a `>=5.1.0, <5.3.0`. No es una preferencia de upstream que se pueda
# forzar con una perilla: mpv 0.41 no compila contra la API de 5.3+.
#
# Sin Lua, mpv reproduce y responde al teclado pero NO DIBUJA NADA de interfaz: el OSC —la barra de
# búsqueda, el overlay de estadísticas, la consola— es `player/lua/osc.lua`. Es la diferencia entre
# "el video se ve" y "hay un reproductor".
#
# ══ CÓMO CONVIVEN SIN PISARSE, que es lo que hace legítimo tener las dos ═══════════════════════
# Esta receta instala **sólo la librería**: sin `/usr/bin/lua`, sin `luac`, y sin un `lua.pc`
# genérico. Los tres son exactamente los ficheros que colisionarían con la 5.4 si una imagen
# hidratara las dos (mismas rutas, gana quien proyecte último — el cuadro de las dos glib). Las
# `.so` no colisionan porque el SONAME lleva la versión: `liblua-5.2.so.0` vs `liblua-5.4.so.0`.
# Los `.pc` que sí publica son los tres nombres versionados que mpv prueba: `lua5.2`, `lua-5.2`,
# `lua52`. Nadie que pida "lua" a secas se lleva ésta por error.
#
# ══ LO QUE HAY QUE INVENTAR, igual que en la receta de 5.4 ═════════════════════════════════════
# El Makefile de Lua sólo produce `liblua.a` y los binarios: **no hay regla de `.so` ni fichero
# pkg-config**, los agrega cada distro. Acá se agregan a mano: `-fPIC` en MYCFLAGS (sin eso la `.a`
# no es reubicable), la `.so` enlazada con `--whole-archive` (de una estática el linker sólo se
# lleva lo referenciado y acá hay que llevárselo todo), y el `.pc` escrito a mano.
#
# ⚠ LA DIFERENCIA CON 5.4 QUE MUERDE: en 5.2.4 el `luaconf.h:43-49` hace que `LUA_USE_LINUX`
# implique **`LUA_USE_READLINE`** — en 5.4 eso se movió al target `linux-readline` del Makefile, así
# que la receta de 5.4 puede definir LUA_USE_LINUX sin arrastrar readline y ésta no. Se esquiva
# construyendo el target `a` (sólo `liblua.a`) en vez de `all`: `LUA_USE_READLINE` lo consume
# únicamente `lua.c`, el binario del REPL, que acá no se compila. Sale gratis y de paso es lo que
# hace que no haya `/usr/bin/lua` que colisione. El ncurses del catálogo es static-only y arrastra
# `-static` al link, así que traer readline habría sido el mismo muro que ya saltó `pw-top`.
name = "lua5.2"
version = "5.2.4"
license = "MIT"
[source]
tarball = "https://www.lua.org/ftp/lua-5.2.4.tar.gz"
sha256 = "b9e2e4aad6789b3b63a056d442f7b39f0ecfca3ae0f1fc0ae4e9614401b69f4b"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "dynamic"
[build.phases]
configure = "true"
compile = '''
set -e
# CC explícito: el Makefile de Lua lo fija a `gcc -std=gnu99` y ganaría sobre el del entorno.
# Target `a` y no `all`: sólo la librería (ver la nota de readline en la cabecera).
make -C src a CC="hammer-zig-cc -std=gnu99" \
SYSCFLAGS="-DLUA_USE_LINUX" SYSLIBS="-ldl" MYCFLAGS="-fPIC"
hammer-zig-cc -shared -o src/liblua-5.2.so.0.0.0 \
-Wl,-soname,liblua-5.2.so.0 \
-Wl,--whole-archive src/liblua.a -Wl,--no-whole-archive -lm
'''
install = '''
set -e
mkdir -p /out/usr/lib/pkgconfig /out/usr/include/lua5.2
# Headers en un subdirectorio propio: los de 5.2 y los de 5.4 tienen los MISMOS nombres y contenido
# distinto. En /usr/include pelado se pisarían y el próximo que compile contra "lua" se llevaría los
# que hidrató último. El `.pc` apunta acá, así que quien use pkg-config no se entera.
install -m644 src/lua.h src/luaconf.h src/lualib.h src/lauxlib.h src/lua.hpp /out/usr/include/lua5.2/
install -m644 src/liblua.a /out/usr/lib/liblua-5.2.a
install -m755 src/liblua-5.2.so.0.0.0 /out/usr/lib/
ln -s liblua-5.2.so.0.0.0 /out/usr/lib/liblua-5.2.so.0
ln -s liblua-5.2.so.0 /out/usr/lib/liblua-5.2.so
cat > /out/usr/lib/pkgconfig/lua5.2.pc <<'PC'
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/lua5.2
Name: Lua
Description: Lua language engine (5.2, embebida — sin intérprete)
Version: 5.2.4
Requires:
Libs: -L${libdir} -llua-5.2 -lm
Cflags: -I${includedir}
PC
# Los tres nombres versionados que prueba mpv (meson.build:701). NINGÚN `lua.pc` genérico: ése es
# de la 5.4 y confundirlos es justamente lo que esta receta evita.
ln -s lua5.2.pc /out/usr/lib/pkgconfig/lua-5.2.pc
ln -s lua5.2.pc /out/usr/lib/pkgconfig/lua52.pc
'''
[deps]
build = ["make", "pkgconf"]
+20 -14
View File
@@ -54,20 +54,26 @@
# y `incoming-gnome/glib` producen bytes distintos — el episodio de las dos glib). Queda ALSA, que
# es la ABI del kernel y no depende de ninguna cola.
#
# ⚠ Y ASÍ COMO ESTÁ HOY, ESO NO SUENA EN UN ESCRITORIO CON PIPEWIRE CORRIENDO: las tres recetas de
# pipewire llevan `-Dpipewire-alsa=disabled`, o sea que NO instalan el plugin ALSA que redirige a
# PipeWire. Un cliente ALSA abre la tarjeta por su cuenta y compite con el servidor. El arreglo no
# es de esta receta: es dar vuelta esa perilla en las tres pipewire, que es lo que convierte a ALSA
# en la ABI de audio universal de la distro y sirve a TODA app ALSA, no sólo a mpv. Radio medido con
# `yupana radio pipewire`: 4 en cosmic, 3 en gnome, 2 en kde. Barato. Es el próximo paso del frente
# y está escrito acá para que no se descubra con un video mudo.
# Y ESO SÍ SUENA, desde 2026-09-03: las tres recetas de pipewire pasaron a `-Dpipewire-alsa=enabled`
# y cablean el plugin en `/etc/alsa/conf.d` (ver el bloque de install de cualquiera de las tres). Un
# cliente ALSA que abre "default" desemboca en PipeWire en vez de pelearle la tarjeta. La cadena es
# `mpv --ao=alsa` → `libasound` → `libasound_module_pcm_pipewire.so` → PipeWire, o sea PROTOCOLO en
# vez de ABI compartida — la misma figura que el ADR 0015 usa para cruzar el borde de la jaula.
# ⚠ El precio, que conviene tener escrito: con `99-pipewire-default.conf` puesto, `pcm.!default` ES
# PipeWire. En una máquina donde PipeWire NO esté corriendo, un cliente ALSA ya no cae a la tarjeta:
# no suena. Es el trato que hace toda distro con pipewire-alsa, y acá es coherente porque PipeWire
# es el servidor decidido; pero explica un silencio que sin esta nota se diagnostica mal.
#
# ══ LUA: SIN OSC, Y NO ES UN OLVIDO ════════════════════════════════════════════════════════════
# ══ LUA: EL OSC, Y POR QUÉ NO ES LA `lua` DEL CORPUS ═══════════════════════════════════════════
# El OSC (la barra de búsqueda, el overlay de estadísticas, la consola) es Lua: `player/lua/osc.lua`.
# Sin Lua, mpv reproduce y responde al teclado pero no dibuja NADA de interfaz. Y la lua del corpus
# no sirve: `meson.build:701` sólo acepta 5.1, 5.2 o LuaJIT (el `lua.pc` genérico va acotado a
# `>=5.1.0, <5.3.0`) y la nuestra es 5.4.8, que entró para wireplumber. Prenderlo pide una receta
# `lua5.2` o `luajit` nueva — trabajo acotado y con premio visible, el siguiente ticket del frente.
# Sin Lua, mpv reproduce y responde al teclado pero no dibuja NADA de interfaz.
#
# La `lua` del corpus NO sirve: `meson.build:701` sólo acepta 5.1, 5.2 o LuaJIT (el `lua.pc` genérico
# va acotado a `>=5.1.0, <5.3.0`) y la nuestra es 5.4.8, que entró para wireplumber. Por eso existe
# `recipes/lua5.2.toml`, que instala SÓLO la librería —sin `/usr/bin/lua`, sin `luac` y sin `lua.pc`
# genérico— justamente para que las dos puedan convivir en una imagen sin pisarse.
# `-Dlua=lua5.2` y no `auto`: `auto` recorre ocho nombres de `.pc` y se lleva el primero que
# encuentre en el sandbox, o sea que el artefacto dependería de qué otra cosa quedó montada.
#
# ══ EL PRECIO DEL ffmpeg QUE HEREDA ════════════════════════════════════════════════════════════
# El ffmpeg del corpus viene de la campaña KDE, donde entró para que kpipewire grabara un stream, y
@@ -98,7 +104,7 @@ link = "dynamic"
flags = []
[build.phases]
configure = "PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release -Dprefer_static=true -Dbuild-date=false -Dcplayer=true -Dlibmpv=false -Dtests=false -Dmanpage-build=disabled -Dhtml-build=disabled -Dpdf-build=disabled -Dwayland=enabled -Degl=enabled -Degl-wayland=enabled -Dgl=enabled -Dplain-gl=disabled -Dalsa=enabled -Dzlib=enabled -Diconv=enabled -Dvector=enabled -Dx11=disabled -Dgl-x11=disabled -Degl-x11=disabled -Dxv=disabled -Dx11-clipboard=disabled -Dvdpau=disabled -Dvulkan=disabled -Dshaderc=disabled -Dspirv-cross=disabled -Dvaapi=disabled -Dvaapi-drm=disabled -Dvaapi-wayland=disabled -Dvaapi-x11=disabled -Ddrm=disabled -Dgbm=disabled -Ddmabuf-wayland=disabled -Dpipewire=disabled -Dpulse=disabled -Djack=disabled -Dsndio=disabled -Doss-audio=disabled -Dopenal=disabled -Dsdl2-audio=disabled -Dsdl2-video=disabled -Dsdl2-gamepad=disabled -Dlua=disabled -Djavascript=disabled -Dcdda=disabled -Ddvdnav=disabled -Ddvbin=disabled -Dlibbluray=disabled -Dlibarchive=disabled -Dlibavdevice=disabled -Dlcms2=disabled -Duchardet=disabled -Drubberband=disabled -Dzimg=disabled -Dvapoursynth=disabled -Djpeg=disabled -Dcaca=disabled -Dsixel=disabled -Dcplugins=disabled -Dcuda-hwaccel=disabled -Dcuda-interop=disabled"
configure = "PYTHONPATH=/usr/lib/python3.12/site-packages meson setup output --prefix=/usr --buildtype=release -Dprefer_static=true -Dbuild-date=false -Dcplayer=true -Dlibmpv=false -Dtests=false -Dmanpage-build=disabled -Dhtml-build=disabled -Dpdf-build=disabled -Dwayland=enabled -Degl=enabled -Degl-wayland=enabled -Dgl=enabled -Dplain-gl=disabled -Dalsa=enabled -Dzlib=enabled -Diconv=enabled -Dvector=enabled -Dx11=disabled -Dgl-x11=disabled -Degl-x11=disabled -Dxv=disabled -Dx11-clipboard=disabled -Dvdpau=disabled -Dvulkan=disabled -Dshaderc=disabled -Dspirv-cross=disabled -Dvaapi=disabled -Dvaapi-drm=disabled -Dvaapi-wayland=disabled -Dvaapi-x11=disabled -Ddrm=disabled -Dgbm=disabled -Ddmabuf-wayland=disabled -Dpipewire=disabled -Dpulse=disabled -Djack=disabled -Dsndio=disabled -Doss-audio=disabled -Dopenal=disabled -Dsdl2-audio=disabled -Dsdl2-video=disabled -Dsdl2-gamepad=disabled -Dlua=lua5.2 -Djavascript=disabled -Dcdda=disabled -Ddvdnav=disabled -Ddvbin=disabled -Dlibbluray=disabled -Dlibarchive=disabled -Dlibavdevice=disabled -Dlcms2=disabled -Duchardet=disabled -Drubberband=disabled -Dzimg=disabled -Dvapoursynth=disabled -Djpeg=disabled -Dcaca=disabled -Dsixel=disabled -Dcplugins=disabled -Dcuda-hwaccel=disabled -Dcuda-interop=disabled"
compile = "PYTHONPATH=/usr/lib/python3.12/site-packages ninja -C output"
install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson install -C output --no-rebuild"
@@ -108,7 +114,7 @@ install = "PYTHONPATH=/usr/lib/python3.12/site-packages DESTDIR=/out meson ins
[deps]
build = [
"meson", "samurai", "python3", "pkgconf", "linux-headers",
"ffmpeg", "libplacebo", "libass", "libunibreak",
"ffmpeg", "libplacebo", "libass", "libunibreak", "lua5.2",
"mesa", "libdrm", "wayland", "wayland-protocols", "libxkbcommon",
"alsa-lib",
"freetype", "fribidi", "harfbuzz", "fontconfig",