+(defun emus-make-track (artist album title filename &optional pos)
+ (vector artist album title filename pos))
+
+(defun emus-track-artist (track)
+ (elt track 0))
+
+(defun emus-track-album (track)
+ (elt track 1))
+
+(defun emus-track-title (track)
+ (elt track 2))
+
+(defun emus-track-file (track)
+ (elt track 3))
+
+(defun emus-track-browser-pos (track)
+ (elt track 4))
+
+(defun emus-set-track-browser-pos (track pos)
+ (aset track 4 pos))
+
+(defun emus--load-library (then)
+ (unless emus--proc-in-use
+ (setq emus--proc-in-use t)
+ (emus--suspend-cp)
+ (setq emus-state 'stopped)
+ (let ((proc (emus-get-process))
+ (tagstr "")
+ (filenames (emus-get-audio-files)))
+ (setq emus-tracks nil)
+ (set-process-filter proc (lambda (proc string)
+ (setq tagstr (concat tagstr string))
+ (when (string-suffix-p "@P 1\n" string)
+ (add-to-list 'emus-tracks
+ (emus--make-track-from-tagstr (car filenames)
+ tagstr))
+ (setq tagstr "")
+ (setq filenames (cdr filenames))
+ (if filenames
+ (emus--send-cmd-raw "lp" (car filenames))
+ (set-process-filter proc nil)
+ (setq emus-tracks (reverse emus-tracks))
+ (emus--sort-tracks)
+ (unless emus-current-track
+ (setq emus-current-track (car emus-tracks)))
+ (funcall then)
+ (emus--resume-cp)
+ (setq emus--proc-in-use nil)))))
+ (emus--send-cmd-raw "lp" (car filenames)))))
+
+(defun emus--make-track-from-tagstr (filename tagstr)