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
|