JMF: Exception bei setLevel

Nioukie

Mitglied
Hallo,

ich arbeite an einem Audioplayer, der mp3s abspielt. Soweit läuft auch alles ganz gut, jedoch habe ich leider noch ein Problem mit der Methode setLevel des JMF. Übergebe ich der Merhode einen höheren Wert als 0.6 erhalte ich folgende Exception:

Java:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Requested value 6.1285 exceeds allowable maximum value 6.0206.
	at javax.sound.sampled.FloatControl.setValue(Unknown Source)
	at com.sun.media.sound.DirectAudioDevice$DirectDL$Gain.setValue(Unknown Source)
	at com.sun.media.renderer.audio.device.JavaSoundOutput.setGain(JavaSoundOutput.java:157)
	at com.sun.media.renderer.audio.JavaSoundRenderer$GCA.setLevel(JavaSoundRenderer.java:202)
	at audioplayer.AudioPlayer.setVolume(AudioPlayer.java:92)
	at audioplayer.Display$10.stateChanged(Display.java:340)
	at javax.swing.JSlider.fireStateChanged(Unknown Source)
	at javax.swing.JSlider$ModelListener.stateChanged(Unknown Source)
	at javax.swing.DefaultBoundedRangeModel.fireStateChanged(Unknown Source)
	at javax.swing.DefaultBoundedRangeModel.setRangeProperties(Unknown Source)
	at javax.swing.DefaultBoundedRangeModel.setValue(Unknown Source)
	at javax.swing.JSlider.setValue(Unknown Source)
	at javax.swing.plaf.basic.BasicSliderUI$TrackListener.mouseDragged(Unknown Source)
	at java.awt.Component.processMouseMotionEvent(Unknown Source)
	at javax.swing.JComponent.processMouseMotionEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Hier relevante Teile meiner Klasse Audioplayer:

Java:
package audioplayer;

import java.awt.*;
import java.awt.event.*;
import java.awt.geom.Ellipse2D;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;

import javax.media.*;
import javax.media.protocol.DataSource;
import javax.media.protocol.URLDataSource;
import javax.media.rtp.event.NewParticipantEvent;
import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class AudioPlayer extends JFrame {

	private static final long serialVersionUID = 1L;
	Playlist plist = new Playlist();
	File datei;
	Player audioPlayer;
	
	public final static int EMPTY = 1, PLAYING = 2, PAUSED = 3, STOPPED = 4;
	private boolean shuffle = false, repeat = false;
	private int state; //Status des Players
	int actualposition = 1;
	int volume=100;
	
	public AudioPlayer(){
		state = EMPTY;
		try { 
			Format[] f = new Format[1];
			f[0] = new Format("mpeglayer3");
			PlugInManager.addPlugIn("com.sun.media.codec.audio.mp3.JavaDecoder", f, f, PlugInManager.CODEC);
		}
		catch(Exception e){
			e.printStackTrace();
		}	
	}

	
	public void setVolume(int vol){
		audioPlayer.getGainControl().setLevel((float)vol/100f);
	}
}

Aufgerufen wird setVolume von einer anderen Klasse aus durch ein ChangeEvent eines JSliders aufgerufen mit dem die Lautstärke geregelt wird.

Hier noch der Code des Sliders:

Java:
volumeslider = new JSlider(0,100,100);
//		volumeslider.setHorizontalAlignment(SwingConstants.CENTER);
		volumeslider.addChangeListener(new ChangeListener() {
			public void stateChanged(ChangeEvent e) {
				int x = volumeslider.getValue();
				player.setVolume(x);
				System.out.println(x);
			}
		});
		volumeslider.setBounds(270,230, 100,15);
		volumeslider.setBackground(Color.BLACK);
		pane.add(volumeslider,0);

Ich bin für jede Hilfe dankbar :)
 

Ralph-Uwe

Bekanntes Mitglied
Hi,

die erste Zeile der Exception gibt Dir die Antwort:

Code:
Requested value 6.1285 exceeds allowable maximum value 6.0206

Du hast einen höheren Wert übergeben als erlaubt ist.

Die minimal und maximal Werte können abgefragt werden.

Ausschnitt aus den von mir verwendeten Code.
Java:
FloatControl gainControl = (FloatControl)line.getControl(FloatControl.Type.MASTER_GAIN);
int gainLevel= (int) ((int)gainControl.getMinimum()+((gainControl.getMaximum()-gainControl.getMinimum())/100*gainPercent));
gainControl.setValue(gainLevel);

Gruß
 

Nioukie

Mitglied
Danke, das habe ich soweit schon verstanden, in der API des JMF steht aber:

float setLevel(float level)
Set the gain using a floating point scale with values between 0.0 and 1.0.

Siehe hier:
JMF 2.0 API (03/10/01): Interface GainControl

Und am Anfang hat der Code auch bei höheren Zahlen normal funktioniert soweit ich mich recht erinnere...

Ich kann es natürlich umschreiben dass 0.6 den 100 prozent entsprechen, es kommt mir aber zu leise vor und wie gesagt sollte es ja auch möglich sein werte bis 1.0 einzugeben
 

Ralph-Uwe

Bekanntes Mitglied
Warum das so ist kann ich Dir auch nicht sagen.
Möglicherweise hängt das mit der Hardware und/oder mit den Treibern zusammen.

Tatsache ist aber, dass Du die an die Grenzen halten mußt um keine Exception zu erhalten.

Gruß
 

Ähnliche Java Themen


Oben