代码之家  ›  专栏  ›  技术社区  ›  tybro0103

Java sound api-扫描midi设备

  •  13
  • tybro0103  · 技术社区  · 15 年前

    我正在开发一个java项目,它使用javax.sound.midi文件图书馆。文件上说 MidiSystem.getMidiDeviceInfo()

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

    4 回复  |  直到 15 年前
        1
  •  7
  •   Tomas Narros    15 年前

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

    MIDIs提供程序列表是从JDK underlaying类恢复的 com.sun.media.sound.JDK13Services getProviders()

    公共静态同步列表getProviders(类serviceClass) 获取包含已安装的 请求的服务。名单 提供程序缓存的时间段为 在此期间,相同的列表实例 供应商。经过这段时间,一个新的 实例被构造并返回。 返回的列表是不可变的。

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

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

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

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

        2
  •  3
  •   Zetten    15 年前

    由于我的工作PC上没有任何MIDI设备,或者是任何类型的Mac,我怀疑我是否能够正确地测试它,但是。。。

    MidiSystem类似乎使用 com.sun.media.sound.JDK13Services.getProviders(Class providerClass) 查找系统上的设备列表。这个 API docs for this class 声明列表是在外部的连续调用中重新创建的 cachingPeriod setCachingPeriod(int seconds) .

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

    希望这足以让你开始,同时我会继续四处寻找,看看是否能找到一个更干净的方法来做这件事。

        3
  •  0
  •   Yona Appletree    8 年前

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

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

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

        4
  •  -1
  •   binarycreations    15 年前

    这听起来像是一个操作系统特定的错误,但我可以想出一个绕过。

    在java中,您可以向操作系统运行外部命令。(一个快速的谷歌,给了我这个例子 http://www.javafaq.nu/java-example-code-186.html 它看起来很好,给你的想法)。

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

    还要记住,用于查询midi设备的外部程序不必用Java编写,以防Java给您带来更多问题。或者,您可以查询操作系统中已连接的设备,并使用grep过滤结果。

    推荐文章