mp3-file.lisp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. ;;; -*- Mode: Lisp; show-trailing-whitespace: t; Base: 10; indent-tabs: nil; Syntax: ANSI-Common-Lisp; Package: MP3-FILE; -*-
  2. ;;; Copyright (c) 2013, Mark VandenBrink. All rights reserved.
  3. (in-package :mp3-file)
  4. (log5:defcategory cat-log-mp3-file)
  5. (defmacro log-mp3-file (&rest log-stuff) `(log5:log-for (cat-log-mp3-file) ,@log-stuff))
  6. (defclass mp3-file (base-file:base-file)
  7. ((header :accessor header :initform nil))
  8. (:documentation "Class to access mp3 files"))
  9. (defun make-mp3-file (filename read-only &key)
  10. "Convenience function to create an instance of MP3-FILE with appropriate init args.
  11. NB: we assume non-syncsafe as default"
  12. (log5:with-context "make-mp3-file"
  13. (log-mp3-file "opening ~a" filename)
  14. (let (handle)
  15. (handler-case
  16. (progn
  17. (setf handle (make-instance 'mp3-file :filename filename :endian :little-endian :read-only read-only))
  18. (with-slots (header) handle
  19. (log-mp3-file "getting frames")
  20. (setf header (mp3-frame:find-mp3-frames handle))))
  21. (condition (c)
  22. (warn "make-mp3-file got condition: ~a" c)
  23. (when handle (base-file:close-audio-file handle))
  24. (setf handle nil)))
  25. handle)))
  26. (defmethod read-sync-safe-u32 ((me mp3-file))
  27. "Read a sync-safe integer from file. Used by mp3 files"
  28. (let* ((ret 0))
  29. (setf (ldb (byte 7 21) ret) (base-file:read-u8 me))
  30. (setf (ldb (byte 7 14) ret) (base-file:read-u8 me))
  31. (setf (ldb (byte 7 7) ret) (base-file:read-u8 me))
  32. (setf (ldb (byte 7 0) ret) (base-file:read-u8 me))
  33. ret))