]> git.jsancho.org Git - gacela.git/blobdiff - gacela_sound.lisp
(no commit message)
[gacela.git] / gacela_sound.lisp
index ae9b72ba57c164dac08de9de1fc32200b91c4f72..e1b2a1e8a157b33a81740e6d08f1428471049285 100644 (file)
           (in-package 'gacela :nicknames '(gg) :use '(lisp)))
 
 
+;;; Sound
+
+(defun load-sound (filename &key static)
+  (let ((key (make-resource-sound :filename filename)))
+    (cond ((get-resource key) key)
+         (t (true-load-sound filename static)))))
+
+(defun true-load-sound (filename static)
+  (init-audio)
+  (let ((key (make-resource-sound :filename filename))
+       (sound (Mix_LoadWAV filename)))
+    (cond ((/= sound 0)
+          (set-resource key
+                        `(:id-sound ,sound)
+                        (lambda () (true-load-sound filename static))
+                        (lambda () (Mix_FreeChunk sound))
+                        :static static)
+          key))))
+
+(defun play-sound (sound &optional (loops 0))
+  (let ((id-sound (getf (get-resource sound) :id-sound)))
+    (/= (Mix_PlayChannel -1 id-sound loops) -1)))
+
+
+;;; Music
+
+(defun load-music (filename &key static)
+  (let ((key (make-resource-music :filename filename)))
+    (cond ((get-resource key) key)
+         (t (true-load-music filename static)))))
+
+(defun true-load-music (filename static)
+  (init-audio)
+  (let ((key (make-resource-music :filename filename))
+       (music (Mix_LoadMUS filename)))
+    (cond ((/= music 0)
+          (set-resource key
+                        `(:id-music ,music)
+                        (lambda () (true-load-music filename static))
+                        (lambda () (Mix_FreeMusic music))
+                        :static static)
+          key))))
+
+(defun playing-music? ()
+  (/= (Mix_PlayingMusic) 0))
+
+(defun paused-music? ()
+  (/= (Mix_PausedMusic) 0))
+
+(defun play-music (music &optional (loops -1))
+  (cond ((not (playing-music?))
+        (let ((id-music (getf (get-resource music) :id-music)))
+          (/= (Mix_PlayMusic id-music loops) -1)))))
+
+(defun pause-music ()
+  (cond ((and (playing-music?) (not (paused-music?)))
+        (Mix_PauseMusic)
+        t)))
+
+(defun resume-music ()
+  (cond ((and (playing-music?) (paused-music?))
+        (Mix_ResumeMusic)
+        t)))
+
+(defun halt-music ()
+  (cond ((playing-music?)
+        (Mix_HaltMusic)
+        t)))