I need to read WAV files, and don't have time to recode the reader in
Clojure. It's Java, and it's got side effects. I can read a number
of frames from the WAV file with this code:
(defn read-frames [wav-file num-frames]
(let [num-samples (* num-frames (.getNumChannels wav-file))
buffer (double-array num-samples)
frames-read (.readFrames wav-file buffer 0 num-frames)]
(if (= frames-read num-frames)
(vec buffer)
nil)))
So this is pretty straightforward...it uses this wav-file object,
calls .readFrames() on it which reads into an array of doubles (passed
in as buffer) and returns a vector of these values. Every time you
call this function, it returns the next num-frames values as a vector,
so it's operating by side effects.
I want to make a seq of reading these frames. I thought I might use
repeatedly, but it doesn't know to stop when the f returns nil. So I
just coded it myself:
(defn wavfile-chunk-seq [num-frames wav-file]
(lazy-seq (let [x (read-frames wav-file num-frames)]
(if (nil? x)
'()
(cons x (wavfile-chunk-seq num-frames wav-file))))))
Only problem is, it's holding onto its head somehow. When I (count
(wavfile-chunk-seq n wav-file)) and check memory, it's all still there
somehow. I'm 99% positive the WAV file object in Java isn't retaining
the memory, because it uses a much smaller buffer.
Can anybody see what I'm doing wrong? Maybe I should change my
approach, and try to generate a Java Iterator over these values, and
just use iterator-seq?
Thanks in advance for any ideas...
Mike
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en