mas01cr@498: extern "C" { mas01cr@498: #include "audioDB_API.h" mas01cr@509: } mas01cr@498: #include "audioDB-internals.h" mas01cr@498: mas01cr@498: static int audiodb_l2norm_existing(adb_t *adb) { mas01cr@593: double *data_buffer = 0, *l2norm_buffer = 0; mas01cr@593: size_t data_buffer_size = align_page_up(adb->header->length); mas01cr@593: size_t nvectors = adb->header->length / (sizeof(double) * adb->header->dim); mas01cr@593: /* FIXME: this allocation of the vector data buffer will lose if we mas01cr@593: * ever turn the l2norm flag on when we have already inserted a mas01cr@593: * large number of vectors, as the malloc() will fail. "Don't do mas01cr@593: * that, then" is one possible answer. */ mas01cr@593: data_buffer = (double *) malloc(data_buffer_size); mas01cr@593: if (!data_buffer) { mas01cr@593: goto error; mas01cr@593: } mas01cr@593: lseek_set_or_goto_error(adb->fd, adb->header->dataOffset); mas01cr@593: read_or_goto_error(adb->fd, data_buffer, data_buffer_size); mas01cr@593: mas01cr@498: l2norm_buffer = (double *) malloc(nvectors * sizeof(double)); mas01cr@498: if(!l2norm_buffer) { mas01cr@498: goto error; mas01cr@498: } mas01cr@593: audiodb_l2norm_buffer(data_buffer, adb->header->dim, nvectors, l2norm_buffer); mas01cr@593: lseek_set_or_goto_error(adb->fd, adb->header->l2normTableOffset); mas01cr@498: write_or_goto_error(adb->fd, l2norm_buffer, nvectors * sizeof(double)); mas01cr@498: mas01cr@498: free(l2norm_buffer); mas01cr@593: free(data_buffer); mas01cr@498: mas01cr@498: return 0; mas01cr@498: mas01cr@498: error: mas01cr@593: if(data_buffer) { mas01cr@593: free(data_buffer); mas01cr@593: } mas01cr@498: if(l2norm_buffer) { mas01cr@498: free(l2norm_buffer); mas01cr@498: } mas01cr@498: return 1; mas01cr@498: } mas01cr@498: mas01cr@498: int audiodb_l2norm(adb_t *adb) { mas01cr@498: if(!(adb->flags & O_RDWR)) { mas01cr@498: return 1; mas01cr@498: } mas01cr@593: if(adb->header->flags & ADB_HEADER_FLAG_L2NORM) { mas01cr@498: /* non-error code for forthcoming backwards-compatibility mas01cr@498: * reasons */ mas01cr@498: return 0; mas01cr@498: } mas01cr@593: if((!(adb->header->flags & ADB_HEADER_FLAG_REFERENCES)) && mas01cr@593: (adb->header->length > 0)) { mas01cr@498: if(audiodb_l2norm_existing(adb)) { mas01cr@498: goto error; mas01cr@498: } mas01cr@498: } mas01cr@509: adb->header->flags |= ADB_HEADER_FLAG_L2NORM; mas01cr@498: return audiodb_sync_header(adb); mas01cr@498: mas01cr@498: error: mas01cr@498: return 1; mas01cr@498: }