quinta-feira, 21 de agosto de 2008

Como recuperar um Line

Existem duas maneiras:
  1. Diretamente do objeto AudioSystem
  2. A partir de um Mixer que você já obteve de um objeto AudioSystem
Recuperando um Line diretamente de um AudioSystem
Assumindo que ainda não obtemos um mixer e é preciso recuperar um line, podemos utilizar o método static Line getLine(Line.Info info) da classe AudioSystem. A classe Line.Info usada como argumento deste método não armazena informação textual para especificar uma linha desejada, ela armazena informações da classe de linha desejada.

Line.Info é uma classe abstrata, então utilizamos uma de suas sub-classes Port.Info ou DataLine.Info para obter uma linha. O trecho de código abaixo usa a classe DataLine.Info para obter e abrir um target data line:

TargetDataLine line;
DataLine.Info info = new DataLine.Info(TargetDataLine.class, format); // format is an AudioFormat object
if (!AudioSystem.isLineSupported(info)) {
// Handle the error.
}
// Obtain and open the line.
try {
line = (TargetDataLine) AudioSystem.getLine(info);
line.open(format);
} catch (LineUnavailableException ex) {
// Handle the error.
//...
}

Para portas, podemos utilizar instâncias estáticas de Port.Info:

if (AudioSystem.isLineSupported(Port.Info.MICROPHONE)) {
try {
line = (Port) AudioSystem.getLine(
Port.Info.MICROPHONE);
} catch(Exception e) { //... }
}

Lembre-se que um sourceLine é uma entrada para um mixer, especificamente, um objeto Port se o mixer representa um dispositivo de entrada de áudio e um objeto SourceDataLine ou Clip se o mixer representa um dispositivo de saída de áudio.

Podemos utilizar métodos de AudioSystem para conhecer mais sobre source e target lines de um tipo específico que é suportado por qualquer mixer instalado.

static Line.Info[] getSourceLineInfo(Line.Info info)
static Line.Info[] getTargetLineInfo(Line.Info info)

Note que o array retornado por cada um desses métodos indicam tipos únicos de linha, não necessariamente todas as linhas. Por exemplo, se duas linhas de um mixer ou duas linhas de diferentes mixers possuem objetos Line.Info idênticos, as duas linhas serão representadas por apenas um Line.Info no array.

A interface Mixer inclui variações nos métodos de acesso aos source e target lines do AudioSystem. Além dos métodos que requerem um argumento do tipo Line.Info, o Mixer também inclui métodos que não possuem argumentos:

Line.Info[] getSourceLineInfo()
Line.Info[] getTargetLineInfo()

Estes métodos retornam arrays de objetos Line.Info de um mixer específico.

Os métodos apresentados para recuperar Lines são aplicados também na recuperação de portas (Ports). Podemos abrir um porta invocando o método open da interface Line. A abertura de uma porta significa permitir que o som entre ou saia por esta porta. De maneira análoga, podemos fechar portas.

No geral, é recomendado que o programa não abra/feche portas a não ser pelo desejo explícito do usuário. Deve-se respeitar as configurações que o usuário ou o Sistema Operacional já tenha selecionado. (Imagine um usuário que se encontra em um ambiente extremamente silencioso executando um programa que abre a porta dos alto-falantes sem sua devida autorização)

Nenhum comentário: