Alsaplayer en ligne de commande avec sbcl

Ce programme a été écrit sous Debian wheezy avec les packages sbcl et cd-discid installés sur ma machine : sudo apt-get install sbcl cd-discid.
J'ai écrit ce programme pour remplacer cdcd qui ne fonctionne plus avec un lecteur usb externe. Il n'est pas si bien fait que cdcd. Cela provient de mon manque de compĂ©tence mais aussi du fait que alsaplayer-text est encore en dĂ©veloppement. Par exemple avec l'option status on a des informations sur la piste qui est en cours mais il n'y a pas d'option qui donne la liste des toutes les pistes d'un seul coup. Il y a aussi l'option --jump # qui ne fonctionne pas etc ... Si quelqu'un peut l'améliorer je suis preneur : gerarobin@gmail.com

Nommer ce programme playcd par exemple.
Le rendre executable : chmod u+x playcd
Pour l'executer ./playcd ou playcd s'il est dans le repertoire /home/user/bin et que ce repertoire est dans la variable PATH
Remaque:
Il y a plusieurs implantations du langage lisp, par exemple il y a clisp mais ce programme ne fonctionne pas tel quel avec clisp.
;; debut de playcd

#!/usr/bin/sbcl --script

(defparameter *frame* "===============")
(defparameter *title* "ALSAPLAYER-TEXT")
(defparameter *tilde* #\~)
(defparameter *run* (process-exit-code (run-program "/bin/ps" '("-C" "alsaplayer"))))

(defun prompt ()
(format t "alsaplayer> "))

(format t "~33\t~a~%~33\t~a~%~33\t~a~%~%" *frame* *title* *frame*)
(format t "~10\tListen to audio CDs with alsaplayer (http://www.alsaplayer.org/)~%~%")
(format t "~10\tFirst of all you must edit the ~aalsaplayer/config file.~%" *tilde*)
(format t "~10\tComplement or add the following lines:~%~%")
(format t " ~11\t1 cdda.cddb_servername=freedb.freedb.org~%")
(format t " ~11\t2 cdda.cddb_serverport=8880~%")
(format t " ~11\t3 cdda.device=/dev/sr0 ;; replace /dev/sr0 by the good path in your box.~%")
(format t " ~11\t4 cdda.do_cddb_lookup=true~%~%")
(format t " ~14\tTo play a CD, type: play, then Enter~%")
(format t " ~14\tTo exit alsaplayer, keep playing, type quit and Enter~%")
(format t " ~14\tTo stop the CD, if it is playing, type stop and Enter~%")
(format t " ~14\tEnter ? for more help~%~%")
(prompt)

(let ((answer t) (cpt 0) (cdinout))
(loop
(finish-output) ;; empty the buffer each time through the loop
(setf answer (read))
(setf cdinout (process-exit-code (run-program "/usr/bin/cd-discid" '("/dev/sr0"))))
(finish-output)
(cond ((equal answer '?) (format t " ?, play, quit, prev, next, stop, pause, unpause, status~%")
(prompt))

((equal answer 'quit) (return))

((equal answer 'stop) (run-program "/usr/bin/alsaplayer" '("--quit"))
(setf cpt 0 *run* 1)
(prompt))

((equal answer 'play) (cond ((and (zerop cpt) (eq *run* 1) (eq cdinout 0))
(incf cpt)
(run-program "/usr/bin/alsaplayer" '("-q" "CD.cdda") :wait nil)
(prompt))
((eq cdinout 1) (format t "No disk in drive~% ")
(prompt)
(t (format t "Alsaplayer is already playing a CD~%")
(prompt))))

((equal answer 'prev) (run-program "/usr/bin/alsaplayer" '("--prev"))
(prompt))

((equal answer 'next) (run-program "/usr/bin/alsaplayer" '("--next"))
(prompt))

((equal answer 'pause) (run-program "/usr/bin/alsaplayer" '("--pause"))
(prompt))

((equal answer 'unpause) (run-program "/usr/bin/alsaplayer" '("--start"))
(prompt))

((equal answer 'status) (run-program "/usr/bin/alsaplayer" '("--status") :output *standard-output*)
(prompt))

(t (format t "Unknow command~%")
(prompt)))))

;; fin de playcd