diff options
author | Ricardo Wurmus <rekado@elephly.net> | 2018-11-14 17:06:13 +0100 |
---|---|---|
committer | Ricardo Wurmus <rekado@elephly.net> | 2018-11-15 00:39:18 +0100 |
commit | d069601d7bdf027b7e2e29deab339abe696ba657 (patch) | |
tree | 4c787c6edb4315d7c6faca22c0f7043b784660b2 /engine | |
parent | 4116f2ccf02cda8c3a083a62aa91e4e3956dfb73 (diff) |
Replace (chickadee audio).
Diffstat (limited to 'engine')
-rw-r--r-- | engine/audio.scm | 148 | ||||
-rw-r--r-- | engine/scene.scm | 2 |
2 files changed, 149 insertions, 1 deletions
diff --git a/engine/audio.scm b/engine/audio.scm new file mode 100644 index 0000000..3a6b1a8 --- /dev/null +++ b/engine/audio.scm @@ -0,0 +1,148 @@ +;;; Chickadee Game Toolkit +;;; Copyright © 2017 David Thompson <davet@gnu.org> +;;; Copyright © 2018 Ricardo Wurmus <rekado@elephly.net> +;;; +;;; Chickadee is free software: you can redistribute it and/or modify +;;; it under the terms of the GNU General Public License as published +;;; by the Free Software Foundation, either version 3 of the License, +;;; or (at your option) any later version. +;;; +;;; Chickadee is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program. If not, see +;;; <http://www.gnu.org/licenses/>. + +;;; Commentary: +;; +;; Sound effects and music. +;; +;;; Code: + +(define-module (engine audio) + #:use-module (ice-9 format) + #:use-module (srfi srfi-9) + #:use-module (srfi srfi-9 gnu) + #:use-module ((sdl2 mixer) #:prefix sdl2:) + #:export (load-sample + sample? + sample-audio + set-sample-volume! + play-sample + load-music + music? + music-audio + music-volume + play-music + set-music-volume! + pause-music + resume-music + rewind-music + stop-music + music-paused? + music-playing?)) + +(define (enable-audio) + ;; The SDL mixer will throw an exception if it cannot initialize a + ;; particular audio format. We don't want this to be fatal, so we + ;; ignore it. + (false-if-exception (sdl2:mixer-init)) + (sdl2:open-audio)) + +;; Used to wrap SDL audio functions whose return values should be +;; ignored. +(define-syntax-rule (ignore-value body ...) + (begin + body ... + *unspecified*)) + +;; Wrapper over SDL audio objects. +(define-record-type <sample> + (make-sample audio) + sample? + (audio sample-audio)) + +(define (display-sample sample port) + (format port "#<sample ~x>" (object-address sample))) + +(set-record-type-printer! <sample> display-sample) + +(define (load-sample file) + "Load audio sample from FILE." + (let ((audio (sdl2:load-chunk file))) + (if audio + (make-sample audio) + (error "cannot load audio sample:" file)))) + +(define* (set-sample-volume! volume #:optional (channel #f)) + "Set the volume that all samples are played at to VOLUME, a floating +point value between 0 and 1." + (ignore-value + (sdl2:set-channel-volume! channel (inexact->exact (round (* volume 128.0)))))) + +(define* (play-sample sample #:optional (channel #f)) + "Play SAMPLE." + (ignore-value + ;; An exception will be thrown if too many samples are being played + ;; at once, but it can be safely ignored. + (false-if-exception + (sdl2:play-chunk! (sample-audio sample))))) + +;; Wrapper over SDL music objects. +(define-record-type <music> + (make-music audio) + music? + (audio music-audio)) + +(define (display-music music port) + (format port "#<music ~x>" (object-address music))) + +(set-record-type-printer! <music> display-music) + +(define (load-music file) + "Load music from FILE." + (make-music (sdl2:load-music file))) + +(define (music-volume) + "Return the volume level for music, a floating point value between +0 and 1." + (/ (sdl2:music-volume) 128.0)) + +(define (set-music-volume! volume) + "Set the volume that music is played at to VOLUME, a floating point +value between 0 and 1." + (ignore-value + (sdl2:set-music-volume! + (inexact->exact (round (* volume 128.0)))))) + +(define* (play-music music #:key loop?) + "Play MUSIC. If LOOP?, play it over and over and over and over +and..." + (sdl2:play-music! (music-audio music) (if loop? #f 1))) + +(define (pause-music) + "Pause the current music track." + (sdl2:pause-music!)) + +(define (resume-music) + "Resume the current music track." + (sdl2:resume-music!)) + +(define (rewind-music) + "Restart the current music track from the beginning." + (sdl2:rewind-music!)) + +(define (stop-music) + "Stop playing the current music track." + (sdl2:stop-music!)) + +(define (music-playing?) + "Return #t if music is currently playing." + (sdl2:music-playing?)) + +(define (music-paused?) + "Return #t if music is currently paused." + (sdl2:music-paused?)) diff --git a/engine/scene.scm b/engine/scene.scm index b47a30e..ecb8f0d 100644 --- a/engine/scene.scm +++ b/engine/scene.scm @@ -16,7 +16,7 @@ ;;; <http://www.gnu.org/licenses/>. (define-module (engine scene) - #:use-module (chickadee audio) + #:use-module (engine audio) #:use-module (engine node-2d) #:use-module (oop goops) #:export (<scene> |