scala - 为什么AudioSystem.getMixerInfo()在sbt和Scala下返回不同的结果?

标签 scala audio sbt

经过大量问题隔离后,我得到了以下片段:

object Snippet  {
    def main(args: Array[String]): Unit = {
        println("Snip demo:: "+ util.Properties.versionString)
        println(" jvm "+System.getProperty("java.version"))
        import javax.sound.sampled._
        val mixers : Array[Mixer.Info] = javax.sound.sampled.AudioSystem.getMixerInfo()
        println(" Numer of mixers: "+ mixers.size)
        for (mi : Mixer.Info <- mixers ) { 
            println("mixer info "+mi.getName) 
        } 
    }
}

令人惊讶的是,运行sbt run之后的输出与运行scala不同:
$ sbt run
Loading /cygdrive/c/Program Files (x86)/sbt/bin/sbt-launch-lib.bash
[warn] The global sbt directory is now versioned and is located at         ....
[warn]   You are seeing this warning because there is global configuration ....
[warn]   The global sbt directory may be changed via the sbt.global.base system property.
[info] Set current project to snippet (in build file:/Documents/SbtProjects/Snippet/)
[info] Compiling 1 Scala source to Documents\SbtProjects\Snippet\target\scala-2.10\classes...
[info] Running Snippet
Snip demo:: version 2.10.2
 jvm 1.7.0_21
 Numer of mixers: 0
[success] Total time: 3 s, completed 10-Jun-2014 15:35:34

$ scala src/main/scala/snippet.scala
Snip demo:: version 2.10.2
 jvm 1.7.0_21
 Numer of mixers: 12
 mixer info Primary Sound Driver
 mixer info Speakers (Plantronics C320)
 mixer info Realtek Digital Output (Realtek High Definition Audio)
 mixer info Speakers (Realtek High Definition Audio)
 mixer info Realtek Digital Output(Optical) (Realtek High Definition Audio)
 mixer info Primary Sound Capture Driver
 mixer info Microphone (Plantronics C320)
 mixer info Port Speakers (Plantronics C320)
 mixer info Port Realtek Digital Output (Realtek
 mixer info Port Speakers (Realtek High Definiti
 mixer info Port Realtek Digital Output(Optical)
 mixer info Port Microphone (Plantronics C320)

我一定错过了一些非常基本的东西。任何帮助,非常感谢。

最佳答案

这是一个类加载器问题。 javax.sound不喜欢让上下文类加载器不是系统类加载器。这可以在本地为我修复:

object Snippet  {
    def main(args: Array[String]): Unit = {
        println("Snip demo:: "+ util.Properties.versionString)
        println(" jvm "+System.getProperty("java.version"))
        import javax.sound.sampled._
        val cl = classOf[javax.sound.sampled.AudioSystem].getClassLoader
        val old = Thread.currentThread.getContextClassLoader
        try {
          Thread.currentThread.setContextClassLoader(cl)
          val mixers : Array[Mixer.Info] = javax.sound.sampled.AudioSystem.getMixerInfo()
          println(" Numer of mixers: "+ mixers.size)
          for (mi : Mixer.Info <- mixers ) { 
            println("mixer info "+mi.getName) 
          }
       } finally Thread.currentThread.setContextClassLoader(old) 
    }
}

并输出:
> run
[info] Compiling 1 Scala source to /home/jsuereth/projects/sbt/diagnose/sound-issues/target/scala-2.10/classes...
[info] Running Snippet 
Snip demo:: version 2.10.4
 jvm 1.7.0_55
 Numer of mixers: 9
mixer info default [default]
mixer info PCH [plughw:0,0]
mixer info NVidia [plughw:1,3]
mixer info NVidia [plughw:1,7]
mixer info NVidia [plughw:1,8]
mixer info NVidia [plughw:1,9]
mixer info Port PCH [hw:0]
mixer info Port NVidia [hw:1]
mixer info Port Unknown Name
[success] Total time: 2 s, completed Aug 1, 2014 11:00:03 AM
> 

关于scala - 为什么AudioSystem.getMixerInfo()在sbt和Scala下返回不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24145198/

相关文章:

java - 从字节数组中提取 WAV 文件

sbt - 如何在sbt中指定ivy版本?

scala - SBT - 总是出现 Unresolved 依赖错误

scala - 为什么这些隐式转换会导致循环代码

scala - 使用 scala.reflect.runtime.universe 动态调用 Scala 中对象的方法?

ios - 如何使用 Swift 使用 TheAmazingAudioEngine 播放音频文件?

facebook - 如何在Facebook上的服务器中播放音频文件?可能吗?

json - Play + Anorm + Postgres - 将 json 值加载到案例类中

scala - VarArgs A* vs Seq[A] 参数起作用

scala - 运行时的真实 SBT 类路径