blob: 052939ec5ff64d85fe2195695888d28296b353dc [file] [log] [blame]
Guido van Rossume3db8621991-09-09 23:33:34 +00001/**********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossume3db8621991-09-09 23:33:34 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum57737981992-05-15 11:06:29 +000025/* AL module -- interface to Mark Callow's Audio Library (AL). */
Guido van Rossume3db8621991-09-09 23:33:34 +000026
Guido van Rossumb6775db1994-08-01 11:34:53 +000027#include <audio.h>
Guido van Rossume3db8621991-09-09 23:33:34 +000028
Jack Jansene8a3c281993-02-10 14:10:56 +000029/* Check which version audio library we have: */
30#ifdef AL_ERROR_NUMBER
31#define AL_405
32/* XXXX 4.0.5 libaudio also allows us to provide better error
33** handling (with ALseterrorhandler). We should implement that
34** sometime.
35*/
36
37#endif
38
Guido van Rossume3db8621991-09-09 23:33:34 +000039#include "allobjects.h"
40#include "import.h"
41#include "modsupport.h"
42#include "structmember.h"
Jack Jansen743db361992-08-13 14:13:11 +000043#include "ceval.h"
Guido van Rossume3db8621991-09-09 23:33:34 +000044
45
46/* Config objects */
47
48typedef struct {
49 OB_HEAD
50 ALconfig ob_config;
51} configobject;
52
Guido van Rossumb6775db1994-08-01 11:34:53 +000053staticforward typeobject Configtype;
Guido van Rossume3db8621991-09-09 23:33:34 +000054
55#define is_configobject(v) ((v)->ob_type == &Configtype)
56
Guido van Rossumfc58e581992-01-27 16:45:55 +000057/* Forward */
58static int getconfigarg PROTO((object *, ALconfig *));
59static int getstrstrconfigarg PROTO((object *, char **, char **, ALconfig *));
60
Guido van Rossume3db8621991-09-09 23:33:34 +000061static object *
62setConfig (self, args, func)
63 configobject *self;
64 object *args;
65 void (*func)(ALconfig, long);
66{
67 long par;
68
Guido van Rossumfc58e581992-01-27 16:45:55 +000069 if (!getlongarg (args, &par)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +000070
71 (*func) (self-> ob_config, par);
72
73 INCREF (None);
74 return None;
75}
76
77static object *
78getConfig (self, args, func)
79 configobject *self;
80 object *args;
81 long (*func)(ALconfig);
82{
83 long par;
84
Guido van Rossumfc58e581992-01-27 16:45:55 +000085 if (!getnoarg (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +000086
87 par = (*func) (self-> ob_config);
88
89 return newintobject (par);
90}
91
92static object *
93al_setqueuesize (self, args)
94 configobject *self;
95 object *args;
96{
97 return (setConfig (self, args, ALsetqueuesize));
98}
99
100static object *
101al_getqueuesize (self, args)
102 configobject *self;
103 object *args;
104{
105 return (getConfig (self, args, ALgetqueuesize));
106}
107
108static object *
109al_setwidth (self, args)
110 configobject *self;
111 object *args;
112{
113 return (setConfig (self, args, ALsetwidth));
114}
115
116static object *
117al_getwidth (self, args)
118 configobject *self;
119 object *args;
120{
121 return (getConfig (self, args, ALgetwidth));
122}
123
124static object *
125al_getchannels (self, args)
126 configobject *self;
127 object *args;
128{
129 return (getConfig (self, args, ALgetchannels));
130}
131
132static object *
133al_setchannels (self, args)
134 configobject *self;
135 object *args;
136{
137 return (setConfig (self, args, ALsetchannels));
138}
139
Jack Jansene8a3c281993-02-10 14:10:56 +0000140#ifdef AL_405
141
142static object *
143al_getsampfmt (self, args)
144 configobject *self;
145 object *args;
146{
147 return (getConfig (self, args, ALgetsampfmt));
148}
149
150static object *
151al_setsampfmt (self, args)
152 configobject *self;
153 object *args;
154{
155 return (setConfig (self, args, ALsetsampfmt));
156}
157
158static object *
159al_getfloatmax(self, args)
160 configobject *self;
161 object *args;
162{
163 double arg;
164
165 if ( !getnoarg(args) )
166 return 0;
167 arg = ALgetfloatmax(self->ob_config);
168 return newfloatobject(arg);
169}
170
171static object *
172al_setfloatmax(self, args)
173 configobject *self;
174 object *args;
175{
176 double arg;
177
178 if ( !getargs(args, "d", &arg) )
179 return 0;
180 ALsetfloatmax(self->ob_config, arg);
181 INCREF(None);
182 return None;
183}
184#endif /* AL_405 */
185
Guido van Rossume3db8621991-09-09 23:33:34 +0000186static struct methodlist config_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000187 {"getqueuesize", (method)al_getqueuesize},
188 {"setqueuesize", (method)al_setqueuesize},
189 {"getwidth", (method)al_getwidth},
190 {"setwidth", (method)al_setwidth},
191 {"getchannels", (method)al_getchannels},
192 {"setchannels", (method)al_setchannels},
Jack Jansene8a3c281993-02-10 14:10:56 +0000193#ifdef AL_405
Guido van Rossumb6775db1994-08-01 11:34:53 +0000194 {"getsampfmt", (method)al_getsampfmt},
195 {"setsampfmt", (method)al_setsampfmt},
196 {"getfloatmax", (method)al_getfloatmax},
197 {"setfloatmax", (method)al_setfloatmax},
Jack Jansene8a3c281993-02-10 14:10:56 +0000198#endif /* AL_405 */
Guido van Rossume3db8621991-09-09 23:33:34 +0000199 {NULL, NULL} /* sentinel */
200};
201
202static void
203config_dealloc(self)
204 configobject *self;
205{
206 ALfreeconfig(self->ob_config);
207 DEL(self);
208}
209
210static object *
211config_getattr(self, name)
212 configobject *self;
213 char *name;
214{
215 return findmethod(config_methods, (object *)self, name);
216}
217
Guido van Rossumb6775db1994-08-01 11:34:53 +0000218static typeobject Configtype = {
Guido van Rossume3db8621991-09-09 23:33:34 +0000219 OB_HEAD_INIT(&Typetype)
220 0, /*ob_size*/
221 "config", /*tp_name*/
222 sizeof(configobject), /*tp_size*/
223 0, /*tp_itemsize*/
224 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000225 (destructor)config_dealloc, /*tp_dealloc*/
Guido van Rossume3db8621991-09-09 23:33:34 +0000226 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000227 (getattrfunc)config_getattr, /*tp_getattr*/
Guido van Rossume3db8621991-09-09 23:33:34 +0000228 0, /*tp_setattr*/
229 0, /*tp_compare*/
230 0, /*tp_repr*/
231};
232
233static object *
234newconfigobject(config)
235 ALconfig config;
236{
237 configobject *p;
238
239 p = NEWOBJ(configobject, &Configtype);
240 if (p == NULL)
241 return NULL;
242 p->ob_config = config;
243 return (object *)p;
244}
245
246/* Port objects */
247
248typedef struct {
249 OB_HEAD
250 ALport ob_port;
251} portobject;
252
Guido van Rossumb6775db1994-08-01 11:34:53 +0000253staticforward typeobject Porttype;
Guido van Rossume3db8621991-09-09 23:33:34 +0000254
255#define is_portobject(v) ((v)->ob_type == &Porttype)
256
257static object *
258al_closeport (self, args)
259 portobject *self;
260 object *args;
261{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000262 if (!getnoarg (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000263
264 if (self->ob_port != NULL) {
265 ALcloseport (self-> ob_port);
266 self->ob_port = NULL;
267 /* XXX Using a closed port may dump core! */
268 }
269
270 INCREF (None);
271 return None;
272}
273
274static object *
275al_getfd (self, args)
276 portobject *self;
277 object *args;
278{
279 int fd;
280
Guido van Rossumfc58e581992-01-27 16:45:55 +0000281 if (!getnoarg (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000282
283 fd = ALgetfd (self-> ob_port);
284
285 return newintobject (fd);
286}
287
288static object *
289al_getfilled (self, args)
290 portobject *self;
291 object *args;
292{
293 long count;
294
Guido van Rossumfc58e581992-01-27 16:45:55 +0000295 if (!getnoarg (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000296
297 count = ALgetfilled (self-> ob_port);
298
299 return newintobject (count);
300}
301
302static object *
303al_getfillable (self, args)
304 portobject *self;
305 object *args;
306{
307 long count;
308
Guido van Rossumfc58e581992-01-27 16:45:55 +0000309 if (!getnoarg (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000310
311 count = ALgetfillable (self-> ob_port);
312
313 return newintobject (count);
314}
315
316static object *
317al_readsamps (self, args)
318 portobject *self;
319 object *args;
320{
321 long count;
322 object *v;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000323 ALconfig c;
Guido van Rossume3db8621991-09-09 23:33:34 +0000324 int width;
325
326 if (!getlongarg (args, &count)) return NULL;
327
328 if (count <= 0)
329 {
330 err_setstr (RuntimeError, "al.readsamps : arg <= 0");
331 return NULL;
332 }
333
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000334 c = ALgetconfig(self->ob_port);
Jack Jansene8a3c281993-02-10 14:10:56 +0000335#ifdef AL_405
336 width = ALgetsampfmt(c);
337 if ( width == AL_SAMPFMT_FLOAT )
338 width = sizeof(float);
339 else if ( width == AL_SAMPFMT_DOUBLE )
340 width = sizeof(double);
341 else
342 width = ALgetwidth(c);
343#else
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000344 width = ALgetwidth(c);
Jack Jansene8a3c281993-02-10 14:10:56 +0000345#endif /* AL_405 */
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000346 ALfreeconfig(c);
Guido van Rossume3db8621991-09-09 23:33:34 +0000347 v = newsizedstringobject ((char *)NULL, width * count);
348 if (v == NULL) return NULL;
349
Jack Jansen743db361992-08-13 14:13:11 +0000350 BGN_SAVE
Guido van Rossume3db8621991-09-09 23:33:34 +0000351 ALreadsamps (self-> ob_port, (void *) getstringvalue(v), count);
Jack Jansen743db361992-08-13 14:13:11 +0000352 END_SAVE
Guido van Rossume3db8621991-09-09 23:33:34 +0000353
354 return (v);
355}
356
357static object *
358al_writesamps (self, args)
359 portobject *self;
360 object *args;
361{
362 long count;
Guido van Rossumfc58e581992-01-27 16:45:55 +0000363 char *buf;
364 int size, width;
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000365 ALconfig c;
Guido van Rossume3db8621991-09-09 23:33:34 +0000366
Guido van Rossumfc58e581992-01-27 16:45:55 +0000367 if (!getargs (args, "s#", &buf, &size)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000368
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000369 c = ALgetconfig(self->ob_port);
Jack Jansene8a3c281993-02-10 14:10:56 +0000370#ifdef AL_405
371 width = ALgetsampfmt(c);
372 if ( width == AL_SAMPFMT_FLOAT )
373 width = sizeof(float);
374 else if ( width == AL_SAMPFMT_DOUBLE )
375 width = sizeof(double);
376 else
377 width = ALgetwidth(c);
378#else
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000379 width = ALgetwidth(c);
Jack Jansene8a3c281993-02-10 14:10:56 +0000380#endif /* AL_405 */
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000381 ALfreeconfig(c);
Jack Jansen743db361992-08-13 14:13:11 +0000382 BGN_SAVE
Guido van Rossumfc58e581992-01-27 16:45:55 +0000383 ALwritesamps (self-> ob_port, (void *) buf, (long) size / width);
Jack Jansen743db361992-08-13 14:13:11 +0000384 END_SAVE
Guido van Rossume3db8621991-09-09 23:33:34 +0000385
386 INCREF (None);
387 return None;
388}
389
390static object *
391al_getfillpoint (self, args)
392 portobject *self;
393 object *args;
394{
395 long count;
396
Guido van Rossumfc58e581992-01-27 16:45:55 +0000397 if (!getnoarg (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000398
399 count = ALgetfillpoint (self-> ob_port);
400
401 return newintobject (count);
402}
403
404static object *
405al_setfillpoint (self, args)
406 portobject *self;
407 object *args;
408{
409 long count;
410
Guido van Rossumfc58e581992-01-27 16:45:55 +0000411 if (!getlongarg (args, &count)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000412
413 ALsetfillpoint (self-> ob_port, count);
414
415 INCREF (None);
416 return (None);
417}
418
419static object *
420al_setconfig (self, args)
421 portobject *self;
422 object *args;
423{
424 ALconfig config;
425
Guido van Rossumfc58e581992-01-27 16:45:55 +0000426 if (!getconfigarg (args, &config)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000427
428 ALsetconfig (self-> ob_port, config);
429
430 INCREF (None);
431 return (None);
432}
433
434static object *
435al_getconfig (self, args)
436 portobject *self;
437 object *args;
438{
439 ALconfig config;
440
Guido van Rossumfc58e581992-01-27 16:45:55 +0000441 if (!getnoarg (args)) return NULL;
Guido van Rossume3db8621991-09-09 23:33:34 +0000442
443 config = ALgetconfig (self-> ob_port);
444
445 return newconfigobject (config);
446}
447
Jack Jansene8a3c281993-02-10 14:10:56 +0000448#ifdef AL_405
449static object *
450al_getstatus (self, args)
451 portobject *self;
452 object *args;
453{
454 object *list, *v;
455 long *PVbuffer;
456 long length;
457 int i;
458
459 if (!getargs(args, "O", &list))
460 return NULL;
461 if (!is_listobject(list)) {
462 err_badarg();
463 return NULL;
464 }
465 length = getlistsize(list);
466 PVbuffer = NEW(long, length);
467 if (PVbuffer == NULL)
468 return err_nomem();
469 for (i = 0; i < length; i++) {
470 v = getlistitem(list, i);
471 if (!is_intobject(v)) {
472 DEL(PVbuffer);
473 err_badarg();
474 return NULL;
475 }
476 PVbuffer[i] = getintvalue(v);
477 }
478
479 ALgetstatus(self->ob_port, PVbuffer, length);
480
481 for (i = 0; i < length; i++)
482 setlistitem(list, i, newintobject(PVbuffer[i]));
483
484 DEL(PVbuffer);
485
486 INCREF(None);
487 return None;
488}
489#endif /* AL_405 */
490
Guido van Rossume3db8621991-09-09 23:33:34 +0000491static struct methodlist port_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000492 {"closeport", (method)al_closeport},
493 {"getfd", (method)al_getfd},
494 {"fileno", (method)al_getfd},
495 {"getfilled", (method)al_getfilled},
496 {"getfillable", (method)al_getfillable},
497 {"readsamps", (method)al_readsamps},
498 {"writesamps", (method)al_writesamps},
499 {"setfillpoint", (method)al_setfillpoint},
500 {"getfillpoint", (method)al_getfillpoint},
501 {"setconfig", (method)al_setconfig},
502 {"getconfig", (method)al_getconfig},
Jack Jansene8a3c281993-02-10 14:10:56 +0000503#ifdef AL_405
Guido van Rossumb6775db1994-08-01 11:34:53 +0000504 {"getstatus", (method)al_getstatus},
Jack Jansene8a3c281993-02-10 14:10:56 +0000505#endif /* AL_405 */
Guido van Rossume3db8621991-09-09 23:33:34 +0000506 {NULL, NULL} /* sentinel */
507};
508
509static void
510port_dealloc(p)
511 portobject *p;
512{
513 if (p->ob_port != NULL)
514 ALcloseport(p->ob_port);
515 DEL(p);
516}
517
518static object *
519port_getattr(p, name)
520 portobject *p;
521 char *name;
522{
523 return findmethod(port_methods, (object *)p, name);
524}
525
Guido van Rossumb6775db1994-08-01 11:34:53 +0000526static typeobject Porttype = {
Guido van Rossume3db8621991-09-09 23:33:34 +0000527 OB_HEAD_INIT(&Typetype)
528 0, /*ob_size*/
529 "port", /*tp_name*/
530 sizeof(portobject), /*tp_size*/
531 0, /*tp_itemsize*/
532 /* methods */
Guido van Rossumb6775db1994-08-01 11:34:53 +0000533 (destructor)port_dealloc, /*tp_dealloc*/
Guido van Rossume3db8621991-09-09 23:33:34 +0000534 0, /*tp_print*/
Guido van Rossumb6775db1994-08-01 11:34:53 +0000535 (getattrfunc)port_getattr, /*tp_getattr*/
Guido van Rossume3db8621991-09-09 23:33:34 +0000536 0, /*tp_setattr*/
537 0, /*tp_compare*/
538 0, /*tp_repr*/
539};
540
541static object *
542newportobject(port)
543 ALport port;
544{
545 portobject *p;
546
547 p = NEWOBJ(portobject, &Porttype);
548 if (p == NULL)
549 return NULL;
550 p->ob_port = port;
551 return (object *)p;
552}
553
554/* the module al */
555
556static object *
557al_openport (self, args)
558 object *self, *args;
559{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000560 char *name, *dir;
Guido van Rossume3db8621991-09-09 23:33:34 +0000561 ALport port;
562 ALconfig config = NULL;
Guido van Rossumc0aab891991-10-20 20:10:46 +0000563 int size;
Guido van Rossume3db8621991-09-09 23:33:34 +0000564
Guido van Rossumc0aab891991-10-20 20:10:46 +0000565 if (args == NULL || !is_tupleobject(args)) {
Guido van Rossumfc58e581992-01-27 16:45:55 +0000566 err_badarg ();
Guido van Rossumc0aab891991-10-20 20:10:46 +0000567 return NULL;
568 }
569 size = gettuplesize(args);
Guido van Rossume3db8621991-09-09 23:33:34 +0000570 if (size == 2) {
Guido van Rossum234f9421993-06-17 12:35:49 +0000571 if (!getargs (args, "(ss)", &name, &dir))
Guido van Rossume3db8621991-09-09 23:33:34 +0000572 return NULL;
573 }
574 else if (size == 3) {
575 if (!getstrstrconfigarg (args, &name, &dir, &config))
576 return NULL;
577 }
578 else {
Guido van Rossumfc58e581992-01-27 16:45:55 +0000579 err_badarg ();
Guido van Rossume3db8621991-09-09 23:33:34 +0000580 return NULL;
581 }
582
Guido van Rossumfc58e581992-01-27 16:45:55 +0000583 port = ALopenport(name, dir, config);
Guido van Rossume3db8621991-09-09 23:33:34 +0000584
Guido van Rossumc0aab891991-10-20 20:10:46 +0000585 if (port == NULL) {
586 err_errno(RuntimeError);
587 return NULL;
588 }
589
Guido van Rossume3db8621991-09-09 23:33:34 +0000590 return newportobject (port);
591}
592
593static object *
594al_newconfig (self, args)
595 object *self, *args;
596{
597 ALconfig config;
598
599 if (!getnoarg (args)) return NULL;
600
601 config = ALnewconfig ();
Guido van Rossumc0aab891991-10-20 20:10:46 +0000602 if (config == NULL) {
603 err_errno(RuntimeError);
604 return NULL;
605 }
Guido van Rossume3db8621991-09-09 23:33:34 +0000606
607 return newconfigobject (config);
608}
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000609
610static object *
611al_queryparams(self, args)
612 object *self, *args;
613{
614 long device;
615 long length;
616 long *PVbuffer;
617 long PVdummy[2];
618 object *v;
619 object *w;
620
Guido van Rossumfc58e581992-01-27 16:45:55 +0000621 if (!getlongarg (args, &device))
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000622 return NULL;
623 length = ALqueryparams(device, PVdummy, 2L);
624 PVbuffer = NEW(long, length);
625 if (PVbuffer == NULL)
626 return err_nomem();
627 (void) ALqueryparams(device, PVbuffer, length);
628 v = newlistobject((int)length);
629 if (v != NULL) {
630 int i;
631 for (i = 0; i < length; i++)
632 setlistitem(v, i, newintobject(PVbuffer[i]));
633 }
634 DEL(PVbuffer);
635 return v;
636}
637
638static object *
639doParams(args, func, modified)
640 object *args;
641 void (*func)(long, long *, long);
642 int modified;
643{
644 long device;
645 object *list, *v;
646 long *PVbuffer;
647 long length;
648 int i;
Guido van Rossume3db8621991-09-09 23:33:34 +0000649
Guido van Rossumfc58e581992-01-27 16:45:55 +0000650 if (!getargs(args, "(lO)", &device, &list))
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000651 return NULL;
652 if (!is_listobject(list)) {
653 err_badarg();
654 return NULL;
655 }
656 length = getlistsize(list);
657 PVbuffer = NEW(long, length);
658 if (PVbuffer == NULL)
659 return err_nomem();
660 for (i = 0; i < length; i++) {
661 v = getlistitem(list, i);
662 if (!is_intobject(v)) {
663 DEL(PVbuffer);
664 err_badarg();
665 return NULL;
666 }
667 PVbuffer[i] = getintvalue(v);
668 }
669
Guido van Rossum8db03071991-09-13 15:31:47 +0000670 (*func)(device, PVbuffer, length);
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000671
672 if (modified) {
673 for (i = 0; i < length; i++)
674 setlistitem(list, i, newintobject(PVbuffer[i]));
675 }
676
Guido van Rossumc0aab891991-10-20 20:10:46 +0000677 DEL(PVbuffer);
678
Guido van Rossumb3a5b9b1991-09-10 14:54:05 +0000679 INCREF(None);
680 return None;
681}
682
683static object *
684al_getparams(self, args)
685 object *self, *args;
686{
687 return doParams(args, ALgetparams, 1);
688}
689
690static object *
691al_setparams(self, args)
692 object *self, *args;
693{
694 return doParams(args, ALsetparams, 0);
695}
696
Guido van Rossum448f4bf1992-08-19 16:41:15 +0000697static object *
698al_getname(self, args)
699 object *self, *args;
700{
701 long device, descriptor;
702 char *name;
703 if (!getargs(args, "(ll)", &device, &descriptor))
704 return NULL;
705 name = ALgetname(device, descriptor);
706 if (name == NULL) {
707 err_setstr(ValueError, "al.getname: bad descriptor");
708 return NULL;
709 }
710 return newstringobject(name);
711}
712
713static object *
714al_getdefault(self, args)
715 object *self, *args;
716{
717 long device, descriptor, value;
718 if (!getargs(args, "(ll)", &device, &descriptor))
719 return NULL;
720 value = ALgetdefault(device, descriptor);
721 return newlongobject(value);
722}
723
724static object *
725al_getminmax(self, args)
726 object *self, *args;
727{
728 long device, descriptor, min, max;
729 if (!getargs(args, "(ll)", &device, &descriptor))
730 return NULL;
731 min = -1;
732 max = -1;
733 ALgetminmax(device, descriptor, &min, &max);
734 return mkvalue("ll", min, max);
735}
736
Guido van Rossume3db8621991-09-09 23:33:34 +0000737static struct methodlist al_methods[] = {
Guido van Rossumb6775db1994-08-01 11:34:53 +0000738 {"openport", (method)al_openport},
739 {"newconfig", (method)al_newconfig},
740 {"queryparams", (method)al_queryparams},
741 {"getparams", (method)al_getparams},
742 {"setparams", (method)al_setparams},
743 {"getname", (method)al_getname},
744 {"getdefault", (method)al_getdefault},
745 {"getminmax", (method)al_getminmax},
Guido van Rossume3db8621991-09-09 23:33:34 +0000746 {NULL, NULL} /* sentinel */
747};
748
749void
750inital()
751{
752 initmodule("al", al_methods);
753}
754
Guido van Rossumfc58e581992-01-27 16:45:55 +0000755static int
756getconfigarg(o, conf)
757 object *o;
Guido van Rossume3db8621991-09-09 23:33:34 +0000758 ALconfig *conf;
759{
760 if (o == NULL || !is_configobject(o))
761 return err_badarg ();
762
Guido van Rossumfc58e581992-01-27 16:45:55 +0000763 *conf = ((configobject *) o) -> ob_config;
Guido van Rossume3db8621991-09-09 23:33:34 +0000764
765 return 1;
766}
767
Guido van Rossumfc58e581992-01-27 16:45:55 +0000768static int
Guido van Rossume3db8621991-09-09 23:33:34 +0000769getstrstrconfigarg(v, a, b, c)
770 object *v;
Guido van Rossumfc58e581992-01-27 16:45:55 +0000771 char **a;
772 char **b;
Guido van Rossume3db8621991-09-09 23:33:34 +0000773 ALconfig *c;
774{
Guido van Rossumfc58e581992-01-27 16:45:55 +0000775 object *o;
776 return getargs(v, "(ssO)", a, b, &o) && getconfigarg(o, c);
Guido van Rossume3db8621991-09-09 23:33:34 +0000777}