MarioDebian, mi devlog

Bitácora de un desarrollador newbie.

Control de __todas__ las tarjetas de sonido, presentando tmixer

ATENCIÓN: Artículo bastante técnico ("tas avisao")

Una de las cosas en la que más ímpetu (y horas) he dedicado en TCOS es el soporte multimedia. Pero las cosas avanzan que es una barbaridad y llevaba casi 2 años sin tocar esta parte tan importante.

Cuando nos ponemos delante de un terminal ligero debemos tener cierta facilidad para acceder a los canales de la tarjeta de sonido ya que no todo es 'Master' o 'PCM'.

PulseAudio es el milagro que hace que el sonido (que se origina en el servidor) se reproduzca transparentemente en el terminal por medio de la variable de entorno «PULSE_SERVER», pero PulseAudio no es perfecto ya que desde su panel de control sólo controlamos el volumen de un canal (¿PCM?) de la tarjeta de sonido no de todos.

En TCOS desde hace tiempo el control de la tarjeta de sonido era bueno pero algo (bastante) lento. A modo de histórico era es la forma en la que funciona tcos-volume-manager:

1.- Se manda la cookie de las X al servidor XMLRPC del terminal y si nos da acceso se lee el nombre de todos los canales (sólo el nombre) del mezclador.

(BREVE INCISO: El mezclador podía ser ALSA o en el peor de los casos OSS para lo cual se necesitaban dos aplicaciones amixer (ALSA) y aumix (OSS) y bastante librerías enlazadas que no se necesitaban como gpm o ncurses )

2.- Una vez que teníamos la lista de canales ibamos preguntando uno por uno el estado del volumen y del mute y construiamos los deslizadores y casillas de mute.

NUEVA FORMA

Se ha desarrollado juntando las fuentes de amixer y aumix (con bastante pegamento por cierto) una nueva aplicación que he bautizado como tmixer.

Esta aplicación hace autodetección para usar ALSA (si existe /proc/asound/card0/id) o usar OSS (si existe /dev/mixer y /dev/dsp no existiendo ALSA) y llama a cada una de las partes, para usar los mismos comandos (scontrols scontents sget sset) y mostrar una salida similar.

La parte ALSA se ha modificado para que se pueda enviar facilmente en una petición XML, comparando la original de amixer:

$ amixer sget Master
Simple mixer control 'Master',0
  Capabilities: pvolume pvolume-joined pswitch pswitch-joined
  Playback channels: Mono
  Limits: Playback 0 - 39
  Mono: Playback 35 [90%] [-6.00dB] [on]

 y ahora mi invento:

$ /usr/lib/tcos/tmixer sget Master
Master,volume|switch|,90,on

Se pierde algo de información por el camino (diferencia estereo en niveles o dB) pero ganamos mucha más claridad para luego leerlo desde un script o desde el mismo python.

En la parte OSS también hay varios cambios:

$ aumix -q
vol 90, 90
pcm 87, 87
mic 100, 100
pcm2 100, 100
igain 0, 0
dig1 0, 0

Con mi juguete:

$ TMIXER_FORCE=oss /usr/lib/tcos/tmixer sget Master
Master,volume|switch|,90,on

Como se ve la salida es muy similar a la de ALSA, de hecho es como debe de ser para que no importe si usamos OSS o ALSA para acceder al mezclador, en OSS he dado alguna cosa por sentada como por ejemplo que todos los canales tienen botón de mute, aunque realmente el mute consiste en bajar el volumen a 0, en ALSA si hay mute real. También se han renombrado a algo un poco más parecido a los nombres que se usan en ALSA.

Como se puede ver en el código fuente de tmixer,  se hacen los test y se llama al main de las otras dos aplicaciones (que aún se pueden compilar por separado). La variable de entorno TMIXER_FORCE sirve para no usar autodetección sino intentarlo directamente con la que se pida.

¿En qué mejora TCOS?

Para empezar y con las modificaciones de la API de sonido de XMLRPC, sólo se hace una petición donde se devuelven todos los canales con sus características:

sh /usr/lib/tcos/soundctl.sh --showcontents
Master,volume|switch|,90,on#Headphone,switch|,on#PCM,volume|,87,#Mic,volume|switch|,100,on#Mic Boost,volume|,0,#IEC958,volume|switch|,0,off#Beep,volume|switch|,100,on#Docking Mic,volume|switch|,0,off#Docking Mic Boost,volume|,0,#Internal Mic,volume|switch|,0,off#Internal Mic Boost,volume|,67,#Speaker,switch|,on#

Esto se parte según el caracter '#' y después cada canal se separa por comas lo que nos da un vector de diccionarios listo para usar en python:

TcosXmlRpc::***NOT CHANNEL*** c=['3D Control Sigmatel - Depth', 'volume|', '']
TcosXmlRpc::***NOT CHANNEL*** c=['Mix', '', '']
TcosXmlRpc::***NOT CHANNEL*** c=['Mix Mono', '', '']
TcosXmlRpc::***NOT CHANNEL*** c=['Sigmatel D']
TcosActions::populate_datatxt() channel=Master ismute=False volume level=100.0 ctype=volume|switch|
TcosActions::populate_datatxt() *** AUDIO CHANNEL HIDDEN*** channel={'mute': 'on', 'type': 'volume|switch|', 'name': 'Master Mono', 'level': '59'}
TcosActions::populate_datatxt() *** AUDIO CHANNEL HIDDEN*** channel={'mute': 'off', 'type': 'switch|', 'name': '3D Control - Switch', 'level': ''}
TcosActions::populate_datatxt() channel=PCM ismute=False volume level=45.0 ctype=volume|switch|
TcosActions::populate_datatxt() channel=Line ismute=True volume level=0.0 ctype=volume|switch|
TcosActions::populate_datatxt() channel=CD ismute=True volume level=0.0 ctype=volume|switch|
TcosActions::populate_datatxt() channel=Mic ismute=True volume level=0.0 ctype=volume|switch|
TcosActions::populate_datatxt() *** AUDIO CHANNEL HIDDEN*** channel={'mute': 'off', 'type': 'switch|', 'name': 'Mic Boost (+20dB)', 'level': ''}
TcosActions::populate_datatxt() *** AUDIO CHANNEL HIDDEN*** channel={'mute': 'off', 'type': 'volume|switch|', 'name': 'Video', 'level': '0'}
TcosActions::populate_datatxt() *** AUDIO CHANNEL HIDDEN*** channel={'mute': 'off', 'type': 'volume|switch|', 'name': 'Phone', 'level': '0'}
TcosActions::populate_datatxt() channel=PC Speaker ismute=False volume level=80.0 ctype=volume|switch|
TcosActions::populate_datatxt() channel=Aux ismute=True volume level=0.0 ctype=volume|switch|
TcosActions::populate_datatxt() *** AUDIO CHANNEL HIDDEN*** channel={'mute': 'on', 'type': 'switch|', 'name': 'External Amplifier', 'level': ''}
TcosActions::populate_datatxt() *** AUDIO CHANNEL HIDDEN*** channel={'mute': 'off', 'type': 'switch|', 'name': 'Sigmatel 4-Speaker Stereo', 'level': ''}
TcosActions::populate_datatxt() *** AUDIO CHANNEL HIDDEN*** channel={'mute': 'off', 'type': 'switch|', 'name': 'Sigmatel ADC 6dB Attenuate', 'level': ''}

 

Tanto la carga de tcos-volume-manager como de la información de sonido de TcosMonitor son casi instantáneas, los cambios en el código no son muchos pero la mejora es impresionante.

Resumiendo, «me lo he pasado pipa» de nuevo hackeando código de otros proyectos para beneficio propio, programar en C puro no es una delicia pero siempre aprendes muchas cosas modificando y personalizando código de otros y es que amixer y aumix tienen formas de programar muy distintas.

(De paso aunque el proyecto TCOS tiene más código para mantener no me preocupo de los bugs de Ubuntu + aumix)





HOWTO mejorar rendimiento del sistema de comentarios de 20minutos

Desde ya hace un tiempo muchas webs empiezan a abusar de javascript, no me parece mal pero con mis últimos problemas de rendimiento de la pareja Firefox+nVIDIA en ciertos casos es insufrible.

Como ya había dicho en otras ocasiones el selector de paginación de los comentarios abusa de efectos con jquery y mi equipo se bloquea entre 5 y 20 segundos sin responder, sé que la culpa no la tienen ellos pero es más sencillo modificar su sistema que modificar firefox o el driver de nvidia...

Ingredientes:

  • Iceweasel o en su defecto Firefox
  • Drivers nVIDIA (o cualquier otra gráfica con poco rendimiento)
  • Greasemonkey

Podemos instalarlo manualmente, creando un script con este contenido:

// ==UserScript==
// @name           Comentarios sin efectos 20minutos
// @namespace      http://www.20minutos.es/*
// @description    Desactivar efectos en comentarios de 20minutos
// @include        http://www.20minutos.es/*
// ==/UserScript==

var comentarios20m=document.createElement('script');
comentarios20m.setAttribute('src','http://idefix.eup.uva.es/20m_comentarios.js?20080726');
document.body.appendChild(comentarios20m);

O bien podemos ir a userscripts.org (donde he subido el script) e instalarlo.

El script es bastante simple, me he descargado el código de comments.js, y he desactivado la animación en la que aparecen los comentarios de la siguiente página, sin aplicar efectos alfa, el navegador ya no congela al equipo y puedo ver de nuevo los comentarios más allá del 10.

Es importante que el filtro se aplique a las URLS del tipo «http://www.20minutos.es/*»

Por lo visto hay más scripts para 20minutos.es, entre greasemonkey, stylish y addblock puedo hacer lo que me venga en gana con las webs que visito.





Prueba de detección de Spam

Me acaban de llegar estos dos correos:

 

 

Hasta aquí todo normal, no me cuenta mucho...

 

 

Una chica guapa sólo quiere algo de sonido !!!!

Esta vez voy a contestar, lo que no se como el filtro de spam no se lo ha comido porque cumple muchos de los requisitos.





Nueva versión de Pulseaudio y más

Hace ya casi 2 años que conozco el proyecto PulseAudio y reconozco que cada día me sorprende más.

Hoy se ha anunciado la nueva versión 0.9.11 con importantes mejoras. [anuncio en la lista]

  • Trae el prometido soporte 'glitch-free' que requiere versiones nuevas del kernel y ALSA (de paso le tira una cuchillada al kernel de Ubuntu indicando que no es el mejor para esta novedad ya que introduce demasiada latencia al llevar tanto driver privativo)
  • Se puede adjuntar a cada canal de audio un icono, ventana, texto... (antes sólo se indicaba el nombre del programa y el título de lo que sonaba si estaba disponible)
  • Modo espacial, esta es muy buena, combinado con libcanberra (libreria de eventos de sonido del mismo autor) permite que los eventos del escritorio se reproduzcan de manera tridimensional, es decir, si hacemos click en el menu superior-izquierdo sonaría más fuerte por el altavoz izquierdo.

Como ya dije, una killer app que revolucionará el sistema de sonido (sino lo ha hecho ya) del escritorio Linux. Usarlo en TCOS ha sido una muy buena decisión.

Otra cosa que he estado haciendo esta tarde es activar la última pieza hardware que no funcionaba en mi portatil ThinkPad R61, el lector de huellas: 147e:2016.

Por fin (ha costado) pero Daniel Drake (un verdadero crack) ha desarrollado un nuevo driver para fprint 147e:2016 (upeksonly) es un lector de huellas sin motor biométrico, solo escanea.

He mezclado los paquetes que hay en Debian experimental con las fuentes GIT del repositorio fprint y he compilado lo siguiente:

fprint-demo_20080724-1_i386.deb
libfprint0_0.1.0~pre1_i386.deb
libfprint-dev_0.1.0~pre1_i386.deb
libpam-fprint_0.2-4_i386.deb
libusb-1_0.9.2-1_i386.deb
libusb1-dev_0.9.2-1_i386.deb

Me he pensado un par de veces instalar libusb-1 ya que muchos paquetes dependen de libusb0 pero al renombrar el paquete a libusb-1 no entra en conflicto y ámbos conviven sin problemas.

Me ha costado entender como funciona el lector de huellas, parece que lee mejor si se pasa suavemente el dedo sin hacer fuerza, de hecho lo he activado en /etc/pam.d/common-auth aunque se me ha roto gksu (parece ser un bug conocido, no se ve), quizás lo active solo en la parte pam de GDM o en su/sudo.

Con esto y si nVIDIA se digna a solucionar los problemas de rendimiento de mi tarjeta, podré decir que el Thinkpad R61 ha sido la compra perfecta.





Módulos del kernel obsoletos en Ubuntu ¿por qué los quitan?

Los desarrolladores de Ubuntu que mantienen los paquetes del kernel hacen cosas bastante extrañas.

Uno de nuestros juguetes (eTC2300) necesita ciertos módulos del kernel que cualquier distribución lleva (Debian por ejemplo) en Ubuntu han decidido que es mejor quitarlo, pero lo más grave es que mandas un bug, dicen que lo arreglan y 3 versiones más tarde vuelven a quitarlo...

 

 

 

 

Ejemplo bastante tonto.

1.- En Debian unstable (kernel 2.6.25-2-686):

 # modprobe -l |grep -e ac97_codec -e sis5513
/lib/modules/2.6.25-2-686/kernel/sound/oss/ac97_codec.ko
/lib/modules/2.6.25-2-686/kernel/drivers/ide/pci/sis5513.ko

Bien, los dos módulos.

2.- En Ubuntu:

# uname -r
2.6.24-19-generic
# modprobe -l |grep -e ac97_codec -e sis5513

Ups!!! ¿ninguno?

Uno tiene su corazoncito y hace el trabajo que no hacen ellos:

 # apt-get install tcos-extra-modules-2.6.24-19-generic
Leyendo lista de paquetes... Hecho
Creando árbol de dependencias       
Leyendo la información de estado... Hecho
Se instalarán los siguientes paquetes NUEVOS:
  tcos-extra-modules-2.6.24-19-generic
0 actualizados, 1 se instalarán, 0 para eliminar y 5 no actualizados.
Necesito descargar 1637kB de archivos.
Se utilizarán 4411kB de espacio de disco adicional después de desempaquetar.
Des:1 http://192.168.0.3 max/main tcos-extra-modules-2.6.24-19-generic 0.26.max1 [1637kB]
Descargados 1637kB en 0s (5763kB/s)                       
Seleccionando el paquete tcos-extra-modules-2.6.24-19-generic previamente no seleccionado.
(Leyendo la base de datos ...  
281729 ficheros y directorios instalados actualmente.)
Desempaquetando tcos-extra-modules-2.6.24-19-generic (de .../tcos-extra-modules-2.6.24-19-generic_0.26.max1_i386.deb) ...
Configurando tcos-extra-modules-2.6.24-19-generic (0.26.max1) ...

Volvemos a mirar:

 root@max40:~# modprobe -l|grep ac97_codec
/lib/modules/2.6.24-19-generic/kernel/sound/oss/ac97_codec.ko
root@max40:~# modprobe -l|grep sis5513
/lib/modules/2.6.24-19-generic/kernel/drivers/ide/pci/sis5513.ko

¡¡¡¡ Ahora si !!!!

A todo esto he migrado todos los paquetes de TCOS desde experimental a main si quereis seguir usando los viejos hay que cambiar el repositorio...





Redes insociales

Hoy me he dado cuenta que no estoy sólo en mi cabezonería.

Si esto fuese una definición matemática se podría decir que existe al menos una persona que pasa olímpicamente de las redes sociales: yo, y parece que en barrapunto hay más.

Odio esas invitaciones donde te piden que te unas a un grupo (generalmente muy chorra) para compartir... ¡espera! ¿qué demonios comparte la gente en las redes sociales? ¿su tiempo? ¿su experiencia?

Las últimas que he recibido me ha dado por tomarme 5 minutos y buscar una direción de contacto de la web de origen, esta es una de mis respuestas:

In Spain the law is very simple, this mail is 
unsolicited and your company can be demanded.
>If I want to unsubscribe to this newsletter: >Don't want to receive email notifications? Adjust your message settings: > https://......................................................./ But, I DON'T WANT TO GET AN ACCOUNT IN THIS FUCKING SITE.
Please take actions on this.

.... (la negrita es lo que yo escribí)

No hace falta que diga que mi inglés no es muy bueno pero se me entiende perfectamente, la web abrió un ticket y bloqueó todos los mail que me mandaba semanalmente.

Así que ya lo sabeis, fanaticos de linkedin, tuenti, facebook, synaptia, meneame, ___paso___ de redes insociales.