annotate src/Plugin.cpp @ 19:5b0847d344c3

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