В свою игру я захотел добавить немного звука и стал разбираться с тем, как из clojure воспроизводить звук. Проще всего оказалось применить код из примера работы со звуком . Пример большой. Java поддерживает многие возможности работы со звуком, я выдрал самый простой вариант, когда проигрывается .wav файл, загружаясь целиком в память.
Открываем поток:
(defn create-stream [file]
(AudioSystem/getAudioInputStream file))
Создаем объект Info описывающий наш звуковой файл
(defn create-info [stream]
(let [format (.getFormat stream)]
(DataLine$Info. Clip
format
(* (.getFrameLength stream)
(.getFrameSize format)))))
По объекту Info создаем Clip для проигрывания
(defn create-clip [info]
(AudioSystem/getLine info))
Вот так выглядит код проигрывающий файл:
(defn play [file]
(let [stream (create-stream file)
clip (create-clip (create-info stream))]
(.open clip stream)
(.start clip)
(Thread/sleep 99)
(loop [active (.isActive clip)]
(if active
(do
(Thread/sleep 99)
(recur (.isActive clip)))))
(.stop clip)
(.close clip)))
Тут присутствует магия с потоками, которая позволяет отслеживать окончание проигрывания клипа и закрывать ресурсы по окончанию.