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
|