fazekasgy@31: #include fazekasgy@31: #include "PyExtensionModule.h" fazekasgy@31: #include "PyFeature.h" fazekasgy@31: #include "vamp-sdk/Plugin.h" fazekasgy@31: #include fazekasgy@31: /*#include "PyTypeInterface.h"*/ fazekasgy@31: fazekasgy@31: using namespace std; fazekasgy@31: using namespace Vamp; fazekasgy@31: using Vamp::Plugin; fazekasgy@31: fazekasgy@31: /* Feature Object's Methods */ fazekasgy@31: //Feature objects have no callable methods fazekasgy@31: fazekasgy@31: /* PyFeature methods implementing protocols */ fazekasgy@31: // these functions are called by the interpreter automatically fazekasgy@31: fazekasgy@31: fazekasgy@31: /* Function to set basic attributes fazekasgy@31: static int fazekasgy@31: Feature_setattr(FeatureObject *self, char *name, PyObject *value) fazekasgy@31: { fazekasgy@31: std::string key = std::string(name); fazekasgy@31: if (self->ti.SetValue(*(self->feature),key,value)) return 0; fazekasgy@31: else return -1; fazekasgy@31: }*/ fazekasgy@31: fazekasgy@31: /* Function to get basic attributes fazekasgy@31: static PyObject * fazekasgy@31: Feature_getattr(FeatureObject *self, char *name) fazekasgy@31: { fazekasgy@31: std::string key = std::string(name); fazekasgy@31: PyObject* pyValue; fazekasgy@31: if (self->ti.GetValue(*(self->feature),key,pyValue)) fazekasgy@31: return pyValue; fazekasgy@31: else return NULL; fazekasgy@31: }*/ fazekasgy@31: fazekasgy@31: /* Set attributes */ fazekasgy@31: static int fazekasgy@31: Feature_setattr(FeatureObject *self, char *name, PyObject *v) fazekasgy@31: { fazekasgy@31: if (v == NULL) { fazekasgy@31: int rv = PyDict_DelItemString(self->dict, name); fazekasgy@31: if (rv < 0) fazekasgy@31: PyErr_SetString(PyExc_AttributeError,"non-existing Feature attribute"); fazekasgy@31: return rv; fazekasgy@31: } fazekasgy@31: else fazekasgy@31: return PyDict_SetItemString(self->dict, name, v); fazekasgy@31: } fazekasgy@31: fazekasgy@31: fazekasgy@31: /* Get attributes */ fazekasgy@31: static PyObject * fazekasgy@31: Feature_getattr(FeatureObject *self, char *name) fazekasgy@31: { fazekasgy@31: if (self->dict != NULL) { fazekasgy@31: PyObject *v = PyDict_GetItemString(self->dict, name); fazekasgy@31: if (v != NULL) fazekasgy@31: { fazekasgy@31: Py_INCREF(v); fazekasgy@31: return v; fazekasgy@31: } fazekasgy@31: } fazekasgy@31: return NULL; fazekasgy@31: } fazekasgy@31: fazekasgy@31: /* New Feature object */ fazekasgy@31: static PyObject * fazekasgy@31: Feature_new(PyTypeObject *type, PyObject *args, PyObject *kw) fazekasgy@31: { fazekasgy@31: /// TODO support kwargs e.g. Feature(values = val, timestamp = ts) fazekasgy@31: cerr << "FeatureObject new method called" << endl; fazekasgy@31: if (!PyArg_ParseTuple(args, ":Feature")) { fazekasgy@31: PyErr_SetString(PyExc_TypeError, fazekasgy@31: "Error: Feature initialised with arguments."); fazekasgy@31: return NULL; fazekasgy@31: } fazekasgy@31: FeatureObject *self = (FeatureObject*)type->tp_alloc(type, 0); fazekasgy@31: // FeatureObject *self = PyObject_New(FeatureObject, &Feature_Type); fazekasgy@31: if (self == NULL) return NULL; fazekasgy@31: self->dict = PyDict_New(); fazekasgy@31: if (self->dict == NULL) return NULL; fazekasgy@31: return (PyObject *) self; fazekasgy@31: } fazekasgy@31: fazekasgy@31: /* DESTRUCTOR: delete type object */ fazekasgy@31: static void fazekasgy@31: FeatureObject_dealloc(FeatureObject *self) fazekasgy@31: { fazekasgy@31: Py_XDECREF(self->dict); fazekasgy@31: // delete self->feature; //delete the C object fazekasgy@31: // PyObject_Del(self); //delete the Python object fazekasgy@31: self->ob_type->tp_free((PyObject*)self); fazekasgy@31: cerr << "Feature object deallocated." << endl; fazekasgy@31: } fazekasgy@31: fazekasgy@31: fazekasgy@31: static int fazekasgy@31: Feature_init(FeatureObject *self, PyObject *args, PyObject *kwds) fazekasgy@31: { fazekasgy@31: cerr << "FeatureObject Init called" << endl; fazekasgy@31: return 0; fazekasgy@31: } fazekasgy@31: fazekasgy@31: PyObject* fazekasgy@31: Feature_test(PyObject *self, PyObject *args, PyObject *kwds) fazekasgy@31: { fazekasgy@31: cerr << "FeatureObject TEST called" << endl; fazekasgy@31: return self; fazekasgy@31: } fazekasgy@31: fazekasgy@31: fazekasgy@31: /* String representation */ fazekasgy@31: static PyObject * fazekasgy@31: Feature_repr(PyObject *self) fazekasgy@31: { fazekasgy@31: // if (PyFeature_CheckExact(self)) {} fazekasgy@31: // PyObject* intdict = self fazekasgy@31: return Py_BuildValue("s", fazekasgy@31: "not yet implemented"); fazekasgy@31: // ((RealTimeObject*)self)->rt->toString().c_str()); fazekasgy@31: } fazekasgy@31: fazekasgy@31: #define Feature_alloc PyType_GenericAlloc fazekasgy@31: #define Feature_free PyObject_Del fazekasgy@31: fazekasgy@31: fazekasgy@31: /* FEATURE TYPE OBJECT */ fazekasgy@31: fazekasgy@31: PyTypeObject Feature_Type = { fazekasgy@31: PyObject_HEAD_INIT(NULL) fazekasgy@31: 0, /*ob_size*/ fazekasgy@31: "vampy.Feature", /*tp_name*/ fazekasgy@31: sizeof(FeatureObject), /*tp_basicsize*/ fazekasgy@31: 0, /*tp_itemsize*/ fazekasgy@31: (destructor)FeatureObject_dealloc, /*tp_dealloc*/ fazekasgy@31: 0, /*tp_print*/ fazekasgy@31: (getattrfunc)Feature_getattr, /*tp_getattr*/ fazekasgy@31: (setattrfunc)Feature_setattr, /*tp_setattr*/ fazekasgy@31: 0, /*tp_compare*/ fazekasgy@31: Feature_repr, /*tp_repr*/ fazekasgy@31: 0, /*tp_as_number*/ fazekasgy@31: 0, /*tp_as_sequence*/ fazekasgy@31: 0, /*tp_as_mapping*/ fazekasgy@31: 0, /*tp_hash*/ fazekasgy@31: Feature_test, /*tp_call*/ // call on an instance fazekasgy@31: 0, /*tp_str*/ fazekasgy@31: 0, /*tp_getattro*/ fazekasgy@31: 0, /*tp_setattro*/ fazekasgy@31: 0, /*tp_as_buffer*/ fazekasgy@31: Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ fazekasgy@31: 0, /*tp_doc*/ fazekasgy@31: 0, /*tp_traverse*/ fazekasgy@31: 0, /*tp_clear*/ fazekasgy@31: 0, /*tp_richcompare*/ fazekasgy@31: 0, /*tp_weaklistoffset*/ fazekasgy@31: 0, /*tp_iter*/ fazekasgy@31: 0, /*tp_iternext*/ fazekasgy@31: 0, /*tp_methods*/ //TypeObject Methods fazekasgy@31: 0, /*tp_members*/ fazekasgy@31: 0, /*tp_getset*/ fazekasgy@31: 0, /*tp_base*/ fazekasgy@31: 0, /*tp_dict*/ fazekasgy@31: 0, /*tp_descr_get*/ fazekasgy@31: 0, /*tp_descr_set*/ fazekasgy@31: 0, /*tp_dictoffset*/ fazekasgy@31: 0,//(initproc)Feature_init, /*tp_init*/ fazekasgy@31: Feature_alloc, /*tp_alloc*/ fazekasgy@31: Feature_new, /*tp_new*/ fazekasgy@31: Feature_free, /*tp_free*/ fazekasgy@31: 0, /*tp_is_gc*/ fazekasgy@31: }; fazekasgy@31: fazekasgy@31: /* PyRealTime C++ API */ fazekasgy@31: fazekasgy@31: /*Feature* from PyFeature fazekasgy@31: const Vamp::Plugin::Feature* fazekasgy@31: PyFeature_AsFeature (PyObject *self) { fazekasgy@31: fazekasgy@31: FeatureObject *s = (FeatureObject*) self; fazekasgy@31: fazekasgy@31: if (!PyFeature_Check(s)) { fazekasgy@31: PyErr_SetString(PyExc_TypeError, "Feature Object Expected."); fazekasgy@31: cerr << "in call PyFeature_AsPointer(): Feature Object Expected. " << endl; fazekasgy@31: return NULL; } fazekasgy@31: return s->feature; fazekasgy@31: };*/