Como setar o volume de um som?

7 respostas
M

Bom dia,
Como eu faço pra setar o volume de um arquivo de audio no código? Tem como usar a API JavaSound?

7 Respostas

J

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ê.

S

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

J
silviomoreto:
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.

http://www.tritonus.org/

S

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

J

silviomoreto:
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.

M
juliocbq:
silviomoreto:
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.

http://www.tritonus.org/

Muito obrigada por responder. Me ajudou bastante. Mas eu tenho uma pergunta idiota: O que é
sourceDataLine
? Como foi declarado?
S

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)

Criado 20 de maio de 2010
Ultima resposta 21 de mai. de 2010
Respostas 7
Participantes 3