mas01mj@725: #include mas01mj@722: #include "org_omras2_AudioDB.h" mas01mj@722: #include "org_omras2_AudioDB_Mode.h" mas01mj@722: #include mas01mj@722: #include "audioDB_API.h" mas01mj@724: #include mas01mj@725: #include mas01mj@725: mas01mj@725: // Following Ben's lead here! mas01mj@725: #define ADB_HEADER_FLAG_L2NORM 0x1 mas01mj@725: #define ADB_HEADER_FLAG_POWER 0x4 mas01mj@725: #define ADB_HEADER_FLAG_TIMES 0x20 mas01mj@725: #define ADB_HEADER_FLAG_REFERENCES 0x40 mas01mj@725: mas01mj@725: mas01mj@725: adb_t* get_handle(JNIEnv *env, jobject obj) mas01mj@725: { mas01mj@725: // Fetch the adb pointer mas01mj@725: mas01mj@725: adb_t *handle; mas01mj@725: mas01mj@725: jclass adbClass = (*env)->GetObjectClass(env, obj); mas01mj@725: jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J"); mas01mj@725: if(fid == NULL) { mas01mj@725: return; mas01mj@725: } mas01mj@725: mas01mj@725: handle = (adb_t*)((*env)->GetLongField(env, obj, fid)); mas01mj@725: (*env)->DeleteLocalRef(env, adbClass); mas01mj@725: return handle; mas01mj@725: } mas01mj@722: mas01mj@722: JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1create (JNIEnv *env, jobject obj, jstring path, jint datasize, jint ntracks, jint datadim) mas01mj@722: { mas01mj@722: char buf[256]; mas01mj@722: const char *str; mas01mj@722: str = (*env)->GetStringUTFChars(env, path, NULL); mas01mj@722: if (str == NULL) mas01mj@722: return; mas01mj@722: mas01mj@722: adb_t *handle; mas01mj@722: handle = audiodb_create(str, datasize, ntracks, datadim); mas01mj@722: if(!handle) mas01mj@722: return JNI_FALSE; mas01mj@724: mas01mj@725: (*env)->ReleaseStringUTFChars(env, path, str); mas01mj@725: return JNI_TRUE; mas01mj@725: } mas01mj@725: mas01mj@725: JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1open (JNIEnv *env, jobject obj, jstring path, jobject mode) mas01mj@725: { mas01mj@725: // TODO: If we have a handle, close the old one. mas01mj@725: if(get_handle(env, obj)) mas01mj@725: { mas01mj@725: return; mas01mj@725: } mas01mj@725: mas01mj@725: jclass modeClass = (*env)->FindClass(env, "org/omras2/AudioDB$Mode"); mas01mj@725: jmethodID getNameMethod = (*env)->GetMethodID(env, modeClass, "name", "()Ljava/lang/String;"); mas01mj@725: jstring value = (jstring)(*env)->CallObjectMethod(env, mode, getNameMethod); mas01mj@725: const char* openMode = (*env)->GetStringUTFChars(env, value, 0); mas01mj@725: const char* pathVal = (*env)->GetStringUTFChars(env, path, 0); mas01mj@725: int modeVal = 0; mas01mj@725: if(strcmp(openMode, "O_RDWR") == 0) mas01mj@725: { mas01mj@725: modeVal = O_RDWR; mas01mj@725: } mas01mj@725: else if(strcmp(openMode, "O_RDONLY") == 0) mas01mj@725: { mas01mj@725: modeVal = O_RDONLY; mas01mj@725: } mas01mj@725: else mas01mj@725: return; mas01mj@725: mas01mj@725: adb_t *handle; mas01mj@725: handle = audiodb_open(pathVal, modeVal); mas01mj@724: jclass adbClass = (*env)->GetObjectClass(env, obj); mas01mj@724: jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J"); mas01mj@724: if(fid == NULL) { mas01mj@724: return; mas01mj@724: } mas01mj@724: (*env)->SetLongField(env, obj, fid, (long)handle); mas01mj@724: (*env)->DeleteLocalRef(env, adbClass); mas01mj@722: mas01mj@722: return JNI_TRUE; mas01mj@722: } mas01mj@722: mas01mj@725: JNIEXPORT void JNICALL Java_org_omras2_AudioDB_audiodb_1close (JNIEnv *env, jobject obj) mas01mj@722: { mas01mj@725: adb_t *handle = get_handle(env, obj); mas01mj@725: if(!handle) mas01mj@725: return; mas01mj@725: mas01mj@725: audiodb_close(handle); mas01mj@725: mas01mj@725: jclass adbClass = (*env)->GetObjectClass(env, obj); mas01mj@725: jfieldID fid = (*env)->GetFieldID(env, adbClass, "adbHandle", "J"); mas01mj@725: mas01mj@725: if(fid == NULL) { mas01mj@725: return; mas01mj@725: } mas01mj@725: mas01mj@725: (*env)->SetLongField(env, obj, fid, 0); mas01mj@725: (*env)->DeleteLocalRef(env, adbClass); mas01mj@725: } mas01mj@725: mas01mj@725: JNIEXPORT jboolean JNICALL Java_org_omras2_AudioDB_audiodb_1insert_1path(JNIEnv *env, jobject obj, jstring key, jstring features, jstring power, jstring times) mas01mj@725: { mas01mj@725: adb_t *handle = get_handle(env, obj); mas01mj@725: if(!handle) mas01mj@725: return JNI_FALSE; mas01mj@725: mas01mj@725: adb_insert_t* ins = (adb_insert_t *)malloc(sizeof(adb_insert_t)); mas01mj@725: ins->key = NULL; mas01mj@725: ins->features = NULL; mas01mj@725: ins->power = NULL; mas01mj@725: ins->times = NULL; mas01mj@725: mas01mj@725: if(key) mas01mj@725: ins->key = (*env)->GetStringUTFChars(env, key, 0); mas01mj@725: if(features) mas01mj@725: ins->features = (*env)->GetStringUTFChars(env, features, 0); mas01mj@725: if(power) mas01mj@725: ins->power = (*env)->GetStringUTFChars(env, power, 0); mas01mj@725: if(times) mas01mj@725: ins->times = (*env)->GetStringUTFChars(env, times, 0); mas01mj@725: mas01mj@725: int result = audiodb_insert(handle, ins); mas01mj@725: mas01mj@725: if(result) mas01mj@725: return JNI_FALSE; mas01mj@725: mas01mj@725: return JNI_TRUE; mas01mj@722: } mas01mj@722: mas01mj@722: JNIEXPORT void JNICALL Java_org_omras2_AudioDB_query(JNIEnv *env, jobject obj) mas01mj@722: { mas01mj@722: } mas01mj@722: mas01mj@724: JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1status(JNIEnv *env, jobject obj) mas01mj@722: { mas01mj@725: adb_t *handle = get_handle(env, obj); mas01mj@725: if(!handle) mas01mj@725: return NULL; mas01mj@724: adb_status_t *status; mas01mj@724: status = (adb_status_t *)malloc(sizeof(adb_status_t)); mas01mj@724: int flags = audiodb_status(handle, status); mas01mj@724: mas01mj@724: jclass statusClass = (*env)->FindClass(env, "org/omras2/Status"); mas01mj@724: if(statusClass == NULL) { mas01mj@724: return NULL; mas01mj@724: } mas01mj@724: jmethodID cid = (*env)->GetMethodID(env, statusClass, "", "()V"); mas01mj@724: if(cid == NULL) { mas01mj@724: return NULL; mas01mj@724: } mas01mj@724: mas01mj@724: jobject result = (*env)->NewObject(env, statusClass, cid); mas01mj@724: mas01mj@725: // This needs a macro! mas01mj@725: jfieldID fid = (*env)->GetFieldID(env, statusClass, "numFiles", "I"); mas01mj@725: if(fid == NULL) return; mas01mj@724: (*env)->SetIntField(env, result, fid, status->numFiles); mas01mj@725: mas01mj@725: fid = (*env)->GetFieldID(env, statusClass, "dim", "I"); mas01mj@725: if(fid == NULL) return; mas01mj@725: (*env)->SetIntField(env, result, fid, status->dim); mas01mj@725: mas01mj@725: fid = (*env)->GetFieldID(env, statusClass, "dudCount", "I"); mas01mj@725: if(fid == NULL) return; mas01mj@725: (*env)->SetIntField(env, result, fid, status->dudCount); mas01mj@725: mas01mj@725: fid = (*env)->GetFieldID(env, statusClass, "nullCount", "I"); mas01mj@725: if(fid == NULL) return; mas01mj@725: (*env)->SetIntField(env, result, fid, status->nullCount); mas01mj@725: mas01mj@725: fid = (*env)->GetFieldID(env, statusClass, "length", "I"); mas01mj@725: if(fid == NULL) return; mas01mj@725: (*env)->SetIntField(env, result, fid, status->length); mas01mj@725: mas01mj@725: fid = (*env)->GetFieldID(env, statusClass, "dataRegionSize", "I"); mas01mj@725: if(fid == NULL) return; mas01mj@725: (*env)->SetIntField(env, result, fid, status->data_region_size); mas01mj@725: mas01mj@725: // Flags mas01mj@725: mas01mj@725: fid = (*env)->GetFieldID(env, statusClass, "isL2Normed", "Z"); mas01mj@725: if(fid == NULL) return; mas01mj@725: (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_L2NORM)); mas01mj@725: mas01mj@725: fid = (*env)->GetFieldID(env, statusClass, "hasPower", "Z"); mas01mj@725: if(fid == NULL) return; mas01mj@725: (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_POWER)); mas01mj@725: mas01mj@725: fid = (*env)->GetFieldID(env, statusClass, "hasTimes", "Z"); mas01mj@725: if(fid == NULL) return; mas01mj@725: (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_TIMES)); mas01mj@725: mas01mj@725: fid = (*env)->GetFieldID(env, statusClass, "hasReferences", "Z"); mas01mj@725: if(fid == NULL) return; mas01mj@725: (*env)->SetBooleanField(env, result, fid, (status->flags & ADB_HEADER_FLAG_REFERENCES)); mas01mj@724: mas01mj@724: (*env)->DeleteLocalRef(env, statusClass); mas01mj@724: mas01mj@724: return result; mas01mj@722: } mas01mj@722: