changeset 41:55fcd0e3e513

Fix handling of 2D NumPy arrays
author Chris Cannam
date Wed, 26 Nov 2014 18:08:53 +0000
parents fa3f80d4e340
children 9dd449a19004
files PyPluginObject.cpp VectorConversion.cpp VectorConversion.h test_process.py
diffstat 4 files changed, 20 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/PyPluginObject.cpp	Wed Nov 26 15:58:46 2014 +0000
+++ b/PyPluginObject.cpp	Wed Nov 26 18:08:53 2014 +0000
@@ -392,6 +392,12 @@
             return data;
         }
 
+        if ((int)data.size() != channels) {
+//            cerr << "Wrong number of channels: got " << data.size() << ", expected " << channels << endl;
+            PyErr_SetString(PyExc_TypeError, "Wrong number of channels");
+            return vector<vector<float> >();
+        }
+        
     } else {
         
         if (!PyList_Check(pyBuffer)) {
@@ -400,7 +406,7 @@
         }
 
         if (PyList_GET_SIZE(pyBuffer) != channels) {
-            cerr << "Wrong number of channels: got " << PyList_GET_SIZE(pyBuffer) << ", expected " << channels << endl;
+//            cerr << "Wrong number of channels: got " << PyList_GET_SIZE(pyBuffer) << ", expected " << channels << endl;
             PyErr_SetString(PyExc_TypeError, "Wrong number of channels");
             return data;
         }
@@ -409,13 +415,13 @@
             PyObject *cbuf = PyList_GET_ITEM(pyBuffer, c);
             data.push_back(conv.PyValue_To_FloatVector(cbuf));
         }
+    }
     
-        for (int c = 0; c < channels; ++c) {
-            if ((int)data[c].size() != blockSize) {
-                cerr << "Wrong number of samples on channel " << c << ": expected " << blockSize << " (plugin's block size), got " << data[c].size() << endl;
-                PyErr_SetString(PyExc_TypeError, "Wrong number of samples");
-                return vector<vector<float> >();
-            }
+    for (int c = 0; c < channels; ++c) {
+        if ((int)data[c].size() != blockSize) {
+//            cerr << "Wrong number of samples on channel " << c << ": expected " << blockSize << " (plugin's block size), got " << data[c].size() << endl;
+            PyErr_SetString(PyExc_TypeError, "Wrong number of samples");
+            return vector<vector<float> >();
         }
     }
     
--- a/VectorConversion.cpp	Wed Nov 26 15:58:46 2014 +0000
+++ b/VectorConversion.cpp	Wed Nov 26 18:08:53 2014 +0000
@@ -191,9 +191,7 @@
     }
 
     /// check strides (useful if array is not continuous)
-    size_t strides =  *((size_t*) PyArray_STRIDES(pyArray));
-
-    cerr << "dims = " << PyArray_DIMS(pyArray)[0] << "x" << PyArray_DIMS(pyArray)[1] << ", strides = " << strides << endl;
+    size_t *strideptr =  (size_t*) PyArray_STRIDES(pyArray);
     
     /// convert the array
     for (int i = 0; i < PyArray_DIMS(pyArray)[0]; ++i) {
@@ -203,16 +201,16 @@
         switch (descr->type_num) {
         
         case NPY_FLOAT : // dtype='float32'
-            vv = PyArray_Convert<float,float>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strides);
+            vv = PyArray_Convert<float,float>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strideptr[1]);
             break;
         case NPY_DOUBLE : // dtype='float64'
-            vv = PyArray_Convert<float,double>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strides);
+            vv = PyArray_Convert<float,double>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strideptr[1]);
             break;
         case NPY_INT : // dtype='int'
-            vv = PyArray_Convert<float,int>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strides);
+            vv = PyArray_Convert<float,int>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strideptr[1]);
             break;
         case NPY_LONG : // dtype='long'
-            vv = PyArray_Convert<float,long>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strides);
+            vv = PyArray_Convert<float,long>(PyArray_GETPTR2(pyArray, i, 0),PyArray_DIMS(pyArray)[1],strideptr[1]);
             break;
         default :
             string msg = "Unsupported value type in NumPy array object.";
--- a/VectorConversion.h	Wed Nov 26 15:58:46 2014 +0000
+++ b/VectorConversion.h	Wed Nov 26 18:08:53 2014 +0000
@@ -102,8 +102,6 @@
                                      int length,
                                      size_t strides) const {
 
-        std::cerr << "PyArray_Convert: raw pointer is " << (long long)(raw_data_ptr) << std::endl;
-        
         std::vector<RET> v(length);
 		
         /// check if the array is continuous, if not use strides info
--- a/test_process.py	Wed Nov 26 15:58:46 2014 +0000
+++ b/test_process.py	Wed Nov 26 18:08:53 2014 +0000
@@ -4,6 +4,8 @@
 
 testPluginKey = "vamp-test-plugin:vamp-test-plugin"
 
+##!!! todo: support for, and test for, correct version of test plugin (with parameter)
+
 rate = 44100
 
 def test_load_unload():