Java sound api - 扫描midi设备

tyb*_*103 13 java audio midi midi-instrument

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

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

Tom*_*ros 7

MidiSystem.getMidiDeviceInfo()得到完整的供应商名单,并提取设备从每个供应商的信息.

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

public static synchronized List getProviders(Class serviceClass) 获得一个List,其中包含所请求服务的已安装提供程序实例.提供者列表在cachingPeriod给出的时间段内缓存.在此期间,将为同一类型的提供程序返回相同的List实例.在此期间之后,构造并返回新实例.返回的List是不可变的.

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

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

com.sun.media.sound.JDK13Services.setCachingPeriod(1);
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案使用Sun专属类,因此无法100%移植.