Cristiano Trindade Segunda-feira, 26 de agosto de 2002

Trabalhando Multimídia com Java - A classe AudioClip()

O áudio é uma ferramenta bastante interessantesem produtos multimídia. Muitas vezes, um clipe de áudio é capaz de incrementar sua aplicação e chamar a atenção do usuário. Java aceita a execução de arquivos de som no formato .au, da Sun. Para executar um arquivo .au em um applet, poderemos utilizar um dos métodos play() da classe Applet:

void play(URL url);
void play(URL url, String name);

A diferença é que no primeiro método temos que especificar o path do arquivo de áudio. A instrução a seguir executa o arquivo de áudio exemplo.au no site www.sun.com:

play new( URL(“http://www.sun.com/exemplo.au”));

Já no segundo método não precisamos especificar o caminho completo do arquivo, o que é interessante se você precisar fazer alterações na estrutura de diretórios do servidor. Usaremos o método getCodeBase() para executar uma ação idêntica àquela executada no primeiro exemplo:

play(getCodeBase(), “exemplo.au”);

Essa instrução executa o arquivo de áudio exemplo.au que encontra-se no mesmo diretório que o applet Java.
O JDK oferece suporte embutido para que se possa trabalhar com arquivos de áudio. Porém, se por alguma razão o JDK que você está utilizando não possui este suporte, você poderá usar um dos muitos utilitários que fazem a conversão de outros formatos de som para o formato .au da Sun Microsystems. Um destes utilitários é o SOund eXchange (SOX), desenvolvido por Lance Norskog. Este pequeno utilitário permitirá que convertamos, por exemplo, o arquivo exemplo.wav para exemplo.au da seguinte forma:

c:> sox exemplo.wav exemplo.au <ENTER>

Poderemos encontra o utilitário SOX em muitos endereços Web. Atualmente, ele pode ser encontrado, por exemplo, em http://www.spies.com/sox. Se este endereço não existir mais quando você for acessá-lo, uma simples busca pelas palavras “sox” junto com “java” em algum motor de busca na Web será suficiente para encontrá-lo.

Bem, acabamos de ver como funciona a execução de um clipe de áudio. Mas você pode estar pensando: por que é necessário criar um objeto AudioClip para executar um arquivo de áudio se podíamos utilizar o método play() da classe Applet ? A resposta é simples: a classe AudioClip é que fornecerá o método stop() para que você possa parar a execução do arquivo.

Como padrão, quando você iniciar a execução de um clipe de áudio, Java executará o clipe até chegar ao final. Mas poderão haver ocasiões em que você queira deter a execução em algum ponto. Nesses casos, será necessário usar o método stop(). O código a seguir, por exemplo, mosta como parar um clipe de áudio quando o usuário muda de página:

public class ex_audio extends Applet
{
// outras instruções do applet
public void stop()
{
if (audioclip_longo ! = null) // assegura-se de que a referência do clipe é válida
{
audioclip_longo.stop(); // para a execução do clipe
}
}
}

Como você pode observar, o código anterior verifica antes a referência do objeto audioclip_longo para certificar-se de que ele não é nulo, o que significa que a variável contém um objeto AudioClip. Em seguida, é utlizado o método stop() para terminar a execução do clipe de áudio.

Existem ocasiões, porém, que precisamos executar um clipe de áudio repetidamente. Para estes casos, será utilizado o método loop() da classe AudioClip. O método loop() executa o mesmo arquivo de áudio até que você chame o método stop() ou até que seja iniciado um novo clipe. O exemplo a seguir (ex_loop.java) executa o arquivo de áudio especificado pelo parâmetro HTML CLIPEAUDIO. Para executar o clipe uma única vez, clicamos no botão Play; para executar repetidamente, clicamos no botão Loop; para parar a execução, clicamos no botão Parar.

import java.applet.*;
import java.awt.*;
public class ex_loop extends Applet
{
AudioClip aclip;
public void init()
{
aclip = getAudioClip(getCodeBase(), getParameter(“CLIPEAUDIO”));
add(new Button (“Play”));
add(new Button (“Parar”)):
add(new Button (“Loop”));
}
public void stop()
{
if (aclip ! = null)
aclip.stop();
}
public boolean action(Event evt, Object arg)
{
if (evt.target instanceof Button)
{
if (arg.equals(“Play”))
aclip.play();
else if (arg.equals(“Parar”))
aclip.stop();
else if (arg.equals(“Loop”))
aclip.loop();
return true;
}
return false;
}
}

Agora, para tentar reunir o que vimos em relação à clipes de áudio, vamos criar um applet (tudo.java) que possuirá dez arquivos de áudio e dez botões (numerados de 1 a 8). sempre que o usuário clicar em um destes botões numerados, será executado o arquivo de áudio correspondente:

import java.applet.*;
import java.awt.*;
public class tudo extends Applet
{
String items[] = {“1”,”2",”3",”4",”5",”6",”7",”8'”};
public void init()
{
setLayout (new GridLayout(1, 8));
for (int i = 0; i < items.length; i++)
add (new Button(items[i]));
}
public boolean action(Event evt, Object arg)
{
if (evt.target instanceof Button)
{
if (arg.equals(“C”))
play (getCodeBase(), “1.au”);
else if (arg.equals(“D”))
play (getCodeBase(), “2.au”);
else if (arg.equals(“E”))
play (getCodeBase(), “3.au”);
else if (arg.equals(“F”))
play (getCodeBase(), “4.au”);
else if (arg.equals(“G”))
play (getCodeBase(), “5.au”);
else if (arg.equals(“A”))
play (getCodeBase(), “6.au”);
else if (arg.equals(“B”))
play (getCodeBase(), “7.au”);
else if (arg.equals(“C’”))
play (getCodeBase(), “8.au”);
return true; // event processed
}
return false; // events not processed
}
}

Na próxima semana, continuaremos nosso estudo sobre multimídia. Até lá!