Pregunta

Estoy trabajando en un proyecto de Java que recibe eventos midi de hardware MIDI utilizando la biblioteca javax.sound.midi. En la documentación, se dice que MidiSystem.getMidiDeviceInfo() devuelve una lista de todo el hardware MIDI conectado. Funciona para mí, pero el problema es que sólo funciona una vez. Toma un momento en que la primera vez que en realidad exploración para los dispositivos, pero cada vez después de que volverá inmediatamente de la misma lista, incluso si los nuevos dispositivos se han conectado. ¿Hay una manera de forzar a volver a explorar? Se volverá a explorar si se reinicia la aplicación, pero no quiero que mis usuarios tengan que reiniciar si se conectan un nuevo dispositivo MIDI.

Por cierto, estoy usando Mac OS X ... Se ha señalado que el comportamiento puede ser diferente para diferentes sistemas operativos de.

¿Fue útil?

Solución

El MidiSystem.getMidiDeviceInfo() obtiene la lista completa proveedores, y extrae la información del dispositivo de cada proveedor.

La lista de proveedores MIDIs se recupera de la JDK underlaying clase com.sun.media.sound.JDK13Services , a través de la getProviders() método estático

public static Lista sincronizados getProviders (Clase ServiceClass) Obtiene una lista que contiene instalado instancias de los proveedores para el solicitado el servicio. La lista de proveedores se almacenan en caché durante el periodo de tiempo dado por cachingPeriod. Durante este período, la misma instancia de la lista es devuelto para el mismo tipo de proveedor. Después de este período, un nuevo instancia se construye y se volvió. La lista devuelta es inmutable.

Por lo tanto, parece que esta clase contiene ti lista de proveedores en una memoria caché, cosa que se vuelve a cargar después de un cierto período. Puede establecer este período a un valor personalizado utilizando el método setCachingPeriod(int seconds). Mientras que sé, el periodo de almacenamiento predeterminado se establece en 60 segundos.

A modo de ejemplo, para volver a cargar esta caché cada segundo, que coud añadir esta línea a su código:

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

Por favor, tenga en cuenta que esta solución hace uso de una clase propietaria Sol, por lo que no podía ser 100% portátil.

Otros consejos

A falta de cualquier dispositivo MIDI en mi equipo de trabajo, o de hecho cualquier tipo de Mac, no creo que voy a ser capaz de probar de forma adecuada, pero ...

La clase MidiSystem parece utilizar com.sun.media.sound.JDK13Services.getProviders(Class providerClass) para encontrar la lista de dispositivos en el sistema. El documentación de la API para el estado de esta clase que el la lista se recrea en una llamada exterior sucesiva de un cachingPeriod, que puede ser convenientemente ajustado llamando setCachingPeriod(int seconds).

Con un poco de suerte se puede simplemente llamar a esto una vez al comienzo de su aplicación y ponerlo a 5 segundos o algo así, y por arte de magia va a trabajar. Sin embargo, los documentos también el estado "Este método sólo está destinada a comprobar.", Así que no estoy muy seguro de qué tan efectivo será este enfoque.

Esperamos que esto es suficiente para empezar, y voy a seguir hurgando en el ínterin para ver si puedo encontrar una forma más limpia de hacer esto.

Me respondieron esta es en Java también, pero para la gente que terminan aquí, ahora hay una biblioteca que apoya esta correctamente: https: // github. com / DerekCook / CoreMidi4J

La biblioteca actúa como un proveedor de dispositivos para el subsistema MIDI, por lo que es básicamente un drop-in y todo el código existente funcionará.

No soy el autor, pero funciona bien para mis necesidades, y que nos llevó un poco de búsqueda para encontrar, por lo que he publicado aquí por otras personas que se encuentran con el problema.

Esto suena como es podría ser un error del SO specifx pero puedo pensar en una moverse.

En Java se puede ejecutar comandos externos en el sistema operativo. (Una rápida de Google, me dio este ejemplo http://www.javafaq.nu/ java-ejemplo de código-186.html se ve bien y le da la idea).

En el registro de nuevos dispositivos que podría enviar un comando externo para ejecutar un programa Java simple que consulta rápidamente los dispositivos MIDI que usa MidiSystem.getMidiDeviceInfo () y envía los resultados a un archivo de texto o se pudiera tomar la salida desde el objeto BufferedReader .

Asimismo, recuerda que el programa externo que se utiliza para consultar los dispositivos MIDI no tiene que ser escrito en Java encajonar Java que causa más problemas. Alternativamente usted podría consultar el sistema operativo de los dispositivos conectados y el uso de grep para filtrar los resultados.

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top