annotate open.cpp @ 442:16c5c51a4c32 api-inversion

Add more information to adb_t In this case, add a vector to store track offsets. WARNING WARNING WARNING: unlike trackOffsetTable, this is a raw off_t in bytes of the feature data: in other words, it already has sizeof(double) and dbH->dim in it. (I think this is probably minimally unsurprising in the long run, but as I convert stuff there might well be errors creeping in...)
author mas01cr
date Wed, 24 Dec 2008 10:56:29 +0000
parents 62a0515f59be
children 16a903968d18
rev   line source
mas01cr@392 1 #include "audioDB.h"
mas01cr@392 2 extern "C" {
mas01cr@392 3 #include "audioDB_API.h"
mas01cr@402 4 #include "audioDB-internals.h"
mas01cr@392 5 }
mas01cr@392 6
mas01cr@402 7 static bool audiodb_check_header(adb_header_t *header) {
mas01cr@392 8 /* FIXME: use syslog() or write to stderr or something to give the
mas01cr@392 9 poor user some diagnostics. */
mas01cr@392 10 if(header->magic == O2_OLD_MAGIC) {
mas01cr@392 11 return false;
mas01cr@392 12 }
mas01cr@392 13 if(header->magic != O2_MAGIC) {
mas01cr@392 14 return false;
mas01cr@392 15 }
mas01cr@392 16 if(header->version != O2_FORMAT_VERSION) {
mas01cr@392 17 return false;
mas01cr@392 18 }
mas01cr@392 19 if(header->headerSize != O2_HEADERSIZE) {
mas01cr@392 20 return false;
mas01cr@392 21 }
mas01cr@392 22 return true;
mas01cr@392 23 }
mas01cr@392 24
mas01cr@402 25 static int audiodb_collect_keys(adb_t *adb) {
mas01cr@402 26 char *key_table = 0;
mas01cr@402 27 size_t key_table_length = 0;
mas01cr@402 28
mas01cr@402 29 if(adb->header->length > 0) {
mas01cr@402 30 unsigned nfiles = adb->header->numFiles;
mas01cr@402 31 key_table_length = ALIGN_PAGE_UP(nfiles * O2_FILETABLE_ENTRY_SIZE);
mas01cr@402 32 mmap_or_goto_error(char *, key_table, adb->header->fileTableOffset, key_table_length);
mas01cr@430 33 for (unsigned int k = 0; k < nfiles; k++) {
mas01cr@430 34 (*adb->keys)[(key_table + k*O2_FILETABLE_ENTRY_SIZE)] = k;
mas01cr@402 35 }
mas01cr@402 36 munmap(key_table, key_table_length);
mas01cr@402 37 }
mas01cr@402 38
mas01cr@402 39 return 0;
mas01cr@402 40
mas01cr@402 41 error:
mas01cr@402 42 maybe_munmap(key_table, key_table_length);
mas01cr@402 43 return 1;
mas01cr@402 44 }
mas01cr@402 45
mas01cr@432 46 static int audiodb_collect_track_lengths(adb_t *adb) {
mas01cr@432 47 uint32_t *track_table = 0;
mas01cr@432 48 size_t track_table_length = 0;
mas01cr@432 49 if(adb->header->length > 0) {
mas01cr@432 50 unsigned nfiles = adb->header->numFiles;
mas01cr@432 51 track_table_length = ALIGN_PAGE_UP(nfiles * O2_TRACKTABLE_ENTRY_SIZE);
mas01cr@432 52 mmap_or_goto_error(uint32_t *, track_table, adb->header->trackTableOffset, track_table_length);
mas01cr@442 53 off_t offset = 0;
mas01cr@432 54 for (unsigned int k = 0; k < nfiles; k++) {
mas01cr@442 55 uint32_t track_length = track_table[k];
mas01cr@442 56 adb->track_lengths->push_back(track_length);
mas01cr@442 57 adb->track_offsets->push_back(offset);
mas01cr@442 58 offset += track_length * adb->header->dim * sizeof(double);
mas01cr@432 59 }
mas01cr@432 60 munmap(track_table, track_table_length);
mas01cr@432 61 }
mas01cr@432 62
mas01cr@432 63 return 0;
mas01cr@432 64
mas01cr@432 65 error:
mas01cr@432 66 maybe_munmap(track_table, track_table_length);
mas01cr@432 67 return 1;
mas01cr@432 68 }
mas01cr@432 69
mas01cr@392 70 adb_t *audiodb_open(const char *path, int flags) {
mas01cr@392 71 adb_t *adb = 0;
mas01cr@392 72 int fd = -1;
mas01cr@392 73
mas01cr@392 74 flags &= (O_RDONLY|O_RDWR);
mas01cr@392 75 fd = open(path, flags);
mas01cr@392 76 if(fd == -1) {
mas01cr@392 77 goto error;
mas01cr@392 78 }
mas01cr@392 79 if(acquire_lock(fd, flags == O_RDWR)) {
mas01cr@392 80 goto error;
mas01cr@392 81 }
mas01cr@392 82
mas01cr@411 83 adb = (adb_t *) calloc(1, sizeof(adb_t));
mas01cr@392 84 if(!adb) {
mas01cr@392 85 goto error;
mas01cr@392 86 }
mas01cr@392 87 adb->fd = fd;
mas01cr@392 88 adb->flags = flags;
mas01cr@392 89 adb->path = (char *) malloc(1+strlen(path));
mas01cr@392 90 if(!(adb->path)) {
mas01cr@392 91 goto error;
mas01cr@392 92 }
mas01cr@392 93 strcpy(adb->path, path);
mas01cr@392 94
mas01cr@392 95 adb->header = (adb_header_t *) malloc(sizeof(adb_header_t));
mas01cr@392 96 if(!(adb->header)) {
mas01cr@392 97 goto error;
mas01cr@392 98 }
mas01cr@392 99 if(read(fd, (char *) adb->header, O2_HEADERSIZE) != O2_HEADERSIZE) {
mas01cr@392 100 goto error;
mas01cr@392 101 }
mas01cr@392 102 if(!audiodb_check_header(adb->header)) {
mas01cr@392 103 goto error;
mas01cr@392 104 }
mas01cr@392 105
mas01cr@430 106 adb->keys = new std::map<std::string,uint32_t>;
mas01cr@402 107 if(!adb->keys) {
mas01cr@402 108 goto error;
mas01cr@402 109 }
mas01cr@402 110 if(audiodb_collect_keys(adb)) {
mas01cr@402 111 goto error;
mas01cr@402 112 }
mas01cr@432 113 adb->track_lengths = new std::vector<uint32_t>;
mas01cr@432 114 if(!adb->track_lengths) {
mas01cr@432 115 goto error;
mas01cr@432 116 }
mas01cr@432 117 adb->track_lengths->reserve(adb->header->numFiles);
mas01cr@442 118 adb->track_offsets = new std::vector<off_t>;
mas01cr@442 119 if(!adb->track_offsets) {
mas01cr@442 120 goto error;
mas01cr@442 121 }
mas01cr@442 122 adb->track_offsets->reserve(adb->header->numFiles);
mas01cr@432 123 if(audiodb_collect_track_lengths(adb)) {
mas01cr@432 124 goto error;
mas01cr@432 125 }
mas01cr@392 126 return adb;
mas01cr@392 127
mas01cr@392 128 error:
mas01cr@392 129 if(adb) {
mas01cr@392 130 if(adb->header) {
mas01cr@392 131 free(adb->header);
mas01cr@392 132 }
mas01cr@392 133 if(adb->path) {
mas01cr@392 134 free(adb->path);
mas01cr@392 135 }
mas01cr@402 136 if(adb->keys) {
mas01cr@402 137 delete adb->keys;
mas01cr@402 138 }
mas01cr@432 139 if(adb->track_lengths) {
mas01cr@432 140 delete adb->track_lengths;
mas01cr@432 141 }
mas01cr@392 142 free(adb);
mas01cr@392 143 }
mas01cr@392 144 if(fd != -1) {
mas01cr@392 145 close(fd);
mas01cr@392 146 }
mas01cr@392 147 return NULL;
mas01cr@392 148 }