summaryrefslogtreecommitdiff
path: root/strigoform/audio.scm
diff options
context:
space:
mode:
Diffstat (limited to 'strigoform/audio.scm')
-rw-r--r--strigoform/audio.scm55
1 files changed, 55 insertions, 0 deletions
diff --git a/strigoform/audio.scm b/strigoform/audio.scm
new file mode 100644
index 0000000..1c89025
--- /dev/null
+++ b/strigoform/audio.scm
@@ -0,0 +1,55 @@
+(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))))))))