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