# JMF: Exception bei setLevel



## Nioukie (4. Jul 2011)

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:


```
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:


```
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:


```
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 (4. Jul 2011)

Hi,

die erste Zeile der Exception gibt Dir  die Antwort:


```
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.

```
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 (4. Jul 2011)

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 (4. Jul 2011)

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ß


----------



## Nioukie (4. Jul 2011)

Alles klar, danke


----------

