Mercurial > hg > audiodb
view l2norm.cpp @ 401:a8a5f2ca5380 api-inversion
Invert audioDB::l2norm / audiodb_l2norm()
We now have some functions that shouldn't be exported to the user of the
library, but are used in more than one source file; case in point:
audiodb_sync_header(). Make a new audioDB-internals.h file for them,
and while we're at it put the scary mmap()-related macros in there too.
We can't delete audioDB::unitNormAndInsertL2() quite yet, because it's
used in insertion too, but we can delete the non-append branches.
That's not very much code to lose, but every little helps.
author | mas01cr |
---|---|
date | Wed, 03 Dec 2008 14:53:20 +0000 |
parents | |
children | 7038f31124d1 |
line wrap: on
line source
#include "audioDB.h" extern "C" { #include "audioDB_API.h" #include "audioDB-internals.h" } static int audiodb_l2norm_existing(adb_t *adb) { double *data_buffer, *l2norm_buffer; double *dp, *lp; adb_header_t *header = adb->header; size_t data_buffer_size = ALIGN_PAGE_UP(header->length); size_t nvectors = header->length / (sizeof(double) * header->dim); /* FIXME: this map of the vector data will lose if we ever turn the * l2norm flag on when we have already inserted a large number of * vectors, as the mmap() will fail. "Don't do that, then" is one * possible answer. */ mmap_or_goto_error(double *, data_buffer, header->dataOffset, data_buffer_size); l2norm_buffer = (double *) malloc(nvectors * sizeof(double)); if(!l2norm_buffer) { goto error; } dp = data_buffer; lp = l2norm_buffer; for(size_t i = 0; i < nvectors; i++) { *lp = 0; for(unsigned int k = 0; k < header->dim; k++) { *lp += (*dp)*(*dp); dp++; } lp++; } if(lseek(adb->fd, adb->header->l2normTableOffset, SEEK_SET) == (off_t) -1) { goto error; } if(write(adb->fd, l2norm_buffer, nvectors * sizeof(double)) != (ssize_t) (nvectors * sizeof(double))) { goto error; } munmap(data_buffer, data_buffer_size); free(l2norm_buffer); return 0; error: maybe_munmap(data_buffer, data_buffer_size); if(l2norm_buffer) { free(l2norm_buffer); } return 1; } int audiodb_l2norm(adb_t *adb) { adb_header_t *header = adb->header; if(header->flags & O2_FLAG_L2NORM) { /* non-error code for forthcoming backwards-compatibility * reasons */ return 0; } if((!(header->flags & O2_FLAG_LARGE_ADB)) && (header->length > 0)) { if(audiodb_l2norm_existing(adb)) { goto error; } } adb->header->flags |= O2_FLAG_L2NORM; return audiodb_sync_header(adb); error: return 1; }