blob: 7990020c18796b837ea2d72699479342e31cc6e8 [file] [log] [blame]
Guido van Rossume3db8621991-09-09 23:33:34 +00001/**********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossume3db8621991-09-09 23:33:34 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossume3db8621991-09-09 23:33:34 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossume3db8621991-09-09 23:33:34 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossume3db8621991-09-09 23:33:34 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossume3db8621991-09-09 23:33:34 +000029
30******************************************************************/
31
Guido van Rossum57737981992-05-15 11:06:29 +000032/* AL module -- interface to Mark Callow's Audio Library (AL). */
Guido van Rossume3db8621991-09-09 23:33:34 +000033
Guido van Rossumb6775db1994-08-01 11:34:53 +000034#include <audio.h>
Guido van Rossume3db8621991-09-09 23:33:34 +000035
Jack Jansene8a3c281993-02-10 14:10:56 +000036/* Check which version audio library we have: */
37#ifdef AL_ERROR_NUMBER
38#define AL_405
39/* XXXX 4.0.5 libaudio also allows us to provide better error
40** handling (with ALseterrorhandler). We should implement that
41** sometime.
42*/
43
44#endif
45
Roger E. Massea2a8b271997-01-03 22:40:34 +000046#include "Python.h"
Guido van Rossume3db8621991-09-09 23:33:34 +000047
48/* Config objects */
49
50typedef struct {
Roger E. Massea2a8b271997-01-03 22:40:34 +000051 PyObject_HEAD
Guido van Rossume3db8621991-09-09 23:33:34 +000052 ALconfig ob_config;
53} configobject;
54
Roger E. Massea2a8b271997-01-03 22:40:34 +000055staticforward PyTypeObject Configtype;
Guido van Rossume3db8621991-09-09 23:33:34 +000056
57#define is_configobject(v) ((v)->ob_type == &Configtype)
58
Guido van Rossumfc58e581992-01-27 16:45:55 +000059/* Forward */
Roger E. Massea2a8b271997-01-03 22:40:34 +000060static int getconfigarg Py_PROTO((PyObject *, ALconfig *));
61static int getstrstrconfigarg Py_PROTO((PyObject *, char **, char **,
62 ALconfig *));
Guido van Rossumfc58e581992-01-27 16:45:55 +000063
Roger E. Massea2a8b271997-01-03 22:40:34 +000064static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +000065setConfig (self, args, func)
66 configobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +000067 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +000068 void (*func)(ALconfig, long);
69{
70 long par;
71
Roger E. Massea2a8b271997-01-03 22:40:34 +000072 if (!PyArg_Parse (args, "l", &par)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +000073
74 (*func) (self-> ob_config, par);
75
Roger E. Massea2a8b271997-01-03 22:40:34 +000076 Py_INCREF (Py_None);
77 return Py_None;
Guido van Rossume3db8621991-09-09 23:33:34 +000078}
79
Roger E. Massea2a8b271997-01-03 22:40:34 +000080static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +000081getConfig (self, args, func)
82 configobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +000083 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +000084 long (*func)(ALconfig);
85{
86 long par;
87
Roger E. Massea2a8b271997-01-03 22:40:34 +000088 if (!PyArg_NoArgs (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +000089
90 par = (*func) (self-> ob_config);
91
Roger E. Massea2a8b271997-01-03 22:40:34 +000092 return PyInt_FromLong (par);
Guido van Rossume3db8621991-09-09 23:33:34 +000093}
94
Roger E. Massea2a8b271997-01-03 22:40:34 +000095static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +000096al_setqueuesize (self, args)
97 configobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +000098 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +000099{
100 return (setConfig (self, args, ALsetqueuesize));
101}
102
Roger E. Massea2a8b271997-01-03 22:40:34 +0000103static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000104al_getqueuesize (self, args)
105 configobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000106 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000107{
108 return (getConfig (self, args, ALgetqueuesize));
109}
110
Roger E. Massea2a8b271997-01-03 22:40:34 +0000111static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000112al_setwidth (self, args)
113 configobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000114 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000115{
116 return (setConfig (self, args, ALsetwidth));
117}
118
Roger E. Massea2a8b271997-01-03 22:40:34 +0000119static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000120al_getwidth (self, args)
121 configobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000122 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000123{
124 return (getConfig (self, args, ALgetwidth));
125}
126
Roger E. Massea2a8b271997-01-03 22:40:34 +0000127static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000128al_getchannels (self, args)
129 configobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000130 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000131{
132 return (getConfig (self, args, ALgetchannels));
133}
134
Roger E. Massea2a8b271997-01-03 22:40:34 +0000135static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000136al_setchannels (self, args)
137 configobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000138 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000139{
140 return (setConfig (self, args, ALsetchannels));
141}
142
Jack Jansene8a3c281993-02-10 14:10:56 +0000143#ifdef AL_405
144
Roger E. Massea2a8b271997-01-03 22:40:34 +0000145static PyObject *
Jack Jansene8a3c281993-02-10 14:10:56 +0000146al_getsampfmt (self, args)
147 configobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000148 PyObject *args;
Jack Jansene8a3c281993-02-10 14:10:56 +0000149{
150 return (getConfig (self, args, ALgetsampfmt));
151}
152
Roger E. Massea2a8b271997-01-03 22:40:34 +0000153static PyObject *
Jack Jansene8a3c281993-02-10 14:10:56 +0000154al_setsampfmt (self, args)
155 configobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000156 PyObject *args;
Jack Jansene8a3c281993-02-10 14:10:56 +0000157{
158 return (setConfig (self, args, ALsetsampfmt));
159}
160
Roger E. Massea2a8b271997-01-03 22:40:34 +0000161static PyObject *
Jack Jansene8a3c281993-02-10 14:10:56 +0000162al_getfloatmax(self, args)
163 configobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000164 PyObject *args;
Jack Jansene8a3c281993-02-10 14:10:56 +0000165{
166 double arg;
167
Roger E. Massea2a8b271997-01-03 22:40:34 +0000168 if ( !PyArg_NoArgs(args) )
Jack Jansene8a3c281993-02-10 14:10:56 +0000169 return 0;
170 arg = ALgetfloatmax(self->ob_config);
Roger E. Massea2a8b271997-01-03 22:40:34 +0000171 return PyFloat_FromDouble(arg);
Jack Jansene8a3c281993-02-10 14:10:56 +0000172}
173
Roger E. Massea2a8b271997-01-03 22:40:34 +0000174static PyObject *
Jack Jansene8a3c281993-02-10 14:10:56 +0000175al_setfloatmax(self, args)
176 configobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000177 PyObject *args;
Jack Jansene8a3c281993-02-10 14:10:56 +0000178{
179 double arg;
180
Roger E. Massea2a8b271997-01-03 22:40:34 +0000181 if ( !PyArg_Parse(args, "d", &arg) )
Jack Jansene8a3c281993-02-10 14:10:56 +0000182 return 0;
183 ALsetfloatmax(self->ob_config, arg);
Roger E. Massea2a8b271997-01-03 22:40:34 +0000184 Py_INCREF(Py_None);
185 return Py_None;
Jack Jansene8a3c281993-02-10 14:10:56 +0000186}
187#endif /* AL_405 */
188
Roger E. Massea2a8b271997-01-03 22:40:34 +0000189static PyMethodDef config_methods[] = {
190 {"getqueuesize", (PyCFunction)al_getqueuesize},
191 {"setqueuesize", (PyCFunction)al_setqueuesize},
192 {"getwidth", (PyCFunction)al_getwidth},
193 {"setwidth", (PyCFunction)al_setwidth},
194 {"getchannels", (PyCFunction)al_getchannels},
195 {"setchannels", (PyCFunction)al_setchannels},
Jack Jansene8a3c281993-02-10 14:10:56 +0000196#ifdef AL_405
Roger E. Massea2a8b271997-01-03 22:40:34 +0000197 {"getsampfmt", (PyCFunction)al_getsampfmt},
198 {"setsampfmt", (PyCFunction)al_setsampfmt},
199 {"getfloatmax", (PyCFunction)al_getfloatmax},
200 {"setfloatmax", (PyCFunction)al_setfloatmax},
Jack Jansene8a3c281993-02-10 14:10:56 +0000201#endif /* AL_405 */
Guido van Rossume3db8621991-09-09 23:33:34 +0000202 {NULL, NULL} /* sentinel */
203};
204
205static void
206config_dealloc(self)
207 configobject *self;
208{
209 ALfreeconfig(self->ob_config);
Roger E. Massea2a8b271997-01-03 22:40:34 +0000210 PyMem_DEL(self);
Guido van Rossume3db8621991-09-09 23:33:34 +0000211}
212
Roger E. Massea2a8b271997-01-03 22:40:34 +0000213static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000214config_getattr(self, name)
215 configobject *self;
216 char *name;
217{
Roger E. Massea2a8b271997-01-03 22:40:34 +0000218 return Py_FindMethod(config_methods, (PyObject *)self, name);
Guido van Rossume3db8621991-09-09 23:33:34 +0000219}
220
Roger E. Massea2a8b271997-01-03 22:40:34 +0000221static PyTypeObject Configtype = {
222 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossume3db8621991-09-09 23:33:34 +0000223 0, /*ob_size*/
224 "config", /*tp_name*/
225 sizeof(configobject), /*tp_size*/
226 0, /*tp_itemsize*/
227 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000228 (destructor)config_dealloc, /*tp_dealloc*/
Guido van Rossume3db8621991-09-09 23:33:34 +0000229 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000230 (getattrfunc)config_getattr, /*tp_getattr*/
Guido van Rossume3db8621991-09-09 23:33:34 +0000231 0, /*tp_setattr*/
232 0, /*tp_compare*/
233 0, /*tp_repr*/
234};
235
Roger E. Massea2a8b271997-01-03 22:40:34 +0000236static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000237newconfigobject(config)
238 ALconfig config;
239{
240 configobject *p;
241
Roger E. Massea2a8b271997-01-03 22:40:34 +0000242 p = PyObject_NEW(configobject, &Configtype);
Guido van Rossume3db8621991-09-09 23:33:34 +0000243 if (p == NULL)
244 return NULL;
245 p->ob_config = config;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000246 return (PyObject *)p;
Guido van Rossume3db8621991-09-09 23:33:34 +0000247}
248
249/* Port objects */
250
251typedef struct {
Roger E. Massea2a8b271997-01-03 22:40:34 +0000252 PyObject_HEAD
Guido van Rossume3db8621991-09-09 23:33:34 +0000253 ALport ob_port;
254} portobject;
255
Roger E. Massea2a8b271997-01-03 22:40:34 +0000256staticforward PyTypeObject Porttype;
Guido van Rossume3db8621991-09-09 23:33:34 +0000257
258#define is_portobject(v) ((v)->ob_type == &Porttype)
259
Roger E. Massea2a8b271997-01-03 22:40:34 +0000260static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000261al_closeport (self, args)
262 portobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000263 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000264{
Roger E. Massea2a8b271997-01-03 22:40:34 +0000265 if (!PyArg_NoArgs (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000266
267 if (self->ob_port != NULL) {
268 ALcloseport (self-> ob_port);
269 self->ob_port = NULL;
270 /* XXX Using a closed port may dump core! */
271 }
272
Roger E. Massea2a8b271997-01-03 22:40:34 +0000273 Py_INCREF (Py_None);
274 return Py_None;
Guido van Rossume3db8621991-09-09 23:33:34 +0000275}
276
Roger E. Massea2a8b271997-01-03 22:40:34 +0000277static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000278al_getfd (self, args)
279 portobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000280 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000281{
282 int fd;
283
Roger E. Massea2a8b271997-01-03 22:40:34 +0000284 if (!PyArg_NoArgs (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000285
286 fd = ALgetfd (self-> ob_port);
287
Roger E. Massea2a8b271997-01-03 22:40:34 +0000288 return PyInt_FromLong (fd);
Guido van Rossume3db8621991-09-09 23:33:34 +0000289}
290
Roger E. Massea2a8b271997-01-03 22:40:34 +0000291static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000292al_getfilled (self, args)
293 portobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000294 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000295{
296 long count;
297
Roger E. Massea2a8b271997-01-03 22:40:34 +0000298 if (!PyArg_NoArgs (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000299
300 count = ALgetfilled (self-> ob_port);
301
Roger E. Massea2a8b271997-01-03 22:40:34 +0000302 return PyInt_FromLong (count);
Guido van Rossume3db8621991-09-09 23:33:34 +0000303}
304
Roger E. Massea2a8b271997-01-03 22:40:34 +0000305static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000306al_getfillable (self, args)
307 portobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000308 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000309{
310 long count;
311
Roger E. Massea2a8b271997-01-03 22:40:34 +0000312 if (!PyArg_NoArgs (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000313
314 count = ALgetfillable (self-> ob_port);
315
Roger E. Massea2a8b271997-01-03 22:40:34 +0000316 return PyInt_FromLong (count);
Guido van Rossume3db8621991-09-09 23:33:34 +0000317}
318
Roger E. Massea2a8b271997-01-03 22:40:34 +0000319static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000320al_readsamps (self, args)
321 portobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000322 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000323{
324 long count;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000325 PyObject *v;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000326 ALconfig c;
Guido van Rossume3db8621991-09-09 23:33:34 +0000327 int width;
328
Roger E. Massea2a8b271997-01-03 22:40:34 +0000329 if (!PyArg_Parse (args, "l", &count)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000330
331 if (count <= 0)
332 {
Roger E. Massea2a8b271997-01-03 22:40:34 +0000333 PyErr_SetString (PyExc_RuntimeError,
334 "al.readsamps : arg <= 0");
Guido van Rossume3db8621991-09-09 23:33:34 +0000335 return NULL;
336 }
337
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000338 c = ALgetconfig(self->ob_port);
Jack Jansene8a3c281993-02-10 14:10:56 +0000339#ifdef AL_405
340 width = ALgetsampfmt(c);
341 if ( width == AL_SAMPFMT_FLOAT )
342 width = sizeof(float);
343 else if ( width == AL_SAMPFMT_DOUBLE )
344 width = sizeof(double);
345 else
346 width = ALgetwidth(c);
347#else
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000348 width = ALgetwidth(c);
Jack Jansene8a3c281993-02-10 14:10:56 +0000349#endif /* AL_405 */
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000350 ALfreeconfig(c);
Roger E. Massea2a8b271997-01-03 22:40:34 +0000351 v = PyString_FromStringAndSize ((char *)NULL, width * count);
Guido van Rossume3db8621991-09-09 23:33:34 +0000352 if (v == NULL) return NULL;
353
Roger E. Massea2a8b271997-01-03 22:40:34 +0000354 Py_BEGIN_ALLOW_THREADS
355 ALreadsamps (self-> ob_port, (void *) PyString_AsString(v), count);
356 Py_END_ALLOW_THREADS
Guido van Rossume3db8621991-09-09 23:33:34 +0000357
358 return (v);
359}
360
Roger E. Massea2a8b271997-01-03 22:40:34 +0000361static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000362al_writesamps (self, args)
363 portobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000364 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000365{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000366 char *buf;
367 int size, width;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000368 ALconfig c;
Guido van Rossume3db8621991-09-09 23:33:34 +0000369
Roger E. Massea2a8b271997-01-03 22:40:34 +0000370 if (!PyArg_Parse (args, "s#", &buf, &size)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000371
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000372 c = ALgetconfig(self->ob_port);
Jack Jansene8a3c281993-02-10 14:10:56 +0000373#ifdef AL_405
374 width = ALgetsampfmt(c);
375 if ( width == AL_SAMPFMT_FLOAT )
376 width = sizeof(float);
377 else if ( width == AL_SAMPFMT_DOUBLE )
378 width = sizeof(double);
379 else
380 width = ALgetwidth(c);
381#else
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000382 width = ALgetwidth(c);
Jack Jansene8a3c281993-02-10 14:10:56 +0000383#endif /* AL_405 */
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000384 ALfreeconfig(c);
Roger E. Massea2a8b271997-01-03 22:40:34 +0000385 Py_BEGIN_ALLOW_THREADS
Guido van Rossumfc58e581992-01-27 16:45:55 +0000386 ALwritesamps (self-> ob_port, (void *) buf, (long) size / width);
Roger E. Massea2a8b271997-01-03 22:40:34 +0000387 Py_END_ALLOW_THREADS
Guido van Rossume3db8621991-09-09 23:33:34 +0000388
Roger E. Massea2a8b271997-01-03 22:40:34 +0000389 Py_INCREF (Py_None);
390 return Py_None;
Guido van Rossume3db8621991-09-09 23:33:34 +0000391}
392
Roger E. Massea2a8b271997-01-03 22:40:34 +0000393static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000394al_getfillpoint (self, args)
395 portobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000396 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000397{
398 long count;
399
Roger E. Massea2a8b271997-01-03 22:40:34 +0000400 if (!PyArg_NoArgs (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000401
402 count = ALgetfillpoint (self-> ob_port);
403
Roger E. Massea2a8b271997-01-03 22:40:34 +0000404 return PyInt_FromLong (count);
Guido van Rossume3db8621991-09-09 23:33:34 +0000405}
406
Roger E. Massea2a8b271997-01-03 22:40:34 +0000407static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000408al_setfillpoint (self, args)
409 portobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000410 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000411{
412 long count;
413
Roger E. Massea2a8b271997-01-03 22:40:34 +0000414 if (!PyArg_Parse (args, "l", &count)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000415
416 ALsetfillpoint (self-> ob_port, count);
417
Roger E. Massea2a8b271997-01-03 22:40:34 +0000418 Py_INCREF (Py_None);
419 return (Py_None);
Guido van Rossume3db8621991-09-09 23:33:34 +0000420}
421
Roger E. Massea2a8b271997-01-03 22:40:34 +0000422static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000423al_setconfig (self, args)
424 portobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000425 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000426{
427 ALconfig config;
428
Guido van Rossumfc58e581992-01-27 16:45:55 +0000429 if (!getconfigarg (args, &config)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000430
431 ALsetconfig (self-> ob_port, config);
432
Roger E. Massea2a8b271997-01-03 22:40:34 +0000433 Py_INCREF (Py_None);
434 return (Py_None);
Guido van Rossume3db8621991-09-09 23:33:34 +0000435}
436
Roger E. Massea2a8b271997-01-03 22:40:34 +0000437static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000438al_getconfig (self, args)
439 portobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000440 PyObject *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000441{
442 ALconfig config;
443
Roger E. Massea2a8b271997-01-03 22:40:34 +0000444 if (!PyArg_NoArgs (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000445
446 config = ALgetconfig (self-> ob_port);
447
448 return newconfigobject (config);
449}
450
Jack Jansene8a3c281993-02-10 14:10:56 +0000451#ifdef AL_405
Roger E. Massea2a8b271997-01-03 22:40:34 +0000452static PyObject *
Jack Jansene8a3c281993-02-10 14:10:56 +0000453al_getstatus (self, args)
454 portobject *self;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000455 PyObject *args;
Jack Jansene8a3c281993-02-10 14:10:56 +0000456{
Roger E. Massea2a8b271997-01-03 22:40:34 +0000457 PyObject *list, *v;
Jack Jansene8a3c281993-02-10 14:10:56 +0000458 long *PVbuffer;
459 long length;
460 int i;
461
Roger E. Massea2a8b271997-01-03 22:40:34 +0000462 if (!PyArg_Parse(args, "O", &list))
Jack Jansene8a3c281993-02-10 14:10:56 +0000463 return NULL;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000464 if (!PyList_Check(list)) {
465 PyErr_BadArgument();
Jack Jansene8a3c281993-02-10 14:10:56 +0000466 return NULL;
467 }
Roger E. Massea2a8b271997-01-03 22:40:34 +0000468 length = PyList_Size(list);
469 PVbuffer = PyMem_NEW(long, length);
Jack Jansene8a3c281993-02-10 14:10:56 +0000470 if (PVbuffer == NULL)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000471 return PyErr_NoMemory();
Jack Jansene8a3c281993-02-10 14:10:56 +0000472 for (i = 0; i < length; i++) {
Roger E. Massea2a8b271997-01-03 22:40:34 +0000473 v = PyList_GetItem(list, i);
474 if (!PyInt_Check(v)) {
475 PyMem_DEL(PVbuffer);
476 PyErr_BadArgument();
Jack Jansene8a3c281993-02-10 14:10:56 +0000477 return NULL;
478 }
Roger E. Massea2a8b271997-01-03 22:40:34 +0000479 PVbuffer[i] = PyInt_AsLong(v);
Jack Jansene8a3c281993-02-10 14:10:56 +0000480 }
481
482 ALgetstatus(self->ob_port, PVbuffer, length);
483
484 for (i = 0; i < length; i++)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000485 PyList_SetItem(list, i, PyInt_FromLong(PVbuffer[i]));
Jack Jansene8a3c281993-02-10 14:10:56 +0000486
Roger E. Massea2a8b271997-01-03 22:40:34 +0000487 PyMem_DEL(PVbuffer);
Jack Jansene8a3c281993-02-10 14:10:56 +0000488
Roger E. Massea2a8b271997-01-03 22:40:34 +0000489 Py_INCREF(Py_None);
490 return Py_None;
Jack Jansene8a3c281993-02-10 14:10:56 +0000491}
492#endif /* AL_405 */
493
Roger E. Massea2a8b271997-01-03 22:40:34 +0000494static PyMethodDef port_methods[] = {
495 {"closeport", (PyCFunction)al_closeport},
496 {"getfd", (PyCFunction)al_getfd},
497 {"fileno", (PyCFunction)al_getfd},
498 {"getfilled", (PyCFunction)al_getfilled},
499 {"getfillable", (PyCFunction)al_getfillable},
500 {"readsamps", (PyCFunction)al_readsamps},
501 {"writesamps", (PyCFunction)al_writesamps},
502 {"setfillpoint", (PyCFunction)al_setfillpoint},
503 {"getfillpoint", (PyCFunction)al_getfillpoint},
504 {"setconfig", (PyCFunction)al_setconfig},
505 {"getconfig", (PyCFunction)al_getconfig},
Jack Jansene8a3c281993-02-10 14:10:56 +0000506#ifdef AL_405
Roger E. Massea2a8b271997-01-03 22:40:34 +0000507 {"getstatus", (PyCFunction)al_getstatus},
Jack Jansene8a3c281993-02-10 14:10:56 +0000508#endif /* AL_405 */
Guido van Rossume3db8621991-09-09 23:33:34 +0000509 {NULL, NULL} /* sentinel */
510};
511
512static void
513port_dealloc(p)
514 portobject *p;
515{
516 if (p->ob_port != NULL)
517 ALcloseport(p->ob_port);
Roger E. Massea2a8b271997-01-03 22:40:34 +0000518 PyMem_DEL(p);
Guido van Rossume3db8621991-09-09 23:33:34 +0000519}
520
Roger E. Massea2a8b271997-01-03 22:40:34 +0000521static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000522port_getattr(p, name)
523 portobject *p;
524 char *name;
525{
Roger E. Massea2a8b271997-01-03 22:40:34 +0000526 return Py_FindMethod(port_methods, (PyObject *)p, name);
Guido van Rossume3db8621991-09-09 23:33:34 +0000527}
528
Roger E. Massea2a8b271997-01-03 22:40:34 +0000529static PyTypeObject Porttype = {
530 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossume3db8621991-09-09 23:33:34 +0000531 0, /*ob_size*/
532 "port", /*tp_name*/
533 sizeof(portobject), /*tp_size*/
534 0, /*tp_itemsize*/
535 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000536 (destructor)port_dealloc, /*tp_dealloc*/
Guido van Rossume3db8621991-09-09 23:33:34 +0000537 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000538 (getattrfunc)port_getattr, /*tp_getattr*/
Guido van Rossume3db8621991-09-09 23:33:34 +0000539 0, /*tp_setattr*/
540 0, /*tp_compare*/
541 0, /*tp_repr*/
542};
543
Roger E. Massea2a8b271997-01-03 22:40:34 +0000544static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000545newportobject(port)
546 ALport port;
547{
548 portobject *p;
549
Roger E. Massea2a8b271997-01-03 22:40:34 +0000550 p = PyObject_NEW(portobject, &Porttype);
Guido van Rossume3db8621991-09-09 23:33:34 +0000551 if (p == NULL)
552 return NULL;
553 p->ob_port = port;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000554 return (PyObject *)p;
Guido van Rossume3db8621991-09-09 23:33:34 +0000555}
556
557/* the module al */
558
Roger E. Massea2a8b271997-01-03 22:40:34 +0000559static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000560al_openport (self, args)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000561 PyObject *self, *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000562{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000563 char *name, *dir;
Guido van Rossume3db8621991-09-09 23:33:34 +0000564 ALport port;
565 ALconfig config = NULL;
Guido van Rossumc0aab891991-10-20 20:10:46 +0000566 int size;
Guido van Rossume3db8621991-09-09 23:33:34 +0000567
Roger E. Massea2a8b271997-01-03 22:40:34 +0000568 if (args == NULL || !PyTuple_Check(args)) {
569 PyErr_BadArgument ();
Guido van Rossumc0aab891991-10-20 20:10:46 +0000570 return NULL;
571 }
Roger E. Massea2a8b271997-01-03 22:40:34 +0000572 size = PyTuple_Size(args);
Guido van Rossume3db8621991-09-09 23:33:34 +0000573 if (size == 2) {
Roger E. Massea2a8b271997-01-03 22:40:34 +0000574 if (!PyArg_Parse (args, "(ss)", &name, &dir))
Guido van Rossume3db8621991-09-09 23:33:34 +0000575 return NULL;
576 }
577 else if (size == 3) {
578 if (!getstrstrconfigarg (args, &name, &dir, &config))
579 return NULL;
580 }
581 else {
Roger E. Massea2a8b271997-01-03 22:40:34 +0000582 PyErr_BadArgument ();
Guido van Rossume3db8621991-09-09 23:33:34 +0000583 return NULL;
584 }
585
Guido van Rossumfc58e581992-01-27 16:45:55 +0000586 port = ALopenport(name, dir, config);
Guido van Rossume3db8621991-09-09 23:33:34 +0000587
Guido van Rossumc0aab891991-10-20 20:10:46 +0000588 if (port == NULL) {
Roger E. Massea2a8b271997-01-03 22:40:34 +0000589 PyErr_SetFromErrno(PyExc_RuntimeError);
Guido van Rossumc0aab891991-10-20 20:10:46 +0000590 return NULL;
591 }
592
Guido van Rossume3db8621991-09-09 23:33:34 +0000593 return newportobject (port);
594}
595
Roger E. Massea2a8b271997-01-03 22:40:34 +0000596static PyObject *
Guido van Rossume3db8621991-09-09 23:33:34 +0000597al_newconfig (self, args)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000598 PyObject *self, *args;
Guido van Rossume3db8621991-09-09 23:33:34 +0000599{
600 ALconfig config;
601
Roger E. Massea2a8b271997-01-03 22:40:34 +0000602 if (!PyArg_NoArgs (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000603
604 config = ALnewconfig ();
Guido van Rossumc0aab891991-10-20 20:10:46 +0000605 if (config == NULL) {
Roger E. Massea2a8b271997-01-03 22:40:34 +0000606 PyErr_SetFromErrno(PyExc_RuntimeError);
Guido van Rossumc0aab891991-10-20 20:10:46 +0000607 return NULL;
608 }
Guido van Rossume3db8621991-09-09 23:33:34 +0000609
610 return newconfigobject (config);
611}
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000612
Roger E. Massea2a8b271997-01-03 22:40:34 +0000613static PyObject *
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000614al_queryparams(self, args)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000615 PyObject *self, *args;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000616{
617 long device;
618 long length;
619 long *PVbuffer;
620 long PVdummy[2];
Roger E. Massea2a8b271997-01-03 22:40:34 +0000621 PyObject *v;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000622
Roger E. Massea2a8b271997-01-03 22:40:34 +0000623 if (!PyArg_Parse (args, "l", &device))
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000624 return NULL;
625 length = ALqueryparams(device, PVdummy, 2L);
Roger E. Massea2a8b271997-01-03 22:40:34 +0000626 PVbuffer = PyMem_NEW(long, length);
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000627 if (PVbuffer == NULL)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000628 return PyErr_NoMemory();
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000629 (void) ALqueryparams(device, PVbuffer, length);
Roger E. Massea2a8b271997-01-03 22:40:34 +0000630 v = PyList_New((int)length);
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000631 if (v != NULL) {
632 int i;
633 for (i = 0; i < length; i++)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000634 PyList_SetItem(v, i, PyInt_FromLong(PVbuffer[i]));
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000635 }
Roger E. Massea2a8b271997-01-03 22:40:34 +0000636 PyMem_DEL(PVbuffer);
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000637 return v;
638}
639
Roger E. Massea2a8b271997-01-03 22:40:34 +0000640static PyObject *
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000641doParams(args, func, modified)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000642 PyObject *args;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000643 void (*func)(long, long *, long);
644 int modified;
645{
646 long device;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000647 PyObject *list, *v;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000648 long *PVbuffer;
649 long length;
650 int i;
Guido van Rossume3db8621991-09-09 23:33:34 +0000651
Roger E. Massea2a8b271997-01-03 22:40:34 +0000652 if (!PyArg_Parse(args, "(lO)", &device, &list))
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000653 return NULL;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000654 if (!PyList_Check(list)) {
655 PyErr_BadArgument();
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000656 return NULL;
657 }
Roger E. Massea2a8b271997-01-03 22:40:34 +0000658 length = PyList_Size(list);
659 PVbuffer = PyMem_NEW(long, length);
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000660 if (PVbuffer == NULL)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000661 return PyErr_NoMemory();
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000662 for (i = 0; i < length; i++) {
Roger E. Massea2a8b271997-01-03 22:40:34 +0000663 v = PyList_GetItem(list, i);
664 if (!PyInt_Check(v)) {
665 PyMem_DEL(PVbuffer);
666 PyErr_BadArgument();
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000667 return NULL;
668 }
Roger E. Massea2a8b271997-01-03 22:40:34 +0000669 PVbuffer[i] = PyInt_AsLong(v);
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000670 }
671
Guido van Rossum8db03071991-09-13 15:31:47 +0000672 (*func)(device, PVbuffer, length);
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000673
674 if (modified) {
675 for (i = 0; i < length; i++)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000676 PyList_SetItem(list, i, PyInt_FromLong(PVbuffer[i]));
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000677 }
678
Roger E. Massea2a8b271997-01-03 22:40:34 +0000679 PyMem_DEL(PVbuffer);
Guido van Rossumc0aab891991-10-20 20:10:46 +0000680
Roger E. Massea2a8b271997-01-03 22:40:34 +0000681 Py_INCREF(Py_None);
682 return Py_None;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000683}
684
Roger E. Massea2a8b271997-01-03 22:40:34 +0000685static PyObject *
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000686al_getparams(self, args)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000687 PyObject *self, *args;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000688{
689 return doParams(args, ALgetparams, 1);
690}
691
Roger E. Massea2a8b271997-01-03 22:40:34 +0000692static PyObject *
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000693al_setparams(self, args)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000694 PyObject *self, *args;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000695{
696 return doParams(args, ALsetparams, 0);
697}
698
Roger E. Massea2a8b271997-01-03 22:40:34 +0000699static PyObject *
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000700al_getname(self, args)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000701 PyObject *self, *args;
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000702{
703 long device, descriptor;
704 char *name;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000705 if (!PyArg_Parse(args, "(ll)", &device, &descriptor))
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000706 return NULL;
707 name = ALgetname(device, descriptor);
708 if (name == NULL) {
Roger E. Massea2a8b271997-01-03 22:40:34 +0000709 PyErr_SetString(PyExc_ValueError,
710 "al.getname: bad descriptor");
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000711 return NULL;
712 }
Roger E. Massea2a8b271997-01-03 22:40:34 +0000713 return PyString_FromString(name);
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000714}
715
Roger E. Massea2a8b271997-01-03 22:40:34 +0000716static PyObject *
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000717al_getdefault(self, args)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000718 PyObject *self, *args;
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000719{
720 long device, descriptor, value;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000721 if (!PyArg_Parse(args, "(ll)", &device, &descriptor))
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000722 return NULL;
723 value = ALgetdefault(device, descriptor);
Roger E. Massea2a8b271997-01-03 22:40:34 +0000724 return PyLong_FromLong(value);
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000725}
726
Roger E. Massea2a8b271997-01-03 22:40:34 +0000727static PyObject *
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000728al_getminmax(self, args)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000729 PyObject *self, *args;
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000730{
731 long device, descriptor, min, max;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000732 if (!PyArg_Parse(args, "(ll)", &device, &descriptor))
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000733 return NULL;
734 min = -1;
735 max = -1;
736 ALgetminmax(device, descriptor, &min, &max);
Roger E. Massea2a8b271997-01-03 22:40:34 +0000737 return Py_BuildValue("ll", min, max);
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000738}
739
Roger E. Massea2a8b271997-01-03 22:40:34 +0000740static PyMethodDef al_methods[] = {
741 {"openport", (PyCFunction)al_openport},
742 {"newconfig", (PyCFunction)al_newconfig},
743 {"queryparams", (PyCFunction)al_queryparams},
744 {"getparams", (PyCFunction)al_getparams},
745 {"setparams", (PyCFunction)al_setparams},
746 {"getname", (PyCFunction)al_getname},
747 {"getdefault", (PyCFunction)al_getdefault},
748 {"getminmax", (PyCFunction)al_getminmax},
Guido van Rossume3db8621991-09-09 23:33:34 +0000749 {NULL, NULL} /* sentinel */
750};
751
752void
753inital()
754{
Roger E. Massea2a8b271997-01-03 22:40:34 +0000755 Py_InitModule("al", al_methods);
Guido van Rossume3db8621991-09-09 23:33:34 +0000756}
757
Guido van Rossumfc58e581992-01-27 16:45:55 +0000758static int
759getconfigarg(o, conf)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000760 PyObject *o;
Guido van Rossume3db8621991-09-09 23:33:34 +0000761 ALconfig *conf;
762{
763 if (o == NULL || !is_configobject(o))
Roger E. Massea2a8b271997-01-03 22:40:34 +0000764 return PyErr_BadArgument ();
Guido van Rossume3db8621991-09-09 23:33:34 +0000765
Guido van Rossumfc58e581992-01-27 16:45:55 +0000766 *conf = ((configobject *) o) -> ob_config;
Guido van Rossume3db8621991-09-09 23:33:34 +0000767
768 return 1;
769}
770
Guido van Rossumfc58e581992-01-27 16:45:55 +0000771static int
Guido van Rossume3db8621991-09-09 23:33:34 +0000772getstrstrconfigarg(v, a, b, c)
Roger E. Massea2a8b271997-01-03 22:40:34 +0000773 PyObject *v;
Guido van Rossumfc58e581992-01-27 16:45:55 +0000774 char **a;
775 char **b;
Guido van Rossume3db8621991-09-09 23:33:34 +0000776 ALconfig *c;
777{
Roger E. Massea2a8b271997-01-03 22:40:34 +0000778 PyObject *o;
779 return PyArg_Parse(v, "(ssO)", a, b, &o) && getconfigarg(o, c);
Guido van Rossume3db8621991-09-09 23:33:34 +0000780}
Roger E. Massea2a8b271997-01-03 22:40:34 +0000781
782
783
784
785
786
787
788
789
790
791