PageRenderTime 49ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/scala-2.12/dk/mehmedbasic/audiobook/conversion/SingleFileConversion.scala

https://bitbucket.org/mehmedbasic/scalaudiobookconverter
Scala | 67 lines | 46 code | 14 blank | 7 comment | 3 complexity | dc8a6d50b6edf138b3b4b8e35ec509ff MD5 | raw file
  1. package dk.mehmedbasic.audiobook.conversion
  2. import java.io._
  3. import javazoom.jl.decoder.{Bitstream, Header}
  4. import javazoom.jl.player.{AudioDeviceBase, Player}
  5. import akka.actor.Actor
  6. import dk.mehmedbasic.audiobook.event.EventPublisher
  7. import dk.mehmedbasic.audiobook.execution.WorkerMessage.{Result, Work}
  8. import dk.mehmedbasic.audiobook.execution._
  9. import dk.mehmedbasic.audiobook.io.CountingInputStream
  10. /**
  11. * Converts a source file to an mp4 aac audio file.
  12. *
  13. * @author Jesenko Mehmedbasic
  14. * created 09-01-13, 21:06
  15. */
  16. //noinspection LanguageFeature
  17. class SingleFileConversion extends Actor with EventPublisher {
  18. def convert(inputFile: File): File = {
  19. val config: AudioConfig = determineConfig(inputFile)
  20. val factory: ConversionCommandFactory = new ConversionCommandFactory(inputFile, config)
  21. conversionStarted(inputFile)
  22. val process = factory.createProcess()
  23. val deviceStream = process.getOutputStream
  24. val device = new OutputStreamAudioDevice(deviceStream)
  25. val player: Player = new Player(inputFile, device)
  26. player.play()
  27. conversionEnded(inputFile)
  28. new File(factory.getOutput)
  29. }
  30. override def receive: Receive = {
  31. case Work(inputFile: File) =>
  32. context.parent ! Result(inputFile, convert(inputFile))
  33. }
  34. def determineConfig(file: File): AudioConfig = {
  35. try {
  36. val sourceStream: BufferedInputStream = new BufferedInputStream(new FileInputStream(file))
  37. val stream: Bitstream = new Bitstream(sourceStream)
  38. val header: Header = stream.readFrame
  39. val channels = if (header.mode() == Header.SINGLE_CHANNEL) {
  40. 1
  41. } else {
  42. 2
  43. }
  44. stream.close()
  45. AudioConfig(channels, header.frequency())
  46. } catch {
  47. case e: Exception => throw new RuntimeException(e)
  48. }
  49. }
  50. implicit def fileToInputStream(file: File): InputStream = new CountingInputStream(file)
  51. implicit def conversionCommandFactoryToAudioDeviceBase(factory: ConversionCommandFactory): AudioDeviceBase
  52. = new OutputStreamAudioDevice(factory.createProcess().getOutputStream)
  53. }