annotate bindings/java/ext/libAudioDB_JNI.c @ 725:7e1fa27b67ee

* Full status support * Insert support (not fully tested) * Unit tests for create + initial insert
author mas01mj
date Wed, 21 Jul 2010 14:27:07 +0000
parents 11fd16e1d8b3
children fe2282b9bfb0
rev   line source
mas01mj@725 1 #include <sys/stat.h>
mas01mj@722 2 #include "org_omras2_AudioDB.h"
mas01mj@722 3 #include "org_omras2_AudioDB_Mode.h"
mas01mj@722 4 #include <jni.h>
mas01mj@722 5 #include "audioDB_API.h"
mas01mj@724 6 #include <stdlib.h>
mas01mj@725 7 #include <fcntl.h>
mas01mj@725 8
mas01mj@725 9 // Following Ben's lead here!
mas01mj@725 10 #define ADB_HEADER_FLAG_L2NORM 0x1
mas01mj@725 11 #define ADB_HEADER_FLAG_POWER 0x4
mas01mj@725 12 #define ADB_HEADER_FLAG_TIMES 0x20
mas01mj@725 13 #define ADB_HEADER_FLAG_REFERENCES 0x40
mas01mj@725 14
mas01mj@725 15
mas01mj@725 16 adb_t* get_handle(JNIEnv *env, jobject obj)
mas01mj@725 17 {
mas01mj@725 18 // Fetch the adb pointer
mas01mj@725 19
mas01mj@725 20 adb_t *handle;
mas01mj@725 21
mas01mj@725 22 jclass adbClass = (*env)->GetObjectClass(env, obj);
mas01mj@725 23 jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J");
mas01mj@725 24 if(fid == NULL) {
mas01mj@725 25 return;
mas01mj@725 26 }
mas01mj@725 27
mas01mj@725 28 handle = (adb_t*)((*env)->GetLongField(env, obj, fid));
mas01mj@725 29 (*env)->DeleteLocalRef(env, adbClass);
mas01mj@725 30 return handle;
mas01mj@725 31 }
mas01mj@722 32
mas01mj@722 33 JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1create (JNIEnv *env, jobject obj, jstring path, jint datasize, jint ntracks, jint datadim)
mas01mj@722 34 {
mas01mj@722 35 char buf[256];
mas01mj@722 36 const char *str;
mas01mj@722 37 str = (*env)->GetStringUTFChars(env, path, NULL);
mas01mj@722 38 if (str == NULL)
mas01mj@722 39 return;
mas01mj@722 40
mas01mj@722 41 adb_t *handle;
mas01mj@722 42 handle = audiodb_create(str, datasize, ntracks, datadim);
mas01mj@722 43 if(!handle)
mas01mj@722 44 return JNI_FALSE;
mas01mj@724 45
mas01mj@725 46 (*env)->ReleaseStringUTFChars(env, path, str);
mas01mj@725 47 return JNI_TRUE;
mas01mj@725 48 }
mas01mj@725 49
mas01mj@725 50 JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1open (JNIEnv *env, jobject obj, jstring path, jobject mode)
mas01mj@725 51 {
mas01mj@725 52 // TODO: If we have a handle, close the old one.
mas01mj@725 53 if(get_handle(env, obj))
mas01mj@725 54 {
mas01mj@725 55 return;
mas01mj@725 56 }
mas01mj@725 57
mas01mj@725 58 jclass modeClass = (*env)->FindClass(env, "org/omras2/AudioDB$Mode");
mas01mj@725 59 jmethodID getNameMethod = (*env)->GetMethodID(env, modeClass, "name", "()Ljava/lang/String;");
mas01mj@725 60 jstring value = (jstring)(*env)->CallObjectMethod(env, mode, getNameMethod);
mas01mj@725 61 const char* openMode = (*env)->GetStringUTFChars(env, value, 0);
mas01mj@725 62 const char* pathVal = (*env)->GetStringUTFChars(env, path, 0);
mas01mj@725 63 int modeVal = 0;
mas01mj@725 64 if(strcmp(openMode, "O_RDWR") == 0)
mas01mj@725 65 {
mas01mj@725 66 modeVal = O_RDWR;
mas01mj@725 67 }
mas01mj@725 68 else if(strcmp(openMode, "O_RDONLY") == 0)
mas01mj@725 69 {
mas01mj@725 70 modeVal = O_RDONLY;
mas01mj@725 71 }
mas01mj@725 72 else
mas01mj@725 73 return;
mas01mj@725 74
mas01mj@725 75 adb_t *handle;
mas01mj@725 76 handle = audiodb_open(pathVal, modeVal);
mas01mj@724 77 jclass adbClass = (*env)->GetObjectClass(env, obj);
mas01mj@724 78 jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J");
mas01mj@724 79 if(fid == NULL) {
mas01mj@724 80 return;
mas01mj@724 81 }
mas01mj@724 82 (*env)->SetLongField(env, obj, fid, (long)handle);
mas01mj@724 83 (*env)->DeleteLocalRef(env, adbClass);
mas01mj@722 84
mas01mj@722 85 return JNI_TRUE;
mas01mj@722 86 }
mas01mj@722 87
mas01mj@725 88 JNIEXPORT void JNICALL Java_org_omras2_AudioDB_audiodb_1close (JNIEnv *env, jobject obj)
mas01mj@722 89 {
mas01mj@725 90 adb_t *handle = get_handle(env, obj);
mas01mj@725 91 if(!handle)
mas01mj@725 92 return;
mas01mj@725 93
mas01mj@725 94 audiodb_close(handle);
mas01mj@725 95
mas01mj@725 96 jclass adbClass = (*env)->GetObjectClass(env, obj);
mas01mj@725 97 jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J");
mas01mj@725 98
mas01mj@725 99 if(fid == NULL) {
mas01mj@725 100 return;
mas01mj@725 101 }
mas01mj@725 102
mas01mj@725 103 (*env)->SetLongField(env, obj, fid, 0);
mas01mj@725 104 (*env)->DeleteLocalRef(env, adbClass);
mas01mj@725 105 }
mas01mj@725 106
mas01mj@725 107 JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1insert_1path(JNIEnv *env, jobject obj, jstring key, jstring features, jstring power, jstring times)
mas01mj@725 108 {
mas01mj@725 109 adb_t *handle = get_handle(env, obj);
mas01mj@725 110 if(!handle)
mas01mj@725 111 return JNI_FALSE;
mas01mj@725 112
mas01mj@725 113 adb_insert_t* ins = (adb_insert_t *)malloc(sizeof(adb_insert_t));
mas01mj@725 114 ins->key = NULL;
mas01mj@725 115 ins->features = NULL;
mas01mj@725 116 ins->power = NULL;
mas01mj@725 117 ins->times = NULL;
mas01mj@725 118
mas01mj@725 119 if(key)
mas01mj@725 120 ins->key = (*env)->GetStringUTFChars(env, key, 0);
mas01mj@725 121 if(features)
mas01mj@725 122 ins->features = (*env)->GetStringUTFChars(env, features, 0);
mas01mj@725 123 if(power)
mas01mj@725 124 ins->power = (*env)->GetStringUTFChars(env, power, 0);
mas01mj@725 125 if(times)
mas01mj@725 126 ins->times = (*env)->GetStringUTFChars(env, times, 0);
mas01mj@725 127
mas01mj@725 128 int result = audiodb_insert(handle, ins);
mas01mj@725 129
mas01mj@725 130 if(result)
mas01mj@725 131 return JNI_FALSE;
mas01mj@725 132
mas01mj@725 133 return JNI_TRUE;
mas01mj@722 134 }
mas01mj@722 135
mas01mj@722 136 JNIEXPORT void JNICALL Java_org_omras2_AudioDB_query(JNIEnv *env, jobject obj)
mas01mj@722 137 {
mas01mj@722 138 }
mas01mj@722 139
mas01mj@724 140 JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1status(JNIEnv *env, jobject obj)
mas01mj@722 141 {
mas01mj@725 142 adb_t *handle = get_handle(env, obj);
mas01mj@725 143 if(!handle)
mas01mj@725 144 return NULL;
mas01mj@724 145 adb_status_t *status;
mas01mj@724 146 status = (adb_status_t *)malloc(sizeof(adb_status_t));
mas01mj@724 147 int flags = audiodb_status(handle, status);
mas01mj@724 148
mas01mj@724 149 jclass statusClass = (*env)->FindClass(env, "org/omras2/Status");
mas01mj@724 150 if(statusClass == NULL) {
mas01mj@724 151 return NULL;
mas01mj@724 152 }
mas01mj@724 153 jmethodID cid = (*env)->GetMethodID(env, statusClass, "<init>", "()V");
mas01mj@724 154 if(cid == NULL) {
mas01mj@724 155 return NULL;
mas01mj@724 156 }
mas01mj@724 157
mas01mj@724 158 jobject result = (*env)->NewObject(env, statusClass, cid);
mas01mj@724 159
mas01mj@725 160 // This needs a macro!
mas01mj@725 161 jfieldID fid = (*env)->GetFieldID(env, statusClass, "numFiles", "I");
mas01mj@725 162 if(fid == NULL) return;
mas01mj@724 163 (*env)->SetIntField(env, result, fid, status->numFiles);
mas01mj@725 164
mas01mj@725 165 fid = (*env)->GetFieldID(env, statusClass, "dim", "I");
mas01mj@725 166 if(fid == NULL) return;
mas01mj@725 167 (*env)->SetIntField(env, result, fid, status->dim);
mas01mj@725 168
mas01mj@725 169 fid = (*env)->GetFieldID(env, statusClass, "dudCount", "I");
mas01mj@725 170 if(fid == NULL) return;
mas01mj@725 171 (*env)->SetIntField(env, result, fid, status->dudCount);
mas01mj@725 172
mas01mj@725 173 fid = (*env)->GetFieldID(env, statusClass, "nullCount", "I");
mas01mj@725 174 if(fid == NULL) return;
mas01mj@725 175 (*env)->SetIntField(env, result, fid, status->nullCount);
mas01mj@725 176
mas01mj@725 177 fid = (*env)->GetFieldID(env, statusClass, "length", "I");
mas01mj@725 178 if(fid == NULL) return;
mas01mj@725 179 (*env)->SetIntField(env, result, fid, status->length);
mas01mj@725 180
mas01mj@725 181 fid = (*env)->GetFieldID(env, statusClass, "dataRegionSize", "I");
mas01mj@725 182 if(fid == NULL) return;
mas01mj@725 183 (*env)->SetIntField(env, result, fid, status->data_region_size);
mas01mj@725 184
mas01mj@725 185 // Flags
mas01mj@725 186
mas01mj@725 187 fid = (*env)->GetFieldID(env, statusClass, "isL2Normed", "Z");
mas01mj@725 188 if(fid == NULL) return;
mas01mj@725 189 (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_L2NORM));
mas01mj@725 190
mas01mj@725 191 fid = (*env)->GetFieldID(env, statusClass, "hasPower", "Z");
mas01mj@725 192 if(fid == NULL) return;
mas01mj@725 193 (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_POWER));
mas01mj@725 194
mas01mj@725 195 fid = (*env)->GetFieldID(env, statusClass, "hasTimes", "Z");
mas01mj@725 196 if(fid == NULL) return;
mas01mj@725 197 (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_TIMES));
mas01mj@725 198
mas01mj@725 199 fid = (*env)->GetFieldID(env, statusClass, "hasReferences", "Z");
mas01mj@725 200 if(fid == NULL) return;
mas01mj@725 201 (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_REFERENCES));
mas01mj@724 202
mas01mj@724 203 (*env)->DeleteLocalRef(env, statusClass);
mas01mj@724 204
mas01mj@724 205 return result;
mas01mj@722 206 }
mas01mj@722 207