(library (strigoform audio) (export load-audio audio-play audio-pause audio-volume set-audio-volume! set-audio-loop! audio-seek load-sound-effect sound-effect-play) (import (scheme base) (hoot ffi) (hoot match) (only (hoot syntax) define*) (strigoform element)) (define-foreign load-audio "audio" "new" (ref string) -> (ref null extern)) (define-foreign audio-play "audio" "play" (ref null extern) -> none) (define-foreign audio-pause "audio" "pause" (ref null extern) -> none) (define-foreign audio-volume "audio" "volume" (ref null extern) -> f64) (define-foreign set-audio-volume! "audio" "setVolume" (ref null extern) f64 -> none) (define-foreign set-audio-loop! "audio" "setLoop" (ref null extern) i32 -> none) (define-foreign audio-seek "audio" "seek" (ref null extern) f64 -> none) ;; So we can play many overlapping audio samples at once. (define (load-sound-effect src) (let* ((k 32) (audio (load-audio src)) (vec (make-vector k))) (do ((i 0 (+ i 1))) ((= i k)) (vector-set! vec i (clone-element audio))) (vector 0 vec))) (define* (sound-effect-play sound #:optional (volume 1.0)) (match sound (#(i vec) (let ((audio (vector-ref vec i))) (set-audio-volume! audio volume) (audio-play audio) (vector-set! sound 0 (modulo (+ i 1) (vector-length vec))))))))