Вопрос

Я работаю над проектом Java, который получает мероприятия MIDI из MIDI-аппарата с использованием библиотеки Javax.Sound.midi. В документации он говорит, что MidiSystem.getMidiDeviceInfo() Возвращает список всех подключенных средств MIDI. Это работает для меня, но проблема в том, что она работает только один раз. Это займет момент впервые, чтобы фактически сканировать для устройств, но каждый раз после этого он немедленно вернет тот же список, даже если новые устройства были подключены. Есть ли способ заставить его в сканирование? Он будет Rescan, если приложение будет перезапущено, но я не хочу, чтобы мои пользователи должны были перезапустить, если они подключают новое MIDI-устройство.

Кстати, я использую Mac OS X ... Указано, что поведение может отличаться для разных ОС.

Это было полезно?

Решение

То MidiSystem.getMidiDeviceInfo() Получает список полных провайдеров и извлекивает информацию устройства из каждого провайдера.

Список поставщика MIDIS восстановлен из класса подложки JDK com.sun.media.sound.jdk13services., через статический метод getProviders()

Общественный статический синхронизированный список GetProviders (класс ServiceClass)Получает список, содержащий установленные экземпляры поставщиков для запрошенной службы. Список поставщиков кэшируется за период времени, данного CachingPeriod. В течение этого периода тот же экземпляр списка возвращается для того же типа поставщика. После этого периода новый экземпляр построен и возвращен. Возвращенный список неизменен.

Итак, кажется, что этот класс проводит список поставщиков в кеше, который будет перезагружаться через определенный период. Вы можете установить этот период в пользовательское значение, используя метод setCachingPeriod(int seconds). Отказ Пока я знаю, период кэширования по умолчанию устанавливается до 60 секунд.

В качестве примера, чтобы обновить этот кеш каждую секунду, вы вполне добавьте эту строку в свой код:

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

Обратите внимание, что это решение использует класс пропаривания солнца, поэтому он не может быть 100% портативным.

Другие советы

Не хватает всех MIDI-устройств на моем рабочем ПК, или действительно, какой-либо Mac, я сомневаюсь, что смогу проверить его правильно, но ...

Класс Midisystem, кажется, использует com.sun.media.sound.JDK13Services.getProviders(Class providerClass) Чтобы найти список устройств в системе. То Документы API для этого класса Укажите, что список воссоздан на последовательный вызов за пределами cachingPeriod, которые могут быть удобно установлены путем вызова setCachingPeriod(int seconds).

С любой удачей вы можете просто позвонить в это один раз в начале вашего приложения и установить его до 5 секунд или что-то, и это волшебно работают. Однако документы также утверждают «этот метод предназначен только для тестирования». «Так что я не уверен, насколько эффективен этот подход.

Надеюсь, этого достаточно, чтобы начать, и я буду продолжать тыкать в то же время, чтобы посмотреть, смогу ли я найти более чистый способ сделать это.

Я ответил это Обновление списка MIDI-устройств в Java Кроме того, но для людей, которые заводят здесь, теперь есть библиотека, которая поддерживает это правильно: https://github.com/derekcook/coremidi4j.

Библиотека действует поставщика устройств для подсистемы MIDI MIDI, поэтому он в основном работает, и весь ваш существующий код будет работать.

Я не автор, но это хорошо работает для моих потребностей, и все это заняло поиск, поэтому я размещаю его здесь для других, которые сталкиваются с проблемой.

Это звучит, как это может быть ошибкой Specifx OS, но я могу думать о том, чтобы обойтись.

В Java вы можете запустить внешние команды в ОС. (Быстрый гугл, дал мне этот пример http://www.javafaq.nu/java-example-code-186.html. Это выглядит хорошо и дает вам идею).

При проверке на новых устройствах вы можете отправить внешнюю команду для запуска простой программы Java, которая быстро запрашивает MIDI-устройства с использованием Midisystem.getMidideViceInfo () и выводит результаты в текстовый файл, или вы можете захватить вывод из объекта буффарежера.

Также помните, что внешняя программа, используемая для запроса MIDI-устройств, не должна быть написана в Java Infase Java, вызывает больше проблем. Кроме того, вы можете просто запросить ОС для подключенных устройств и используйте GREP для фильтрации результатов.

Надеюсь это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top