anchor.diff:     (revision       :accessor revision       :initarg :revision       :initform 0   :documentation "ID3 revision---is this ever non-zero?")
      (flags          :accessor flags          :initarg :flags          :initform 0   :documentation "ID3 header flags")
      (size           :accessor size           :initarg :size           :initform 0   :documentation "size of ID3 info")
  +   (padding-size   :accessor padding-size   :initarg :padding-size   :initform 0   :documentation "padding size in tags")
      (ext-header     :accessor ext-header     :initarg :ext-header     :initform nil :documentation "holds v2.3/4 extended header")
      (frames         :accessor frames         :initarg :frames         :initform nil :documentation "holds ID3 frames")
      (v21-tag-header :accessor v21-tag-header :initarg :v21-tag-header :initform nil :documentation "old-style v2.1 header (if present)"))
  
positive.code:            (header-footer-p ,flags)))
  
  (defmethod vpprint ((me id3-header) stream)
    (with-slots (version revision flags v21-tag-header size ext-header frames) me
      (format stream "~a"
              (with-output-to-string (s)
                (format s "Header: version/revision: ~d/~d, flags: ~a, size = ~:d bytes; ~a; ~a"
                        version revision (print-header-flags nil flags) size
                        (if (and (header-extended-p flags) ext-header)
                            (concatenate 'string "Extended header: " (vpprint ext-header nil))
                            "No extended header")
  
negative.code:   "Parse an MP3 file"
    (declare #.utils:*standard-optimize-settings*)
  
    (let ((parsed-info))
      (labels ((read-loop (version stream)
                 (let (frames this-frame)
                   (do ()
                       ((>= (stream-seek stream) (stream-size stream)))
                     (handler-case
                         (progn
                           (setf this-frame (make-frame version stream
                                                        (stream-filename instream)))
                           (when (null this-frame)
                             (setf (padding-size (id3-header parsed-info))
                                   (- (stream-size stream)
                                      (stream-seek stream)))
                             (return-from read-loop (values t (nreverse frames))))
  
                           (push this-frame frames))
                       (condition (c)
                         (warn-user "file ~a:~%Id3 parse-audio-file got condition ~a"
                                    audio-streams:*current-file* c)
                         (return-from read-loop (values nil (nreverse frames))))))
  
                   (values t (nreverse frames))))) ; frames in "file order"
  
        (setf parsed-info (make-instance 'mp3-file
                                         :filename (stream-filename instream)))
        (setf (id3-header parsed-info) (make-instance 'id3-header :instream instream))
        (with-slots (size ext-header frames flags version) (id3-header parsed-info)
  
  