Скала - Воспроизведение звука
Я пытаюсь сделать что-то для того, чтобы иметь beep
или же sound
в течение 2-3 минут, когда процесс выполняется в моем приложении. В настоящее время у меня есть это:
object SoundPlay {
import scala.collection.mutable.ListBuffer
val bb = new ListBuffer[Any]
def main(args: Array[String]) {
val beep = java.awt.Toolkit.getDefaultToolkit.beep
for (i <- 1 to 100) {
bb += beep
}
bb.foreach(println(_))
}
}
но этот издает только один звук, и я не могу повторить его больше, чем один раз.?!
Мое ОБНОВЛЕНИЕ
Я написал это и является своего рода:
object SoundPlay {
def main(args: Array[String]) {
for(i <- 1 to 10) {
Thread.sleep(1000)
java.awt.Toolkit.getDefaultToolkit.beep()
}
}
}
2 ответа
Решение
beep
противный побочный метод. Если вы хотите повторить это, вам придется захватить его через что-то вроде скалаза Task
:
import scalaz._, Scalaz._, concurrent.Task
val beepTask = Task(java.awt.Toolkit.getDefaultToolkit.beep)
//traverse so we gather the 100 Tasks into a single Task
val bb = (1 to 100).toList traverse {_ => beepTask}
//everything is "lazy" until we call run, that's when the beeps actually happen
bb.run
Вы добавляете в Buffer
результат звонка beep
(который void
). Это означает, что звуковой сигнал подается один раз как побочный эффект, а результат void сохраняется в переменной.
Возможно, вы хотите определить действие, которое вызывает звуковой сигнал, используя лямбда-выражение или (как в следующем коде) частичное применение звукового сигнала.
object SoundPlay {
import scala.collection.mutable.ListBuffer
import java.awt.Toolkit._
val bb = ListBuffer[() => Unit]() //a buffer of functions
def main(args: Array[String]) {
val beep = getDefaultToolkit.beep _ //this is a function with no arg
for (i <- 1 to 100) {
bb += beep
}
bb.foreach { case b =>
println(b())
Thread.sleep(500) // This pause is to hear the separate beeps
}
}
}