diff --git a/nyquist/init.lsp b/nyquist/init.lsp index 87a73fbe4..775527068 100644 --- a/nyquist/init.lsp +++ b/nyquist/init.lsp @@ -45,7 +45,7 @@ (funcall underscore txt))) -;;; A couple of helpers for parsing strings returned by (aud-do "GetInfo: ... +;;; Some helpers for parsing strings returned by (aud-do "GetInfo: ... (defun eval-string (string) ;;; Evaluate a string as a LISP expression. @@ -55,3 +55,22 @@ (defmacro quote-string (string) ;;; Prepend a single quote to a string `(setf ,string (format nil "\'~a" ,string))) + +(defun aud-get-info (str) + ;;; Return "GetInfo: type=type" as Lisp list, or throw error + ;;; Audacity 2.3.0 does not fail if type is not recognised, it + ;;; falls back to a default, so test for valid types. + ;;; 'Commands+' is not supported in Audacity 2.3.0 + (let (type + info + (types '("Commands" "Menus" "Preferences" + "Tracks" "Clips" "Envelopes" "Labels" "Boxes"))) + ;Case insensitive search, then set 'type' with correct case string, or NIL. + (setf type (first (member str types :test 'string-equal))) + (if (not type) + (error (format nil "bad argument '~a' in (aud-get-info ~a)" str str))) + (setf info (aud-do (format nil "GetInfo: type=~a format=LISP" type))) + (if (not (last info)) + (error (format nil "(aud-get-info ~a) failed.~%" str))) + (let ((info-string (first info))) + (eval-string (quote-string info-string)))))