# pcaudiolib 1.3 — la capa de salida de audio de espeak-ng. Sin esto, la distro no SUENA. # # ══ POR QUÉ ES SU PROPIA RECETA Y NO UN DETALLE DE espeak-ng ═══════════════════════════════════ # `espeak-ng` la busca con `find_library(PCAUDIO_LIB pcaudio)` — **opcional, sin REQUIRED** # (`cmake/deps.cmake:3`). O sea que espeak-ng construye sin ella y sella tranquilamente… y entonces # sintetiza a un `.wav` y **no puede reproducir**: `espeak-ng "hola"` no hace ruido. # # Eso es exactamente la figura que este catálogo persigue —sellado, con contenido, reproducible y # sin la función que promete— y en el frente de accesibilidad es peor que en otros: la promesa es # «la máquina habla», no «la máquina genera un fichero de audio». # # ⇒ Entra como dep de espeak-ng, cuyo guardián comprueba que el binario resultante SÍ la enlace. # # ══ LOS BACKENDS ═══════════════════════════════════════════════════════════════════════════════ # `configure.ac` ofrece PulseAudio (`libpulse-simple`) y ALSA, los dos con `--with-*` y default # `yes`. Los dos están en el corpus, así que se dejan los dos encendidos: **el servidor de audio de # esta distro es PipeWire**, que habla el protocolo de PulseAudio por su capa de compatibilidad, y # ALSA queda como camino directo si alguien corre sin servidor (un instalador, una consola). # # `--without-sndio`: no está en el corpus y es el camino de OpenBSD. name = "pcaudiolib" version = "1.3" license = "GPL-3.0-or-later" [source] tarball = "https://github.com/espeak-ng/pcaudiolib/releases/download/1.3/pcaudiolib-1.3.tar.gz" sha256 = "e8bd15f460ea171ccd0769ea432e188532a7fb27fa73ec2d526088a082abaaad" [build] compiler = "zig-cc" target = "x86_64-linux-musl" link = "static" flags = [] [build.phases] # ⚠ **SE USA EL TARBALL DEL RELEASE, NO EL ARCHIVE DEL TAG — y eso evita dos recetas.** # El archive de un tag (`/archive/refs/tags/…`) trae sólo `configure.ac`, así que haría falta # `autogen.sh` y con él **autoconf y automake, que NO están en el corpus** (el censo los tiene como # hueco; `libtool` y `m4` sí están). El asset del release (`/releases/download/…`) es un `make dist` # con `configure` y `Makefile.in` ya generados — 384 KB contra 36 KB del tag, y ahí está la # diferencia. Comprobado antes de cambiarlo: el tarball trae `pcaudiolib-1.3/configure`. # # La lección general: **cuando un proyecto autotools no construye por falta de autoconf, mirar si # publica un tarball de release antes de escribir el autoconf.** No siempre existe, pero cuando # existe ahorra una campaña. configure = './configure --build=$CBUILD --host=$CHOST --prefix=/usr --disable-shared --enable-static --with-pic --without-sndio' compile = 'make -j"$(nproc)"' # ⚠ **ESTE GUARDIÁN ESTUVO MAL DOS VECES EN LA MISMA PASADA, y las dos eran verificables antes.** # # 1. **Exigía un `pcaudiolib.pc` que upstream NO PUBLICA** (no hay `.pc.in` en el árbol, medido). Y # además espeak-ng no lo necesita: la busca con `find_library(PCAUDIO_LIB pcaudio)` y # `find_path(PCAUDIO_INC "pcaudiolib/audio.h")` — **nunca con pkg-config** (`cmake/deps.cmake:3`). # O sea que inventé un requisito, y el guardián rechazó un build correcto. Es la tercera vez hoy # que un guardián mío es demasiado estricto; el patrón de los tres es el mismo: afirmar un # requisito sin haberlo leído en la fuente del consumidor. # 2. **Buscaba `have_pulseaudio=yes` en `config.log` y ese texto no existe.** Lo que sí escribe el # configure es `HAVE_PULSE_SIMPLE_H` y `HAVE_ALSA_ASOUNDLIB_H` — y los DOS estaban ahí, o sea que # los backends se detectaron y el control los habría denunciado como ausentes. # # ⇒ Ahora comprueba exactamente lo que el consumidor busca —la `.a` y la cabecera en la ruta que # `find_path` espera— y los backends por el marcador que el configure escribe de verdad. install = ''' set -e make DESTDIR=/out install [ -f /out/usr/lib/libpcaudio.a ] || { echo "pcaudiolib: no quedó la .a — NO sello" >&2; exit 1; } # La RUTA de la cabecera importa: espeak-ng hace `find_path(PCAUDIO_INC "pcaudiolib/audio.h")`, así # que tiene que estar en ese subdirectorio y no suelta en /usr/include. [ -f /out/usr/include/pcaudiolib/audio.h ] || { echo "pcaudiolib: falta include/pcaudiolib/audio.h — es la ruta exacta que el find_path de espeak-ng busca" >&2; exit 1; } back="" grep -q 'HAVE_PULSE_SIMPLE_H' config.log 2>/dev/null && back="$back pulse" grep -q 'HAVE_ALSA_ASOUNDLIB_H' config.log 2>/dev/null && back="$back alsa" if [ -z "$back" ]; then echo "pcaudiolib: CERO backends de audio — compilaría y no reproduciría nada" >&2 grep -oE 'HAVE_[A-Z_]*(PULSE|ALSA|SNDIO)[A-Z_]*' config.log 2>/dev/null | sort -u | head -5 >&2 exit 1 fi echo "pcaudiolib: .a + include/pcaudiolib/audio.h · backends:$back" ''' [deps] build = ["libtool", "make", "pkgconf", "pulseaudio", "alsa-lib"]