## Ejecutar Sonidos en Applets

En el paquete java.applet, la clase Applet y el interface AudiClip proporcionan un inteface básico para ejecutar sonidos. Actualmente, el API de Java soporta un sólo formato de sonido: 8 bit, 8000 hz, un canal, en ficheros "au" de Sun. Se pueden crear estos ficheros en una estación Sun utilizando la aplicación audiotool. Se puede convertir ficheros desde otros formatos de sonido utilizando un programa de conversión de formatos de sonidos.

### Métodos Relacionados con el Sonido

> Abajo tienes los métodos para Applets relacionados con el sonido. El formato de dos argumentos de cada método toma una dirección URL base (generalmente devuelta por getDocumentBase() o getbBase()) y la posición del fichero de sonido relativa a la URL base. Se debería utilizar la dirección base para sonidos que están integrados en el applet. La dirección del documento base se utiliza generalmente para sonidos especificados por el usuario del applet a través de los parámetros del applet.
> getAudioClip(URL), getAudioClip(URL, String)
>   Devuelven un objeto que implementa el interface AudioClip.
> play(URL), play(URL, String)
>   Ejecutan el AudiClip correspondiente a la URL especificada.

> El Interface AudioClip define los siguientes métodos:

> loop()
>   Empieza la ejecución del Clip repetidamente.
> play()
>   Ejecuta el clip una vez.
> stop()
>   Para el Clip. Trabaja con el método loop() y el método play().

### Un Ejemplo

> Aquí tiene un applet llamado soundExample que ilustra unas pocas cosas sobre el sonido. Observa que, para propósitos de instrucciones, el applet añade 10 segundos al tiempo de carga de cada sonido. Si el fichero de sónido fuera mayor o la conexión del usuairo fuera más lenta que la nuestra, este retardo podría ser realista.

> El applet SoundExample proporciona una arquitectura para la carga y ejecución de múltiples sonidos en un applet. Por esta razón, es más complejo de lo necesario. Exencialmente, los códigos de carga y ejecución del sonido se parecen a esto:

>     AudioClip onceClip, loopClip;
>     onceClip = applet.getAudioClip(getcodeBase(), "bark.au");
>     loopClip = applet.getAudioClip(getcodeBase(), "train.au");
>     onceClip.play();     //Lo ejecuta una vez..
>     loopClip.loop();     //Empieza el bucle de sonido.
>     loopClip.stop();     //Para el bucle de sonido.

Como no hay nada más molesto que un applet que continue haciendo ruido después de haber abandonado la página, el applet SoundExample para de ejecutar el bucle de sonido continuo cuando el usuario abandona la página y empieza de nuevo cuando el usuario vuelve a ella. Hace esto mediante la implementación de sus métodos stop() y start() de la siguiente forma:

    public void stop() {
        //Si el sonido de una vez fuera largo, lo parariamos aquí.
        //looping es un ejemplar de una variable booleana que esta inicializada a false.
        //Se pone a true cuando se pulsa el botón de "Start sound loop" y se pone a false
        //cuando se pulsa los botones de "Stop sound loop" o "Reload sounds".
        if (looping) {
            loopClip.stop();    //Para el bucle de sonido.
        }
    }

    public void start() {
        if (looping) {
            loopClip.loop();    //Reinicia el bucle de sonido.
        }
    }

El applet SoundExample construye tres clases:

- Una subclase de Applet, SoundExample, que controla la ejecución del applet.

- Una subclase de Hashtable, SoundList, que contiene los AudioClips. Esto es demasiado para este aplet, pero si usted escribiera una applet que utilizará muchos ficheros de sonidos, una clase como esta le sería muy útil.

- Una subclase de Thread, SoundLoader, cada ejemplar de la cual carga un AudioClip en segundo plano. Durante la inicialización del applet, éste precarga cada sonido mediante la creacción de un SoundLoader para él.

La carga de sonidos en threads de segundo plano (con SoundLoader) aumenta el rendimiento percibido mediante la reducción del tiempo que el usuario tiene que esperar para poder interactuar con el applet. Se hace así para reducir el tiempo gastado por el método init(). Si se llama simplemente a getAudiClip() en el método init() del applet, tardará bastante antes de que getAudioClip retorne, lo que significa que el applet no puede realizar otras sentencias de su método init(), y que no se llamará al método start() del applet. (Para este applet en particular, un retardo en la llamada al método start() no tiene importancia).

Otra ventaja de la carga de sonidos utilizando threads en segundo plano es que permite que el usuario responda apropiada (e inmediatamente) a una entrada del usuario, que normalemente cuasaría la ejecución de un sonido, incluso si el sonido no se ha cargado todavía. Por ejemplo, si simplemente se utiliza el método play() de Applet, la primera vez que el usuario haga algo para que se ejecute un sonido particular, el dibujo del applet y el manejo de eventos quedaran congelados mientras se carga el sonido. En vez de esto, éste applet detecta que el sonido no ha sido cargado todavía y responde de forma apropiada.

Este ejemplo se explica con más detalle en Threads en Applets: Ejemplos.

Ozito