hi,
ich versuche grad mal eine midi-Datei mit JMF abzuspielen, was ja eigentlich gehen sollte. Dazu habe 'ich' eine Funktion geschrieben(oder sagen wir, gefunden
), Wenn ich diese nutze, um eine mp3-datei abzuspielen funktioniert sie, wenn ich ein midi abspielen will, nicht. Es tritt folgener Fehler auf:
ich versuche grad mal eine midi-Datei mit JMF abzuspielen, was ja eigentlich gehen sollte. Dazu habe 'ich' eine Funktion geschrieben(oder sagen wir, gefunden
Die datei habe ich vorher mit JMusic erstellt, Winamp spielt sie fehlerfrei ab. Hier ist noch 'meine' Funktion (danke Illu....):Error: Unable to prefetch com.sun.media.content.audio.midi.Handler$MidiController@1f436f5
Code:
import javax.media.*;
import java.awt.*;
import java.io.*;
/**
* @author Illuvatar
*/
public class Media
{
private static void checkJmf() throws ClassNotFoundException
{
try{
Class c = Class.forName("javax.media.Manager");
}catch (ClassNotFoundException e){
ClassNotFoundException cnfe = new ClassNotFoundException ("JMF nicht installiert!", e);
throw cnfe;
}
}
private Media (Component visual, Component controlPanel, Player player)
{
v = visual;
cp = controlPanel;
p = player;
}
private Component v;
private Component cp;
private Player p;
/**
*Spielt mit dem JMF die Musik in der Datei f ab.
*@return Ein Media-Objekt, dass das ControlPanelComponent und den Player kapselt
*@exception IOException Wenn die Datei nicht existiert
*@exception ClassNotFoundException Wenn kein JMF installiert ist
*@exception NoPlayerException Wenn kein Player zu der Datei gefunden wird.
*/
public static Media playMusic (File f) throws IOException, ClassNotFoundException, NoPlayerException
{
checkJmf();
final Player player = Manager.createPlayer (f.toURL());
player.start();
waitFor(player);
return new Media (null, player.getControlPanelComponent(), player);
}
/**
*Blockiert bis zu einem StopEvent des Players, das kein Restarting- oder StopByRequestEvent ist.
*@see javax.media.StopEvent
*/
public static void waitFor (Player player)
{
final Object LOCK = new Object();
player.addControllerListener (new ControllerListener(){
public synchronized void controllerUpdate(ControllerEvent event) {
if (event instanceof javax.media.StopEvent && !(event instanceof RestartingEvent) && !(event instanceof StopByRequestEvent)) {
synchronized (LOCK){
LOCK.notifyAll();
}
}
}
});
synchronized (LOCK){
try{
LOCK.wait();
}catch (InterruptedException ie){
Thread.currentThread().interrupt();
}
}
}
}