Skip to content

Cambiando librerías

16 junio 2010

DISCLAIMER: Ateniéndome a las definiciones del DRAE me reservo el derecho de traducir «library» como «librería», ya que decir “la biblioteca gosu” no me gusta xD
—–

Últimamente he estado teniendo problemas rarísimos con PortAudio, “a ratos” le daba por fallar y me soltaba mensajes extraños que no tenían nada que ver con lo que yo hiciera, sino con los intríngulis de la librería. Lo mismo dejaba de capturar sonido, como si desconectara el micrófono, que me daba un error en tiempo de ejecución.

Me he llevado unos cuantos días bastante duros intentando probar otras APIs de sonido más conocidas y fiables, y al final el resultado ha sido favorable. Puse una pregunta en StackOverflow y, pese a que solo tuvo una respuesta, me sirvió para guiarme.

Empecé leyendo esta guía, que curiosamente dice que PortAudio no es una buena API, cosa que he comprobado empíricamente. Decidí empezar por GStreamer, ya que teóricamente abstraía todo el bajo nivel y tal, pero la verdad es que después de usarlo prefiero pelearme cara a cara con flujos, samples y búffers, que tener que aprenderme la sarta de abstracciones que los de GStreamer se han inventado, y que hacen difíciles las tareas más sencillas. Además, GStreamer está hecho en C y su wrapper en C++ está muy verde, tanto en documentación como en partes sin terminar. De hecho, uno de los módulos que me interesaba usar solo funcionaría en C, y lo peor de todo es que eso no está escrito en ningún lado, sino que me lo dijo uno de los desarrolladores en la lista de correo. Pa jartarse de reir.

Seguidamente, pensé en programar directamente usando la API de alguno de los sistemas de sonido de Linux, y me decanté por PulseAudio. Afortunadamente, PulseAudio consta de dos APIs, una api simple con un funcionamiento muy básico y sencillo, y una api asíncrona con todo el potencial. Como mi única necesidad era la de abrir un flujo de datos del micrófono, la api simple me sirvió perfectamente. Es bastante mejor que PortAudio, el rendimiento es mayor, y me gusta más, aunque he tenido que crear manualmente un hilo en el que se ejecute el procesamiento, cuando antes con PortAudio éste se generaba solo. Pero bueno, así le he echado el ojo a Boost::Thread.

FFTin’

Por otro lado, la librería que estaba usando para realizar la transformada de Fourier era un módulo suelto de Audacity con las funcionalidades mínimas y con un rendimiento más bien normalito, que ejecutado constantemente acababa provocando un retraso bastante considerable entre la ejecución de la nota y el resultado en pantalla.

De nuevo a la búsqueda de librerías, partía con ventaja, ya que conocía los mayores contendientes. En un lado del ring, FFTW, un monstruo de más de cien mil líneas, optimizado hasta la última línea, pero con una curva de aprendizaje bastante chunga, además de que tendría que añadir yet another dependency al proyecto, y van…

Como adversario, con unas 500 líneas de código, una optimización normalilla y gran facilidad de uso, kissfft. Con dos líneas de código (sí, dos) ya estaba sacando FFT’s de números reales, caso por cierto especialmente optimizado en esta librería, analizando paralelamente cada mitad del vector de entrada.

Al final, la decisión fue fácil: para mis necesidades, kissfft va que chuta, aunque si en el futuro veo de nuevo problemas de rendimiento, consideraré usar fftw.

One Comment leave one →
  1. alberto valdivia permalink
    3 julio 2011 9:56

    Buenos días. He leído tu comentario respecto a PortAudio y veo que te manejas bastante bien. Yo simplemente quiero crear un archivo con el audio procedente del micrófono. Parece bastante sencillo ya que la propia librería trae un Test que hace esto mismo, pero me ocurre que al parecer, no me está reconociendo el audio del micrófono. ¿Se te ocurre por qué puede ser? Gracias de antemano.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: