fazekasgy@37: /* fazekasgy@37: fazekasgy@37: * Vampy : This plugin is a wrapper around the Vamp plugin API. fazekasgy@37: * It allows for writing Vamp plugins in Python. fazekasgy@37: fazekasgy@37: * Centre for Digital Music, Queen Mary University of London. fazekasgy@37: * Copyright (C) 2008-2009 Gyorgy Fazekas, QMUL. (See Vamp sources fazekasgy@37: * for licence information.) fazekasgy@37: fazekasgy@37: */ fazekasgy@37: fazekasgy@37: #include fazekasgy@37: #include "PyParameterDescriptor.h" fazekasgy@37: #include "vamp-sdk/Plugin.h" fazekasgy@37: #include fazekasgy@37: #include "PyTypeInterface.h" fazekasgy@37: fazekasgy@37: using namespace std; fazekasgy@37: using namespace Vamp; fazekasgy@37: using Vamp::Plugin; fazekasgy@37: fazekasgy@37: /* ParameterDescriptor Object's Methods */ fazekasgy@37: //these objects have no callable methods fazekasgy@37: fazekasgy@37: /* PyParameterDescriptor methods implementing protocols */ fazekasgy@37: // these functions are called by the interpreter automatically fazekasgy@37: fazekasgy@37: /* New ParameterDescriptor object */ fazekasgy@37: static PyObject * fazekasgy@37: ParameterDescriptor_new(PyTypeObject *type, PyObject *args, PyObject *kw) fazekasgy@37: { fazekasgy@37: fazekasgy@37: ParameterDescriptorObject *self = fazekasgy@37: (ParameterDescriptorObject*)type->tp_alloc(type, 0); fazekasgy@37: fazekasgy@37: if (self == NULL) return NULL; fazekasgy@37: self->dict = PyDict_New(); fazekasgy@37: if (self->dict == NULL) return NULL; fazekasgy@37: fazekasgy@37: /// allow copying objects cannam@46: if (args && PyTuple_Size(args) == 1) { fazekasgy@37: PyObject* arg = PyTuple_GET_ITEM(args,0); fazekasgy@37: if (PyParameterDescriptor_CheckExact(arg)) fazekasgy@37: PyDict_Merge(self->dict,PyParameterDescriptor_AS_DICT(arg),0); fazekasgy@37: else if (PyDict_CheckExact(arg)) fazekasgy@37: PyDict_Merge(self->dict,arg,0); fazekasgy@37: else { fazekasgy@37: PyErr_SetString(PyExc_TypeError, fazekasgy@37: "Object takes zero or one ParameterDescriptor or dictionary arguments."); fazekasgy@37: return NULL; fazekasgy@37: } fazekasgy@37: } fazekasgy@37: return (PyObject *) self; fazekasgy@37: } fazekasgy@37: fazekasgy@37: fazekasgy@37: /* DESTRUCTOR: delete type object */ fazekasgy@37: static void fazekasgy@37: ParameterDescriptorObject_dealloc(ParameterDescriptorObject *self) fazekasgy@37: { fazekasgy@37: Py_XDECREF(self->dict); fazekasgy@37: PyObject_Del(self); fazekasgy@37: } fazekasgy@37: fazekasgy@37: fazekasgy@37: /* Set attributes */ fazekasgy@37: static int fazekasgy@37: ParameterDescriptor_setattr(ParameterDescriptorObject *self, char *name, PyObject *v) fazekasgy@37: { fazekasgy@37: if (v == NULL) { fazekasgy@37: int rv = PyDict_DelItemString(self->dict, name); fazekasgy@37: if (rv < 0) fazekasgy@37: PyErr_SetString(PyExc_AttributeError,"non-existing ParameterDescriptor attribute"); fazekasgy@37: return rv; fazekasgy@37: } fazekasgy@37: else fazekasgy@37: return PyDict_SetItemString(self->dict, name, v); fazekasgy@37: } fazekasgy@37: fazekasgy@37: fazekasgy@37: /* Get attributes */ fazekasgy@37: static PyObject * fazekasgy@37: ParameterDescriptor_getattr(ParameterDescriptorObject *self, char *name) fazekasgy@37: { fazekasgy@37: if (self->dict != NULL) { fazekasgy@37: PyObject *v = PyDict_GetItemString(self->dict, name); fazekasgy@37: if (v != NULL) fazekasgy@37: { fazekasgy@37: Py_INCREF(v); fazekasgy@37: return v; fazekasgy@37: } fazekasgy@51: PyErr_SetString(PyExc_AttributeError,"non-existing ParameterDescriptor attribute"); fazekasgy@37: } fazekasgy@37: return NULL; fazekasgy@37: } fazekasgy@37: fazekasgy@37: fazekasgy@37: /* String representation */ fazekasgy@37: static PyObject * fazekasgy@37: ParameterDescriptor_repr(PyObject *self) fazekasgy@37: { fazekasgy@37: ParameterDescriptorObject* v = (ParameterDescriptorObject*)self; fazekasgy@37: if (v->dict) return PyDict_Type.tp_repr((PyObject *)v->dict); fazekasgy@37: else return PyString_FromString("ParameterDescriptor()"); fazekasgy@37: } fazekasgy@37: fazekasgy@37: #define ParameterDescriptor_alloc PyType_GenericAlloc fazekasgy@37: #define ParameterDescriptor_free PyObject_Del fazekasgy@37: fazekasgy@37: PyTypeObject ParameterDescriptor_Type = { fazekasgy@37: PyObject_HEAD_INIT(NULL) fazekasgy@37: 0, /*ob_size*/ fazekasgy@37: "vampy.ParameterDescriptor",/*tp_name*/ fazekasgy@37: sizeof(ParameterDescriptorObject), /*tp_basicsize*/ fazekasgy@37: 0, /*tp_itemsize*/ fazekasgy@37: (destructor)ParameterDescriptorObject_dealloc, /*tp_dealloc*/ fazekasgy@37: 0, /*tp_print*/ fazekasgy@37: (getattrfunc)ParameterDescriptor_getattr, /*tp_getattr*/ fazekasgy@37: (setattrfunc)ParameterDescriptor_setattr, /*tp_setattr*/ fazekasgy@37: 0, /*tp_compare*/ fazekasgy@37: ParameterDescriptor_repr, /*tp_repr*/ fazekasgy@37: 0, /*tp_as_number*/ fazekasgy@37: 0, /*tp_as_sequence*/ fazekasgy@37: 0, /*tp_as_mapping*/ fazekasgy@37: 0, /*tp_hash*/ fazekasgy@37: 0, /*tp_call*/ fazekasgy@37: 0, /*tp_str*/ fazekasgy@37: 0, /*tp_getattro*/ fazekasgy@37: 0, /*tp_setattro*/ fazekasgy@37: 0, /*tp_as_buffer*/ fazekasgy@37: Py_TPFLAGS_DEFAULT, /*tp_flags*/ fazekasgy@37: 0, /*tp_doc*/ fazekasgy@37: 0, /*tp_traverse*/ fazekasgy@37: 0, /*tp_clear*/ fazekasgy@37: 0, /*tp_richcompare*/ fazekasgy@37: 0, /*tp_weaklistoffset*/ fazekasgy@37: 0, /*tp_iter*/ fazekasgy@37: 0, /*tp_iternext*/ fazekasgy@37: 0, /*tp_methods*/ //TypeObject Methods fazekasgy@37: 0, /*tp_members*/ fazekasgy@37: 0, /*tp_getset*/ fazekasgy@37: 0, /*tp_base*/ fazekasgy@37: 0, /*tp_dict*/ fazekasgy@37: 0, /*tp_descr_get*/ fazekasgy@37: 0, /*tp_descr_set*/ fazekasgy@37: 0, /*tp_dictoffset*/ fazekasgy@37: 0, /*tp_init*/ fazekasgy@37: ParameterDescriptor_alloc,/*tp_alloc*/ fazekasgy@37: ParameterDescriptor_new,/*tp_new*/ fazekasgy@37: ParameterDescriptor_free,/*tp_free*/ fazekasgy@37: 0, /*tp_is_gc*/ fazekasgy@37: }; fazekasgy@37: fazekasgy@37: /* PyParameterDescriptor C++ API */ fazekasgy@37: