Java son api - Recherche de périphériques MIDI
-
04-10-2019 - |
Question
Je travaille sur un projet java qui reçoit des évènements midi matériel midi à l'aide de la bibliothèque javax.sound.midi. Dans la documentation, il est dit que MidiSystem.getMidiDeviceInfo()
retourne une liste de tous connectés matériel midi. Il fonctionne pour moi, mais le problème est, cela fonctionne qu'une seule fois. Il faut un moment la première fois à balayage réellement pour les appareils, mais à chaque fois après qu'il retourne immédiatement cette même liste, même si de nouveaux appareils ont été connectés. Est-il un moyen de le forcer à réanalyser? Il se réanalyser l'application redémarre, mais je ne veux pas que mes utilisateurs d'avoir à redémarrer s'ils se connectent un nouveau périphérique MIDI.
BTW, je suis sous Mac OS X ... il a été souligné que le comportement peut être différent pour différents de l'OS.
La solution
Le MidiSystem.getMidiDeviceInfo()
obtient la liste complète des fournisseurs, et extrait les informations de l'appareil de chaque fournisseur.
La liste des fournisseurs MIDIs est récupéré de la classe JDK la superposer com.sun.media.sound.JDK13Services , par la méthode statique getProviders()
public static getProviders Liste synchronisée (classe serviceClass) Contenant une liste obtient installé instances des fournisseurs pour la service demandé. La liste de les fournisseurs sont mises en cache pour la période temps donné par cachingPeriod. Pendant cette période, la même instance est Liste retourné pour le même type de fournisseur. Après cette période, un nouveau exemple est construit et retourné. La liste retournée est immuable.
Alors, il semble que cette classe contient te liste des fournisseurs dans un cache, Wich sera rechargée après une certaine période. Vous pouvez définir cette période à une valeur personnalisée en utilisant la méthode setCachingPeriod(int seconds)
. Tant que je sache, la période de mise en cache par défaut est réglé sur 60 secondes.
À titre d'exemple, pour rafraîchir ce cache chaque seconde, vous coud ajoutez cette ligne à votre code:
com.sun.media.sound.JDK13Services.setCachingPeriod(1);
S'il vous plaît, notez que cette solution utilise une classe Sun propietary, donc il ne pouvait pas être 100% portable.
Autres conseils
Manquant tous les périphériques MIDI sur mon PC de travail, ou encore une sorte de Mac, je doute que je serai en mesure de le tester correctement, mais ...
La classe MidiSystem semble utiliser com.sun.media.sound.JDK13Services.getProviders(Class providerClass)
pour trouver la liste des périphériques sur le système. L'API cachingPeriod, qui peut être commodément mis en appelant setCachingPeriod(int seconds)
.
Avec un peu de chance, vous pouvez simplement appeler cette fois au début de votre application et réglez-le sur 5 secondes ou quelque chose, et il va par magie travail. Cependant, les docs également état « Cette méthode est destiné uniquement au test. », Donc je ne suis pas sûr tout à fait comment cette approche sera efficace.
Espérons que cela est suffisant pour vous aider à démarrer, et je vais garder farfouillé en attendant de voir si je peux trouver un moyen plus propre de le faire.
Je lui ai répondu que c'est liste mise à jour des périphériques MIDI en Java ainsi, mais pour les gens qui serpentent ici, il y a maintenant une bibliothèque qui prend en charge cette correctement: https: // GitHub. com / DerekCook / CoreMidi4J
La bibliothèque agit un fournisseur de périphérique pour le sous-système MIDI, il est donc essentiellement une baisse dans et tout votre code existant fonctionnera.
Je ne suis pas l'auteur, mais il fonctionne bien pour mes besoins, et il a fallu un peu de juste de chercher à trouver, donc je poste ici pour d'autres qui rencontrent le problème.
Cela sonne comme est-pourrait être un bug specifx OS mais je ne peux penser à un contourner.
En Java, vous pouvez exécuter des commandes externes au système d'exploitation. (Un rapide Google, m'a donné cet exemple http://www.javafaq.nu/ java-exemple code-186.html il semble OK et vous donne l'idée).
Lors de la vérification de nouveaux périphériques vous pouvez envoyer une commande externe pour exécuter un programme Java simple qui interroge rapidement les périphériques MIDI en utilisant MidiSystem.getMidiDeviceInfo () et transmet les résultats dans un fichier texte ou vous pouvez saisir la sortie de l'objet BufferedReader .
Souvenez-vous également que le programme externe utilisé pour interroger des périphériques MIDI ne doit pas être écrit en Java Java vous fait encas plus de problèmes. Sinon, vous pouvez simplement interroger le système d'exploitation pour les appareils connectés et utiliser grep pour filtrer les résultats.
Hope this helps.