2009-06-04 7 views

Répondre

34

Si vous utilisez l'API Java Sound, vous pouvez régler le volume avec le contrôle 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

Thanx! Je vais essayer ça. Pour ce que ça vaut, je regarde le problème des deux côtés. J'ai un client iPhone ingérant le flux audio et juste en utilisant une API différente sur le client, je reçois un volume différent. Donc je ne pense pas que mon problème soit entièrement côté serveur. – Cliff

+4

@ markusk Si la question est spécifique au volume, 'FloatControl.Type.VOLUME' devrait-il être utilisé? –

+3

Juste pour l'enregistrement: le contrôle de volume a jeté une exception (non supporté) alors que le contrôle de gain principal n'a pas (sur un 'SourceDataLine'). – RedGreasel

9

Vous pouvez régler le volume à l'aide d'un gaincontrol, essayez quelque chose comme ça après avoir ouvert la ligne

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

Le réglage du volume sur les enceintes et sur une piste spécifique est deux choses totalement différentes. –

Questions connexes