首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java声音api -扫描midi设备

Java声音api -扫描midi设备
EN

Stack Overflow用户
提问于 2010-09-20 22:21:37
回答 5查看 2.3K关注 0票数 13

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-09-29 18:04:47

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

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

公共静态同步列表类(GetProviders serviceClass)获取包含所请求服务的提供程序的已安装实例的列表。提供程序列表被缓存一段时间,该时间段由cachingPeriod指定。在此期间,对于相同类型的提供者,将返回相同的列表实例。在此时间段之后,将构造并返回一个新实例。返回的列表是不可变的。

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

例如,要每秒刷新一次此缓存,您可以在代码中添加以下行:

代码语言:javascript
复制
com.sun.media.sound.JDK13Services.setCachingPeriod(1);

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

票数 7
EN

Stack Overflow用户

发布于 2010-09-29 18:04:03

在我的工作PC上没有任何MIDI设备,或者任何一种Mac,我怀疑我是否能够正确地测试它,但是...

MidiSystem类似乎使用com.sun.media.sound.JDK13Services.getProviders(Class providerClass)来查找系统上的设备列表。在cachingPeriod外部的连续调用中重新创建列表的API docs for this class状态,可以通过调用setCachingPeriod(int seconds)方便地进行设置。

如果幸运的话,你只需在应用程序开始时调用它一次,并将其设置为5秒或其他什么,它就会神奇地工作。然而,文档也声明“这种方法只用于测试”,所以我不确定这种方法会有多有效。

希望这足以让你入门,在此期间,我将继续探索,看看是否能找到一种更干净的方法来做这件事。

票数 3
EN

Stack Overflow用户

发布于 2018-07-25 03:51:20

我回答说这也是Update list of Midi Devices in Java,但是对于最终来到这里的人来说,现在有一个库可以正确地支持这一点:https://github.com/DerekCook/CoreMidi4J

该库充当MIDI子系统的设备提供者,因此它基本上是一个插件,您现有的所有代码都将正常工作。

我不是作者,但它很好地满足了我的需求,并且花了相当多的时间才找到它,所以我把它贴在这里给遇到这个问题的其他人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3752352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档