Mostrando postagens com marcador JavaSound. Mostrar todas as postagens
Mostrando postagens com marcador JavaSound. Mostrar todas as postagens

domingo, 4 de setembro de 2011

Testando o Som com JavaSound

A API JavaSound é responsável pela execução de som no sistema operacional através de um dispositivo de som (placa de som) devidamente instalado. O JavaSound é uma API relativamente de baixo nível e não contém implementações de algoritmos sofisticados que ultrapassem a manipulação de sons em si, como um recurso automático para tocar arquivos de som comprimidos ou recursos para converter entre formatos de som com compressão de dados, filtragem de banda, análise de espectro, etc. Claro que tudo isso pode ser implementado e realizado usando o JavaSound, mas não vem pronto de cara.
O JavaSound possui basicamente duas formas de tratar os sons: via streams de áudio formatadas (chamada sampled) e via sinais MIDI. Cada qual possui seus próprios objetos e funcionalidades.


  • Testando o som com JavaSound

Para se testar o som, ou seja, para se verificar se o seu equipamento de som na máquina em que seu programa está rodando está realmente acessível ao Java, utilize estes comandos:

// Testando se é possível tocar MIDI
MidiSystem.getSequencer();

// Testando se é possível tocar áudio (wave)
AudioSystem.getMixer(null);

Note que foram testadas duas coisas: áudio e MIDI. Se tudo correr bem, estas linhas rodarão perfeitamente. Isto significa que seu sistema é capaz de prover ao menos um seqüenciador MIDI para receber sinais deste protocolo e ao menos um Mixer capaz de receber pelo menos uma entrada de áudio padrão. O argumento "null" na última linha significa que desejamos obter o Mixer padrão, e não Mixers específicos e alternativos, que podem ou não estar disponíveis, dependendo da placa de som.
Se a primeira linha falhar, você receberá um MidiUnavailableException. Caso a segunda falhe, você receberá um SecurityException, indicando que não é possível encontrar ou não se tem permissão de escrita para o dispositivo (isto pode acontecer, por exemplo, se já tiver algum outro processo escrevendo áudio para o Mixer padrão no momento em que você o testa).
Lembre-se de testar ambos os casos separadamente, para tratar cada problema de modo isolado.

Bom, espero ter ajudado. Qualquer coisa, COMENTEM!!

sexta-feira, 16 de julho de 2010

Alterando o Volume e Ganho com JavaSound

Não foi incomum que algumas pessoas me perguntassem como alterar o volume de um Clip ou uma Stream de Áudio usando a API de som do Java, o JavaSound. Vamos à explicação rápida!!

  • Qual a Diferença Entre Volume e Ganho??

Muitas bibliotecas de execução e manipulação de som (especialmente as mais baixo nível) não têm controle de volume, mas sim de ganho. Ganho é a medida em deciBels (dB) que regula a intensidade do som (mais detalhes aqui). Volume é uma medida adimensional e escalar de intensidade de som.
Tudo estaria resolvido se o ganho variasse da mesma maneira que o volume, já que os dois medem, na prática, a mesma coisa. Porém, o ganho é uma medida logarítmica, ou seja, ela varia muito mais numa extremidade e muito menos na outra, dados os cálculos em exponensiais. O volume é uma interpretação desta variação, porém de maneira escalar, de forma que varie sempre da mesma forma.


  • Implementando Mudaças de Volume em JavaSound

Primeiramente, é preciso se obter o controle de ganho (MASTER_GAIN). Depois, é preciso que se transforme o valor do volume (uma simples percentagem, ou seja, um número entre 0 e 1) em deciBels, usando a fórmula logarítmica abaixo. Com este valor em deciBel, basta agora atribuí-lo ao controle de ganho.

public void setVolume(int percent) {
FloatControl gainControl =
(FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
double gain = percent/100; // deve ser entre 0 (mudo) e 1 (mais forte)
float dB = (float) (Math.log(gain) / Math.log(10.0)*20.0);
gainControl.setValue(dB);
}

Cuidado: não tente obter o controle VOLUME, a não ser que você saiba o que está fazendo, já que ele não costuma existir em muitos sistemas de som, vindo a retornar uma referência nula.


  • Trocando Entre Mudo e Não-Mudo

A rigor, definir o valor como mudo significa simplesmente atribuir valor zero para o ganho. Mas, existe uma maneira mais simples para se trocar entre mudo e audível, mantendo o ganho inicial:

BooleanControl muteControl =
(BooleanControl) clip.getControl(BooleanControl.Type.MUTE);
muteControl.setValue(true); // Define como mudo
muteControl.setValue(false); // Retorna para audível

É isso aí, gente!! Agora ficou fácil!! Claro, é bom lembrar: COMENTEM!!!