annotate src/Plugin.cpp @ 28:f2914a92b553

Docs
author Chris Cannam
date Mon, 19 Nov 2012 15:12:44 +0000
parents 59b4150c69cb
children 02db37c2301b
rev   line source
Chris@0 1 #include "org_vamp_plugins_Plugin.h"
Chris@0 2
Chris@0 3 #include <vamp-hostsdk/Plugin.h>
Chris@0 4
Chris@0 5 #include "handle.h"
Chris@7 6 #include "getset.h"
Chris@7 7
Chris@7 8 #include <iostream>
Chris@0 9
Chris@0 10 using Vamp::Plugin;
Chris@6 11 using Vamp::PluginBase;
Chris@0 12 using std::string;
Chris@0 13
Chris@20 14 void
Chris@20 15 Java_org_vamp_1plugins_Plugin_dispose(JNIEnv *env, jobject obj)
Chris@20 16 {
Chris@20 17 Plugin *p = getHandle<Plugin>(env, obj);
Chris@20 18 setHandle<Plugin>(env, obj, 0);
Chris@20 19 delete p;
Chris@20 20 }
Chris@20 21
Chris@4 22 jint
Chris@4 23 Java_org_vamp_1plugins_Plugin_getVampApiVersion(JNIEnv *env, jobject obj)
Chris@4 24 {
Chris@4 25 Plugin *p = getHandle<Plugin>(env, obj);
Chris@4 26 return p->getVampApiVersion();
Chris@4 27 }
Chris@4 28
Chris@0 29 jstring
Chris@0 30 Java_org_vamp_1plugins_Plugin_getIdentifier(JNIEnv *env, jobject obj)
Chris@0 31 {
Chris@0 32 Plugin *p = getHandle<Plugin>(env, obj);
Chris@0 33 return env->NewStringUTF(p->getIdentifier().c_str());
Chris@0 34 }
Chris@0 35
Chris@0 36 jstring
Chris@0 37 Java_org_vamp_1plugins_Plugin_getName(JNIEnv *env, jobject obj)
Chris@0 38 {
Chris@0 39 Plugin *p = getHandle<Plugin>(env, obj);
Chris@0 40 return env->NewStringUTF(p->getName().c_str());
Chris@0 41 }
Chris@0 42
Chris@0 43 jstring
Chris@0 44 Java_org_vamp_1plugins_Plugin_getDescription(JNIEnv *env, jobject obj)
Chris@0 45 {
Chris@0 46 Plugin *p = getHandle<Plugin>(env, obj);
Chris@0 47 return env->NewStringUTF(p->getDescription().c_str());
Chris@0 48 }
Chris@0 49
Chris@4 50 jstring
Chris@4 51 Java_org_vamp_1plugins_Plugin_getMaker(JNIEnv *env, jobject obj)
Chris@4 52 {
Chris@4 53 Plugin *p = getHandle<Plugin>(env, obj);
Chris@4 54 return env->NewStringUTF(p->getMaker().c_str());
Chris@4 55 }
Chris@4 56
Chris@4 57 jstring
Chris@4 58 Java_org_vamp_1plugins_Plugin_getCopyright(JNIEnv *env, jobject obj)
Chris@4 59 {
Chris@4 60 Plugin *p = getHandle<Plugin>(env, obj);
Chris@4 61 return env->NewStringUTF(p->getCopyright().c_str());
Chris@4 62 }
Chris@4 63
Chris@0 64 jint
Chris@0 65 Java_org_vamp_1plugins_Plugin_getPluginVersion(JNIEnv *env, jobject obj)
Chris@0 66 {
Chris@0 67 Plugin *p = getHandle<Plugin>(env, obj);
Chris@0 68 return p->getPluginVersion();
Chris@0 69 }
Chris@0 70
Chris@9 71 jobjectArray
Chris@9 72 Java_org_vamp_1plugins_Plugin_getParameterDescriptors(JNIEnv *env, jobject obj)
Chris@9 73 {
Chris@9 74 Plugin *p = getHandle<Plugin>(env, obj);
Chris@9 75 PluginBase::ParameterList params = p->getParameterDescriptors();
Chris@9 76 jclass descClass = env->FindClass("org/vamp_plugins/ParameterDescriptor");
Chris@9 77 jobjectArray result = env->NewObjectArray(params.size(), descClass, 0);
Chris@9 78 for (int i = 0; i < params.size(); ++i) {
Chris@9 79
Chris@9 80 jmethodID ctor = env->GetMethodID(descClass, "<init>", "()V");
Chris@9 81 jobject desc = env->NewObject(descClass, ctor);
Chris@9 82
Chris@9 83 setStringField(env, desc, "identifier", params[i].identifier);
Chris@9 84 setStringField(env, desc, "name", params[i].name);
Chris@9 85 setStringField(env, desc, "description", params[i].description);
Chris@9 86 setStringField(env, desc, "unit", params[i].unit);
Chris@9 87 setFloatField(env, desc, "minValue", params[i].minValue);
Chris@9 88 setFloatField(env, desc, "maxValue", params[i].maxValue);
Chris@9 89 setFloatField(env, desc, "defaultValue", params[i].defaultValue);
Chris@9 90 setBooleanField(env, desc, "isQuantized", params[i].isQuantized);
Chris@9 91 setFloatField(env, desc, "quantizeStep", params[i].quantizeStep);
Chris@9 92 setStringArrayField(env, desc, "valueNames", params[i].valueNames);
Chris@9 93
Chris@9 94 env->SetObjectArrayElement(result, i, desc);
Chris@9 95 }
Chris@9 96
Chris@9 97 return result;
Chris@9 98 }
Chris@9 99
Chris@5 100 jfloat
Chris@5 101 Java_org_vamp_1plugins_Plugin_getParameter(JNIEnv *env, jobject obj,
Chris@5 102 jstring param)
Chris@5 103 {
Chris@5 104 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 105 const char *s = env->GetStringUTFChars(param, 0);
Chris@5 106 jfloat f = p->getParameter(s);
Chris@5 107 env->ReleaseStringUTFChars(param, s);
Chris@5 108 return f;
Chris@5 109 }
Chris@5 110
Chris@5 111 void
Chris@5 112 Java_org_vamp_1plugins_Plugin_setParameter(JNIEnv *env, jobject obj,
Chris@5 113 jstring param, jfloat f)
Chris@5 114 {
Chris@5 115 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 116 const char *s = env->GetStringUTFChars(param, 0);
Chris@5 117 p->setParameter(s, f);
Chris@5 118 env->ReleaseStringUTFChars(param, s);
Chris@5 119 }
Chris@6 120
Chris@5 121 jobjectArray
Chris@5 122 Java_org_vamp_1plugins_Plugin_getPrograms(JNIEnv *env, jobject obj)
Chris@5 123 {
Chris@6 124 Plugin *p = getHandle<Plugin>(env, obj);
Chris@6 125 PluginBase::ProgramList programs = p->getPrograms();
Chris@6 126 jobjectArray result = env->NewObjectArray
Chris@6 127 (programs.size(), env->FindClass("java/lang/String"), 0);
Chris@6 128 for (int i = 0; i < programs.size(); ++i) {
Chris@6 129 env->SetObjectArrayElement(result, i,
Chris@6 130 env->NewStringUTF(programs[i].c_str()));
Chris@6 131 }
Chris@6 132 return result;
Chris@5 133 }
Chris@6 134
Chris@5 135 jstring
Chris@5 136 Java_org_vamp_1plugins_Plugin_getCurrentProgram(JNIEnv *env, jobject obj)
Chris@5 137 {
Chris@5 138 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 139 return env->NewStringUTF(p->getCurrentProgram().c_str());
Chris@5 140 }
Chris@5 141
Chris@5 142 void
Chris@5 143 Java_org_vamp_1plugins_Plugin_selectProgram(JNIEnv *env, jobject obj,
Chris@5 144 jstring program)
Chris@5 145 {
Chris@5 146 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 147 const char *s = env->GetStringUTFChars(program, 0);
Chris@5 148 p->selectProgram(s);
Chris@5 149 env->ReleaseStringUTFChars(program, s);
Chris@5 150 }
Chris@5 151
Chris@3 152 jboolean
Chris@3 153 Java_org_vamp_1plugins_Plugin_initialise(JNIEnv *env, jobject obj,
Chris@3 154 jint inputChannels, jint stepSize,
Chris@3 155 jint blockSize)
Chris@3 156 {
Chris@3 157 Plugin *p = getHandle<Plugin>(env, obj);
Chris@3 158 return p->initialise(inputChannels, stepSize, blockSize);
Chris@3 159 }
Chris@3 160
Chris@5 161 void
Chris@5 162 Java_org_vamp_1plugins_Plugin_reset(JNIEnv *env, jobject obj)
Chris@5 163 {
Chris@5 164 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 165 p->reset();
Chris@5 166 }
Chris@5 167
Chris@5 168 jobject
Chris@5 169 Java_org_vamp_1plugins_Plugin_getInputDomain(JNIEnv *env, jobject obj)
Chris@5 170 {
Chris@5 171 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 172 Plugin::InputDomain d = p->getInputDomain();
Chris@5 173
Chris@5 174 jclass ourEnumClass = env->FindClass("org/vamp_plugins/Plugin$InputDomain");
Chris@5 175
Chris@25 176 std::string dname = "TIME_DOMAIN";
Chris@25 177 if (d == Plugin::FrequencyDomain) dname = "FREQUENCY_DOMAIN";
Chris@5 178
Chris@26 179 jstring sn = env->NewStringUTF(dname.c_str());
Chris@26 180 jobject e = env->CallStaticObjectMethod
Chris@26 181 (ourEnumClass, getEnumValueOfMethod(env), ourEnumClass, sn);
Chris@26 182
Chris@26 183 env->DeleteLocalRef(sn);
Chris@26 184 return e;
Chris@5 185 }
Chris@5 186
Chris@5 187 jint
Chris@5 188 Java_org_vamp_1plugins_Plugin_getPreferredBlockSize(JNIEnv *env, jobject obj)
Chris@5 189 {
Chris@5 190 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 191 return p->getPreferredBlockSize();
Chris@5 192 }
Chris@5 193
Chris@5 194 jint
Chris@5 195 Java_org_vamp_1plugins_Plugin_getPreferredStepSize(JNIEnv *env, jobject obj)
Chris@5 196 {
Chris@5 197 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 198 return p->getPreferredStepSize();
Chris@5 199 }
Chris@5 200
Chris@5 201 jint
Chris@5 202 Java_org_vamp_1plugins_Plugin_getMinChannelCount(JNIEnv *env, jobject obj)
Chris@5 203 {
Chris@5 204 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 205 return p->getMinChannelCount();
Chris@5 206 }
Chris@5 207
Chris@5 208 jint
Chris@5 209 Java_org_vamp_1plugins_Plugin_getMaxChannelCount(JNIEnv *env, jobject obj)
Chris@5 210 {
Chris@5 211 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 212 return p->getMaxChannelCount();
Chris@5 213 }
Chris@5 214
Chris@5 215 jobjectArray
Chris@5 216 Java_org_vamp_1plugins_Plugin_getOutputDescriptors(JNIEnv *env, jobject obj)
Chris@5 217 {
Chris@5 218 Plugin *p = getHandle<Plugin>(env, obj);
Chris@6 219 Plugin::OutputList outputs = p->getOutputDescriptors();
Chris@6 220 jclass descClass = env->FindClass("org/vamp_plugins/OutputDescriptor");
Chris@6 221 jobjectArray result = env->NewObjectArray(outputs.size(), descClass, 0);
Chris@6 222 for (int i = 0; i < outputs.size(); ++i) {
Chris@6 223
Chris@7 224 jmethodID ctor = env->GetMethodID(descClass, "<init>", "()V");
Chris@7 225 jobject desc = env->NewObject(descClass, ctor);
Chris@7 226
Chris@7 227 setStringField(env, desc, "identifier", outputs[i].identifier);
Chris@7 228 setStringField(env, desc, "name", outputs[i].name);
Chris@7 229 setStringField(env, desc, "description", outputs[i].description);
Chris@7 230 setStringField(env, desc, "unit", outputs[i].unit);
Chris@7 231 setBooleanField(env, desc, "hasFixedBinCount", outputs[i].hasFixedBinCount);
Chris@7 232 setIntField(env, desc, "binCount", outputs[i].binCount);
Chris@7 233 setStringArrayField(env, desc, "binNames", outputs[i].binNames);
Chris@7 234 setBooleanField(env, desc, "hasKnownExtents", outputs[i].hasKnownExtents);
Chris@7 235 setFloatField(env, desc, "minValue", outputs[i].minValue);
Chris@7 236 setFloatField(env, desc, "maxValue", outputs[i].maxValue);
Chris@7 237 setBooleanField(env, desc, "isQuantized", outputs[i].isQuantized);
Chris@7 238 setFloatField(env, desc, "quantizeStep", outputs[i].quantizeStep);
Chris@7 239 setFloatField(env, desc, "sampleRate", outputs[i].sampleRate);
Chris@7 240 setBooleanField(env, desc, "hasDuration", outputs[i].hasDuration);
Chris@7 241
Chris@7 242 jclass sampleTypeClass = env->FindClass
Chris@7 243 ("org/vamp_plugins/OutputDescriptor$SampleType");
Chris@7 244
Chris@7 245 const char *stype;
Chris@7 246 switch (outputs[i].sampleType) {
Chris@7 247 case Plugin::OutputDescriptor::OneSamplePerStep:
Chris@7 248 stype = "OneSamplePerStep";
Chris@7 249 break;
Chris@7 250 case Plugin::OutputDescriptor::FixedSampleRate:
Chris@7 251 stype = "FixedSampleRate";
Chris@7 252 break;
Chris@7 253 case Plugin::OutputDescriptor::VariableSampleRate:
Chris@7 254 stype = "VariableSampleRate";
Chris@7 255 break;
Chris@7 256 }
Chris@7 257
Chris@26 258 jstring sn = env->NewStringUTF(stype);
Chris@7 259 jobject sampleType = env->CallStaticObjectMethod
Chris@26 260 (sampleTypeClass, getEnumValueOfMethod(env), sampleTypeClass, sn);
Chris@26 261 env->DeleteLocalRef(sn);
Chris@7 262
Chris@7 263 setObjectField(env, desc, "sampleType",
Chris@7 264 "Lorg/vamp_plugins/OutputDescriptor$SampleType;",
Chris@7 265 sampleType);
Chris@7 266
Chris@7 267 env->SetObjectArrayElement(result, i, desc);
Chris@6 268 }
Chris@7 269
Chris@7 270 return result;
Chris@5 271 }
Chris@5 272
Chris@12 273 static jobject
Chris@14 274 convertFeature(JNIEnv *env, const Plugin::Feature &feature)
Chris@14 275 {
Chris@18 276 jclass featClass = env->FindClass("org/vamp_plugins/Feature");
Chris@14 277 jmethodID ctor = env->GetMethodID(featClass, "<init>", "()V");
Chris@14 278 jobject jfeature = env->NewObject(featClass, ctor);
Chris@14 279
Chris@14 280 setBooleanField(env, jfeature, "hasTimestamp", feature.hasTimestamp);
Chris@14 281 setRealTimeField(env, jfeature, "timestamp", feature.timestamp);
Chris@14 282 setBooleanField(env, jfeature, "hasDuration", feature.hasDuration);
Chris@14 283 setRealTimeField(env, jfeature, "duration", feature.duration);
Chris@14 284 setFloatArrayField(env, jfeature, "values", feature.values);
Chris@14 285 setStringField(env, jfeature, "label", feature.label);
Chris@14 286
Chris@14 287 return jfeature;
Chris@14 288 }
Chris@14 289
Chris@14 290 static jobject
Chris@14 291 convertFeatures(JNIEnv *env, const Plugin::FeatureSet &features)
Chris@12 292 {
Chris@12 293 jobject result;
Chris@12 294
Chris@14 295 // FeatureSet is map<int, vector<Feature> > where Feature is a struct.
Chris@15 296 // We need to return a TreeMap<Integer, ArrayList<Feature>>
Chris@12 297
Chris@15 298 jclass treeMapClass = env->FindClass("java/util/TreeMap");
Chris@15 299 jmethodID treeMapCtor = env->GetMethodID(treeMapClass, "<init>", "()V");
Chris@15 300 jmethodID inserter = env->GetMethodID
Chris@15 301 (treeMapClass, "put",
Chris@15 302 "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
Chris@14 303
Chris@15 304 jclass listClass = env->FindClass("java/util/ArrayList");
Chris@15 305 jmethodID listCtor = env->GetMethodID(listClass, "<init>", "()V");
Chris@15 306 jmethodID adder = env->GetMethodID
Chris@15 307 (listClass, "add", "(Ljava/lang/Object;)Z");
Chris@15 308
Chris@15 309 jclass intClass = env->FindClass("java/lang/Integer");
Chris@15 310 jmethodID intCtor = env->GetMethodID(intClass, "<init>", "(I)V");
Chris@15 311
Chris@15 312 result = env->NewObject(treeMapClass, treeMapCtor);
Chris@15 313
Chris@15 314 for (Plugin::FeatureSet::const_iterator i = features.begin();
Chris@15 315 i != features.end(); ++i) {
Chris@15 316
Chris@15 317 int output = i->first;
Chris@15 318 const Plugin::FeatureList &fl = i->second;
Chris@15 319
Chris@15 320 jobject listObject = env->NewObject(listClass, listCtor);
Chris@15 321
Chris@15 322 for (Plugin::FeatureList::const_iterator j = fl.begin();
Chris@15 323 j != fl.end(); ++j) {
Chris@15 324 jobject feature = convertFeature(env, *j);
Chris@15 325 (void)env->CallBooleanMethod(listObject, adder, feature);
Chris@15 326 }
Chris@15 327
Chris@15 328 jobject integer = env->NewObject(intClass, intCtor, output);
Chris@15 329
Chris@15 330 (void)env->CallObjectMethod(result, inserter, integer, listObject);
Chris@15 331 }
Chris@15 332
Chris@15 333 return result;
Chris@12 334 }
Chris@12 335
Chris@5 336 jobject
Chris@24 337 Java_org_vamp_1plugins_Plugin_process(JNIEnv *env, jobject obj, jobjectArray data, jint offset, jobject timestamp)
Chris@5 338 {
Chris@5 339 Plugin *p = getHandle<Plugin>(env, obj);
Chris@10 340
Chris@21 341 const Vamp::RealTime *const rt = getHandle<Vamp::RealTime>(env, timestamp);
Chris@10 342
Chris@10 343 int channels = env->GetArrayLength(data);
Chris@24 344 float **arr = new float *[channels];
Chris@10 345 float **input = new float *[channels];
Chris@10 346 for (int c = 0; c < channels; ++c) {
Chris@10 347 jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(data, c);
Chris@24 348 arr[c] = env->GetFloatArrayElements(cdata, 0);
Chris@24 349 input[c] = arr[c] + offset;
Chris@10 350 }
Chris@10 351
Chris@21 352 Plugin::FeatureSet features = p->process(input, *rt);
Chris@10 353
Chris@10 354 for (int c = 0; c < channels; ++c) {
Chris@10 355 jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(data, c);
Chris@10 356 env->ReleaseFloatArrayElements(cdata, input[c], 0);
Chris@10 357 }
Chris@10 358
Chris@10 359 delete[] input;
Chris@24 360 delete[] arr;
Chris@10 361
Chris@14 362 return convertFeatures(env, features);
Chris@5 363 }
Chris@5 364
Chris@5 365 jobject
Chris@5 366 Java_org_vamp_1plugins_Plugin_getRemainingFeatures(JNIEnv *env, jobject obj)
Chris@5 367 {
Chris@5 368 Plugin *p = getHandle<Plugin>(env, obj);
Chris@10 369
Chris@10 370 Plugin::FeatureSet features = p->getRemainingFeatures();
Chris@10 371
Chris@14 372 return convertFeatures(env, features);
Chris@5 373 }
Chris@5 374