mas01cr@498
|
1 #ifndef AUDIODB_API_H
|
mas01cr@498
|
2 #define AUDIODB_API_H
|
mas01cr@498
|
3
|
mas01cr@498
|
4 #include <stdbool.h>
|
mas01cr@498
|
5 #include <stdint.h>
|
mas01cr@498
|
6
|
mas01ik@355
|
7 /* for API questions contact
|
mas01ik@355
|
8 * Christophe Rhodes c.rhodes@gold.ac.uk
|
mas01ik@355
|
9 * Ian Knopke mas01ik@gold.ac.uk, ian.knopke@gmail.com */
|
mas01ik@355
|
10
|
mas01cr@498
|
11 /* Temporary workarounds */
|
mas01cr@498
|
12 int acquire_lock(int, bool);
|
mas01cr@498
|
13 int divest_lock(int);
|
mas01cr@498
|
14
|
mas01ik@355
|
15
|
mas01ik@355
|
16 /*******************************************************************/
|
mas01ik@355
|
17 /* Data types for API */
|
mas01ik@355
|
18
|
mas01cr@498
|
19 /* FIXME: it might be that "adb_" isn't such a good prefix to use, and
|
mas01cr@498
|
20 that we should prefer "audiodb_". Or else maybe we should be
|
mas01cr@498
|
21 calling ourselves libadb? */
|
mas01cr@670
|
22 typedef struct adb adb_t;
|
mas01ik@355
|
23
|
mas01cr@670
|
24 typedef struct adb_datum {
|
mas01cr@498
|
25 uint32_t nvectors;
|
mas01cr@498
|
26 uint32_t dim;
|
mas01cr@498
|
27 const char *key;
|
mas01cr@498
|
28 double *data;
|
mas01cr@498
|
29 double *power;
|
mas01cr@498
|
30 double *times;
|
mas01cr@670
|
31 } adb_datum_t;
|
mas01ik@355
|
32
|
mas01cr@670
|
33 typedef struct adb_reference {
|
mas01cr@498
|
34 const char *features;
|
mas01cr@498
|
35 const char *power;
|
mas01cr@498
|
36 const char *key;
|
mas01cr@498
|
37 const char *times;
|
mas01cr@670
|
38 } adb_reference_t, adb_insert_t;
|
mas01ik@355
|
39
|
mas01ik@355
|
40 /* struct for returning status results */
|
mas01cr@670
|
41 typedef struct adb_status {
|
mas01ik@355
|
42 unsigned int numFiles;
|
mas01ik@355
|
43 unsigned int dim;
|
mas01ik@355
|
44 unsigned int dudCount;
|
mas01ik@355
|
45 unsigned int nullCount;
|
mas01ik@355
|
46 unsigned int flags;
|
mas01cr@498
|
47 uint64_t length;
|
mas01cr@498
|
48 uint64_t data_region_size;
|
mas01cr@670
|
49 } adb_status_t;
|
mas01ik@355
|
50
|
mas01cr@670
|
51 typedef struct adb_result {
|
mas01cr@672
|
52 const char *qkey;
|
mas01cr@672
|
53 const char *ikey;
|
mas01cr@498
|
54 uint32_t qpos;
|
mas01cr@498
|
55 uint32_t ipos;
|
mas01cr@672
|
56 double dist;
|
mas01cr@498
|
57 } adb_result_t;
|
mas01cr@498
|
58
|
mas01cr@498
|
59 #define ADB_REFINE_INCLUDE_KEYLIST 1
|
mas01cr@498
|
60 #define ADB_REFINE_EXCLUDE_KEYLIST 2
|
mas01cr@498
|
61 #define ADB_REFINE_RADIUS 4
|
mas01cr@498
|
62 #define ADB_REFINE_ABSOLUTE_THRESHOLD 8
|
mas01cr@498
|
63 #define ADB_REFINE_RELATIVE_THRESHOLD 16
|
mas01cr@498
|
64 #define ADB_REFINE_DURATION_RATIO 32
|
mas01cr@498
|
65 #define ADB_REFINE_HOP_SIZE 64
|
mas01cr@498
|
66
|
mas01cr@673
|
67 typedef struct adb_keylist {
|
mas01cr@498
|
68 uint32_t nkeys;
|
mas01cr@498
|
69 const char **keys;
|
mas01cr@498
|
70 } adb_keylist_t;
|
mas01cr@498
|
71
|
mas01cr@673
|
72 typedef struct adb_query_refine {
|
mas01cr@498
|
73 uint32_t flags;
|
mas01cr@498
|
74 adb_keylist_t include;
|
mas01cr@498
|
75 adb_keylist_t exclude;
|
mas01cr@498
|
76 double radius;
|
mas01cr@498
|
77 double absolute_threshold;
|
mas01cr@498
|
78 double relative_threshold;
|
mas01cr@498
|
79 double duration_ratio; /* expandfactor */
|
mas01cr@675
|
80 uint32_t qhopsize;
|
mas01cr@675
|
81 uint32_t ihopsize;
|
mas01cr@498
|
82 } adb_query_refine_t;
|
mas01cr@498
|
83
|
mas01cr@498
|
84 #define ADB_ACCUMULATION_DB 1
|
mas01cr@498
|
85 #define ADB_ACCUMULATION_PER_TRACK 2
|
mas01cr@498
|
86 #define ADB_ACCUMULATION_ONE_TO_ONE 3
|
mas01cr@498
|
87
|
mas01cr@498
|
88 #define ADB_DISTANCE_DOT_PRODUCT 1
|
mas01cr@498
|
89 #define ADB_DISTANCE_EUCLIDEAN_NORMED 2
|
mas01cr@498
|
90 #define ADB_DISTANCE_EUCLIDEAN 3
|
mas01mc@768
|
91 #define ADB_DISTANCE_KULLBACK_LEIBLER_DIVERGENCE 4
|
mas01cr@498
|
92
|
mas01cr@673
|
93 typedef struct adb_query_parameters {
|
mas01cr@498
|
94 uint32_t accumulation;
|
mas01cr@498
|
95 uint32_t distance;
|
mas01cr@498
|
96 uint32_t npoints;
|
mas01cr@498
|
97 uint32_t ntracks;
|
mas01cr@498
|
98 } adb_query_parameters_t;
|
mas01cr@498
|
99
|
mas01cr@673
|
100 typedef struct adb_query_results {
|
mas01cr@498
|
101 uint32_t nresults;
|
mas01cr@498
|
102 adb_result_t *results;
|
mas01cr@498
|
103 } adb_query_results_t;
|
mas01cr@498
|
104
|
mas01cr@498
|
105 #define ADB_QID_FLAG_EXHAUSTIVE 1
|
mas01cr@498
|
106 #define ADB_QID_FLAG_ALLOW_FALSE_POSITIVES 2
|
mas01cr@498
|
107
|
mas01cr@673
|
108 typedef struct adb_queryid {
|
mas01cr@498
|
109 adb_datum_t *datum;
|
mas01cr@498
|
110 uint32_t sequence_length;
|
mas01cr@498
|
111 uint32_t flags;
|
mas01cr@498
|
112 uint32_t sequence_start;
|
mas01cr@498
|
113 } adb_query_id_t;
|
mas01cr@498
|
114
|
mas01cr@673
|
115 typedef struct adb_query_spec {
|
mas01cr@498
|
116 adb_query_id_t qid;
|
mas01cr@498
|
117 adb_query_parameters_t params;
|
mas01cr@498
|
118 adb_query_refine_t refine;
|
mas01cr@498
|
119 } adb_query_spec_t;
|
mas01ik@355
|
120
|
mas01cr@673
|
121 typedef struct adb_track_entry {
|
mas01cr@548
|
122 uint32_t nvectors;
|
mas01cr@548
|
123 const char *key;
|
mas01cr@548
|
124 } adb_track_entry_t;
|
mas01cr@548
|
125
|
mas01cr@673
|
126 typedef struct adb_liszt_results {
|
mas01cr@548
|
127 uint32_t nresults;
|
mas01cr@548
|
128 adb_track_entry_t *entries;
|
mas01cr@548
|
129 } adb_liszt_results_t;
|
mas01cr@548
|
130
|
mas01ik@355
|
131 /*******************************************************************/
|
mas01ik@355
|
132 /* Function prototypes for API */
|
mas01ik@355
|
133
|
mas01ik@355
|
134 /* open an existing database */
|
mas01ik@355
|
135 /* returns a struct or NULL on failure */
|
mas01cr@670
|
136 adb_t *audiodb_open(const char *path, int flags);
|
mas01ik@355
|
137
|
mas01ik@355
|
138 /* create a new database */
|
mas01ik@355
|
139 /* returns a struct or NULL on failure */
|
mas01cr@670
|
140 adb_t *audiodb_create(const char *path, unsigned datasize, unsigned ntracks, unsigned datadim);
|
mas01ik@355
|
141
|
mas01ik@355
|
142 /* close a database */
|
mas01cr@670
|
143 void audiodb_close(adb_t *adb);
|
mas01ik@355
|
144
|
mas01ik@355
|
145 /* You'll need to turn both of these on to do anything useful */
|
mas01cr@670
|
146 int audiodb_l2norm(adb_t *adb);
|
mas01cr@670
|
147 int audiodb_power(adb_t *adb);
|
mas01ik@355
|
148
|
mas01ik@355
|
149 /* insert functions */
|
mas01cr@498
|
150 int audiodb_insert_datum(adb_t *, const adb_datum_t *);
|
mas01cr@498
|
151 int audiodb_insert_reference(adb_t *, const adb_reference_t *);
|
mas01ik@355
|
152
|
mas01ik@355
|
153 /* query function */
|
mas01cr@498
|
154 adb_query_results_t *audiodb_query_spec(adb_t *, const adb_query_spec_t *);
|
mas01cr@498
|
155 int audiodb_query_free_results(adb_t *, const adb_query_spec_t *, adb_query_results_t *);
|
mas01cr@498
|
156
|
mas01ik@355
|
157 /* database status */
|
mas01cr@670
|
158 int audiodb_status(adb_t *, adb_status_t *status);
|
mas01ik@355
|
159
|
mas01cr@580
|
160 /* retrieval of inserted data */
|
mas01cr@580
|
161 int audiodb_retrieve_datum(adb_t *, const char *, adb_datum_t *);
|
mas01cr@580
|
162 int audiodb_free_datum(adb_t *, adb_datum_t *);
|
mas01cr@580
|
163
|
mas01cr@580
|
164 /* various dump formats */
|
mas01cr@670
|
165 int audiodb_dump(adb_t *, const char *outputdir);
|
mas01ik@355
|
166
|
mas01cr@548
|
167 /* liszt */
|
mas01cr@548
|
168 adb_liszt_results_t *audiodb_liszt(adb_t *);
|
mas01cr@548
|
169 int audiodb_liszt_free_results(adb_t *, adb_liszt_results_t *);
|
mas01cr@548
|
170
|
mas01cr@693
|
171 /* sample */
|
mas01cr@693
|
172 adb_query_results_t *audiodb_sample_spec(adb_t *, const adb_query_spec_t *);
|
mas01cr@693
|
173
|
mas01cr@670
|
174 /* backwards compatibility */
|
mas01cr@670
|
175 int audiodb_insert(adb_t *, adb_insert_t *ins);
|
mas01cr@670
|
176 int audiodb_batchinsert(adb_t *, adb_insert_t *ins, unsigned int size);
|
mas01cr@670
|
177
|
mas01cr@498
|
178 #endif
|