3

我正在尝试在 Scala SBT 管理的项目中使用 Java Sound API。

这是一个播放音符的玩具应用程序。

import javax.sound.midi._

object MyMain extends App {
  val infos = MidiSystem.getMidiDeviceInfo()
  println( "[DEBUG] midi devices found: " + infos.length )

  val myMsg = new ShortMessage;
  // Start playing the note Middle C (60),
  // moderately loud (velocity = 93).
  myMsg.setMessage(ShortMessage.NOTE_ON, 0, 60, 93);
  val timeStamp = -1;
  val rcvr : Receiver = MidiSystem.getReceiver();
  rcvr.send(myMsg, timeStamp);

  readChar()  // give time to play note
}

当我run在 SBT 中执行时,我得到了javax.sound.midi.MidiUnavailableException因为 infos.length返回 0。也就是说,当我在 IntelliJ 中运行应用程序时,找到了两个设备并且音符播放得很好。

SBT 需要知道什么才能使其运行?有什么需要添加到类路径中的吗?我注意到 IntelliJ 将一大堆 jar 附加到执行命令(但是,删除来自 jdk/jre/lib/ 的 jar 没有任何效果,而其他的是 scala 相关或 IntelliJ 相关)。

4

1 回答 1

5

SBT 在进程中运行您的应用程序,使用一些类加载器魔法,这可能会阻止MidiSystem(使用 SPI)找到声音组件。

您可以尝试分叉一个新的 JVM 来运行您的应用程序:fork in run := true. 请参阅文档中的分叉。

注意:

  • 默认情况下,它不会将输入重定向到应用程序。您可以添加:

    connectInput in run := true
    
  • 分叉的 JVM 可以被任何外部工具毫无问题地杀死(使用kill或任何类型的任务管理器)
于 2013-09-08T16:44:30.357 回答