Java 声音 API - 扫描 midi 设备

2022-09-04 22:26:25

我正在开发一个java项目,该项目使用javax.sound.midi库从midi硬件接收midi事件。在文档中,它说返回所有连接的midi硬件的列表。它对我有用,但问题是,它只工作一次。第一次实际扫描设备需要一点时间,但每次之后,即使已连接新设备,它也会立即返回相同的列表。有没有办法强制它重新扫描?如果应用程序重新启动,它将重新扫描,但我不希望我的用户在连接新的midi设备时必须重新启动。MidiSystem.getMidiDeviceInfo()

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


答案 1

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

MIDI 提供程序列表通过静态方法从 JDK 底层类 com.sun.media.sound.JDK13Services 中恢复getProviders()

公共静态同步列表获取提供程序(类服务类)获取一个列表,其中包含所请求服务的提供程序的已安装实例。提供程序列表在缓存周期 给出的时间段内进行缓存。在此期间,将为同一类型的提供程序返回相同的 List 实例。在此时间段之后,将构造并返回一个新实例。返回的列表是不可变的。

因此,似乎这个类将提供者列表保存在缓存中,它将在一段时间后重新加载。您可以使用方法将此时间段设置为自定义值。据我所知,默认缓存周期设置为 60 秒。setCachingPeriod(int seconds)

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

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

请注意,此解决方案使用Sun propietary类,因此它不可能是100%可移植的。


答案 2

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

MidiSystem 类似乎用于查找系统上的设备列表。此类的 API 文档指出,该列表是在 a 之外的连续调用上重新创建的,可以通过调用 来方便地进行设置。com.sun.media.sound.JDK13Services.getProviders(Class providerClass)cachingPeriodsetCachingPeriod(int seconds)

运气好的话,您可以在应用程序开始时调用一次,并将其设置为5秒或更长时间,它就会神奇地工作。但是,文档还声明“此方法仅用于测试”,因此我不太确定此方法的有效性。

希望这足以让你开始,在此期间我会继续四处寻找,看看我是否能找到一种更干净的方式来做到这一点。


推荐