summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/almodule.c98
1 files changed, 96 insertions, 2 deletions
diff --git a/Modules/almodule.c b/Modules/almodule.c
index 360e3d2..47aa52a 100644
--- a/Modules/almodule.c
+++ b/Modules/almodule.c
@@ -253,6 +253,7 @@ al_readsamps (self, args)
{
long count;
object *v;
+ ALconfig c;
int width;
if (!getlongarg (args, &count)) return NULL;
@@ -263,7 +264,9 @@ al_readsamps (self, args)
return NULL;
}
- width = ALgetwidth(ALgetconfig(self->ob_port));
+ c = ALgetconfig(self->ob_port);
+ width = ALgetwidth(c);
+ ALfreeconfig(c);
v = newsizedstringobject ((char *)NULL, width * count);
if (v == NULL) return NULL;
@@ -279,11 +282,14 @@ al_writesamps (self, args)
{
long count;
object *v;
+ ALconfig c;
int width;
if (!getstrarg (args, &v)) return NULL;
- width = ALgetwidth(ALgetconfig(self->ob_port));
+ c = ALgetconfig(self->ob_port);
+ width = ALgetwidth(c);
+ ALfreeconfig(c);
ALwritesamps (self-> ob_port, (void *) getstringvalue(v),
getstringsize(v) / width);
@@ -449,10 +455,98 @@ al_newconfig (self, args)
return newconfigobject (config);
}
+
+static object *
+al_queryparams(self, args)
+ object *self, *args;
+{
+ long device;
+ long length;
+ long *PVbuffer;
+ long PVdummy[2];
+ object *v;
+ object *w;
+
+ if (!getlongarg(args, &device))
+ return NULL;
+ length = ALqueryparams(device, PVdummy, 2L);
+ PVbuffer = NEW(long, length);
+ if (PVbuffer == NULL)
+ return err_nomem();
+ (void) ALqueryparams(device, PVbuffer, length);
+ v = newlistobject((int)length);
+ if (v != NULL) {
+ int i;
+ for (i = 0; i < length; i++)
+ setlistitem(v, i, newintobject(PVbuffer[i]));
+ }
+ DEL(PVbuffer);
+ return v;
+}
+
+static object *
+doParams(args, func, modified)
+ object *args;
+ void (*func)(long, long *, long);
+ int modified;
+{
+ long device;
+ object *list, *v;
+ long *PVbuffer;
+ long length;
+ int i;
+ if (!getlongobjectarg(args, &device, &list))
+ return NULL;
+ if (!is_listobject(list)) {
+ err_badarg();
+ return NULL;
+ }
+ length = getlistsize(list);
+ PVbuffer = NEW(long, length);
+ if (PVbuffer == NULL)
+ return err_nomem();
+ for (i = 0; i < length; i++) {
+ v = getlistitem(list, i);
+ if (!is_intobject(v)) {
+ DEL(PVbuffer);
+ err_badarg();
+ return NULL;
+ }
+ PVbuffer[i] = getintvalue(v);
+ }
+
+ ALgetparams(device, PVbuffer, length);
+
+ if (modified) {
+ for (i = 0; i < length; i++)
+ setlistitem(list, i, newintobject(PVbuffer[i]));
+ }
+
+ INCREF(None);
+ return None;
+}
+
+static object *
+al_getparams(self, args)
+ object *self, *args;
+{
+ return doParams(args, ALgetparams, 1);
+}
+
+static object *
+al_setparams(self, args)
+ object *self, *args;
+{
+ return doParams(args, ALsetparams, 0);
+}
+
static struct methodlist al_methods[] = {
{"openport", al_openport},
{"newconfig", al_newconfig},
+ {"queryparams", al_queryparams},
+ {"getparams", al_getparams},
+ {"setparams", al_setparams},
{NULL, NULL} /* sentinel */
};