Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Escrito por:
Carlos Prades del Valle.
Versin 1.0.0.
Enero de 2001.
Sonido en Java.
Autor
Resumen de la modificacin.
Fecha
1.0.0.
CPV
19122000
1.0.1.
CPV
31012001
email: cprades@eresmas.com
Sitio web: http://cprades.eresmas.com/
Resumen.
Este documento es una gua para el programador que quiere empezar a utilizar el
sonido que le proporciona el sistema multimedia que utiliza.
Palabras relacionadas.
Java, programacin, sonido, procesado, voz, seal, api.
Pag 2 de 19
Sonido en Java.
ndice.
1INTRODUCCIN.___________________________________________________________7
2CLASES PRINCIPALES._____________________________________________________8
2.1FORMATOS DE AUDIO.________________________________________________________8
2.2ARQUITECTURA DE LOS SISTEMAS.________________________________________________9
2.3MIXERS__________________________________________________________________9
2.4LINES__________________________________________________________________10
2.5CLASES DATALINE_________________________________________________________11
3ACCESO A LOS COMPONENTES DEL SISTEMA_____________________________12
3.1OBTENCIN DE LOS RECURSOS._________________________________________________13
4REPRODUCCIN DE SONIDO.______________________________________________15
4.1REPRODUCCIN DEL SONIDO MEDIANTE SOURCEDATALINE_____________________________15
4.2SINCRONIZACIN DE LNEAS.__________________________________________________17
4.3CAPTURA DE SONIDO._______________________________________________________17
4.4PROCESADO DE LA SEAL.____________________________________________________18
Pag 3 de 19
Sonido en Java.
Glosario.
API: Application Program Interface. Es la interfaz proporcionada por un sistema al
programador para poder acceder a los servicios de ese sistema.
Array: Es un grupo de datos de un tipo determinado puestos uno a continuacin de
otro. Coincide con los tipos de datos array de Java.
Java: Lenguaje de programacin orientado a objetos.
JDK: Java Development Kit. Es el entorno de desarrollo para Java proporcionado por
Sun.
MIDI: Estndar para el almacenamiento y transporte de msica para o desde un
sintetizador.
Package: Paquete. Agrupamiento especificado por el programador de clases con
caractersticas comunes.
Sun: Empresa norteamericana que desarroll el lenguaje de programacin Java.
Thread: Hilo de ejecucin.
Pag 4 de 19
Sonido en Java.
Pag 5 de 19
Sonido en Java.
Pag 6 de 19
Sonido en Java.
1 Introduccin.
El API de Java dedicada al sonido es la llamada Java Sound API proporcionado
ya con el entorno de desarrollo de Sun. Este API se compone de 4 packages (paquetes):
javax.sound.sampled.
javax.sound.sampled.spi.
javax.sound.midi.
javax.sound.midi.spi.
El primero, javax.sound.sampled, contiene las clases necesarias para el manejo
del sonido muestreado, esto incluye la captura, la mezcla y la reproduccin de audio,
proporcionando adems algn control y efecto sobre el sonido as como interfaces para
el almacenamiento, ser el package estudiado en este documento. El package
javax.sound.midi proporciona las interfaces de sntesis, secuenciamiento y transporte
MIDI. Los packages javax.sound.sampled.spi y javax.sound.midi.spi proporcionan una
interfaz para los desarrolladores de servicios basados en las interfaces anteriores.
Pag 7 de 19
Sonido en Java.
2 Clases principales.
Como paso previo es necesario contar cmo funcionan algunos de los objetos de
javax.sound.sampled necesarios para comprender despus cada uno de los
procedimientos a seguir.
Pag 8 de 19
Sonido en Java.
2.3 Mixers
Como se puede ver los Mixer (mezcladores) son unos casos particulares de los
Lines. Estos Mixer son dispositivos hardware o software por lo que pueden ser
proporcionados por el sistema. Los objetos Mixer contienen un objeto de la clase
Mixer.Info con informacin del tipo de Mixer. Los mtodos de la clase Mixer
son los siguientes:
Line getLine(Line.Info); /* Obtiene, si exixte, un Line del tipo
indicado en el parmetro. */
int getMaxLines(Line.Info);
/* Indica el numero de lineas que se
pueden tener de un tipo dado.*/
Mixer.Info getMixerInfo();
/* Obtiene el objeto que indica el
tipo de Mixer que es. */
Line.Info [] getSourceLineInfo(); /* Obtiene array con informacin de
los SourceLines disponibles. */
Line.Info [] getSourceLineInfo(Line.Info); /* Array con informacin de
los SourceLines de un tipo. */
Line [] getSourceLines(); /* Obtiene array con los SouceLines
disponibles. */
Line.Info [] getTargetLineInfo(); /* Obtiene array con informacin de
los TargetLines disponibles. */
Line.Info [] getTargetLineInfo(Line.Info); /* Array con informacin de
los TargetLines de un tipo. */
Line [] getTargetLines(); /* Obtiene array con los TargetLines
disponibles. */
boolean isLineSupported(Line.Info); /* Devuelve true si tiene un Line
del tipo especificado. */
boolean isSincronizationSupported( Line[], boolean); /* Devuelve true
Pag 9 de 19
Sonido en Java.
2.4 Lines
Un Line (lnea) es una conexin por la que pasa la seal desde o hacia un
Mixer. Los tipos de Lines son los siguientes:
Port: Puertos de entrada o salida del sistema como el micrfono, la salida de
lnea, el altavoz, etc.
DataLine: Lneas de datos, pueden ser Clips que almacenan un sonido
completo, SourceDataLine que proporcionan un buffer de entrada a un Mixer y
TargetDataLine que proporcionan el buffer de salida de un Mixer.
Mixer: Mezclador que representa un dispositivo hardware o software del
sistema.
Los Lines proporcionan cierta funcionalidad al sistema por medio de objetos
Control que incluyan capaces de variar alguna caracterstica del sonido (ganancia,
reverberacin, etc.), del estado (el Status) que puede ser abierto y cerrado (Open y
Closed) de tal manera que si el Line est cerrado no consume recursos del sistema y
por ltimo por medio de los objetos Event (eventos) lanzados que permiten
comunicacin y sincronizacin con otros objetos.
Como ya veremos los objetos Line tienen un objeto (de clase Line.Info) de
informacin sobre ellos. Como ocurre con la mayor parte de los atributos y mtodos, el
objeto de informacin se redefine en los objetos que lo heredan siendo de tipo
Mixer.Info, Port.Info, etc. en cada uno de los casos.
Los mtodos de la clase Line son:
void addLineListener( LineListener); /* Especifica un objeto al que se le
envan los Event generados. */
void close();
/* Cierra (pasa a Status Closed) el objeto Line.
*/
Pag 10 de 19
Sonido en Java.
Control getControl( Control.Type);
tipo
especificado. */
Control [] getControls();
/* Devuelve un array con los objetos
Control disponibles. */
Line.Info getLineInfo();
/* Devuelve informacin del objeto. */
boolean isControlSupported(Control.Type); /* Devuelve true si soporta el
tipo de Control especificado. */
boolena isOpen(); /* Devuelve true si el Status es Open. */
void open();
/* Abre (pasa a Status Open) el objeto Line.*/
void removeLineListener(LineListener); /* Deja de enviar objetos Event al
LineListener especificado. */
Pag 11 de 19
Sonido en Java.
Pag 12 de 19
Sonido en Java.
Para poder acceder a los distintos objetos del sistema se crean las clases de
informacin, cuyas instancias proporcionan informacin sobre las distintas interfaces.
Estas interfaces son Line.Info y las clases derivadas Mixer.Info, Port.Info y
DataLine.Info.
en
el
constructor
la
clase
del
objeto
del
que
informa
Pag 13 de 19
Sonido en Java.
lneas
bsicas
Port.Info.HEADPHONE,
Pag 14 de 19
Sonido en Java.
4 Reproduccin de sonido.
Antes de entrar en la reproduccin de sonido por medio de objetos
SourceDataLine hay que hacer mencin as los objetos Clip. Un objeto de esta clase
est pensado para almacenar el audio grabado de principio a fin, es la mejor solucin
cuando se conoce de antemano el tamao de la seal a almacenar y es nica, as como
cuando se desea repetir un sonido varias veces (por ejemplo en un lazo). Los ejemplo
tpico de utilizacin es la reproduccin de sonido de ficheros no demasiado grandes, en
este caso se lee el contenido del fichero en un clip y luego se reproduce, el control es
ms sencillo y los recursos utilizados son menores. Sin embargo en los casos donde el
audio es continuo o en ficheros de un gran tamao es preferible usar los otros tipos de
DataLine (SourceDataLine o TargetDataLine) con el fin de no ocupar
demasiada memoria del sistema. En nuestro caso nos centraremos en este segundo caso
ya que nuestra fin es la adquisicin tratamiento y reproduccin de la seal sindonos de
poca utilidad la clase Clip.
Pag 15 de 19
Sonido en Java.
partir de donde, en el array b, se debe empezar a leer datos y length indica cuantos
datos deben ser ledos. Esta funcin devuelve el nmero de datos ledos. Es muy
importante tener en cuenta que todos estos datos vienen en bytes y no en nmero de
muestras.
Cuando sale la primera muestra del objeto Mixer (un instante despus de salir
del SourceDataLine) se produce un evento de tipo START que puede ser recogido
por el proceso a la salida del Mixer.
El mtodo write() vuelve slo cuando ha escrito todos los datos en el buffer.
Si se intenta escribir ms datos de los que caben en el buffer el mtodo se bloquea hasta
terminar. Para evitarlo con el mtodo available() se obtiene, en bytes, el tamao
de la parte que queda libre en el buffer.
Con el mtodo drain() el programa se bloquea hasta reproducir el sonido,
vaciando el buffer antes de volver. Con el mtodo stop() se para la reproduccin, sin
limpiar el buffer, y con start() contina dnde se qued, para evitar la reproduccin
de un segmento antiguo al llamar a start() se puede utilizar el mtodo flush()
que limpia el buffer. Todos estos mtodos de SourceDataLine son heredados de
DataLine.
Cuando deja de salir seal del Mixer procedente del SourceDataLine se
genera un evento de tipo STOP.
El mtodo isActive() devuelve true si estn saliendo datos (entre los
eventos de tipo START y STOP), el mtodo isRunning() devuelve true si la lnea
est abierta. Adems Line genera eventos de tipo OPEN y CLOSE al llamarse a las
funciones correspondientes. Todos los eventos pertenecen a la clase LineEvent y les
debe de atender un objeto que implemente la interfaz LineListener. Para
registrarlos se llama a la funcin de la clase Line, addLineListener(), pasando
como parmetro el objeto LineListener.
La
interfaz
LineListener
slo
define
un
mtodo:
void
Pag 16 de 19
Sonido en Java.
objeto
Mixer,
isSinchronizationSupported()(
Line
[],
boolean) al que se le pasa un array con los objetos a sincronizar y un boolean que
indica si la sincronizacin es mantenida (valor true) o no (valor false), como es
lgico devuelve true si se pueden sincronizar y false si no.
Pag 17 de 19
Sonido en Java.
el array de bytes donde dejar los datos, el segundo es el offset a partir del que se
dejan los datos en el array y el tercero indica el nmero de datos a leer.
Para limpiar el buffer se utiliza el mtodo drain().
Esta clase genera los mismos eventos que los que hemos visto en el caso anterior
LineEvent, con los mismos valores como LineEvent.Type (START, STOP,
OPEN y CLOSE).
Cada clase hija de Control tiene un una clase Type incluida que define
constantes para cada tipo de control. Para obtener un Control de un Line se puede
usar el mtodo de ese Line getControl(Control.Type) que devuelve la
instancia del Control, si queremos ver que controles soporta cada Line podemos
llamar al mtodo de Line getControls() que devuelve un array con todos los
objetos Control soportados. Para saber que tipo de Control es el mtodo del
Control getType() devuelve un objeto de clase Control.Type y con el
mtodo de Object getClass() se puede saber la clase derivada a la que pertenece
el objeto. Para cambiar los parmetros de un objeto Control se utiliza el mtodo
setValue() el tipo del parmetro de este mtodo depende de la clase del mtodo.
Pag 18 de 19
Sonido en Java.
Bibliografa.
[1]
Java Sound API Programmers Guide [ver 1.0]. Sun Microsystems, Inc.
19992000.
[2]
Java
Sound
1.0
API
Specification.
Sun
Microsystems,
Inc.
http://java.sun.com/j2se/1.3/docs/guide/sound/.
[3]
Java
Sound
Home
Page.
Diciembre
2000.
http://java.sun.com/products/javamedia/sound/index.html.
Pag 19 de 19