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.

Était-ce utile?

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

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top