Frage

Ich arbeite an einem Java-Projekt, das von MIDI-Hardware mit der javax.sound.midi Bibliothek Midi-Ereignisse empfängt. In der Dokumentation heißt es, dass MidiSystem.getMidiDeviceInfo() eine Liste aller angeschlossenen MIDI-Hardware zurückgibt. Es funktioniert für mich, aber das Problem ist, es nur einmal funktioniert. Es dauert einen Moment zum ersten Mal tatsächlich Scan für die Geräte, aber jedes Mal nach, dass es sofort die gleiche Liste zurück, auch wenn neue Geräte angeschlossen sind. Gibt es eine Möglichkeit, es zu zwingen, erneut zu scannen? Es wird erneut prüfen, ob die Anwendung neu gestartet wird, aber ich will nicht meine Benutzer neu starten müssen, wenn sie ein neues MIDI-Gerät angeschlossen werden.

BTW, ich bin mit Mac OS X ... es gewesen ist darauf hingewiesen, dass das Verhalten für verschiedene Betriebssysteme unterschiedlich sein kann.

War es hilfreich?

Lösung

Die MidiSystem.getMidiDeviceInfo() bekommt die volle Anbieter Liste, und extrahiert die Daten des Gerätes von jedem Anbieter.

Die MIDIs Providerliste wird von der JDK gestellt Klasse Unterlegen com.sun.media.sound.JDK13Services , durch die statische Methode getProviders()

public static synchronisiert Liste getProviders (Klasse serviceClass) Ermittelt eine Liste mit installiert Instanzen der Anbieter für die angeforderten Dienst. Die Liste der Anbieter wird für den Zeitraum zwischengespeichert von Zeit durch cachingPeriod gegeben. Während diese Zeit, die gleiche Liste Instanz zurückgeführt für die gleiche Art von Anbieter. Nach Ablauf dieser Frist ein neuer Beispiel ist so aufgebaut und zurückgeführt. Die zurückgegebene Liste ist unveränderlich.

So scheint es, dass diese Klasse dir eine Provider-Liste in einem Cache hält, weicht nach einer gewissen Zeit wieder geladen werden. Sie können diesen Zeitraum auf einen benutzerdefinierten Wert setzen Sie die Methode setCachingPeriod(int seconds) verwenden. Solange ich weiß, wird der Standard-Caching Zeitraum auf 60 Sekunden eingestellt.

Als Beispiel jede Sekunde dieses Cache zu aktualisieren, coud Sie diese Zeile Code hinzufügen:

com.sun.media.sound.JDK13Services.setCachingPeriod(1);

Bitte beachten Sie, dass diese Lösung macht von einer Sun propietary Klasse zu verwenden, so dass es nicht zu 100% tragbar sein könnte.

Andere Tipps

Ohne MIDI-Geräte auf meinem Arbeits-PC oder auch jede Art von Mac, ich bezweifle, dass ich im Stande sein werde, es richtig zu testen, aber ...

Die MidiSystem Klasse scheint com.sun.media.sound.JDK13Services.getProviders(Class providerClass) zu verwenden, um die Liste der Geräte im System zu finden. Die API-Dokumentation für diese Klasse Zustand, dass die Liste wird auf einem aufeinanderfolgenden Aufruf außerhalb eines cachingPeriod neu erstellt, die bequem durch den Aufruf setCachingPeriod(int seconds) eingestellt werden können.

Mit etwas Glück können Sie nur dieses eine Mal zu Beginn Ihrer Anwendung aufrufen und legen Sie es auf 5 Sekunden oder so etwas, und es wird auf magische Weise zu arbeiten. die Dokumentation auch Zustand jedoch „Diese Methode wird nur zum Testen gedacht.“, so dass ich nicht sicher bin ganz, wie effektiv diese Methode ist.

Hoffentlich ist genug, um Sie zu erhalten begonnen, und ich werde bleiben in der Zwischenzeit stochert, um zu sehen, ob ich einen sauberen Weg, dies zu tun gebe.

Ich antwortete dies Update-Liste von MIDI-Geräten in Java als gut, aber für Leute, die hier aufzuwickeln, gibt es jetzt eine Bibliothek, die unterstützt diese korrekt: https: // gitHub. com / DerekCook / CoreMidi4J

Die Bibliothek dient ein Gerät Anbieter für das MIDI-Subsystem, so ist es im Grunde ein Drop-in und all vorhandenen Code funktioniert.

Ich bin nicht der Autor, aber es funktioniert gut für meine Bedürfnisse, und es dauerte ein gutes Stück zu finden, die Suche, so dass ich es für anderes Posting hier bin, der das Problem auftritt.

Das klingt wie ist, könnte ein O specifx Fehler sein, aber ich kann von einem denken umgehen.

In Java Sie externe Befehle an das Betriebssystem ausgeführt werden können. (Eine schnelle Google, hat mir dieses Beispiel http://www.javafaq.nu/ Java-Beispiel-Code-186.html es OK aussieht und gibt Ihnen die Idee).

Einen neue Geräte überprüft werden könnten Sie einen externen Befehl senden einfaches Java-Programm auszuführen, dass schnell die MIDI-Geräte abfragt mit MidiSystem.getMidiDeviceInfo () und gibt die Ergebnisse in eine Textdatei oder man könnte die Ausgabe von dem BufferedReader-Objekt greifen .

Denken Sie auch daran, dass das externe Programm zur Abfrage MIDI-Geräte verwendet, muss nicht in Java geschrieben werden incase Java Sie mehr Probleme verursacht. Alternativ können Sie nur das Betriebssystem für die angeschlossenen Geräte abfragen und Verwendung grep die Ergebnisse zu filtern.

Hope, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top