Oh, now I understand! I close the stream (in the with-open) in the main thread before the other thread got a chance to play it.
On Monday, December 31, 2012 3:49:25 AM UTC+1, Oskar Kvist wrote: > > Ok, here is some more code: > > The line (-> in Player. .play) nil)) in the first function is what I'm > trying to wrap in a future. The first two functions are basically what is > used when trying to play a sound. The other 3 is the "main loop" part of my > program. I don't think anything else is relevant. > > (defn play-mp3 [name] > (with-open [in (jio/input-stream (str audiodir name ".mp3"))] > (-> in Player. .play) nil)) > > (defn play > ([words-map] (play words-map "1")) > ([words-map n] (let [mp3-n (min (Integer/parseInt n) (:mp3s @last-info))] > (if (and @last-word (pos? mp3-n)) > (play-mp3 (str @last-word mp3-n)) > {:output "play what?"})))) > > (def cmds (let [cmds ["add" "delete" "random" "show" "help" "play"] > cmds (zipmap cmds (map #(ns-resolve 'dictionary.core > (symbol %)) cmds))] > (conj cmds ["key" pron-key] ["lookup" lookup-cmd]))) > > (defn handle [cmd] > (let [[cmd & args] (str/split cmd #"\s+") > matching (starts-with-in cmd cmds)] > (when (= 1 (count matching)) > (let [{:keys [output new-words-map]} > (apply (val (first matching)) @words-atom args)] > (if output (println output)) > (if new-words-map (reset! words-atom new-words-map)))) > (if (and (or (.startsWith "exit" cmd) (.startsWith "quit" cmd)) (pos? > (count cmd))) > false > true))) > > > (defn -main [& args] > (def words-atom (atom (load-words))) > (loop [] > (print "> ") (flush) > (let [cmd (read-line)] > (println) > (when (handle cmd) > (println) > (store-words @words-atom) > (recur)))) > (shutdown-agents)) > > On Monday, December 31, 2012 12:12:09 AM UTC+1, Moritz Ulrich wrote: >> >> Laziness might be your problem, but that wouldn't explain (println >> "called") working without a deref. >> >> Can you show a bit more code around this call to `future'? >> >> On Sun, Dec 30, 2012 at 8:31 AM, Oskar Kvist <oskar...@gmail.com> wrote: >> > Hi! >> > >> > I'm trying to play a sound in my application, using >> > http://www.javazoom.net/javalayer/documents.html that lib. Anyway, I >> tried >> > playing the sound in a future, so the main thread would not block while >> > playing, like so: (future (-> in Player. .play)). But if I don't deref >> the >> > future, the sound does not play. If I do deref it, the sound plays, but >> I >> > have to wait for it, which is what I wanted to avoid. If I do (future >> (do >> > (println "called") (-> in Player. .play))), without a deref, it prints >> > "called" but does still not play the sound. If I do (future (do (-> in >> > Player. .play) (println "called"))), without a deref, it neither prints >> nor >> > plays. What could be wrong? >> > >> > I'm using clojure 1.4.0 and `lein trampoline run -m ns/main` to run my >> > program. >> > >> > -- >> > You received this message because you are subscribed to the Google >> > Groups "Clojure" group. >> > To post to this group, send email to clo...@googlegroups.com >> > Note that posts from new members are moderated - please be patient with >> your >> > first post. >> > To unsubscribe from this group, send email to >> > clojure+u...@googlegroups.com >> > For more options, visit this group at >> > http://groups.google.com/group/clojure?hl=en >> > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en