Mercurial > hg > audiodb
comparison bindings/java/ext/libAudioDB_JNI.c @ 727:4d9e4ff0a9cd
* Now produces results - a Vector of Result objects
* Handles includeKeys / excludeKeys correctly
author | mas01mj |
---|---|
date | Mon, 26 Jul 2010 14:58:13 +0000 |
parents | fe2282b9bfb0 |
children | d3407d1e2f57 |
comparison
equal
deleted
inserted
replaced
726:fe2282b9bfb0 | 727:4d9e4ff0a9cd |
---|---|
242 (*env)->DeleteLocalRef(env, statusClass); | 242 (*env)->DeleteLocalRef(env, statusClass); |
243 | 243 |
244 return result; | 244 return result; |
245 } | 245 } |
246 | 246 |
247 JNIEXPORT void JNICALL Java_org_omras2_AudioDB_audiodb_1query_1by_1key(JNIEnv *env, jobject adbobj, jstring key, jobject queryObject) | 247 jobject build_results(JNIEnv *env, adb_query_results_t *result) |
248 { | |
249 int i; | |
250 // Create a vector | |
251 jclass vectorClass = (*env)->FindClass(env, "java/util/Vector"); | |
252 if(vectorClass == NULL) return; | |
253 jmethodID vectorCtor = (*env)->GetMethodID(env, vectorClass, "<init>", "()V"); | |
254 if(vectorCtor == NULL) return; | |
255 jobject vector = (*env)->NewObject(env, vectorClass, vectorCtor); | |
256 | |
257 jmethodID addElementMethod = (*env)->GetMethodID(env, vectorClass, "addElement", "(Ljava/lang/Object;)V"); | |
258 if(addElementMethod == NULL) return; | |
259 | |
260 jclass resultClass = (*env)->FindClass(env, "org/omras2/Result"); | |
261 if(resultClass == NULL) return; | |
262 jmethodID resultCtor = (*env)->GetMethodID(env, resultClass, "<init>", "(Ljava/lang/String;DII)V"); | |
263 if(resultCtor == NULL) return; | |
264 | |
265 for(i=0; i<result->nresults; i++) | |
266 { | |
267 jstring keyStr = (*env)->NewStringUTF(env, result->results[i].ikey); | |
268 jobject resultObj = (*env)->NewObject(env, resultClass, resultCtor, | |
269 keyStr, | |
270 (double)(result->results[i].dist), | |
271 (int)(result->results[i].qpos), | |
272 (int)(result->results[i].ipos)); | |
273 | |
274 (*env)->CallObjectMethod(env, vector, addElementMethod, resultObj); | |
275 | |
276 } | |
277 (*env)->DeleteLocalRef(env, resultClass); | |
278 (*env)->DeleteLocalRef(env, vectorClass); | |
279 return vector; | |
280 } | |
281 | |
282 JNIEXPORT jobject JNICALL Java_org_omras2_AudioDB_audiodb_1query_1by_1key(JNIEnv *env, jobject adbobj, jstring key, jobject queryObject) | |
248 { | 283 { |
249 adb_t* handle = get_handle(env, adbobj); | 284 adb_t* handle = get_handle(env, adbobj); |
250 | 285 |
251 if(!handle) | 286 if(!handle) |
252 return; | 287 return; |
289 else if(strcmp(accType, "PER_TRACK") == 0) | 324 else if(strcmp(accType, "PER_TRACK") == 0) |
290 spec->params.accumulation = ADB_ACCUMULATION_PER_TRACK; | 325 spec->params.accumulation = ADB_ACCUMULATION_PER_TRACK; |
291 else if(strcmp(accType, "ONE_TO_ONE") == 0) | 326 else if(strcmp(accType, "ONE_TO_ONE") == 0) |
292 spec->params.accumulation = ADB_ACCUMULATION_ONE_TO_ONE; | 327 spec->params.accumulation = ADB_ACCUMULATION_ONE_TO_ONE; |
293 else { | 328 else { |
294 printf("Invalid acc\n"); | |
295 return; | 329 return; |
296 } | 330 } |
297 | 331 |
298 if(strcmp(distType, "DOT_PRODUCT") == 0) | 332 if(strcmp(distType, "DOT_PRODUCT") == 0) |
299 spec->params.distance = ADB_DISTANCE_DOT_PRODUCT; | 333 spec->params.distance = ADB_DISTANCE_DOT_PRODUCT; |
300 else if(strcmp(distType, "EUCLIDEAN_NORMED") == 0) | 334 else if(strcmp(distType, "EUCLIDEAN_NORMED") == 0) |
301 spec->params.distance = ADB_DISTANCE_EUCLIDEAN_NORMED; | 335 spec->params.distance = ADB_DISTANCE_EUCLIDEAN_NORMED; |
302 else if(strcmp(distType, "EUCLIDEAN") == 0) | 336 else if(strcmp(distType, "EUCLIDEAN") == 0) |
303 spec->params.distance = ADB_DISTANCE_EUCLIDEAN; | 337 spec->params.distance = ADB_DISTANCE_EUCLIDEAN; |
304 else { | 338 else { |
305 printf("Invalid dist\n"); | |
306 return; | 339 return; |
307 } | 340 } |
308 | 341 |
342 int i; | |
343 | |
344 fid = (*env)->GetFieldID(env, queryClass, "includeKeys", "[Ljava/lang/String;"); | |
345 if(fid == NULL) return; | |
346 jobjectArray includeObj = (jobjectArray)((*env)->GetObjectField(env, queryObject, fid)); | |
347 jsize len = (*env)->GetArrayLength(env, includeObj); | |
348 | |
349 if(len > 0) | |
350 { | |
351 spec->refine.flags |= ADB_REFINE_INCLUDE_KEYLIST; | |
352 spec->refine.include.nkeys = len; | |
353 spec->refine.include.keys = (const char **)calloc(sizeof(const char *), spec->refine.include.nkeys); | |
354 for(i=0; i<spec->refine.include.nkeys; i++) { | |
355 jstring key = (*env)->GetObjectArrayElement(env, includeObj, i); | |
356 spec->refine.include.keys[i] = (*env)->GetStringUTFChars(env, key, NULL); | |
357 } | |
358 } | |
359 | |
360 fid = (*env)->GetFieldID(env, queryClass, "excludeKeys", "[Ljava/lang/String;"); | |
361 if(fid == NULL) return; | |
362 jobjectArray excludeObj = (jobjectArray)((*env)->GetObjectField(env, queryObject, fid)); | |
363 len = (*env)->GetArrayLength(env, excludeObj); | |
364 | |
365 if(len > 0) | |
366 { | |
367 spec->refine.flags |= ADB_REFINE_EXCLUDE_KEYLIST; | |
368 spec->refine.exclude.nkeys = len; | |
369 spec->refine.exclude.keys = (const char **)calloc(sizeof(const char *), spec->refine.exclude.nkeys); | |
370 for(i=0; i<spec->refine.exclude.nkeys; i++) { | |
371 jstring key = (*env)->GetObjectArrayElement(env, excludeObj, i); | |
372 spec->refine.exclude.keys[i] = (*env)->GetStringUTFChars(env, key, NULL); | |
373 } | |
374 } | |
375 | |
309 // Rest of refine | 376 // Rest of refine |
310 | 377 |
311 double radius = get_double_val(env, queryClass, queryObject, "radius", 0); | 378 double radius = get_double_val(env, queryClass, queryObject, "radius", 0); |
312 double absThres = get_double_val(env, queryClass, queryObject, "absThres", 0); | 379 double absThres = get_double_val(env, queryClass, queryObject, "absThres", 0); |
313 double relThres = get_double_val(env, queryClass, queryObject, "relThres", 0); | 380 double relThres = get_double_val(env, queryClass, queryObject, "relThres", 0); |
342 | 409 |
343 spec->qid.datum->data = NULL; | 410 spec->qid.datum->data = NULL; |
344 spec->qid.datum->power = NULL; | 411 spec->qid.datum->power = NULL; |
345 spec->qid.datum->times = NULL; | 412 spec->qid.datum->times = NULL; |
346 | 413 |
347 printf("seq length: %d seq start: %d points: %d tracks: %d\n", | |
348 spec->qid.sequence_length, | |
349 spec->qid.sequence_start, | |
350 spec->params.npoints, | |
351 spec->params.ntracks); | |
352 printf("Radius: %f Abs: %f Rel: %f Dur: %f Hop: %d\n", radius, absThres, relThres, durRatio, hopSize); | |
353 printf("Key: %s Acc: %s Dist: %s\n", keyStr, accType, distType); | |
354 | |
355 int ok = audiodb_retrieve_datum(handle, keyStr, spec->qid.datum); | 414 int ok = audiodb_retrieve_datum(handle, keyStr, spec->qid.datum); |
356 if(ok != 0) { | 415 if(ok != 0) { |
357 printf("No datum\n"); | |
358 return; | 416 return; |
359 } | 417 } |
360 result = audiodb_query_spec(handle, spec); | 418 result = audiodb_query_spec(handle, spec); |
361 | 419 |
362 if(result == NULL) { | 420 if(result == NULL) { |
363 printf("No result\n"); | 421 return; |
364 return; | 422 } |
365 } | |
366 printf("OK: %d\n", ok); | |
367 (*env)->DeleteLocalRef(env, queryClass); | 423 (*env)->DeleteLocalRef(env, queryClass); |
368 } | 424 |
369 | 425 return build_results(env, result); |
426 } | |
427 |