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