racket/collects/ffi/examples/xmmsctrl.rkt
2010-04-27 16:50:15 -06:00

110 lines
4.2 KiB
Racket

#lang scheme/base
(require mzlib/foreign) (unsafe!)
(define libxmms (ffi-lib "libxmms"))
(provide session)
(define session
(make-parameter
0 (lambda (x)
(if (integer? x)
x
(error 'xmms-session "expecting an integer, got ~s" x)))))
;; used for playlist position values
(define _pos _int)
;; number of equalizer bands
(define eq-bands 10)
;; used for getting the default session from the session parameter
(define-fun-syntax _session
(syntax-id-rules (_session)
[_session (type: _int pre: (session))]))
(define-syntax defxmms
(syntax-rules (:)
[(_ name : x ...)
(begin
(provide name)
(define name
(get-ffi-obj
(regexp-replaces
'name '((#rx"-" "_") (#rx"[?]$" "") (#rx"^" "xmms_remote_")))
libxmms (_fun x ...))))]))
(defxmms playlist : (files enqueue?) ::
_session
(files : (_list i _string))
(_int = (length files))
(enqueue? : _bool)
-> _void)
(defxmms get-version : _session -> _int)
;; The second argument is a GList (see glib/glist.h) which requires structs,
;; but the playlist function is sufficient (looks like this is for glib code).
;; (defxmms playlist-add : _session "GList * list" -> _void)
(defxmms playlist-delete : _session _pos -> _void)
(defxmms play : _session -> _void)
(defxmms pause : _session -> _void)
(defxmms stop : _session -> _void)
(defxmms is-playing? : _session -> _bool)
(defxmms is-paused? : _session -> _bool)
(defxmms get-playlist-pos : _session -> _pos)
(defxmms set-playlist-pos : _session _pos -> _void)
(defxmms get-playlist-length : _session -> _pos)
(defxmms playlist-clear : _session -> _void)
(defxmms get-output-time : _session -> _int)
(defxmms jump-to-time : _session _int -> _void)
(defxmms get-volume : _session (l : (_ptr o _int)) (r : (_ptr o _int))
-> _void -> (list l r))
(defxmms get-main-volume : _session -> _int)
(defxmms get-balance : _session -> _int)
(defxmms set-volume : _session (l : _int) (r : _int) -> _void)
(defxmms set-main-volume : _session _int -> _void)
(defxmms set-balance : _session _int -> _void)
(defxmms get-skin : _session -> _file)
(defxmms set-skin : _session _file -> _void)
(defxmms get-playlist-file : _session _pos -> _string)
(defxmms get-playlist-title : _session _pos -> _string)
(defxmms get-playlist-time : _session _pos -> _int)
(defxmms get-info : _session
(rate : (_ptr o _int))
(freq : (_ptr o _int))
(nch : (_ptr o _int))
-> _void -> (list rate freq nch))
(defxmms main-win-toggle : _session (show? : _bool) -> _void)
(defxmms pl-win-toggle : _session (show? : _bool) -> _void)
(defxmms eq-win-toggle : _session (show? : _bool) -> _void)
(defxmms is-main-win? : _session -> _bool)
(defxmms is-pl-win? : _session -> _bool)
(defxmms is-eq-win? : _session -> _bool)
(defxmms show-prefs-box : _session -> _void)
(defxmms toggle-aot : _session (ontop? : _bool) -> _void)
(defxmms eject : _session -> _void)
(defxmms playlist-prev : _session -> _void)
(defxmms playlist-next : _session -> _void)
(defxmms playlist-add-url-string : _session _string -> _void)
(defxmms is-running? : _session -> _bool)
(defxmms toggle-repeat : _session -> _void)
(defxmms toggle-shuffle : _session -> _void)
(defxmms is-repeat? : _session -> _bool)
(defxmms is-shuffle? : _session -> _bool)
(defxmms get-eq : _session
(preamp : (_ptr o _float))
(bands : (_ptr o _pointer))
-> _void
-> (cons preamp (cblock->list bands _float eq-bands)))
(defxmms get-eq-preamp : _session -> _float)
(defxmms get-eq-band : _session (band : _int) -> _float)
(defxmms set-eq : (l) ::
_session
(preamp : _float = (car l))
(bands : (_list i _float) = (cdr l))
-> _void)
(defxmms set-eq-preamp : _session (preamp : _float) -> _void)
(defxmms set-eq-band : _session (band : _int) _float -> _void)
(defxmms quit : _session -> _void)
(defxmms play-pause : _session -> _void)
(defxmms playlist-ins-url-string : _session _string _pos -> _void)