1 /**********************************************************
2 Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3 Amsterdam, The Netherlands.
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI not be used in advertising or publicity pertaining to
13 distribution of the software without specific, written prior permission.
15 STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18 FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 ******************************************************************/
25 /* AL module -- interface to Mark Callow's Audio Library (AL). */
29 /* Check which version audio library we have: */
30 #ifdef AL_ERROR_NUMBER
32 /* XXXX 4.0.5 libaudio also allows us to provide better error
33 ** handling (with ALseterrorhandler). We should implement that
39 #include "allobjects.h"
41 #include "modsupport.h"
42 #include "structmember.h"
53 extern typeobject Configtype
; /* Forward */
55 #define is_configobject(v) ((v)->ob_type == &Configtype)
58 static int getconfigarg
PROTO((object
*, ALconfig
*));
59 static int getstrstrconfigarg
PROTO((object
*, char **, char **, ALconfig
*));
62 setConfig (self
, args
, func
)
65 void (*func
)(ALconfig
, long);
69 if (!getlongarg (args
, &par
)) return NULL
;
71 (*func
) (self
-> ob_config
, par
);
78 getConfig (self
, args
, func
)
81 long (*func
)(ALconfig
);
85 if (!getnoarg (args
)) return NULL
;
87 par
= (*func
) (self
-> ob_config
);
89 return newintobject (par
);
93 al_setqueuesize (self
, args
)
97 return (setConfig (self
, args
, ALsetqueuesize
));
101 al_getqueuesize (self
, args
)
105 return (getConfig (self
, args
, ALgetqueuesize
));
109 al_setwidth (self
, args
)
113 return (setConfig (self
, args
, ALsetwidth
));
117 al_getwidth (self
, args
)
121 return (getConfig (self
, args
, ALgetwidth
));
125 al_getchannels (self
, args
)
129 return (getConfig (self
, args
, ALgetchannels
));
133 al_setchannels (self
, args
)
137 return (setConfig (self
, args
, ALsetchannels
));
143 al_getsampfmt (self
, args
)
147 return (getConfig (self
, args
, ALgetsampfmt
));
151 al_setsampfmt (self
, args
)
155 return (setConfig (self
, args
, ALsetsampfmt
));
159 al_getfloatmax(self
, args
)
165 if ( !getnoarg(args
) )
167 arg
= ALgetfloatmax(self
->ob_config
);
168 return newfloatobject(arg
);
172 al_setfloatmax(self
, args
)
178 if ( !getargs(args
, "d", &arg
) )
180 ALsetfloatmax(self
->ob_config
, arg
);
186 static struct methodlist config_methods
[] = {
187 {"getqueuesize", al_getqueuesize
},
188 {"setqueuesize", al_setqueuesize
},
189 {"getwidth", al_getwidth
},
190 {"setwidth", al_setwidth
},
191 {"getchannels", al_getchannels
},
192 {"setchannels", al_setchannels
},
194 {"getsampfmt", al_getsampfmt
},
195 {"setsampfmt", al_setsampfmt
},
196 {"getfloatmax", al_getfloatmax
},
197 {"setfloatmax", al_setfloatmax
},
199 {NULL
, NULL
} /* sentinel */
206 ALfreeconfig(self
->ob_config
);
211 config_getattr(self
, name
)
215 return findmethod(config_methods
, (object
*)self
, name
);
218 typeobject Configtype
= {
219 OB_HEAD_INIT(&Typetype
)
221 "config", /*tp_name*/
222 sizeof(configobject
), /*tp_size*/
225 config_dealloc
, /*tp_dealloc*/
227 config_getattr
, /*tp_getattr*/
234 newconfigobject(config
)
239 p
= NEWOBJ(configobject
, &Configtype
);
242 p
->ob_config
= config
;
253 extern typeobject Porttype
; /* Forward */
255 #define is_portobject(v) ((v)->ob_type == &Porttype)
258 al_closeport (self
, args
)
262 if (!getnoarg (args
)) return NULL
;
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! */
275 al_getfd (self
, args
)
281 if (!getnoarg (args
)) return NULL
;
283 fd
= ALgetfd (self
-> ob_port
);
285 return newintobject (fd
);
289 al_getfilled (self
, args
)
295 if (!getnoarg (args
)) return NULL
;
297 count
= ALgetfilled (self
-> ob_port
);
299 return newintobject (count
);
303 al_getfillable (self
, args
)
309 if (!getnoarg (args
)) return NULL
;
311 count
= ALgetfillable (self
-> ob_port
);
313 return newintobject (count
);
317 al_readsamps (self
, args
)
326 if (!getlongarg (args
, &count
)) return NULL
;
330 err_setstr (RuntimeError
, "al.readsamps : arg <= 0");
334 c
= ALgetconfig(self
->ob_port
);
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);
342 width
= ALgetwidth(c
);
344 width
= ALgetwidth(c
);
347 v
= newsizedstringobject ((char *)NULL
, width
* count
);
348 if (v
== NULL
) return NULL
;
351 ALreadsamps (self
-> ob_port
, (void *) getstringvalue(v
), count
);
358 al_writesamps (self
, args
)
367 if (!getargs (args
, "s#", &buf
, &size
)) return NULL
;
369 c
= ALgetconfig(self
->ob_port
);
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);
377 width
= ALgetwidth(c
);
379 width
= ALgetwidth(c
);
383 ALwritesamps (self
-> ob_port
, (void *) buf
, (long) size
/ width
);
391 al_getfillpoint (self
, args
)
397 if (!getnoarg (args
)) return NULL
;
399 count
= ALgetfillpoint (self
-> ob_port
);
401 return newintobject (count
);
405 al_setfillpoint (self
, args
)
411 if (!getlongarg (args
, &count
)) return NULL
;
413 ALsetfillpoint (self
-> ob_port
, count
);
420 al_setconfig (self
, args
)
426 if (!getconfigarg (args
, &config
)) return NULL
;
428 ALsetconfig (self
-> ob_port
, config
);
435 al_getconfig (self
, args
)
441 if (!getnoarg (args
)) return NULL
;
443 config
= ALgetconfig (self
-> ob_port
);
445 return newconfigobject (config
);
450 al_getstatus (self
, args
)
459 if (!getargs(args
, "O", &list
))
461 if (!is_listobject(list
)) {
465 length
= getlistsize(list
);
466 PVbuffer
= NEW(long, length
);
467 if (PVbuffer
== NULL
)
469 for (i
= 0; i
< length
; i
++) {
470 v
= getlistitem(list
, i
);
471 if (!is_intobject(v
)) {
476 PVbuffer
[i
] = getintvalue(v
);
479 ALgetstatus(self
->ob_port
, PVbuffer
, length
);
481 for (i
= 0; i
< length
; i
++)
482 setlistitem(list
, i
, newintobject(PVbuffer
[i
]));
491 static struct methodlist port_methods
[] = {
492 {"closeport", al_closeport
},
493 {"close", al_closeport
},
495 {"fileno", al_getfd
},
496 {"getfilled", al_getfilled
},
497 {"getfillable", al_getfillable
},
498 {"readsamps", al_readsamps
},
499 {"writesamps", al_writesamps
},
500 {"setfillpoint", al_setfillpoint
},
501 {"getfillpoint", al_getfillpoint
},
502 {"setconfig", al_setconfig
},
503 {"getconfig", al_getconfig
},
505 {"getstatus", al_getstatus
},
507 {NULL
, NULL
} /* sentinel */
514 if (p
->ob_port
!= NULL
)
515 ALcloseport(p
->ob_port
);
520 port_getattr(p
, name
)
524 return findmethod(port_methods
, (object
*)p
, name
);
527 typeobject Porttype
= {
528 OB_HEAD_INIT(&Typetype
)
531 sizeof(portobject
), /*tp_size*/
534 port_dealloc
, /*tp_dealloc*/
536 port_getattr
, /*tp_getattr*/
548 p
= NEWOBJ(portobject
, &Porttype
);
558 al_openport (self
, args
)
563 ALconfig config
= NULL
;
566 if (args
== NULL
|| !is_tupleobject(args
)) {
570 size
= gettuplesize(args
);
572 if (!getargs (args
, "(ss)", &name
, &dir
))
575 else if (size
== 3) {
576 if (!getstrstrconfigarg (args
, &name
, &dir
, &config
))
584 port
= ALopenport(name
, dir
, config
);
587 err_errno(RuntimeError
);
591 return newportobject (port
);
595 al_newconfig (self
, args
)
600 if (!getnoarg (args
)) return NULL
;
602 config
= ALnewconfig ();
603 if (config
== NULL
) {
604 err_errno(RuntimeError
);
608 return newconfigobject (config
);
612 al_queryparams(self
, args
)
622 if (!getlongarg (args
, &device
))
624 length
= ALqueryparams(device
, PVdummy
, 2L);
625 PVbuffer
= NEW(long, length
);
626 if (PVbuffer
== NULL
)
628 (void) ALqueryparams(device
, PVbuffer
, length
);
629 v
= newlistobject((int)length
);
632 for (i
= 0; i
< length
; i
++)
633 setlistitem(v
, i
, newintobject(PVbuffer
[i
]));
640 doParams(args
, func
, modified
)
642 void (*func
)(long, long *, long);
651 if (!getargs(args
, "(lO)", &device
, &list
))
653 if (!is_listobject(list
)) {
657 length
= getlistsize(list
);
658 PVbuffer
= NEW(long, length
);
659 if (PVbuffer
== NULL
)
661 for (i
= 0; i
< length
; i
++) {
662 v
= getlistitem(list
, i
);
663 if (!is_intobject(v
)) {
668 PVbuffer
[i
] = getintvalue(v
);
671 (*func
)(device
, PVbuffer
, length
);
674 for (i
= 0; i
< length
; i
++)
675 setlistitem(list
, i
, newintobject(PVbuffer
[i
]));
685 al_getparams(self
, args
)
688 return doParams(args
, ALgetparams
, 1);
692 al_setparams(self
, args
)
695 return doParams(args
, ALsetparams
, 0);
699 al_getname(self
, args
)
702 long device
, descriptor
;
704 if (!getargs(args
, "(ll)", &device
, &descriptor
))
706 name
= ALgetname(device
, descriptor
);
708 err_setstr(ValueError
, "al.getname: bad descriptor");
711 return newstringobject(name
);
715 al_getdefault(self
, args
)
718 long device
, descriptor
, value
;
719 if (!getargs(args
, "(ll)", &device
, &descriptor
))
721 value
= ALgetdefault(device
, descriptor
);
722 return newlongobject(value
);
726 al_getminmax(self
, args
)
729 long device
, descriptor
, min
, max
;
730 if (!getargs(args
, "(ll)", &device
, &descriptor
))
734 ALgetminmax(device
, descriptor
, &min
, &max
);
735 return mkvalue("ll", min
, max
);
738 static struct methodlist al_methods
[] = {
739 {"openport", al_openport
},
740 {"newconfig", al_newconfig
},
741 {"queryparams", al_queryparams
},
742 {"getparams", al_getparams
},
743 {"setparams", al_setparams
},
744 {"getname", al_getname
},
745 {"getdefault", al_getdefault
},
746 {"getminmax", al_getminmax
},
747 {NULL
, NULL
} /* sentinel */
753 initmodule("al", al_methods
);
757 getconfigarg(o
, conf
)
761 if (o
== NULL
|| !is_configobject(o
))
762 return err_badarg ();
764 *conf
= ((configobject
*) o
) -> ob_config
;
770 getstrstrconfigarg(v
, a
, b
, c
)
777 return getargs(v
, "(ssO)", a
, b
, &o
) && getconfigarg(o
, c
);