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
|