Archivo por meses: diciembre 2018

Juegos ALSA sobre PulseAudio

Hace unas semanas descubrí la saga de juegos de Deponia, y la verdad es que estoy enganchado. Además, hay versiones nativas para Linux en GOG games, y a un precio asequible, lo que es una maravilla.

Las tres primeras aventuras funcionaron en mi sistema Debian sin el más mínimo problema, pero la cuarta, sin embargo, sufría de un problema raro: al lanzarla se quedaba como colgada, con la pantalla en negro, y no aparecía el menú principal hasta que pulsaba ESC. Además, lo hacía sin sonido, lo que era muy sospechoso.

Al lanzarlo desde un terminal vi que salían una serie de errores referentes a que no podía abrir el dispositivo PCM de ALSA (el subsistema de sonido de Linux). Enseguida sospeché que el problema podía venir por tener PulseAudio gestionando todo el tema del audio. En concreto, el cuelgue del principio parecía que era porque intentaba mostrar un vídeo de presentación, pero se quedaba esperando a que la tarjeta de sonido estuviese lista (y por eso al pulsar ESC se desbloqueaba: porque cancelaba el vídeo y pasaba al siguiente paso).

La solución consistió en redireccionar el sonido PCM de los programas ALSA a través de PulseAudio. Para ello sólo tuve que crear un fichero llamado .asoundrc en mi directorio personal con este contenido:

pcm.!default {
type pulse
}

Gracias a él, ahora todos los programas que, por defecto, trabajan con ALSA, ahora enviarán su salida a través de PulseAudio. Esto es posible gracias al diseño de ALSA: mientras que en la vieja arquitectura OSS el programador abría el dispositivo de sonido directamente y utilizaba llamadas IOCTL para configurarlo, y llamadas read y write para capturar y emitir sonido, en ALSA se anima a utilizar únicamente una serie de bibliotecas de más alto nivel. Lo interesante es que esto permite que el programa se desentienda por completo de a donde se envía el sonido, pues eso lo decide el propio usuario mediante la configuración. Así, por defecto iría directamente al hardware, pero el sistema de plugins de ALSA permite enviarlo a cualquier otro sitio al poder definir tarjetas de sonido virtuales. Así, tenemos dos módulos especialmente interesantes que son pcm_pulse y pcm_jack, que permiten integrar de manera transparente cualquier aplicación ALSA con los demonios de sonido PulseAudio y JACK. El primero es justo el que utilizamos en el fichero de configuración de arriba.

Java vs. systemd

Pues parece que ya podemos añadir otra historia más a los problemas de systemd. Ahora resulta que un cambio inocente en sus políticas ha hecho que un bug serio en Java salga a la superficie: prácticamente todas las aplicaciones Java fallan en Debian SID por culpa de esto, dando un error de este estilo:

library initialization failed - unable to allocate file descriptor table - out of memoryAborted

En mi caso fueron MPlabX y SimplicityStudio las que me dieron problemas, pero parece que ocurre con muchas más aplicaciones Java, y en concreto Android Studio también lo da.

Según una entrada en github, el problema se debe a que Java toma el número máximo de descriptores que se pueden abrir y reserva un bloque de memoria lo suficientemente largo como para albergarlos a todos. Hasta ahora ese número era 4096, con lo que con 16 Kbytes tenía de sobra. Pero tras un cambio en Systemd (pedido, además, por la gente del kernel) dicho número se ha ampliado a 262144 (256 * 1024). En principio esto no debería ser problema (sigue siendo una cifra razonable, y con un mega puede almacenarlo todo), pero, por una serie de desafortunadas circunstancias, Java no recibe esa cifra en Debian SID, sino que, si no hay configurado ningún límite, recibe INFINITY (los detalles se pueden seguir en este hilo de github). El resultado, obviamente, es un error de memoria insuficiente.

Mientras el error no se corrige, es posible parchearlo temporalmente añadiendo esta línea a /etc/security/limits.conf:

    *   hard   nofile   4096

No olvidarse del asterisco al principio. Y en caso de que 4096 no sean suficientes descriptores, se puede aumentar. Un valor máximo razonable es 1048576. Una vez modificado es necesario cerrar la sesión y volver a entrar (o bien reiniciar) para que los cambios surtan efecto.

Por supuesto es bueno revisar de vez en cuando si ya han corregido el bug, y eliminar esa línea cuando ya no sea necesaria.

Cargando mis cascos (y 2)

Hace ya dos años modifiqué unos cascos BlueTooth para que sólo con colgarlos de un soporte se cargase su batería. Aunque funcionó bien, en este tiempo hice algunos cambios extra, y creo que ha llegado la hora de publicarlos.

Para empezar, en el artículo anterior comentaba que había utilizado malla de desoldar para hacer los contactos. Aunque funcionó bien durante unos cuantos meses, lo cierto es que el pegamento de la cinta de doble cara fue permeando a través de la malla de cobre y acabó por dar problemas de conductividad, por eso al final opté por comprar cinta adhesiva de cobre y crear con ella los nuevos contactos (pulsa sobre las imágenes para verlas en grande).

Lo primero fue pegar la cinta por la parte de arriba de la diadema, como se ve en la foto, dejando pegada sólo aproximadamente un tercio. Luego, con unas tijeras, procedí a dar cortes en la parte que quedaba colgando, cada dos centímetros aproximadamente. De esta manera pude doblarlo sobre el lateral y garantizar que quedase bien pegado y, a la vez, con continuidad eléctrica sobre toda la superficie. Este fue el resultado:

El último paso en los cascos fue soldar los cables que vienen del puente de diodos a los dos contactos (véase la entrada anterior donde explico las modificaciones a nivel eléctrico), y proteger todo con un par de vueltas de cinta aislante en cada lado.

El siguiente punto era el soporte. En el artículo anterior mostré la chapuza que hice con una alcayata y lengüetas sacadas de una pila de petaca, pero llevaba tiempo con ganas de hacer algo más serio, así que decidí darle uso a las impresoras 3D de A Industriosa para construir un soporte en condiciones. Para ello, primero hice el diseño con FreeCAD, que tiene esta pinta y cuyo fichero podéis descargar desde este enlace.

Una vez impresa llegó la cuestión de como hacer las lengüetas para los contactos. Para ello decidí hacerlas de plástico flexible, sacado de una tapa de tornillos, y luego recubrirlas con cinta adhesiva de cobre. En la foto siguiente se ven las dos lengüetas.

Tras cortarlas, las pegué en el soporte utilizando cola térmica, quedando como en la siguiente foto.

El siguiente paso fue recubrirlas con la cinta adhesiva de cobre y soldar los cables del transformador de alimentación. Sin embargo, aunque quedó bien, es cierto que habría sido mejor pegar primero la cinta adhesiva y soldar los cables, y sólo después pegar las lengüetas con la cola térmica, pues cuando apliqué el soldador me encontré con que se me despegaban.

Tras hacer todo esto, éste es el resultado del soporte, listo para acoger en su seno a los cascos. Vemos que está fijado a la balda con un tornillo, y que los cables de alimentación están soldados en la parte superior, dejando toda la superficie de las lengüetas para que haga contacto con los electrodos de los cascos.

Y este es el resultado final: un soporte con mucha mejor presencia y calidad, y que me garantiza que mis cascos siempre estarán adecuadamente cargados cada vez que los necesite.