Mark VandenBrink il y a 12 ans
Parent
commit
10a3558a53
4 fichiers modifiés avec 21 ajouts et 11 suppressions
  1. 14 6
      mp4-atom.lisp
  2. 3 0
      packages.lisp
  3. 0 1
      taglib-tests.lisp
  4. 4 4
      taglib.asd

+ 14 - 6
mp4-atom.lisp

@@ -577,11 +577,13 @@ call traverse atom (unless length of path == 1, in which case, we've found our m
     (log-mp4-atom "traverse: ~a not found" path)
     nil))
 
+(defvar *ilst-data* (list +mp4-atom-moov+ +mp4-atom-udta+ +mp4-atom-meta+ +mp4-atom-ilst+ nil +itunes-ilst-data+))
+
 (defmethod tag-get-value (atoms node)
   "Helper function to extract text from ILST atom's data atom"
   (declare #.utils:*standard-optimize-settings*)
-  (aif (traverse atoms
-                 (list +mp4-atom-moov+ +mp4-atom-udta+ +mp4-atom-meta+ +mp4-atom-ilst+ node +itunes-ilst-data+))
+  (setf (nth 4 *ilst-data*) node)
+  (aif (traverse atoms *ilst-data*)
        (atom-value it)
        nil))
 
@@ -595,13 +597,19 @@ call traverse atom (unless length of path == 1, in which case, we've found our m
                         (when (= (atom-type atom) +itunes-ilst-data+)
                           (format out-stream "~vt~a~%" depth (vpprint atom nil))))))
 
+;;; define these as constants to limit consing when get-audio-properties-atoms is called
+(defconstant +audio-prop-mdia+ (list +mp4-atom-moov+ +mp4-atom-trak+ +mp4-atom-mdia+))
+(defconstant +audio-prop-mdhd+ (list +audioprop-mdhd+))
+(defconstant +audio-prop-mp4a+ (list +mp4-atom-minf+ +mp4-atom-stbl+ +audioprop-mp4a+))
+(defconstant +audio-prop-esds+ (list +audioprop-esds+))
+
 (defun get-audio-properties-atoms (mp4-file)
   "Get the audio property atoms from MP4-FILE"
   (declare #.utils:*standard-optimize-settings*)
-  (let* ((mdia       (traverse (mp4-atoms mp4-file) (list +mp4-atom-moov+ +mp4-atom-trak+ +mp4-atom-mdia+)))
-         (mdhd       (traverse mdia (list +audioprop-mdhd+)))
-         (audioprop1 (traverse mdia (list +mp4-atom-minf+ +mp4-atom-stbl+ +audioprop-mp4a+)))
-         (audioprop2 (traverse audioprop1 (list +audioprop-esds+))))
+  (let* ((mdia       (traverse (mp4-atoms mp4-file) +audio-prop-mdia+))
+         (mdhd       (traverse mdia +audio-prop-mdhd+))
+         (audioprop1 (traverse mdia +audio-prop-mp4a+))
+         (audioprop2 (traverse audioprop1 +audio-prop-esds+)))
     (if (and mdhd audioprop1 audioprop2)
         (values mdhd audioprop1 audioprop2)
         nil)))

+ 3 - 0
packages.lisp

@@ -2,6 +2,9 @@
 ;;; Copyright (c) 2013, Mark VandenBrink. All rights reserved.
 (in-package #:cl-user)
 
+(defpackage #:tree
+  (:use #:common-lisp))
+
 (defpackage #:utils
   (:export #:warn-user *break-on-warn-user* #:printable-array #:upto-null
            #:redirect #:memoize #:it #:*standard-optimize-settings*

+ 0 - 1
taglib-tests.lisp

@@ -22,7 +22,6 @@
 (defun set-pathname-encoding-for-osx ()   (set-pathname-encoding :utf-8))
 (defun set-pathname-encoding-for-linux () (set-pathname-encoding nil))
 
-
 (defun do-audio-file (&optional (file *song-m4a*) &key (func (constantly t)))
   "Parse one audio file (with condition handling)."
   (let ((foo))

+ 4 - 4
taglib.asd

@@ -1,6 +1,5 @@
-;;; taglib.asd
+;;; -*- Mode: Lisp;  show-trailing-whitespace: t; Base: 10; indent-tabs: nil; Syntax: ANSI-Common-Lisp; Package: CL-USER; -*-
 ;;; Copyright (c) 2013, Mark VandenBrink. All rights reserved.
-;;;
 
 (asdf:defsystem #:taglib
   :description "Pure Lisp implementation to read (and write, perhaps, one day) tags"
@@ -8,13 +7,14 @@
   :license "Public Domain"
   :depends-on (#:log5 #:optima #:optima.ppcre)
   :components ((:file "packages")
-			   (:file "profile"       :depends-on ("packages"))
+               (:file "profile"       :depends-on ("packages"))
                (:file "utils"         :depends-on ("packages"))
+               (:file "tree"          :depends-on ("packages"))
                (:file "audio-streams" :depends-on ("packages" "utils"))
                (:file "mpeg"          :depends-on ("packages" "audio-streams" "utils"))
                (:file "iso-639-2"     :depends-on ("packages" "utils"))
                (:file "id3-frame"     :depends-on ("packages" "utils"))
-			   (:file "flac-frame"    :depends-on ("packages" "utils"))
+               (:file "flac-frame"    :depends-on ("packages" "utils"))
                (:file "abstract-tag"  :depends-on ("packages" "id3-frame" "audio-streams" "mp4-atom" "utils"))
                (:file "logging"       :depends-on ("packages" "mp4-atom" "audio-streams" "utils"))
                (:file "mp4-atom"      :depends-on ("packages" "utils"))))