Java sound api - Сканирование для MIDI-устройств
Я работаю над проектом java, который получает midi-события из midi-оборудования, используя библиотеку javax.sound.midi. В документации говорится, что MidiSystem.getMidiDeviceInfo()
возвращает список всех подключенных MIDI-устройств. Это работает для меня, но проблема в том, что она работает только один раз. На первый взгляд требуется первый раз для сканирования устройств, но каждый раз после этого он сразу же возвращает тот же список, даже если подключены новые устройства. Есть ли способ заставить его пересканировать? Он повторит попытку, если приложение перезапустится, но я не хочу, чтобы мои пользователи перезагружались, если они подключили новое устройство midi.
Кстати, я использую Mac OS X... было указано, что поведение может отличаться для разных ОС.
Ответы
Ответ 1
MidiSystem.getMidiDeviceInfo()
получает полный список поставщиков и извлекает информацию об устройстве у каждого поставщика.
Список поставщиков MIDIs восстанавливается из JDK, лежащего в основе класса com.sun.media.sound.JDK13Услуги, через статический метод getProviders()
публичный статический синхронизированный список getProviders (класс serviceClass)Получает список, содержащий установленные примеры поставщиков для запрошенную услугу. Список провайдеры кэшируются на период время, заданное кешированием. В течение этот период, тот же экземпляр списка возвращен для того же типа поставщик. После этого периода новый экземпляр создается и возвращается. Возвращенный список является неизменным.
Итак, кажется, что этот класс содержит список поставщиков в кеше, который будет перезагружен через определенный период. Вы можете установить этот период для пользовательского значения с помощью метода setCachingPeriod(int seconds)
. До тех пор, как я знаю, период кэширования по умолчанию установлен на 60 секунд.
В качестве примера, чтобы обновить этот кеш каждую секунду, вы добавите эту строку в свой код:
com.sun.media.sound.JDK13Services.setCachingPeriod(1);
Обратите внимание, что это решение использует класс проприетарной системы Sun, поэтому он не может быть на 100% переносимым.
Ответ 2
Отсутствие каких-либо MIDI-устройств на моем рабочем ПК или даже на любом Mac, я сомневаюсь, что смогу проверить его правильно, но...
Класс MidiSystem использует com.sun.media.sound.JDK13Services.getProviders(Class providerClass)
для поиска списка устройств в системе. В API-документах для этого класса указано, что список воссоздается при последовательном вызове вне cachingPeriod
, который можно удобно установить, вызвав setCachingPeriod(int seconds)
.
При любой удаче вы можете просто вызвать это один раз в начале вашего приложения и установить его на 5 секунд или что-то в этом роде, и это будет волшебно работать. Однако в документах также указано, что "этот метод предназначен только для тестирования". Поэтому я не уверен, насколько эффективен такой подход.
Надеюсь, этого достаточно, чтобы вы начали, и я буду продолжать думать, чтобы узнать, могу ли я найти более чистый способ сделать это.
Ответ 3
Похоже, это может быть ошибка OS specificx, но я могу подумать обойти.
В java вы можете запускать внешние команды в ОС. (Быстрый google, дал мне этот пример http://www.javafaq.nu/java-example-code-186.html, он выглядит нормально и дает вам идею).
При проверке новых устройств вы можете отправить внешнюю команду для запуска простой java-программы, которая быстро запрашивает MIDI-устройства с помощью MidiSystem.getMidiDeviceInfo() и выводит результаты в текстовый файл, или вы можете захватить вывод из объекта BufferedReader.
Также помните, что внешняя программа, используемая для запроса midi-устройств, не должна быть записана на Java, поскольку Java вызывает больше проблем. В качестве альтернативы вы можете просто запросить ОС для подключенных устройств и использовать grep для фильтрации результатов.
Надеюсь, что это поможет.