Mercurial > hg > audiodb
view bindings/sb-alien/library.lisp @ 580:633614461994
API for retrieving a track's data.
A new function, audiodb_retrieve_datum() fills a provided adb_datum_t
structure with the data corresponding to a given database key; the
companion audiodb_free_datum() function frees the data in a given datum
appropriately.
Just in case, I continue to require passing in the adb_t * as the first
argument to audiodb_free_datum(), even though it's not currently used:
I couldn't convince myself that _all_ possible implementations could
free a datum without reference to the adb_t.
This meant rewriting the internal code to use a new internal
audiodb_really_free_datum() function, which audiodb_free_datum() also
calls.
Sanity-checked by implementing a binding in sb-alien to this function,
lightly-tested.
All this fixes ticket:20 in Trac.
author | mas01cr |
---|---|
date | Tue, 14 Jul 2009 15:35:36 +0000 |
parents | 3141e51cb077 |
children | 1b3b303957bd |
line wrap: on
line source
(in-package "SB-ADB") (defmacro define-int-checking-function (name arglist llname) `(defun ,name ,arglist (let ((result (,llname ,@arglist))) (unless (eql 0 result) (error "~S on ~{~S ~}failed." ',name (list ,@arglist)))))) (defmacro define-pointer-checking-function (name arglist llname) `(defun ,name ,arglist (let ((result (,llname ,@arglist))) (when (null-alien result) (error "~S on ~{~S ~}failed." ',name (list ,@arglist))) result))) (define-alien-type adb-t (struct adb)) (define-alien-routine ("audiodb_open" %%open) (* adb-t) (path c-string) (flags int)) (define-pointer-checking-function %open (path flags) %%open) (define-alien-routine ("audiodb_create" %%create) (* adb-t) (path c-string) (datasize (unsigned 32)) (ntracks (unsigned 32)) (datadim (unsigned 32))) (define-pointer-checking-function %create (path datasize ntracks datadim) %%create) (define-alien-routine ("audiodb_l2norm" %%l2norm) int (adb (* adb-t))) (define-int-checking-function %l2norm (adb) %%l2norm) (define-alien-routine ("audiodb_power" %%power) int (adb (* adb-t))) (define-int-checking-function %power (adb) %%power) (define-alien-type adb-datum-t (struct adb-datum (nvectors (unsigned 32)) (dim (unsigned 32)) (key c-string) (data (* double)) (power (* double)) (times (* double)))) (define-alien-routine ("audiodb_insert_datum" %%insert-datum) int (adb (* adb-t)) (datum (* adb-datum-t))) (define-int-checking-function %insert-datum (adb datum) %%insert-datum) (define-alien-routine ("audiodb_retrieve_datum" %%retrieve-datum) int (adb (* adb-t)) (key c-string) (datum (* adb-datum-t))) (define-int-checking-function %retrieve-datum (adb key datum) %%retrieve-datum) (define-alien-routine ("audiodb_free_datum" %%free-datum) int (adb (* adb-t)) (datum (* adb-datum-t))) (define-int-checking-function %free-datum (adb datum) %%free-datum) (define-alien-type adb-status-t (struct adb-status (nfiles (unsigned 32)) (dim (unsigned 32)) (ignore1 (unsigned 32)) (ignore2 (unsigned 32)) (flags (unsigned 32)) (length (unsigned 64)) (data-region-size (unsigned 64)))) (define-alien-routine ("audiodb_status" %%status) int (adb (* adb-t)) (status (* adb-status-t))) (define-int-checking-function %status (adb datum) %%status) (define-alien-type adb-query-id-t (struct adbqueryid (datum (* adb-datum-t)) (sequence-length (unsigned 32)) (flags (unsigned 32)) (sequence-start (unsigned 32)))) (define-alien-type adb-query-parameters-t (struct adbqueryparameters (accumulation (unsigned 32)) (distance (unsigned 32)) (npoints (unsigned 32)) (ntracks (unsigned 32)))) (define-alien-type adb-keylist-t (struct adbkeylist (nkeys (unsigned 32)) (keys (* c-string)))) (define-alien-type adb-query-refine-t (struct adbqueryrefine (flags (unsigned 32)) (include adb-keylist-t) (exclude adb-keylist-t) (radius double) (absolute-threshold double) (relative-threshold double) (duration-ratio double) (hopsize (unsigned 32)))) (define-alien-type adb-query-spec-t (struct adbqueryspec (qid adb-query-id-t) (params adb-query-parameters-t) (refine adb-query-refine-t))) (define-alien-type adb-result-t (struct adbresult (key c-string) (dist double) (qpos (unsigned 32)) (ipos (unsigned 32)))) (define-alien-type adb-query-results-t (struct adbqueryresults (nresults (unsigned 32)) (results (* adb-result-t)))) (define-alien-routine ("audiodb_query_spec" %%query) (* adb-query-results-t) (adb (* adb-t)) (spec (* adb-query-spec-t))) (define-pointer-checking-function %query (adb spec) %%query) (define-alien-routine ("audiodb_query_free_results" %%free-query-results) int (adb (* adb-t)) (spec (* adb-query-spec-t)) (results (* adb-query-results-t))) (define-int-checking-function %free-query-results (adb spec results) %%free-query-results) (define-alien-routine ("audiodb_close" %close) void (adb (* adb-t)))