utils.lisp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. (in-package :cl-user)
  2. (defpackage chad-music.utils
  3. (:use :cl #:audio-streams #:alexandria)
  4. (:export #:*standard-optimize-settings*
  5. #:text-tag
  6. #:bit-rate
  7. #:is-vbr
  8. #:duration))
  9. (in-package :chad-music.utils)
  10. (eval-when (:compile-toplevel :load-toplevel :execute)
  11. #+dbg
  12. (defvar *standard-optimize-settings* '(optimize (debug 3)))
  13. #-dbg
  14. (defvar *standard-optimize-settings* '(optimize (speed 3) (safety 0) (space 0) (debug 0))))
  15. (defgeneric text-tag (stream desc) (:method ((object t) desc) nil))
  16. (defmethod text-tag ((mp3 id3:mp3-file) desc)
  17. (declare #.*standard-optimize-settings*)
  18. (loop for frame in (id3:get-frames mp3 '("TXXX"))
  19. when (string-equal (id3:desc frame) desc)
  20. do (return-from text-tag (id3:val frame))))
  21. (defgeneric bit-rate (stream) (:method ((object t)) nil))
  22. (defgeneric is-vbr (stream) (:method ((object t)) nil))
  23. (defgeneric duration (stream) (:method ((object t)) nil))
  24. (defmethod bit-rate ((mp3 id3:mp3-file))
  25. (let ((info (id3:audio-info mp3)))
  26. (when info
  27. (round (mpeg::bit-rate info) 1000))))
  28. (defmethod is-vbr ((mp3 id3:mp3-file))
  29. (let ((info (id3:audio-info mp3)))
  30. (when info
  31. (mpeg::is-vbr info))))
  32. (defmethod duration ((mp3 id3:mp3-file))
  33. (let ((info (id3:audio-info mp3)))
  34. (when info
  35. (mpeg::len info))))
  36. (defmethod bit-rate ((m4a m4a:mp4-file))
  37. (let ((info (m4a:audio-info m4a)))
  38. (when info
  39. (round (m4a::avg-bit-rate info) 1000))))
  40. (defmethod duration ((m4a m4a:mp4-file))
  41. (let ((info (m4a:audio-info m4a)))
  42. (when info
  43. (m4a::seconds info))))