Domanda

Sto lavorando su un progetto Java che riceve gli eventi MIDI da MIDI hardware utilizzando la libreria javax.sound.midi. Nella documentazione, si dice che MidiSystem.getMidiDeviceInfo() restituisce un elenco di tutto l'hardware MIDI collegato. Funziona per me, ma il problema è, funziona solo una volta. Ci vuole un momento la prima volta effettivamente scansione per i dispositivi, ma ogni volta dopo che restituisca immediatamente medesima lista, anche se sono stati collegati nuovi dispositivi. C'è un modo per costringerlo a ripetere la scansione? Sarà una nuova scansione se l'applicazione viene riavviato, ma io non voglio che i miei utenti di avere a riavviare se si collegano un nuovo dispositivo MIDI.

A proposito, sto usando Mac OS X ... che è stato sottolineato che il comportamento può essere diverso per i diversi sistemi operativi.

È stato utile?

Soluzione

Il MidiSystem.getMidiDeviceInfo() ottiene la lista provider completo, ed estrae le informazioni del dispositivo da ogni fornitore.

La lista dei provider file MIDI viene recuperato dal JDK underlaying classe com.sun.media.sound.JDK13Services , attraverso il metodo statico getProviders()

  

public static List sincronizzati getProviders (Classe ServiceClass)   Ottiene un elenco contenente installato   istanze dei fornitori per la   servizio richiesto. La Lista dei   fornitori vengono memorizzati nella cache per il periodo di   tempo dato dal cachingPeriod. Durante   questo periodo, la stessa istanza List è   restituito per lo stesso tipo di   fornitore. Dopo questo periodo, una nuova   esempio è costruito e restituito.   L'elenco restituito è immutabile.

Quindi, sembra che questa classe contiene te nell'elenco Fornitori in una cache, wich verrà ricaricato dopo un certo periodo. È possibile impostare questo periodo per un valore personalizzato utilizzando il metodo setCachingPeriod(int seconds). Finché ne so, il periodo predefinito di cache è impostato a 60 secondi.

A titolo di esempio, per aggiornare questa cache ogni secondo, si coud aggiungere questa riga di codice:

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

, notare che questa soluzione si avvale di una classe proprietarie Sole, quindi non poteva essere al 100% portatile.

Altri suggerimenti

In mancanza di eventuali dispositivi MIDI sul mio lavoro PC, o qualsiasi tipo di Mac, dubito che sarò in grado di testare in modo corretto, ma ...

La classe MidiSystem sembra usare com.sun.media.sound.JDK13Services.getProviders(Class providerClass) per trovare l'elenco dei dispositivi presenti sul sistema. documentazione API per questa classe stato che il lista è ricreato in una chiamata esterna successiva di un cachingPeriod, che può essere comodamente impostato chiamando setCachingPeriod(int seconds).

Con po 'di fortuna si può semplicemente chiamare questo una volta all'inizio della vostra applicazione e impostarlo a 5 secondi o qualcosa del genere, e sarà magicamente lavoro. Tuttavia, i documenti anche stato "Questo metodo è destinato solo per i test.", Quindi non sono sicuro che tutto quanto sia efficace questo approccio sarà.

Speriamo che questo sia sufficiente per iniziare, e terrò rovistando nel frattempo per vedere se riesco a trovare un modo più pulito per fare questo.

ho risposto questo è dei dispositivi MIDI in Java pure, ma per le persone che finiscono qui, c'è ora una libreria che supporta questa correttamente: https: // GitHub. com / DerekCook / CoreMidi4J

La biblioteca funge da fornitore di dispositivo per la MIDI Subsystem, quindi è fondamentalmente un drop-in e tutto il vostro codice esistente funzionerà.

Io non sono l'autore, ma funziona bene per le mie esigenze, e ci sono voluti un bel po 'di ricerca da trovare, quindi sto postando qui per gli altri che incontrano il problema.

Questo suona come a dire potrebbe essere un bug di sistema operativo specifx ma posso pensare a un andare in giro.

In Java è possibile eseguire comandi esterni al sistema operativo. (A google rapido, mi ha dato questo esempio http://www.javafaq.nu/ java-codice-esempio-186.html sembra ok e ti dà l'idea).

Al momento del check per i nuovi dispositivi che si potrebbe inviare un comando esterno per eseguire un semplice programma Java che interroga rapidamente i dispositivi MIDI usando MidiSystem.getMidiDeviceInfo () e restituisce i risultati in un file di testo o si potrebbe prendere l'uscita dall'oggetto BufferedReader .

Anche ricordare che il programma esterno utilizzato per interrogare i dispositivi midi non deve essere scritto in Java Java incase si provoca più problemi. In alternativa si può solo interrogare il sistema operativo per dispositivi collegati e l'uso grep per filtrare i risultati.

Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top