OK, I’m not completely out of the woods yet. What I have now is:
(defn record-student-sound!
[phrase-no]
(.info js/console "Recording student sound for phrase " phrase-no)
(try
(.then (.getUserMedia (.mediaDevices js/navigator) {:audio true})
(fn [arg]
(let [media-recorder (js/MediaRecorder. arg)
audio-chunks (atom [])]
(set! (.-onerror media-recorder)
(fn [s]
(.log js/console (str "Error while recording sound: " s))))
(.addEventListener media-recorder "dataavailable"
(fn [event]
(.info js/console "Audio recorded...")
(swap! audio-chunks conj (.-data event))))
(set! (.-onstop media-recorder)
(fn [e]
(js/console.log "data available after MediaRecorder.stop() called.")
(when (> (count @audio-chunks) 0)
(swap! student-recordings assoc phrase-no
(js/Blob. (clj->js @audio-chunks))))))
(.start media-recorder))))
(catch js/Error e
(.log js/console
(str "Error thrown while recording sound: " (.-message e))))
(catch :default x
(str "Unexpected object thrown while recording " x))))
What I’m getting is
Error thrown while recording sound: f is not a function
The message ‘Audio recorded…’ is never printed, so I’m guessing the f that ‘is not a function’ is the handler for dataavailable But I don’t understand why it isn’t, or that is needed.