mas01cr@498
|
1 extern "C" {
|
mas01cr@498
|
2 #include "audioDB_API.h"
|
mas01cr@509
|
3 }
|
mas01cr@498
|
4 #include "audioDB-internals.h"
|
mas01cr@498
|
5
|
mas01cr@498
|
6 static int audiodb_l2norm_existing(adb_t *adb) {
|
mas01mc@519
|
7 double *data_buffer = 0, *l2norm_buffer = 0;
|
mas01cr@498
|
8 adb_header_t *header = adb->header;
|
mas01cr@509
|
9 size_t data_buffer_size = align_page_up(header->length);
|
mas01cr@498
|
10 size_t nvectors = header->length / (sizeof(double) * header->dim);
|
mas01cr@498
|
11 /* FIXME: this map of the vector data will lose if we ever turn the
|
mas01cr@498
|
12 * l2norm flag on when we have already inserted a large number of
|
mas01cr@498
|
13 * vectors, as the mmap() will fail. "Don't do that, then" is one
|
mas01cr@498
|
14 * possible answer. */
|
mas01cr@498
|
15 mmap_or_goto_error(double *, data_buffer, header->dataOffset, data_buffer_size);
|
mas01cr@498
|
16 l2norm_buffer = (double *) malloc(nvectors * sizeof(double));
|
mas01cr@498
|
17 if(!l2norm_buffer) {
|
mas01cr@498
|
18 goto error;
|
mas01cr@498
|
19 }
|
mas01cr@498
|
20 audiodb_l2norm_buffer(data_buffer, header->dim, nvectors, l2norm_buffer);
|
mas01cr@498
|
21 if(lseek(adb->fd, adb->header->l2normTableOffset, SEEK_SET) == (off_t) -1) {
|
mas01cr@498
|
22 goto error;
|
mas01cr@498
|
23 }
|
mas01cr@498
|
24 write_or_goto_error(adb->fd, l2norm_buffer, nvectors * sizeof(double));
|
mas01cr@498
|
25
|
mas01cr@498
|
26 munmap(data_buffer, data_buffer_size);
|
mas01cr@498
|
27 free(l2norm_buffer);
|
mas01cr@498
|
28
|
mas01cr@498
|
29 return 0;
|
mas01cr@498
|
30
|
mas01cr@498
|
31 error:
|
mas01cr@498
|
32 maybe_munmap(data_buffer, data_buffer_size);
|
mas01cr@498
|
33 if(l2norm_buffer) {
|
mas01cr@498
|
34 free(l2norm_buffer);
|
mas01cr@498
|
35 }
|
mas01cr@498
|
36 return 1;
|
mas01cr@498
|
37 }
|
mas01cr@498
|
38
|
mas01cr@498
|
39 int audiodb_l2norm(adb_t *adb) {
|
mas01cr@498
|
40 adb_header_t *header = adb->header;
|
mas01cr@498
|
41 if(!(adb->flags & O_RDWR)) {
|
mas01cr@498
|
42 return 1;
|
mas01cr@498
|
43 }
|
mas01cr@509
|
44 if(header->flags & ADB_HEADER_FLAG_L2NORM) {
|
mas01cr@498
|
45 /* non-error code for forthcoming backwards-compatibility
|
mas01cr@498
|
46 * reasons */
|
mas01cr@498
|
47 return 0;
|
mas01cr@498
|
48 }
|
mas01cr@509
|
49 if((!(header->flags & ADB_HEADER_FLAG_REFERENCES)) && (header->length > 0)) {
|
mas01cr@498
|
50 if(audiodb_l2norm_existing(adb)) {
|
mas01cr@498
|
51 goto error;
|
mas01cr@498
|
52 }
|
mas01cr@498
|
53 }
|
mas01cr@509
|
54 adb->header->flags |= ADB_HEADER_FLAG_L2NORM;
|
mas01cr@498
|
55 return audiodb_sync_header(adb);
|
mas01cr@498
|
56
|
mas01cr@498
|
57 error:
|
mas01cr@498
|
58 return 1;
|
mas01cr@498
|
59 }
|