1
INSTITUTO MEXICANO DE ACÚSTICA
Y
ESCUELA SUPERIOR DE INGENIERÍA MECÁNICA Y
ELÉCTRICA UNIDAD ZACATENCO, DEL INSTITUTO
POLITÉCNICO NACIONAL
1er COLOQUIO NACIONAL DE ACÚSTICA
11 DE NOVIEMBRE DE 2013
A1 PROGRAMACIÓN DE AUDIO EN MAC OSX
Maximino Peña Guerrero, José de Jesús Negrete Redondo
Academia de Acústica, Escuela Superior Mecánica y Eléctrica, Instituto Politécnico Nacional, Av. Instituto Politécnico Nacional S/N, Zacatenco D. F., México. Tel: 5 729 6000 - 54652 y 54616. mail: [email protected]
2
A1 PROGRAMACIÓN DE AUDIO EN MAC OSX
Maximino Peña Guerrero, José de Jesús Negrete Redondo
Academia de Acústica, Escuela Superior Mecánica y Eléctrica, Instituto Politécnico Nacional, Av. Instituto Politécnico Nacional S/N, Zacatenco D. F., México. Tel: 5 729 6000 - 54652 y 54616. mail: [email protected]
RESUMEN
Uno de los problemas para el desarrollador de aplicaciones de audio con el sistema operativo Mac OSX es la programación en bajo nivel del hardware de sonido. En este documento se presenta una breve descripción del sistema de sonido de una computadora iMac Apple utilizando un programa sencillo para generar un tono utilizando las funciones de bibliotaca de OpenAL y la interfase de bajo nivel CoreAudio.
Palabras clave: Xcode, CoreAudio, OpenAL.
ABSTRACT
One of the problems for developers of audio applications with Mac OSX operating system is the low level programming sound hardware. This paper presents a brief description of the sound system of Apple iMac computer using a simple program to generate a tone using the OpenAL functions library and CoreAudio low-level interface.
Keywords: Xcode, CoreAudio, OpenAL.
Introducción
En un laboratorio de acústica es necesario contar con instrumentos de medición automáticos que faciliten la investigacion del procesamiento de señales acústicas. Debido al tipo de investigación que se realiza, normalmente dichos instrumentos son hechos a la medida y constantemente tienen que adaptarse a condiciones especiales de trabajo, por lo que dichos instrumentos tienen que ser independientes de un fabricante comercial para ahorrar tiempo, dinero y esfuerzo. Para lograrlo es necesario la disposición del código fuente del software utilizado en el instrumento. Esto permite realizar cambios y adaptaciones de inmediato, sin pedir permiso al fabricante. Estas son unas de las muchas razones de que el investigador tenga que construir sus propias herramientas de medición desarrollando su propio software.
Actualmente un sistema hardware de sonido de un sistema computacional no es, como antes, un sistema separado como la antigua tarjeta de sonido tipo SoundBlaster. Tanto el sonido analógico (WAV) como la síntesis de sonido musical MIDI (Musical Instrument Digital Interface) eran colocados en una tarjeta de hardware que se tenía que comprar por separado. Además, estos dispositivos eran programados en un ambiente de usuario único: no era posible programar de manera paralela en una computadora personal.
Muchas de las aplicaciones de audio profesionales requieren que los sistemas de desarrollo permitan la programación multitarea para implementar por ejemplo las consolas de audio multicanal. Hoy en día la mayoria de los sistemas computacionales son multiusuario y multitarea. Sin embargo los mecanismos de sincronía entre procesos hace que la programación de aplicaciones de audio sea más compleja, pues en los sistemas multitarea existen muchos procesos compartiendo un sólo procesador. Cada proceso maneja la información de audio digital casi de manera simultanea como por ejemplo el sonido provenientes de una orquesta con varios instrumentos tocando en forma paralela.
Desde el punto de vista software, una consola de audio virtual es un proceso que puede tener uno o más mas subprocesos. Cada proceso y subproceso puede tener uno o más hilos (threads), los cuales se encuentran asociados con las partes de la consola virtual, como pueden ser los canales individuales de antrada de audio, controles de tono, controles de volúmen, efectos especiales, medidores analógicos y digitales, entre muchos otros dispositivos virtuales.
Un hilo es un segmento de programa en ejecución residente en memoria operativa, el cual comparte rebanadas de tiempo de ejecución de una unidad central de proceso (CPU). Normalmente la CPU ejecuta
3
cientos si no miles de pequeños hilos de una manera secuancial, pero multiplexados en el tiempo. Este mecanismo de los sistemas operativos permite que los procesos den la impresión que se ejecutan de manera paralela.
Dicho lo anterior, en este trabajo se utilizaran las siguientes herramientas de software para implementar un sencillo generador de tono de audio escrito en lenguaje C para presentar una mayor claridad del funcionamiento de de estos sistemas de audio. Aunque aquí sólo se presentan funciones para el procesamiento de audio analógico, vale decir que el sistema de sonido de iMac proporciona herramientas de software análogas para el procesamiento de datos musicales MIDI. Las herramientas que aquí se utilizan son: Xcode, CoreAudio, y OpenAL.
Figura 1: Desarrollo de senAL3.c en Xcode.
Descripción y desarrollo de la aplicación
Xcode es una plataforma integral de desarrollo de software para aplicaciones con el sistema operativo MacOSX de Apple. Xcode contiene varios compiladores de la familia C: C, C++, Objetive-C, Java, entre otros [Sct10][Sim02]. Aunque el desarrollador de aplicaciones se enfrenta con el aprendizaje de las características de las versiones de software actualizadas, muchas de estas son amigables y facilitan su utilización. Sin embargo, la programación en bajo nivel requiere comprender algunos mecanismos de la programación de sistemas como son protocolos de enlace dinámico, protocolos de variables de ambiente, dependencia de funciones de biblioteca, y particularmente las funciones relacionadas con el procesamiento de señales de audio. La Figura 1 muestra el entorno de desarrollo de un programa de aplicación en Xcode.
Por otra parte, CoreAudio es una interfase de software de bajo nivel que permite desarrollar aplicaciones de entrada y salida de audio digital en el sistema operativo Mac OSX de Apple. Funciona con base en la técnica de flujo de datos (streams) la cual permite procesar en paralelo varios canales de audio para implementar una consola mezcladora con varios sonidos independientes. Sin embargo, las
4
funciones desarrolladas con CoreAudio no son transportables a otros sistemas operativos: solamente corren en sistamas desarrollados por Apple [Chr12].
Para resolver este problema de transportabilidad utilizamos otro sistema de funciones más general: OpenAL [Crt07]. OpenAL es un sistema abierto que contiene un conjunto de funciones que permite programar la entrada y salida de audio sobre varios sistema operativos: UNIX, Mac OSX, Linux, MS-Windows, entre otros.
Figura 2: Objetos de OpenAL.
Como se muestra en la Figura 2, OpenAL trabaja con tres objetos básicos. (1) una fuente (source), (2) un oyente (listener), y (3) una zona de memoria (buffer). Una fuente contiene apuntadores a una o varias zonas de memoria, si como la velocidad, orientación, e intensidad del sonido a procesar. Un oyente contiene parámetros necesarios para la reproducción del sonido como son velocidad, posición, orientación, y volúmen. Es posible definir varios oyentes, pero solo uno de ellos se encuentra activado. Una zona de memoria contiene muestras de audio de 8 o 16 bits (monofónico o estéreo) en formato PCM [Agu10], y se encuentra vinculada al hardware del sistema de sonido de la computadora.
A continuación se hace una breve descripción del programa que se muestra en el Listado 1 el cual que genera un tono de 1000 Hz. en el sistema de audio de una computadora iMac de Apple. Este programa es una versión modificada del código proporcionado por Adamson Chris y Kevin Avila, pero sin manejo de archivos [Chr12]. Sin embargo, utilizando el mecanismo de tuberias de UNIX los datos generados se pueden guardar en un archivo con el fin de crear una gráfica como se muestra en la Figura 3.
5
Figura 3: Sonido de un tono de 1000 Hz.
Para generar un tono de 1000 Hz se utiliza la seccion de código que se encuentra entre las líneas 35 y 41 donde se utiliza el vector de memoria vecData, el cual contiene una colección de datos x0, x1, x2, …,
x_n, para n = N-1 donde N=20000. Para genarar un dato se utiliza la función sin(x) cuyo resultado se
multiplica por 32267 para tener datos de audio de 16 bits con rango de -32267 a + 32267 (0000H a FFFFH). El periodo que corresponde a 1000 Hz en 11025 muestras es un incremento de 0.09 seg. Antes que nada, la función alcOpenDevice() (línea 43) abre uno de los dispositivos de audio. Un dispositivo es una abstracción representativa del sistema de hardware de sonido de una iMac. Despues, la función alcCreateContext() (línea 46) crea un contexto (context) para vincular a un un oyente (listen) y la fuente de sonido (source) a efecto de proporcionar algunas características del audio. Ahora,
alcMakeContextCurrent() (línea 49) crea un contexto específico del sonido que se va a reproducir.
Enseguida la función alGenBuffers() (línea 53), genera y prepara uno de los buffers internos al sistema de hardware de sonido en el cual se depositarán los datos que contiene el vector vecData. Ahora, la función alBufferData() línea (56) realiza una copia de los datos de vecData y los coloca en iuno de los buffers creados por alGenBuffers, ademas coloca también los parámetros de la reproducción digital como bits/dato, la cantidad de datos del buffer, y la frecuencia de muestreo.
Una vez que se han establecido las características del buffer, la función alGenSources() (línea 62) crea una fuente de sonido (pueden ser más). Para esteblecer algunas propiedades extras del sonido, como por ejemplo punto flotante, ganacia, y máxima ganancia, se utiliza la función alSourcef() (línea 65), Para realizar la reproducción de varios buffers de manera secuencial, alSourceQueueBuffers() coloca uno junto a otro cada buffer (aquí sólo se utiliza un único buffer) en una fuente (línea 68). De esta forma, la función alSourcePlayv() realiza la reproducción del sonido (línea 71) durante un segundo proporcionado por la función sleep() (línea 74).
Finalmente la función alSourceStop() (línea 76) detiene el sonido y se restablece el sistema de audio de la computadora; se borran las fuentes con alDeleteSources() (línea 77) y los buffers con
alDeleteBuffers() (línea 78), se destruye el contexto con alcDestroyContext() (línea 79), y por último se
cierra el dispositivo con alcCloseDevice() (línea 80) y se libera la memoria que ocupa el vector vecData. El código que se encuentra entre las líneas 89 y 93 corresponde a la función derror(), la cual recoje y selecciona uno de los posibles errores que se puedan producir durante la ejecución del programa.
7
Conclusiones
Programar el sistema de audio de una computadora iMac con el sistema operativo Mac OSX, es laborioso y complejo si no se utilizan las aplicaciones proporcionadas por este sistema. Sin embargo, una vez que se ha familiarizado con el sistema de bajo nivel, la programación de drivers es sencilla si se tiene una cierta experiencia con los sistemas UNIX. Se ha presentado un programa de ejemplo muy sencillo (senoAL3.c), el cual sirve de base para modificarlo y adaptarlo a instrumentos de medición desarrollados con software. Por ejemplo generadores de funciones de onda, generadores de ruido, medidores de impedancia. Cabe mencionar que sólo se requiere un convertidor de voltaje a sonido conectado a la entrada de audio (micrófono) para adaptar las variables físicas externas que se deseen cuantificar. Por facilidad se utilizaron algunas funciones de OpenGL vinculadas con el sistema CoreAudio de la máquina.
Referencias
[Agu10] Agusti Manuel, “Práctica de procesamiento de audio: Audio posicional con OpenAL”, Curso 2009/2010, Universidad Politécnica de Valencia.
[Chr12] Chris Adamson, Kevin Avila, Learning Core Audio: A Hands-On Guide to Audio Programming
for Mac and iOS, Addison Wesley, 2012, 307 pgs.
[Crt07] Creative, OpenAL Programer s Guide: OpenAL Versions 1.0 and 1.1, Creative Technology Limited, 2007.
[Sct10] Scott Stevenson, Cocoa and Objetive-C: Up and Running, O Reilly, 2010, 396 pgs. [Sim02] Simson Garfinkel, Michael K. Maboney, Cocoa Applications: A step-by-Step Guide, O Reilly, 2002, 618 pgs.
Agradecimientos
Agradecemos el apoyo proporcionado por las autoridades del Instituto Politécnico Nacional: la Academia de Acústica, la Comisión de Operación y Fomento de Actividades Académicas, la Sección de Estudios de Posgrado e Investigación.