2015-07-30 4 views
1

У меня странная проблема, которую я пытался выяснить некоторое время. У меня есть приложение, которое я создаю с помощью Scala & Spray и который использует AudioSystem API. Я строю и тестирую приложение, используя SBT. У меня есть boot.scala, который расширяет «приложение». Если я устанавливаю следующий код в boot.scala и запустить его через Eclipse (без SBT) (Run As ... Scala App) он работает отлично ...SBT & Scala AudioSystem

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» Я получаю следующее сообщение об ошибке ...

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

Я знаю, что файл (test.wav) в порядке, поскольку я могу воспроизвести его, и выполнение кода через Eclipse отлично работает. Терминал (и его кодировки) тоже выглядит нормально, поскольку я собрал тестовый файл, который просто запускает те же самые несколько строк кода и успешно запускает его с терминала.

Проблема возникает только при использовании SBT!

У кого-нибудь есть идеи?

Благодаря

+0

Кто-нибудь есть какие-либо идеи вообще?!?! Буквально вытаскивая мои волосы! – fatlog

+0

Я также нашел эту страницу, которая, как представляется, предлагает другим людям проблемы с доступом к API Java Audio в SBT ... http://alvinalexander.com/scala/how-to-run-scala-application-jar- файлы-набор-классы? NoCache = 1 # комментарий-7779 – fatlog

ответ

1

Наконец нашел ответ после того, как буквально дни поисков ...

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

«Это вопрос Загрузчик классов. Javax.sound НЕ нравится иметь контекст Загрузчик классов быть ничем иным, чем системный загрузчик классов ». и исправление для меня было ...

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) 

Благодаря

 Смежные вопросы

  • Нет связанных вопросов^_^