суббота, 3 марта 2012 г.

Проигрываем wav файл на clojure

В свою игру я захотел добавить немного звука и стал разбираться с тем, как из 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)))

Тут присутствует магия с потоками, которая позволяет отслеживать окончание проигрывания клипа и закрывать ресурсы по окончанию.

Комментариев нет:

Отправить комментарий