annotate PyFeature.cpp @ 35:2ba482378038 vampy2

* Fix compile error with VC++. I am totally at a loss to explain why this should have compiled with any other compiler! * Update VC project file. This code does now build with VC++ without HAVE_NUMPY -- I haven't installed Numpy yet
author cannam
date Thu, 24 Sep 2009 08:52:04 +0000
parents 4f1894c7591b
children
rev   line source
fazekasgy@31 1 #include <Python.h>
fazekasgy@31 2 #include "PyExtensionModule.h"
fazekasgy@31 3 #include "PyFeature.h"
fazekasgy@31 4 #include "vamp-sdk/Plugin.h"
fazekasgy@31 5 #include <string>
fazekasgy@31 6 /*#include "PyTypeInterface.h"*/
fazekasgy@31 7
fazekasgy@31 8 using namespace std;
fazekasgy@31 9 using namespace Vamp;
fazekasgy@31 10 using Vamp::Plugin;
fazekasgy@31 11
fazekasgy@31 12 /* Feature Object's Methods */
fazekasgy@31 13 //Feature objects have no callable methods
fazekasgy@31 14
fazekasgy@31 15 /* PyFeature methods implementing protocols */
fazekasgy@31 16 // these functions are called by the interpreter automatically
fazekasgy@31 17
fazekasgy@31 18
fazekasgy@31 19 /* Function to set basic attributes
fazekasgy@31 20 static int
fazekasgy@31 21 Feature_setattr(FeatureObject *self, char *name, PyObject *value)
fazekasgy@31 22 {
fazekasgy@31 23 std::string key = std::string(name);
fazekasgy@31 24 if (self->ti.SetValue(*(self->feature),key,value)) return 0;
fazekasgy@31 25 else return -1;
fazekasgy@31 26 }*/
fazekasgy@31 27
fazekasgy@31 28 /* Function to get basic attributes
fazekasgy@31 29 static PyObject *
fazekasgy@31 30 Feature_getattr(FeatureObject *self, char *name)
fazekasgy@31 31 {
fazekasgy@31 32 std::string key = std::string(name);
fazekasgy@31 33 PyObject* pyValue;
fazekasgy@31 34 if (self->ti.GetValue(*(self->feature),key,pyValue))
fazekasgy@31 35 return pyValue;
fazekasgy@31 36 else return NULL;
fazekasgy@31 37 }*/
fazekasgy@31 38
fazekasgy@31 39 /* Set attributes */
fazekasgy@31 40 static int
fazekasgy@31 41 Feature_setattr(FeatureObject *self, char *name, PyObject *v)
fazekasgy@31 42 {
fazekasgy@31 43 if (v == NULL) {
fazekasgy@31 44 int rv = PyDict_DelItemString(self->dict, name);
fazekasgy@31 45 if (rv < 0)
fazekasgy@31 46 PyErr_SetString(PyExc_AttributeError,"non-existing Feature attribute");
fazekasgy@31 47 return rv;
fazekasgy@31 48 }
fazekasgy@31 49 else
fazekasgy@31 50 return PyDict_SetItemString(self->dict, name, v);
fazekasgy@31 51 }
fazekasgy@31 52
fazekasgy@31 53
fazekasgy@31 54 /* Get attributes */
fazekasgy@31 55 static PyObject *
fazekasgy@31 56 Feature_getattr(FeatureObject *self, char *name)
fazekasgy@31 57 {
fazekasgy@31 58 if (self->dict != NULL) {
fazekasgy@31 59 PyObject *v = PyDict_GetItemString(self->dict, name);
fazekasgy@31 60 if (v != NULL)
fazekasgy@31 61 {
fazekasgy@31 62 Py_INCREF(v);
fazekasgy@31 63 return v;
fazekasgy@31 64 }
fazekasgy@31 65 }
fazekasgy@31 66 return NULL;
fazekasgy@31 67 }
fazekasgy@31 68
fazekasgy@31 69 /* New Feature object */
fazekasgy@31 70 static PyObject *
fazekasgy@31 71 Feature_new(PyTypeObject *type, PyObject *args, PyObject *kw)
fazekasgy@31 72 {
fazekasgy@31 73 /// TODO support kwargs e.g. Feature(values = val, timestamp = ts)
fazekasgy@31 74 cerr << "FeatureObject new method called" << endl;
fazekasgy@31 75 if (!PyArg_ParseTuple(args, ":Feature")) {
fazekasgy@31 76 PyErr_SetString(PyExc_TypeError,
fazekasgy@31 77 "Error: Feature initialised with arguments.");
fazekasgy@31 78 return NULL;
fazekasgy@31 79 }
fazekasgy@31 80 FeatureObject *self = (FeatureObject*)type->tp_alloc(type, 0);
fazekasgy@31 81 // FeatureObject *self = PyObject_New(FeatureObject, &Feature_Type);
fazekasgy@31 82 if (self == NULL) return NULL;
fazekasgy@31 83 self->dict = PyDict_New();
fazekasgy@31 84 if (self->dict == NULL) return NULL;
fazekasgy@31 85 return (PyObject *) self;
fazekasgy@31 86 }
fazekasgy@31 87
fazekasgy@31 88 /* DESTRUCTOR: delete type object */
fazekasgy@31 89 static void
fazekasgy@31 90 FeatureObject_dealloc(FeatureObject *self)
fazekasgy@31 91 {
fazekasgy@31 92 Py_XDECREF(self->dict);
fazekasgy@31 93 // delete self->feature; //delete the C object
fazekasgy@31 94 // PyObject_Del(self); //delete the Python object
fazekasgy@31 95 self->ob_type->tp_free((PyObject*)self);
fazekasgy@31 96 cerr << "Feature object deallocated." << endl;
fazekasgy@31 97 }
fazekasgy@31 98
fazekasgy@31 99
fazekasgy@31 100 static int
fazekasgy@31 101 Feature_init(FeatureObject *self, PyObject *args, PyObject *kwds)
fazekasgy@31 102 {
fazekasgy@31 103 cerr << "FeatureObject Init called" << endl;
fazekasgy@31 104 return 0;
fazekasgy@31 105 }
fazekasgy@31 106
fazekasgy@31 107 PyObject*
fazekasgy@31 108 Feature_test(PyObject *self, PyObject *args, PyObject *kwds)
fazekasgy@31 109 {
fazekasgy@31 110 cerr << "FeatureObject TEST called" << endl;
fazekasgy@31 111 return self;
fazekasgy@31 112 }
fazekasgy@31 113
fazekasgy@31 114
fazekasgy@31 115 /* String representation */
fazekasgy@31 116 static PyObject *
fazekasgy@31 117 Feature_repr(PyObject *self)
fazekasgy@31 118 {
fazekasgy@31 119 // if (PyFeature_CheckExact(self)) {}
fazekasgy@31 120 // PyObject* intdict = self
fazekasgy@31 121 return Py_BuildValue("s",
fazekasgy@31 122 "not yet implemented");
fazekasgy@31 123 // ((RealTimeObject*)self)->rt->toString().c_str());
fazekasgy@31 124 }
fazekasgy@31 125
fazekasgy@31 126 #define Feature_alloc PyType_GenericAlloc
fazekasgy@31 127 #define Feature_free PyObject_Del
fazekasgy@31 128
fazekasgy@31 129
fazekasgy@31 130 /* FEATURE TYPE OBJECT */
fazekasgy@31 131
fazekasgy@31 132 PyTypeObject Feature_Type = {
fazekasgy@31 133 PyObject_HEAD_INIT(NULL)
fazekasgy@31 134 0, /*ob_size*/
fazekasgy@31 135 "vampy.Feature", /*tp_name*/
fazekasgy@31 136 sizeof(FeatureObject), /*tp_basicsize*/
fazekasgy@31 137 0, /*tp_itemsize*/
fazekasgy@31 138 (destructor)FeatureObject_dealloc, /*tp_dealloc*/
fazekasgy@31 139 0, /*tp_print*/
fazekasgy@31 140 (getattrfunc)Feature_getattr, /*tp_getattr*/
fazekasgy@31 141 (setattrfunc)Feature_setattr, /*tp_setattr*/
fazekasgy@31 142 0, /*tp_compare*/
fazekasgy@31 143 Feature_repr, /*tp_repr*/
fazekasgy@31 144 0, /*tp_as_number*/
fazekasgy@31 145 0, /*tp_as_sequence*/
fazekasgy@31 146 0, /*tp_as_mapping*/
fazekasgy@31 147 0, /*tp_hash*/
fazekasgy@31 148 Feature_test, /*tp_call*/ // call on an instance
fazekasgy@31 149 0, /*tp_str*/
fazekasgy@31 150 0, /*tp_getattro*/
fazekasgy@31 151 0, /*tp_setattro*/
fazekasgy@31 152 0, /*tp_as_buffer*/
fazekasgy@31 153 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
fazekasgy@31 154 0, /*tp_doc*/
fazekasgy@31 155 0, /*tp_traverse*/
fazekasgy@31 156 0, /*tp_clear*/
fazekasgy@31 157 0, /*tp_richcompare*/
fazekasgy@31 158 0, /*tp_weaklistoffset*/
fazekasgy@31 159 0, /*tp_iter*/
fazekasgy@31 160 0, /*tp_iternext*/
fazekasgy@31 161 0, /*tp_methods*/ //TypeObject Methods
fazekasgy@31 162 0, /*tp_members*/
fazekasgy@31 163 0, /*tp_getset*/
fazekasgy@31 164 0, /*tp_base*/
fazekasgy@31 165 0, /*tp_dict*/
fazekasgy@31 166 0, /*tp_descr_get*/
fazekasgy@31 167 0, /*tp_descr_set*/
fazekasgy@31 168 0, /*tp_dictoffset*/
fazekasgy@31 169 0,//(initproc)Feature_init, /*tp_init*/
fazekasgy@31 170 Feature_alloc, /*tp_alloc*/
fazekasgy@31 171 Feature_new, /*tp_new*/
fazekasgy@31 172 Feature_free, /*tp_free*/
fazekasgy@31 173 0, /*tp_is_gc*/
fazekasgy@31 174 };
fazekasgy@31 175
fazekasgy@31 176 /* PyRealTime C++ API */
fazekasgy@31 177
fazekasgy@31 178 /*Feature* from PyFeature
fazekasgy@31 179 const Vamp::Plugin::Feature*
fazekasgy@31 180 PyFeature_AsFeature (PyObject *self) {
fazekasgy@31 181
fazekasgy@31 182 FeatureObject *s = (FeatureObject*) self;
fazekasgy@31 183
fazekasgy@31 184 if (!PyFeature_Check(s)) {
fazekasgy@31 185 PyErr_SetString(PyExc_TypeError, "Feature Object Expected.");
fazekasgy@31 186 cerr << "in call PyFeature_AsPointer(): Feature Object Expected. " << endl;
fazekasgy@31 187 return NULL; }
fazekasgy@31 188 return s->feature;
fazekasgy@31 189 };*/