source: interfaces/python/py-filter.c @ c04d250

feature/autosinkfeature/cnnfeature/cnn_orgfeature/constantqfeature/crepefeature/crepe_orgfeature/pitchshiftfeature/pydocstringsfeature/timestretchfix/ffmpeg5pitchshiftsamplertimestretchyinfft+
Last change on this file since c04d250 was 96fe713, checked in by Paul Brossier <piem@piem.org>, 15 years ago

interfaces/python: towards mono

  • Property mode set to 100644
File size: 5.2 KB
Line 
1#include "aubio-types.h"
2
3typedef struct
4{
5  PyObject_HEAD
6  aubio_filter_t * o;
7  uint_t order;
8} Py_filter;
9
10static char Py_filter_doc[] = "filter object";
11
12static PyObject *
13Py_filter_new (PyTypeObject * type, PyObject * args, PyObject * kwds)
14{
15  int order= 0;
16  Py_filter *self;
17  static char *kwlist[] = { "order", NULL };
18
19  if (!PyArg_ParseTupleAndKeywords (args, kwds, "|II", kwlist,
20          &order)) {
21    return NULL;
22  }
23
24  self = (Py_filter *) type->tp_alloc (type, 0);
25
26  if (self == NULL) {
27    return NULL;
28  }
29
30  self->order = 7;
31
32  if (order > 0) {
33    self->order = order;
34  } else if (order < 0) {
35    PyErr_SetString (PyExc_ValueError,
36        "can not use negative order");
37    return NULL;
38  }
39
40  return (PyObject *) self;
41}
42
43static int
44Py_filter_init (Py_filter * self, PyObject * args, PyObject * kwds)
45{
46  self->o = new_aubio_filter (self->order);
47  if (self->o == NULL) {
48    return -1;
49  }
50
51  return 0;
52}
53
54static void
55Py_filter_del (Py_filter * self)
56{
57  del_aubio_filter (self->o);
58  self->ob_type->tp_free ((PyObject *) self);
59}
60
61static PyObject * 
62Py_filter_do(PyObject * self, PyObject * args)
63{
64  PyObject *input;
65  Py_fvec *vec;
66
67  if (!PyArg_ParseTuple (args, "O:digital_filter.do", &input)) {
68    return NULL;
69  }
70
71  if (input == NULL) {
72    return NULL;
73  }
74
75  vec = PyAubio_ArrayToFvec (input);
76
77  if (vec == NULL) {
78    return NULL;
79  }
80
81  // compute the function
82#if 1
83  aubio_filter_do (((Py_filter *)self)->o, vec->o);
84  PyArray_INCREF((PyArrayObject*)vec);
85  return (PyObject *)vec;
86#else
87  Py_fvec *copy = (Py_fvec*) PyObject_New (Py_fvec, &Py_fvecType);
88  copy->o = new_fvec(vec->o->length);
89  aubio_filter_do_outplace (((Py_filter *)self)->o, vec->o, copy->o);
90  return (PyObject *)copy;
91#endif
92}
93
94static PyObject * 
95Py_filter_set_c_weighting (Py_filter * self, PyObject *args)
96{
97  uint_t err = 0;
98  uint_t samplerate;
99  if (!PyArg_ParseTuple (args, "I", &samplerate)) {
100    return NULL;
101  }
102
103  err = aubio_filter_set_c_weighting (self->o, samplerate);
104  if (err > 0) {
105    PyErr_SetString (PyExc_ValueError,
106        "error when setting filter to A-weighting");
107    return NULL;
108  }
109  return Py_None;
110}
111
112static PyObject * 
113Py_filter_set_a_weighting (Py_filter * self, PyObject *args)
114{
115  uint_t err = 0;
116  uint_t samplerate;
117  if (!PyArg_ParseTuple (args, "I", &samplerate)) {
118    return NULL;
119  }
120
121  err = aubio_filter_set_a_weighting (self->o, samplerate);
122  if (err > 0) {
123    PyErr_SetString (PyExc_ValueError,
124        "error when setting filter to A-weighting");
125    return NULL;
126  }
127  return Py_None;
128}
129
130static PyMemberDef Py_filter_members[] = {
131  // TODO remove READONLY flag and define getter/setter
132  {"order", T_INT, offsetof (Py_filter, order), READONLY,
133      "order of the filter"},
134  {NULL}                        /* Sentinel */
135};
136
137static PyMethodDef Py_filter_methods[] = {
138  {"set_c_weighting", (PyCFunction) Py_filter_set_c_weighting, METH_VARARGS,
139      "set filter coefficients to C-weighting"},
140  {"set_a_weighting", (PyCFunction) Py_filter_set_a_weighting, METH_VARARGS,
141      "set filter coefficients to A-weighting"},
142  {NULL}
143};
144
145PyTypeObject Py_filterType = {
146  PyObject_HEAD_INIT (NULL)
147  0,                            /* ob_size           */
148  "aubio.digital_filter",       /* tp_name           */
149  sizeof (Py_filter),           /* tp_basicsize      */
150  0,                            /* tp_itemsize       */
151  (destructor) Py_filter_del,   /* tp_dealloc        */
152  0,                            /* tp_print          */
153  0,                            /* tp_getattr        */
154  0,                            /* tp_setattr        */
155  0,                            /* tp_compare        */
156  0, //(reprfunc) Py_filter_repr,    /* tp_repr           */
157  0,                            /* tp_as_number      */
158  0,                            /* tp_as_sequence    */
159  0,                            /* tp_as_mapping     */
160  0,                            /* tp_hash           */
161  (ternaryfunc)Py_filter_do,    /* tp_call           */
162  0,                            /* tp_str            */
163  0,                            /* tp_getattro       */
164  0,                            /* tp_setattro       */
165  0,                            /* tp_as_buffer      */
166  Py_TPFLAGS_DEFAULT,           /* tp_flags          */
167  Py_filter_doc,                /* tp_doc            */
168  0,                            /* tp_traverse       */
169  0,                            /* tp_clear          */
170  0,                            /* tp_richcompare    */
171  0,                            /* tp_weaklistoffset */
172  0,                            /* tp_iter           */
173  0,                            /* tp_iternext       */
174  Py_filter_methods,            /* tp_methods        */
175  Py_filter_members,            /* tp_members        */
176  0,                            /* tp_getset         */
177  0,                            /* tp_base           */
178  0,                            /* tp_dict           */
179  0,                            /* tp_descr_get      */
180  0,                            /* tp_descr_set      */
181  0,                            /* tp_dictoffset     */
182  (initproc) Py_filter_init,    /* tp_init           */
183  0,                            /* tp_alloc          */
184  Py_filter_new,                /* tp_new            */
185};
Note: See TracBrowser for help on using the repository browser.