2010-11-18 10 views
3

Wie erhält man den Master-Datenträger in Java? Ich möchte ein Programm erstellen, das (NOT CHANGE) diesen Wert (wahrscheinlich auf einem JProgressBar oder etwas Ähnlichem) als Prozentsatz der maximalen Einstellung anzeigt. Ich möchte vielleicht auch den aktuellen Schallpegel als Prozentsatz des höchstmöglichen Schallpegels anzeigen, aber dies wird nicht benötigt.Ermitteln der System-Audiopegel in Java

+1

Als Randbemerkung, keine Fortschrittsbalken für diese Verwendung. Der Master-Lautstärkepegel ist kein Maß für den Fortschritt und einige Betriebssysteme zeichnen einen Animationsbalken, der für die Messung des Schallpegels nicht geeignet ist. – cdhowie

+0

Als was ist es dann gemessen? – Supuhstar

+0

Ein Fortschrittsbalken ist ein Balken, der den Fortschritt einer langlebigen Aufgabe anzeigt (z. B. Kopieren von Dateien). –

Antwort

3

Ich bin mir nicht ganz sicher, aber Sie könnten sich die (Java Media Framework - JMF) ansehen. Sie können den Sound über diese Bibliothek steuern, also würde ich annehmen, dass Sie auch Details darüber erfahren können. Es könnte nur der Geräuschpegel der Anwendung sein, also könnte ich mich irren.

+0

scheint wie eine Bibliothek für visuelle Effekte (d. H. Audio/Video-Bearbeitung) – Supuhstar

+0

Nein, ich habe es zuvor verwendet, um einen Audio-Streamer/Player zu schreiben. –

+0

Ich bin mir sicher, dass es auch dafür gut ist, aber es hilft mir nicht. – Supuhstar

0

Sie könnten etwas weniger abrasiv sein und nicht sagen „mir nicht hilft“.

Ansonsten ist hier das große Bild, das API von Alexr dem Beispiel erwähnt Ton mit: (es gibt viele praktische Details on that forum thread, und es gibt einige Oracle-Dokumentation Processing Audio with Controls)

  • Sobald Sie ein Line Objekt, das die Tonausgabe Linie repräsentiert, die Sie steuern möchten, ist es ziemlich trivial die Lautstärke zu erhalten:

    line.open(); // May be necessary if the line is not already opened. 
    FloatControl volumeControl = (FloatControl) masterLine.getControl(FloatControl.Type.VOLUME); 
    
  • den „MasterErste"Objekt ist bestenfalls plattformabhängig. Sie müssen die Mixer s und die Line s zur Laufzeit mit den statischen Methoden AudioSystem auflisten, um festzustellen, welche Zeile Sie wollen. Es kann auch vorkommen, dass die Masterzeile die Lautstärkeregelung nicht direkt, sondern nur über eine CompoundControl unterstützt. (durch eine Hierarchie, die Sie erraten haben, plattformabhängig).

+0

mit 'line = (Port) AudioSystem.getMixer (null) .getLine (Port.Info.LINE_IN);', bekomme ich 'java.lang.IllegalArgumentException: Line nicht unterstützt: LINE_IN Quellport' – Supuhstar

+0

@Supuhstar: 1. Ich vermute Sie wollten schreiben '((Port) AudioSystem.getMixer (null)). getLine (Port.Info.LINE_IN);' - das hätte eine 'ClassCastException' ausgelöst. 2. Es gibt keine Garantie, dass das Aufrufen von 'AudioSystem.getMixer (null)' den 'Port' ergibt, den Sie bekommen möchten - der Computer kann nicht erraten, was Sie wollen. 3. Ich glaube, der einzige zuverlässige Weg besteht darin, eine Teilmenge der 'Line's oder' Mixer' des Systems aufzuzählen, indem man 'AudioSystem.getMixerInfo()' und ähnliche andere Methoden verwendet und jede einzelne prüft. 4. Wenn Sie den verknüpften Forum-Thread gelesen hätten, hätte ich die Punkte 2 und 3 nicht schreiben müssen. –

2

Obwohl JProgressBar ist für diesen
verwendet, um dieses

Hilfe könnte
package test; 

import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.FloatControl; 
import javax.sound.sampled.Line; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.Mixer; 
import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JProgressBar; 

public class SoundMeter { 

JFrame j; 

public SoundMeter() { 
    j = new JFrame("SoundMeter"); 
    j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    j.setLayout(new BoxLayout(j.getContentPane(), BoxLayout.Y_AXIS)); 
    printMixersDetails(); 
    j.setVisible(true); 
} 
public void printMixersDetails(){ 
    javax.sound.sampled.Mixer.Info[] mixers = AudioSystem.getMixerInfo(); 
    System.out.println("There are " + mixers.length + " mixer info objects"); 
    for(int i=0;i<mixers.length;i++){ 
     Mixer.Info mixerInfo = mixers[i]; 
     System.out.println("Mixer Name:"+mixerInfo.getName()); 
     Mixer mixer = AudioSystem.getMixer(mixerInfo); 
     Line.Info[] lineinfos = mixer.getTargetLineInfo(); 
     for(Line.Info lineinfo : lineinfos){ 
      System.out.println("line:" + lineinfo); 
      try { 
       Line line = mixer.getLine(lineinfo); 
       line.open(); 
       if(line.isControlSupported(FloatControl.Type.VOLUME)){ 
        FloatControl control = (FloatControl) line.getControl(FloatControl.Type.VOLUME); 
        System.out.println("Volume:"+control.getValue()); 
        JProgressBar pb = new JProgressBar(); 
        // if you want to set the value for the volume 0.5 will be 50% 
        // 0.0 being 0% 
        // 1.0 being 100% 
        //control.setValue((float) 0.5); 
        int value = (int) (control.getValue()*100); 
        pb.setValue(value); 
        j.add(new JLabel(lineinfo.toString())); 
        j.add(pb); 
        j.pack(); 
       } 
      } catch (LineUnavailableException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 
public static void main(String[] args) { 
    new SoundMeter(); 
} 
} 
+0

Es scheint nur das Volumen der Anwendung zu messen und einzustellen, nicht das System. – Supuhstar

+1

Linien sind immer bei 0,5 oder 1 – Supuhstar

+0

Bitte antworten Sie. – Supuhstar

Verwandte Themen