我正在研究一个Java项目,该项目使用Javax.sound.midi库从MIDI硬件接收MIDI事件。在文档中,它说 MidiSystem.getMidiDeviceInfo() 返回所有连接的MIDI硬件的列表。它对我有用,但问题是,它只能工作一次。它需要片刻时间才能实际扫描设备,但是在此之后的每次都将立即返回同一列表,即使已连接了新设备。有没有办法将其迫使它去扫描?如果应用程序重新启动,它将重新解放,但是如果我的用户连接新的MIDI设备,我不需要重新启动。

顺便说一句,我正在使用Mac OS X ...指出,对于不同的操作系统,行为可能有所不同。

有帮助吗?

解决方案

MidiSystem.getMidiDeviceInfo() 获取完整的提供商列表,并从每个提供商中提取设备的信息。

MIDIS提供商列表将从JDK底层类中恢复 com.sun.media.sound.jdk13services, ,通过静态方法 getProviders()

公共静态同步列表GetProviders(类ServiceClass)获取包含请求服务提供商安装实例的列表。在Cachingperiod给出的时间段内,提供者列表被缓存。在此期间,相同类型的提供商将返回相同的列表实例。在此期间之后,构建并返回了一个新实例。返回的列表是不变的。

因此,看来该类将您的提供商列表保存在缓存中,一定期后将重新加载WICH。您可以使用该方法将此期限设置为自定义值 setCachingPeriod(int seconds). 。只要我知道,默认的缓存期设置为60秒。

例如,要每秒刷新此缓存,您可以将此行添加到代码中:

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

请注意,该解决方案利用了日光推出类,因此不能100%便携。

其他提示

我的工作PC上缺少任何MIDI设备,或者实际上有任何MAC,我怀疑我是否能够正确测试它,但是...

中期系统课程似乎正在使用 com.sun.media.sound.JDK13Services.getProviders(Class providerClass) 查找系统上的设备列表。这 此类的API文档 指出该列表是在连续的电话中重新创建的 cachingPeriod, ,可以通过致电方便地设置 setCachingPeriod(int seconds).

幸运的是,您只需在应用程序开始时一次调用一次,并将其设置为5秒或其他东西,它将神奇地工作。但是,文档还指出“此方法仅用于测试”。因此,我不确定这种方法的有效性。

希望这足以让您入门,并且在此期间,我会继续戳戳,看看我是否能找到一种更干净的方法来做到这一点。

我回答这是 更新Java中MIDI设备的列表 同样,但是对于在这里结束的人们来说,现在有一个可以正确支持此的图书馆: https://github.com/derekcook/coremidi4j

该库是MIDI子系统的设备提供商,因此基本上是一个插入,您的所有现有代码都可以正常工作。

我不是作者,但它可以很好地满足我的需求,并且需要进行一些搜索才能找到,因此我将其发布给遇到问题的其他人。

这听起来可能是一个OS Specifx错误,但我可以想到一个问题。

在Java中,您可以将外部命令运行到OS。 (快速的Google,给我这个示例 http://www.javafaq.nu/java-example-code-186.html 看起来还可以,并给您这个主意)。

检查新设备时,您可以发送外部命令来运行一个简单的Java程序,该程序使用MIDISYSYSTEM.GEGMIDIDEDIDEVICEINFO()快速查询MIDI设备,并将结果输出到文本文件中,或者您可以从BufferedReader对象中获取输出。

还请记住,用于查询MIDI设备的外部程序不必用Java Incase Java编写,这会使您更多的问题。另外,您只需查询操作系统是否是否有连接的设备,然后使用GREP来过滤结果。

希望这可以帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top