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
|