mas01cr@401: #include "audioDB.h" mas01cr@401: extern "C" { mas01cr@401: #include "audioDB_API.h" mas01cr@401: #include "audioDB-internals.h" mas01cr@401: } mas01cr@401: mas01cr@401: static int audiodb_l2norm_existing(adb_t *adb) { mas01cr@401: double *data_buffer, *l2norm_buffer; mas01cr@401: adb_header_t *header = adb->header; mas01cr@401: size_t data_buffer_size = ALIGN_PAGE_UP(header->length); mas01cr@401: size_t nvectors = header->length / (sizeof(double) * header->dim); mas01cr@401: /* FIXME: this map of the vector data will lose if we ever turn the mas01cr@401: * l2norm flag on when we have already inserted a large number of mas01cr@401: * vectors, as the mmap() will fail. "Don't do that, then" is one mas01cr@401: * possible answer. */ mas01cr@401: mmap_or_goto_error(double *, data_buffer, header->dataOffset, data_buffer_size); mas01cr@401: l2norm_buffer = (double *) malloc(nvectors * sizeof(double)); mas01cr@401: if(!l2norm_buffer) { mas01cr@401: goto error; mas01cr@401: } mas01cr@426: audiodb_l2norm_buffer(data_buffer, header->dim, nvectors, l2norm_buffer); mas01cr@401: if(lseek(adb->fd, adb->header->l2normTableOffset, SEEK_SET) == (off_t) -1) { mas01cr@401: goto error; mas01cr@401: } mas01cr@410: write_or_goto_error(adb->fd, l2norm_buffer, nvectors * sizeof(double)); mas01cr@401: mas01cr@401: munmap(data_buffer, data_buffer_size); mas01cr@401: free(l2norm_buffer); mas01cr@401: mas01cr@401: return 0; mas01cr@401: mas01cr@401: error: mas01cr@401: maybe_munmap(data_buffer, data_buffer_size); mas01cr@401: if(l2norm_buffer) { mas01cr@401: free(l2norm_buffer); mas01cr@401: } mas01cr@401: return 1; mas01cr@401: } mas01cr@401: mas01cr@401: int audiodb_l2norm(adb_t *adb) { mas01cr@401: adb_header_t *header = adb->header; mas01cr@403: if(!(adb->flags & O_RDWR)) { mas01cr@403: return 1; mas01cr@403: } mas01cr@401: if(header->flags & O2_FLAG_L2NORM) { mas01cr@401: /* non-error code for forthcoming backwards-compatibility mas01cr@401: * reasons */ mas01cr@401: return 0; mas01cr@401: } mas01cr@401: if((!(header->flags & O2_FLAG_LARGE_ADB)) && (header->length > 0)) { mas01cr@401: if(audiodb_l2norm_existing(adb)) { mas01cr@401: goto error; mas01cr@401: } mas01cr@401: } mas01cr@401: adb->header->flags |= O2_FLAG_L2NORM; mas01cr@401: return audiodb_sync_header(adb); mas01cr@401: mas01cr@401: error: mas01cr@401: return 1; mas01cr@401: }