annotate src/Plugin.cpp @ 55:2b8e1416327d tip

Just change a couple of include guards
author Chris Cannam
date Wed, 16 Nov 2016 09:12:46 +0000
parents 2db3640905ef
children
rev   line source
Chris@37 1 /*
Chris@37 2 jVamp
Chris@37 3
Chris@37 4 A Java host interface for Vamp audio analysis plugins
Chris@37 5
Chris@37 6 Centre for Digital Music, Queen Mary, University of London.
Chris@37 7 Copyright 2012 Chris Cannam and QMUL.
Chris@37 8
Chris@37 9 Permission is hereby granted, free of charge, to any person
Chris@37 10 obtaining a copy of this software and associated documentation
Chris@37 11 files (the "Software"), to deal in the Software without
Chris@37 12 restriction, including without limitation the rights to use, copy,
Chris@37 13 modify, merge, publish, distribute, sublicense, and/or sell copies
Chris@37 14 of the Software, and to permit persons to whom the Software is
Chris@37 15 furnished to do so, subject to the following conditions:
Chris@37 16
Chris@37 17 The above copyright notice and this permission notice shall be
Chris@37 18 included in all copies or substantial portions of the Software.
Chris@37 19
Chris@37 20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
Chris@37 21 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
Chris@37 22 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
Chris@37 23 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
Chris@37 24 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
Chris@37 25 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
Chris@37 26 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Chris@37 27
Chris@37 28 Except as contained in this notice, the names of the Centre for
Chris@37 29 Digital Music; Queen Mary, University of London; and Chris Cannam
Chris@37 30 shall not be used in advertising or otherwise to promote the sale,
Chris@37 31 use or other dealings in this Software without prior written
Chris@37 32 authorization.
Chris@37 33 */
Chris@37 34
Chris@0 35 #include "org_vamp_plugins_Plugin.h"
Chris@0 36
Chris@0 37 #include <vamp-hostsdk/Plugin.h>
Chris@0 38
Chris@0 39 #include "handle.h"
Chris@7 40 #include "getset.h"
Chris@7 41
Chris@7 42 #include <iostream>
Chris@0 43
Chris@0 44 using Vamp::Plugin;
Chris@6 45 using Vamp::PluginBase;
Chris@0 46 using std::string;
Chris@0 47
Chris@30 48 JNIEXPORT void JNICALL
Chris@20 49 Java_org_vamp_1plugins_Plugin_dispose(JNIEnv *env, jobject obj)
Chris@20 50 {
Chris@20 51 Plugin *p = getHandle<Plugin>(env, obj);
Chris@20 52 setHandle<Plugin>(env, obj, 0);
Chris@20 53 delete p;
Chris@20 54 }
Chris@20 55
Chris@30 56 JNIEXPORT jint JNICALL
Chris@4 57 Java_org_vamp_1plugins_Plugin_getVampApiVersion(JNIEnv *env, jobject obj)
Chris@4 58 {
Chris@4 59 Plugin *p = getHandle<Plugin>(env, obj);
Chris@4 60 return p->getVampApiVersion();
Chris@4 61 }
Chris@4 62
Chris@30 63 JNIEXPORT jstring JNICALL
Chris@0 64 Java_org_vamp_1plugins_Plugin_getIdentifier(JNIEnv *env, jobject obj)
Chris@0 65 {
Chris@0 66 Plugin *p = getHandle<Plugin>(env, obj);
Chris@0 67 return env->NewStringUTF(p->getIdentifier().c_str());
Chris@0 68 }
Chris@0 69
Chris@30 70 JNIEXPORT jstring JNICALL
Chris@0 71 Java_org_vamp_1plugins_Plugin_getName(JNIEnv *env, jobject obj)
Chris@0 72 {
Chris@0 73 Plugin *p = getHandle<Plugin>(env, obj);
Chris@0 74 return env->NewStringUTF(p->getName().c_str());
Chris@0 75 }
Chris@0 76
Chris@30 77 JNIEXPORT jstring JNICALL
Chris@0 78 Java_org_vamp_1plugins_Plugin_getDescription(JNIEnv *env, jobject obj)
Chris@0 79 {
Chris@0 80 Plugin *p = getHandle<Plugin>(env, obj);
Chris@0 81 return env->NewStringUTF(p->getDescription().c_str());
Chris@0 82 }
Chris@0 83
Chris@30 84 JNIEXPORT jstring JNICALL
Chris@4 85 Java_org_vamp_1plugins_Plugin_getMaker(JNIEnv *env, jobject obj)
Chris@4 86 {
Chris@4 87 Plugin *p = getHandle<Plugin>(env, obj);
Chris@4 88 return env->NewStringUTF(p->getMaker().c_str());
Chris@4 89 }
Chris@4 90
Chris@30 91 JNIEXPORT jstring JNICALL
Chris@4 92 Java_org_vamp_1plugins_Plugin_getCopyright(JNIEnv *env, jobject obj)
Chris@4 93 {
Chris@4 94 Plugin *p = getHandle<Plugin>(env, obj);
Chris@4 95 return env->NewStringUTF(p->getCopyright().c_str());
Chris@4 96 }
Chris@4 97
Chris@30 98 JNIEXPORT jint JNICALL
Chris@0 99 Java_org_vamp_1plugins_Plugin_getPluginVersion(JNIEnv *env, jobject obj)
Chris@0 100 {
Chris@0 101 Plugin *p = getHandle<Plugin>(env, obj);
Chris@0 102 return p->getPluginVersion();
Chris@0 103 }
Chris@0 104
Chris@30 105 JNIEXPORT jobjectArray JNICALL
Chris@9 106 Java_org_vamp_1plugins_Plugin_getParameterDescriptors(JNIEnv *env, jobject obj)
Chris@9 107 {
Chris@9 108 Plugin *p = getHandle<Plugin>(env, obj);
Chris@9 109 PluginBase::ParameterList params = p->getParameterDescriptors();
Chris@9 110 jclass descClass = env->FindClass("org/vamp_plugins/ParameterDescriptor");
Chris@9 111 jobjectArray result = env->NewObjectArray(params.size(), descClass, 0);
chris@46 112 for (int i = 0; i < (int)params.size(); ++i) {
Chris@9 113
Chris@9 114 jmethodID ctor = env->GetMethodID(descClass, "<init>", "()V");
Chris@9 115 jobject desc = env->NewObject(descClass, ctor);
Chris@9 116
Chris@9 117 setStringField(env, desc, "identifier", params[i].identifier);
Chris@9 118 setStringField(env, desc, "name", params[i].name);
Chris@9 119 setStringField(env, desc, "description", params[i].description);
Chris@9 120 setStringField(env, desc, "unit", params[i].unit);
Chris@9 121 setFloatField(env, desc, "minValue", params[i].minValue);
Chris@9 122 setFloatField(env, desc, "maxValue", params[i].maxValue);
Chris@9 123 setFloatField(env, desc, "defaultValue", params[i].defaultValue);
Chris@9 124 setBooleanField(env, desc, "isQuantized", params[i].isQuantized);
Chris@9 125 setFloatField(env, desc, "quantizeStep", params[i].quantizeStep);
Chris@9 126 setStringArrayField(env, desc, "valueNames", params[i].valueNames);
Chris@9 127
Chris@9 128 env->SetObjectArrayElement(result, i, desc);
Chris@9 129 }
Chris@9 130
Chris@9 131 return result;
Chris@9 132 }
Chris@9 133
Chris@30 134 JNIEXPORT jfloat JNICALL
Chris@5 135 Java_org_vamp_1plugins_Plugin_getParameter(JNIEnv *env, jobject obj,
Chris@5 136 jstring param)
Chris@5 137 {
Chris@5 138 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 139 const char *s = env->GetStringUTFChars(param, 0);
Chris@5 140 jfloat f = p->getParameter(s);
Chris@5 141 env->ReleaseStringUTFChars(param, s);
Chris@5 142 return f;
Chris@5 143 }
Chris@5 144
Chris@30 145 JNIEXPORT void JNICALL
Chris@5 146 Java_org_vamp_1plugins_Plugin_setParameter(JNIEnv *env, jobject obj,
Chris@5 147 jstring param, jfloat f)
Chris@5 148 {
Chris@5 149 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 150 const char *s = env->GetStringUTFChars(param, 0);
Chris@5 151 p->setParameter(s, f);
Chris@5 152 env->ReleaseStringUTFChars(param, s);
Chris@5 153 }
Chris@6 154
Chris@30 155 JNIEXPORT jobjectArray JNICALL
Chris@5 156 Java_org_vamp_1plugins_Plugin_getPrograms(JNIEnv *env, jobject obj)
Chris@5 157 {
Chris@6 158 Plugin *p = getHandle<Plugin>(env, obj);
Chris@6 159 PluginBase::ProgramList programs = p->getPrograms();
Chris@6 160 jobjectArray result = env->NewObjectArray
Chris@6 161 (programs.size(), env->FindClass("java/lang/String"), 0);
chris@46 162 for (int i = 0; i < (int)programs.size(); ++i) {
Chris@6 163 env->SetObjectArrayElement(result, i,
Chris@6 164 env->NewStringUTF(programs[i].c_str()));
Chris@6 165 }
Chris@6 166 return result;
Chris@5 167 }
Chris@6 168
Chris@30 169 JNIEXPORT jstring JNICALL
Chris@5 170 Java_org_vamp_1plugins_Plugin_getCurrentProgram(JNIEnv *env, jobject obj)
Chris@5 171 {
Chris@5 172 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 173 return env->NewStringUTF(p->getCurrentProgram().c_str());
Chris@5 174 }
Chris@5 175
Chris@30 176 JNIEXPORT void JNICALL
Chris@5 177 Java_org_vamp_1plugins_Plugin_selectProgram(JNIEnv *env, jobject obj,
Chris@5 178 jstring program)
Chris@5 179 {
Chris@5 180 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 181 const char *s = env->GetStringUTFChars(program, 0);
Chris@5 182 p->selectProgram(s);
Chris@5 183 env->ReleaseStringUTFChars(program, s);
Chris@5 184 }
Chris@5 185
Chris@30 186 JNIEXPORT jboolean JNICALL
Chris@3 187 Java_org_vamp_1plugins_Plugin_initialise(JNIEnv *env, jobject obj,
Chris@3 188 jint inputChannels, jint stepSize,
Chris@3 189 jint blockSize)
Chris@3 190 {
Chris@3 191 Plugin *p = getHandle<Plugin>(env, obj);
Chris@3 192 return p->initialise(inputChannels, stepSize, blockSize);
Chris@3 193 }
Chris@3 194
Chris@30 195 JNIEXPORT void JNICALL
Chris@5 196 Java_org_vamp_1plugins_Plugin_reset(JNIEnv *env, jobject obj)
Chris@5 197 {
Chris@5 198 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 199 p->reset();
Chris@5 200 }
Chris@5 201
Chris@30 202 JNIEXPORT jobject JNICALL
Chris@5 203 Java_org_vamp_1plugins_Plugin_getInputDomain(JNIEnv *env, jobject obj)
Chris@5 204 {
Chris@5 205 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 206 Plugin::InputDomain d = p->getInputDomain();
Chris@5 207
Chris@5 208 jclass ourEnumClass = env->FindClass("org/vamp_plugins/Plugin$InputDomain");
Chris@5 209
Chris@25 210 std::string dname = "TIME_DOMAIN";
Chris@25 211 if (d == Plugin::FrequencyDomain) dname = "FREQUENCY_DOMAIN";
Chris@5 212
Chris@26 213 jstring sn = env->NewStringUTF(dname.c_str());
Chris@26 214 jobject e = env->CallStaticObjectMethod
Chris@26 215 (ourEnumClass, getEnumValueOfMethod(env), ourEnumClass, sn);
Chris@26 216
Chris@26 217 env->DeleteLocalRef(sn);
Chris@26 218 return e;
Chris@5 219 }
Chris@5 220
Chris@30 221 JNIEXPORT jint JNICALL
Chris@5 222 Java_org_vamp_1plugins_Plugin_getPreferredBlockSize(JNIEnv *env, jobject obj)
Chris@5 223 {
Chris@5 224 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 225 return p->getPreferredBlockSize();
Chris@5 226 }
Chris@5 227
Chris@30 228 JNIEXPORT jint JNICALL
Chris@5 229 Java_org_vamp_1plugins_Plugin_getPreferredStepSize(JNIEnv *env, jobject obj)
Chris@5 230 {
Chris@5 231 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 232 return p->getPreferredStepSize();
Chris@5 233 }
Chris@5 234
Chris@30 235 JNIEXPORT jint JNICALL
Chris@5 236 Java_org_vamp_1plugins_Plugin_getMinChannelCount(JNIEnv *env, jobject obj)
Chris@5 237 {
Chris@5 238 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 239 return p->getMinChannelCount();
Chris@5 240 }
Chris@5 241
Chris@30 242 JNIEXPORT jint JNICALL
Chris@5 243 Java_org_vamp_1plugins_Plugin_getMaxChannelCount(JNIEnv *env, jobject obj)
Chris@5 244 {
Chris@5 245 Plugin *p = getHandle<Plugin>(env, obj);
Chris@5 246 return p->getMaxChannelCount();
Chris@5 247 }
Chris@5 248
Chris@30 249 JNIEXPORT jobjectArray JNICALL
Chris@5 250 Java_org_vamp_1plugins_Plugin_getOutputDescriptors(JNIEnv *env, jobject obj)
Chris@5 251 {
Chris@5 252 Plugin *p = getHandle<Plugin>(env, obj);
Chris@6 253 Plugin::OutputList outputs = p->getOutputDescriptors();
Chris@6 254 jclass descClass = env->FindClass("org/vamp_plugins/OutputDescriptor");
Chris@6 255 jobjectArray result = env->NewObjectArray(outputs.size(), descClass, 0);
chris@46 256 for (int i = 0; i < (int)outputs.size(); ++i) {
Chris@6 257
Chris@7 258 jmethodID ctor = env->GetMethodID(descClass, "<init>", "()V");
Chris@7 259 jobject desc = env->NewObject(descClass, ctor);
Chris@7 260
Chris@7 261 setStringField(env, desc, "identifier", outputs[i].identifier);
Chris@7 262 setStringField(env, desc, "name", outputs[i].name);
Chris@7 263 setStringField(env, desc, "description", outputs[i].description);
Chris@7 264 setStringField(env, desc, "unit", outputs[i].unit);
Chris@7 265 setBooleanField(env, desc, "hasFixedBinCount", outputs[i].hasFixedBinCount);
Chris@7 266 setIntField(env, desc, "binCount", outputs[i].binCount);
Chris@7 267 setStringArrayField(env, desc, "binNames", outputs[i].binNames);
Chris@7 268 setBooleanField(env, desc, "hasKnownExtents", outputs[i].hasKnownExtents);
Chris@7 269 setFloatField(env, desc, "minValue", outputs[i].minValue);
Chris@7 270 setFloatField(env, desc, "maxValue", outputs[i].maxValue);
Chris@7 271 setBooleanField(env, desc, "isQuantized", outputs[i].isQuantized);
Chris@7 272 setFloatField(env, desc, "quantizeStep", outputs[i].quantizeStep);
Chris@7 273 setFloatField(env, desc, "sampleRate", outputs[i].sampleRate);
Chris@7 274 setBooleanField(env, desc, "hasDuration", outputs[i].hasDuration);
Chris@7 275
Chris@7 276 jclass sampleTypeClass = env->FindClass
Chris@7 277 ("org/vamp_plugins/OutputDescriptor$SampleType");
Chris@7 278
Chris@7 279 const char *stype;
Chris@7 280 switch (outputs[i].sampleType) {
Chris@7 281 case Plugin::OutputDescriptor::OneSamplePerStep:
Chris@7 282 stype = "OneSamplePerStep";
Chris@7 283 break;
Chris@7 284 case Plugin::OutputDescriptor::FixedSampleRate:
Chris@7 285 stype = "FixedSampleRate";
Chris@7 286 break;
Chris@7 287 case Plugin::OutputDescriptor::VariableSampleRate:
Chris@7 288 stype = "VariableSampleRate";
Chris@7 289 break;
Chris@7 290 }
Chris@7 291
Chris@26 292 jstring sn = env->NewStringUTF(stype);
Chris@7 293 jobject sampleType = env->CallStaticObjectMethod
Chris@26 294 (sampleTypeClass, getEnumValueOfMethod(env), sampleTypeClass, sn);
Chris@26 295 env->DeleteLocalRef(sn);
Chris@7 296
Chris@7 297 setObjectField(env, desc, "sampleType",
Chris@7 298 "Lorg/vamp_plugins/OutputDescriptor$SampleType;",
Chris@7 299 sampleType);
Chris@7 300
Chris@7 301 env->SetObjectArrayElement(result, i, desc);
Chris@6 302 }
Chris@7 303
Chris@7 304 return result;
Chris@5 305 }
Chris@5 306
chris@46 307 static jobject
Chris@14 308 convertFeature(JNIEnv *env, const Plugin::Feature &feature)
Chris@14 309 {
Chris@18 310 jclass featClass = env->FindClass("org/vamp_plugins/Feature");
Chris@14 311 jmethodID ctor = env->GetMethodID(featClass, "<init>", "()V");
Chris@14 312 jobject jfeature = env->NewObject(featClass, ctor);
Chris@14 313
Chris@14 314 setBooleanField(env, jfeature, "hasTimestamp", feature.hasTimestamp);
Chris@14 315 setRealTimeField(env, jfeature, "timestamp", feature.timestamp);
Chris@14 316 setBooleanField(env, jfeature, "hasDuration", feature.hasDuration);
Chris@14 317 setRealTimeField(env, jfeature, "duration", feature.duration);
Chris@14 318 setFloatArrayField(env, jfeature, "values", feature.values);
Chris@14 319 setStringField(env, jfeature, "label", feature.label);
Chris@14 320
Chris@14 321 return jfeature;
Chris@14 322 }
Chris@14 323
chris@46 324 static jobject
Chris@14 325 convertFeatures(JNIEnv *env, const Plugin::FeatureSet &features)
Chris@12 326 {
Chris@12 327 jobject result;
Chris@12 328
Chris@14 329 // FeatureSet is map<int, vector<Feature> > where Feature is a struct.
Chris@15 330 // We need to return a TreeMap<Integer, ArrayList<Feature>>
Chris@12 331
Chris@15 332 jclass treeMapClass = env->FindClass("java/util/TreeMap");
Chris@15 333 jmethodID treeMapCtor = env->GetMethodID(treeMapClass, "<init>", "()V");
Chris@15 334 jmethodID inserter = env->GetMethodID
Chris@15 335 (treeMapClass, "put",
Chris@15 336 "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
Chris@14 337
Chris@15 338 jclass listClass = env->FindClass("java/util/ArrayList");
Chris@15 339 jmethodID listCtor = env->GetMethodID(listClass, "<init>", "()V");
Chris@15 340 jmethodID adder = env->GetMethodID
Chris@15 341 (listClass, "add", "(Ljava/lang/Object;)Z");
Chris@15 342
Chris@15 343 jclass intClass = env->FindClass("java/lang/Integer");
Chris@15 344 jmethodID intCtor = env->GetMethodID(intClass, "<init>", "(I)V");
Chris@15 345
Chris@15 346 result = env->NewObject(treeMapClass, treeMapCtor);
Chris@15 347
Chris@15 348 for (Plugin::FeatureSet::const_iterator i = features.begin();
Chris@15 349 i != features.end(); ++i) {
Chris@15 350
Chris@15 351 int output = i->first;
Chris@15 352 const Plugin::FeatureList &fl = i->second;
Chris@15 353
Chris@15 354 jobject listObject = env->NewObject(listClass, listCtor);
Chris@15 355
Chris@15 356 for (Plugin::FeatureList::const_iterator j = fl.begin();
Chris@15 357 j != fl.end(); ++j) {
Chris@15 358 jobject feature = convertFeature(env, *j);
Chris@15 359 (void)env->CallBooleanMethod(listObject, adder, feature);
Chris@15 360 }
Chris@15 361
Chris@15 362 jobject integer = env->NewObject(intClass, intCtor, output);
Chris@15 363
Chris@15 364 (void)env->CallObjectMethod(result, inserter, integer, listObject);
Chris@15 365 }
Chris@15 366
Chris@15 367 return result;
Chris@12 368 }
Chris@12 369
Chris@30 370 JNIEXPORT jobject JNICALL
Chris@24 371 Java_org_vamp_1plugins_Plugin_process(JNIEnv *env, jobject obj, jobjectArray data, jint offset, jobject timestamp)
Chris@5 372 {
Chris@5 373 Plugin *p = getHandle<Plugin>(env, obj);
Chris@10 374
Chris@49 375 Vamp::RealTime rt = getRealTime(env, timestamp);
Chris@10 376
Chris@10 377 int channels = env->GetArrayLength(data);
Chris@24 378 float **arr = new float *[channels];
Chris@10 379 float **input = new float *[channels];
Chris@10 380 for (int c = 0; c < channels; ++c) {
Chris@10 381 jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(data, c);
Chris@24 382 arr[c] = env->GetFloatArrayElements(cdata, 0);
Chris@24 383 input[c] = arr[c] + offset;
Chris@10 384 }
Chris@10 385
Chris@49 386 Plugin::FeatureSet features = p->process(input, rt);
Chris@10 387
Chris@10 388 for (int c = 0; c < channels; ++c) {
Chris@10 389 jfloatArray cdata = (jfloatArray)env->GetObjectArrayElement(data, c);
Chris@10 390 env->ReleaseFloatArrayElements(cdata, input[c], 0);
Chris@10 391 }
Chris@10 392
Chris@10 393 delete[] input;
Chris@24 394 delete[] arr;
Chris@10 395
Chris@14 396 return convertFeatures(env, features);
Chris@5 397 }
Chris@5 398
Chris@30 399 JNIEXPORT jobject JNICALL
Chris@5 400 Java_org_vamp_1plugins_Plugin_getRemainingFeatures(JNIEnv *env, jobject obj)
Chris@5 401 {
Chris@5 402 Plugin *p = getHandle<Plugin>(env, obj);
Chris@10 403
Chris@10 404 Plugin::FeatureSet features = p->getRemainingFeatures();
Chris@10 405
Chris@14 406 return convertFeatures(env, features);
Chris@5 407 }
Chris@5 408