Update of /cvsroot/alsa/alsa-lib/src/alisp
In directory sc8-pr-cvs1:/tmp/cvs-serv23405/src/alisp
Modified Files:
alisp.c alisp_snd.c
Log Message:
added snd_hctl_ctl() function
ordinary mixer:
- revised Ordinary Mixer I/O type
- sndo_mixer_open() take PCMs rather than strings to pass
the real relationship
- an initial version of toplevel alisp script
more alisp development:
- renamed a* functions to A* functions (acall -> Acall etc.)
- many improvements (unset*, exfun, Acall pcm_info, Asnderr, Asyserr)
Index: alisp.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/alisp/alisp.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- alisp.c 3 Sep 2003 19:25:09 -0000 1.9
+++ alisp.c 9 Sep 2003 19:24:36 -0000 1.10
@@ -309,6 +309,24 @@
return obj;
}
+static struct alisp_object * new_cons_pointer(struct alisp_instance * instance, const
char *ptr_id, void *ptr)
+{
+ struct alisp_object * lexpr;
+
+ if (ptr == NULL)
+ return &alsa_lisp_nil;
+ lexpr = new_object(instance, ALISP_OBJ_CONS);
+ if (lexpr == NULL)
+ return NULL;
+ lexpr->value.c.car = new_string(instance, ptr_id);
+ if (lexpr->value.c.car == NULL)
+ return NULL;
+ lexpr->value.c.cdr = new_pointer(instance, ptr);
+ if (lexpr->value.c.cdr == NULL)
+ return NULL;
+ return lexpr;
+}
+
void alsa_lisp_init_objects(void) __attribute__ ((constructor));
void alsa_lisp_init_objects(void)
@@ -563,10 +581,13 @@
return first;
}
-static struct alisp_object * parse_quote(struct alisp_instance *instance)
+static struct alisp_object * quote_object(struct alisp_instance *instance, struct
alisp_object * obj)
{
struct alisp_object * p;
+ if (obj == NULL)
+ return NULL;
+
p = new_object(instance, ALISP_OBJ_CONS);
if (p == NULL)
return NULL;
@@ -577,13 +598,16 @@
p->value.c.cdr = new_object(instance, ALISP_OBJ_CONS);
if (p->value.c.cdr == NULL)
return NULL;
- p->value.c.cdr->value.c.car = parse_object(instance, 0);
- if (p->value.c.cdr->value.c.car == NULL)
- return NULL;
+ p->value.c.cdr->value.c.car = obj;
return p;
}
+static inline struct alisp_object * parse_quote(struct alisp_instance *instance)
+{
+ return quote_object(instance, parse_object(instance, 0));
+}
+
static struct alisp_object * parse_object(struct alisp_instance *instance, int
havetoken)
{
int thistoken;
@@ -662,8 +686,9 @@
return p;
}
-static void unset_object1(struct alisp_instance *instance, const char *id)
+static struct alisp_object * unset_object1(struct alisp_instance *instance, const
char *id)
{
+ struct alisp_object * res;
struct alisp_object_pair *p, *p1;
for (p = instance->setobjs_list, p1 = NULL; p != NULL; p1 = p, p = p->next) {
@@ -673,13 +698,16 @@
p1->next = p->next;
else
instance->setobjs_list = p->next;
+ res = p->value;
free(p);
- return;
+ return res;
}
}
+
+ return &alsa_lisp_nil;
}
-static inline void unset_object(struct alisp_instance *instance, struct alisp_object
* name)
+static inline struct alisp_object * unset_object(struct alisp_instance *instance,
struct alisp_object * name)
{
return unset_object1(instance, name->value.id);
}
@@ -688,10 +716,11 @@
{
struct alisp_object_pair *p;
- for (p = instance->setobjs_list; p != NULL; p = p->next)
+ for (p = instance->setobjs_list; p != NULL; p = p->next) {
if (p->name->value.id != NULL &&
!strcmp(id, p->name->value.id))
return p->value;
+ }
return &alsa_lisp_nil;
}
@@ -956,18 +985,22 @@
} else {
return new_float(instance, f);
}
- } else if (p1->type == ALISP_OBJ_STRING || p1->type == ALISP_OBJ_IDENTIFIER) {
+ } else if (p1->type == ALISP_OBJ_STRING) {
char *str = NULL, *str1;
for (;;) {
- if (p1->type == ALISP_OBJ_STRING || p1->type ==
ALISP_OBJ_IDENTIFIER) {
- str1 = realloc(str, strlen(str) + strlen(p1->value.s)
+ 1);
+ if (p1->type == ALISP_OBJ_STRING) {
+ str1 = realloc(str, (str ? strlen(str) : 0) +
strlen(p1->value.s) + 1);
if (str1 == NULL) {
nomem();
if (str)
free(str);
return NULL;
}
- strcat(str, p1->value.s);
+ if (str == NULL)
+ strcpy(str1, p1->value.s);
+ else
+ strcat(str1, p1->value.s);
+ str = str1;
} else {
lisp_warn(instance, "concat with a non string or
identifier operand");
}
@@ -1292,6 +1325,27 @@
return &alsa_lisp_nil;
}
+/*
+ * Syntax: (exfun name)
+ * Test, if a function exists
+ */
+static struct alisp_object * F_exfun(struct alisp_instance *instance, struct
alisp_object * args)
+{
+ struct alisp_object * p1, * p2;
+
+ p1 = car(args);
+ if (p1->type != ALISP_OBJ_STRING && p1->type != ALISP_OBJ_IDENTIFIER)
+ return &alsa_lisp_nil;
+ p2 = get_object(instance, p1);
+ if (p2 == &alsa_lisp_nil)
+ return &alsa_lisp_nil;
+ p2 = car(p2);
+ if (p2->type == ALISP_OBJ_IDENTIFIER && !strcmp(p2->value.id, "lambda"))
+ return &alsa_lisp_t;
+
+ return &alsa_lisp_nil;
+}
+
static void princ_string(snd_output_t *out, char *s)
{
char *p;
@@ -1448,31 +1502,27 @@
static int equal(struct alisp_object * p1, struct alisp_object * p2)
{
+ int type1, type2;
+
if (eq(p1, p2))
return 1;
- if (p1->type == ALISP_OBJ_CONS || p2->type == ALISP_OBJ_CONS)
+ type1 = p1->type;
+ type2 = p2->type;
+
+ if (type1 == ALISP_OBJ_CONS || type2 == ALISP_OBJ_CONS)
return 0;
- if (p1->type == p2->type)
- switch (p1->type) {
- case ALISP_OBJ_IDENTIFIER:
- if (!strcmp(p1->value.id, p2->value.id))
- return 1;
- return 0;
+ if (type1 == type2) {
+ switch (type1) {
case ALISP_OBJ_STRING:
- if (!strcmp(p1->value.s, p2->value.s))
- return 1;
- return 0;
+ return !strcmp(p1->value.s, p2->value.s);
case ALISP_OBJ_INTEGER:
- if (p1->value.i == p2->value.i)
- return 1;
- return 0;
+ return p1->value.i == p2->value.i;
case ALISP_OBJ_FLOAT:
- if (p1->value.i == p2->value.i)
- return 1;
- return 0;
+ return p1->value.i == p2->value.i;
}
+ }
return 0;
}
@@ -1727,7 +1777,7 @@
struct alisp_object * p1 = eval(instance, car(args));
unset_object(instance, p1);
- return &alsa_lisp_nil;
+ return p1;
}
/*
@@ -1757,15 +1807,15 @@
*/
static struct alisp_object * F_unsetq(struct alisp_instance *instance, struct
alisp_object * args)
{
- struct alisp_object * p = args, * p1;
+ struct alisp_object * p = args, * p1, * res;
do {
p1 = car(p);
- unset_object(instance, p1);
+ res = unset_object(instance, p1);
p = cdr(p);
} while (p != &alsa_lisp_nil);
- return &alsa_lisp_nil;
+ return res;
}
/*
@@ -1885,7 +1935,7 @@
struct alisp_object * p = args, * p1;
p1 = eval(instance, car(p));
- if (p1->type != ALISP_STRING && p1->type != ALISP_IDENTIFIER)
+ if (p1->type != ALISP_OBJ_STRING)
return &alsa_lisp_nil;
if (!strcmp(p1->value.s, "data"))
return new_string(instance, DATADIR);
@@ -1898,15 +1948,16 @@
struct alisp_object * F_include(struct alisp_instance *instance, struct alisp_object
* args)
{
struct alisp_object * p = args, * p1;
+ int res = -ENOENT;
do {
p1 = eval(instance, car(p));
- if (p1->type == ALISP_STRING && p1->type == ALISP_IDENTIFIER)
- alisp_include_file(instance, p1->value.s);
+ if (p1->type == ALISP_OBJ_STRING)
+ res = alisp_include_file(instance, p1->value.s);
p = cdr(p);
} while (p != &alsa_lisp_nil);
- return p1;
+ return new_integer(instance, res);
}
/*
@@ -2140,12 +2191,13 @@
{ "eq", F_eq },
{ "equal", F_equal },
{ "eval", F_eval },
+ { "exfun", F_exfun },
{ "float", F_float },
{ "garbage-collect", F_gc },
{ "gc", F_gc },
{ "if", F_if },
- { "int", F_int },
{ "include", F_include },
+ { "int", F_int },
{ "list", F_list },
{ "not", F_not },
{ "nth", F_nth },
@@ -2219,7 +2271,9 @@
case ALISP_OBJ_IDENTIFIER:
return get_object(instance, p);
case ALISP_OBJ_INTEGER:
+ case ALISP_OBJ_FLOAT:
case ALISP_OBJ_STRING:
+ case ALISP_OBJ_POINTER:
return p;
case ALISP_OBJ_CONS:
return eval_cons(instance, p);
@@ -2385,23 +2439,6 @@
unset_object(instance, omain);
- for (;;) {
- p = get_object1(instance, "auto-exec");
- if (p == &alsa_lisp_nil)
- break;
- p = get_object(instance, p);
- if (p == &alsa_lisp_nil)
- break;
- unset_object1(instance, "auto-exec");
- p1 = eval_func(instance, p, &alsa_lisp_nil);
- if (p1 == NULL) {
- retval = -ENOMEM;
- break;
- }
- garbage_collect(instance);
- }
-
- done_lex(instance);
if (_instance)
*_instance = instance;
else
@@ -2414,6 +2451,7 @@
{
if (instance == NULL)
return;
+ done_lex(instance);
free_objects(instance);
free(instance);
}
@@ -2458,11 +2496,11 @@
const char *id, const char *args, ...)
{
int err = 0;
- struct alisp_object *aargs = NULL, *p3, *res;
+ struct alisp_object *aargs = NULL, *obj, *res;
if (args && *args != 'n') {
va_list ap;
- struct alisp_object *p, *obj;
+ struct alisp_object *p;
p = NULL;
va_start(ap, args);
while (*args) {
@@ -2490,6 +2528,20 @@
case 'd':
obj = new_integer(instance, va_arg(ap, double));
break;
+ case 'p': {
+ char _ptrid[24];
+ char *ptrid = _ptrid;
+ while (*args && *args != '%')
+ *ptrid++ = *args++;
+ *ptrid = 0;
+ if (ptrid == _ptrid) {
+ err = -EINVAL;
+ break;
+ }
+ obj = new_cons_pointer(instance, _ptrid, va_arg(ap,
void *));
+ obj = quote_object(instance, obj);
+ break;
+ }
default:
err = -EINVAL;
break;
@@ -2526,8 +2578,8 @@
err = -ENOENT;
if (aargs == NULL)
aargs = &alsa_lisp_nil;
- if ((p3 = get_object1(instance, id)) != &alsa_lisp_nil) {
- res = eval_func(instance, p3, aargs);
+ if ((obj = get_object1(instance, id)) != &alsa_lisp_nil) {
+ res = eval_func(instance, obj, aargs);
err = 0;
} else {
struct intrinsic key, *item;
@@ -2607,7 +2659,7 @@
seq = seq->value.c.cdr;
if (seq->type == ALISP_OBJ_CONS) {
p2 = seq->value.c.car;
- if (p2->type != ALISP_OBJ_STRING && p2->type != ALISP_OBJ_IDENTIFIER)
+ if (p2->type != ALISP_OBJ_STRING)
return -EINVAL;
if (strcmp(p2->value.s, ptr_id))
return -EINVAL;
Index: alisp_snd.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/alisp/alisp_snd.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- alisp_snd.c 3 Aug 2003 20:36:54 -0000 1.5
+++ alisp_snd.c 9 Sep 2003 19:24:36 -0000 1.6
@@ -243,24 +243,6 @@
return lexpr;
}
-static struct alisp_object * new_result4(struct alisp_instance * instance, const char
*ptr_id, void *ptr)
-{
- struct alisp_object * lexpr;
-
- if (ptr == NULL)
- return &alsa_lisp_nil;
- lexpr = new_object(instance, ALISP_OBJ_CONS);
- if (lexpr == NULL)
- return NULL;
- lexpr->value.c.car = new_string(instance, ptr_id);
- if (lexpr->value.c.car == NULL)
- return NULL;
- lexpr->value.c.cdr = new_pointer(instance, ptr);
- if (lexpr->value.c.cdr == NULL)
- return NULL;
- return lexpr;
-}
-
/*
* macros
*/
@@ -326,6 +308,8 @@
item->xfunc == &snd_hctl_elem_next ||
item->xfunc == &snd_hctl_elem_prev)
prefix1 = "hctl_elem";
+ else if (item->xfunc == &snd_hctl_ctl)
+ prefix1 = "ctl";
else
return &alsa_lisp_nil;
args = eval(instance, car(args));
@@ -333,7 +317,7 @@
if (handle == NULL)
return &alsa_lisp_nil;
handle = ((snd_p_p_t)item->xfunc)(handle);
- return new_result4(instance, prefix1, handle);
+ return new_cons_pointer(instance, prefix1, handle);
}
static struct alisp_object * FA_int_p(struct alisp_instance * instance, struct
acall_table * item, struct alisp_object * args)
@@ -466,7 +450,7 @@
snd_ctl_elem_id_alloca(&id);
if (parse_ctl_elem_id(eval(instance, car(cdr(args))), id) < 0)
return &alsa_lisp_nil;
- return new_result4(instance, "hctl_elem", snd_hctl_find_elem(handle, id));
+ return new_cons_pointer(instance, "hctl_elem", snd_hctl_find_elem(handle, id));
}
static struct alisp_object * FA_hctl_elem_info(struct alisp_instance * instance,
struct acall_table * item, struct alisp_object * args)
@@ -660,6 +644,36 @@
return new_result(instance, err);
}
+static struct alisp_object * FA_pcm_info(struct alisp_instance * instance, struct
acall_table * item, struct alisp_object * args)
+{
+ snd_pcm_t *handle;
+ struct alisp_object * lexpr, * p1;
+ snd_pcm_info_t *info;
+ int err;
+
+ args = eval(instance, car(args));
+ handle = (snd_pcm_t *)get_ptr(args, item->prefix);
+ if (handle == NULL)
+ return &alsa_lisp_nil;
+ snd_pcm_info_alloca(&info);
+ err = snd_pcm_info(handle, info);
+ lexpr = new_lexpr(instance, err);
+ if (err < 0)
+ return lexpr;
+ p1 = add_cons(instance, lexpr->value.c.cdr, 0, "card", new_integer(instance,
snd_pcm_info_get_card(info)));
+ p1 = add_cons(instance, p1, 1, "device", new_integer(instance,
snd_pcm_info_get_device(info)));
+ p1 = add_cons(instance, p1, 1, "subdevice", new_integer(instance,
snd_pcm_info_get_subdevice(info)));
+ p1 = add_cons(instance, p1, 1, "id", new_string(instance,
snd_pcm_info_get_id(info)));
+ p1 = add_cons(instance, p1, 1, "name", new_string(instance,
snd_pcm_info_get_name(info)));
+ p1 = add_cons(instance, p1, 1, "subdevice_name", new_string(instance,
snd_pcm_info_get_subdevice_name(info)));
+ p1 = add_cons(instance, p1, 1, "class", new_integer(instance,
snd_pcm_info_get_class(info)));
+ p1 = add_cons(instance, p1, 1, "subclass", new_integer(instance,
snd_pcm_info_get_subclass(info)));
+ p1 = add_cons(instance, p1, 1, "subdevices_count", new_integer(instance,
snd_pcm_info_get_subdevices_count(info)));
+ p1 = add_cons(instance, p1, 1, "subdevices_avail", new_integer(instance,
snd_pcm_info_get_subdevices_avail(info)));
+ //p1 = add_cons(instance, p1, 1, "sync", new_string(instance,
snd_pcm_info_get_sync(info)));
+ return lexpr;
+}
+
/*
* main code
*/
@@ -673,6 +687,7 @@
{ "ctl_close", &FA_int_p, (void *)&snd_ctl_close, "ctl" },
{ "ctl_open", &FA_int_pp_strp_int, (void *)&snd_ctl_open, "ctl" },
{ "hctl_close", &FA_int_p, (void *)&snd_hctl_close, "hctl" },
+ { "hctl_ctl", &FA_p_p, (void *)&snd_hctl_ctl, "hctl" },
{ "hctl_elem_info", &FA_hctl_elem_info, (void *)&snd_hctl_elem_info,
"hctl_elem" },
{ "hctl_elem_next", &FA_p_p, (void *)&snd_hctl_elem_next, "hctl_elem" },
{ "hctl_elem_prev", &FA_p_p, (void *)&snd_hctl_elem_prev, "hctl_elem" },
@@ -685,6 +700,7 @@
{ "hctl_load", &FA_int_p, (void *)&snd_hctl_load, "hctl" },
{ "hctl_open", &FA_int_pp_strp_int, (void *)&snd_hctl_open, "hctl" },
{ "hctl_open_ctl", &FA_int_pp_p, (void *)&snd_hctl_open_ctl, "hctl" },
+ { "pcm_info", &FA_pcm_info, NULL, "pcm" },
};
static int acall_compar(const void *p1, const void *p2)
@@ -724,9 +740,60 @@
return args;
}
+static int common_error(snd_output_t **rout, struct alisp_instance *instance, struct
alisp_object * args)
+{
+ struct alisp_object * p = args, * p1;
+ snd_output_t *out;
+ int err;
+
+ err = snd_output_buffer_open(&out);
+ if (err < 0)
+ return err;
+
+ do {
+ p1 = eval(instance, car(p));
+ if (p1->type == ALISP_OBJ_STRING)
+ snd_output_printf(out, "%s", p1->value.s);
+ else
+ princ_object(out, p1);
+ p = cdr(p);
+ } while (p != &alsa_lisp_nil);
+
+ *rout = out;
+ return 0;
+}
+
+static struct alisp_object * F_snderr(struct alisp_instance *instance, struct
alisp_object * args)
+{
+ snd_output_t *out;
+ char *str;
+
+ if (common_error(&out, instance, args) < 0)
+ return &alsa_lisp_nil;
+ snd_output_buffer_string(out, &str);
+ SNDERR(str);
+ snd_output_close(out);
+ return &alsa_lisp_t;
+}
+
+static struct alisp_object * F_syserr(struct alisp_instance *instance, struct
alisp_object * args)
+{
+ snd_output_t *out;
+ char *str;
+
+ if (common_error(&out, instance, args) < 0)
+ return &alsa_lisp_nil;
+ snd_output_buffer_string(out, &str);
+ SYSERR(str);
+ snd_output_close(out);
+ return &alsa_lisp_t;
+}
+
static struct intrinsic snd_intrinsics[] = {
- { "acall", F_acall },
- { "aerror", F_aerror },
- { "ahandle", F_ahandle },
- { "aresult", F_ahandle },
+ { "Acall", F_acall },
+ { "Aerror", F_aerror },
+ { "Ahandle", F_ahandle },
+ { "Aresult", F_ahandle },
+ { "Asnderr", F_snderr },
+ { "Asyserr", F_syserr }
};
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog