2009-06-04 12 views

risposta

34

Se si sta utilizzando l'API Java Sound, è possibile impostare il volume con il controllo MASTER_GAIN.

import javax.sound.sampled.*; 

AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(
    new File("some_file.wav")); 
Clip clip = AudioSystem.getClip(); 
clip.open(audioInputStream); 
FloatControl gainControl = 
    (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); 
gainControl.setValue(-10.0f); // Reduce volume by 10 decibels. 
clip.start(); 
+0

Grazie! Ci proverò. Per quello che vale, sto osservando il problema da entrambe le estremità. Ho un cliente di iPhone che ha ingerito lo stream audio e, semplicemente usando un'API diversa sul client, ottengo un volume diverso. Quindi non penso che il mio problema sia interamente lato server. – Cliff

+4

@ markusk Se la domanda è specifica per il volume, è necessario utilizzare 'FloatControl.Type.VOLUME'? –

+3

Solo per il record: il controllo del volume ha generato un'eccezione (non supportata) mentre il controllo del guadagno principale non lo era (su un 'SourceDataLine'). – RedGreasel

9

È possibile regolare il volume utilizzando un GainControl, provare qualcosa di simile dopo aver aperto la linea

FloatControl volume= (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN); 
1
public final class VolumeControl 
{ 

    private VolumeControl(){} 

    private static LinkedList<Line> speakers = new LinkedList<Line>(); 

    private final static void findSpeakers() 
    { 
     Mixer.Info[] mixers = AudioSystem.getMixerInfo(); 

     for (Mixer.Info mixerInfo : mixers) 
     { 
      if(!mixerInfo.getName().equals("Java Sound Audio Engine")) continue; 

      Mixer mixer   = AudioSystem.getMixer(mixerInfo); 
      Line.Info[] lines = mixer.getSourceLineInfo(); 

      for (Line.Info info : lines) 
      { 

       try 
       { 
        Line line = mixer.getLine(info); 
        speakers.add(line); 

       } 
       catch (LineUnavailableException e)  { e.printStackTrace();                     } 
       catch (IllegalArgumentException iaEx) {                          } 
      } 
     } 
    } 

    static 
    { 
     findSpeakers(); 
    } 

    public static void setVolume(float level) 
    { 
     System.out.println("setting volume to "+level); 
     for(Line line : speakers) 
     { 
      try 
      { 
       line.open(); 
       FloatControl control = (FloatControl)line.getControl(FloatControl.Type.MASTER_GAIN); 
       control.setValue(limit(control,level)); 
      } 
      catch (LineUnavailableException e) { continue; } 
      catch(java.lang.IllegalArgumentException e) { continue; } 



     } 
    } 

    private static float limit(FloatControl control,float level) 
    { return Math.min(control.getMaximum(), Math.max(control.getMinimum(), level)); } 

} 
+0

La regolazione del volume degli altoparlanti e su una traccia specifica sono due cose completamente diverse. –

Problemi correlati