1. Walton Hoops
  2. cl-taglib

Source

cl-taglib / cl-taglib.lisp

;;;; cl-taglib.lisp

(in-package #:cl-taglib)

;;; "cl-taglib" goes here. Hacks and glory await!
(define-foreign-library taglib
  (t (:default "libtag_c")))

(use-foreign-library taglib)

(defcfun (set-strings-unicode "taglib_set_strings_unicode") :void
  (unicode :boolean))

(defcfun (set-string-management "taglib_set_string_management_enabled") :void
  (mangement :boolean))

(defcfun (free "taglib_free") :void
  (str :pointer))

(defcfun (file-new "taglib_file_new") :pointer
  (filename :string))

(defcfun (file-free "taglib_file_free") :void
  (file :pointer))

(defcfun (file-is-valid "taglib_file_is_valid") :boolean
  (file :pointer))

(defcfun (file-tag "taglib_file_tag") :pointer
  (file :pointer))

;;; taglib_file_audioproperties
(defcfun (file-save "taglib_file_save") :boolean
  (file :pointer))

(defmacro taglib-accessor-for (slot)
  (let ((function-name (intern (concatenate 'string "TAG-" (string slot))))
	(foreign-name (string-downcase (concatenate 'string "taglib_tag_" (string slot))))
	(foreign-set-name (string-downcase (concatenate 'string "taglib_tag_set_" (string slot)))))
    `(progn
       (defun ,function-name (tag)
	 (let ((str-ptr (foreign-funcall ,foreign-name :pointer tag :string+ptr)))
	   (foreign-funcall "taglib_free" :pointer (cadr str-ptr) :void)
	   (car str-ptr)))
       (defun (setf ,function-name) (value tag)
	 (foreign-funcall ,foreign-set-name :pointer tag :string value :void)))))

(taglib-accessor-for :title)
(taglib-accessor-for :artist)
(taglib-accessor-for :album)
(taglib-accessor-for :comment)
(taglib-accessor-for :genre)
(taglib-accessor-for :year)
(taglib-accessor-for :track)