Bom dia,
Como eu faço pra setar o volume de um arquivo de audio no código? Tem como usar a API JavaSound?
Como setar o volume de um som?
7 Respostas
O volume é controlado pelo hardware, e não por um arquivo. Você precisa usar jni para dizer para o hardware. Ou usar uma biblioteca que faça isso por você.
cara... tem um jeito de fazer isso sim!
eu fiz utilizando javasound, mas eu usei uma outra biblioteca também (tritonus) .. vou postar o código pra vc ver se entende
/**
* Ajusta volume
*
* @param vol - indice do volume variando entre 0 e 100
*
* @throws javax.sound.sampled.LineUnavailableException
*/
public void setVolume(int vol) throws LineUnavailableException
{
if (sourceDataLine.isOpen()) {
if (volume == null) {
//Controle de Volume
Port lineOut;
if (AudioSystem.isLineSupported(Port.Info.LINE_OUT)) {
lineOut = (Port) AudioSystem.getLine(Port.Info.LINE_OUT);
lineOut.open();
} else if (AudioSystem.isLineSupported(Port.Info.HEADPHONE)) {
lineOut = (Port) AudioSystem.getLine(Port.Info.HEADPHONE);
lineOut.open();
} else if (AudioSystem.isLineSupported(Port.Info.SPEAKER)) {
lineOut = (Port) AudioSystem.getLine(Port.Info.SPEAKER);
lineOut.open();
} else {
throw new LineUnavailableException(
"Nao foi possivel detectar um canal de saida");
}
volume = (FloatControl) lineOut.getControl(FloatControl.Type.VOLUME);
}
volume.setValue((float) (vol / 100.0));
}
}
veja se resolve.. qquer coisa posto o código completo, mas acho q ai vai ser mais dificil entender
cara... tem um jeito de fazer isso sim! eu fiz utilizando javasound, mas eu usei uma outra biblioteca também (tritonus) .. vou postar o código pra vc ver se entende/** * Ajusta volume * * @param vol - indice do volume variando entre 0 e 100 * * @throws javax.sound.sampled.LineUnavailableException */ public void setVolume(int vol) throws LineUnavailableException { if (sourceDataLine.isOpen()) { if (volume == null) { //Controle de Volume Port lineOut; if (AudioSystem.isLineSupported(Port.Info.LINE_OUT)) { lineOut = (Port) AudioSystem.getLine(Port.Info.LINE_OUT); lineOut.open(); } else if (AudioSystem.isLineSupported(Port.Info.HEADPHONE)) { lineOut = (Port) AudioSystem.getLine(Port.Info.HEADPHONE); lineOut.open(); } else if (AudioSystem.isLineSupported(Port.Info.SPEAKER)) { lineOut = (Port) AudioSystem.getLine(Port.Info.SPEAKER); lineOut.open(); } else { throw new LineUnavailableException( "Nao foi possivel detectar um canal de saida"); } volume = (FloatControl) lineOut.getControl(FloatControl.Type.VOLUME); } volume.setValue((float) (vol / 100.0)); } }veja se resolve.. qquer coisa posto o código completo, mas acho q ai vai ser mais dificil entender
O javasound é um mapeamento em cima do directsound(isso quando usando windows). O directsound pede ao hardware para aumentar o volume. A tritonus é uma implementação da api javasound em cima do alsa, para linux, e faz a mesma coisa que a outra.
tritonus tem pra windows também!
mas ai nesse trecho eu só utilizei javasound, pois jah tinha convertido a convertido a stream para uma q o javasound reconhecesse
tritonus tem pra windows também!mas ai nesse trecho eu só utilizei javasound, pois jah tinha convertido a convertido a stream para uma q o javasound reconhecesse
Sim, a diferença é que ela é opensource.
Muito obrigada por responder. Me ajudou bastante. Mas eu tenho uma pergunta idiota: O que écara... tem um jeito de fazer isso sim! eu fiz utilizando javasound, mas eu usei uma outra biblioteca também (tritonus) .. vou postar o código pra vc ver se entende/** * Ajusta volume * * @param vol - indice do volume variando entre 0 e 100 * * @throws javax.sound.sampled.LineUnavailableException */ public void setVolume(int vol) throws LineUnavailableException { if (sourceDataLine.isOpen()) { if (volume == null) { //Controle de Volume Port lineOut; if (AudioSystem.isLineSupported(Port.Info.LINE_OUT)) { lineOut = (Port) AudioSystem.getLine(Port.Info.LINE_OUT); lineOut.open(); } else if (AudioSystem.isLineSupported(Port.Info.HEADPHONE)) { lineOut = (Port) AudioSystem.getLine(Port.Info.HEADPHONE); lineOut.open(); } else if (AudioSystem.isLineSupported(Port.Info.SPEAKER)) { lineOut = (Port) AudioSystem.getLine(Port.Info.SPEAKER); lineOut.open(); } else { throw new LineUnavailableException( "Nao foi possivel detectar um canal de saida"); } volume = (FloatControl) lineOut.getControl(FloatControl.Type.VOLUME); } volume.setValue((float) (vol / 100.0)); } }veja se resolve.. qquer coisa posto o código completo, mas acho q ai vai ser mais dificil entender
O javasound é um mapeamento em cima do directsound(isso quando usando windows). O directsound pede ao hardware para aumentar o volume. A tritonus é uma implementação da api javasound em cima do alsa, para linux, e faz a mesma coisa que a outra.
sourceDataLine
Magina! Espero que funcione!
o source data line é o stream de saída de áudio:
private SourceDataLine sourceDataLine;
eu crio ele como:
//Gera saida de audio
DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class,
audioFormat);
sourceDataLine = (SourceDataLine) AudioSystem.getLine(dataLineInfo);
de uma olhada na classe de exemplo do site do tritonus (http://www.tritonus.org/plugins.html) pra ter uma idéia! foi nela que eu tive como base.
A classe está no zip do mp3 encoder! tritonus-mp3enc-2001-04-25.zip (51 kB)