SBT & Scala 音频系统

SBT & Scala AudioSystem

我有一个 st运行ge 问题,我已经尝试解决了一段时间。 我有一个使用 Scala 和 Spray 构建的应用程序,它使用 AudioSystem API。 我使用 SBT 构建和测试应用程序。 我有一个扩展 "App" 的 boot.scala。 如果我通过 Eclipse(没有 sbt)(运行 As...Scala App)将以下代码放在 boot.scala 和 运行 中,它 运行 没问题...

val stream:AudioInputStream = AudioSystem.getAudioInputStream(new File("test.wav"))
val audioFormat:AudioFormat = stream.getFormat();
val samplingRate = audioFormat.getSampleRate()
println("Sampling Rate: "+samplingRate)

文件的采样率按预期输出。 我在类似于...

的 Specs2 路由测试中有相同的代码
"API" should {
  "Respond to POST requests" in {
    val stream:AudioInputStream = AudioSystem.getAudioInputStream(new File("test.wav"))
    val audioFormat:AudioFormat = stream.getFormat();
    val samplingRate = audioFormat.getSampleRate()
    println("Sampling Rate: "+samplingRate)
    ...

然而,当我使用 "sbt test" 从终端执行此操作时,出现以下错误...

UnsupportedAudioFileException: : could not get audio input stream from input file

我知道文件 (test.wav) 没问题,因为我可以播放它并且通过 Eclipse 执行代码工作正常。终端(及其编码)看起来也不错,因为我将一个测试文件放在一起,该文件只是 运行 相同的几行代码并且 运行 它成功地来自终端。

这个问题似乎只发生在 SBT 上!

有人有什么想法吗?

谢谢

经过几天的搜索终于找到了答案...

Why does AudioSystem.getMixerInfo() return different results under sbt vs Scala?

"This is a classloader issue. javax.sound does NOT like having the context classloader be anything other than the system classloader." 我的解决方法是...

val cl = classOf[javax.sound.sampled.AudioSystem].getClassLoader
val old = Thread.currentThread.getContextClassLoader

var audioFormat:AudioFormat = null
try {
  Thread.currentThread.setContextClassLoader(cl)
  val stream:AudioInputStream = 
    AudioSystem.getAudioInputStream(new ByteArrayInputStream(data))
  audioFormat = stream.getFormat()
} finally Thread.currentThread.setContextClassLoader(old)

谢谢