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 };*/
|