2009-03-15 25 views
5

Ich verwende JLayer, um einen Eingangsstrom von MP3-Daten aus dem Internet abzuspielen. Wie ändere ich die Lautstärke der Ausgabe?Ändern der Lautstärke in Java bei Verwendung von JLayer

ich diesen Code bin mit ihm spielen:

URL u = new URL(s); 
URLConnection conn = u.openConnection(); 
conn.setConnectTimeout(Searcher.timeoutms); 
conn.setReadTimeout(Searcher.timeoutms); 

bitstream = new Bitstream(conn.getInputStream()/*new FileInputStream(quick_file)*/); 
System.out.println(bitstream); 
decoder = new Decoder(); 
decoder.setEqualizer(equalizer); 
audio = FactoryRegistry.systemRegistry().createAudioDevice(); 
audio.open(decoder); 
for(int i = quick_positions[0]; i > 0; i--){ 
    Header h = bitstream.readFrame(); 
    if (h == null){ 
     return; 
    } 
bitstream.closeFrame(); 
+0

siehe meine Antwort auf http://stackoverflow.com/questions/3134167/adjusting-volume-using-jlayer/17570819#17570819 – pstanton

Antwort

0

versuchen, alle Bänder des Equalizers für die Lautstärke Sie zu bekommen versuchen. Vielleicht können Sie dafür auch eine EQFunction verwenden?

public class ChangeVolumeFunction extends EQFunction { 
    public double volume = 1.0; 
    public void setVolume(double volume) { this.volume = volume; } 
    public float getBand(int band) { return (float) (Math.log(volume)/Math.log(2) * 6.0); } 
} 
+0

Sie vergaßen die "Klasse" nach der Öffentlichkeit. nitpicky :) Ich versuche es gerade jetzt. – Penchant

+0

scheint nicht zu funktionieren :( – Penchant

7

Sie können dies eine inakzeptable Hack, betrachten, aber es funktionierte in einem MP3-Spieler, den ich geschrieben habe. Es erfordert einen kleinen Code-Zusatz zu einer der JLayer-Klassen.

Fügen Sie javazoom.jl.player.JavaSoundAudioDevice die folgende Methode hinzu.

public void setLineGain(float gain) 
{ 
    if (source != null) 
    { 
     FloatControl volControl = (FloatControl) source.getControl(FloatControl.Type.MASTER_GAIN); 
     float newGain = Math.min(Math.max(gain, volControl.getMinimum()), volControl.getMaximum()); 

     volControl.setValue(newGain); 
    } 
} 

Diese neue Methode ermöglicht es Ihnen, die Lautstärke mit Code wie diesem zu ändern.

if (audio instanceof JavaSoundAudioDevice) 
{ 
    JavaSoundAudioDevice jsAudio = (JavaSoundAudioDevice) audio; 
    jsAudio.setLineGain(yourGainGoesHere); 
} 
4

Weitere (nicht-JLayer) Art und Weise der PC-Lautstärke einzustellen ist Klassen im javax.sound.sampled Paket von Sun/Oracle zu verwenden.

Auf meinem Computer war SPEAKER das einzige unterstützte Ausgabeziel.

import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.FloatControl; 
import javax.sound.sampled.Line.Info; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.Port; 

public class SoundVolumeDemo 
{ 

    public static void main(String[] args) 
{   
    Info source = Port.Info.SPEAKER; 
    //  source = Port.Info.LINE_OUT; 
    //  source = Port.Info.HEADPHONE; 

     if (AudioSystem.isLineSupported(source)) 
     { 
      try 
      { 
       Port outline = (Port) AudioSystem.getLine(source); 
       outline.open();     
       FloatControl volumeControl = (FloatControl) outline.getControl(FloatControl.Type.VOLUME);     
       System.out.println("  volume: " + volumeControl.getValue()); 
       float v = 0.33F; 
       volumeControl.setValue(v); 
       System.out.println(" new volume: " + volumeControl.getValue()); 
       v = 0.73F; 
       volumeControl.setValue(v); 
       System.out.println("newest volume: " + volumeControl.getValue()); 
      } 
      catch (LineUnavailableException ex) 
      { 
       System.err.println("source not supported"); 
       ex.printStackTrace(); 
      }    
     } 
    } 

} 

Dies ist, wie ich in dieser App Lautstärkeregler am Erreichen:

http://onebeartoe.com/media-players/randomjuke/filesystem/java-web-start/swing/index.jsp

Bitte beachten Sie, dass ich nur mit ihm arbeiten auf MS Windows OS-Maschinen hatte Erfahrung haben.

+0

Das hat bei mir funktioniert. Nett. –