fazekasgy@37
|
1 /*
|
fazekasgy@37
|
2
|
fazekasgy@37
|
3 * Vampy : This plugin is a wrapper around the Vamp plugin API.
|
fazekasgy@37
|
4 * It allows for writing Vamp plugins in Python.
|
fazekasgy@37
|
5
|
fazekasgy@37
|
6 * Centre for Digital Music, Queen Mary University of London.
|
fazekasgy@37
|
7 * Copyright (C) 2008-2009 Gyorgy Fazekas, QMUL. (See Vamp sources
|
fazekasgy@37
|
8 * for licence information.)
|
fazekasgy@37
|
9
|
fazekasgy@37
|
10 */
|
fazekasgy@37
|
11
|
fazekasgy@37
|
12 #include <Python.h>
|
fazekasgy@37
|
13 #include "PyParameterDescriptor.h"
|
fazekasgy@37
|
14 #include "vamp-sdk/Plugin.h"
|
fazekasgy@37
|
15 #include <string>
|
fazekasgy@37
|
16 #include "PyTypeInterface.h"
|
fazekasgy@37
|
17
|
fazekasgy@37
|
18 using namespace std;
|
fazekasgy@37
|
19 using namespace Vamp;
|
fazekasgy@37
|
20 using Vamp::Plugin;
|
fazekasgy@37
|
21
|
fazekasgy@37
|
22 /* ParameterDescriptor Object's Methods */
|
fazekasgy@37
|
23 //these objects have no callable methods
|
fazekasgy@37
|
24
|
fazekasgy@37
|
25 /* PyParameterDescriptor methods implementing protocols */
|
fazekasgy@37
|
26 // these functions are called by the interpreter automatically
|
fazekasgy@37
|
27
|
fazekasgy@37
|
28 /* New ParameterDescriptor object */
|
fazekasgy@37
|
29 static PyObject *
|
fazekasgy@37
|
30 ParameterDescriptor_new(PyTypeObject *type, PyObject *args, PyObject *kw)
|
fazekasgy@37
|
31 {
|
fazekasgy@37
|
32
|
fazekasgy@37
|
33 ParameterDescriptorObject *self =
|
fazekasgy@37
|
34 (ParameterDescriptorObject*)type->tp_alloc(type, 0);
|
fazekasgy@37
|
35
|
fazekasgy@37
|
36 if (self == NULL) return NULL;
|
fazekasgy@37
|
37 self->dict = PyDict_New();
|
fazekasgy@37
|
38 if (self->dict == NULL) return NULL;
|
fazekasgy@37
|
39
|
fazekasgy@37
|
40 /// allow copying objects
|
fazekasgy@37
|
41 if (args and PyTuple_Size(args) == 1) {
|
fazekasgy@37
|
42 PyObject* arg = PyTuple_GET_ITEM(args,0);
|
fazekasgy@37
|
43 if (PyParameterDescriptor_CheckExact(arg))
|
fazekasgy@37
|
44 PyDict_Merge(self->dict,PyParameterDescriptor_AS_DICT(arg),0);
|
fazekasgy@37
|
45 else if (PyDict_CheckExact(arg))
|
fazekasgy@37
|
46 PyDict_Merge(self->dict,arg,0);
|
fazekasgy@37
|
47 else {
|
fazekasgy@37
|
48 PyErr_SetString(PyExc_TypeError,
|
fazekasgy@37
|
49 "Object takes zero or one ParameterDescriptor or dictionary arguments.");
|
fazekasgy@37
|
50 return NULL;
|
fazekasgy@37
|
51 }
|
fazekasgy@37
|
52 }
|
fazekasgy@37
|
53 return (PyObject *) self;
|
fazekasgy@37
|
54 }
|
fazekasgy@37
|
55
|
fazekasgy@37
|
56
|
fazekasgy@37
|
57 /* DESTRUCTOR: delete type object */
|
fazekasgy@37
|
58 static void
|
fazekasgy@37
|
59 ParameterDescriptorObject_dealloc(ParameterDescriptorObject *self)
|
fazekasgy@37
|
60 {
|
fazekasgy@37
|
61 Py_XDECREF(self->dict);
|
fazekasgy@37
|
62 PyObject_Del(self);
|
fazekasgy@37
|
63 }
|
fazekasgy@37
|
64
|
fazekasgy@37
|
65
|
fazekasgy@37
|
66 /* Set attributes */
|
fazekasgy@37
|
67 static int
|
fazekasgy@37
|
68 ParameterDescriptor_setattr(ParameterDescriptorObject *self, char *name, PyObject *v)
|
fazekasgy@37
|
69 {
|
fazekasgy@37
|
70 if (v == NULL) {
|
fazekasgy@37
|
71 int rv = PyDict_DelItemString(self->dict, name);
|
fazekasgy@37
|
72 if (rv < 0)
|
fazekasgy@37
|
73 PyErr_SetString(PyExc_AttributeError,"non-existing ParameterDescriptor attribute");
|
fazekasgy@37
|
74 return rv;
|
fazekasgy@37
|
75 }
|
fazekasgy@37
|
76 else
|
fazekasgy@37
|
77 return PyDict_SetItemString(self->dict, name, v);
|
fazekasgy@37
|
78 }
|
fazekasgy@37
|
79
|
fazekasgy@37
|
80
|
fazekasgy@37
|
81 /* Get attributes */
|
fazekasgy@37
|
82 static PyObject *
|
fazekasgy@37
|
83 ParameterDescriptor_getattr(ParameterDescriptorObject *self, char *name)
|
fazekasgy@37
|
84 {
|
fazekasgy@37
|
85 if (self->dict != NULL) {
|
fazekasgy@37
|
86 PyObject *v = PyDict_GetItemString(self->dict, name);
|
fazekasgy@37
|
87 if (v != NULL)
|
fazekasgy@37
|
88 {
|
fazekasgy@37
|
89 Py_INCREF(v);
|
fazekasgy@37
|
90 return v;
|
fazekasgy@37
|
91 }
|
fazekasgy@37
|
92 }
|
fazekasgy@37
|
93 return NULL;
|
fazekasgy@37
|
94 }
|
fazekasgy@37
|
95
|
fazekasgy@37
|
96
|
fazekasgy@37
|
97 /* String representation */
|
fazekasgy@37
|
98 static PyObject *
|
fazekasgy@37
|
99 ParameterDescriptor_repr(PyObject *self)
|
fazekasgy@37
|
100 {
|
fazekasgy@37
|
101 ParameterDescriptorObject* v = (ParameterDescriptorObject*)self;
|
fazekasgy@37
|
102 if (v->dict) return PyDict_Type.tp_repr((PyObject *)v->dict);
|
fazekasgy@37
|
103 else return PyString_FromString("ParameterDescriptor()");
|
fazekasgy@37
|
104 }
|
fazekasgy@37
|
105
|
fazekasgy@37
|
106 #define ParameterDescriptor_alloc PyType_GenericAlloc
|
fazekasgy@37
|
107 #define ParameterDescriptor_free PyObject_Del
|
fazekasgy@37
|
108
|
fazekasgy@37
|
109 PyTypeObject ParameterDescriptor_Type = {
|
fazekasgy@37
|
110 PyObject_HEAD_INIT(NULL)
|
fazekasgy@37
|
111 0, /*ob_size*/
|
fazekasgy@37
|
112 "vampy.ParameterDescriptor",/*tp_name*/
|
fazekasgy@37
|
113 sizeof(ParameterDescriptorObject), /*tp_basicsize*/
|
fazekasgy@37
|
114 0, /*tp_itemsize*/
|
fazekasgy@37
|
115 (destructor)ParameterDescriptorObject_dealloc, /*tp_dealloc*/
|
fazekasgy@37
|
116 0, /*tp_print*/
|
fazekasgy@37
|
117 (getattrfunc)ParameterDescriptor_getattr, /*tp_getattr*/
|
fazekasgy@37
|
118 (setattrfunc)ParameterDescriptor_setattr, /*tp_setattr*/
|
fazekasgy@37
|
119 0, /*tp_compare*/
|
fazekasgy@37
|
120 ParameterDescriptor_repr, /*tp_repr*/
|
fazekasgy@37
|
121 0, /*tp_as_number*/
|
fazekasgy@37
|
122 0, /*tp_as_sequence*/
|
fazekasgy@37
|
123 0, /*tp_as_mapping*/
|
fazekasgy@37
|
124 0, /*tp_hash*/
|
fazekasgy@37
|
125 0, /*tp_call*/
|
fazekasgy@37
|
126 0, /*tp_str*/
|
fazekasgy@37
|
127 0, /*tp_getattro*/
|
fazekasgy@37
|
128 0, /*tp_setattro*/
|
fazekasgy@37
|
129 0, /*tp_as_buffer*/
|
fazekasgy@37
|
130 Py_TPFLAGS_DEFAULT, /*tp_flags*/
|
fazekasgy@37
|
131 0, /*tp_doc*/
|
fazekasgy@37
|
132 0, /*tp_traverse*/
|
fazekasgy@37
|
133 0, /*tp_clear*/
|
fazekasgy@37
|
134 0, /*tp_richcompare*/
|
fazekasgy@37
|
135 0, /*tp_weaklistoffset*/
|
fazekasgy@37
|
136 0, /*tp_iter*/
|
fazekasgy@37
|
137 0, /*tp_iternext*/
|
fazekasgy@37
|
138 0, /*tp_methods*/ //TypeObject Methods
|
fazekasgy@37
|
139 0, /*tp_members*/
|
fazekasgy@37
|
140 0, /*tp_getset*/
|
fazekasgy@37
|
141 0, /*tp_base*/
|
fazekasgy@37
|
142 0, /*tp_dict*/
|
fazekasgy@37
|
143 0, /*tp_descr_get*/
|
fazekasgy@37
|
144 0, /*tp_descr_set*/
|
fazekasgy@37
|
145 0, /*tp_dictoffset*/
|
fazekasgy@37
|
146 0, /*tp_init*/
|
fazekasgy@37
|
147 ParameterDescriptor_alloc,/*tp_alloc*/
|
fazekasgy@37
|
148 ParameterDescriptor_new,/*tp_new*/
|
fazekasgy@37
|
149 ParameterDescriptor_free,/*tp_free*/
|
fazekasgy@37
|
150 0, /*tp_is_gc*/
|
fazekasgy@37
|
151 };
|
fazekasgy@37
|
152
|
fazekasgy@37
|
153 /* PyParameterDescriptor C++ API */
|
fazekasgy@37
|
154
|