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

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

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/

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

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?
silviomoreto

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