Sequencer.wait()
-
Hi, immer wenn ich diese Methode aufrufe erscheint folgende Fehlermeldung:
IllegalMonitorStateException: Thread is not owner
Oder sowas ähnliches. Wie kann ich denn nun den Thread zum "owner" machen, damit die Methode korrekt ausgeführt wird?
Hier der code:
public class MidiTrack { File file; Sequence currentSound; Sequencer player; boolean pause = false; public MidiTrack(String file) { this.file = new File(file); try { currentSound = MidiSystem.getSequence(this.file); player = MidiSystem.getSequencer(); } catch (Exception e) { System.err.println(e.toString()); } } public final void run() { try { player.open(); player.setSequence(currentSound); player.start(); } catch (Exception e) { System.err.println(e.toString()); } } public final void play() { try { if (!pause) { if (!player.isOpen()) player.open(); run(); } else { if (player.isRunning()) return; player.notify(); pause = false; } } catch (Exception e) { System.err.println(e.toString()); } } public final void pause() { try { player.wait(); pause = true; } catch (Exception e) { System.err.println(e.toString()); } } public final void stop() { player.stop(); player.close(); } }
-
use "synchronized", also z.b. so:
public final void pause() { synchronized(player){ try { player.wait(); pause = true; } catch (Exception e) { System.err.println(e.toString()); } } }
-
So, ich habe den code jetzt so angepasst:
/* * Created on 08.02.2004 * */ import javax.sound.midi.*; import java.io.*; public class MidiTrack { File file; Sequence currentSound; Sequencer player; boolean pause = false; public MidiTrack(String file) { this.file = new File(file); try { currentSound = MidiSystem.getSequence(this.file); player = MidiSystem.getSequencer(); } catch (Exception e) { System.err.println(e.toString()); } } public final void run() { try { player.open(); player.setSequence(currentSound); player.start(); } catch (Exception e) { System.err.println(e.toString()); } } public final void play() { synchronized (player) { try { if (!pause) { if (!player.isOpen()) player.open(); run(); } else { if (player.isRunning()) return; player.notify(); pause = false; } } catch (Exception e) { System.err.println(e.toString()); } } } public final void pause() { synchronized (player) { try { player.wait(); pause = true; } catch (Exception e) { System.err.println(e.toString()); } } } public final void stopTrack() { player.stop(); player.close(); } }
Wenn ich jetzt pause Aufrufe passiert einfach nichts. Die Methode kehrt bis zum Ende des Midi tracks nicht zurück. Also es wird einfach weiter gespielt.
Wobei ja das störende ist, dass es halt nicht pausiert und das die Methode halt nicht zurückkehrt.
Was hab ich falsch gemacht?