fazekasgy@31
|
1 #include <Python.h>
|
fazekasgy@31
|
2 #include "PyOutputDescriptor.h"
|
fazekasgy@31
|
3 #include "vamp-sdk/Plugin.h"
|
fazekasgy@31
|
4 #include <string>
|
fazekasgy@31
|
5 #include "PyTypeInterface.h"
|
fazekasgy@31
|
6
|
fazekasgy@31
|
7 using namespace std;
|
fazekasgy@31
|
8 using namespace Vamp;
|
fazekasgy@31
|
9 using Vamp::Plugin;
|
fazekasgy@31
|
10
|
fazekasgy@31
|
11 /* OutputDescriptor Object's Methods */
|
fazekasgy@31
|
12 //Feature objects have no callable methods
|
fazekasgy@31
|
13
|
fazekasgy@31
|
14 /* PyOutputDescriptor methods implementing protocols */
|
fazekasgy@31
|
15 // these functions are called by the interpreter automatically
|
fazekasgy@31
|
16
|
fazekasgy@31
|
17 /* New OutputDescriptor object */
|
fazekasgy@31
|
18 static PyObject *
|
fazekasgy@31
|
19 OutputDescriptor_new(PyTypeObject *type, PyObject *args, PyObject *kw)
|
fazekasgy@31
|
20 {
|
fazekasgy@31
|
21
|
fazekasgy@31
|
22 if (!PyArg_ParseTuple(args, ":OutputDescriptor")) {
|
fazekasgy@31
|
23 PyErr_SetString(PyExc_TypeError,
|
fazekasgy@31
|
24 "Error: OutputDescriptor initialised with arguments.");
|
fazekasgy@31
|
25 return NULL;
|
fazekasgy@31
|
26 }
|
fazekasgy@31
|
27
|
fazekasgy@31
|
28 OutputDescriptorObject *self =
|
fazekasgy@31
|
29 (OutputDescriptorObject*)type->tp_alloc(type, 0);
|
fazekasgy@31
|
30
|
fazekasgy@31
|
31 if (self == NULL) return NULL;
|
fazekasgy@31
|
32 self->dict = PyDict_New();
|
fazekasgy@31
|
33 if (self->dict == NULL) return NULL;
|
fazekasgy@31
|
34 return (PyObject *) self;
|
fazekasgy@31
|
35 }
|
fazekasgy@31
|
36
|
fazekasgy@31
|
37
|
fazekasgy@31
|
38 /* DESTRUCTOR: delete type object */
|
fazekasgy@31
|
39 static void
|
fazekasgy@31
|
40 OutputDescriptorObject_dealloc(OutputDescriptorObject *self)
|
fazekasgy@31
|
41 {
|
fazekasgy@31
|
42 Py_XDECREF(self->dict);
|
fazekasgy@31
|
43 PyObject_Del(self);
|
fazekasgy@31
|
44 }
|
fazekasgy@31
|
45
|
fazekasgy@31
|
46
|
fazekasgy@31
|
47 /* Set attributes */
|
fazekasgy@31
|
48 static int
|
fazekasgy@31
|
49 OutputDescriptor_setattr(OutputDescriptorObject *self, char *name, PyObject *v)
|
fazekasgy@31
|
50 {
|
fazekasgy@31
|
51 if (v == NULL) {
|
fazekasgy@31
|
52 int rv = PyDict_DelItemString(self->dict, name);
|
fazekasgy@31
|
53 if (rv < 0)
|
fazekasgy@31
|
54 PyErr_SetString(PyExc_AttributeError,"non-existing OutputDescriptor attribute");
|
fazekasgy@31
|
55 return rv;
|
fazekasgy@31
|
56 }
|
fazekasgy@31
|
57 else
|
fazekasgy@31
|
58 return PyDict_SetItemString(self->dict, name, v);
|
fazekasgy@31
|
59 }
|
fazekasgy@31
|
60
|
fazekasgy@31
|
61
|
fazekasgy@31
|
62 /* Get attributes */
|
fazekasgy@31
|
63 static PyObject *
|
fazekasgy@31
|
64 OutputDescriptor_getattr(OutputDescriptorObject *self, char *name)
|
fazekasgy@31
|
65 {
|
fazekasgy@31
|
66 if (self->dict != NULL) {
|
fazekasgy@31
|
67 PyObject *v = PyDict_GetItemString(self->dict, name);
|
fazekasgy@31
|
68 if (v != NULL)
|
fazekasgy@31
|
69 {
|
fazekasgy@31
|
70 Py_INCREF(v);
|
fazekasgy@31
|
71 return v;
|
fazekasgy@31
|
72 }
|
fazekasgy@31
|
73 }
|
fazekasgy@31
|
74 return NULL;
|
fazekasgy@31
|
75 }
|
fazekasgy@31
|
76
|
fazekasgy@31
|
77
|
fazekasgy@31
|
78 /* String representation */
|
fazekasgy@31
|
79 static PyObject *
|
fazekasgy@31
|
80 OutputDescriptor_repr(PyObject *self)
|
fazekasgy@31
|
81 {
|
fazekasgy@31
|
82 // if (PyFeature_CheckExact(self)) {}
|
fazekasgy@31
|
83 // PyObject* intdict = self
|
fazekasgy@31
|
84 return Py_BuildValue("s",
|
fazekasgy@31
|
85 "not yet implemented");
|
fazekasgy@31
|
86 // ((RealTimeObject*)self)->rt->toString().c_str());
|
fazekasgy@31
|
87 }
|
fazekasgy@31
|
88
|
fazekasgy@31
|
89 #define OutputDescriptor_alloc PyType_GenericAlloc
|
fazekasgy@31
|
90 #define OutputDescriptor_free PyObject_Del
|
fazekasgy@31
|
91
|
fazekasgy@31
|
92
|
fazekasgy@31
|
93 /* REAL-TIME TYPE OBJECT */
|
fazekasgy@31
|
94
|
fazekasgy@31
|
95 PyTypeObject OutputDescriptor_Type = {
|
fazekasgy@31
|
96 PyObject_HEAD_INIT(NULL)
|
fazekasgy@31
|
97 0, /*ob_size*/
|
fazekasgy@31
|
98 "vampy.OutputDescriptor",/*tp_name*/
|
fazekasgy@31
|
99 sizeof(OutputDescriptorObject), /*tp_basicsize*/
|
fazekasgy@31
|
100 0, /*tp_itemsize*/
|
fazekasgy@31
|
101 (destructor)OutputDescriptorObject_dealloc, /*tp_dealloc*/
|
fazekasgy@31
|
102 0, /*tp_print*/
|
fazekasgy@31
|
103 (getattrfunc)OutputDescriptor_getattr, /*tp_getattr*/
|
fazekasgy@31
|
104 (setattrfunc)OutputDescriptor_setattr, /*tp_setattr*/
|
fazekasgy@31
|
105 0, /*tp_compare*/
|
fazekasgy@31
|
106 OutputDescriptor_repr, /*tp_repr*/
|
fazekasgy@31
|
107 0, /*tp_as_number*/
|
fazekasgy@31
|
108 0, /*tp_as_sequence*/
|
fazekasgy@31
|
109 0, /*tp_as_mapping*/
|
fazekasgy@31
|
110 0, /*tp_hash*/
|
fazekasgy@31
|
111 0, /*tp_call*/
|
fazekasgy@31
|
112 0, /*tp_str*/
|
fazekasgy@31
|
113 0, /*tp_getattro*/
|
fazekasgy@31
|
114 0, /*tp_setattro*/
|
fazekasgy@31
|
115 0, /*tp_as_buffer*/
|
fazekasgy@31
|
116 Py_TPFLAGS_DEFAULT, /*tp_flags*/
|
fazekasgy@31
|
117 0, /*tp_doc*/
|
fazekasgy@31
|
118 0, /*tp_traverse*/
|
fazekasgy@31
|
119 0, /*tp_clear*/
|
fazekasgy@31
|
120 0, /*tp_richcompare*/
|
fazekasgy@31
|
121 0, /*tp_weaklistoffset*/
|
fazekasgy@31
|
122 0, /*tp_iter*/
|
fazekasgy@31
|
123 0, /*tp_iternext*/
|
fazekasgy@31
|
124 0, /*tp_methods*/ //TypeObject Methods
|
fazekasgy@31
|
125 0, /*tp_members*/
|
fazekasgy@31
|
126 0, /*tp_getset*/
|
fazekasgy@31
|
127 0, /*tp_base*/
|
fazekasgy@31
|
128 0, /*tp_dict*/
|
fazekasgy@31
|
129 0, /*tp_descr_get*/
|
fazekasgy@31
|
130 0, /*tp_descr_set*/
|
fazekasgy@31
|
131 0, /*tp_dictoffset*/
|
fazekasgy@31
|
132 0, /*tp_init*/
|
fazekasgy@31
|
133 OutputDescriptor_alloc, /*tp_alloc*/
|
fazekasgy@31
|
134 OutputDescriptor_new, /*tp_new*/
|
fazekasgy@31
|
135 OutputDescriptor_free, /*tp_free*/
|
fazekasgy@31
|
136 0, /*tp_is_gc*/
|
fazekasgy@31
|
137 };
|
fazekasgy@31
|
138
|
fazekasgy@31
|
139 /* PyOutputDescriptor C++ API */
|
fazekasgy@31
|
140
|