blob: 5254fca18eb4b25cfc8c220f964f75ec4e441a2a [file] [log] [blame]
Guido van Rossume3db8621991-09-09 23:33:34 +00001
Guido van Rossumd641d671997-04-03 17:06:32 +00002#define OLD_INTERFACE /* define for pre-Irix 6 interface */
Jack Jansene8a3c281993-02-10 14:10:56 +00003
Roger E. Massea2a8b271997-01-03 22:40:34 +00004#include "Python.h"
Guido van Rossumd641d671997-04-03 17:06:32 +00005#include "stringobject.h"
6#include <audio.h>
7#include <stdarg.h>
Guido van Rossume3db8621991-09-09 23:33:34 +00008
Guido van Rossumd641d671997-04-03 17:06:32 +00009#ifndef AL_NO_ELEM
10#ifndef OLD_INTERFACE
11#define OLD_INTERFACE
12#endif /* OLD_INTERFACE */
13#endif /* AL_NO_ELEM */
14
15static PyObject *ErrorObject;
16
17/* ----------------------------------------------------- */
18
19/* Declarations for objects of type port */
Guido van Rossume3db8621991-09-09 23:33:34 +000020
21typedef struct {
Roger E. Massea2a8b271997-01-03 22:40:34 +000022 PyObject_HEAD
Guido van Rossumd641d671997-04-03 17:06:32 +000023 /* XXXX Add your own stuff here */
24 ALport port;
25} alpobject;
Guido van Rossume3db8621991-09-09 23:33:34 +000026
Jeremy Hylton938ace62002-07-17 16:30:39 +000027static PyTypeObject Alptype;
Guido van Rossume3db8621991-09-09 23:33:34 +000028
Guido van Rossume3db8621991-09-09 23:33:34 +000029
Guido van Rossumd641d671997-04-03 17:06:32 +000030
31/* ---------------------------------------------------------------- */
32
33/* Declarations for objects of type config */
34
35typedef struct {
36 PyObject_HEAD
37 /* XXXX Add your own stuff here */
38 ALconfig config;
39} alcobject;
40
Jeremy Hylton938ace62002-07-17 16:30:39 +000041static PyTypeObject Alctype;
Guido van Rossumd641d671997-04-03 17:06:32 +000042
43
44static void
45ErrorHandler(long code, const char *fmt, ...)
46{
47 va_list args;
48 char buf[128];
49
50 va_start(args, fmt);
51 vsprintf(buf, fmt, args);
52 va_end(args);
53 PyErr_SetString(ErrorObject, buf);
54}
55
56#ifdef AL_NO_ELEM /* IRIX 6 */
Guido van Rossumfc58e581992-01-27 16:45:55 +000057
Roger E. Massea2a8b271997-01-03 22:40:34 +000058static PyObject *
Guido van Rossumd641d671997-04-03 17:06:32 +000059param2python(int resource, int param, ALvalue value, ALparamInfo *pinfo)
60{
61 ALparamInfo info;
Guido van Rossumd641d671997-04-03 17:06:32 +000062
63 if (pinfo == NULL) {
64 pinfo = &info;
65 if (alGetParamInfo(resource, param, &info) < 0)
66 return NULL;
67 }
68 switch (pinfo->elementType) {
69 case AL_PTR_ELEM:
70 /* XXXX don't know how to handle this */
71 case AL_NO_ELEM:
72 Py_INCREF(Py_None);
73 return Py_None;
74 case AL_INT32_ELEM:
75 case AL_RESOURCE_ELEM:
76 case AL_ENUM_ELEM:
77 return PyInt_FromLong((long) value.i);
78 case AL_INT64_ELEM:
79 return PyLong_FromLongLong(value.ll);
80 case AL_FIXED_ELEM:
81 return PyFloat_FromDouble(alFixedToDouble(value.ll));
82 case AL_CHAR_ELEM:
83 if (value.ptr == NULL) {
84 Py_INCREF(Py_None);
85 return Py_None;
86 }
87 return PyString_FromString((char *) value.ptr);
88 default:
89 PyErr_SetString(ErrorObject, "unknown element type");
90 return NULL;
91 }
92}
93
94static int
95python2elem(PyObject *item, void *ptr, int elementType)
96{
97 switch (elementType) {
98 case AL_INT32_ELEM:
99 case AL_RESOURCE_ELEM:
100 case AL_ENUM_ELEM:
101 if (!PyInt_Check(item)) {
102 PyErr_BadArgument();
103 return -1;
104 }
105 *((int *) ptr) = PyInt_AsLong(item);
106 break;
107 case AL_INT64_ELEM:
108 if (PyInt_Check(item))
109 *((long long *) ptr) = PyInt_AsLong(item);
110 else if (PyLong_Check(item))
111 *((long long *) ptr) = PyLong_AsLongLong(item);
112 else {
113 PyErr_BadArgument();
114 return -1;
115 }
116 break;
117 case AL_FIXED_ELEM:
118 if (PyInt_Check(item))
119 *((long long *) ptr) = alDoubleToFixed((double) PyInt_AsLong(item));
120 else if (PyFloat_Check(item))
121 *((long long *) ptr) = alDoubleToFixed(PyFloat_AsDouble(item));
122 else {
123 PyErr_BadArgument();
124 return -1;
125 }
126 break;
127 default:
128 PyErr_SetString(ErrorObject, "unknown element type");
129 return -1;
130 }
131 return 0;
132}
133
134static int
135python2param(int resource, ALpv *param, PyObject *value, ALparamInfo *pinfo)
136{
137 ALparamInfo info;
138 int i, stepsize;
139 PyObject *item;
140
141 if (pinfo == NULL) {
142 pinfo = &info;
143 if (alGetParamInfo(resource, param->param, &info) < 0)
144 return -1;
145 }
146 switch (pinfo->valueType) {
147 case AL_STRING_VAL:
148 if (pinfo->elementType != AL_CHAR_ELEM) {
149 PyErr_SetString(ErrorObject, "unknown element type");
150 return -1;
151 }
152 if (!PyString_Check(value)) {
153 PyErr_BadArgument();
154 return -1;
155 }
156 param->value.ptr = PyString_AS_STRING(value);
157 param->sizeIn = PyString_GET_SIZE(value)+1; /*account for NUL*/
158 break;
159 case AL_SET_VAL:
160 case AL_VECTOR_VAL:
161 if (!PyList_Check(value) && !PyTuple_Check(value)) {
162 PyErr_BadArgument();
163 return -1;
164 }
165 switch (pinfo->elementType) {
166 case AL_INT32_ELEM:
167 case AL_RESOURCE_ELEM:
168 case AL_ENUM_ELEM:
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000169 param->sizeIn = PySequence_Size(value);
Guido van Rossumd641d671997-04-03 17:06:32 +0000170 param->value.ptr = PyMem_NEW(int, param->sizeIn);
171 stepsize = sizeof(int);
172 break;
173 case AL_INT64_ELEM:
174 case AL_FIXED_ELEM:
Jeremy Hylton03657cf2000-07-12 13:05:33 +0000175 param->sizeIn = PySequence_Size(value);
Guido van Rossumd641d671997-04-03 17:06:32 +0000176 param->value.ptr = PyMem_NEW(long long, param->sizeIn);
177 stepsize = sizeof(long long);
178 break;
179 }
180 for (i = 0; i < param->sizeIn; i++) {
181 item = PySequence_GetItem(value, i);
182 if (python2elem(item, (void *) ((char *) param->value.ptr + i*stepsize), pinfo->elementType) < 0) {
183 PyMem_DEL(param->value.ptr);
184 return -1;
185 }
186 }
187 break;
188 case AL_SCALAR_VAL:
189 switch (pinfo->elementType) {
190 case AL_INT32_ELEM:
191 case AL_RESOURCE_ELEM:
192 case AL_ENUM_ELEM:
193 return python2elem(value, (void *) &param->value.i,
194 pinfo->elementType);
Guido van Rossumd641d671997-04-03 17:06:32 +0000195 case AL_INT64_ELEM:
196 case AL_FIXED_ELEM:
197 return python2elem(value, (void *) &param->value.ll,
198 pinfo->elementType);
Guido van Rossumd641d671997-04-03 17:06:32 +0000199 default:
200 PyErr_SetString(ErrorObject, "unknown element type");
201 return -1;
202 }
203 }
204 return 0;
205}
206
207static int
208python2params(int resource1, int resource2, PyObject *list, ALpv **pvsp, ALparamInfo **pinfop)
209{
210 PyObject *item;
211 ALpv *pvs;
212 ALparamInfo *pinfo;
213 int npvs, i;
214
215 npvs = PyList_Size(list);
216 pvs = PyMem_NEW(ALpv, npvs);
217 pinfo = PyMem_NEW(ALparamInfo, npvs);
218 for (i = 0; i < npvs; i++) {
219 item = PyList_GetItem(list, i);
220 if (!PyArg_ParseTuple(item, "iO", &pvs[i].param, &item))
221 goto error;
222 if (alGetParamInfo(resource1, pvs[i].param, &pinfo[i]) < 0 &&
223 alGetParamInfo(resource2, pvs[i].param, &pinfo[i]) < 0)
224 goto error;
225 if (python2param(resource1, &pvs[i], item, &pinfo[i]) < 0)
226 goto error;
227 }
228
229 *pvsp = pvs;
230 *pinfop = pinfo;
231 return npvs;
232
233 error:
234 /* XXXX we should clean up everything */
235 if (pvs)
236 PyMem_DEL(pvs);
237 if (pinfo)
238 PyMem_DEL(pinfo);
239 return -1;
240}
241
242/* -------------------------------------------------------- */
243
244
245static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000246SetConfig(alcobject *self, PyObject *args, int (*func)(ALconfig, int))
Guido van Rossumd641d671997-04-03 17:06:32 +0000247{
248 int par;
249
Guido van Rossum43713e52000-02-29 13:59:29 +0000250 if (!PyArg_ParseTuple(args, "i:SetConfig", &par))
Guido van Rossumd641d671997-04-03 17:06:32 +0000251 return NULL;
252
253 if ((*func)(self->config, par) == -1)
254 return NULL;
255
256 Py_INCREF(Py_None);
Roger E. Massea2a8b271997-01-03 22:40:34 +0000257 return Py_None;
Guido van Rossume3db8621991-09-09 23:33:34 +0000258}
259
Roger E. Massea2a8b271997-01-03 22:40:34 +0000260static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000261GetConfig(alcobject *self, PyObject *args, int (*func)(ALconfig))
Guido van Rossumd641d671997-04-03 17:06:32 +0000262{
263 int par;
264
Guido van Rossum43713e52000-02-29 13:59:29 +0000265 if (!PyArg_ParseTuple(args, ":GetConfig"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000266 return NULL;
267
268 if ((par = (*func)(self->config)) == -1)
269 return NULL;
270
271 return PyInt_FromLong((long) par);
272}
273
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000274PyDoc_STRVAR(alc_SetWidth__doc__,
275"alSetWidth: set the wordsize for integer audio data.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000276
277static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000278alc_SetWidth(alcobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000279{
280 return SetConfig(self, args, alSetWidth);
281}
282
283
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000284PyDoc_STRVAR(alc_GetWidth__doc__,
285"alGetWidth: get the wordsize for integer audio data.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000286
287static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000288alc_GetWidth(alcobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000289{
290 return GetConfig(self, args, alGetWidth);
291}
292
293
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000294PyDoc_STRVAR(alc_SetSampFmt__doc__,
295"alSetSampFmt: set the sample format setting in an audio ALconfig "
296"structure.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000297
298static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000299alc_SetSampFmt(alcobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000300{
301 return SetConfig(self, args, alSetSampFmt);
302}
303
304
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000305PyDoc_STRVAR(alc_GetSampFmt__doc__,
306"alGetSampFmt: get the sample format setting in an audio ALconfig "
307"structure.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000308
309static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000310alc_GetSampFmt(alcobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000311{
312 return GetConfig(self, args, alGetSampFmt);
313}
314
315
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000316PyDoc_STRVAR(alc_SetChannels__doc__,
317"alSetChannels: set the channel settings in an audio ALconfig.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000318
319static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000320alc_SetChannels(alcobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000321{
322 return SetConfig(self, args, alSetChannels);
323}
324
325
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000326PyDoc_STRVAR(alc_GetChannels__doc__,
327"alGetChannels: get the channel settings in an audio ALconfig.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000328
329static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000330alc_GetChannels(alcobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000331{
332 return GetConfig(self, args, alGetChannels);
333}
334
335
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000336PyDoc_STRVAR(alc_SetFloatMax__doc__,
337"alSetFloatMax: set the maximum value of floating point sample data.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000338
339static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000340alc_SetFloatMax(alcobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000341{
342 double maximum_value;
343
Guido van Rossum43713e52000-02-29 13:59:29 +0000344 if (!PyArg_ParseTuple(args, "d:SetFloatMax", &maximum_value))
Guido van Rossumd641d671997-04-03 17:06:32 +0000345 return NULL;
346 if (alSetFloatMax(self->config, maximum_value) < 0)
347 return NULL;
348 Py_INCREF(Py_None);
349 return Py_None;
350}
351
352
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000353PyDoc_STRVAR(alc_GetFloatMax__doc__,
354"alGetFloatMax: get the maximum value of floating point sample data.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000355
356static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000357alc_GetFloatMax(alcobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000358{
359 double maximum_value;
360
Guido van Rossum43713e52000-02-29 13:59:29 +0000361 if (!PyArg_ParseTuple(args, ":GetFloatMax"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000362 return NULL;
363 if ((maximum_value = alGetFloatMax(self->config)) == 0)
364 return NULL;
365 return PyFloat_FromDouble(maximum_value);
366}
367
368
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000369PyDoc_STRVAR(alc_SetDevice__doc__,
370"alSetDevice: set the device setting in an audio ALconfig structure.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000371
372static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000373alc_SetDevice(alcobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000374{
375 return SetConfig(self, args, alSetDevice);
376}
377
378
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000379PyDoc_STRVAR(alc_GetDevice__doc__,
380"alGetDevice: get the device setting in an audio ALconfig structure.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000381
382static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000383alc_GetDevice(alcobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000384{
385 return GetConfig(self, args, alGetDevice);
386}
387
388
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000389PyDoc_STRVAR(alc_SetQueueSize__doc__,
390"alSetQueueSize: set audio port buffer size.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000391
392static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000393alc_SetQueueSize(alcobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000394{
395 return SetConfig(self, args, alSetQueueSize);
396}
397
398
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000399PyDoc_STRVAR(alc_GetQueueSize__doc__,
400"alGetQueueSize: get audio port buffer size.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000401
402static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000403alc_GetQueueSize(alcobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000404{
405 return GetConfig(self, args, alGetQueueSize);
406}
407
408#endif /* AL_NO_ELEM */
409
410static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000411setconfig(alcobject *self, PyObject *args, int (*func)(ALconfig, long))
Guido van Rossumd641d671997-04-03 17:06:32 +0000412{
413 long par;
414
Guido van Rossum43713e52000-02-29 13:59:29 +0000415 if (!PyArg_ParseTuple(args, "l:SetConfig", &par))
Guido van Rossumd641d671997-04-03 17:06:32 +0000416 return NULL;
417
418 if ((*func)(self->config, par) == -1)
419 return NULL;
420
421 Py_INCREF(Py_None);
422 return Py_None;
423}
424
425static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000426getconfig(alcobject *self, PyObject *args, long (*func)(ALconfig))
Guido van Rossume3db8621991-09-09 23:33:34 +0000427{
428 long par;
429
Guido van Rossum43713e52000-02-29 13:59:29 +0000430 if (!PyArg_ParseTuple(args, ":GetConfig"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000431 return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000432
Guido van Rossumd641d671997-04-03 17:06:32 +0000433 if ((par = (*func)(self->config)) == -1)
434 return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000435
Guido van Rossumd641d671997-04-03 17:06:32 +0000436 return PyInt_FromLong((long) par);
Guido van Rossume3db8621991-09-09 23:33:34 +0000437}
438
Roger E. Massea2a8b271997-01-03 22:40:34 +0000439static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000440alc_setqueuesize (alcobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +0000441{
Guido van Rossumd641d671997-04-03 17:06:32 +0000442 return setconfig(self, args, ALsetqueuesize);
Guido van Rossume3db8621991-09-09 23:33:34 +0000443}
444
Roger E. Massea2a8b271997-01-03 22:40:34 +0000445static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000446alc_getqueuesize (alcobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +0000447{
Guido van Rossumd641d671997-04-03 17:06:32 +0000448 return getconfig(self, args, ALgetqueuesize);
Guido van Rossume3db8621991-09-09 23:33:34 +0000449}
450
Roger E. Massea2a8b271997-01-03 22:40:34 +0000451static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000452alc_setwidth (alcobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +0000453{
Guido van Rossumd641d671997-04-03 17:06:32 +0000454 return setconfig(self, args, ALsetwidth);
Guido van Rossume3db8621991-09-09 23:33:34 +0000455}
456
Roger E. Massea2a8b271997-01-03 22:40:34 +0000457static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000458alc_getwidth (alcobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +0000459{
Guido van Rossumd641d671997-04-03 17:06:32 +0000460 return getconfig(self, args, ALgetwidth);
Guido van Rossume3db8621991-09-09 23:33:34 +0000461}
462
Roger E. Massea2a8b271997-01-03 22:40:34 +0000463static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000464alc_getchannels (alcobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +0000465{
Guido van Rossumd641d671997-04-03 17:06:32 +0000466 return getconfig(self, args, ALgetchannels);
Guido van Rossume3db8621991-09-09 23:33:34 +0000467}
468
Roger E. Massea2a8b271997-01-03 22:40:34 +0000469static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000470alc_setchannels (alcobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +0000471{
Guido van Rossumd641d671997-04-03 17:06:32 +0000472 return setconfig(self, args, ALsetchannels);
Guido van Rossume3db8621991-09-09 23:33:34 +0000473}
474
Jack Jansene8a3c281993-02-10 14:10:56 +0000475#ifdef AL_405
476
Roger E. Massea2a8b271997-01-03 22:40:34 +0000477static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000478alc_getsampfmt (alcobject *self, PyObject *args)
Jack Jansene8a3c281993-02-10 14:10:56 +0000479{
Guido van Rossumd641d671997-04-03 17:06:32 +0000480 return getconfig(self, args, ALgetsampfmt);
Jack Jansene8a3c281993-02-10 14:10:56 +0000481}
482
Roger E. Massea2a8b271997-01-03 22:40:34 +0000483static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000484alc_setsampfmt (alcobject *self, PyObject *args)
Jack Jansene8a3c281993-02-10 14:10:56 +0000485{
Guido van Rossumd641d671997-04-03 17:06:32 +0000486 return setconfig(self, args, ALsetsampfmt);
Jack Jansene8a3c281993-02-10 14:10:56 +0000487}
488
Roger E. Massea2a8b271997-01-03 22:40:34 +0000489static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000490alc_getfloatmax(alcobject *self, PyObject *args)
Jack Jansene8a3c281993-02-10 14:10:56 +0000491{
492 double arg;
493
Guido van Rossum43713e52000-02-29 13:59:29 +0000494 if (!PyArg_ParseTuple(args, ":GetFloatMax"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000495 return 0;
496 if ((arg = ALgetfloatmax(self->config)) == 0)
497 return NULL;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000498 return PyFloat_FromDouble(arg);
Jack Jansene8a3c281993-02-10 14:10:56 +0000499}
500
Roger E. Massea2a8b271997-01-03 22:40:34 +0000501static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000502alc_setfloatmax(alcobject *self, PyObject *args)
Jack Jansene8a3c281993-02-10 14:10:56 +0000503{
504 double arg;
505
Guido van Rossum43713e52000-02-29 13:59:29 +0000506 if (!PyArg_ParseTuple(args, "d:SetFloatMax", &arg))
Guido van Rossumd641d671997-04-03 17:06:32 +0000507 return 0;
508 if (ALsetfloatmax(self->config, arg) == -1)
509 return NULL;
Roger E. Massea2a8b271997-01-03 22:40:34 +0000510 Py_INCREF(Py_None);
511 return Py_None;
Jack Jansene8a3c281993-02-10 14:10:56 +0000512}
513#endif /* AL_405 */
514
Guido van Rossumd641d671997-04-03 17:06:32 +0000515static struct PyMethodDef alc_methods[] = {
516#ifdef AL_NO_ELEM /* IRIX 6 */
517 {"SetWidth", (PyCFunction)alc_SetWidth, METH_VARARGS, alc_SetWidth__doc__},
518 {"GetWidth", (PyCFunction)alc_GetWidth, METH_VARARGS, alc_GetWidth__doc__},
519 {"SetSampFmt", (PyCFunction)alc_SetSampFmt, METH_VARARGS, alc_SetSampFmt__doc__},
520 {"GetSampFmt", (PyCFunction)alc_GetSampFmt, METH_VARARGS, alc_GetSampFmt__doc__},
521 {"SetChannels", (PyCFunction)alc_SetChannels, METH_VARARGS, alc_SetChannels__doc__},
522 {"GetChannels", (PyCFunction)alc_GetChannels, METH_VARARGS, alc_GetChannels__doc__},
523 {"SetFloatMax", (PyCFunction)alc_SetFloatMax, METH_VARARGS, alc_SetFloatMax__doc__},
524 {"GetFloatMax", (PyCFunction)alc_GetFloatMax, METH_VARARGS, alc_GetFloatMax__doc__},
525 {"SetDevice", (PyCFunction)alc_SetDevice, METH_VARARGS, alc_SetDevice__doc__},
526 {"GetDevice", (PyCFunction)alc_GetDevice, METH_VARARGS, alc_GetDevice__doc__},
527 {"SetQueueSize", (PyCFunction)alc_SetQueueSize, METH_VARARGS, alc_SetQueueSize__doc__},
528 {"GetQueueSize", (PyCFunction)alc_GetQueueSize, METH_VARARGS, alc_GetQueueSize__doc__},
529#endif /* AL_NO_ELEM */
530 {"getqueuesize", (PyCFunction)alc_getqueuesize, METH_VARARGS},
531 {"setqueuesize", (PyCFunction)alc_setqueuesize, METH_VARARGS},
532 {"getwidth", (PyCFunction)alc_getwidth, METH_VARARGS},
533 {"setwidth", (PyCFunction)alc_setwidth, METH_VARARGS},
534 {"getchannels", (PyCFunction)alc_getchannels, METH_VARARGS},
535 {"setchannels", (PyCFunction)alc_setchannels, METH_VARARGS},
Jack Jansene8a3c281993-02-10 14:10:56 +0000536#ifdef AL_405
Guido van Rossumd641d671997-04-03 17:06:32 +0000537 {"getsampfmt", (PyCFunction)alc_getsampfmt, METH_VARARGS},
538 {"setsampfmt", (PyCFunction)alc_setsampfmt, METH_VARARGS},
539 {"getfloatmax", (PyCFunction)alc_getfloatmax, METH_VARARGS},
540 {"setfloatmax", (PyCFunction)alc_setfloatmax, METH_VARARGS},
Jack Jansene8a3c281993-02-10 14:10:56 +0000541#endif /* AL_405 */
Guido van Rossumd641d671997-04-03 17:06:32 +0000542
543 {NULL, NULL} /* sentinel */
Guido van Rossume3db8621991-09-09 23:33:34 +0000544};
545
Guido van Rossumd641d671997-04-03 17:06:32 +0000546/* ---------- */
547
548
549static PyObject *
550newalcobject(ALconfig config)
Guido van Rossume3db8621991-09-09 23:33:34 +0000551{
Guido van Rossumd641d671997-04-03 17:06:32 +0000552 alcobject *self;
553
Guido van Rossumb18618d2000-05-03 23:44:39 +0000554 self = PyObject_New(alcobject, &Alctype);
Guido van Rossumd641d671997-04-03 17:06:32 +0000555 if (self == NULL)
556 return NULL;
557 /* XXXX Add your own initializers here */
558 self->config = config;
559 return (PyObject *) self;
560}
561
562
563static void
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000564alc_dealloc(alcobject *self)
Guido van Rossumd641d671997-04-03 17:06:32 +0000565{
566 /* XXXX Add your own cleanup code here */
567#ifdef AL_NO_ELEM /* IRIX 6 */
568 (void) alFreeConfig(self->config); /* ignore errors */
569#else
570 (void) ALfreeconfig(self->config); /* ignore errors */
571#endif
Guido van Rossumb18618d2000-05-03 23:44:39 +0000572 PyObject_Del(self);
Guido van Rossume3db8621991-09-09 23:33:34 +0000573}
574
Roger E. Massea2a8b271997-01-03 22:40:34 +0000575static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000576alc_getattr(alcobject *self, char *name)
Guido van Rossume3db8621991-09-09 23:33:34 +0000577{
Guido van Rossumd641d671997-04-03 17:06:32 +0000578 /* XXXX Add your own getattr code here */
579 return Py_FindMethod(alc_methods, (PyObject *)self, name);
Guido van Rossume3db8621991-09-09 23:33:34 +0000580}
581
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000582PyDoc_STRVAR(Alctype__doc__, "");
Guido van Rossumd641d671997-04-03 17:06:32 +0000583
584static PyTypeObject Alctype = {
Roger E. Massea2a8b271997-01-03 22:40:34 +0000585 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumd641d671997-04-03 17:06:32 +0000586 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +0000587 "al.config", /*tp_name*/
Guido van Rossumd641d671997-04-03 17:06:32 +0000588 sizeof(alcobject), /*tp_basicsize*/
589 0, /*tp_itemsize*/
Guido van Rossume3db8621991-09-09 23:33:34 +0000590 /* methods */
Guido van Rossumd641d671997-04-03 17:06:32 +0000591 (destructor)alc_dealloc, /*tp_dealloc*/
592 (printfunc)0, /*tp_print*/
593 (getattrfunc)alc_getattr, /*tp_getattr*/
594 (setattrfunc)0, /*tp_setattr*/
595 (cmpfunc)0, /*tp_compare*/
596 (reprfunc)0, /*tp_repr*/
597 0, /*tp_as_number*/
598 0, /*tp_as_sequence*/
599 0, /*tp_as_mapping*/
600 (hashfunc)0, /*tp_hash*/
601 (ternaryfunc)0, /*tp_call*/
602 (reprfunc)0, /*tp_str*/
603
604 /* Space for future expansion */
605 0L,0L,0L,0L,
606 Alctype__doc__ /* Documentation string */
Guido van Rossume3db8621991-09-09 23:33:34 +0000607};
608
Guido van Rossumd641d671997-04-03 17:06:32 +0000609/* End of code for config objects */
610/* ---------------------------------------------------------------- */
Guido van Rossume3db8621991-09-09 23:33:34 +0000611
Guido van Rossumd641d671997-04-03 17:06:32 +0000612#ifdef AL_NO_ELEM /* IRIX 6 */
Guido van Rossume3db8621991-09-09 23:33:34 +0000613
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000614PyDoc_STRVAR(alp_SetConfig__doc__,
615"alSetConfig: set the ALconfig of an audio ALport.");
Guido van Rossume3db8621991-09-09 23:33:34 +0000616
Roger E. Massea2a8b271997-01-03 22:40:34 +0000617static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000618alp_SetConfig(alpobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +0000619{
Guido van Rossumd641d671997-04-03 17:06:32 +0000620 alcobject *config;
Guido van Rossum43713e52000-02-29 13:59:29 +0000621 if (!PyArg_ParseTuple(args, "O!:SetConfig", &Alctype, &config))
Guido van Rossumd641d671997-04-03 17:06:32 +0000622 return NULL;
623 if (alSetConfig(self->port, config->config) < 0)
624 return NULL;
625 Py_INCREF(Py_None);
Roger E. Massea2a8b271997-01-03 22:40:34 +0000626 return Py_None;
Guido van Rossume3db8621991-09-09 23:33:34 +0000627}
628
Guido van Rossumd641d671997-04-03 17:06:32 +0000629
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000630PyDoc_STRVAR(alp_GetConfig__doc__,
631"alGetConfig: get the ALconfig of an audio ALport.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000632
Roger E. Massea2a8b271997-01-03 22:40:34 +0000633static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000634alp_GetConfig(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000635{
636 ALconfig config;
Guido van Rossum43713e52000-02-29 13:59:29 +0000637 if (!PyArg_ParseTuple(args, ":GetConfig"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000638 return NULL;
639 if ((config = alGetConfig(self->port)) == NULL)
640 return NULL;
641 return newalcobject(config);
642}
643
644
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000645PyDoc_STRVAR(alp_GetResource__doc__,
646"alGetResource: get the resource associated with an audio port.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000647
648static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000649alp_GetResource(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000650{
651 int resource;
652
Guido van Rossum43713e52000-02-29 13:59:29 +0000653 if (!PyArg_ParseTuple(args, ":GetResource"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000654 return NULL;
655 if ((resource = alGetResource(self->port)) == 0)
656 return NULL;
657 return PyInt_FromLong((long) resource);
658}
659
660
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000661PyDoc_STRVAR(alp_GetFD__doc__,
662"alGetFD: get the file descriptor for an audio port.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000663
664static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000665alp_GetFD(alpobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +0000666{
667 int fd;
668
Guido van Rossum43713e52000-02-29 13:59:29 +0000669 if (!PyArg_ParseTuple(args, ":GetFD"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000670 return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000671
Guido van Rossumd641d671997-04-03 17:06:32 +0000672 if ((fd = alGetFD(self->port)) < 0)
673 return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000674
Guido van Rossumd641d671997-04-03 17:06:32 +0000675 return PyInt_FromLong((long) fd);
676}
677
678
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000679PyDoc_STRVAR(alp_GetFilled__doc__,
680"alGetFilled: return the number of filled sample frames in "
681"an audio port.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000682
683static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000684alp_GetFilled(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000685{
686 int filled;
687
Guido van Rossum43713e52000-02-29 13:59:29 +0000688 if (!PyArg_ParseTuple(args, ":GetFilled"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000689 return NULL;
690 if ((filled = alGetFilled(self->port)) < 0)
691 return NULL;
692 return PyInt_FromLong((long) filled);
693}
694
695
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000696PyDoc_STRVAR(alp_GetFillable__doc__,
697"alGetFillable: report the number of unfilled sample frames "
698"in an audio port.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000699
700static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000701alp_GetFillable(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000702{
703 int fillable;
704
Guido van Rossum43713e52000-02-29 13:59:29 +0000705 if (!PyArg_ParseTuple(args, ":GetFillable"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000706 return NULL;
707 if ((fillable = alGetFillable(self->port)) < 0)
708 return NULL;
709 return PyInt_FromLong((long) fillable);
710}
711
712
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000713PyDoc_STRVAR(alp_ReadFrames__doc__,
714"alReadFrames: read sample frames from an audio port.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000715
716static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000717alp_ReadFrames(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000718{
Guido van Rossumd641d671997-04-03 17:06:32 +0000719 int framecount;
720 PyObject *v;
721 int size;
722 int ch;
723 ALconfig c;
724
Guido van Rossum43713e52000-02-29 13:59:29 +0000725 if (!PyArg_ParseTuple(args, "i:ReadFrames", &framecount))
Guido van Rossumd641d671997-04-03 17:06:32 +0000726 return NULL;
727 if (framecount < 0) {
728 PyErr_SetString(ErrorObject, "negative framecount");
729 return NULL;
730 }
731 c = alGetConfig(self->port);
732 switch (alGetSampFmt(c)) {
733 case AL_SAMPFMT_TWOSCOMP:
734 switch (alGetWidth(c)) {
735 case AL_SAMPLE_8:
736 size = 1;
737 break;
738 case AL_SAMPLE_16:
739 size = 2;
740 break;
741 case AL_SAMPLE_24:
742 size = 4;
743 break;
744 default:
745 PyErr_SetString(ErrorObject, "can't determine width");
746 alFreeConfig(c);
747 return NULL;
748 }
749 break;
750 case AL_SAMPFMT_FLOAT:
751 size = 4;
752 break;
753 case AL_SAMPFMT_DOUBLE:
754 size = 8;
755 break;
756 default:
757 PyErr_SetString(ErrorObject, "can't determine format");
758 alFreeConfig(c);
759 return NULL;
760 }
761 ch = alGetChannels(c);
762 alFreeConfig(c);
763 if (ch < 0) {
764 PyErr_SetString(ErrorObject, "can't determine # of channels");
765 return NULL;
766 }
767 size *= ch;
768 v = PyString_FromStringAndSize((char *) NULL, size * framecount);
769 if (v == NULL)
770 return NULL;
771
772 Py_BEGIN_ALLOW_THREADS
773 alReadFrames(self->port, (void *) PyString_AS_STRING(v), framecount);
774 Py_END_ALLOW_THREADS
775
776 return v;
777}
778
779
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000780PyDoc_STRVAR(alp_DiscardFrames__doc__,
781"alDiscardFrames: discard audio from an audio port.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000782
783static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000784alp_DiscardFrames(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000785{
786 int framecount;
787
Guido van Rossum43713e52000-02-29 13:59:29 +0000788 if (!PyArg_ParseTuple(args, "i:DiscardFrames", &framecount))
Guido van Rossumd641d671997-04-03 17:06:32 +0000789 return NULL;
790
791 Py_BEGIN_ALLOW_THREADS
792 framecount = alDiscardFrames(self->port, framecount);
793 Py_END_ALLOW_THREADS
794
795 if (framecount < 0)
796 return NULL;
797
798 return PyInt_FromLong((long) framecount);
799}
800
801
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000802PyDoc_STRVAR(alp_ZeroFrames__doc__,
803"alZeroFrames: write zero-valued sample frames to an audio port.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000804
805static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000806alp_ZeroFrames(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000807{
808 int framecount;
809
Guido van Rossum43713e52000-02-29 13:59:29 +0000810 if (!PyArg_ParseTuple(args, "i:ZeroFrames", &framecount))
Guido van Rossumd641d671997-04-03 17:06:32 +0000811 return NULL;
812
813 if (framecount < 0) {
814 PyErr_SetString(ErrorObject, "negative framecount");
815 return NULL;
816 }
817
818 Py_BEGIN_ALLOW_THREADS
819 alZeroFrames(self->port, framecount);
820 Py_END_ALLOW_THREADS
821
822 Py_INCREF(Py_None);
823 return Py_None;
824}
825
826
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000827PyDoc_STRVAR(alp_SetFillPoint__doc__,
828"alSetFillPoint: set low- or high-water mark for an audio port.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000829
830static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000831alp_SetFillPoint(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000832{
833 int fillpoint;
834
Guido van Rossum43713e52000-02-29 13:59:29 +0000835 if (!PyArg_ParseTuple(args, "i:SetFillPoint", &fillpoint))
Guido van Rossumd641d671997-04-03 17:06:32 +0000836 return NULL;
837
838 if (alSetFillPoint(self->port, fillpoint) < 0)
839 return NULL;
840
841 Py_INCREF(Py_None);
842 return Py_None;
843}
844
845
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000846PyDoc_STRVAR(alp_GetFillPoint__doc__,
847"alGetFillPoint: get low- or high-water mark for an audio port.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000848
849static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000850alp_GetFillPoint(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000851{
852 int fillpoint;
853
Guido van Rossum43713e52000-02-29 13:59:29 +0000854 if (!PyArg_ParseTuple(args, ":GetFillPoint"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000855 return NULL;
856
857 if ((fillpoint = alGetFillPoint(self->port)) < 0)
858 return NULL;
859
860 return PyInt_FromLong((long) fillpoint);
861}
862
863
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000864PyDoc_STRVAR(alp_GetFrameNumber__doc__,
865"alGetFrameNumber: get the absolute sample frame number "
866"associated with a port.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000867
868static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000869alp_GetFrameNumber(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000870{
871 stamp_t fnum;
872
Guido van Rossum43713e52000-02-29 13:59:29 +0000873 if (!PyArg_ParseTuple(args, ":GetFrameNumber"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000874 return NULL;
875
876 if (alGetFrameNumber(self->port, &fnum) < 0)
877 return NULL;
878
879 return PyLong_FromLongLong((long long) fnum);
880}
881
882
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000883PyDoc_STRVAR(alp_GetFrameTime__doc__,
884"alGetFrameTime: get the time at which a sample frame came "
885"in or will go out.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000886
887static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000888alp_GetFrameTime(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000889{
890 stamp_t fnum, time;
891 PyObject *ret, *v0, *v1;
892
Guido van Rossum43713e52000-02-29 13:59:29 +0000893 if (!PyArg_ParseTuple(args, ":GetFrameTime"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000894 return NULL;
895 if (alGetFrameTime(self->port, &fnum, &time) < 0)
896 return NULL;
897 v0 = PyLong_FromLongLong((long long) fnum);
898 v1 = PyLong_FromLongLong((long long) time);
899 if (PyErr_Occurred()) {
900 Py_XDECREF(v0);
901 Py_XDECREF(v1);
902 return NULL;
903 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000904 ret = PyTuple_Pack(2, v0, v1);
Guido van Rossumd641d671997-04-03 17:06:32 +0000905 Py_DECREF(v0);
906 Py_DECREF(v1);
907 return ret;
908}
909
910
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000911PyDoc_STRVAR(alp_WriteFrames__doc__,
912"alWriteFrames: write sample frames to an audio port.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000913
914static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000915alp_WriteFrames(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000916{
917 char *samples;
918 int length;
919 int size, ch;
920 ALconfig c;
921
Guido van Rossum43713e52000-02-29 13:59:29 +0000922 if (!PyArg_ParseTuple(args, "s#:WriteFrames", &samples, &length))
Guido van Rossumd641d671997-04-03 17:06:32 +0000923 return NULL;
924 c = alGetConfig(self->port);
925 switch (alGetSampFmt(c)) {
926 case AL_SAMPFMT_TWOSCOMP:
927 switch (alGetWidth(c)) {
928 case AL_SAMPLE_8:
929 size = 1;
930 break;
931 case AL_SAMPLE_16:
932 size = 2;
933 break;
934 case AL_SAMPLE_24:
935 size = 4;
936 break;
937 default:
938 PyErr_SetString(ErrorObject, "can't determine width");
939 alFreeConfig(c);
940 return NULL;
941 }
942 break;
943 case AL_SAMPFMT_FLOAT:
944 size = 4;
945 break;
946 case AL_SAMPFMT_DOUBLE:
947 size = 8;
948 break;
949 default:
950 PyErr_SetString(ErrorObject, "can't determine format");
951 alFreeConfig(c);
952 return NULL;
953 }
954 ch = alGetChannels(c);
955 alFreeConfig(c);
956 if (ch < 0) {
957 PyErr_SetString(ErrorObject, "can't determine # of channels");
958 return NULL;
959 }
960 size *= ch;
961 if (length % size != 0) {
962 PyErr_SetString(ErrorObject,
963 "buffer length not whole number of frames");
964 return NULL;
965 }
966
967 Py_BEGIN_ALLOW_THREADS
968 alWriteFrames(self->port, (void *) samples, length / size);
969 Py_END_ALLOW_THREADS
970
971 Py_INCREF(Py_None);
972 return Py_None;
973}
974
975
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000976PyDoc_STRVAR(alp_ClosePort__doc__, "alClosePort: close an audio port.");
Guido van Rossumd641d671997-04-03 17:06:32 +0000977
978static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000979alp_ClosePort(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000980{
Guido van Rossum43713e52000-02-29 13:59:29 +0000981 if (!PyArg_ParseTuple(args, ":ClosePort"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000982 return NULL;
983 if (alClosePort(self->port) < 0)
984 return NULL;
985 self->port = NULL;
986 Py_INCREF(Py_None);
987 return Py_None;
988}
989
990#endif /* AL_NO_ELEM */
991
992#ifdef OLD_INTERFACE
993static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +0000994alp_closeport(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +0000995{
Guido van Rossum43713e52000-02-29 13:59:29 +0000996 if (!PyArg_ParseTuple(args, ":ClosePort"))
Guido van Rossumd641d671997-04-03 17:06:32 +0000997 return NULL;
998 if (ALcloseport(self->port) < 0)
999 return NULL;
1000 self->port = NULL;
1001 Py_INCREF(Py_None);
1002 return Py_None;
Guido van Rossume3db8621991-09-09 23:33:34 +00001003}
1004
Roger E. Massea2a8b271997-01-03 22:40:34 +00001005static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001006alp_getfd(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +00001007{
1008 int fd;
1009
Guido van Rossum43713e52000-02-29 13:59:29 +00001010 if (!PyArg_ParseTuple(args, ":GetFD"))
Guido van Rossumd641d671997-04-03 17:06:32 +00001011 return NULL;
1012 if ((fd = ALgetfd(self-> port)) == -1)
1013 return NULL;
1014 return PyInt_FromLong(fd);
1015}
1016
1017static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001018alp_getfilled(alpobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +00001019{
1020 long count;
1021
Guido van Rossum43713e52000-02-29 13:59:29 +00001022 if (!PyArg_ParseTuple(args, ":GetFilled"))
Guido van Rossumd641d671997-04-03 17:06:32 +00001023 return NULL;
1024 if ((count = ALgetfilled(self-> port)) == -1)
1025 return NULL;
1026 return PyInt_FromLong(count);
Guido van Rossume3db8621991-09-09 23:33:34 +00001027}
1028
Roger E. Massea2a8b271997-01-03 22:40:34 +00001029static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001030alp_getfillable(alpobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +00001031{
1032 long count;
1033
Guido van Rossum43713e52000-02-29 13:59:29 +00001034 if (!PyArg_ParseTuple(args, ":GetFillable"))
Guido van Rossumd641d671997-04-03 17:06:32 +00001035 return NULL;
1036 if ((count = ALgetfillable(self-> port)) == -1)
1037 return NULL;
Roger E. Massea2a8b271997-01-03 22:40:34 +00001038 return PyInt_FromLong (count);
Guido van Rossume3db8621991-09-09 23:33:34 +00001039}
1040
Roger E. Massea2a8b271997-01-03 22:40:34 +00001041static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001042alp_readsamps(alpobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +00001043{
1044 long count;
Roger E. Massea2a8b271997-01-03 22:40:34 +00001045 PyObject *v;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001046 ALconfig c;
Guido van Rossume3db8621991-09-09 23:33:34 +00001047 int width;
Guido van Rossumd641d671997-04-03 17:06:32 +00001048 int ret;
Guido van Rossume3db8621991-09-09 23:33:34 +00001049
Guido van Rossum43713e52000-02-29 13:59:29 +00001050 if (!PyArg_ParseTuple(args, "l:readsamps", &count))
Guido van Rossumd641d671997-04-03 17:06:32 +00001051 return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +00001052
Guido van Rossumd641d671997-04-03 17:06:32 +00001053 if (count <= 0) {
1054 PyErr_SetString(ErrorObject, "al.readsamps : arg <= 0");
Guido van Rossume3db8621991-09-09 23:33:34 +00001055 return NULL;
1056 }
1057
Guido van Rossumd641d671997-04-03 17:06:32 +00001058 c = ALgetconfig(self->port);
Jack Jansene8a3c281993-02-10 14:10:56 +00001059#ifdef AL_405
1060 width = ALgetsampfmt(c);
Guido van Rossumd641d671997-04-03 17:06:32 +00001061 if (width == AL_SAMPFMT_FLOAT)
1062 width = sizeof(float);
1063 else if (width == AL_SAMPFMT_DOUBLE)
1064 width = sizeof(double);
Jack Jansene8a3c281993-02-10 14:10:56 +00001065 else
Guido van Rossumd641d671997-04-03 17:06:32 +00001066 width = ALgetwidth(c);
Jack Jansene8a3c281993-02-10 14:10:56 +00001067#else
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001068 width = ALgetwidth(c);
Jack Jansene8a3c281993-02-10 14:10:56 +00001069#endif /* AL_405 */
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001070 ALfreeconfig(c);
Guido van Rossumd641d671997-04-03 17:06:32 +00001071 v = PyString_FromStringAndSize((char *)NULL, width * count);
1072 if (v == NULL)
1073 return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +00001074
Roger E. Massea2a8b271997-01-03 22:40:34 +00001075 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd641d671997-04-03 17:06:32 +00001076 ret = ALreadsamps(self->port, (void *) PyString_AsString(v), count);
Roger E. Massea2a8b271997-01-03 22:40:34 +00001077 Py_END_ALLOW_THREADS
Guido van Rossumd641d671997-04-03 17:06:32 +00001078 if (ret == -1) {
1079 Py_DECREF(v);
1080 return NULL;
1081 }
Guido van Rossume3db8621991-09-09 23:33:34 +00001082
1083 return (v);
1084}
1085
Roger E. Massea2a8b271997-01-03 22:40:34 +00001086static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001087alp_writesamps(alpobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +00001088{
Guido van Rossumfc58e581992-01-27 16:45:55 +00001089 char *buf;
1090 int size, width;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001091 ALconfig c;
Guido van Rossumd641d671997-04-03 17:06:32 +00001092 int ret;
Guido van Rossume3db8621991-09-09 23:33:34 +00001093
Guido van Rossum43713e52000-02-29 13:59:29 +00001094 if (!PyArg_ParseTuple(args, "s#:writesamps", &buf, &size))
Guido van Rossumd641d671997-04-03 17:06:32 +00001095 return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +00001096
Guido van Rossumd641d671997-04-03 17:06:32 +00001097 c = ALgetconfig(self->port);
Jack Jansene8a3c281993-02-10 14:10:56 +00001098#ifdef AL_405
1099 width = ALgetsampfmt(c);
Guido van Rossumd641d671997-04-03 17:06:32 +00001100 if (width == AL_SAMPFMT_FLOAT)
1101 width = sizeof(float);
1102 else if (width == AL_SAMPFMT_DOUBLE)
1103 width = sizeof(double);
Jack Jansene8a3c281993-02-10 14:10:56 +00001104 else
Guido van Rossumd641d671997-04-03 17:06:32 +00001105 width = ALgetwidth(c);
Jack Jansene8a3c281993-02-10 14:10:56 +00001106#else
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001107 width = ALgetwidth(c);
Jack Jansene8a3c281993-02-10 14:10:56 +00001108#endif /* AL_405 */
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001109 ALfreeconfig(c);
Roger E. Massea2a8b271997-01-03 22:40:34 +00001110 Py_BEGIN_ALLOW_THREADS
Guido van Rossumd641d671997-04-03 17:06:32 +00001111 ret = ALwritesamps (self->port, (void *) buf, (long) size / width);
Roger E. Massea2a8b271997-01-03 22:40:34 +00001112 Py_END_ALLOW_THREADS
Guido van Rossumd641d671997-04-03 17:06:32 +00001113 if (ret == -1)
1114 return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +00001115
Guido van Rossumd641d671997-04-03 17:06:32 +00001116 Py_INCREF(Py_None);
Roger E. Massea2a8b271997-01-03 22:40:34 +00001117 return Py_None;
Guido van Rossume3db8621991-09-09 23:33:34 +00001118}
1119
Roger E. Massea2a8b271997-01-03 22:40:34 +00001120static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001121alp_getfillpoint(alpobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +00001122{
1123 long count;
1124
Guido van Rossum43713e52000-02-29 13:59:29 +00001125 if (!PyArg_ParseTuple(args, ":GetFillPoint"))
Guido van Rossumd641d671997-04-03 17:06:32 +00001126 return NULL;
1127 if ((count = ALgetfillpoint(self->port)) == -1)
1128 return NULL;
1129 return PyInt_FromLong(count);
Guido van Rossume3db8621991-09-09 23:33:34 +00001130}
1131
Roger E. Massea2a8b271997-01-03 22:40:34 +00001132static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001133alp_setfillpoint(alpobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +00001134{
1135 long count;
1136
Guido van Rossum43713e52000-02-29 13:59:29 +00001137 if (!PyArg_ParseTuple(args, "l:SetFillPoint", &count))
Guido van Rossumd641d671997-04-03 17:06:32 +00001138 return NULL;
1139 if (ALsetfillpoint(self->port, count) == -1)
1140 return NULL;
1141 Py_INCREF(Py_None);
1142 return Py_None;
Guido van Rossume3db8621991-09-09 23:33:34 +00001143}
1144
Roger E. Massea2a8b271997-01-03 22:40:34 +00001145static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001146alp_setconfig(alpobject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +00001147{
1148 alcobject *config;
1149
Guido van Rossum43713e52000-02-29 13:59:29 +00001150 if (!PyArg_ParseTuple(args, "O!:SetConfig", &Alctype, &config))
Guido van Rossumd641d671997-04-03 17:06:32 +00001151 return NULL;
1152 if (ALsetconfig(self->port, config->config) == -1)
1153 return NULL;
1154 Py_INCREF(Py_None);
1155 return Py_None;
1156}
1157
1158static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001159alp_getconfig(alpobject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +00001160{
1161 ALconfig config;
1162
Guido van Rossum43713e52000-02-29 13:59:29 +00001163 if (!PyArg_ParseTuple(args, ":GetConfig"))
Guido van Rossumd641d671997-04-03 17:06:32 +00001164 return NULL;
1165 config = ALgetconfig(self->port);
1166 if (config == NULL)
1167 return NULL;
1168 return newalcobject(config);
Guido van Rossume3db8621991-09-09 23:33:34 +00001169}
1170
Jack Jansene8a3c281993-02-10 14:10:56 +00001171#ifdef AL_405
Roger E. Massea2a8b271997-01-03 22:40:34 +00001172static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001173alp_getstatus(alpobject *self, PyObject *args)
Jack Jansene8a3c281993-02-10 14:10:56 +00001174{
Roger E. Massea2a8b271997-01-03 22:40:34 +00001175 PyObject *list, *v;
Jack Jansene8a3c281993-02-10 14:10:56 +00001176 long *PVbuffer;
1177 long length;
1178 int i;
1179
Martin v. Löwis0bd292f2001-11-03 10:48:43 +00001180 if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &list))
Jack Jansene8a3c281993-02-10 14:10:56 +00001181 return NULL;
Roger E. Massea2a8b271997-01-03 22:40:34 +00001182 length = PyList_Size(list);
1183 PVbuffer = PyMem_NEW(long, length);
Jack Jansene8a3c281993-02-10 14:10:56 +00001184 if (PVbuffer == NULL)
Roger E. Massea2a8b271997-01-03 22:40:34 +00001185 return PyErr_NoMemory();
Jack Jansene8a3c281993-02-10 14:10:56 +00001186 for (i = 0; i < length; i++) {
Roger E. Massea2a8b271997-01-03 22:40:34 +00001187 v = PyList_GetItem(list, i);
1188 if (!PyInt_Check(v)) {
1189 PyMem_DEL(PVbuffer);
1190 PyErr_BadArgument();
Jack Jansene8a3c281993-02-10 14:10:56 +00001191 return NULL;
1192 }
Roger E. Massea2a8b271997-01-03 22:40:34 +00001193 PVbuffer[i] = PyInt_AsLong(v);
Jack Jansene8a3c281993-02-10 14:10:56 +00001194 }
1195
Guido van Rossumd641d671997-04-03 17:06:32 +00001196 if (ALgetstatus(self->port, PVbuffer, length) == -1)
1197 return NULL;
Jack Jansene8a3c281993-02-10 14:10:56 +00001198
1199 for (i = 0; i < length; i++)
Guido van Rossumd641d671997-04-03 17:06:32 +00001200 PyList_SetItem(list, i, PyInt_FromLong(PVbuffer[i]));
Jack Jansene8a3c281993-02-10 14:10:56 +00001201
Roger E. Massea2a8b271997-01-03 22:40:34 +00001202 PyMem_DEL(PVbuffer);
Jack Jansene8a3c281993-02-10 14:10:56 +00001203
Roger E. Massea2a8b271997-01-03 22:40:34 +00001204 Py_INCREF(Py_None);
1205 return Py_None;
Jack Jansene8a3c281993-02-10 14:10:56 +00001206}
1207#endif /* AL_405 */
1208
Guido van Rossumd641d671997-04-03 17:06:32 +00001209#endif /* OLD_INTERFACE */
1210
1211static struct PyMethodDef alp_methods[] = {
1212#ifdef AL_NO_ELEM /* IRIX 6 */
1213 {"SetConfig", (PyCFunction)alp_SetConfig, METH_VARARGS, alp_SetConfig__doc__},
1214 {"GetConfig", (PyCFunction)alp_GetConfig, METH_VARARGS, alp_GetConfig__doc__},
1215 {"GetResource", (PyCFunction)alp_GetResource, METH_VARARGS, alp_GetResource__doc__},
1216 {"GetFD", (PyCFunction)alp_GetFD, METH_VARARGS, alp_GetFD__doc__},
1217 {"GetFilled", (PyCFunction)alp_GetFilled, METH_VARARGS, alp_GetFilled__doc__},
1218 {"GetFillable", (PyCFunction)alp_GetFillable, METH_VARARGS, alp_GetFillable__doc__},
1219 {"ReadFrames", (PyCFunction)alp_ReadFrames, METH_VARARGS, alp_ReadFrames__doc__},
1220 {"DiscardFrames", (PyCFunction)alp_DiscardFrames, METH_VARARGS, alp_DiscardFrames__doc__},
1221 {"ZeroFrames", (PyCFunction)alp_ZeroFrames, METH_VARARGS, alp_ZeroFrames__doc__},
1222 {"SetFillPoint", (PyCFunction)alp_SetFillPoint, METH_VARARGS, alp_SetFillPoint__doc__},
1223 {"GetFillPoint", (PyCFunction)alp_GetFillPoint, METH_VARARGS, alp_GetFillPoint__doc__},
1224 {"GetFrameNumber", (PyCFunction)alp_GetFrameNumber, METH_VARARGS, alp_GetFrameNumber__doc__},
1225 {"GetFrameTime", (PyCFunction)alp_GetFrameTime, METH_VARARGS, alp_GetFrameTime__doc__},
1226 {"WriteFrames", (PyCFunction)alp_WriteFrames, METH_VARARGS, alp_WriteFrames__doc__},
1227 {"ClosePort", (PyCFunction)alp_ClosePort, METH_VARARGS, alp_ClosePort__doc__},
1228#endif /* AL_NO_ELEM */
1229#ifdef OLD_INTERFACE
1230 {"closeport", (PyCFunction)alp_closeport, METH_VARARGS},
1231 {"getfd", (PyCFunction)alp_getfd, METH_VARARGS},
1232 {"fileno", (PyCFunction)alp_getfd, METH_VARARGS},
1233 {"getfilled", (PyCFunction)alp_getfilled, METH_VARARGS},
1234 {"getfillable", (PyCFunction)alp_getfillable, METH_VARARGS},
1235 {"readsamps", (PyCFunction)alp_readsamps, METH_VARARGS},
1236 {"writesamps", (PyCFunction)alp_writesamps, METH_VARARGS},
1237 {"setfillpoint", (PyCFunction)alp_setfillpoint, METH_VARARGS},
1238 {"getfillpoint", (PyCFunction)alp_getfillpoint, METH_VARARGS},
1239 {"setconfig", (PyCFunction)alp_setconfig, METH_VARARGS},
1240 {"getconfig", (PyCFunction)alp_getconfig, METH_VARARGS},
Jack Jansene8a3c281993-02-10 14:10:56 +00001241#ifdef AL_405
Guido van Rossumd641d671997-04-03 17:06:32 +00001242 {"getstatus", (PyCFunction)alp_getstatus, METH_VARARGS},
Jack Jansene8a3c281993-02-10 14:10:56 +00001243#endif /* AL_405 */
Guido van Rossumd641d671997-04-03 17:06:32 +00001244#endif /* OLD_INTERFACE */
1245
1246 {NULL, NULL} /* sentinel */
Guido van Rossume3db8621991-09-09 23:33:34 +00001247};
1248
Guido van Rossumd641d671997-04-03 17:06:32 +00001249/* ---------- */
1250
1251
1252static PyObject *
1253newalpobject(ALport port)
1254{
1255 alpobject *self;
1256
Guido van Rossumb18618d2000-05-03 23:44:39 +00001257 self = PyObject_New(alpobject, &Alptype);
Guido van Rossumd641d671997-04-03 17:06:32 +00001258 if (self == NULL)
1259 return NULL;
1260 /* XXXX Add your own initializers here */
1261 self->port = port;
1262 return (PyObject *) self;
1263}
1264
1265
Guido van Rossume3db8621991-09-09 23:33:34 +00001266static void
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001267alp_dealloc(alpobject *self)
Guido van Rossume3db8621991-09-09 23:33:34 +00001268{
Guido van Rossumd641d671997-04-03 17:06:32 +00001269 /* XXXX Add your own cleanup code here */
1270 if (self->port) {
1271#ifdef AL_NO_ELEM /* IRIX 6 */
1272 alClosePort(self->port);
1273#else
1274 ALcloseport(self->port);
1275#endif
1276 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001277 PyObject_Del(self);
Guido van Rossume3db8621991-09-09 23:33:34 +00001278}
1279
Roger E. Massea2a8b271997-01-03 22:40:34 +00001280static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001281alp_getattr(alpobject *self, char *name)
Guido van Rossume3db8621991-09-09 23:33:34 +00001282{
Guido van Rossumd641d671997-04-03 17:06:32 +00001283 /* XXXX Add your own getattr code here */
1284 if (self->port == NULL) {
1285 PyErr_SetString(ErrorObject, "port already closed");
1286 return NULL;
1287 }
1288 return Py_FindMethod(alp_methods, (PyObject *)self, name);
Guido van Rossume3db8621991-09-09 23:33:34 +00001289}
1290
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001291PyDoc_STRVAR(Alptype__doc__, "");
Guido van Rossumd641d671997-04-03 17:06:32 +00001292
1293static PyTypeObject Alptype = {
Roger E. Massea2a8b271997-01-03 22:40:34 +00001294 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossumd641d671997-04-03 17:06:32 +00001295 0, /*ob_size*/
Guido van Rossum14648392001-12-08 18:02:58 +00001296 "al.port", /*tp_name*/
Guido van Rossumd641d671997-04-03 17:06:32 +00001297 sizeof(alpobject), /*tp_basicsize*/
1298 0, /*tp_itemsize*/
Guido van Rossume3db8621991-09-09 23:33:34 +00001299 /* methods */
Guido van Rossumd641d671997-04-03 17:06:32 +00001300 (destructor)alp_dealloc, /*tp_dealloc*/
1301 (printfunc)0, /*tp_print*/
1302 (getattrfunc)alp_getattr, /*tp_getattr*/
1303 (setattrfunc)0, /*tp_setattr*/
1304 (cmpfunc)0, /*tp_compare*/
1305 (reprfunc)0, /*tp_repr*/
1306 0, /*tp_as_number*/
1307 0, /*tp_as_sequence*/
1308 0, /*tp_as_mapping*/
1309 (hashfunc)0, /*tp_hash*/
1310 (ternaryfunc)0, /*tp_call*/
1311 (reprfunc)0, /*tp_str*/
1312
1313 /* Space for future expansion */
1314 0L,0L,0L,0L,
1315 Alptype__doc__ /* Documentation string */
Guido van Rossume3db8621991-09-09 23:33:34 +00001316};
1317
Guido van Rossumd641d671997-04-03 17:06:32 +00001318/* End of code for port objects */
1319/* -------------------------------------------------------- */
1320
1321
1322#ifdef AL_NO_ELEM /* IRIX 6 */
1323
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001324PyDoc_STRVAR(al_NewConfig__doc__,
1325"alNewConfig: create and initialize an audio ALconfig structure.");
Guido van Rossumd641d671997-04-03 17:06:32 +00001326
Roger E. Massea2a8b271997-01-03 22:40:34 +00001327static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001328al_NewConfig(PyObject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +00001329{
Guido van Rossumd641d671997-04-03 17:06:32 +00001330 ALconfig config;
1331
Guido van Rossum43713e52000-02-29 13:59:29 +00001332 if (!PyArg_ParseTuple(args, ":NewConfig"))
Guido van Rossume3db8621991-09-09 23:33:34 +00001333 return NULL;
Guido van Rossumd641d671997-04-03 17:06:32 +00001334 if ((config = alNewConfig()) == NULL)
1335 return NULL;
1336 return newalcobject(config);
Guido van Rossume3db8621991-09-09 23:33:34 +00001337}
1338
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001339PyDoc_STRVAR(al_OpenPort__doc__,
1340"alOpenPort: open an audio port.");
Guido van Rossume3db8621991-09-09 23:33:34 +00001341
Roger E. Massea2a8b271997-01-03 22:40:34 +00001342static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001343al_OpenPort(PyObject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +00001344{
1345 ALport port;
1346 char *name, *dir;
1347 alcobject *config = NULL;
1348
Guido van Rossum43713e52000-02-29 13:59:29 +00001349 if (!PyArg_ParseTuple(args, "ss|O!:OpenPort", &name, &dir, &Alctype, &config))
Guido van Rossumd641d671997-04-03 17:06:32 +00001350 return NULL;
1351 if ((port = alOpenPort(name, dir, config ? config->config : NULL)) == NULL)
1352 return NULL;
1353 return newalpobject(port);
1354}
1355
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001356PyDoc_STRVAR(al_Connect__doc__,
1357"alConnect: connect two audio I/O resources.");
Guido van Rossumd641d671997-04-03 17:06:32 +00001358
1359static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001360al_Connect(PyObject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +00001361{
1362 int source, dest, nprops = 0, id, i;
1363 ALpv *props = NULL;
1364 ALparamInfo *propinfo = NULL;
1365 PyObject *propobj = NULL;
1366
Guido van Rossum43713e52000-02-29 13:59:29 +00001367 if (!PyArg_ParseTuple(args, "ii|O!:Connect", &source, &dest, &PyList_Type, &propobj))
Guido van Rossumd641d671997-04-03 17:06:32 +00001368 return NULL;
1369 if (propobj != NULL) {
1370 nprops = python2params(source, dest, propobj, &props, &propinfo);
1371 if (nprops < 0)
1372 return NULL;
1373 }
1374
1375 id = alConnect(source, dest, props, nprops);
1376
1377 if (props) {
1378 for (i = 0; i < nprops; i++) {
1379 switch (propinfo[i].valueType) {
1380 case AL_SET_VAL:
1381 case AL_VECTOR_VAL:
1382 PyMem_DEL(props[i].value.ptr);
1383 break;
1384 }
1385 }
1386 PyMem_DEL(props);
1387 PyMem_DEL(propinfo);
1388 }
1389
1390 if (id < 0)
1391 return NULL;
1392 return PyInt_FromLong((long) id);
1393}
1394
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001395PyDoc_STRVAR(al_Disconnect__doc__,
1396"alDisconnect: delete a connection between two audio I/O resources.");
Guido van Rossumd641d671997-04-03 17:06:32 +00001397
1398static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001399al_Disconnect(PyObject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +00001400{
1401 int res;
1402
Guido van Rossum43713e52000-02-29 13:59:29 +00001403 if (!PyArg_ParseTuple(args, "i:Disconnect", &res))
Guido van Rossumd641d671997-04-03 17:06:32 +00001404 return NULL;
1405 if (alDisconnect(res) < 0)
1406 return NULL;
1407 Py_INCREF(Py_None);
1408 return Py_None;
1409}
1410
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001411PyDoc_STRVAR(al_GetParams__doc__,
1412"alGetParams: get the values of audio resource parameters.");
Guido van Rossumd641d671997-04-03 17:06:32 +00001413
1414static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001415al_GetParams(PyObject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +00001416{
1417 int resource;
1418 PyObject *pvslist, *item = NULL, *v = NULL;
1419 ALpv *pvs;
1420 int i, j, npvs;
1421 ALparamInfo *pinfo;
1422
Guido van Rossum43713e52000-02-29 13:59:29 +00001423 if (!PyArg_ParseTuple(args, "iO!:GetParams", &resource, &PyList_Type, &pvslist))
Guido van Rossumd641d671997-04-03 17:06:32 +00001424 return NULL;
1425 npvs = PyList_Size(pvslist);
1426 pvs = PyMem_NEW(ALpv, npvs);
1427 pinfo = PyMem_NEW(ALparamInfo, npvs);
1428 for (i = 0; i < npvs; i++) {
1429 item = PyList_GetItem(pvslist, i);
1430 if (!PyInt_Check(item)) {
1431 item = NULL;
1432 PyErr_SetString(ErrorObject, "list of integers expected");
1433 goto error;
1434 }
1435 pvs[i].param = (int) PyInt_AsLong(item);
1436 item = NULL; /* not needed anymore */
1437 if (alGetParamInfo(resource, pvs[i].param, &pinfo[i]) < 0)
1438 goto error;
1439 switch (pinfo[i].valueType) {
1440 case AL_NO_VAL:
1441 break;
1442 case AL_MATRIX_VAL:
1443 pinfo[i].maxElems *= pinfo[i].maxElems2;
1444 /* fall through */
1445 case AL_STRING_VAL:
1446 case AL_SET_VAL:
1447 case AL_VECTOR_VAL:
1448 switch (pinfo[i].elementType) {
1449 case AL_INT32_ELEM:
1450 case AL_RESOURCE_ELEM:
1451 case AL_ENUM_ELEM:
1452 pvs[i].value.ptr = PyMem_NEW(int, pinfo[i].maxElems);
1453 pvs[i].sizeIn = pinfo[i].maxElems;
1454 break;
1455 case AL_INT64_ELEM:
1456 case AL_FIXED_ELEM:
1457 pvs[i].value.ptr = PyMem_NEW(long long, pinfo[i].maxElems);
1458 pvs[i].sizeIn = pinfo[i].maxElems;
1459 break;
1460 case AL_CHAR_ELEM:
1461 pvs[i].value.ptr = PyMem_NEW(char, 32);
1462 pvs[i].sizeIn = 32;
1463 break;
1464 case AL_NO_ELEM:
1465 case AL_PTR_ELEM:
1466 default:
1467 PyErr_SetString(ErrorObject, "internal error");
1468 goto error;
1469 }
1470 break;
1471 case AL_SCALAR_VAL:
1472 break;
1473 default:
1474 PyErr_SetString(ErrorObject, "internal error");
1475 goto error;
1476 }
1477 if (pinfo[i].valueType == AL_MATRIX_VAL) {
1478 pinfo[i].maxElems /= pinfo[i].maxElems2;
1479 pvs[i].sizeIn /= pinfo[i].maxElems2;
1480 pvs[i].size2In = pinfo[i].maxElems2;
1481 }
1482 }
1483 if (alGetParams(resource, pvs, npvs) < 0)
1484 goto error;
1485 v = PyList_New(npvs);
1486 for (i = 0; i < npvs; i++) {
1487 if (pvs[i].sizeOut < 0) {
1488 char buf[32];
Tim Peters75cdad52001-11-28 22:07:30 +00001489 PyOS_snprintf(buf, sizeof(buf),
1490 "problem with param %d", i);
Guido van Rossumd641d671997-04-03 17:06:32 +00001491 PyErr_SetString(ErrorObject, buf);
1492 goto error;
1493 }
1494 switch (pinfo[i].valueType) {
1495 case AL_NO_VAL:
1496 item = Py_None;
1497 Py_INCREF(item);
1498 break;
1499 case AL_STRING_VAL:
1500 item = PyString_FromString(pvs[i].value.ptr);
1501 PyMem_DEL(pvs[i].value.ptr);
1502 break;
1503 case AL_MATRIX_VAL:
1504 /* XXXX this is not right */
1505 pvs[i].sizeOut *= pvs[i].size2Out;
1506 /* fall through */
1507 case AL_SET_VAL:
1508 case AL_VECTOR_VAL:
1509 item = PyList_New(pvs[i].sizeOut);
1510 for (j = 0; j < pvs[i].sizeOut; j++) {
1511 switch (pinfo[i].elementType) {
1512 case AL_INT32_ELEM:
1513 case AL_RESOURCE_ELEM:
1514 case AL_ENUM_ELEM:
1515 PyList_SetItem(item, j, PyInt_FromLong((long) ((int *) pvs[i].value.ptr)[j]));
1516 break;
1517 case AL_INT64_ELEM:
1518 PyList_SetItem(item, j, PyLong_FromLongLong(((long long *) pvs[i].value.ptr)[j]));
1519 break;
1520 case AL_FIXED_ELEM:
1521 PyList_SetItem(item, j, PyFloat_FromDouble(alFixedToDouble(((long long *) pvs[i].value.ptr)[j])));
1522 break;
1523 default:
1524 PyErr_SetString(ErrorObject, "internal error");
1525 goto error;
1526 }
1527 }
1528 PyMem_DEL(pvs[i].value.ptr);
1529 break;
1530 case AL_SCALAR_VAL:
1531 item = param2python(resource, pvs[i].param, pvs[i].value, &pinfo[i]);
1532 break;
1533 }
1534 if (PyErr_Occurred() ||
1535 PyList_SetItem(v, i, Py_BuildValue("(iO)", pvs[i].param,
1536 item)) < 0 ||
1537 PyErr_Occurred())
1538 goto error;
1539 Py_DECREF(item);
1540 }
1541 PyMem_DEL(pvs);
1542 PyMem_DEL(pinfo);
1543 return v;
1544
1545 error:
1546 Py_XDECREF(v);
1547 Py_XDECREF(item);
1548 if (pvs)
1549 PyMem_DEL(pvs);
1550 if (pinfo)
1551 PyMem_DEL(pinfo);
1552 return NULL;
1553}
1554
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001555PyDoc_STRVAR(al_SetParams__doc__,
1556"alSetParams: set the values of audio resource parameters.");
Guido van Rossumd641d671997-04-03 17:06:32 +00001557
1558static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001559al_SetParams(PyObject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +00001560{
1561 int resource;
Neal Norwitzddb4f622003-03-30 21:49:18 +00001562 PyObject *pvslist;
Guido van Rossumd641d671997-04-03 17:06:32 +00001563 ALpv *pvs;
1564 ALparamInfo *pinfo;
1565 int npvs, i;
1566
Guido van Rossum43713e52000-02-29 13:59:29 +00001567 if (!PyArg_ParseTuple(args, "iO!:SetParams", &resource, &PyList_Type, &pvslist))
Guido van Rossumd641d671997-04-03 17:06:32 +00001568 return NULL;
1569 npvs = python2params(resource, -1, pvslist, &pvs, &pinfo);
1570 if (npvs < 0)
1571 return NULL;
1572
1573 if (alSetParams(resource, pvs, npvs) < 0)
1574 goto error;
1575
1576 /* cleanup */
1577 for (i = 0; i < npvs; i++) {
1578 switch (pinfo[i].valueType) {
1579 case AL_SET_VAL:
1580 case AL_VECTOR_VAL:
1581 PyMem_DEL(pvs[i].value.ptr);
1582 break;
1583 }
1584 }
1585 PyMem_DEL(pvs);
1586 PyMem_DEL(pinfo);
1587
1588 Py_INCREF(Py_None);
1589 return Py_None;
1590
1591 error:
1592 /* XXXX we should clean up everything */
1593 if (pvs)
1594 PyMem_DEL(pvs);
1595 if (pinfo)
1596 PyMem_DEL(pinfo);
1597 return NULL;
1598}
1599
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001600PyDoc_STRVAR(al_QueryValues__doc__,
1601"alQueryValues: get the set of possible values for a parameter.");
Guido van Rossumd641d671997-04-03 17:06:32 +00001602
1603static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001604al_QueryValues(PyObject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +00001605{
1606 int resource, param;
1607 ALvalue *return_set = NULL;
1608 int setsize = 32, qualsize = 0, nvals, i;
1609 ALpv *quals = NULL;
1610 ALparamInfo pinfo;
1611 ALparamInfo *qualinfo = NULL;
1612 PyObject *qualobj = NULL;
1613 PyObject *res = NULL, *item;
1614
Guido van Rossum43713e52000-02-29 13:59:29 +00001615 if (!PyArg_ParseTuple(args, "ii|O!:QueryValues", &resource, &param,
Guido van Rossumd641d671997-04-03 17:06:32 +00001616 &PyList_Type, &qualobj))
1617 return NULL;
1618 if (qualobj != NULL) {
1619 qualsize = python2params(resource, param, qualobj, &quals, &qualinfo);
1620 if (qualsize < 0)
1621 return NULL;
1622 }
1623 setsize = 32;
1624 return_set = PyMem_NEW(ALvalue, setsize);
1625 if (return_set == NULL) {
1626 PyErr_NoMemory();
1627 goto cleanup;
1628 }
1629
1630 retry:
1631 nvals = alQueryValues(resource, param, return_set, setsize, quals, qualsize);
1632 if (nvals < 0)
1633 goto cleanup;
1634 if (nvals > setsize) {
1635 setsize = nvals;
1636 PyMem_RESIZE(return_set, ALvalue, setsize);
1637 if (return_set == NULL) {
1638 PyErr_NoMemory();
1639 goto cleanup;
1640 }
1641 goto retry;
1642 }
1643
1644 if (alGetParamInfo(resource, param, &pinfo) < 0)
1645 goto cleanup;
1646
1647 res = PyList_New(nvals);
1648 if (res == NULL)
1649 goto cleanup;
1650 for (i = 0; i < nvals; i++) {
1651 item = param2python(resource, param, return_set[i], &pinfo);
1652 if (item == NULL ||
1653 PyList_SetItem(res, i, item) < 0) {
1654 Py_DECREF(res);
1655 res = NULL;
1656 goto cleanup;
1657 }
1658 }
1659
1660 cleanup:
1661 if (return_set)
1662 PyMem_DEL(return_set);
1663 if (quals) {
1664 for (i = 0; i < qualsize; i++) {
1665 switch (qualinfo[i].valueType) {
1666 case AL_SET_VAL:
1667 case AL_VECTOR_VAL:
1668 PyMem_DEL(quals[i].value.ptr);
1669 break;
1670 }
1671 }
1672 PyMem_DEL(quals);
1673 PyMem_DEL(qualinfo);
1674 }
1675
1676 return res;
1677}
1678
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001679PyDoc_STRVAR(al_GetParamInfo__doc__,
1680"alGetParamInfo: get information about a parameter on "
1681"a particular audio resource.");
Guido van Rossumd641d671997-04-03 17:06:32 +00001682
1683static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001684al_GetParamInfo(PyObject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +00001685{
1686 int res, param;
1687 ALparamInfo pinfo;
1688 PyObject *v, *item;;
1689
Guido van Rossum43713e52000-02-29 13:59:29 +00001690 if (!PyArg_ParseTuple(args, "ii:GetParamInfo", &res, &param))
Guido van Rossumd641d671997-04-03 17:06:32 +00001691 return NULL;
1692 if (alGetParamInfo(res, param, &pinfo) < 0)
1693 return NULL;
1694 v = PyDict_New();
1695
1696 item = PyInt_FromLong((long) pinfo.resource);
1697 PyDict_SetItemString(v, "resource", item);
1698 Py_DECREF(item);
1699
1700 item = PyInt_FromLong((long) pinfo.param);
1701 PyDict_SetItemString(v, "param", item);
1702 Py_DECREF(item);
1703
1704 item = PyInt_FromLong((long) pinfo.valueType);
1705 PyDict_SetItemString(v, "valueType", item);
1706 Py_DECREF(item);
1707
1708 if (pinfo.valueType != AL_NO_VAL && pinfo.valueType != AL_SCALAR_VAL) {
1709 /* multiple values */
1710 item = PyInt_FromLong((long) pinfo.maxElems);
1711 PyDict_SetItemString(v, "maxElems", item);
1712 Py_DECREF(item);
1713
1714 if (pinfo.valueType == AL_MATRIX_VAL) {
1715 /* 2 dimensional */
1716 item = PyInt_FromLong((long) pinfo.maxElems2);
1717 PyDict_SetItemString(v, "maxElems2", item);
1718 Py_DECREF(item);
1719 }
1720 }
1721
1722 item = PyInt_FromLong((long) pinfo.elementType);
1723 PyDict_SetItemString(v, "elementType", item);
1724 Py_DECREF(item);
1725
1726 item = PyString_FromString(pinfo.name);
1727 PyDict_SetItemString(v, "name", item);
1728 Py_DECREF(item);
1729
1730 item = param2python(res, param, pinfo.initial, &pinfo);
1731 PyDict_SetItemString(v, "initial", item);
1732 Py_DECREF(item);
1733
1734 if (pinfo.elementType != AL_ENUM_ELEM &&
1735 pinfo.elementType != AL_RESOURCE_ELEM &&
1736 pinfo.elementType != AL_CHAR_ELEM) {
1737 /* range param */
1738 item = param2python(res, param, pinfo.min, &pinfo);
1739 PyDict_SetItemString(v, "min", item);
1740 Py_DECREF(item);
1741
1742 item = param2python(res, param, pinfo.max, &pinfo);
1743 PyDict_SetItemString(v, "max", item);
1744 Py_DECREF(item);
1745
1746 item = param2python(res, param, pinfo.minDelta, &pinfo);
1747 PyDict_SetItemString(v, "minDelta", item);
1748 Py_DECREF(item);
1749
1750 item = param2python(res, param, pinfo.maxDelta, &pinfo);
1751 PyDict_SetItemString(v, "maxDelta", item);
1752 Py_DECREF(item);
1753
1754 item = PyInt_FromLong((long) pinfo.specialVals);
1755 PyDict_SetItemString(v, "specialVals", item);
1756 Py_DECREF(item);
1757 }
1758
1759 return v;
1760}
1761
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001762PyDoc_STRVAR(al_GetResourceByName__doc__,
1763"alGetResourceByName: find an audio resource by name.");
Guido van Rossumd641d671997-04-03 17:06:32 +00001764
1765static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001766al_GetResourceByName(PyObject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +00001767{
1768 int res, start_res, type;
1769 char *name;
1770
Guido van Rossum43713e52000-02-29 13:59:29 +00001771 if (!PyArg_ParseTuple(args, "isi:GetResourceByName", &start_res, &name, &type))
Guido van Rossumd641d671997-04-03 17:06:32 +00001772 return NULL;
1773 if ((res = alGetResourceByName(start_res, name, type)) == 0)
1774 return NULL;
1775 return PyInt_FromLong((long) res);
1776}
1777
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001778PyDoc_STRVAR(al_IsSubtype__doc__,
1779"alIsSubtype: indicate if one resource type is a subtype of another.");
Guido van Rossumd641d671997-04-03 17:06:32 +00001780
1781static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001782al_IsSubtype(PyObject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +00001783{
1784 int type, subtype;
1785
Guido van Rossum43713e52000-02-29 13:59:29 +00001786 if (!PyArg_ParseTuple(args, "ii:IsSubtype", &type, &subtype))
Guido van Rossumd641d671997-04-03 17:06:32 +00001787 return NULL;
1788 return PyInt_FromLong((long) alIsSubtype(type, subtype));
1789}
1790
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001791PyDoc_STRVAR(al_SetErrorHandler__doc__, "");
Guido van Rossumd641d671997-04-03 17:06:32 +00001792
1793static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001794al_SetErrorHandler(PyObject *self, PyObject *args)
Guido van Rossumd641d671997-04-03 17:06:32 +00001795{
1796
Guido van Rossum43713e52000-02-29 13:59:29 +00001797 if (!PyArg_ParseTuple(args, ":SetErrorHandler"))
Guido van Rossumd641d671997-04-03 17:06:32 +00001798 return NULL;
1799 Py_INCREF(Py_None);
1800 return Py_None;
1801}
1802
1803#endif /* AL_NO_ELEM */
1804
1805#ifdef OLD_INTERFACE
1806
1807static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001808al_openport(PyObject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +00001809{
Guido van Rossumfc58e581992-01-27 16:45:55 +00001810 char *name, *dir;
Guido van Rossume3db8621991-09-09 23:33:34 +00001811 ALport port;
Guido van Rossumd641d671997-04-03 17:06:32 +00001812 alcobject *config = NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +00001813
Guido van Rossum43713e52000-02-29 13:59:29 +00001814 if (!PyArg_ParseTuple(args, "ss|O!:OpenPort", &name, &dir, &Alctype, &config))
Guido van Rossumc0aab891991-10-20 20:10:46 +00001815 return NULL;
Guido van Rossumd641d671997-04-03 17:06:32 +00001816 if ((port = ALopenport(name, dir, config ? config->config : NULL)) == NULL)
Guido van Rossume3db8621991-09-09 23:33:34 +00001817 return NULL;
Guido van Rossumd641d671997-04-03 17:06:32 +00001818 return newalpobject(port);
Guido van Rossume3db8621991-09-09 23:33:34 +00001819}
1820
Roger E. Massea2a8b271997-01-03 22:40:34 +00001821static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001822al_newconfig(PyObject *self, PyObject *args)
Guido van Rossume3db8621991-09-09 23:33:34 +00001823{
1824 ALconfig config;
1825
Guido van Rossum43713e52000-02-29 13:59:29 +00001826 if (!PyArg_ParseTuple(args, ":NewConfig"))
Guido van Rossumc0aab891991-10-20 20:10:46 +00001827 return NULL;
Guido van Rossumd641d671997-04-03 17:06:32 +00001828 if ((config = ALnewconfig ()) == NULL)
1829 return NULL;
1830 return newalcobject(config);
Guido van Rossume3db8621991-09-09 23:33:34 +00001831}
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001832
Roger E. Massea2a8b271997-01-03 22:40:34 +00001833static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001834al_queryparams(PyObject *self, PyObject *args)
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001835{
1836 long device;
1837 long length;
1838 long *PVbuffer;
1839 long PVdummy[2];
Guido van Rossumd641d671997-04-03 17:06:32 +00001840 PyObject *v = NULL;
1841 int i;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001842
Guido van Rossum43713e52000-02-29 13:59:29 +00001843 if (!PyArg_ParseTuple(args, "l:queryparams", &device))
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001844 return NULL;
Guido van Rossumd641d671997-04-03 17:06:32 +00001845 if ((length = ALqueryparams(device, PVdummy, 2L)) == -1)
1846 return NULL;
1847 if ((PVbuffer = PyMem_NEW(long, length)) == NULL)
Roger E. Massea2a8b271997-01-03 22:40:34 +00001848 return PyErr_NoMemory();
Guido van Rossumd641d671997-04-03 17:06:32 +00001849 if (ALqueryparams(device, PVbuffer, length) >= 0 &&
1850 (v = PyList_New((int)length)) != NULL) {
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001851 for (i = 0; i < length; i++)
Roger E. Massea2a8b271997-01-03 22:40:34 +00001852 PyList_SetItem(v, i, PyInt_FromLong(PVbuffer[i]));
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001853 }
Roger E. Massea2a8b271997-01-03 22:40:34 +00001854 PyMem_DEL(PVbuffer);
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001855 return v;
1856}
1857
Roger E. Massea2a8b271997-01-03 22:40:34 +00001858static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001859doParams(PyObject *args, int (*func)(long, long *, long), int modified)
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001860{
1861 long device;
Roger E. Massea2a8b271997-01-03 22:40:34 +00001862 PyObject *list, *v;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001863 long *PVbuffer;
1864 long length;
1865 int i;
Guido van Rossume3db8621991-09-09 23:33:34 +00001866
Guido van Rossumd641d671997-04-03 17:06:32 +00001867 if (!PyArg_ParseTuple(args, "lO!", &device, &PyList_Type, &list))
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001868 return NULL;
Roger E. Massea2a8b271997-01-03 22:40:34 +00001869 length = PyList_Size(list);
1870 PVbuffer = PyMem_NEW(long, length);
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001871 if (PVbuffer == NULL)
Roger E. Massea2a8b271997-01-03 22:40:34 +00001872 return PyErr_NoMemory();
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001873 for (i = 0; i < length; i++) {
Roger E. Massea2a8b271997-01-03 22:40:34 +00001874 v = PyList_GetItem(list, i);
1875 if (!PyInt_Check(v)) {
1876 PyMem_DEL(PVbuffer);
1877 PyErr_BadArgument();
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001878 return NULL;
1879 }
Roger E. Massea2a8b271997-01-03 22:40:34 +00001880 PVbuffer[i] = PyInt_AsLong(v);
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001881 }
1882
Guido van Rossumd641d671997-04-03 17:06:32 +00001883 if ((*func)(device, PVbuffer, length) == -1) {
1884 PyMem_DEL(PVbuffer);
1885 return NULL;
1886 }
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001887
1888 if (modified) {
1889 for (i = 0; i < length; i++)
Roger E. Massea2a8b271997-01-03 22:40:34 +00001890 PyList_SetItem(list, i, PyInt_FromLong(PVbuffer[i]));
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001891 }
1892
Roger E. Massea2a8b271997-01-03 22:40:34 +00001893 PyMem_DEL(PVbuffer);
Guido van Rossumc0aab891991-10-20 20:10:46 +00001894
Roger E. Massea2a8b271997-01-03 22:40:34 +00001895 Py_INCREF(Py_None);
1896 return Py_None;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001897}
1898
Roger E. Massea2a8b271997-01-03 22:40:34 +00001899static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001900al_getparams(PyObject *self, PyObject *args)
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001901{
1902 return doParams(args, ALgetparams, 1);
1903}
1904
Roger E. Massea2a8b271997-01-03 22:40:34 +00001905static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001906al_setparams(PyObject *self, PyObject *args)
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +00001907{
1908 return doParams(args, ALsetparams, 0);
1909}
1910
Roger E. Massea2a8b271997-01-03 22:40:34 +00001911static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001912al_getname(PyObject *self, PyObject *args)
Guido van Rossum448f4bf1992-08-19 16:41:15 +00001913{
1914 long device, descriptor;
1915 char *name;
Guido van Rossumd641d671997-04-03 17:06:32 +00001916
Guido van Rossum43713e52000-02-29 13:59:29 +00001917 if (!PyArg_ParseTuple(args, "ll:getname", &device, &descriptor))
Guido van Rossum448f4bf1992-08-19 16:41:15 +00001918 return NULL;
Guido van Rossumd641d671997-04-03 17:06:32 +00001919 if ((name = ALgetname(device, descriptor)) == NULL)
Guido van Rossum448f4bf1992-08-19 16:41:15 +00001920 return NULL;
Roger E. Massea2a8b271997-01-03 22:40:34 +00001921 return PyString_FromString(name);
Guido van Rossum448f4bf1992-08-19 16:41:15 +00001922}
1923
Roger E. Massea2a8b271997-01-03 22:40:34 +00001924static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001925al_getdefault(PyObject *self, PyObject *args)
Guido van Rossum448f4bf1992-08-19 16:41:15 +00001926{
1927 long device, descriptor, value;
Guido van Rossumd641d671997-04-03 17:06:32 +00001928
Guido van Rossum43713e52000-02-29 13:59:29 +00001929 if (!PyArg_ParseTuple(args, "ll:getdefault", &device, &descriptor))
Guido van Rossum448f4bf1992-08-19 16:41:15 +00001930 return NULL;
Guido van Rossumd641d671997-04-03 17:06:32 +00001931 if ((value = ALgetdefault(device, descriptor)) == -1)
1932 return NULL;
Roger E. Massea2a8b271997-01-03 22:40:34 +00001933 return PyLong_FromLong(value);
Guido van Rossum448f4bf1992-08-19 16:41:15 +00001934}
1935
Roger E. Massea2a8b271997-01-03 22:40:34 +00001936static PyObject *
Peter Schneider-Kamp6a850272000-07-10 17:04:33 +00001937al_getminmax(PyObject *self, PyObject *args)
Guido van Rossum448f4bf1992-08-19 16:41:15 +00001938{
1939 long device, descriptor, min, max;
Guido van Rossumd641d671997-04-03 17:06:32 +00001940
Guido van Rossum43713e52000-02-29 13:59:29 +00001941 if (!PyArg_ParseTuple(args, "ll:getminmax", &device, &descriptor))
Guido van Rossum448f4bf1992-08-19 16:41:15 +00001942 return NULL;
1943 min = -1;
1944 max = -1;
Guido van Rossumd641d671997-04-03 17:06:32 +00001945 if (ALgetminmax(device, descriptor, &min, &max) == -1)
1946 return NULL;
Roger E. Massea2a8b271997-01-03 22:40:34 +00001947 return Py_BuildValue("ll", min, max);
Guido van Rossum448f4bf1992-08-19 16:41:15 +00001948}
1949
Guido van Rossumd641d671997-04-03 17:06:32 +00001950#endif /* OLD_INTERFACE */
1951
1952/* List of methods defined in the module */
1953
1954static struct PyMethodDef al_methods[] = {
1955#ifdef AL_NO_ELEM /* IRIX 6 */
1956 {"NewConfig", (PyCFunction)al_NewConfig, METH_VARARGS, al_NewConfig__doc__},
1957 {"OpenPort", (PyCFunction)al_OpenPort, METH_VARARGS, al_OpenPort__doc__},
1958 {"Connect", (PyCFunction)al_Connect, METH_VARARGS, al_Connect__doc__},
1959 {"Disconnect", (PyCFunction)al_Disconnect, METH_VARARGS, al_Disconnect__doc__},
1960 {"GetParams", (PyCFunction)al_GetParams, METH_VARARGS, al_GetParams__doc__},
1961 {"SetParams", (PyCFunction)al_SetParams, METH_VARARGS, al_SetParams__doc__},
1962 {"QueryValues", (PyCFunction)al_QueryValues, METH_VARARGS, al_QueryValues__doc__},
1963 {"GetParamInfo", (PyCFunction)al_GetParamInfo, METH_VARARGS, al_GetParamInfo__doc__},
1964 {"GetResourceByName", (PyCFunction)al_GetResourceByName, METH_VARARGS, al_GetResourceByName__doc__},
1965 {"IsSubtype", (PyCFunction)al_IsSubtype, METH_VARARGS, al_IsSubtype__doc__},
1966#if 0
1967 /* this one not supported */
1968 {"SetErrorHandler", (PyCFunction)al_SetErrorHandler, METH_VARARGS, al_SetErrorHandler__doc__},
1969#endif
1970#endif /* AL_NO_ELEM */
1971#ifdef OLD_INTERFACE
1972 {"openport", (PyCFunction)al_openport, METH_VARARGS},
1973 {"newconfig", (PyCFunction)al_newconfig, METH_VARARGS},
1974 {"queryparams", (PyCFunction)al_queryparams, METH_VARARGS},
1975 {"getparams", (PyCFunction)al_getparams, METH_VARARGS},
1976 {"setparams", (PyCFunction)al_setparams, METH_VARARGS},
1977 {"getname", (PyCFunction)al_getname, METH_VARARGS},
1978 {"getdefault", (PyCFunction)al_getdefault, METH_VARARGS},
1979 {"getminmax", (PyCFunction)al_getminmax, METH_VARARGS},
1980#endif /* OLD_INTERFACE */
1981
1982 {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */
Guido van Rossume3db8621991-09-09 23:33:34 +00001983};
1984
Guido van Rossumd641d671997-04-03 17:06:32 +00001985
1986/* Initialization function for the module (*must* be called inital) */
1987
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001988PyDoc_STRVAR(al_module_documentation, "");
Guido van Rossumd641d671997-04-03 17:06:32 +00001989
Guido van Rossume3db8621991-09-09 23:33:34 +00001990void
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001991inital(void)
Guido van Rossume3db8621991-09-09 23:33:34 +00001992{
Guido van Rossumd641d671997-04-03 17:06:32 +00001993 PyObject *m, *d, *x;
Guido van Rossume3db8621991-09-09 23:33:34 +00001994
Guido van Rossumd641d671997-04-03 17:06:32 +00001995 /* Create the module and add the functions */
1996 m = Py_InitModule4("al", al_methods,
1997 al_module_documentation,
1998 (PyObject*)NULL,PYTHON_API_VERSION);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00001999 if (m == NULL)
2000 return;
Guido van Rossumd641d671997-04-03 17:06:32 +00002001
2002 /* Add some symbolic constants to the module */
2003 d = PyModule_GetDict(m);
Fred Drake589c35b2000-07-06 19:38:49 +00002004 ErrorObject = PyErr_NewException("al.error", NULL, NULL);
Guido van Rossumd641d671997-04-03 17:06:32 +00002005 PyDict_SetItemString(d, "error", ErrorObject);
2006
2007 /* XXXX Add constants here */
2008#ifdef AL_4CHANNEL
2009 x = PyInt_FromLong((long) AL_4CHANNEL);
2010 if (x == NULL || PyDict_SetItemString(d, "FOURCHANNEL", x) < 0)
2011 goto error;
2012 Py_DECREF(x);
2013#endif
2014#ifdef AL_ADAT_IF_TYPE
2015 x = PyInt_FromLong((long) AL_ADAT_IF_TYPE);
2016 if (x == NULL || PyDict_SetItemString(d, "ADAT_IF_TYPE", x) < 0)
2017 goto error;
2018 Py_DECREF(x);
2019#endif
2020#ifdef AL_ADAT_MCLK_TYPE
2021 x = PyInt_FromLong((long) AL_ADAT_MCLK_TYPE);
2022 if (x == NULL || PyDict_SetItemString(d, "ADAT_MCLK_TYPE", x) < 0)
2023 goto error;
2024 Py_DECREF(x);
2025#endif
2026#ifdef AL_AES_IF_TYPE
2027 x = PyInt_FromLong((long) AL_AES_IF_TYPE);
2028 if (x == NULL || PyDict_SetItemString(d, "AES_IF_TYPE", x) < 0)
2029 goto error;
2030 Py_DECREF(x);
2031#endif
2032#ifdef AL_AES_MCLK_TYPE
2033 x = PyInt_FromLong((long) AL_AES_MCLK_TYPE);
2034 if (x == NULL || PyDict_SetItemString(d, "AES_MCLK_TYPE", x) < 0)
2035 goto error;
2036 Py_DECREF(x);
2037#endif
2038#ifdef AL_ANALOG_IF_TYPE
2039 x = PyInt_FromLong((long) AL_ANALOG_IF_TYPE);
2040 if (x == NULL || PyDict_SetItemString(d, "ANALOG_IF_TYPE", x) < 0)
2041 goto error;
2042 Py_DECREF(x);
2043#endif
2044#ifdef AL_ASSOCIATE
2045 x = PyInt_FromLong((long) AL_ASSOCIATE);
2046 if (x == NULL || PyDict_SetItemString(d, "ASSOCIATE", x) < 0)
2047 goto error;
2048 Py_DECREF(x);
2049#endif
2050#ifdef AL_BAD_BUFFER_NULL
2051 x = PyInt_FromLong((long) AL_BAD_BUFFER_NULL);
2052 if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFER_NULL", x) < 0)
2053 goto error;
2054 Py_DECREF(x);
2055#endif
2056#ifdef AL_BAD_BUFFERLENGTH
2057 x = PyInt_FromLong((long) AL_BAD_BUFFERLENGTH);
2058 if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFERLENGTH", x) < 0)
2059 goto error;
2060 Py_DECREF(x);
2061#endif
2062#ifdef AL_BAD_BUFFERLENGTH_NEG
2063 x = PyInt_FromLong((long) AL_BAD_BUFFERLENGTH_NEG);
2064 if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFERLENGTH_NEG", x) < 0)
2065 goto error;
2066 Py_DECREF(x);
2067#endif
2068#ifdef AL_BAD_BUFFERLENGTH_ODD
2069 x = PyInt_FromLong((long) AL_BAD_BUFFERLENGTH_ODD);
2070 if (x == NULL || PyDict_SetItemString(d, "BAD_BUFFERLENGTH_ODD", x) < 0)
2071 goto error;
2072 Py_DECREF(x);
2073#endif
2074#ifdef AL_BAD_CHANNELS
2075 x = PyInt_FromLong((long) AL_BAD_CHANNELS);
2076 if (x == NULL || PyDict_SetItemString(d, "BAD_CHANNELS", x) < 0)
2077 goto error;
2078 Py_DECREF(x);
2079#endif
2080#ifdef AL_BAD_CONFIG
2081 x = PyInt_FromLong((long) AL_BAD_CONFIG);
2082 if (x == NULL || PyDict_SetItemString(d, "BAD_CONFIG", x) < 0)
2083 goto error;
2084 Py_DECREF(x);
2085#endif
2086#ifdef AL_BAD_COUNT_NEG
2087 x = PyInt_FromLong((long) AL_BAD_COUNT_NEG);
2088 if (x == NULL || PyDict_SetItemString(d, "BAD_COUNT_NEG", x) < 0)
2089 goto error;
2090 Py_DECREF(x);
2091#endif
2092#ifdef AL_BAD_DEVICE
2093 x = PyInt_FromLong((long) AL_BAD_DEVICE);
2094 if (x == NULL || PyDict_SetItemString(d, "BAD_DEVICE", x) < 0)
2095 goto error;
2096 Py_DECREF(x);
2097#endif
2098#ifdef AL_BAD_DEVICE_ACCESS
2099 x = PyInt_FromLong((long) AL_BAD_DEVICE_ACCESS);
2100 if (x == NULL || PyDict_SetItemString(d, "BAD_DEVICE_ACCESS", x) < 0)
2101 goto error;
2102 Py_DECREF(x);
2103#endif
2104#ifdef AL_BAD_DIRECTION
2105 x = PyInt_FromLong((long) AL_BAD_DIRECTION);
2106 if (x == NULL || PyDict_SetItemString(d, "BAD_DIRECTION", x) < 0)
2107 goto error;
2108 Py_DECREF(x);
2109#endif
2110#ifdef AL_BAD_FILLPOINT
2111 x = PyInt_FromLong((long) AL_BAD_FILLPOINT);
2112 if (x == NULL || PyDict_SetItemString(d, "BAD_FILLPOINT", x) < 0)
2113 goto error;
2114 Py_DECREF(x);
2115#endif
2116#ifdef AL_BAD_FLOATMAX
2117 x = PyInt_FromLong((long) AL_BAD_FLOATMAX);
2118 if (x == NULL || PyDict_SetItemString(d, "BAD_FLOATMAX", x) < 0)
2119 goto error;
2120 Py_DECREF(x);
2121#endif
2122#ifdef AL_BAD_ILLEGAL_STATE
2123 x = PyInt_FromLong((long) AL_BAD_ILLEGAL_STATE);
2124 if (x == NULL || PyDict_SetItemString(d, "BAD_ILLEGAL_STATE", x) < 0)
2125 goto error;
2126 Py_DECREF(x);
2127#endif
2128#ifdef AL_BAD_NO_PORTS
2129 x = PyInt_FromLong((long) AL_BAD_NO_PORTS);
2130 if (x == NULL || PyDict_SetItemString(d, "BAD_NO_PORTS", x) < 0)
2131 goto error;
2132 Py_DECREF(x);
2133#endif
2134#ifdef AL_BAD_NOT_FOUND
2135 x = PyInt_FromLong((long) AL_BAD_NOT_FOUND);
2136 if (x == NULL || PyDict_SetItemString(d, "BAD_NOT_FOUND", x) < 0)
2137 goto error;
2138 Py_DECREF(x);
2139#endif
2140#ifdef AL_BAD_NOT_IMPLEMENTED
2141 x = PyInt_FromLong((long) AL_BAD_NOT_IMPLEMENTED);
2142 if (x == NULL || PyDict_SetItemString(d, "BAD_NOT_IMPLEMENTED", x) < 0)
2143 goto error;
2144 Py_DECREF(x);
2145#endif
2146#ifdef AL_BAD_OUT_OF_MEM
2147 x = PyInt_FromLong((long) AL_BAD_OUT_OF_MEM);
2148 if (x == NULL || PyDict_SetItemString(d, "BAD_OUT_OF_MEM", x) < 0)
2149 goto error;
2150 Py_DECREF(x);
2151#endif
2152#ifdef AL_BAD_PARAM
2153 x = PyInt_FromLong((long) AL_BAD_PARAM);
2154 if (x == NULL || PyDict_SetItemString(d, "BAD_PARAM", x) < 0)
2155 goto error;
2156 Py_DECREF(x);
2157#endif
2158#ifdef AL_BAD_PERMISSIONS
2159 x = PyInt_FromLong((long) AL_BAD_PERMISSIONS);
2160 if (x == NULL || PyDict_SetItemString(d, "BAD_PERMISSIONS", x) < 0)
2161 goto error;
2162 Py_DECREF(x);
2163#endif
2164#ifdef AL_BAD_PORT
2165 x = PyInt_FromLong((long) AL_BAD_PORT);
2166 if (x == NULL || PyDict_SetItemString(d, "BAD_PORT", x) < 0)
2167 goto error;
2168 Py_DECREF(x);
2169#endif
2170#ifdef AL_BAD_PORTSTYLE
2171 x = PyInt_FromLong((long) AL_BAD_PORTSTYLE);
2172 if (x == NULL || PyDict_SetItemString(d, "BAD_PORTSTYLE", x) < 0)
2173 goto error;
2174 Py_DECREF(x);
2175#endif
2176#ifdef AL_BAD_PVBUFFER
2177 x = PyInt_FromLong((long) AL_BAD_PVBUFFER);
2178 if (x == NULL || PyDict_SetItemString(d, "BAD_PVBUFFER", x) < 0)
2179 goto error;
2180 Py_DECREF(x);
2181#endif
2182#ifdef AL_BAD_QSIZE
2183 x = PyInt_FromLong((long) AL_BAD_QSIZE);
2184 if (x == NULL || PyDict_SetItemString(d, "BAD_QSIZE", x) < 0)
2185 goto error;
2186 Py_DECREF(x);
2187#endif
2188#ifdef AL_BAD_RATE
2189 x = PyInt_FromLong((long) AL_BAD_RATE);
2190 if (x == NULL || PyDict_SetItemString(d, "BAD_RATE", x) < 0)
2191 goto error;
2192 Py_DECREF(x);
2193#endif
2194#ifdef AL_BAD_RESOURCE
2195 x = PyInt_FromLong((long) AL_BAD_RESOURCE);
2196 if (x == NULL || PyDict_SetItemString(d, "BAD_RESOURCE", x) < 0)
2197 goto error;
2198 Py_DECREF(x);
2199#endif
2200#ifdef AL_BAD_SAMPFMT
2201 x = PyInt_FromLong((long) AL_BAD_SAMPFMT);
2202 if (x == NULL || PyDict_SetItemString(d, "BAD_SAMPFMT", x) < 0)
2203 goto error;
2204 Py_DECREF(x);
2205#endif
2206#ifdef AL_BAD_TRANSFER_SIZE
2207 x = PyInt_FromLong((long) AL_BAD_TRANSFER_SIZE);
2208 if (x == NULL || PyDict_SetItemString(d, "BAD_TRANSFER_SIZE", x) < 0)
2209 goto error;
2210 Py_DECREF(x);
2211#endif
2212#ifdef AL_BAD_WIDTH
2213 x = PyInt_FromLong((long) AL_BAD_WIDTH);
2214 if (x == NULL || PyDict_SetItemString(d, "BAD_WIDTH", x) < 0)
2215 goto error;
2216 Py_DECREF(x);
2217#endif
2218#ifdef AL_CHANNEL_MODE
2219 x = PyInt_FromLong((long) AL_CHANNEL_MODE);
2220 if (x == NULL || PyDict_SetItemString(d, "CHANNEL_MODE", x) < 0)
2221 goto error;
2222 Py_DECREF(x);
2223#endif
2224#ifdef AL_CHANNELS
2225 x = PyInt_FromLong((long) AL_CHANNELS);
2226 if (x == NULL || PyDict_SetItemString(d, "CHANNELS", x) < 0)
2227 goto error;
2228 Py_DECREF(x);
2229#endif
2230#ifdef AL_CHAR_ELEM
2231 x = PyInt_FromLong((long) AL_CHAR_ELEM);
2232 if (x == NULL || PyDict_SetItemString(d, "CHAR_ELEM", x) < 0)
2233 goto error;
2234 Py_DECREF(x);
2235#endif
2236#ifdef AL_CLOCK_GEN
2237 x = PyInt_FromLong((long) AL_CLOCK_GEN);
2238 if (x == NULL || PyDict_SetItemString(d, "CLOCK_GEN", x) < 0)
2239 goto error;
2240 Py_DECREF(x);
2241#endif
2242#ifdef AL_CLOCKGEN_TYPE
2243 x = PyInt_FromLong((long) AL_CLOCKGEN_TYPE);
2244 if (x == NULL || PyDict_SetItemString(d, "CLOCKGEN_TYPE", x) < 0)
2245 goto error;
2246 Py_DECREF(x);
2247#endif
2248#ifdef AL_CONNECT
2249 x = PyInt_FromLong((long) AL_CONNECT);
2250 if (x == NULL || PyDict_SetItemString(d, "CONNECT", x) < 0)
2251 goto error;
2252 Py_DECREF(x);
2253#endif
2254#ifdef AL_CONNECTION_TYPE
2255 x = PyInt_FromLong((long) AL_CONNECTION_TYPE);
2256 if (x == NULL || PyDict_SetItemString(d, "CONNECTION_TYPE", x) < 0)
2257 goto error;
2258 Py_DECREF(x);
2259#endif
2260#ifdef AL_CONNECTIONS
2261 x = PyInt_FromLong((long) AL_CONNECTIONS);
2262 if (x == NULL || PyDict_SetItemString(d, "CONNECTIONS", x) < 0)
2263 goto error;
2264 Py_DECREF(x);
2265#endif
2266#ifdef AL_CRYSTAL_MCLK_TYPE
2267 x = PyInt_FromLong((long) AL_CRYSTAL_MCLK_TYPE);
2268 if (x == NULL || PyDict_SetItemString(d, "CRYSTAL_MCLK_TYPE", x) < 0)
2269 goto error;
2270 Py_DECREF(x);
2271#endif
2272#ifdef AL_DEFAULT_DEVICE
2273 x = PyInt_FromLong((long) AL_DEFAULT_DEVICE);
2274 if (x == NULL || PyDict_SetItemString(d, "DEFAULT_DEVICE", x) < 0)
2275 goto error;
2276 Py_DECREF(x);
2277#endif
2278#ifdef AL_DEFAULT_INPUT
2279 x = PyInt_FromLong((long) AL_DEFAULT_INPUT);
2280 if (x == NULL || PyDict_SetItemString(d, "DEFAULT_INPUT", x) < 0)
2281 goto error;
2282 Py_DECREF(x);
2283#endif
2284#ifdef AL_DEFAULT_OUTPUT
2285 x = PyInt_FromLong((long) AL_DEFAULT_OUTPUT);
2286 if (x == NULL || PyDict_SetItemString(d, "DEFAULT_OUTPUT", x) < 0)
2287 goto error;
2288 Py_DECREF(x);
2289#endif
2290#ifdef AL_DEST
2291 x = PyInt_FromLong((long) AL_DEST);
2292 if (x == NULL || PyDict_SetItemString(d, "DEST", x) < 0)
2293 goto error;
2294 Py_DECREF(x);
2295#endif
2296#ifdef AL_DEVICE_TYPE
2297 x = PyInt_FromLong((long) AL_DEVICE_TYPE);
2298 if (x == NULL || PyDict_SetItemString(d, "DEVICE_TYPE", x) < 0)
2299 goto error;
2300 Py_DECREF(x);
2301#endif
2302#ifdef AL_DEVICES
2303 x = PyInt_FromLong((long) AL_DEVICES);
2304 if (x == NULL || PyDict_SetItemString(d, "DEVICES", x) < 0)
2305 goto error;
2306 Py_DECREF(x);
2307#endif
2308#ifdef AL_DIGITAL_IF_TYPE
2309 x = PyInt_FromLong((long) AL_DIGITAL_IF_TYPE);
2310 if (x == NULL || PyDict_SetItemString(d, "DIGITAL_IF_TYPE", x) < 0)
2311 goto error;
2312 Py_DECREF(x);
2313#endif
2314#ifdef AL_DIGITAL_INPUT_RATE
2315 x = PyInt_FromLong((long) AL_DIGITAL_INPUT_RATE);
2316 if (x == NULL || PyDict_SetItemString(d, "DIGITAL_INPUT_RATE", x) < 0)
2317 goto error;
2318 Py_DECREF(x);
2319#endif
2320#ifdef AL_DISCONNECT
2321 x = PyInt_FromLong((long) AL_DISCONNECT);
2322 if (x == NULL || PyDict_SetItemString(d, "DISCONNECT", x) < 0)
2323 goto error;
2324 Py_DECREF(x);
2325#endif
2326#ifdef AL_ENUM_ELEM
2327 x = PyInt_FromLong((long) AL_ENUM_ELEM);
2328 if (x == NULL || PyDict_SetItemString(d, "ENUM_ELEM", x) < 0)
2329 goto error;
2330 Py_DECREF(x);
2331#endif
2332#ifdef AL_ENUM_VALUE
2333 x = PyInt_FromLong((long) AL_ENUM_VALUE);
2334 if (x == NULL || PyDict_SetItemString(d, "ENUM_VALUE", x) < 0)
2335 goto error;
2336 Py_DECREF(x);
2337#endif
2338#ifdef AL_ERROR_INPUT_OVERFLOW
2339 x = PyInt_FromLong((long) AL_ERROR_INPUT_OVERFLOW);
2340 if (x == NULL || PyDict_SetItemString(d, "ERROR_INPUT_OVERFLOW", x) < 0)
2341 goto error;
2342 Py_DECREF(x);
2343#endif
2344#ifdef AL_ERROR_LENGTH
2345 x = PyInt_FromLong((long) AL_ERROR_LENGTH);
2346 if (x == NULL || PyDict_SetItemString(d, "ERROR_LENGTH", x) < 0)
2347 goto error;
2348 Py_DECREF(x);
2349#endif
2350#ifdef AL_ERROR_LOCATION_LSP
2351 x = PyInt_FromLong((long) AL_ERROR_LOCATION_LSP);
2352 if (x == NULL || PyDict_SetItemString(d, "ERROR_LOCATION_LSP", x) < 0)
2353 goto error;
2354 Py_DECREF(x);
2355#endif
2356#ifdef AL_ERROR_LOCATION_MSP
2357 x = PyInt_FromLong((long) AL_ERROR_LOCATION_MSP);
2358 if (x == NULL || PyDict_SetItemString(d, "ERROR_LOCATION_MSP", x) < 0)
2359 goto error;
2360 Py_DECREF(x);
2361#endif
2362#ifdef AL_ERROR_NUMBER
2363 x = PyInt_FromLong((long) AL_ERROR_NUMBER);
2364 if (x == NULL || PyDict_SetItemString(d, "ERROR_NUMBER", x) < 0)
2365 goto error;
2366 Py_DECREF(x);
2367#endif
2368#ifdef AL_ERROR_OUTPUT_UNDERFLOW
2369 x = PyInt_FromLong((long) AL_ERROR_OUTPUT_UNDERFLOW);
2370 if (x == NULL || PyDict_SetItemString(d, "ERROR_OUTPUT_UNDERFLOW", x) < 0)
2371 goto error;
2372 Py_DECREF(x);
2373#endif
2374#ifdef AL_ERROR_TYPE
2375 x = PyInt_FromLong((long) AL_ERROR_TYPE);
2376 if (x == NULL || PyDict_SetItemString(d, "ERROR_TYPE", x) < 0)
2377 goto error;
2378 Py_DECREF(x);
2379#endif
2380#ifdef AL_FIXED_ELEM
2381 x = PyInt_FromLong((long) AL_FIXED_ELEM);
2382 if (x == NULL || PyDict_SetItemString(d, "FIXED_ELEM", x) < 0)
2383 goto error;
2384 Py_DECREF(x);
2385#endif
2386#ifdef AL_FIXED_MCLK_TYPE
2387 x = PyInt_FromLong((long) AL_FIXED_MCLK_TYPE);
2388 if (x == NULL || PyDict_SetItemString(d, "FIXED_MCLK_TYPE", x) < 0)
2389 goto error;
2390 Py_DECREF(x);
2391#endif
2392#ifdef AL_GAIN
2393 x = PyInt_FromLong((long) AL_GAIN);
2394 if (x == NULL || PyDict_SetItemString(d, "GAIN", x) < 0)
2395 goto error;
2396 Py_DECREF(x);
2397#endif
2398#ifdef AL_GAIN_REF
2399 x = PyInt_FromLong((long) AL_GAIN_REF);
2400 if (x == NULL || PyDict_SetItemString(d, "GAIN_REF", x) < 0)
2401 goto error;
2402 Py_DECREF(x);
2403#endif
2404#ifdef AL_HRB_TYPE
2405 x = PyInt_FromLong((long) AL_HRB_TYPE);
2406 if (x == NULL || PyDict_SetItemString(d, "HRB_TYPE", x) < 0)
2407 goto error;
2408 Py_DECREF(x);
2409#endif
2410#ifdef AL_INPUT_COUNT
2411 x = PyInt_FromLong((long) AL_INPUT_COUNT);
2412 if (x == NULL || PyDict_SetItemString(d, "INPUT_COUNT", x) < 0)
2413 goto error;
2414 Py_DECREF(x);
2415#endif
2416#ifdef AL_INPUT_DEVICE_TYPE
2417 x = PyInt_FromLong((long) AL_INPUT_DEVICE_TYPE);
2418 if (x == NULL || PyDict_SetItemString(d, "INPUT_DEVICE_TYPE", x) < 0)
2419 goto error;
2420 Py_DECREF(x);
2421#endif
2422#ifdef AL_INPUT_DIGITAL
2423 x = PyInt_FromLong((long) AL_INPUT_DIGITAL);
2424 if (x == NULL || PyDict_SetItemString(d, "INPUT_DIGITAL", x) < 0)
2425 goto error;
2426 Py_DECREF(x);
2427#endif
2428#ifdef AL_INPUT_HRB_TYPE
2429 x = PyInt_FromLong((long) AL_INPUT_HRB_TYPE);
2430 if (x == NULL || PyDict_SetItemString(d, "INPUT_HRB_TYPE", x) < 0)
2431 goto error;
2432 Py_DECREF(x);
2433#endif
2434#ifdef AL_INPUT_LINE
2435 x = PyInt_FromLong((long) AL_INPUT_LINE);
2436 if (x == NULL || PyDict_SetItemString(d, "INPUT_LINE", x) < 0)
2437 goto error;
2438 Py_DECREF(x);
2439#endif
2440#ifdef AL_INPUT_MIC
2441 x = PyInt_FromLong((long) AL_INPUT_MIC);
2442 if (x == NULL || PyDict_SetItemString(d, "INPUT_MIC", x) < 0)
2443 goto error;
2444 Py_DECREF(x);
2445#endif
2446#ifdef AL_INPUT_PORT_TYPE
2447 x = PyInt_FromLong((long) AL_INPUT_PORT_TYPE);
2448 if (x == NULL || PyDict_SetItemString(d, "INPUT_PORT_TYPE", x) < 0)
2449 goto error;
2450 Py_DECREF(x);
2451#endif
2452#ifdef AL_INPUT_RATE
2453 x = PyInt_FromLong((long) AL_INPUT_RATE);
2454 if (x == NULL || PyDict_SetItemString(d, "INPUT_RATE", x) < 0)
2455 goto error;
2456 Py_DECREF(x);
2457#endif
2458#ifdef AL_INPUT_SOURCE
2459 x = PyInt_FromLong((long) AL_INPUT_SOURCE);
2460 if (x == NULL || PyDict_SetItemString(d, "INPUT_SOURCE", x) < 0)
2461 goto error;
2462 Py_DECREF(x);
2463#endif
2464#ifdef AL_INT32_ELEM
2465 x = PyInt_FromLong((long) AL_INT32_ELEM);
2466 if (x == NULL || PyDict_SetItemString(d, "INT32_ELEM", x) < 0)
2467 goto error;
2468 Py_DECREF(x);
2469#endif
2470#ifdef AL_INT64_ELEM
2471 x = PyInt_FromLong((long) AL_INT64_ELEM);
2472 if (x == NULL || PyDict_SetItemString(d, "INT64_ELEM", x) < 0)
2473 goto error;
2474 Py_DECREF(x);
2475#endif
2476#ifdef AL_INTERFACE
2477 x = PyInt_FromLong((long) AL_INTERFACE);
2478 if (x == NULL || PyDict_SetItemString(d, "INTERFACE", x) < 0)
2479 goto error;
2480 Py_DECREF(x);
2481#endif
2482#ifdef AL_INTERFACE_TYPE
2483 x = PyInt_FromLong((long) AL_INTERFACE_TYPE);
2484 if (x == NULL || PyDict_SetItemString(d, "INTERFACE_TYPE", x) < 0)
2485 goto error;
2486 Py_DECREF(x);
2487#endif
2488#ifdef AL_INVALID_PARAM
2489 x = PyInt_FromLong((long) AL_INVALID_PARAM);
2490 if (x == NULL || PyDict_SetItemString(d, "INVALID_PARAM", x) < 0)
2491 goto error;
2492 Py_DECREF(x);
2493#endif
2494#ifdef AL_INVALID_VALUE
2495 x = PyInt_FromLong((long) AL_INVALID_VALUE);
2496 if (x == NULL || PyDict_SetItemString(d, "INVALID_VALUE", x) < 0)
2497 goto error;
2498 Py_DECREF(x);
2499#endif
2500#ifdef AL_JITTER
2501 x = PyInt_FromLong((long) AL_JITTER);
2502 if (x == NULL || PyDict_SetItemString(d, "JITTER", x) < 0)
2503 goto error;
2504 Py_DECREF(x);
2505#endif
2506#ifdef AL_LABEL
2507 x = PyInt_FromLong((long) AL_LABEL);
2508 if (x == NULL || PyDict_SetItemString(d, "LABEL", x) < 0)
2509 goto error;
2510 Py_DECREF(x);
2511#endif
2512#ifdef AL_LEFT_INPUT_ATTEN
2513 x = PyInt_FromLong((long) AL_LEFT_INPUT_ATTEN);
2514 if (x == NULL || PyDict_SetItemString(d, "LEFT_INPUT_ATTEN", x) < 0)
2515 goto error;
2516 Py_DECREF(x);
2517#endif
2518#ifdef AL_LEFT_MONITOR_ATTEN
2519 x = PyInt_FromLong((long) AL_LEFT_MONITOR_ATTEN);
2520 if (x == NULL || PyDict_SetItemString(d, "LEFT_MONITOR_ATTEN", x) < 0)
2521 goto error;
2522 Py_DECREF(x);
2523#endif
2524#ifdef AL_LEFT_SPEAKER_GAIN
2525 x = PyInt_FromLong((long) AL_LEFT_SPEAKER_GAIN);
2526 if (x == NULL || PyDict_SetItemString(d, "LEFT_SPEAKER_GAIN", x) < 0)
2527 goto error;
2528 Py_DECREF(x);
2529#endif
2530#ifdef AL_LEFT1_INPUT_ATTEN
2531 x = PyInt_FromLong((long) AL_LEFT1_INPUT_ATTEN);
2532 if (x == NULL || PyDict_SetItemString(d, "LEFT1_INPUT_ATTEN", x) < 0)
2533 goto error;
2534 Py_DECREF(x);
2535#endif
2536#ifdef AL_LEFT2_INPUT_ATTEN
2537 x = PyInt_FromLong((long) AL_LEFT2_INPUT_ATTEN);
2538 if (x == NULL || PyDict_SetItemString(d, "LEFT2_INPUT_ATTEN", x) < 0)
2539 goto error;
2540 Py_DECREF(x);
2541#endif
2542#ifdef AL_LINE_IF_TYPE
2543 x = PyInt_FromLong((long) AL_LINE_IF_TYPE);
2544 if (x == NULL || PyDict_SetItemString(d, "LINE_IF_TYPE", x) < 0)
2545 goto error;
2546 Py_DECREF(x);
2547#endif
Neal Norwitzddb4f622003-03-30 21:49:18 +00002548#ifdef AL_LOCKED
2549 x = PyInt_FromLong((long) AL_LOCKED);
2550 if (x == NULL || PyDict_SetItemString(d, "LOCKED", x) < 0)
2551 goto error;
2552 Py_DECREF(x);
2553#endif
Guido van Rossumd641d671997-04-03 17:06:32 +00002554#ifdef AL_MASTER_CLOCK
2555 x = PyInt_FromLong((long) AL_MASTER_CLOCK);
2556 if (x == NULL || PyDict_SetItemString(d, "MASTER_CLOCK", x) < 0)
2557 goto error;
2558 Py_DECREF(x);
2559#endif
2560#ifdef AL_MATRIX_VAL
2561 x = PyInt_FromLong((long) AL_MATRIX_VAL);
2562 if (x == NULL || PyDict_SetItemString(d, "MATRIX_VAL", x) < 0)
2563 goto error;
2564 Py_DECREF(x);
2565#endif
2566#ifdef AL_MAX_ERROR
2567 x = PyInt_FromLong((long) AL_MAX_ERROR);
2568 if (x == NULL || PyDict_SetItemString(d, "MAX_ERROR", x) < 0)
2569 goto error;
2570 Py_DECREF(x);
2571#endif
2572#ifdef AL_MAX_EVENT_PARAM
2573 x = PyInt_FromLong((long) AL_MAX_EVENT_PARAM);
2574 if (x == NULL || PyDict_SetItemString(d, "MAX_EVENT_PARAM", x) < 0)
2575 goto error;
2576 Py_DECREF(x);
2577#endif
2578#ifdef AL_MAX_PBUFSIZE
2579 x = PyInt_FromLong((long) AL_MAX_PBUFSIZE);
2580 if (x == NULL || PyDict_SetItemString(d, "MAX_PBUFSIZE", x) < 0)
2581 goto error;
2582 Py_DECREF(x);
2583#endif
2584#ifdef AL_MAX_PORTS
2585 x = PyInt_FromLong((long) AL_MAX_PORTS);
2586 if (x == NULL || PyDict_SetItemString(d, "MAX_PORTS", x) < 0)
2587 goto error;
2588 Py_DECREF(x);
2589#endif
2590#ifdef AL_MAX_RESOURCE_ID
2591 x = PyInt_FromLong((long) AL_MAX_RESOURCE_ID);
2592 if (x == NULL || PyDict_SetItemString(d, "MAX_RESOURCE_ID", x) < 0)
2593 goto error;
2594 Py_DECREF(x);
2595#endif
2596#ifdef AL_MAX_SETSIZE
2597 x = PyInt_FromLong((long) AL_MAX_SETSIZE);
2598 if (x == NULL || PyDict_SetItemString(d, "MAX_SETSIZE", x) < 0)
2599 goto error;
2600 Py_DECREF(x);
2601#endif
2602#ifdef AL_MAX_STRLEN
2603 x = PyInt_FromLong((long) AL_MAX_STRLEN);
2604 if (x == NULL || PyDict_SetItemString(d, "MAX_STRLEN", x) < 0)
2605 goto error;
2606 Py_DECREF(x);
2607#endif
2608#ifdef AL_MCLK_TYPE
2609 x = PyInt_FromLong((long) AL_MCLK_TYPE);
2610 if (x == NULL || PyDict_SetItemString(d, "MCLK_TYPE", x) < 0)
2611 goto error;
2612 Py_DECREF(x);
2613#endif
2614#ifdef AL_MIC_IF_TYPE
2615 x = PyInt_FromLong((long) AL_MIC_IF_TYPE);
2616 if (x == NULL || PyDict_SetItemString(d, "MIC_IF_TYPE", x) < 0)
2617 goto error;
2618 Py_DECREF(x);
2619#endif
2620#ifdef AL_MONITOR_CTL
2621 x = PyInt_FromLong((long) AL_MONITOR_CTL);
2622 if (x == NULL || PyDict_SetItemString(d, "MONITOR_CTL", x) < 0)
2623 goto error;
2624 Py_DECREF(x);
2625#endif
2626#ifdef AL_MONITOR_OFF
2627 x = PyInt_FromLong((long) AL_MONITOR_OFF);
2628 if (x == NULL || PyDict_SetItemString(d, "MONITOR_OFF", x) < 0)
2629 goto error;
2630 Py_DECREF(x);
2631#endif
2632#ifdef AL_MONITOR_ON
2633 x = PyInt_FromLong((long) AL_MONITOR_ON);
2634 if (x == NULL || PyDict_SetItemString(d, "MONITOR_ON", x) < 0)
2635 goto error;
2636 Py_DECREF(x);
2637#endif
2638#ifdef AL_MONO
2639 x = PyInt_FromLong((long) AL_MONO);
2640 if (x == NULL || PyDict_SetItemString(d, "MONO", x) < 0)
2641 goto error;
2642 Py_DECREF(x);
2643#endif
2644#ifdef AL_MUTE
2645 x = PyInt_FromLong((long) AL_MUTE);
2646 if (x == NULL || PyDict_SetItemString(d, "MUTE", x) < 0)
2647 goto error;
2648 Py_DECREF(x);
2649#endif
2650#ifdef AL_NAME
2651 x = PyInt_FromLong((long) AL_NAME);
2652 if (x == NULL || PyDict_SetItemString(d, "NAME", x) < 0)
2653 goto error;
2654 Py_DECREF(x);
2655#endif
2656#ifdef AL_NEG_INFINITY
2657 x = PyInt_FromLong((long) AL_NEG_INFINITY);
2658 if (x == NULL || PyDict_SetItemString(d, "NEG_INFINITY", x) < 0)
2659 goto error;
2660 Py_DECREF(x);
2661#endif
2662#ifdef AL_NEG_INFINITY_BIT
2663 x = PyInt_FromLong((long) AL_NEG_INFINITY_BIT);
2664 if (x == NULL || PyDict_SetItemString(d, "NEG_INFINITY_BIT", x) < 0)
2665 goto error;
2666 Py_DECREF(x);
2667#endif
2668#ifdef AL_NO_CHANGE
2669 x = PyInt_FromLong((long) AL_NO_CHANGE);
2670 if (x == NULL || PyDict_SetItemString(d, "NO_CHANGE", x) < 0)
2671 goto error;
2672 Py_DECREF(x);
2673#endif
2674#ifdef AL_NO_CHANGE_BIT
2675 x = PyInt_FromLong((long) AL_NO_CHANGE_BIT);
2676 if (x == NULL || PyDict_SetItemString(d, "NO_CHANGE_BIT", x) < 0)
2677 goto error;
2678 Py_DECREF(x);
2679#endif
2680#ifdef AL_NO_ELEM
2681 x = PyInt_FromLong((long) AL_NO_ELEM);
2682 if (x == NULL || PyDict_SetItemString(d, "NO_ELEM", x) < 0)
2683 goto error;
2684 Py_DECREF(x);
2685#endif
2686#ifdef AL_NO_ERRORS
2687 x = PyInt_FromLong((long) AL_NO_ERRORS);
2688 if (x == NULL || PyDict_SetItemString(d, "NO_ERRORS", x) < 0)
2689 goto error;
2690 Py_DECREF(x);
2691#endif
2692#ifdef AL_NO_OP
2693 x = PyInt_FromLong((long) AL_NO_OP);
2694 if (x == NULL || PyDict_SetItemString(d, "NO_OP", x) < 0)
2695 goto error;
2696 Py_DECREF(x);
2697#endif
2698#ifdef AL_NO_VAL
2699 x = PyInt_FromLong((long) AL_NO_VAL);
2700 if (x == NULL || PyDict_SetItemString(d, "NO_VAL", x) < 0)
2701 goto error;
2702 Py_DECREF(x);
2703#endif
Neal Norwitzddb4f622003-03-30 21:49:18 +00002704#ifdef AL_NULL_INTERFACE
2705 x = PyInt_FromLong((long) AL_NULL_INTERFACE);
2706 if (x == NULL || PyDict_SetItemString(d, "NULL_INTERFACE", x) < 0)
2707 goto error;
2708 Py_DECREF(x);
2709#endif
Guido van Rossumd641d671997-04-03 17:06:32 +00002710#ifdef AL_NULL_RESOURCE
2711 x = PyInt_FromLong((long) AL_NULL_RESOURCE);
2712 if (x == NULL || PyDict_SetItemString(d, "NULL_RESOURCE", x) < 0)
2713 goto error;
2714 Py_DECREF(x);
2715#endif
Neal Norwitzddb4f622003-03-30 21:49:18 +00002716#ifdef AL_OPTICAL_IF_TYPE
2717 x = PyInt_FromLong((long) AL_OPTICAL_IF_TYPE);
2718 if (x == NULL || PyDict_SetItemString(d, "OPTICAL_IF_TYPE", x) < 0)
2719 goto error;
2720 Py_DECREF(x);
2721#endif
Guido van Rossumd641d671997-04-03 17:06:32 +00002722#ifdef AL_OUTPUT_COUNT
2723 x = PyInt_FromLong((long) AL_OUTPUT_COUNT);
2724 if (x == NULL || PyDict_SetItemString(d, "OUTPUT_COUNT", x) < 0)
2725 goto error;
2726 Py_DECREF(x);
2727#endif
2728#ifdef AL_OUTPUT_DEVICE_TYPE
2729 x = PyInt_FromLong((long) AL_OUTPUT_DEVICE_TYPE);
2730 if (x == NULL || PyDict_SetItemString(d, "OUTPUT_DEVICE_TYPE", x) < 0)
2731 goto error;
2732 Py_DECREF(x);
2733#endif
2734#ifdef AL_OUTPUT_HRB_TYPE
2735 x = PyInt_FromLong((long) AL_OUTPUT_HRB_TYPE);
2736 if (x == NULL || PyDict_SetItemString(d, "OUTPUT_HRB_TYPE", x) < 0)
2737 goto error;
2738 Py_DECREF(x);
2739#endif
2740#ifdef AL_OUTPUT_PORT_TYPE
2741 x = PyInt_FromLong((long) AL_OUTPUT_PORT_TYPE);
2742 if (x == NULL || PyDict_SetItemString(d, "OUTPUT_PORT_TYPE", x) < 0)
2743 goto error;
2744 Py_DECREF(x);
2745#endif
2746#ifdef AL_OUTPUT_RATE
2747 x = PyInt_FromLong((long) AL_OUTPUT_RATE);
2748 if (x == NULL || PyDict_SetItemString(d, "OUTPUT_RATE", x) < 0)
2749 goto error;
2750 Py_DECREF(x);
2751#endif
2752#ifdef AL_PARAM_BIT
2753 x = PyInt_FromLong((long) AL_PARAM_BIT);
2754 if (x == NULL || PyDict_SetItemString(d, "PARAM_BIT", x) < 0)
2755 goto error;
2756 Py_DECREF(x);
2757#endif
2758#ifdef AL_PARAMS
2759 x = PyInt_FromLong((long) AL_PARAMS);
2760 if (x == NULL || PyDict_SetItemString(d, "PARAMS", x) < 0)
2761 goto error;
2762 Py_DECREF(x);
2763#endif
2764#ifdef AL_PORT_COUNT
2765 x = PyInt_FromLong((long) AL_PORT_COUNT);
2766 if (x == NULL || PyDict_SetItemString(d, "PORT_COUNT", x) < 0)
2767 goto error;
2768 Py_DECREF(x);
2769#endif
2770#ifdef AL_PORT_TYPE
2771 x = PyInt_FromLong((long) AL_PORT_TYPE);
2772 if (x == NULL || PyDict_SetItemString(d, "PORT_TYPE", x) < 0)
2773 goto error;
2774 Py_DECREF(x);
2775#endif
2776#ifdef AL_PORTS
2777 x = PyInt_FromLong((long) AL_PORTS);
2778 if (x == NULL || PyDict_SetItemString(d, "PORTS", x) < 0)
2779 goto error;
2780 Py_DECREF(x);
2781#endif
2782#ifdef AL_PORTSTYLE_DIRECT
2783 x = PyInt_FromLong((long) AL_PORTSTYLE_DIRECT);
2784 if (x == NULL || PyDict_SetItemString(d, "PORTSTYLE_DIRECT", x) < 0)
2785 goto error;
2786 Py_DECREF(x);
2787#endif
2788#ifdef AL_PORTSTYLE_SERIAL
2789 x = PyInt_FromLong((long) AL_PORTSTYLE_SERIAL);
2790 if (x == NULL || PyDict_SetItemString(d, "PORTSTYLE_SERIAL", x) < 0)
2791 goto error;
2792 Py_DECREF(x);
2793#endif
2794#ifdef AL_PRINT_ERRORS
2795 x = PyInt_FromLong((long) AL_PRINT_ERRORS);
2796 if (x == NULL || PyDict_SetItemString(d, "PRINT_ERRORS", x) < 0)
2797 goto error;
2798 Py_DECREF(x);
2799#endif
2800#ifdef AL_PTR_ELEM
2801 x = PyInt_FromLong((long) AL_PTR_ELEM);
2802 if (x == NULL || PyDict_SetItemString(d, "PTR_ELEM", x) < 0)
2803 goto error;
2804 Py_DECREF(x);
2805#endif
2806#ifdef AL_RANGE_VALUE
2807 x = PyInt_FromLong((long) AL_RANGE_VALUE);
2808 if (x == NULL || PyDict_SetItemString(d, "RANGE_VALUE", x) < 0)
2809 goto error;
2810 Py_DECREF(x);
2811#endif
2812#ifdef AL_RATE
2813 x = PyInt_FromLong((long) AL_RATE);
2814 if (x == NULL || PyDict_SetItemString(d, "RATE", x) < 0)
2815 goto error;
2816 Py_DECREF(x);
2817#endif
2818#ifdef AL_RATE_11025
2819 x = PyInt_FromLong((long) AL_RATE_11025);
2820 if (x == NULL || PyDict_SetItemString(d, "RATE_11025", x) < 0)
2821 goto error;
2822 Py_DECREF(x);
2823#endif
2824#ifdef AL_RATE_16000
2825 x = PyInt_FromLong((long) AL_RATE_16000);
2826 if (x == NULL || PyDict_SetItemString(d, "RATE_16000", x) < 0)
2827 goto error;
2828 Py_DECREF(x);
2829#endif
2830#ifdef AL_RATE_22050
2831 x = PyInt_FromLong((long) AL_RATE_22050);
2832 if (x == NULL || PyDict_SetItemString(d, "RATE_22050", x) < 0)
2833 goto error;
2834 Py_DECREF(x);
2835#endif
2836#ifdef AL_RATE_32000
2837 x = PyInt_FromLong((long) AL_RATE_32000);
2838 if (x == NULL || PyDict_SetItemString(d, "RATE_32000", x) < 0)
2839 goto error;
2840 Py_DECREF(x);
2841#endif
2842#ifdef AL_RATE_44100
2843 x = PyInt_FromLong((long) AL_RATE_44100);
2844 if (x == NULL || PyDict_SetItemString(d, "RATE_44100", x) < 0)
2845 goto error;
2846 Py_DECREF(x);
2847#endif
2848#ifdef AL_RATE_48000
2849 x = PyInt_FromLong((long) AL_RATE_48000);
2850 if (x == NULL || PyDict_SetItemString(d, "RATE_48000", x) < 0)
2851 goto error;
2852 Py_DECREF(x);
2853#endif
2854#ifdef AL_RATE_8000
2855 x = PyInt_FromLong((long) AL_RATE_8000);
2856 if (x == NULL || PyDict_SetItemString(d, "RATE_8000", x) < 0)
2857 goto error;
2858 Py_DECREF(x);
2859#endif
2860#ifdef AL_RATE_AES_1
2861 x = PyInt_FromLong((long) AL_RATE_AES_1);
2862 if (x == NULL || PyDict_SetItemString(d, "RATE_AES_1", x) < 0)
2863 goto error;
2864 Py_DECREF(x);
2865#endif
2866#ifdef AL_RATE_AES_1s
2867 x = PyInt_FromLong((long) AL_RATE_AES_1s);
2868 if (x == NULL || PyDict_SetItemString(d, "RATE_AES_1s", x) < 0)
2869 goto error;
2870 Py_DECREF(x);
2871#endif
2872#ifdef AL_RATE_AES_2
2873 x = PyInt_FromLong((long) AL_RATE_AES_2);
2874 if (x == NULL || PyDict_SetItemString(d, "RATE_AES_2", x) < 0)
2875 goto error;
2876 Py_DECREF(x);
2877#endif
2878#ifdef AL_RATE_AES_3
2879 x = PyInt_FromLong((long) AL_RATE_AES_3);
2880 if (x == NULL || PyDict_SetItemString(d, "RATE_AES_3", x) < 0)
2881 goto error;
2882 Py_DECREF(x);
2883#endif
2884#ifdef AL_RATE_AES_4
2885 x = PyInt_FromLong((long) AL_RATE_AES_4);
2886 if (x == NULL || PyDict_SetItemString(d, "RATE_AES_4", x) < 0)
2887 goto error;
2888 Py_DECREF(x);
2889#endif
2890#ifdef AL_RATE_AES_6
2891 x = PyInt_FromLong((long) AL_RATE_AES_6);
2892 if (x == NULL || PyDict_SetItemString(d, "RATE_AES_6", x) < 0)
2893 goto error;
2894 Py_DECREF(x);
2895#endif
2896#ifdef AL_RATE_FRACTION_D
2897 x = PyInt_FromLong((long) AL_RATE_FRACTION_D);
2898 if (x == NULL || PyDict_SetItemString(d, "RATE_FRACTION_D", x) < 0)
2899 goto error;
2900 Py_DECREF(x);
2901#endif
2902#ifdef AL_RATE_FRACTION_N
2903 x = PyInt_FromLong((long) AL_RATE_FRACTION_N);
2904 if (x == NULL || PyDict_SetItemString(d, "RATE_FRACTION_N", x) < 0)
2905 goto error;
2906 Py_DECREF(x);
2907#endif
2908#ifdef AL_RATE_INPUTRATE
2909 x = PyInt_FromLong((long) AL_RATE_INPUTRATE);
2910 if (x == NULL || PyDict_SetItemString(d, "RATE_INPUTRATE", x) < 0)
2911 goto error;
2912 Py_DECREF(x);
2913#endif
2914#ifdef AL_RATE_NO_DIGITAL_INPUT
2915 x = PyInt_FromLong((long) AL_RATE_NO_DIGITAL_INPUT);
2916 if (x == NULL || PyDict_SetItemString(d, "RATE_NO_DIGITAL_INPUT", x) < 0)
2917 goto error;
2918 Py_DECREF(x);
2919#endif
2920#ifdef AL_RATE_UNACQUIRED
2921 x = PyInt_FromLong((long) AL_RATE_UNACQUIRED);
2922 if (x == NULL || PyDict_SetItemString(d, "RATE_UNACQUIRED", x) < 0)
2923 goto error;
2924 Py_DECREF(x);
2925#endif
2926#ifdef AL_RATE_UNDEFINED
2927 x = PyInt_FromLong((long) AL_RATE_UNDEFINED);
2928 if (x == NULL || PyDict_SetItemString(d, "RATE_UNDEFINED", x) < 0)
2929 goto error;
2930 Py_DECREF(x);
2931#endif
2932#ifdef AL_REF_0DBV
2933 x = PyInt_FromLong((long) AL_REF_0DBV);
2934 if (x == NULL || PyDict_SetItemString(d, "REF_0DBV", x) < 0)
2935 goto error;
2936 Py_DECREF(x);
2937#endif
2938#ifdef AL_REF_NONE
2939 x = PyInt_FromLong((long) AL_REF_NONE);
2940 if (x == NULL || PyDict_SetItemString(d, "REF_NONE", x) < 0)
2941 goto error;
2942 Py_DECREF(x);
2943#endif
2944#ifdef AL_RESERVED1_TYPE
2945 x = PyInt_FromLong((long) AL_RESERVED1_TYPE);
2946 if (x == NULL || PyDict_SetItemString(d, "RESERVED1_TYPE", x) < 0)
2947 goto error;
2948 Py_DECREF(x);
2949#endif
2950#ifdef AL_RESERVED2_TYPE
2951 x = PyInt_FromLong((long) AL_RESERVED2_TYPE);
2952 if (x == NULL || PyDict_SetItemString(d, "RESERVED2_TYPE", x) < 0)
2953 goto error;
2954 Py_DECREF(x);
2955#endif
2956#ifdef AL_RESERVED3_TYPE
2957 x = PyInt_FromLong((long) AL_RESERVED3_TYPE);
2958 if (x == NULL || PyDict_SetItemString(d, "RESERVED3_TYPE", x) < 0)
2959 goto error;
2960 Py_DECREF(x);
2961#endif
2962#ifdef AL_RESERVED4_TYPE
2963 x = PyInt_FromLong((long) AL_RESERVED4_TYPE);
2964 if (x == NULL || PyDict_SetItemString(d, "RESERVED4_TYPE", x) < 0)
2965 goto error;
2966 Py_DECREF(x);
2967#endif
2968#ifdef AL_RESOURCE
2969 x = PyInt_FromLong((long) AL_RESOURCE);
2970 if (x == NULL || PyDict_SetItemString(d, "RESOURCE", x) < 0)
2971 goto error;
2972 Py_DECREF(x);
2973#endif
2974#ifdef AL_RESOURCE_ELEM
2975 x = PyInt_FromLong((long) AL_RESOURCE_ELEM);
2976 if (x == NULL || PyDict_SetItemString(d, "RESOURCE_ELEM", x) < 0)
2977 goto error;
2978 Py_DECREF(x);
2979#endif
2980#ifdef AL_RESOURCE_TYPE
2981 x = PyInt_FromLong((long) AL_RESOURCE_TYPE);
2982 if (x == NULL || PyDict_SetItemString(d, "RESOURCE_TYPE", x) < 0)
2983 goto error;
2984 Py_DECREF(x);
2985#endif
2986#ifdef AL_RIGHT_INPUT_ATTEN
2987 x = PyInt_FromLong((long) AL_RIGHT_INPUT_ATTEN);
2988 if (x == NULL || PyDict_SetItemString(d, "RIGHT_INPUT_ATTEN", x) < 0)
2989 goto error;
2990 Py_DECREF(x);
2991#endif
2992#ifdef AL_RIGHT_MONITOR_ATTEN
2993 x = PyInt_FromLong((long) AL_RIGHT_MONITOR_ATTEN);
2994 if (x == NULL || PyDict_SetItemString(d, "RIGHT_MONITOR_ATTEN", x) < 0)
2995 goto error;
2996 Py_DECREF(x);
2997#endif
2998#ifdef AL_RIGHT_SPEAKER_GAIN
2999 x = PyInt_FromLong((long) AL_RIGHT_SPEAKER_GAIN);
3000 if (x == NULL || PyDict_SetItemString(d, "RIGHT_SPEAKER_GAIN", x) < 0)
3001 goto error;
3002 Py_DECREF(x);
3003#endif
3004#ifdef AL_RIGHT1_INPUT_ATTEN
3005 x = PyInt_FromLong((long) AL_RIGHT1_INPUT_ATTEN);
3006 if (x == NULL || PyDict_SetItemString(d, "RIGHT1_INPUT_ATTEN", x) < 0)
3007 goto error;
3008 Py_DECREF(x);
3009#endif
3010#ifdef AL_RIGHT2_INPUT_ATTEN
3011 x = PyInt_FromLong((long) AL_RIGHT2_INPUT_ATTEN);
3012 if (x == NULL || PyDict_SetItemString(d, "RIGHT2_INPUT_ATTEN", x) < 0)
3013 goto error;
3014 Py_DECREF(x);
3015#endif
3016#ifdef AL_SAMPFMT_DOUBLE
3017 x = PyInt_FromLong((long) AL_SAMPFMT_DOUBLE);
3018 if (x == NULL || PyDict_SetItemString(d, "SAMPFMT_DOUBLE", x) < 0)
3019 goto error;
3020 Py_DECREF(x);
3021#endif
3022#ifdef AL_SAMPFMT_FLOAT
3023 x = PyInt_FromLong((long) AL_SAMPFMT_FLOAT);
3024 if (x == NULL || PyDict_SetItemString(d, "SAMPFMT_FLOAT", x) < 0)
3025 goto error;
3026 Py_DECREF(x);
3027#endif
3028#ifdef AL_SAMPFMT_TWOSCOMP
3029 x = PyInt_FromLong((long) AL_SAMPFMT_TWOSCOMP);
3030 if (x == NULL || PyDict_SetItemString(d, "SAMPFMT_TWOSCOMP", x) < 0)
3031 goto error;
3032 Py_DECREF(x);
3033#endif
3034#ifdef AL_SAMPLE_16
3035 x = PyInt_FromLong((long) AL_SAMPLE_16);
3036 if (x == NULL || PyDict_SetItemString(d, "SAMPLE_16", x) < 0)
3037 goto error;
3038 Py_DECREF(x);
3039#endif
3040#ifdef AL_SAMPLE_24
3041 x = PyInt_FromLong((long) AL_SAMPLE_24);
3042 if (x == NULL || PyDict_SetItemString(d, "SAMPLE_24", x) < 0)
3043 goto error;
3044 Py_DECREF(x);
3045#endif
3046#ifdef AL_SAMPLE_8
3047 x = PyInt_FromLong((long) AL_SAMPLE_8);
3048 if (x == NULL || PyDict_SetItemString(d, "SAMPLE_8", x) < 0)
3049 goto error;
3050 Py_DECREF(x);
3051#endif
3052#ifdef AL_SCALAR_VAL
3053 x = PyInt_FromLong((long) AL_SCALAR_VAL);
3054 if (x == NULL || PyDict_SetItemString(d, "SCALAR_VAL", x) < 0)
3055 goto error;
3056 Py_DECREF(x);
3057#endif
3058#ifdef AL_SET_VAL
3059 x = PyInt_FromLong((long) AL_SET_VAL);
3060 if (x == NULL || PyDict_SetItemString(d, "SET_VAL", x) < 0)
3061 goto error;
3062 Py_DECREF(x);
3063#endif
3064#ifdef AL_SHORT_NAME
3065 x = PyInt_FromLong((long) AL_SHORT_NAME);
3066 if (x == NULL || PyDict_SetItemString(d, "SHORT_NAME", x) < 0)
3067 goto error;
3068 Py_DECREF(x);
3069#endif
Neal Norwitzddb4f622003-03-30 21:49:18 +00003070#ifdef AL_SMPTE272M_IF_TYPE
3071 x = PyInt_FromLong((long) AL_SMPTE272M_IF_TYPE);
3072 if (x == NULL || PyDict_SetItemString(d, "SMPTE272M_IF_TYPE", x) < 0)
3073 goto error;
3074 Py_DECREF(x);
3075#endif
Guido van Rossumd641d671997-04-03 17:06:32 +00003076#ifdef AL_SOURCE
3077 x = PyInt_FromLong((long) AL_SOURCE);
3078 if (x == NULL || PyDict_SetItemString(d, "SOURCE", x) < 0)
3079 goto error;
3080 Py_DECREF(x);
3081#endif
3082#ifdef AL_SPEAKER_IF_TYPE
3083 x = PyInt_FromLong((long) AL_SPEAKER_IF_TYPE);
3084 if (x == NULL || PyDict_SetItemString(d, "SPEAKER_IF_TYPE", x) < 0)
3085 goto error;
3086 Py_DECREF(x);
3087#endif
3088#ifdef AL_SPEAKER_MUTE_CTL
3089 x = PyInt_FromLong((long) AL_SPEAKER_MUTE_CTL);
3090 if (x == NULL || PyDict_SetItemString(d, "SPEAKER_MUTE_CTL", x) < 0)
3091 goto error;
3092 Py_DECREF(x);
3093#endif
3094#ifdef AL_SPEAKER_MUTE_OFF
3095 x = PyInt_FromLong((long) AL_SPEAKER_MUTE_OFF);
3096 if (x == NULL || PyDict_SetItemString(d, "SPEAKER_MUTE_OFF", x) < 0)
3097 goto error;
3098 Py_DECREF(x);
3099#endif
3100#ifdef AL_SPEAKER_MUTE_ON
3101 x = PyInt_FromLong((long) AL_SPEAKER_MUTE_ON);
3102 if (x == NULL || PyDict_SetItemString(d, "SPEAKER_MUTE_ON", x) < 0)
3103 goto error;
3104 Py_DECREF(x);
3105#endif
3106#ifdef AL_SPEAKER_PLUS_LINE_IF_TYPE
3107 x = PyInt_FromLong((long) AL_SPEAKER_PLUS_LINE_IF_TYPE);
3108 if (x == NULL || PyDict_SetItemString(d, "SPEAKER_PLUS_LINE_IF_TYPE", x) < 0)
3109 goto error;
3110 Py_DECREF(x);
3111#endif
3112#ifdef AL_STEREO
3113 x = PyInt_FromLong((long) AL_STEREO);
3114 if (x == NULL || PyDict_SetItemString(d, "STEREO", x) < 0)
3115 goto error;
3116 Py_DECREF(x);
3117#endif
3118#ifdef AL_STRING_VAL
3119 x = PyInt_FromLong((long) AL_STRING_VAL);
3120 if (x == NULL || PyDict_SetItemString(d, "STRING_VAL", x) < 0)
3121 goto error;
3122 Py_DECREF(x);
3123#endif
3124#ifdef AL_SUBSYSTEM
3125 x = PyInt_FromLong((long) AL_SUBSYSTEM);
3126 if (x == NULL || PyDict_SetItemString(d, "SUBSYSTEM", x) < 0)
3127 goto error;
3128 Py_DECREF(x);
3129#endif
3130#ifdef AL_SUBSYSTEM_TYPE
3131 x = PyInt_FromLong((long) AL_SUBSYSTEM_TYPE);
3132 if (x == NULL || PyDict_SetItemString(d, "SUBSYSTEM_TYPE", x) < 0)
3133 goto error;
3134 Py_DECREF(x);
3135#endif
3136#ifdef AL_SYNC_INPUT_TO_AES
3137 x = PyInt_FromLong((long) AL_SYNC_INPUT_TO_AES);
3138 if (x == NULL || PyDict_SetItemString(d, "SYNC_INPUT_TO_AES", x) < 0)
3139 goto error;
3140 Py_DECREF(x);
3141#endif
3142#ifdef AL_SYNC_OUTPUT_TO_AES
3143 x = PyInt_FromLong((long) AL_SYNC_OUTPUT_TO_AES);
3144 if (x == NULL || PyDict_SetItemString(d, "SYNC_OUTPUT_TO_AES", x) < 0)
3145 goto error;
3146 Py_DECREF(x);
3147#endif
3148#ifdef AL_SYSTEM
3149 x = PyInt_FromLong((long) AL_SYSTEM);
3150 if (x == NULL || PyDict_SetItemString(d, "SYSTEM", x) < 0)
3151 goto error;
3152 Py_DECREF(x);
3153#endif
3154#ifdef AL_SYSTEM_TYPE
3155 x = PyInt_FromLong((long) AL_SYSTEM_TYPE);
3156 if (x == NULL || PyDict_SetItemString(d, "SYSTEM_TYPE", x) < 0)
3157 goto error;
3158 Py_DECREF(x);
3159#endif
3160#ifdef AL_TEST_IF_TYPE
3161 x = PyInt_FromLong((long) AL_TEST_IF_TYPE);
3162 if (x == NULL || PyDict_SetItemString(d, "TEST_IF_TYPE", x) < 0)
3163 goto error;
3164 Py_DECREF(x);
3165#endif
3166#ifdef AL_TYPE
3167 x = PyInt_FromLong((long) AL_TYPE);
3168 if (x == NULL || PyDict_SetItemString(d, "TYPE", x) < 0)
3169 goto error;
3170 Py_DECREF(x);
3171#endif
3172#ifdef AL_TYPE_BIT
3173 x = PyInt_FromLong((long) AL_TYPE_BIT);
3174 if (x == NULL || PyDict_SetItemString(d, "TYPE_BIT", x) < 0)
3175 goto error;
3176 Py_DECREF(x);
3177#endif
3178#ifdef AL_UNUSED_COUNT
3179 x = PyInt_FromLong((long) AL_UNUSED_COUNT);
3180 if (x == NULL || PyDict_SetItemString(d, "UNUSED_COUNT", x) < 0)
3181 goto error;
3182 Py_DECREF(x);
3183#endif
3184#ifdef AL_UNUSED_PORTS
3185 x = PyInt_FromLong((long) AL_UNUSED_PORTS);
3186 if (x == NULL || PyDict_SetItemString(d, "UNUSED_PORTS", x) < 0)
3187 goto error;
3188 Py_DECREF(x);
3189#endif
3190#ifdef AL_VARIABLE_MCLK_TYPE
3191 x = PyInt_FromLong((long) AL_VARIABLE_MCLK_TYPE);
3192 if (x == NULL || PyDict_SetItemString(d, "VARIABLE_MCLK_TYPE", x) < 0)
3193 goto error;
3194 Py_DECREF(x);
3195#endif
3196#ifdef AL_VECTOR_VAL
3197 x = PyInt_FromLong((long) AL_VECTOR_VAL);
3198 if (x == NULL || PyDict_SetItemString(d, "VECTOR_VAL", x) < 0)
3199 goto error;
3200 Py_DECREF(x);
3201#endif
3202#ifdef AL_VIDEO_MCLK_TYPE
3203 x = PyInt_FromLong((long) AL_VIDEO_MCLK_TYPE);
3204 if (x == NULL || PyDict_SetItemString(d, "VIDEO_MCLK_TYPE", x) < 0)
3205 goto error;
3206 Py_DECREF(x);
3207#endif
3208#ifdef AL_WORDSIZE
3209 x = PyInt_FromLong((long) AL_WORDSIZE);
3210 if (x == NULL || PyDict_SetItemString(d, "WORDSIZE", x) < 0)
3211 goto error;
3212 Py_DECREF(x);
3213#endif
3214
3215#ifdef AL_NO_ELEM /* IRIX 6 */
3216 (void) alSetErrorHandler(ErrorHandler);
3217#endif /* AL_NO_ELEM */
3218#ifdef OLD_INTERFACE
3219 (void) ALseterrorhandler(ErrorHandler);
3220#endif /* OLD_INTERFACE */
Guido van Rossume3db8621991-09-09 23:33:34 +00003221
Barry Warsaw9bfd2bf2000-09-01 09:01:32 +00003222 error:
3223 return;
Guido van Rossume3db8621991-09-09 23:33:34 +00003224}