changeset 87:dd56716714e0

Add output_index to the returned output descriptor as well; use it
author Chris Cannam
date Wed, 21 Jan 2015 15:04:05 +0000
parents 78844c4b329c
children 7228921e8425
files native/PyPluginObject.cpp native/PyRealTime.cpp test/test_plugin_metadata.py vamp/process.py
diffstat 4 files changed, 17 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/native/PyPluginObject.cpp	Wed Jan 21 14:03:43 2015 +0000
+++ b/native/PyPluginObject.cpp	Wed Jan 21 15:04:05 2015 +0000
@@ -171,7 +171,7 @@
 }
 
 static PyObject *
-convertOutput(const Plugin::OutputDescriptor &desc)
+convertOutput(const Plugin::OutputDescriptor &desc, int ix)
 {
     PyObject *outdict = PyDict_New();
     PyDict_SetItemString
@@ -210,6 +210,8 @@
         (outdict, "sample_rate", PyFloat_FromDouble(desc.sampleRate));
     PyDict_SetItemString
         (outdict, "has_duration", desc.hasDuration ? Py_True : Py_False);
+    PyDict_SetItemString
+        (outdict, "output_index", PyInt_FromLong(ix));
     return outdict;
 }
 
@@ -229,18 +231,20 @@
         return 0;
     }
 
+    PyErr_Clear();
+    
     Plugin::OutputList ol = pd->plugin->getOutputDescriptors();
 
     if (pyId) {
         string id = PyString_AS_STRING(pyId);
         for (int i = 0; i < int(ol.size()); ++i) {
             if (ol[i].identifier == id) {
-                return convertOutput(ol[i]);
+                return convertOutput(ol[i], i);
             }
         }
     } else {
         if (n >= 0 && n < int(ol.size())) {
-            return convertOutput(ol[n]);
+            return convertOutput(ol[n], n);
         }
     }
 
@@ -258,7 +262,7 @@
     PyObject *outputs = PyList_New(ol.size());
     
     for (int i = 0; i < (int)ol.size(); ++i) {
-        PyObject *outdict = convertOutput(ol[i]);
+        PyObject *outdict = convertOutput(ol[i], i);
         PyList_SET_ITEM(outputs, i, outdict);
     }
 
--- a/native/PyRealTime.cpp	Wed Jan 21 14:03:43 2015 +0000
+++ b/native/PyRealTime.cpp	Wed Jan 21 15:04:05 2015 +0000
@@ -68,7 +68,7 @@
         return NULL; 
     }
 
-    // PyErr_Clear();
+    PyErr_Clear();
 
     // RealTimeObject *self = PyObject_New(RealTimeObject, &RealTime_Type); 
     RealTimeObject *self = (RealTimeObject*)type->tp_alloc(type, 0);
--- a/test/test_plugin_metadata.py	Wed Jan 21 14:03:43 2015 +0000
+++ b/test/test_plugin_metadata.py	Wed Jan 21 15:04:05 2015 +0000
@@ -34,6 +34,7 @@
     plug = vh.load_plugin(plugin_key, rate, vh.ADAPT_NONE)
     out = plug.get_output("input-summary")
     assert "sample_type" in out
+    assert out["output_index"] == 8
     try:
         out = plug.get_output("chops")
         assert False
@@ -50,6 +51,7 @@
     out = plug.get_output(0)
     assert "sample_type" in out
     assert out["identifier"] == "instants"
+    assert out["output_index"] == 0
     try:
         out = plug.get_output(20)
         assert False
--- a/vamp/process.py	Wed Jan 21 14:03:43 2015 +0000
+++ b/vamp/process.py	Wed Jan 21 15:04:05 2015 +0000
@@ -7,8 +7,7 @@
 def load_and_query(data, sample_rate, key, parameters):
     plug, step_size, block_size = load.load_and_configure(data, sample_rate, key, parameters)
     plug_outs = plug.get_outputs()
-    out_indices = dict(zip([o["identifier"] for o in plug_outs],
-                          range(0, len(plug_outs))))  # id -> n
+    out_indices = dict([(o["identifier"], o["output_index"]) for o in plug_outs])
     return plug, step_size, block_size, out_indices
     
 
@@ -45,13 +44,14 @@
 def process(data, sample_rate, key, output = "", parameters = {}):
 #!!! docstring
 
-    plug, step_size, block_size, out_indices = load_and_query(data, sample_rate, key, parameters)
+    plug, step_size, block_size = load.load_and_configure(data, sample_rate, key, parameters)
 
     if output == "":
-        outix = 0
+        out = plug.get_output(0)
     else:
-        assert output in out_indices
-        outix = out_indices[output]
+        out = plug.get_output(output)
+
+    outix = out["output_index"]
     
     ff = frames.frames_from_array(data, step_size, block_size)
     fi = 0